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
