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
