Yevgeny Zaspitsky has uploaded a new change for review.

Change subject: engine: Refactor AttachNetworksToClusterCommand
......................................................................

engine: Refactor AttachNetworksToClusterCommand

Make network management network attacments be processed first.
Refactor AttachNetworkToVdsGroupCommand: split the command into
2 internal commands:
* AttachNetworkToClusterCommand
* PropagateLabeledNetworksToClusterHostsCommand
Now AttachNetworkToVdsGroupCommand and AttachNetworksToClusterCommand
are implemented as a compositions of the 2 internal ones.

Change-Id: I6a0b86d8bb018a6172891cb357a4402cfef135d1
Signed-off-by: Yevgeny Zaspitsky <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/PropagateLabeledNetworksToClusterHostsCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparator.java
R 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommandTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparatorTest.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
9 files changed, 600 insertions(+), 360 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/84/33684/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommand.java
new file mode 100644
index 0000000..f537641
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommand.java
@@ -0,0 +1,233 @@
+package org.ovirt.engine.core.bll.network.cluster;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.ovirt.engine.core.bll.InternalCommandAttribute;
+import org.ovirt.engine.core.bll.VdsGroupCommandBase;
+import 
org.ovirt.engine.core.bll.network.cluster.helper.DisplayNetworkClusterHelper;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.FeatureSupported;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter;
+import org.ovirt.engine.core.common.businessentities.ActionGroup;
+import org.ovirt.engine.core.common.businessentities.network.Network;
+import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
+import org.ovirt.engine.core.common.businessentities.network.NetworkStatus;
+import org.ovirt.engine.core.common.errors.VdcBllMessages;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import 
org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirectorDelegator;
+import org.ovirt.engine.core.dao.VmDAO;
+import org.ovirt.engine.core.dao.network.NetworkClusterDao;
+
+@InternalCommandAttribute
+public class AttachNetworkToClusterCommand<T extends 
AttachNetworkToVdsGroupParameter> extends VdsGroupCommandBase<T> {
+
+    private Network persistedNetwork;
+
+    public AttachNetworkToClusterCommand(T parameters) {
+        super(parameters);
+        setVdsGroupId(parameters.getVdsGroupId());
+    }
+
+    @Override
+    protected void executeCommand() {
+
+        attachNetwork(getVdsGroupId(), getNetworkCluster(), getNetwork());
+
+        setSucceeded(true);
+    }
+
+    @Override
+    protected boolean canDoAction() {
+        return networkNotAttachedToCluster()
+                && vdsGroupExists()
+                && changesAreClusterCompatible()
+                && logicalNetworkExists()
+                && validateAttachment();
+    }
+
+    private boolean validateAttachment() {
+        NetworkClusterValidator validator =
+                new NetworkClusterValidator(getNetworkCluster(), 
getVdsGroup().getcompatibility_version());
+        return (validate(validator.managementNetworkAttachment(getNetwork())))
+               && validate(validator.managementNetworkChange(null))
+               && validate(validator.migrationPropertySupported())
+               && (!getPersistedNetwork().isExternal() || 
validateExternalNetwork(validator));
+    }
+
+    private boolean validateExternalNetwork(NetworkClusterValidator validator) 
{
+        return validate(validator.externalNetworkSupported())
+                && 
validate(validator.externalNetworkNotDisplay(getNetworkName()))
+                && 
validate(validator.externalNetworkNotRequired(getNetworkName()));
+    }
+
+    private boolean logicalNetworkExists() {
+        if (getPersistedNetwork() != null) {
+            return true;
+        }
+
+        addCanDoActionMessage(VdcBllMessages.NETWORK_NOT_EXISTS);
+        return false;
+    }
+
+    private boolean changesAreClusterCompatible() {
+        if (getParameters().getNetwork().isVmNetwork() == false) {
+            if 
(!FeatureSupported.nonVmNetwork(getVdsGroup().getcompatibility_version())) {
+                
addCanDoActionMessage(VdcBllMessages.NON_VM_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL);
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private boolean networkNotAttachedToCluster() {
+        if (networkExists()) {
+            return 
failCanDoAction(VdcBllMessages.NETWORK_ALREADY_ATTACHED_TO_CLUSTER);
+        }
+
+        return true;
+    }
+
+    private boolean networkExists() {
+        return getNetworkClusterDAO().get(getNetworkCluster().getId()) != null;
+    }
+
+    private boolean vdsGroupExists() {
+        if (!vdsGroupInDb()) {
+            addCanDoActionMessage(VdcBllMessages.VDS_CLUSTER_IS_NOT_VALID);
+            return false;
+        }
+        return true;
+    }
+
+    private boolean vdsGroupInDb() {
+        return getVdsGroup() != null;
+    }
+
+    private void attachNetwork(Guid clusterId, NetworkCluster networkCluster, 
Network network) {
+        getNetworkClusterDao().save(new NetworkCluster(clusterId, 
network.getId(),
+                NetworkStatus.OPERATIONAL,
+                false,
+                networkCluster.isRequired(),
+                false,
+                false));
+
+        if (network.getCluster().isDisplay()) {
+            final DisplayNetworkClusterHelper displayNetworkClusterHelper = 
new DisplayNetworkClusterHelper(
+                    getNetworkClusterDao(),
+                    getVmDao(),
+                    networkCluster,
+                    network.getName(),
+                    AuditLogDirectorDelegator.getInstance());
+            if (displayNetworkClusterHelper.isDisplayToBeUpdated()) {
+                displayNetworkClusterHelper.warnOnActiveVm();
+            }
+
+            getNetworkClusterDao().setNetworkExclusivelyAsDisplay(clusterId, 
network.getId());
+        }
+
+        if (network.getCluster().isMigration()) {
+            getNetworkClusterDao().setNetworkExclusivelyAsMigration(clusterId, 
network.getId());
+        }
+
+        NetworkClusterHelper.setStatus(clusterId, network);
+    }
+
+    private Network getNetwork() {
+        return getParameters().getNetwork();
+    }
+
+    private String getNetworkName() {
+        return getPersistedNetwork() == null ? null : 
getPersistedNetwork().getName();
+    }
+
+    @Override
+    protected String getDescription() {
+        String networkName = getNetworkName() == null ? "" : getNetworkName();
+        String clusterName = getVdsGroup() == null ? "" : 
getVdsGroup().getName();
+        return networkName + " - " + clusterName;
+    }
+
+    @Override
+    protected void setActionMessageParameters() {
+        addCanDoActionMessage(VdcBllMessages.VAR__TYPE__NETWORK);
+        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ATTACH);
+    }
+
+    private Network getPersistedNetwork() {
+        if (persistedNetwork == null) {
+            persistedNetwork = 
getNetworkDAO().get(getNetworkCluster().getNetworkId());
+        }
+        return persistedNetwork;
+    }
+
+    private NetworkCluster getNetworkCluster() {
+        return getParameters().getNetworkCluster();
+    }
+
+    @Override
+    public AuditLogType getAuditLogTypeValue() {
+        return getSucceeded() ? 
AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP
+                             : 
AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP_FAILED;
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        List<PermissionSubject> permissions = new 
ArrayList<PermissionSubject>();
+
+        Guid networkId = getNetworkCluster() == null ? null : 
getNetworkCluster().getNetworkId();
+        // require permissions on network
+        permissions.add(new PermissionSubject(networkId,
+                VdcObjectType.Network,
+                getActionType().getActionGroup()));
+
+        // require permissions on cluster the network is attached to
+        if (networkExists(getVdsGroupId(), getNetworkCluster())) {
+            permissions.add(new 
PermissionSubject(getParameters().getVdsGroupId(),
+                    VdcObjectType.VdsGroups,
+                    ActionGroup.CONFIGURE_CLUSTER_NETWORK));
+        }
+        return permissions;
+    }
+
+    /**
+     * Checks the user has permissions either on Network or on Cluster for 
this action.
+     */
+    @Override
+    protected boolean checkPermissions(final List<PermissionSubject> 
permSubjects) {
+        List<String> messages = new ArrayList<String>();
+
+        for (PermissionSubject permSubject : permSubjects) {
+            messages.clear();
+            if (checkSinglePermission(permSubject, messages)) {
+                return true;
+            }
+        }
+
+        getReturnValue().getCanDoActionMessages().addAll(messages);
+        return false;
+    }
+
+    private boolean networkExists(Guid clusterId, NetworkCluster 
networkCluster) {
+        List<NetworkCluster> networks = 
getNetworkClusterDao().getAllForCluster(clusterId);
+        for (NetworkCluster nc : networks) {
+            if (nc.getNetworkId().equals(networkCluster.getNetworkId())) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private NetworkClusterDao getNetworkClusterDao() {
+        return DbFacade.getInstance().getNetworkClusterDao();
+    }
+
+    private VmDAO getVmDao() {
+        return DbFacade.getInstance().getVmDao();
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java
index 75e8ce6..a0eac16 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommand.java
@@ -1,267 +1,59 @@
 package org.ovirt.engine.core.bll.network.cluster;
 
 import java.util.ArrayList;
-import java.util.List;
 
-import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
 import org.ovirt.engine.core.bll.VdsGroupCommandBase;
-import org.ovirt.engine.core.bll.network.AddNetworkParametersBuilder;
-import org.ovirt.engine.core.bll.network.NetworkParametersBuilder;
-import 
org.ovirt.engine.core.bll.network.cluster.helper.DisplayNetworkClusterHelper;
-import org.ovirt.engine.core.bll.utils.PermissionSubject;
-import org.ovirt.engine.core.common.AuditLogType;
-import org.ovirt.engine.core.common.FeatureSupported;
-import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
-import org.ovirt.engine.core.common.businessentities.ActionGroup;
-import org.ovirt.engine.core.common.businessentities.network.Network;
-import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
-import org.ovirt.engine.core.common.businessentities.network.NetworkStatus;
-import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
-import org.ovirt.engine.core.common.errors.VdcBllMessages;
-import org.ovirt.engine.core.compat.Guid;
-import org.ovirt.engine.core.dal.dbbroker.DbFacade;
-import 
org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirectorDelegator;
-import org.ovirt.engine.core.dao.VmDAO;
-import org.ovirt.engine.core.dao.network.NetworkClusterDao;
-import org.ovirt.engine.core.utils.NetworkUtils;
-import org.ovirt.engine.core.utils.transaction.TransactionMethod;
-import org.ovirt.engine.core.utils.transaction.TransactionSupport;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+import org.ovirt.engine.core.compat.TransactionScopeOption;
 
-@NonTransactiveCommandAttribute
-public class AttachNetworkToVdsGroupCommand<T extends 
AttachNetworkToVdsGroupParameter> extends
-        VdsGroupCommandBase<T> {
+public class AttachNetworkToVdsGroupCommand<T extends 
AttachNetworkToVdsGroupParameter> extends VdsGroupCommandBase<T> {
 
-    private Network persistedNetwork;
+    public AttachNetworkToVdsGroupCommand(T parameters, CommandContext 
cmdContext) {
+        super(parameters, cmdContext);
+    }
 
-    public AttachNetworkToVdsGroupCommand(T parameters) {
+    protected AttachNetworkToVdsGroupCommand(T parameters) {
         super(parameters);
-        setVdsGroupId(parameters.getVdsGroupId());
-    }
-
-    private Network getNetwork() {
-        return getParameters().getNetwork();
-    }
-
-    public String getNetworkName() {
-        return getPersistedNetwork() == null ? null : 
getPersistedNetwork().getName();
-    }
-
-    @Override
-    protected String getDescription() {
-        String networkName = getNetworkName() == null ? "" : getNetworkName();
-        String clusterName = getVdsGroup() == null ? "" : 
getVdsGroup().getName();
-        return networkName + " - " + clusterName;
-    }
-
-    @Override
-    protected void setActionMessageParameters() {
-        addCanDoActionMessage(VdcBllMessages.VAR__TYPE__NETWORK);
-        addCanDoActionMessage(VdcBllMessages.VAR__ACTION__ATTACH);
     }
 
     @Override
     protected void executeCommand() {
 
-        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+        final T parameters = getParameters();
 
-            @Override
-            public Void runInTransaction() {
-                attachNetwork(getVdsGroupId(), getNetworkCluster(), 
getNetwork());
-                return null;
-            }
-        });
+        parameters.setTransactionScopeOption(TransactionScopeOption.Required);
+        parameters.setCompensationEnabled(false);
 
-        if (!getPersistedNetwork().isExternal() && 
NetworkUtils.isLabeled(getPersistedNetwork())
-                && 
NetworkHelper.setupNetworkSupported(getVdsGroup().getcompatibility_version())) {
-            addNetworkToHosts();
-        }
+        final VdcReturnValueBase returnValue =
+                
getBackend().runInternalAction(VdcActionType.AttachNetworkToVdsGroup, 
parameters);
 
-        setSucceeded(true);
-    }
+        final boolean attachSucceed = returnValue.getSucceeded();
+        setSucceeded(attachSucceed);
 
-    private void addNetworkToHosts() {
-        List<VdsNetworkInterface> nics =
-                
getDbFacade().getInterfaceDao().getAllInterfacesByLabelForCluster(getParameters().getVdsGroupId(),
-                        getPersistedNetwork().getLabel());
-        AddNetworkParametersBuilder builder = new 
AddNetworkParametersBuilder(getPersistedNetwork(), getContext());
-        ArrayList<VdcActionParametersBase> parameters = 
builder.buildParameters(nics);
-
-        if (!parameters.isEmpty()) {
-            NetworkParametersBuilder.updateParametersSequencing(parameters);
-            runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, 
parameters);
+        if (attachSucceed) {
+            attachLabeledNetworks();
         }
     }
 
-    @Override
-    protected boolean canDoAction() {
-        return networkNotAttachedToCluster()
-                && vdsGroupExists()
-                && changesAreClusterCompatible()
-                && logicalNetworkExists()
-                && validateAttachment();
+    private void attachLabeledNetworks() {
+        final T parameters = getParameters();
+
+        parameters.setTransactionScopeOption(TransactionScopeOption.Suppress);
+        parameters.setCompensationEnabled(false);
+
+        // AttachLabeledNetworks should be run asynchronously
+        
runInternalMultipleActions(VdcActionType.PropagateLabeledNetworksToClusterHosts,
+                createParametersArrayList(parameters));
     }
 
-    private boolean validateAttachment() {
-        NetworkClusterValidator validator =
-                new NetworkClusterValidator(getNetworkCluster(), 
getVdsGroup().getcompatibility_version());
-        return (validate(validator.managementNetworkAttachment(getNetwork())))
-               && validate(validator.managementNetworkChange(null))
-               && validate(validator.migrationPropertySupported())
-               && (!getPersistedNetwork().isExternal() || 
validateExternalNetwork(validator));
-    }
+    private ArrayList<VdcActionParametersBase> createParametersArrayList(final 
T parameters) {
+        final ArrayList<VdcActionParametersBase> resultList = new 
ArrayList<>();
+        resultList.add(parameters);
 
-    private boolean validateExternalNetwork(NetworkClusterValidator validator) 
{
-        return validate(validator.externalNetworkSupported())
-                && 
validate(validator.externalNetworkNotDisplay(getNetworkName()))
-                && 
validate(validator.externalNetworkNotRequired(getNetworkName()));
-    }
-
-    private boolean logicalNetworkExists() {
-        if (getPersistedNetwork() != null) {
-            return true;
-        }
-
-        addCanDoActionMessage(VdcBllMessages.NETWORK_NOT_EXISTS);
-        return false;
-    }
-
-    private Network getPersistedNetwork() {
-        if (persistedNetwork == null) {
-            persistedNetwork = 
getNetworkDAO().get(getNetworkCluster().getNetworkId());
-        }
-        return persistedNetwork;
-    }
-
-    private boolean changesAreClusterCompatible() {
-        if (getParameters().getNetwork().isVmNetwork() == false) {
-            if 
(!FeatureSupported.nonVmNetwork(getVdsGroup().getcompatibility_version())) {
-                
addCanDoActionMessage(VdcBllMessages.NON_VM_NETWORK_NOT_SUPPORTED_FOR_POOL_LEVEL);
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private boolean networkNotAttachedToCluster() {
-        if (networkExists()) {
-            return 
failCanDoAction(VdcBllMessages.NETWORK_ALREADY_ATTACHED_TO_CLUSTER);
-        }
-
-        return true;
-    }
-
-    private boolean networkExists() {
-        return getNetworkClusterDAO().get(getNetworkCluster().getId()) != null;
-    }
-
-
-    private boolean vdsGroupExists() {
-        if (!vdsGroupInDb()) {
-            addCanDoActionMessage(VdcBllMessages.VDS_CLUSTER_IS_NOT_VALID);
-            return false;
-        }
-        return true;
-    }
-
-    private boolean vdsGroupInDb() {
-        return getVdsGroup() != null;
-    }
-
-    private NetworkCluster getNetworkCluster() {
-        return getParameters().getNetworkCluster();
-    }
-
-    @Override
-    public AuditLogType getAuditLogTypeValue() {
-        return getSucceeded() ? 
AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP
-                : AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP_FAILED;
-    }
-
-    @Override
-    public List<PermissionSubject> getPermissionCheckSubjects() {
-        List<PermissionSubject> permissions = new 
ArrayList<PermissionSubject>();
-
-        Guid networkId = getNetworkCluster() == null ? null : 
getNetworkCluster().getNetworkId();
-        // require permissions on network
-        permissions.add(new PermissionSubject(networkId,
-                VdcObjectType.Network,
-                getActionType().getActionGroup()));
-
-        // require permissions on cluster the network is attached to
-        if (networkExists(getVdsGroupId(), getNetworkCluster())) {
-            permissions.add(new 
PermissionSubject(getParameters().getVdsGroupId(),
-                    VdcObjectType.VdsGroups,
-                    ActionGroup.CONFIGURE_CLUSTER_NETWORK));
-        }
-        return permissions;
-    }
-
-    /**
-     * Checks the user has permissions either on Network or on Cluster for 
this action.
-     */
-    @Override
-    protected boolean checkPermissions(final List<PermissionSubject> 
permSubjects) {
-        List<String> messages = new ArrayList<String>();
-
-        for (PermissionSubject permSubject : permSubjects) {
-            messages.clear();
-            if (checkSinglePermission(permSubject, messages)) {
-                return true;
-            }
-        }
-
-        getReturnValue().getCanDoActionMessages().addAll(messages);
-        return false;
-    }
-
-    public static void attachNetwork(Guid clusterId, NetworkCluster 
networkCluster, Network network) {
-        getNetworkClusterDao().save(new NetworkCluster(clusterId, 
network.getId(),
-                NetworkStatus.OPERATIONAL,
-                false,
-                networkCluster.isRequired(),
-                false,
-                false));
-
-        if (network.getCluster().isDisplay()) {
-            final DisplayNetworkClusterHelper displayNetworkClusterHelper = 
new DisplayNetworkClusterHelper(
-                    getNetworkClusterDao(),
-                    getVmDao(),
-                    networkCluster,
-                    network.getName(),
-                    AuditLogDirectorDelegator.getInstance());
-            if (displayNetworkClusterHelper.isDisplayToBeUpdated()) {
-                displayNetworkClusterHelper.warnOnActiveVm();
-            }
-
-            getNetworkClusterDao().setNetworkExclusivelyAsDisplay(clusterId, 
network.getId());
-        }
-
-        if (network.getCluster().isMigration()) {
-            getNetworkClusterDao().setNetworkExclusivelyAsMigration(clusterId, 
network.getId());
-        }
-
-        NetworkClusterHelper.setStatus(clusterId, network);
-    }
-
-    private static boolean networkExists(Guid clusterId, NetworkCluster 
networkCluster) {
-        List<NetworkCluster> networks = 
getNetworkClusterDao().getAllForCluster(clusterId);
-        for (NetworkCluster nc : networks) {
-            if (nc.getNetworkId().equals(networkCluster.getNetworkId())) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private static NetworkClusterDao getNetworkClusterDao() {
-        return DbFacade.getInstance().getNetworkClusterDao();
-    }
-
-    private static VmDAO getVmDao() {
-        return DbFacade.getInstance().getVmDao();
+        return resultList;
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java
index b644041..b625a79 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworksToClusterCommand.java
@@ -2,35 +2,29 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
+import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
 
 import org.ovirt.engine.core.bll.InternalCommandAttribute;
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
 import org.ovirt.engine.core.bll.VdsGroupCommandBase;
 import org.ovirt.engine.core.bll.context.CommandContext;
-import org.ovirt.engine.core.bll.network.AddNetworksByLabelParametersBuilder;
-import org.ovirt.engine.core.bll.network.NetworkParametersBuilder;
-import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter;
 import org.ovirt.engine.core.common.action.ClusterNetworksParameters;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
-import org.ovirt.engine.core.common.businessentities.network.Network;
-import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
-import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 
 @InternalCommandAttribute
 @NonTransactiveCommandAttribute
-public class AttachNetworksToClusterCommand<T extends 
ClusterNetworksParameters> extends VdsGroupCommandBase<T> {
+public final class AttachNetworksToClusterCommand<T extends 
ClusterNetworksParameters> extends VdsGroupCommandBase<T> {
 
-    public AttachNetworksToClusterCommand(T parameters) {
+    private static final Comparator<AttachNetworkToVdsGroupParameter> 
setManagementNetworkFirstParameterComparator =
+            new SetManagementNetworkFirstParameterComparator<>();
+
+    protected AttachNetworksToClusterCommand(T parameters) {
         super(parameters);
     }
 
@@ -40,69 +34,63 @@
 
     @Override
     protected void executeCommand() {
-        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+
+        final boolean attachNetworksToClusterResult = 
attachNetworksToCluster();
+
+        setSucceeded(attachNetworksToClusterResult);
+
+        // PropagateLabeledNetworksToClusterHosts should be run asynchronously
+        
runInternalMultipleActions(VdcActionType.PropagateLabeledNetworksToClusterHosts,
+                wrapParametersWithList(getParameters()));
+    }
+
+    private ArrayList<VdcActionParametersBase> wrapParametersWithList(T 
parameters) {
+        final ArrayList<VdcActionParametersBase> resultList = new 
ArrayList<>(1);
+        resultList.add(parameters);
+        return resultList;
+    }
+
+    /**
+     * Updates the engine DB with the new network attachments.
+     *
+     * @return <code>true</code> on success otherwise <code>false</code>.
+     */
+    private boolean attachNetworksToCluster() {
+        final List<AttachNetworkToVdsGroupParameter> clusterNetworksParameters 
=
+                getParameters().getClusterNetworksParameters();
+
+        Collections.sort(clusterNetworksParameters, 
setManagementNetworkFirstParameterComparator);
+
+        return runInternalActionsSequentiallyAndTransactionally(
+                VdcActionType.AttachNetworkToCluster,
+                clusterNetworksParameters);
+    }
+
+    /**
+     * Sequentially runs an internal action defined by actionType multiple 
times in a single new transaction. Upon
+     * success of all actions commits the changes, otherwise marks the 
transaction to be rolled back.
+     *
+     * @param actionType
+     *            the action type to be run
+     * @param parameters
+     *            parameters list. The size of the {@link List} defines the 
number of iteration on the action.
+     * @return <code>TRUE</code> on success otherwise <code>FALSE</code>.
+     */
+    private <P extends VdcActionParametersBase> boolean 
runInternalActionsSequentiallyAndTransactionally(final VdcActionType actionType,
+                                                                               
                          final List<P> parameters) {
+        return TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Boolean>() {
 
             @Override
-            public Void runInTransaction() {
-                for (AttachNetworkToVdsGroupParameter param : 
getParameters().getClusterNetworksParameters()) {
-                    
AttachNetworkToVdsGroupCommand.attachNetwork(param.getVdsGroupId(),
-                            param.getNetworkCluster(),
-                            param.getNetwork());
+            public Boolean runInTransaction() {
+                for (P param : parameters) {
+                    final VdcReturnValueBase executionResult = 
runInternalAction(actionType, param);
+                    if (!executionResult.getSucceeded()) {
+                        TransactionSupport.setRollbackOnly();
+                        return Boolean.FALSE;
+                    }
                 }
-
-                return null;
+                return Boolean.TRUE;
             }
         });
-
-        if 
(NetworkHelper.setupNetworkSupported(getVdsGroup().getcompatibility_version())) 
{
-            Set<Network> networks = new HashSet<>();
-            Map<Guid, List<Network>> networksByHost = new HashMap<>();
-            Map<Guid, Map<String, VdsNetworkInterface>> labelsToNicsByHost = 
new HashMap<>();
-
-            for (AttachNetworkToVdsGroupParameter param : 
getParameters().getClusterNetworksParameters()) {
-                
networks.add(getNetworkDAO().get(param.getNetworkCluster().getNetworkId()));
-            }
-
-            for (Network network : networks) {
-                List<VdsNetworkInterface> nics =
-                        
getDbFacade().getInterfaceDao().getAllInterfacesByLabelForCluster(getVdsGroupId(),
-                                network.getLabel());
-
-                for (VdsNetworkInterface nic : nics) {
-                    if (!networksByHost.containsKey(nic.getVdsId())) {
-                        networksByHost.put(nic.getVdsId(), new 
ArrayList<Network>());
-                        labelsToNicsByHost.put(nic.getVdsId(), new 
HashMap<String, VdsNetworkInterface>());
-                    }
-
-                    
labelsToNicsByHost.get(nic.getVdsId()).put(network.getLabel(), nic);
-                    networksByHost.get(nic.getVdsId()).add(network);
-                }
-            }
-
-            if (!networksByHost.isEmpty()) {
-                configureNetworksOnHosts(networksByHost, labelsToNicsByHost);
-            }
-        }
-
-        setSucceeded(true);
-    }
-
-    private void configureNetworksOnHosts(Map<Guid, List<Network>> 
networksByHost,
-            Map<Guid, Map<String, VdsNetworkInterface>> labelsToNicsByHost) {
-        ArrayList<VdcActionParametersBase> parameters = new ArrayList<>();
-        for (Entry<Guid, List<Network>> entry : networksByHost.entrySet()) {
-            AddNetworksByLabelParametersBuilder builder = new 
AddNetworksByLabelParametersBuilder(getContext());
-            parameters.add(builder.buildParameters(entry.getKey(),
-                    entry.getValue(),
-                    labelsToNicsByHost.get(entry.getKey())));
-        }
-
-        NetworkParametersBuilder.updateParametersSequencing(parameters);
-        runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, 
parameters);
-    }
-
-    @Override
-    public List<PermissionSubject> getPermissionCheckSubjects() {
-        return Collections.emptyList();
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/PropagateLabeledNetworksToClusterHostsCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/PropagateLabeledNetworksToClusterHostsCommand.java
new file mode 100644
index 0000000..fe4a619
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/PropagateLabeledNetworksToClusterHostsCommand.java
@@ -0,0 +1,99 @@
+package org.ovirt.engine.core.bll.network.cluster;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.ovirt.engine.core.bll.InternalCommandAttribute;
+import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
+import org.ovirt.engine.core.bll.VdsGroupCommandBase;
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.bll.network.AddNetworksByLabelParametersBuilder;
+import org.ovirt.engine.core.bll.network.NetworkParametersBuilder;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter;
+import org.ovirt.engine.core.common.action.ClusterNetworksParameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.network.Network;
+import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
+import org.ovirt.engine.core.compat.Guid;
+
+@InternalCommandAttribute
+@NonTransactiveCommandAttribute
+public class PropagateLabeledNetworksToClusterHostsCommand<T extends 
ClusterNetworksParameters> extends
+                                                                               
                 VdsGroupCommandBase<T> {
+
+    public PropagateLabeledNetworksToClusterHostsCommand(T parameters) {
+        super(parameters);
+    }
+
+    public PropagateLabeledNetworksToClusterHostsCommand(T parameters, 
CommandContext cmdContext) {
+        super(parameters, cmdContext);
+    }
+
+    @Override
+    protected void executeCommand() {
+
+        if 
(NetworkHelper.setupNetworkSupported(getVdsGroup().getcompatibility_version())) 
{
+            final Map<Guid, List<Network>> networksByHost = new HashMap<>();
+            final Map<Guid, Map<String, VdsNetworkInterface>> 
labelsToNicsByHost = new HashMap<>();
+
+            for (Network network : getNetworks()) {
+                List<VdsNetworkInterface> nics = 
getInterfaceDao().getAllInterfacesByLabelForCluster(
+                        getVdsGroupId(),
+                        network.getLabel());
+
+                for (VdsNetworkInterface nic : nics) {
+                    if (!networksByHost.containsKey(nic.getVdsId())) {
+                        networksByHost.put(nic.getVdsId(), new 
ArrayList<Network>());
+                        labelsToNicsByHost.put(nic.getVdsId(), new 
HashMap<String, VdsNetworkInterface>());
+                    }
+
+                    
labelsToNicsByHost.get(nic.getVdsId()).put(network.getLabel(), nic);
+                    networksByHost.get(nic.getVdsId()).add(network);
+                }
+            }
+
+            if (!networksByHost.isEmpty()) {
+                configureNetworksOnHosts(networksByHost, labelsToNicsByHost);
+            }
+        }
+
+        setSucceeded(true);
+    }
+
+    private Set<Network> getNetworks() {
+        final Set<Network> networks = new HashSet<>();
+        for (AttachNetworkToVdsGroupParameter param : 
getParameters().getClusterNetworksParameters()) {
+            
networks.add(getNetworkDAO().get(param.getNetworkCluster().getNetworkId()));
+        }
+
+        return networks;
+    }
+
+    private void configureNetworksOnHosts(Map<Guid, List<Network>> 
networksByHost,
+                                          Map<Guid, Map<String, 
VdsNetworkInterface>> labelsToNicsByHost) {
+        ArrayList<VdcActionParametersBase> parameters = new ArrayList<>();
+        for (Entry<Guid, List<Network>> entry : networksByHost.entrySet()) {
+            AddNetworksByLabelParametersBuilder builder = new 
AddNetworksByLabelParametersBuilder(getContext());
+            final Guid hostId = entry.getKey();
+            final List<Network> networks = entry.getValue();
+            final Map<String, VdsNetworkInterface> nicsByLabel = 
labelsToNicsByHost.get(hostId);
+            parameters.add(builder.buildParameters(hostId, networks, 
nicsByLabel));
+        }
+
+        NetworkParametersBuilder.updateParametersSequencing(parameters);
+        runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, 
parameters);
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        return Collections.emptyList();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparator.java
new file mode 100644
index 0000000..5f14300
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparator.java
@@ -0,0 +1,37 @@
+package org.ovirt.engine.core.bll.network.cluster;
+
+import static org.apache.commons.lang.BooleanUtils.toInteger;
+
+import java.util.Comparator;
+
+import javax.inject.Singleton;
+
+import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter;
+import org.ovirt.engine.core.common.businessentities.network.Network;
+import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
+
+@Singleton
+final class SetManagementNetworkFirstParameterComparator<T extends 
AttachNetworkToVdsGroupParameter> implements
+                                                                               
                      Comparator<T> {
+    @Override
+    public int compare(T param1, T param2) {
+        final boolean management1 = 
isManagementNetworkAppointmentCommand(param1);
+        final boolean management2 = 
isManagementNetworkAppointmentCommand(param2);
+
+        return toInteger(management2) - toInteger(management1);
+    }
+
+    private boolean isManagementNetworkAppointmentCommand(T param) {
+        final Network network = param.getNetwork();
+        if (network == null) {
+            return false;
+        }
+
+        final NetworkCluster networkCluster = network.getCluster();
+        if (networkCluster == null) {
+            return false;
+        }
+
+        return networkCluster.isManagement();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommandTest.java
similarity index 69%
rename from 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommandTest.java
rename to 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommandTest.java
index ef38b76..573039a 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToVdsGroupCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/AttachNetworkToClusterCommandTest.java
@@ -23,6 +23,8 @@
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.compat.Version;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dal.dbbroker.DbFacadeLocator;
 import org.ovirt.engine.core.dao.VdsGroupDAO;
 import org.ovirt.engine.core.dao.network.NetworkClusterDao;
 import org.ovirt.engine.core.dao.network.NetworkDao;
@@ -30,37 +32,51 @@
 import org.springframework.dao.DataIntegrityViolationException;
 
 @RunWith(MockitoJUnitRunner.class)
-public class AttachNetworkToVdsGroupCommandTest {
+public class AttachNetworkToClusterCommandTest {
 
-    private VDSGroup existingGroup = new VDSGroup();
-    private Network network = createNetwork();
-    private AttachNetworkToVdsGroupParameter param;
-    private AttachNetworkToVdsGroupCommand<AttachNetworkToVdsGroupParameter> 
command;
+    @Mock
+    private DbFacade mockDbFacade;
+
+    @Mock
+    private NetworkClusterDao mockNetworkClusterDao;
+
+    @Mock
+    private VdsGroupDAO mockVdsGroupDAO;
+
+    @Mock
+    private NetworkDao mockNetworkDao;
+
+    private AttachNetworkToClusterCommand<AttachNetworkToVdsGroupParameter> 
underTest;
 
     @Rule
     public MockConfigRule mcr = new MockConfigRule(
             MockConfigRule.mockConfig(ConfigValues.DefaultManagementNetwork, 
"mgmt"));
 
-    @Mock
-    NetworkClusterDao networkClusterDAO;
-
-    @Mock
-    VdsGroupDAO vdsGroupDAO;
-
-    @Mock
-    NetworkDao networkDao;
+    private VDSGroup existingGroup = new VDSGroup();
+    private Network network = createNetwork();
+    private AttachNetworkToVdsGroupParameter param;
 
     @Before
     public void setup() {
+        initializeDbFacadeMocks();
         existingGroup.setcompatibility_version(Version.v3_1);
-        createCommand();
+        param = new AttachNetworkToVdsGroupParameter(getExistingVdsGroupId(), 
getNetwork());
+
+        underTest = new 
AttachNetworkToClusterCommand<AttachNetworkToVdsGroupParameter>(param);
+    }
+
+    private void initializeDbFacadeMocks() {
+        DbFacadeLocator.setDbFacade(mockDbFacade);
+        when(mockDbFacade.getNetworkDao()).thenReturn(mockNetworkDao);
+        
when(mockDbFacade.getNetworkClusterDao()).thenReturn(mockNetworkClusterDao);
+        when(mockDbFacade.getVdsGroupDao()).thenReturn(mockVdsGroupDAO);
     }
 
     @Test
     public void networkExists() {
         simulateVdsGroupExists();
-        when(networkDao.get(any(Guid.class))).thenReturn(getNetwork());
-        
when(networkClusterDAO.get(param.getNetworkCluster().getId())).thenReturn(param.getNetworkCluster());
+        when(mockNetworkDao.get(any(Guid.class))).thenReturn(getNetwork());
+        
when(mockNetworkClusterDao.get(param.getNetworkCluster().getId())).thenReturn(param.getNetworkCluster());
         
assertCanDoActionFailure(VdcBllMessages.NETWORK_ALREADY_ATTACHED_TO_CLUSTER.toString());
     }
 
@@ -89,32 +105,6 @@
         return network;
     }
 
-    @SuppressWarnings("serial")
-    public void createCommand() {
-        param = new AttachNetworkToVdsGroupParameter(getExistingVdsGroupId(), 
getNetwork());
-
-        command = new 
AttachNetworkToVdsGroupCommand<AttachNetworkToVdsGroupParameter>(param) {
-            // Since the command isn't in the same package as AuditLogableBase 
which defines the DAO accessors they
-            // cannot be spied from here.
-            // Instead, will override them manually.
-
-            @Override
-            public VdsGroupDAO getVdsGroupDAO() {
-                return vdsGroupDAO;
-            }
-
-            @Override
-            protected NetworkClusterDao getNetworkClusterDAO() {
-                return networkClusterDAO;
-            }
-
-            @Override
-            protected NetworkDao getNetworkDAO() {
-                return networkDao;
-            }
-        };
-    }
-
     private void simulateVdsGroupExists() {
         dbFacadeReturnVdsGroup();
     }
@@ -128,15 +118,15 @@
     }
 
     private void dbFacadeReturnNoVdsGroup() {
-        when(vdsGroupDAO.get(any(Guid.class))).thenReturn(null);
+        when(mockVdsGroupDAO.get(any(Guid.class))).thenReturn(null);
     }
 
     private void dbFacadeReturnVdsGroup() {
-        when(vdsGroupDAO.get(any(Guid.class))).thenReturn(existingGroup);
+        when(mockVdsGroupDAO.get(any(Guid.class))).thenReturn(existingGroup);
     }
 
     private void dbFacadeThrowOnNetworkClusterSave() {
-        doThrow(new DataIntegrityViolationException("test 
violations")).when(networkClusterDAO)
+        doThrow(new DataIntegrityViolationException("test 
violations")).when(mockNetworkClusterDao)
                 .save(Matchers.<NetworkCluster> any(NetworkCluster.class));
     }
 
@@ -149,18 +139,18 @@
     }
 
     private void assertCanDoActionFailure(final String messageToVerify) {
-        assertFalse(command.canDoAction());
-        
assertTrue(command.getReturnValue().getCanDoActionMessages().contains(messageToVerify));
+        assertFalse(underTest.canDoAction());
+        
assertTrue(underTest.getReturnValue().getCanDoActionMessages().contains(messageToVerify));
     }
 
     private void assertExecuteActionFailure() {
         try {
-            command.executeCommand();
+            underTest.executeCommand();
         } catch (Exception expected) {
             // An exception is expected here
         }
 
-        assertFalse(command.getReturnValue().getSucceeded());
-        assertEquals(AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP_FAILED, 
command.getAuditLogTypeValue());
+        assertFalse(underTest.getReturnValue().getSucceeded());
+        assertEquals(AuditLogType.NETWORK_ATTACH_NETWORK_TO_VDS_GROUP_FAILED, 
underTest.getAuditLogTypeValue());
     }
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparatorTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparatorTest.java
new file mode 100644
index 0000000..9c71285
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/cluster/SetManagementNetworkFirstParameterComparatorTest.java
@@ -0,0 +1,95 @@
+package org.ovirt.engine.core.bll.network.cluster;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.when;
+
+import java.util.Comparator;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.common.action.AttachNetworkToVdsGroupParameter;
+import org.ovirt.engine.core.common.businessentities.network.Network;
+import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
+
+@RunWith(MockitoJUnitRunner.class)
+public class SetManagementNetworkFirstParameterComparatorTest {
+
+    @Mock
+    private AttachNetworkToVdsGroupParameter 
mockAttachNetworkToVdsGroupParameter1;
+    @Mock
+    private AttachNetworkToVdsGroupParameter 
mockAttachNetworkToVdsGroupParameter2;
+
+    @Mock
+    private Network mockNetwork1;
+    @Mock
+    private Network mockNetwork2;
+
+    @Mock
+    private NetworkCluster mockNetworkCluster1;
+    @Mock
+    private NetworkCluster mockNetworkCluster2;
+    private Comparator<AttachNetworkToVdsGroupParameter> underTest;
+
+    @Before
+    public void setup() {
+        underTest = new SetManagementNetworkFirstParameterComparator<>();
+    }
+
+    @Test
+    public void compareGt() {
+        testCompareNoNulls(false, true, 1);
+    }
+
+    @Test
+    public void compareLt() {
+        testCompareNoNulls(true, false, -1);
+    }
+
+    @Test
+    public void compareEq1() {
+        testCompareNoNulls(true, true, 0);
+    }
+
+    @Test
+    public void compareEq2() {
+        testCompareNoNulls(false, false, 0);
+    }
+
+    @Test
+    public void compareWithNulls1() {
+        assertEquals(0, 
underTest.compare(mockAttachNetworkToVdsGroupParameter1, 
mockAttachNetworkToVdsGroupParameter2));
+        
when(mockAttachNetworkToVdsGroupParameter1.getNetwork()).thenReturn(mockNetwork1);
+        assertEquals(0, 
underTest.compare(mockAttachNetworkToVdsGroupParameter1, 
mockAttachNetworkToVdsGroupParameter2));
+        when(mockNetwork1.getCluster()).thenReturn(mockNetworkCluster1);
+        assertEquals(0, 
underTest.compare(mockAttachNetworkToVdsGroupParameter1, 
mockAttachNetworkToVdsGroupParameter2));
+        when(mockNetworkCluster1.isManagement()).thenReturn(true);
+        assertEquals(-1,
+                underTest.compare(mockAttachNetworkToVdsGroupParameter1, 
mockAttachNetworkToVdsGroupParameter2));
+    }
+
+    @Test
+    public void compareWithNulls2() {
+        assertEquals(0, 
underTest.compare(mockAttachNetworkToVdsGroupParameter1, 
mockAttachNetworkToVdsGroupParameter2));
+        
when(mockAttachNetworkToVdsGroupParameter2.getNetwork()).thenReturn(mockNetwork2);
+        assertEquals(0, 
underTest.compare(mockAttachNetworkToVdsGroupParameter1, 
mockAttachNetworkToVdsGroupParameter2));
+        when(mockNetwork2.getCluster()).thenReturn(mockNetworkCluster2);
+        assertEquals(0, 
underTest.compare(mockAttachNetworkToVdsGroupParameter1, 
mockAttachNetworkToVdsGroupParameter2));
+        when(mockNetworkCluster2.isManagement()).thenReturn(true);
+        assertEquals(1, 
underTest.compare(mockAttachNetworkToVdsGroupParameter1, 
mockAttachNetworkToVdsGroupParameter2));
+    }
+
+    private void testCompareNoNulls(boolean management1, boolean management2, 
int expected) {
+        
when(mockAttachNetworkToVdsGroupParameter1.getNetwork()).thenReturn(mockNetwork1);
+        
when(mockAttachNetworkToVdsGroupParameter2.getNetwork()).thenReturn(mockNetwork2);
+        when(mockNetwork1.getCluster()).thenReturn(mockNetworkCluster1);
+        when(mockNetwork2.getCluster()).thenReturn(mockNetworkCluster2);
+        when(mockNetworkCluster1.isManagement()).thenReturn(management1);
+        when(mockNetworkCluster2.isManagement()).thenReturn(management2);
+
+        assertEquals(expected,
+                underTest.compare(mockAttachNetworkToVdsGroupParameter1, 
mockAttachNetworkToVdsGroupParameter2));
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index 0031b1a..a40fd23 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -110,6 +110,7 @@
     UnlabelNetwork(164, ActionGroup.CONFIGURE_STORAGE_POOL_NETWORK, false, 
QuotaDependency.NONE),
     LabelNic(165, ActionGroup.CONFIGURE_HOST_NETWORK, false, 
QuotaDependency.NONE),
     UnlabelNic(166, ActionGroup.CONFIGURE_HOST_NETWORK, false, 
QuotaDependency.NONE),
+    PropagateLabeledNetworksToClusterHosts(167, false, QuotaDependency.NONE),
 
     // NUMA
     AddVmNumaNodes(170, ActionGroup.EDIT_VM_PROPERTIES, false, 
QuotaDependency.NONE),
@@ -203,6 +204,7 @@
     AddVdsGroup(704, ActionGroup.CREATE_CLUSTER, false, QuotaDependency.NONE),
     UpdateVdsGroup(705, ActionGroup.EDIT_CLUSTER_CONFIGURATION, false, 
QuotaDependency.NONE),
     RemoveVdsGroup(706, ActionGroup.DELETE_CLUSTER, false, 
QuotaDependency.NONE),
+    AttachNetworkToCluster(707, false, QuotaDependency.NONE),
     AttachNetworkToVdsGroup(708, ActionGroup.ASSIGN_CLUSTER_NETWORK, false, 
QuotaDependency.NONE),
     DetachNetworkToVdsGroup(709, ActionGroup.ASSIGN_CLUSTER_NETWORK, false, 
QuotaDependency.NONE),
     UpdateNetworkOnCluster(711, ActionGroup.CONFIGURE_CLUSTER_NETWORK, false, 
QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
index 3a7451e..467d174 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogableBase.java
@@ -45,6 +45,7 @@
 import org.ovirt.engine.core.dao.VmTemplateDAO;
 import org.ovirt.engine.core.dao.gluster.GlusterHooksDao;
 import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
+import org.ovirt.engine.core.dao.network.InterfaceDao;
 import org.ovirt.engine.core.dao.network.NetworkClusterDao;
 import org.ovirt.engine.core.dao.network.NetworkDao;
 import org.ovirt.engine.core.dao.network.VmNetworkInterfaceDao;
@@ -682,6 +683,9 @@
         return getDbFacade().getNetworkDao();
     }
 
+    protected InterfaceDao getInterfaceDao() {
+        return getDbFacade().getInterfaceDao();
+    }
     public AsyncTaskDAO getAsyncTaskDao() {
         return getDbFacade().getAsyncTaskDao();
     }


-- 
To view, visit http://gerrit.ovirt.org/33684
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a0b86d8bb018a6172891cb357a4402cfef135d1
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Yevgeny Zaspitsky <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to