Moti Asayag has uploaded a new change for review.

Change subject: engine: Update network on hosts when label is changed
......................................................................

engine: Update network on hosts when label is changed

When the network's label is being modifies, the change
to the label should be reflected to the labeled hosts.

There are 4 options in this regards:
1. Labeling a network - will add the network to any of
labeled hosts which the network is assigned to their
cluster.
2. Unlabeling a network - will remove the network from
any of labeled hosts that the network is assigned to
their cluster.
3. Changing the label - the network will be removed
from all of the labelled hosts (by the previous label)
and will be attached to all of the labelled host
(according to the new label).
4. Label unchanged - only sync action will apply to
hosts that the network is configured on.

Change-Id: Id8b851d589db8ad6ef025d3b752c9596aa30aee2
Bug-Url: https://bugzilla.redhat.com/1040586
Signed-off-by: Moti Asayag <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java
1 file changed, 127 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/72/22772/1

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 54dee99..066cfa4 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
@@ -1,9 +1,12 @@
 package org.ovirt.engine.core.bll.network.dc;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 
@@ -12,7 +15,9 @@
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
 import org.ovirt.engine.core.bll.RenamedEntityInfoProvider;
 import org.ovirt.engine.core.bll.ValidationResult;
+import org.ovirt.engine.core.bll.network.AddNetworkParametersBuilder;
 import org.ovirt.engine.core.bll.network.NetworkParametersBuilder;
+import org.ovirt.engine.core.bll.network.RemoveNetworkParametersBuilder;
 import org.ovirt.engine.core.bll.network.cluster.NetworkClusterHelper;
 import org.ovirt.engine.core.bll.network.cluster.NetworkHelper;
 import org.ovirt.engine.core.bll.validator.NetworkValidator;
@@ -76,7 +81,7 @@
 
     private void applyNetworkChangesToHosts() {
         SyncNetworkParametersBuilder builder = new 
SyncNetworkParametersBuilder();
-        ArrayList<VdcActionParametersBase> parameters = 
builder.buildParameters(getNetwork());
+        ArrayList<VdcActionParametersBase> parameters = 
builder.buildParameters(getNetwork(), getOldNetwork());
 
         if (!parameters.isEmpty()) {
             
getBackend().runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, 
parameters);
@@ -266,12 +271,131 @@
 
     }
 
+    private boolean labelChanged() {
+        return !Objects.equals(getNetwork().getLabel(), 
getOldNetwork().getLabel());
+    }
+
+    private boolean labelAdded() {
+        return getOldNetwork().getLabel() == null && getNetwork().getLabel() 
!= null;
+    }
+
+    private boolean labelRemoved() {
+        return getOldNetwork().getLabel() != null && getNetwork().getLabel() 
== null;
+    }
+
     private class SyncNetworkParametersBuilder extends 
