Moti Asayag has uploaded a new change for review.

Change subject: engine: Support detaching two labeled networks from a cluster
......................................................................

engine: Support detaching two labeled networks from a cluster

Instead of sending a sequential setup networks command when
multiple networks are being detached from a cluster on the same
host, a single setup networks request should be sent from the
engine to the host to avoid the failure of the latter.

Change-Id: I4a430d95b370a32ca38f7241e2816d3a5d476998
Bug-Url: https://bugzilla.redhat.com/1055188
Signed-off-by: Moti Asayag <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunnersFactory.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NetworkClusterAttachmentActionRunner.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworksByLabelParametersBuilder.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworksFromClusterCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
6 files changed, 137 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/59/23459/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
index 730839f..3db921d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
@@ -186,4 +186,8 @@
     public void setIsRunOnlyIfAllCanDoPass(boolean isRunOnlyIfAllCanDoPass) {
         this.isRunOnlyIfAllCanDoPass = isRunOnlyIfAllCanDoPass;
     }
+
+    protected VdcActionType getActionType() {
+        return actionType;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunnersFactory.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunnersFactory.java
index 8ff70c8..08d7ed8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunnersFactory.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunnersFactory.java
@@ -70,7 +70,8 @@
             break;
         }
 
-        case AttachNetworkToVdsGroup: {
+        case AttachNetworkToVdsGroup:
+        case DetachNetworkToVdsGroup: {
             runner = new NetworkClusterAttachmentActionRunner(actionType, 
parameters, isInternal);
             break;
         }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NetworkClusterAttachmentActionRunner.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NetworkClusterAttachmentActionRunner.java
index 9585a52..203a604 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NetworkClusterAttachmentActionRunner.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/NetworkClusterAttachmentActionRunner.java
@@ -49,8 +49,14 @@
 
         // multiple networks can be either attached or detached from a single 
cluster
         if (!params.isEmpty()) {
-            
Backend.getInstance().runInternalAction(VdcActionType.AttachNetworksToCluster,
+            Backend.getInstance().runInternalAction(getActionToPerform(),
                     new 
ClusterNetworksParameters(params.get(0).getVdsGroupId(), params));
         }
     }
+
+    private VdcActionType getActionToPerform() {
+        return getActionType() == VdcActionType.AttachNetworkToVdsGroup
+                ? VdcActionType.AttachNetworksToCluster
+                : VdcActionType.DetachNetworksFromCluster;
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworksByLabelParametersBuilder.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworksByLabelParametersBuilder.java
index e1869c9..3c69067 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworksByLabelParametersBuilder.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworksByLabelParametersBuilder.java
@@ -18,6 +18,9 @@
 
 public class RemoveNetworksByLabelParametersBuilder extends 
NetworkParametersBuilder {
 
+    /**
+     * Removes labeled networks from an interface by a given label
+     */
     public SetupNetworksParameters buildParameters(VdsNetworkInterface nic, 
String label, Guid clusterId) {
         SetupNetworksParameters parameters = 
createSetupNetworksParameters(nic.getVdsId());
         List<Network> labeledNetworks =
@@ -38,6 +41,29 @@
         return parameters;
     }
 
+    /**
+     * Removes a given list of labeled networks from a host
+     */
+    public SetupNetworksParameters buildParameters(Guid hostId,
+            List<Network> networksToRemove,
+            Map<String, VdsNetworkInterface> nicsBylabels) {
+        SetupNetworksParameters parameters = 
createSetupNetworksParameters(hostId);
+
+        for (String label : nicsBylabels.keySet()) {
+            VdsNetworkInterface nicToConfigure =
+                    getNicToConfigure(parameters.getInterfaces(), 
nicsBylabels.get(label).getId());
+            if (nicToConfigure == null) {
+                throw new 
VdcBLLException(VdcBllErrors.LABELED_NETWORK_INTERFACE_NOT_FOUND);
+            }
+
+            Set<VdsNetworkInterface> nicsToRemove =
+                    getNicsToRemove(parameters.getInterfaces(), 
networksToRemove, nicToConfigure);
+            parameters.getInterfaces().removeAll(nicsToRemove);
+        }
+
+        return parameters;
+    }
+
     private Set<VdsNetworkInterface> getNicsToRemove(List<VdsNetworkInterface> 
nics,
             List<Network> labeledNetworks,
             VdsNetworkInterface underlyingNic) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworksFromClusterCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworksFromClusterCommand.java
new file mode 100644
index 0000000..f1cbed2
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworksFromClusterCommand.java
@@ -0,0 +1,97 @@
+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.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.network.RemoveNetworksByLabelParametersBuilder;
+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.utils.transaction.TransactionMethod;
+import org.ovirt.engine.core.utils.transaction.TransactionSupport;
+
+@InternalCommandAttribute
+@NonTransactiveCommandAttribute
+public class DetachNetworksFromClusterCommand<T extends 
ClusterNetworksParameters> extends VdsGroupCommandBase<T> {
+
+    public DetachNetworksFromClusterCommand(T parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeCommand() {
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+
+            @Override
+            public Void runInTransaction() {
+                for (AttachNetworkToVdsGroupParameter param : 
getParameters().getClusterNetworksParameters()) {
+                    
getNetworkClusterDAO().remove(getParameters().getVdsGroupId(),
+                            param.getNetworkCluster().getNetworkId());
+                }
+
+                return null;
+            }
+        });
+
+        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()) {
+                removeNetworksFromHosts(networksByHost, labelsToNicsByHost);
+            }
+        }
+
+        setSucceeded(true);
+    }
+
+    private void removeNetworksFromHosts(Map<Guid, List<Network>> 
networksByHost,
+            Map<Guid, Map<String, VdsNetworkInterface>> labelsToNicsByHost) {
+        ArrayList<VdcActionParametersBase> parameters = new ArrayList<>();
+        for (Guid hostId : networksByHost.keySet()) {
+            RemoveNetworksByLabelParametersBuilder builder = new 
RemoveNetworksByLabelParametersBuilder();
+            parameters.add(builder.buildParameters(hostId, 
networksByHost.get(hostId), labelsToNicsByHost.get(hostId)));
+        }
+
+        
getBackend().runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, 
parameters);
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        return Collections.emptyList();
+    }
+}
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 7b600a4..3d31da3 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
@@ -190,6 +190,7 @@
     UpdateDisplayToVdsGroup(710, ActionGroup.EDIT_CLUSTER_CONFIGURATION, 
false, QuotaDependency.NONE),
     UpdateNetworkOnCluster(711, ActionGroup.CONFIGURE_CLUSTER_NETWORK, false, 
QuotaDependency.NONE),
     AttachNetworksToCluster(712, false, QuotaDependency.NONE),
+    DetachNetworksFromCluster(713, false, QuotaDependency.NONE),
 
     /**
      * MultiLevelAdministration


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

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

Reply via email to