Mike Kolesnik has uploaded a new change for review. Change subject: engine: Remove port if hot plug new ext. nic fails ......................................................................
engine: Remove port if hot plug new ext. nic fails If a new vNIC is added on an external network, and this vNIC is also hot plugged as part of this flow then a corresponding entity will be created on the external provider. If the aforementioned action fails, the vNIC will be removed from the DB (by compensation mechanism) but not from the external provider, leaving garbage forever on it. In this fix, a new vNIC that fails to hot plug will also be removed from the external provider. At this point, there is no need to remove an existing vNIC should the hot plug fail, as the entity that was created on the external provider should be removed only when the vNIC is being removed, or the network is not used by the vNIC anymore. Change-Id: Iddeac63a47286e9b83ac02fb2e55f7dd56092805 Bug-Url: https://bugzilla.redhat.com/987814 Signed-off-by: Mike Kolesnik <[email protected]> (cherry picked from commit c3fcf1485b5b15e4b9509b910b24202f39ea594c) --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ActivateDeactivateVmNicParameters.java 5 files changed, 58 insertions(+), 21 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/03/25603/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java index 02346fe..3434a43 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AbstractVmInterfaceCommand.java @@ -29,10 +29,20 @@ super(parameters); } - protected boolean activateOrDeactivateNic(VmNic nic, PlugAction plugAction) { + protected boolean activateOrDeactivateNewNic(VmNic nic, PlugAction plugAction) { + return activateOrDeactivateNic(nic, plugAction, true); + } + + protected boolean activateOrDeactivateExistingNic(VmNic nic, PlugAction plugAction) { + return activateOrDeactivateNic(nic, plugAction, false); + } + + private boolean activateOrDeactivateNic(VmNic nic, PlugAction plugAction, boolean newNic) { + ActivateDeactivateVmNicParameters parameters = new ActivateDeactivateVmNicParameters(nic, plugAction, newNic); + parameters.setVmId(getParameters().getVmId()); + VdcReturnValueBase returnValue = - getBackend().runInternalAction(VdcActionType.ActivateDeactivateVmNic, - createActivateDeactivateParameters(nic, plugAction)); + getBackend().runInternalAction(VdcActionType.ActivateDeactivateVmNic, parameters); if (!returnValue.getSucceeded()) { propagateFailure(returnValue); } @@ -40,17 +50,9 @@ return returnValue.getSucceeded(); } - @Override protected void setActionMessageParameters() { addCanDoActionMessage(VdcBllMessages.VAR__TYPE__INTERFACE); - } - - private ActivateDeactivateVmNicParameters createActivateDeactivateParameters(VmNic nic, PlugAction plugAction) { - ActivateDeactivateVmNicParameters parameters = new ActivateDeactivateVmNicParameters(nic, plugAction); - parameters.setVmId(getParameters().getVmId()); - - return parameters; } protected boolean addMacToPool(String macAddress) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java index 8aa46ef..94f350d 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java @@ -24,6 +24,7 @@ import org.ovirt.engine.core.common.businessentities.network.VnicProfile; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.vdscommands.VmNicDeviceVDSParameters; import org.ovirt.engine.core.compat.Guid; @@ -43,6 +44,8 @@ private VnicProfile vnicProfile; private Network network; + + private NetworkProviderProxy providerProxy; public ActivateDeactivateVmNicCommand(T parameters) { super(parameters); @@ -118,32 +121,54 @@ protected void executeVmCommand() { // HotPlug in the host is called only if the Vm is UP if (hotPlugVmNicRequired(getVm().getStatus())) { - if (getNetwork() != null && getNetwork().isExternal()) { - handleExternalNetworks(); + boolean externalNetworkIsPlugged = getParameters().getAction() == PlugAction.PLUG + && getNetwork() != null + && getNetwork().isExternal(); + if (externalNetworkIsPlugged) { + plugToExternalNetwork(); } + try { runVdsCommand(getParameters().getAction().getCommandType(), new VmNicDeviceVDSParameters(getVdsId(), getVm(), getParameters().getNic(), vmDevice)); + } catch (VdcBLLException e) { + if (externalNetworkIsPlugged && getParameters().isNewNic()) { + unplugFromExternalNetwork(); + } + + throw e; + } } // In any case, the device is updated TransactionSupport.executeInNewTransaction(updateDevice()); setSucceeded(true); } - private void handleExternalNetworks() { - Provider<?> provider = getDbFacade().getProviderDao().get(getNetwork().getProvidedBy().getProviderId()); - NetworkProviderProxy providerProxy = ProviderProxyFactory.getInstance().create(provider); + private void plugToExternalNetwork() { Map<String, String> runtimeProperties = - providerProxy.allocate(getNetwork(), vnicProfile, getParameters().getNic()); + getProviderProxy().allocate(getNetwork(), vnicProfile, getParameters().getNic()); if (runtimeProperties != null) { getVm().getRuntimeDeviceCustomProperties().put(vmDevice, runtimeProperties); } } + private void unplugFromExternalNetwork() { + getProviderProxy().deallocate(getParameters().getNic()); + } + + private NetworkProviderProxy getProviderProxy() { + if (providerProxy == null) { + Provider<?> provider = getDbFacade().getProviderDao().get(getNetwork().getProvidedBy().getProviderId()); + providerProxy = ProviderProxyFactory.getInstance().create(provider); + } + + return providerProxy; + } + private TransactionMethod<Void> updateDevice() { return new TransactionMethod<Void>() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java index ed6179a..6c35399 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/AddVmInterfaceCommand.java @@ -64,7 +64,7 @@ }); if (getInterface().isPlugged()) { - succeeded = activateOrDeactivateNic(getInterface(), PlugAction.PLUG); + succeeded = activateOrDeactivateNewNic(getInterface(), PlugAction.PLUG); } else { succeeded = true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java index cd5b913..cba78eb 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/UpdateVmInterfaceCommand.java @@ -126,10 +126,10 @@ if (getRequiredAction() != null){ switch (getRequiredAction()) { case PLUG: { - return activateOrDeactivateNic(getInterface(), PlugAction.PLUG); + return activateOrDeactivateExistingNic(getInterface(), PlugAction.PLUG); } case UNPLUG: { - return activateOrDeactivateNic(oldIface, PlugAction.UNPLUG); + return activateOrDeactivateExistingNic(oldIface, PlugAction.UNPLUG); } case UPDATE_VM_DEVICE: { runVdsCommand(VDSCommandType.UpdateVmInterface, diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ActivateDeactivateVmNicParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ActivateDeactivateVmNicParameters.java index 82fdcaa..b21dbc9 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ActivateDeactivateVmNicParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ActivateDeactivateVmNicParameters.java @@ -7,14 +7,16 @@ private static final long serialVersionUID = 8972183222927384462L; private VmNic nic; private PlugAction action; + private boolean newNic; public ActivateDeactivateVmNicParameters() { } - public ActivateDeactivateVmNicParameters(VmNic nic, PlugAction action) { + public ActivateDeactivateVmNicParameters(VmNic nic, PlugAction action, boolean newNic) { super(); this.nic = nic; this.action = action; + this.newNic = newNic; } public VmNic getNic() { @@ -33,4 +35,12 @@ this.action = action; } + public boolean isNewNic() { + return newNic; + } + + public void setNewNic(boolean newNic) { + this.newNic = newNic; + } + } -- To view, visit http://gerrit.ovirt.org/25603 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iddeac63a47286e9b83ac02fb2e55f7dd56092805 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Mike Kolesnik <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
