Moti Asayag has uploaded a new change for review.

Change subject: engine: Edit Network and apply to hosts at once
......................................................................

engine: Edit Network and apply to hosts at once

Editing a network and applying its changes to all
of the eligible hosts via a single action is enabled.

Two scenarios are supported:
1. Sync-ing the network on the hosts (if the network wasn't
renamed)
2. Recreating the network on the hosts (if the network was
renamed)

See: http://www.ovirt.org/Features/EditProvisionedNetwork

Change-Id: Iec04c7fb0c29ba6f61b7d788a9c3917f5d46554e
Signed-off-by: Moti Asayag <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java
3 files changed, 179 insertions(+), 6 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/53/22053/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 0ae2b94..0373457 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,21 +1,37 @@
 package org.ovirt.engine.core.bll.network.dc;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 
 import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang.StringUtils;
 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.NetworkConfigurator;
 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.VdcObjectType;
 import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters;
+import org.ovirt.engine.core.common.action.SetupNetworksParameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.ActionVersionMap;
+import org.ovirt.engine.core.common.businessentities.VDS;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VMStatus;
 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.VdsNetworkInterface;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.validation.group.UpdateEntity;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.Version;
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
 import org.ovirt.engine.core.utils.NetworkUtils;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
@@ -49,7 +65,25 @@
             }
         });
 
+        if (getParameters().configureHosts() && !getNetwork().isExternal()) {
+            applyNetworkChangesToHosts();
+        }
+
         setSucceeded(true);
