Lior Vernia has uploaded a new change for review. Change subject: engine: Refactored code into NetworkValidator class ......................................................................
engine: Refactored code into NetworkValidator class The NetworkValidator class handles network validation on the data center level, and is instantiated on a per-network basis. This validation had previously been performed by the NetworkCommon class and its derived classes, but now the NetworkValidator may be used as a service provider. A corresponding test class is added. At last, some overlapping code was merged and at least one minor bug (presumably undetected) was fixed. Change-Id: Icf40d81f0481c6b6dec141a71363888dc9e9a941 Signed-off-by: Lior Vernia <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/AddNetworkCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/NetworkCommon.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/RemoveNetworkCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/NetworkValidatorTest.java 6 files changed, 570 insertions(+), 190 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/40/10940/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/AddNetworkCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/AddNetworkCommand.java index 4d81304..b7afaa5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/AddNetworkCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/AddNetworkCommand.java @@ -5,13 +5,12 @@ import org.ovirt.engine.core.bll.MultiLevelAdministrationHandler; import org.ovirt.engine.core.bll.PredefinedRoles; -import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.bll.validator.NetworkValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters; import org.ovirt.engine.core.common.businessentities.permissions; -import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.validation.group.CreateEntity; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.VdcBllMessages; @@ -39,13 +38,14 @@ @Override protected boolean canDoAction() { - return validate(storagePoolExists()) - && validate(vmNetworkSetCorrectly()) - && validate(stpForVmNetworkOnly()) - && validate(mtuValid()) - && validate(networkPrefixValid()) - && validate(networkDoesNotExist()) - && validate(vlanIsFree()); + NetworkValidator validator = new NetworkValidator(getNetwork()); + return validate(validator.dataCenterExists()) + && validate(validator.vmNetworkSetCorrectly()) + && validate(validator.stpForVmNetworkOnly()) + && validate(validator.mtuValid()) + && validate(validator.networkPrefixValid()) + && validate(validator.networkNameNotUsed()) + && validate(validator.vlanIdNotUsed()); } @Override @@ -82,21 +82,5 @@ perms.setObjectId(getNetwork().getId()); perms.setrole_id(role.getId()); MultiLevelAdministrationHandler.addPermission(perms); - } - - private ValidationResult networkDoesNotExist() { - return getNetworkByName(getNetworks()) == null - ? ValidationResult.VALID - : new ValidationResult(VdcBllMessages.NETWORK_NAME_ALREADY_EXISTS); - } - - private Network getNetworkByName(List<Network> networks) { - String networkName = getNetworkName(); - for (Network network : networks) { - if (network.getName().equals(networkName)) { - return network; - } - } - return null; } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/NetworkCommon.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/NetworkCommon.java index b19e665..60ac688 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/NetworkCommon.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/NetworkCommon.java @@ -1,30 +1,21 @@ package org.ovirt.engine.core.bll.network.dc; -import java.util.Collection; import java.util.Collections; import java.util.List; import org.ovirt.engine.core.bll.CommandBase; -import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.utils.PermissionSubject; -import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters; -import org.ovirt.engine.core.common.businessentities.Nameable; import org.ovirt.engine.core.common.businessentities.network.Network; -import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogField; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.CustomLogFields; -import org.ovirt.engine.core.utils.ReplacementUtils; @SuppressWarnings("serial") @CustomLogFields({ @CustomLogField("NetworkName") }) public abstract class NetworkCommon<T extends AddNetworkStoragePoolParameters> extends CommandBase<T> { - private List<Network> networks; - private List<NetworkCluster> clusterAttachments; - public NetworkCommon(T parameters) { super(parameters); this.setStoragePoolId(getNetwork().getDataCenterId()); @@ -34,59 +25,9 @@ return getParameters().getNetwork(); } - public String getNetworkName() { - return getNetwork().getName(); - } - @Override protected void setActionMessageParameters() { addCanDoActionMessage(VdcBllMessages.VAR__TYPE__NETWORK); - } - - protected ValidationResult vmNetworkSetCorrectly() { - return getNetwork().isVmNetwork() || FeatureSupported.nonVmNetwork(getStoragePool().getcompatibility_version()) - ? ValidationResult.VALID - : new ValidationResult(VdcBllMessages.NON_VM_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL); - } - - protected ValidationResult stpForVmNetworkOnly() { - return getNetwork().isVmNetwork() || !getNetwork().getStp() - ? ValidationResult.VALID - : new ValidationResult(VdcBllMessages.NON_VM_NETWORK_CANNOT_SUPPORT_STP); - } - - protected ValidationResult mtuValid() { - return getNetwork().getMtu() == 0 - || FeatureSupported.mtuSpecification(getStoragePool().getcompatibility_version()) - ? ValidationResult.VALID - : new ValidationResult(VdcBllMessages.NETWORK_MTU_OVERRIDE_NOT_SUPPORTED); - } - - protected ValidationResult vlanIsFree() { - if (getNetwork().getVlanId() != null) { - for (Network network : getNetworks()) { - if (network.getVlanId() != null - && network.getVlanId().equals(getNetwork().getVlanId()) - && network.getDataCenterId().equals(getNetwork().getDataCenterId()) - && !network.getId().equals(getNetwork().getId())) { - return new ValidationResult(VdcBllMessages.NETWORK_VLAN_IN_USE, - String.format("$vlanId %d", getNetwork().getVlanId())); - } - } - } - return ValidationResult.VALID; - } - - protected ValidationResult networkPrefixValid() { - return getNetworkName().toLowerCase().startsWith("bond") - ? new ValidationResult(VdcBllMessages.NETWORK_CANNOT_CONTAIN_BOND_NAME) - : ValidationResult.VALID; - } - - protected ValidationResult storagePoolExists() { - return getStoragePool() == null - ? new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST) - : ValidationResult.VALID; } @Override @@ -97,49 +38,5 @@ return Collections.singletonList(new PermissionSubject(networkId, VdcObjectType.Network, getActionType().getActionGroup())); - } - - protected List<Network> getNetworks() { - if (networks == null) { - networks = getNetworkDAO().getAllForDataCenter(getNetwork().getDataCenterId()); - } - return networks; - } - - protected ValidationResult networkExists(Network network) { - return network == null - ? new ValidationResult(VdcBllMessages.NETWORK_NOT_EXISTS) - : ValidationResult.VALID; - } - - private ValidationResult networkNotUsed(List<? extends Nameable> entities, VdcBllMessages entitiesReplacement) { - if (entities.isEmpty()) { - return ValidationResult.VALID; - } - - Collection<String> replacements = ReplacementUtils.replaceWithNameable("ENTITIES_USING_NETWORK", entities); - replacements.add(entitiesReplacement.name()); - return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_NETWORK_IN_USE, replacements); - } - - protected ValidationResult networkNotUsedByVms(final Network network) { - return networkNotUsed(getVmDAO().getAllForNetwork(network.getId()), VdcBllMessages.VAR__ENTITIES__VMS); - } - - protected List<NetworkCluster> getClusterAttachments() { - if (clusterAttachments == null) { - clusterAttachments = getNetworkClusterDAO().getAllForNetwork(getNetwork().getId()); - } - - return clusterAttachments; - } - - protected ValidationResult networkNotUsedByHosts(final Network network) { - return networkNotUsed(getVdsDAO().getAllForNetwork(network.getId()), VdcBllMessages.VAR__ENTITIES__HOSTS); - } - - protected ValidationResult networkNotUsedByTemplates(final Network network) { - return networkNotUsed(getVmTemplateDAO().getAllForNetwork(network.getId()), - VdcBllMessages.VAR__ENTITIES__VM_TEMPLATES); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/RemoveNetworkCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/RemoveNetworkCommand.java index 9e424cb..d580a3f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/RemoveNetworkCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/RemoveNetworkCommand.java @@ -1,12 +1,9 @@ package org.ovirt.engine.core.bll.network.dc; - -import org.ovirt.engine.core.bll.ValidationResult; +import org.ovirt.engine.core.bll.validator.NetworkValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters; import org.ovirt.engine.core.common.businessentities.network.Network; -import org.ovirt.engine.core.common.config.Config; -import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.dal.VdcBllMessages; @SuppressWarnings("serial") @@ -31,23 +28,17 @@ @Override protected boolean canDoAction() { - return validate(networkExists(getRemovedNetwork())) - && validate(notManagementNetwork()) - && validate(networkNotUsedByVms(getRemovedNetwork())) - && validate(networkNotUsedByTemplates(getRemovedNetwork())) - && validate(networkNotUsedByHosts(getRemovedNetwork())); + NetworkValidator validator = new NetworkValidator(getRemovedNetwork()); + return validate(validator.networkExists()) + && validate(validator.notManagementNetwork()) + && validate(validator.networkNotUsedByVms()) + && validate(validator.networkNotUsedByTemplates()) + && validate(validator.networkNotUsedByHosts()); } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.NETWORK_REMOVE_NETWORK : AuditLogType.NETWORK_REMOVE_NETWORK_FAILED; - } - - private ValidationResult notManagementNetwork() { - String managementNetwork = Config.<String> GetValue(ConfigValues.ManagementNetwork); - return managementNetwork.equals(getRemovedNetwork().getName()) - ? new ValidationResult(VdcBllMessages.NETWORK_CAN_NOT_REMOVE_DEFAULT_NETWORK) - : ValidationResult.VALID; } protected Network getRemovedNetwork() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java index d88b204..1a3d30b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java @@ -2,22 +2,21 @@ import java.util.List; -import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.network.cluster.NetworkClusterHelper; +import org.ovirt.engine.core.bll.validator.NetworkValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkCluster; -import org.ovirt.engine.core.common.config.Config; -import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.validation.group.UpdateEntity; import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.compat.NGuid; import org.ovirt.engine.core.dal.VdcBllMessages; @SuppressWarnings("serial") public class UpdateNetworkCommand<T extends AddNetworkStoragePoolParameters> extends NetworkCommon<T> { private Network oldNetwork; + private List<Network> networks; + private List<NetworkCluster> clusterAttachments; public UpdateNetworkCommand(T parameters) { super(parameters); @@ -41,18 +40,20 @@ @Override protected boolean canDoAction() { - return validate(storagePoolExists()) - && validate(vmNetworkSetCorrectly()) - && validate(stpForVmNetworkOnly()) - && validate(mtuValid()) - && validate(networkPrefixValid()) - && validate(vlanIsFree()) - && validate(networkExists(getOldNetwork())) - && validate(notChangingManagementNetworkName()) - && validate(networkNameNotUsed()) - && validate(networkNotUsedByVms(getOldNetwork())) - && validate(networkNotUsedByTemplates(getOldNetwork())) - && validate(networkNotUsedByHosts(getOldNetwork())); + NetworkValidator validatorNew = new NetworkValidator(getNetwork()); + NetworkValidator validatorOld = new NetworkValidator(getOldNetwork()); + return validate(validatorNew.dataCenterExists()) + && validate(validatorNew.vmNetworkSetCorrectly()) + && validate(validatorNew.stpForVmNetworkOnly()) + && validate(validatorNew.mtuValid()) + && validate(validatorNew.networkPrefixValid()) + && validate(validatorNew.vlanIdNotUsed()) + && validate(validatorOld.networkExists()) + && validate(validatorOld.notManagementNetwork()) + && validate(validatorNew.networkNameNotUsed()) + && validate(validatorOld.networkNotUsedByVms()) + && validate(validatorOld.networkNotUsedByTemplates()) + && validate(validatorOld.networkNotUsedByHosts()); } @Override @@ -66,7 +67,22 @@ return super.getValidationGroups(); } - private Network getOldNetwork(){ + private List<NetworkCluster> getClusterAttachments() { + if (clusterAttachments == null) { + clusterAttachments = getNetworkClusterDAO().getAllForNetwork(getNetwork().getId()); + } + + return clusterAttachments; + } + + private List<Network> getNetworks() { + if (networks == null) { + networks = getNetworkDAO().getAllForDataCenter(getNetwork().getDataCenterId()); + } + return networks; + } + + private Network getOldNetwork() { if (oldNetwork == null) { oldNetwork = getNetworkById(getNetworks()); } @@ -81,34 +97,5 @@ } } return null; - } - - private ValidationResult networkNameNotUsed() { - Network networkWithSameName = getOtherNetworkWithSameName(getNetworks()); - return networkWithSameName != null - ? new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_NETWORK_NAME_IN_USE) - : ValidationResult.VALID; - } - - private Network getOtherNetworkWithSameName(List<Network> networks) { - String networkName = getNetworkName().toLowerCase(); - Guid networkId = getNetwork().getId(); - NGuid dataCenterId = getNetwork().getDataCenterId(); - for (Network network : networks) { - if (network.getName().toLowerCase().equals(networkName) - && !network.getId().equals(networkId) - && dataCenterId.equals(network.getDataCenterId())) { - return network; - } - } - return null; - } - - private ValidationResult notChangingManagementNetworkName() { - String managementNetwork = Config.<String> GetValue(ConfigValues.ManagementNetwork); - return getOldNetwork().getName().equals(managementNetwork) && - !getNetworkName().equals(managementNetwork) - ? new ValidationResult(VdcBllMessages.NETWORK_CAN_NOT_REMOVE_DEFAULT_NETWORK) - : ValidationResult.VALID; } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java new file mode 100644 index 0000000..735384c --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java @@ -0,0 +1,187 @@ +package org.ovirt.engine.core.bll.validator; + +import java.util.Collection; +import java.util.List; + +import org.ovirt.engine.core.bll.ValidationResult; +import org.ovirt.engine.core.common.FeatureSupported; +import org.ovirt.engine.core.common.businessentities.Nameable; +import org.ovirt.engine.core.common.businessentities.storage_pool; +import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.dal.VdcBllMessages; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.utils.ReplacementUtils; + +/** + * @author Lior Vernia ([email protected]) + * <br> + * <br> + * This class is used to validate different traits of a network on the data center level. + * <br> + * <br> + * Usage: instantiate on a per-network basis, passing the network to be validated as an argument to the constructor. + * + */ +public class NetworkValidator { + + protected final Network network; + + private storage_pool dataCenter; + private List<Network> networks; + + public NetworkValidator(Network network) { + this.network = network; + } + + protected DbFacade getDbFacade() { + return DbFacade.getInstance(); + } + + protected storage_pool getDataCenter() { + if (dataCenter == null) { + dataCenter = getDbFacade().getStoragePoolDao().get(network.getDataCenterId()); + } + return dataCenter; + } + + /** + * @return All existing networks in same data center - presumably doesn't return null. + */ + protected List<Network> getNetworks() { + if (networks == null) { + networks = getDbFacade().getNetworkDao().getAllForDataCenter(network.getDataCenterId()); + } + return networks; + } + + /** + * @return An error iff network is defined as non-VM when that feature is not supported. + */ + public ValidationResult vmNetworkSetCorrectly() { + return network.isVmNetwork() || FeatureSupported.nonVmNetwork(getDataCenter().getcompatibility_version()) + ? ValidationResult.VALID + : new ValidationResult(VdcBllMessages.NON_VM_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL); + } + + /** + * @return An error iff STP is specified for a non-VM network. + */ + public ValidationResult stpForVmNetworkOnly() { + return network.isVmNetwork() || !network.getStp() + ? ValidationResult.VALID + : new ValidationResult(VdcBllMessages.NON_VM_NETWORK_CANNOT_SUPPORT_STP); + } + + /** + * @return An error iff nonzero MTU was specified when the MTU feature is not supported. + */ + public ValidationResult mtuValid() { + return network.getMtu() == 0 + || FeatureSupported.mtuSpecification(getDataCenter().getcompatibility_version()) + ? ValidationResult.VALID + : new ValidationResult(VdcBllMessages.NETWORK_MTU_OVERRIDE_NOT_SUPPORTED); + } + + /** + * @return An error iff a different network in the data center is already using the specified VLAN ID. + */ + public ValidationResult vlanIdNotUsed() { + if (network.getVlanId() != null) { + for (Network otherNetwork : getNetworks()) { + if (otherNetwork.getVlanId() != null + && otherNetwork.getVlanId().equals(network.getVlanId()) + && !otherNetwork.getId().equals(network.getId())) { + return new ValidationResult(VdcBllMessages.NETWORK_VLAN_IN_USE, + String.format("$vlanId %d", network.getVlanId())); + } + } + } + return ValidationResult.VALID; + } + + /** + * @return An error iff network is named as if it were a bond. + */ + public ValidationResult networkPrefixValid() { + return network.getName().toLowerCase().startsWith("bond") + ? new ValidationResult(VdcBllMessages.NETWORK_CANNOT_CONTAIN_BOND_NAME) + : ValidationResult.VALID; + } + + /** + * @return An error iff the data center to which the network belongs doesn't exist. + */ + public ValidationResult dataCenterExists() { + return getDataCenter() == null + ? new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST) + : ValidationResult.VALID; + } + + /** + * @return An error iff the network doesn't exist. + */ + public ValidationResult networkExists() { + return network == null + ? new ValidationResult(VdcBllMessages.NETWORK_NOT_EXISTS) + : ValidationResult.VALID; + } + + /** + * @return An error iff the network's name is already used by another network in the same data center. + */ + public ValidationResult networkNameNotUsed() { + for (Network otherNetwork : getNetworks()) { + if (otherNetwork.getName().equalsIgnoreCase(network.getName()) && + !otherNetwork.getId().equals(network.getId())) { + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_NETWORK_NAME_IN_USE); + } + } + return ValidationResult.VALID; + } + + /** + * @return An error iff the network is in fact the data center's management network. + */ + public ValidationResult notManagementNetwork() { + String managementNetwork = Config.<String> GetValue(ConfigValues.ManagementNetwork); + return managementNetwork.equalsIgnoreCase(network.getName()) + ? new ValidationResult(VdcBllMessages.NETWORK_CAN_NOT_REMOVE_DEFAULT_NETWORK) + : ValidationResult.VALID; + } + + protected ValidationResult networkNotUsed(List<? extends Nameable> entities, VdcBllMessages entitiesReplacement) { + if (entities.isEmpty()) { + return ValidationResult.VALID; + } + + Collection<String> replacements = ReplacementUtils.replaceWithNameable("ENTITIES_USING_NETWORK", entities); + replacements.add(entitiesReplacement.name()); + return new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_NETWORK_IN_USE, replacements); + } + + /** + * @return An error iff the network is in use by any VMs. + */ + public ValidationResult networkNotUsedByVms() { + return networkNotUsed(getDbFacade().getVmDao().getAllForNetwork(network.getId()), + VdcBllMessages.VAR__ENTITIES__VMS); + } + + /** + * @return An error iff the network is in use by any hosts. + */ + public ValidationResult networkNotUsedByHosts() { + return networkNotUsed(getDbFacade().getVdsDao().getAllForNetwork(network.getId()), + VdcBllMessages.VAR__ENTITIES__HOSTS); + } + + /** + * @return An error iff the network is in use by any templates. + */ + public ValidationResult networkNotUsedByTemplates() { + return networkNotUsed(getDbFacade().getVmTemplateDao().getAllForNetwork(network.getId()), + VdcBllMessages.VAR__ENTITIES__VM_TEMPLATES); + } +} diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/NetworkValidatorTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/NetworkValidatorTest.java new file mode 100644 index 0000000..f7a509f --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/validator/NetworkValidatorTest.java @@ -0,0 +1,334 @@ +package org.ovirt.engine.core.bll.validator; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.doReturn; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.ovirt.engine.core.bll.ValidationResult; +import org.ovirt.engine.core.common.businessentities.Nameable; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.storage_pool; +import org.ovirt.engine.core.common.businessentities.network.Network; +import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.Version; +import org.ovirt.engine.core.dal.VdcBllMessages; +import org.ovirt.engine.core.utils.MockConfigRule; + +@RunWith(MockitoJUnitRunner.class) +public class NetworkValidatorTest { + + protected final String DEFAULT_NETWORK_NAME = "mynetwork"; + protected final String OTHER_NETWORK_NAME = "myothernetwork"; + protected final String MGMT_NETWORK_NAME = "ovirtmgmt"; + protected final String DEFAULT_GUID = "00000000-0000-0000-0000-000000000000"; + protected final String OTHER_GUID = "00000000-0000-0000-0000-000000000001"; + protected final int DEFAULT_VLAN_ID = 0; + protected final int OTHER_VLAN_ID = 1; + + @Rule + public MockConfigRule mockConfigRule = new MockConfigRule(); + + @Mock + private Network network; + + @Mock + private storage_pool dataCenter; + + private List<Network> networks = new ArrayList<Network>(); + + private NetworkValidator validator; + + @Before + public void setup() { + + // spy on attempts to access the database + validator = spy(new NetworkValidator(network)); + doReturn(dataCenter).when(validator).getDataCenter(); + doReturn(networks).when(validator).getNetworks(); + + // mock version checking + Version version = mock(Version.class); + when(version.getValue()).thenReturn(null); + when(dataCenter.getcompatibility_version()).thenReturn(version); + + } + + @Test + public void networkExists() throws Exception { + assertEquals(ValidationResult.VALID.getMessage(), validator.networkExists().getMessage()); + } + + @Test + public void networkNull() throws Exception { + validator = spy(new NetworkValidator(null)); // replace default validator with one corresponding to null network + assertEquals(new ValidationResult(VdcBllMessages.NETWORK_NOT_EXISTS), validator.networkExists()); + } + + @Test + public void dataCenterDoesntExist() throws Exception { + doReturn(null).when(validator).getDataCenter(); // replace default mock data center with null data center + assertEquals(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_POOL_NOT_EXIST).getMessage(), validator.dataCenterExists().getMessage()); + } + + @Test + public void dataCenterExists() throws Exception { + assertEquals(ValidationResult.VALID.getMessage(), validator.dataCenterExists().getMessage()); + } + + private void vmNetworkSetupTest(ValidationResult expected, boolean isVmNetwork, boolean isFeatureSupported) { + mockConfigRule.mockConfigValue(ConfigValues.NonVmNetworkSupported, null, isFeatureSupported); + when(network.isVmNetwork()).thenReturn(isVmNetwork); + + assertEquals(expected.getMessage(), validator.vmNetworkSetCorrectly().getMessage()); + } + + @Test + public void vmNetworkWhenSupported() throws Exception { + vmNetworkSetupTest(ValidationResult.VALID, true, true); + } + + @Test + public void vmNetworkWhenNotSupported() throws Exception { + vmNetworkSetupTest(ValidationResult.VALID, true, false); + } + + @Test + public void nonVmNetworkWhenSupported() throws Exception { + vmNetworkSetupTest(ValidationResult.VALID, false, true); + } + + @Test + public void nonVmNetworkWhenNotSupported() throws Exception { + vmNetworkSetupTest(new ValidationResult(VdcBllMessages.NON_VM_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL), false, false); + } + + private void stpTest(ValidationResult expected, boolean isVmNetwork, boolean isStp) { + when(network.isVmNetwork()).thenReturn(isVmNetwork); + when(network.getStp()).thenReturn(isStp); + + assertEquals(expected.getMessage(), validator.stpForVmNetworkOnly().getMessage()); + } + + @Test + public void stpWhenVmNetwork() throws Exception { + stpTest(ValidationResult.VALID, true, true); + } + + @Test + public void noStpWhenVmNetwork() throws Exception { + stpTest(ValidationResult.VALID, true, false); + } + + @Test + public void stpWhenNonVmNetwork() throws Exception { + stpTest(new ValidationResult(VdcBllMessages.NON_VM_NETWORK_CANNOT_SUPPORT_STP), false, true); + } + + @Test + public void noStpWhenNonVmNetwork() throws Exception { + stpTest(ValidationResult.VALID, false, false); + } + + private void mtuValidTest(ValidationResult expected, int mtu, boolean isFeatureSupported) { + mockConfigRule.mockConfigValue(ConfigValues.MTUOverrideSupported, null, isFeatureSupported); + when(network.getMtu()).thenReturn(mtu); + + assertEquals(expected.getMessage(), validator.mtuValid().getMessage()); + } + + @Test + public void nonzeroMtuWhenSupported() throws Exception { + mtuValidTest(ValidationResult.VALID, 1, true); + } + + @Test + public void nonzeroMtuWhenNotSupported() throws Exception { + mtuValidTest(new ValidationResult(VdcBllMessages.NETWORK_MTU_OVERRIDE_NOT_SUPPORTED), 1, false); + } + + @Test + public void zeroMtuWhenSupported() throws Exception { + mtuValidTest(ValidationResult.VALID, 0, true); + } + + @Test + public void zeroMtuWhenNotSupported() throws Exception { + mtuValidTest(ValidationResult.VALID, 0, false); + } + + private void networkPrefixValidTest(ValidationResult expected, String networkName) { + when(network.getName()).thenReturn(networkName); + + assertEquals(expected.getMessage(), validator.networkPrefixValid().getMessage()); + } + + @Test + public void networkPrefixBond() throws Exception { + networkPrefixValidTest(new ValidationResult(VdcBllMessages.NETWORK_CANNOT_CONTAIN_BOND_NAME), "bond0"); + } + + @Test + public void networkPrefixInnocent() throws Exception { + networkPrefixValidTest(ValidationResult.VALID, DEFAULT_NETWORK_NAME); + } + + private void notMgmtNetworkTest(ValidationResult expected, String networkName) { + mockConfigRule.mockConfigValue(ConfigValues.ManagementNetwork, MGMT_NETWORK_NAME); + when(network.getName()).thenReturn(networkName); + + assertEquals(expected.getMessage(), validator.notManagementNetwork().getMessage()); + } + + @Test + public void isMgmtNetwork() throws Exception { + notMgmtNetworkTest(new ValidationResult(VdcBllMessages.NETWORK_CAN_NOT_REMOVE_DEFAULT_NETWORK), MGMT_NETWORK_NAME); + } + + @Test + public void isMgmtNetworkCaseSensitively() throws Exception { + notMgmtNetworkTest(new ValidationResult(VdcBllMessages.NETWORK_CAN_NOT_REMOVE_DEFAULT_NETWORK), MGMT_NETWORK_NAME.toUpperCase()); + } + + @Test + public void isntMgmtNetwork() throws Exception { + notMgmtNetworkTest(ValidationResult.VALID, DEFAULT_NETWORK_NAME); + } + + private void vlanIdAvailableTest(ValidationResult expected, List<Network> networks) { + this.networks.addAll(networks); + when(network.getVlanId()).thenReturn(DEFAULT_VLAN_ID); + when(network.getId()).thenReturn(new Guid(DEFAULT_GUID)); + + assertEquals(expected.getMessage(), validator.vlanIdNotUsed().getMessage()); + } + + @Test + public void vlanIdNoNetworks() throws Exception { + vlanIdAvailableTest(ValidationResult.VALID, new ArrayList<Network>()); + } + + @Test + public void vlanIdAvailable() throws Exception { + Network otherNetwork = new Network(); + otherNetwork.setVlanId(OTHER_VLAN_ID); + + List<Network> networks = new ArrayList<Network>(); + networks.add(otherNetwork); + + vlanIdAvailableTest(ValidationResult.VALID, networks); + } + + @Test + public void vlanIdTakenByDifferentNetwork() throws Exception { + Network otherNetwork = new Network(); + otherNetwork.setVlanId(DEFAULT_VLAN_ID); + otherNetwork.setId(new Guid(OTHER_GUID)); + + List<Network> networks = new ArrayList<Network>(); + networks.add(otherNetwork); + + vlanIdAvailableTest(new ValidationResult(VdcBllMessages.NETWORK_VLAN_IN_USE), networks); + } + + @Test + public void vlanIdTakenBySameNetwork() throws Exception { + Network otherNetwork = new Network(); + otherNetwork.setVlanId(DEFAULT_VLAN_ID); + otherNetwork.setId(new Guid(DEFAULT_GUID)); + + List<Network> networks = new ArrayList<Network>(); + networks.add(otherNetwork); + + vlanIdAvailableTest(ValidationResult.VALID, networks); + } + + private void networkNameAvailableTest(ValidationResult expected, List<Network> networks) { + this.networks.addAll(networks); + when(network.getName()).thenReturn(DEFAULT_NETWORK_NAME); + when(network.getId()).thenReturn(new Guid(DEFAULT_GUID)); + + assertEquals(expected.getMessage(), validator.networkNameNotUsed().getMessage()); + } + + @Test + public void networkNameNoNetworks() throws Exception { + networkNameAvailableTest(ValidationResult.VALID, new ArrayList<Network>()); + } + + @Test + public void networkNameAvailable() throws Exception { + Network otherNetwork = new Network(); + otherNetwork.setName(OTHER_NETWORK_NAME); + + List<Network> networks = new ArrayList<Network>(); + networks.add(otherNetwork); + + networkNameAvailableTest(ValidationResult.VALID, networks); + } + + @Test + public void networkNameTakenByDifferentNetwork() throws Exception { + Network otherNetwork = new Network(); + otherNetwork.setName(DEFAULT_NETWORK_NAME); + otherNetwork.setId(new Guid(OTHER_GUID)); + + List<Network> networks = new ArrayList<Network>(); + networks.add(otherNetwork); + + networkNameAvailableTest(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_NETWORK_NAME_IN_USE), networks); + } + + @Test + public void networkNameTakenByDifferentNetworkCaseSensitively() throws Exception { + Network otherNetwork = new Network(); + otherNetwork.setName(DEFAULT_NETWORK_NAME.toUpperCase()); + otherNetwork.setId(new Guid(OTHER_GUID)); + + List<Network> networks = new ArrayList<Network>(); + networks.add(otherNetwork); + + networkNameAvailableTest(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_NETWORK_NAME_IN_USE), networks); + } + + @Test + public void networkNameTakenBySameNetwork() throws Exception { + Network otherNetwork = new Network(); + otherNetwork.setName(DEFAULT_NETWORK_NAME); + otherNetwork.setId(new Guid(DEFAULT_GUID)); + + List<Network> networks = new ArrayList<Network>(); + networks.add(otherNetwork); + + networkNameAvailableTest(ValidationResult.VALID, networks); + } + + private void networkNotUsedTest(ValidationResult expected, List<Nameable> nameables) { + assertEquals(expected.getMessage(), validator.networkNotUsed(nameables, VdcBllMessages.VAR__ENTITIES__VMS).getMessage()); + } + + @Test + public void networkNotInUse() throws Exception { + networkNotUsedTest(ValidationResult.VALID, new ArrayList<Nameable>()); + } + + @Test + public void networkInUse() throws Exception { + Nameable nameable = new VM(); + List<Nameable> nameables = new ArrayList<Nameable>(); + nameables.add(nameable); + networkNotUsedTest(new ValidationResult(VdcBllMessages.ACTION_TYPE_FAILED_NETWORK_IN_USE), nameables); + } + +} -- To view, visit http://gerrit.ovirt.org/10940 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Icf40d81f0481c6b6dec141a71363888dc9e9a941 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Lior Vernia <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
