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

Reply via email to