+    }
+
+    private void applyNetworkChangesToHosts() {
+        SetupNetworksParametersBuilder builder;
+        if (StringUtils.equals(getNetworkName(), getOldNetwork().getName())) {
+            builder = new SyncNetworkParametersBuilder();
+        } else {
+            builder = new RenameNetworkParametersBuilder();
+        }
+
+        builder.buildParameters(getNetwork());
+        if (!builder.getParameters().isEmpty()) {
+            
getBackend().runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, 
builder.getParameters());
+        }
     }
 
     private boolean networkChangedToNonVmNetwork() {
@@ -64,7 +98,7 @@
 
     @Override
     protected boolean canDoAction() {
-        if (onlyPermittedFieldsChanged()) {
+        if (onlyPermittedFieldsChanged() && !getParameters().configureHosts()) 
{
             return true;
         }
 
@@ -79,8 +113,9 @@
                 && validate(validatorOld.networkIsSet())
                 && 
validate(validatorOld.notRenamingManagementNetwork(getNetwork()))
                 && validate(validatorNew.networkNameNotUsed())
-                && validate(validatorOld.networkNotUsedByVms())
-                && validate(validatorOld.networkNotUsedByTemplates())
+                && validate(validatorOld.networkNotUsedByRunningVms())
+                && 
validate(validatorOld.nonVmNetworkNotUsedByVms(getNetwork()))
+                && 
validate(validatorOld.nonVmNetworkNotUsedByTemplates(getNetwork()))
                 && (oldAndNewNetworkIsNotExternal()
                 || 
validate(validatorOld.externalNetworkDetailsUnchanged(getNetwork())));
     }
@@ -135,6 +170,41 @@
             super(network);
         }
 
+        public ValidationResult nonVmNetworkNotUsedByVms(Network 
updatedNetwork) {
+            if (networkChangedToNonVmNetwork(updatedNetwork)) {
+                networkNotUsed(getVms(), VdcBllMessages.VAR__ENTITIES__VMS);
+            }
+
+            return ValidationResult.VALID;
+        }
+
+        private boolean networkChangedToNonVmNetwork(Network updatedNetwork) {
+            return network.isVmNetwork() && !updatedNetwork.isVmNetwork();
+        }
+
+        /**
+         * @return An error iff the network is in use by any VMs.
+         */
+        public ValidationResult networkNotUsedByRunningVms() {
+            List<VM> runningVms = new ArrayList<>();
+
+            for (VM vm : getVms()) {
+                if (vm.getStatus() != VMStatus.Down) {
+                    runningVms.add(vm);
+                }
+            }
+
+            return networkNotUsed(runningVms, 
VdcBllMessages.VAR__ENTITIES__VMS);
+        }
+
+        public ValidationResult nonVmNetworkNotUsedByTemplates(Network 
updatedNetwork) {
+            if (networkChangedToNonVmNetwork(updatedNetwork)) {
+                networkNotUsed(getTemplates(), 
VdcBllMessages.VAR__ENTITIES__VMS);
+            }
+
+            return ValidationResult.VALID;
+        }
+
         public ValidationResult notRenamingManagementNetwork(Network 
newNetwork) {
             String managementNetwork = NetworkUtils.getEngineNetwork();
             return network.getName().equals(managementNetwork) &&
@@ -182,4 +252,84 @@
     public void setEntityId(AuditLogableBase logable) {
 
     }
+
+    private abstract class SetupNetworksParametersBuilder {
+        private ArrayList<VdcActionParametersBase> parameters = new 
ArrayList<>();
+
+        protected abstract void buildParameters(Network network);
+
+        protected boolean setupNetworkSupported(VDS host) {
+            ActionVersionMap actionVersions =
+                    
getDbFacade().getActionGroupDao().getActionVersionMapByActionType(VdcActionType.SetupNetworks);
+
+            return host.getVdsGroupCompatibilityVersion()
+                    .compareTo(new 
Version(actionVersions.getcluster_minimal_version())) >= 0;
+        }
+
+        protected SetupNetworksParameters createSetupNetworksParameters(VDS 
host) {
+            NetworkConfigurator configurator = new NetworkConfigurator(host);
+            List<VdsNetworkInterface> nics = 
configurator.filterBondsWithoutSlaves(getHostNics(host));
+            SetupNetworksParameters parameters = 
configurator.createSetupNetworkParams(nics);
+            parameters.setShouldBeLogged(true);
+            return parameters;
+        }
+
+        protected List<VdsNetworkInterface> getHostNics(VDS host) {
+            return 
getDbFacade().getInterfaceDao().getAllInterfacesForVds(host.getId());
+        }
+
+        public ArrayList<VdcActionParametersBase> getParameters() {
+            return parameters;
+        }
+    }
+
+    private class SyncNetworkParametersBuilder extends 
SetupNetworksParametersBuilder {
+
+        @Override
+        protected void buildParameters(Network network) {
+
+            List<VdsNetworkInterface> nics =
+                    
getDbFacade().getInterfaceDao().getVdsInterfacesByNetworkId(getNetwork().getId());
+
+            Set<Guid> hostIdsToSync = new HashSet<>();
+            for (VdsNetworkInterface nic : nics) {
+                if (!NetworkUtils.isNetworkInSync(nic, getNetwork())) {
+                    hostIdsToSync.add(nic.getVdsId());
+                }
+            }
+
+            for (Guid hostId : hostIdsToSync) {
+                VDS host = getVdsDAO().get(hostId);
+                if (setupNetworkSupported(host)) {
+                    SetupNetworksParameters setupNetworkParams = 
createSetupNetworksParameters(host);
+                    
setupNetworkParams.setNetworksToSync(Collections.singletonList(getNetworkName()));
+                    getParameters().add(setupNetworkParams);
+                }
+            }
+        }
+    }
+
+    private class RenameNetworkParametersBuilder extends 
SetupNetworksParametersBuilder {
+
+        @Override
+        protected void buildParameters(Network network) {
+            List<VDS> hosts = getVdsDAO().getAllForNetwork(network.getId());
+            for (VDS host : hosts) {
+                if (!setupNetworkSupported(host)) {
+                    continue;
+                }
+
+                SetupNetworksParameters setupNetworkParams = 
createSetupNetworksParameters(host);
+                List<VdsNetworkInterface> nics = 
setupNetworkParams.getInterfaces();
+                for (VdsNetworkInterface nic : nics) {
+                    if (StringUtils.equals(nic.getNetworkName(), 
getOldNetwork().getName())) {
+                        nic.setNetworkName(network.getName());
+                        break;
+                    }
+                }
+
+                getParameters().add(setupNetworkParams);
+            }
+        }
+    }
 }
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
index 0706ab8..fe64367 100644
--- 
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
@@ -7,6 +7,8 @@
 import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.businessentities.Nameable;
 import org.ovirt.engine.core.common.businessentities.StoragePool;
+import org.ovirt.engine.core.common.businessentities.VM;
+import org.ovirt.engine.core.common.businessentities.VmTemplate;
 import org.ovirt.engine.core.common.businessentities.network.Network;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
@@ -24,6 +26,7 @@
 
     private StoragePool dataCenter;
     private List<Network> networks;
+    private List<VM> vms;
 
     public NetworkValidator(Network network) {
         this.network = network;
@@ -156,8 +159,7 @@
      * @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 networkNotUsed(getVms(), VdcBllMessages.VAR__ENTITIES__VMS);
     }
 
     /**
@@ -172,7 +174,19 @@
      * @return An error iff the network is in use by any templates.
      */
     public ValidationResult networkNotUsedByTemplates() {
-        return 
networkNotUsed(getDbFacade().getVmTemplateDao().getAllForNetwork(network.getId()),
+        return networkNotUsed(getTemplates(),
                 VdcBllMessages.VAR__ENTITIES__VM_TEMPLATES);
     }
+
+    protected List<VM> getVms() {
+        if (vms == null) {
+            vms = getDbFacade().getVmDao().getAllForNetwork(network.getId());
+        }
+
+        return vms;
+    }
+
+    protected List<VmTemplate> getTemplates() {
+        return 
getDbFacade().getVmTemplateDao().getAllForNetwork(network.getId());
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java
index 6dce939..13a35a8 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java
@@ -14,6 +14,7 @@
     private Network network;
 
     private boolean vnicProfileRequired;
+    private boolean configureHosts;
 
     public AddNetworkStoragePoolParameters() {
         vnicProfileRequired = true;
@@ -36,4 +37,12 @@
     public void setVnicProfileRequired(boolean vnicProfileRequired) {
         this.vnicProfileRequired = vnicProfileRequired;
     }
+
+    public boolean configureHosts() {
+        return configureHosts;
+    }
+
+    public void setConfigureHosts(boolean configureHosts) {
+        this.configureHosts = configureHosts;
+    }
 }


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

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