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/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 5 files changed, 145 insertions(+), 4 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/01/23501/1 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..34236c7 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,8 +70,20 @@ break; } - case AttachNetworkToVdsGroup: { - runner = new NetworkClusterAttachmentActionRunner(actionType, parameters, isInternal); + case AttachNetworkToVdsGroup: + runner = + new NetworkClusterAttachmentActionRunner(actionType, + parameters, + isInternal, + VdcActionType.AttachNetworksToCluster); + break; + + case DetachNetworkToVdsGroup: { + runner = + new NetworkClusterAttachmentActionRunner(actionType, + parameters, + isInternal, + VdcActionType.DetachNetworksFromCluster); 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..fa38690 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 @@ -19,10 +19,14 @@ */ public class NetworkClusterAttachmentActionRunner extends MultipleActionsRunner { + private VdcActionType massAction; + public NetworkClusterAttachmentActionRunner(VdcActionType actionType, List<VdcActionParametersBase> parameters, - boolean isInternal) { + boolean isInternal, + VdcActionType massAction) { super(actionType, parameters, isInternal); + this.massAction = massAction; } protected void runCommands() { @@ -49,7 +53,7 @@ // multiple networks can be either attached or detached from a single cluster if (!params.isEmpty()) { - Backend.getInstance().runInternalAction(VdcActionType.AttachNetworksToCluster, + Backend.getInstance().runInternalAction(massAction, new ClusterNetworksParameters(params.get(0).getVdsGroupId(), params)); } } 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..e603f46 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,28 @@ return parameters; } + /** + * Removes a given list of labeled networks from a host + */ + public SetupNetworksParameters buildParameters(Guid hostId, + List<Network> networksToRemove, + List<VdsNetworkInterface> nics) { + SetupNetworksParameters parameters = createSetupNetworksParameters(hostId); + + for (VdsNetworkInterface nic : nics) { + VdsNetworkInterface nicToConfigure = getNicToConfigure(parameters.getInterfaces(), nic.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..b8e7473 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/DetachNetworksFromClusterCommand.java @@ -0,0 +1,99 @@ +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.Map.Entry; +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, List<VdsNetworkInterface>> nicsByHost = 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>()); + nicsByHost.put(nic.getVdsId(), new ArrayList<VdsNetworkInterface>()); + } + + nicsByHost.get(nic.getVdsId()).add(nic); + networksByHost.get(nic.getVdsId()).add(network); + } + } + + if (!networksByHost.isEmpty()) { + removeNetworksFromHosts(networksByHost, nicsByHost); + } + } + + setSucceeded(true); + } + + private void removeNetworksFromHosts(Map<Guid, List<Network>> networksByHost, Map<Guid, List<VdsNetworkInterface>> nicsByHost) { + ArrayList<VdcActionParametersBase> parameters = new ArrayList<>(); + for (Entry<Guid, List<Network>> entry : networksByHost.entrySet()) { + RemoveNetworksByLabelParametersBuilder builder = new RemoveNetworksByLabelParametersBuilder(); + parameters.add(builder.buildParameters(entry.getKey(), + entry.getValue(), + nicsByHost.get(entry.getKey()))); + } + + 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 6d3dff6..5c5994b 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 @@ -189,6 +189,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/23501 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I4a430d95b370a32ca38f7241e2816d3a5d476998 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Moti Asayag <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
