Moti Asayag has uploaded a new change for review.

Change subject: engine: Remove network from hosts when detached from cluster
......................................................................

engine: Remove network from hosts when detached from cluster

When detaching a labeled network from a cluster, the label
became ineffective in that cluster in regards to the detached
network context. Therefore, the network should be removed
from all labeled hosts.

Change-Id: I513f5ce7332388ac44ddc1f05988f23d6531cb89
Bug-Url: https://bugzilla.redhat.com/1040586
Signed-off-by: Moti Asayag <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworkParametersBuilder.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkToVdsGroupCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
M 
backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
5 files changed, 130 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/71/22771/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworkParametersBuilder.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworkParametersBuilder.java
new file mode 100644
index 0000000..cf69091
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/RemoveNetworkParametersBuilder.java
@@ -0,0 +1,106 @@
+package org.ovirt.engine.core.bll.network;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.common.AuditLogType;
+import org.ovirt.engine.core.common.action.SetupNetworksParameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+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.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
+import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase;
+import org.ovirt.engine.core.utils.NetworkUtils;
+
+public class RemoveNetworkParametersBuilder extends NetworkParametersBuilder {
+
+    private Network network;
+
+    public RemoveNetworkParametersBuilder(Network network) {
+        this.network = network;
+    }
+
+    public ArrayList<VdcActionParametersBase> 
buildParameters(List<VdsNetworkInterface> nics) {
+        Set<Guid> nonUpdateableHosts = new HashSet<>();
+        ArrayList<VdcActionParametersBase> parameters = new ArrayList<>();
+        boolean vlanNetwork = NetworkUtils.isVlan(network);
+
+        for (VdsNetworkInterface nic : nics) {
+            SetupNetworksParameters setupNetworkParams = 
createSetupNetworksParameters(nic.getVdsId());
+            VdsNetworkInterface nicToConfigure = 
getNicToConfigure(setupNetworkParams.getInterfaces(), nic.getId());
+            if (nicToConfigure == null) {
+                continue;
+            }
+
+            if (network.getName().equals(nicToConfigure.getNetworkName())) {
+                nicToConfigure.setNetworkName(null);
+            } else if (vlanNetwork) {
+                VdsNetworkInterface vlan = getVlanDevice(setupNetworkParams, 
nicToConfigure);
+
+                if (vlan == null) {
+                    nonUpdateableHosts.add(nic.getVdsId());
+                } else {
+                    setupNetworkParams.getInterfaces().remove(vlan);
+                }
+            } else {
+                // if a network is assigned to nic other than the labeled one
+                nonUpdateableHosts.add(nic.getVdsId());
+                continue;
+            }
+
+            parameters.add(setupNetworkParams);
+        }
+
+        reportNonUpdateableHosts(nonUpdateableHosts);
+        return parameters;
+    }
+
+    private VdsNetworkInterface getVlanDevice(SetupNetworksParameters 
setupNetworkParams,
+            VdsNetworkInterface nicToConfigure) {
+        VdsNetworkInterface vlan = null;
+        for (VdsNetworkInterface n : setupNetworkParams.getInterfaces()) {
+            if (StringUtils.equals(n.getName(),
+                    NetworkUtils.getVlanDeviceName(nicToConfigure.getName(), 
network))) {
+                vlan = n;
+            }
+        }
+
+        return vlan;
+    }
+
+    private void reportNonUpdateableHosts(Set<Guid> nonUpdateableHosts) {
+        if (nonUpdateableHosts.isEmpty()) {
+            return;
+        }
+
+        List<String> hostNames = new ArrayList<>(nonUpdateableHosts.size());
+        for (Guid hostId : nonUpdateableHosts) {
+            
hostNames.add(getDbFacade().getVdsStaticDao().get(hostId).getName());
+        }
+
+        AuditLogableBase logable = new AuditLogableBase();
+        logable.setStoragePoolId(network.getDataCenterId());
+        logable.addCustomValue("Network", network.getName());
+        logable.addCustomValue("HostNames", StringUtils.join(hostNames, ", "));
+        AuditLogDirector.log(logable, 
AuditLogType.REMOVE_NETWORK_BY_LABEL_FAILED);
+    }
+
+    private VdsNetworkInterface getNicToConfigure(List<VdsNetworkInterface> 
nics, Guid id) {
+        for (VdsNetworkInterface nic : nics) {
+            if (nic.getId().equals(id)) {
+                return nic;
+            }
+        }
+
+        return null;
+    }
+
+    private DbFacade getDbFacade() {
+        return DbFacade.getInstance();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkToVdsGroupCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkToVdsGroupCommand.java
index 0350be6..6cf659a 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkToVdsGroupCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworkToVdsGroupCommand.java
@@ -7,14 +7,18 @@
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
 import org.ovirt.engine.core.bll.ValidationResult;
 import org.ovirt.engine.core.bll.VdsGroupCommandBase;
+import org.ovirt.engine.core.bll.network.RemoveNetworkParametersBuilder;
 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.AttachNetworkToVdsGroupParameter;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.businessentities.VmTemplate;
 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.businessentities.network.VmNetworkInterface;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.compat.Guid;
@@ -37,6 +41,11 @@
                 return null;
             }
         });