NetworkParametersBuilder{
 
-        private ArrayList<VdcActionParametersBase> buildParameters(Network 
network) {
+        private ArrayList<VdcActionParametersBase> buildParameters(Network 
network, Network oldNetwork) {
             ArrayList<VdcActionParametersBase> parameters = new ArrayList<>();
             List<VdsNetworkInterface> nics =
-                    
getDbFacade().getInterfaceDao().getVdsInterfacesByNetworkId(getNetwork().getId());
+                    
getDbFacade().getInterfaceDao().getVdsInterfacesByNetworkId(network.getId());
+
+            // sync network on nics if the label wasn't changed
+            if (!labelChanged()) {
+                createSyncNetworkParameters(parameters, nics);
+                return parameters;
+            }
+
+            // add network to labeled interfaces and sync network on the rest
+            if (labelAdded()) {
+                List<VdsNetworkInterface> labeledNics = 
getLabeledNics(network);
+                Map<Guid, VdsNetworkInterface> hostToNic = mapHostToNic(nics);
+                List<VdsNetworkInterface> nicsForAdd = new ArrayList<>();
+                Set<VdsNetworkInterface> nicsForSync = new HashSet<>();
+
+                // nics to add network
+                for (VdsNetworkInterface labeledNic : labeledNics) {
+                    VdsNetworkInterface nic = 
hostToNic.get(labeledNic.getVdsId());
+
+                    // add network to labeled nic if network not configured on 
host
+                    if (nic == null) {
+                        nicsForAdd.add(labeledNic);
+                    } else {
+                        // sync the network
+                        nicsForSync.add(nic);
+                    }
+                }
+
+                // add the unlabeled nics to be synced
+                for (VdsNetworkInterface nic : nics) {
+                    if (!nicsForSync.contains(nic)) {
+                        nicsForSync.add(nic);
+                    }
+                }
+
+                parameters.addAll(createAddNetworkParameters(nicsForAdd));
+                createSyncNetworkParameters(parameters, nicsForSync);
+                return parameters;
+            }
+
+            // remove network from labeled interfaces
+            if (labelRemoved()) {
+                List<VdsNetworkInterface> labeledNics = 
getLabeledNics(oldNetwork);
+                Map<Guid, VdsNetworkInterface> hostToNic = mapHostToNic(nics);
+                List<VdsNetworkInterface> nicsForRemove = new ArrayList<>();
+                Set<VdsNetworkInterface> nicsForSync = new HashSet<>();
+
+                // nics to remove the network from
+                for (VdsNetworkInterface labeledNic : labeledNics) {
+                    VdsNetworkInterface nic = 
hostToNic.get(labeledNic.getVdsId());
+
+                    // sync the network if not labeled
+                    if (nic == null) {
+                        nicsForSync.add(nic);
+                    } else {
+                        // remove the network from labeled nic
+                        nicsForRemove.add(labeledNic);
+                    }
+                }
+
+                // add the unlabeled nics to be synced
+                for (VdsNetworkInterface nic : nics) {
+                    if (!nicsForSync.contains(nic)) {
+                        nicsForSync.add(nic);
+                    }
+                }
+
+                
parameters.addAll(createRemoveNetworkParameters(nicsForRemove));
+                createSyncNetworkParameters(parameters, nicsForSync);
+                return parameters;
+            }
+
+            // label is renamed therefore should be removed from all labeled 
nics and attached to nics with new label
+            // TODO: support this case...
+
+            return parameters;
+        }
+
+        private ArrayList<VdcActionParametersBase> 
createAddNetworkParameters(List<VdsNetworkInterface> nicsForAdd) {
+            AddNetworkParametersBuilder builder = new 
AddNetworkParametersBuilder(getNetwork());
+            return builder.buildParameters(nicsForAdd);
+        }
+
+        private ArrayList<VdcActionParametersBase> 
createRemoveNetworkParameters(List<VdsNetworkInterface> nicsForRemove) {
+            RemoveNetworkParametersBuilder builder = new 
RemoveNetworkParametersBuilder(getOldNetwork());
+            return builder.buildParameters(nicsForRemove);
+        }
+
+        private Map<Guid, VdsNetworkInterface> 
mapHostToNic(List<VdsNetworkInterface> nics) {
+            Map<Guid, VdsNetworkInterface> hostToNic = new 
HashMap<>(nics.size());
+            for (VdsNetworkInterface nic : nics) {
+                hostToNic.put(nic.getVdsId(), nic);
+            }
+            return hostToNic;
+        }
+
+        private List<VdsNetworkInterface> getLabeledNics(Network network) {
+            List<NetworkCluster> clusters = 
getNetworkClusterDAO().getAllForNetwork(network.getId());
+            List<VdsNetworkInterface> labeledNics = new ArrayList<>();
+            for (NetworkCluster networkCluster : clusters) {
+                labeledNics.addAll(getDbFacade().getInterfaceDao()
+                        
.getAllInterfacesByLabelForCluster(networkCluster.getClusterId(), 
network.getLabel()));
+            }
+            return labeledNics;
+        }
+
+        private void 
createSyncNetworkParameters(ArrayList<VdcActionParametersBase> parameters,
+                Collection<VdsNetworkInterface> nics) {
 
             Set<Guid> hostIdsToSync = new HashSet<>();
             for (VdsNetworkInterface nic : nics) {
@@ -285,8 +409,6 @@
                 
setupNetworkParams.setNetworksToSync(Collections.singletonList(getNetworkName()));
                 parameters.add(setupNetworkParams);
             }
-
-            return parameters;
         }
     }
 }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id8b851d589db8ad6ef025d3b752c9596aa30aee2
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