diff --git a/server/src/main/java/com/cloud/network/rules/NicPlugInOutRules.java b/server/src/main/java/com/cloud/network/rules/NicPlugInOutRules.java index 996d1ccb05f..a90264e164a 100644 --- a/server/src/main/java/com/cloud/network/rules/NicPlugInOutRules.java +++ b/server/src/main/java/com/cloud/network/rules/NicPlugInOutRules.java @@ -29,6 +29,8 @@ import org.apache.log4j.Logger; import com.cloud.agent.api.Command; import com.cloud.agent.api.NetworkUsageCommand; import com.cloud.agent.manager.Commands; +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; @@ -53,6 +55,9 @@ import com.cloud.vm.NicVO; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.NicDao; +import org.apache.cloudstack.network.topology.NetworkTopology; +import org.apache.cloudstack.network.topology.NetworkTopologyContext; + public class NicPlugInOutRules extends RuleApplier { private static final Logger s_logger = Logger.getLogger(NicPlugInOutRules.class); @@ -77,6 +82,28 @@ public class NicPlugInOutRules extends RuleApplier { NetworkModel networkModel = visitor.getVirtualNetworkApplianceFactory().getNetworkModel(); VirtualMachineManager itMgr = visitor.getVirtualNetworkApplianceFactory().getItMgr(); + NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao(); + + // de-associate IPs before unplugging nics + if (!nicsToUnplug.isEmpty()) { + NetworkTopologyContext networkTopologyContext = visitor.getVirtualNetworkApplianceFactory().getNetworkTopologyContext(); + final DataCenterDao dcDao = visitor.getVirtualNetworkApplianceFactory().getDcDao(); + final DataCenterVO dcVO = dcDao.findById(router.getDataCenterId()); + final NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO); + + final String typeString = "vpc ip association before unplugging nics"; + final boolean isPodLevelException = false; + final boolean failWhenDisconnect = false; + final Long podId = null; + final VpcIpAssociationRules ipAssociationRules = new VpcIpAssociationRules(_network, _ipAddresses); + final boolean result = networkTopology.applyRules(_network, router, typeString, isPodLevelException, podId, failWhenDisconnect, + new RuleApplierWrapper(ipAssociationRules)); + if (!result) { + s_logger.warn("Failed to de-associate IPs before unplugging nics"); + return false; + } + } + // 1) Unplug the nics for (Entry entry : nicsToUnplug.entrySet()) { Network publicNtwk = null; diff --git a/server/src/main/java/com/cloud/network/rules/VirtualNetworkApplianceFactory.java b/server/src/main/java/com/cloud/network/rules/VirtualNetworkApplianceFactory.java index 34400ea02ab..b3edc3b736d 100644 --- a/server/src/main/java/com/cloud/network/rules/VirtualNetworkApplianceFactory.java +++ b/server/src/main/java/com/cloud/network/rules/VirtualNetworkApplianceFactory.java @@ -43,6 +43,8 @@ import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.NicIpAliasDao; import com.cloud.vm.dao.UserVmDao; +import org.apache.cloudstack.network.topology.NetworkTopologyContext; + public class VirtualNetworkApplianceFactory { @Inject @@ -91,6 +93,9 @@ public class VirtualNetworkApplianceFactory { @Inject private NicProfileHelper _nicProfileHelper; + @Inject + private NetworkTopologyContext _networkTopologyContext; + public NetworkModel getNetworkModel() { return _networkModel; } @@ -174,4 +179,8 @@ public class VirtualNetworkApplianceFactory { public NicProfileHelper getNicProfileHelper() { return _nicProfileHelper; } -} \ No newline at end of file + + public NetworkTopologyContext getNetworkTopologyContext() { + return _networkTopologyContext; + } +}