+
+        if (getNetwork().getLabel() != null
+                && 
NetworkHelper.setupNetworkSupported(getVdsGroup().getcompatibility_version())) {
+            removeNetworkFromHosts();
+        }
 
         setSucceeded(true);
     }
@@ -78,6 +87,18 @@
         return getParameters().getNetwork();
     }
 
+    private void removeNetworkFromHosts() {
+        List<VdsNetworkInterface> nics =
+                
getDbFacade().getInterfaceDao().getAllInterfacesByLabelForCluster(getParameters().getVdsGroupId(),
+                        getNetwork().getLabel());
+        RemoveNetworkParametersBuilder builder = new 
RemoveNetworkParametersBuilder(getNetwork());
+        ArrayList<VdcActionParametersBase> parameters = 
builder.buildParameters(nics);
+
+        if (!parameters.isEmpty()) {
+            
getBackend().runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, 
parameters);
+        }
+    }
+
     private class DetachNetworkValidator extends NetworkValidator {
 
         private NetworkCluster networkCluster;
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
index 40af2fc..f08b005 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/AuditLogType.java
@@ -602,6 +602,7 @@
     NETWORK_WITHOUT_INTERFACES(1128),
     VNIC_PROFILE_UNSUPPORTED_FEATURES(1129, 
AuditLogTimeInterval.DAY.getValue()),
     ADD_NETWORK_BY_LABEL_FAILED(1130),
+    REMOVE_NETWORK_BY_LABEL_FAILED(1131),
 
     // Import/Export
     IMPORTEXPORT_STARTING_EXPORT_VM(1162),
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
index 64102d7..1c92f09 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/auditloghandling/AuditLogDirector.java
@@ -822,6 +822,7 @@
         severities.put(AuditLogType.NETWORK_WITHOUT_INTERFACES, 
AuditLogSeverity.WARNING);
         severities.put(AuditLogType.VNIC_PROFILE_UNSUPPORTED_FEATURES, 
AuditLogSeverity.WARNING);
         severities.put(AuditLogType.ADD_NETWORK_BY_LABEL_FAILED, 
AuditLogSeverity.ERROR);
+        severities.put(AuditLogType.REMOVE_NETWORK_BY_LABEL_FAILED, 
AuditLogSeverity.ERROR);
     }
 
     private static void initExtrnalEvents() {
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
 
b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
index b97f500..46465ae 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties
@@ -441,6 +441,7 @@
 NETWORK_WITHOUT_INTERFACES=Network ${NetworkName} is not attached to any 
interface on host ${VdsName}.
 VNIC_PROFILE_UNSUPPORTED_FEATURES=VM ${VmName} has network interface 
${NicName} which is using profile ${VnicProfile} with unsupported feature(s) 
'${UnsupportedFeatures}' by VM cluster ${VdsGroupName} (version 
${CompatibilityVersion}).
 ADD_NETWORK_BY_LABEL_FAILED=Network ${Network} cannot be configured in 
data-center ${StoragePoolName} on the following hosts: ${HostNames}.
+REMOVE_NETWORK_BY_LABEL_FAILED=Network ${Network} cannot be removed from the 
following hosts: ${HostNames} in data-center ${StoragePoolName}.
 PROVIDER_ADDED=Provider ${ProviderName} was added. (User: ${UserName})
 PROVIDER_ADDITION_FAILED=Failed to add provider ${ProviderName}. (User: 
${UserName})
 PROVIDER_UPDATED=Provider ${ProviderName} was updated. (User: ${UserName})


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

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