2929import com .cloud .agent .api .Command ;
3030import com .cloud .agent .api .NetworkUsageCommand ;
3131import com .cloud .agent .manager .Commands ;
32+ import com .cloud .dc .DataCenterVO ;
33+ import com .cloud .dc .dao .DataCenterDao ;
3234import com .cloud .exception .ConcurrentOperationException ;
3335import com .cloud .exception .InsufficientCapacityException ;
3436import com .cloud .exception .ResourceUnavailableException ;
5355import com .cloud .vm .VirtualMachineManager ;
5456import com .cloud .vm .dao .NicDao ;
5557
58+ import org .apache .cloudstack .network .topology .NetworkTopology ;
59+ import org .apache .cloudstack .network .topology .NetworkTopologyContext ;
60+
5661public class NicPlugInOutRules extends RuleApplier {
5762
5863 private static final Logger s_logger = Logger .getLogger (NicPlugInOutRules .class );
@@ -77,6 +82,28 @@ public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter
7782
7883 NetworkModel networkModel = visitor .getVirtualNetworkApplianceFactory ().getNetworkModel ();
7984 VirtualMachineManager itMgr = visitor .getVirtualNetworkApplianceFactory ().getItMgr ();
85+ NicDao nicDao = visitor .getVirtualNetworkApplianceFactory ().getNicDao ();
86+
87+ // de-associate IPs before unplugging nics
88+ if (!nicsToUnplug .isEmpty ()) {
89+ NetworkTopologyContext networkTopologyContext = visitor .getVirtualNetworkApplianceFactory ().getNetworkTopologyContext ();
90+ final DataCenterDao dcDao = visitor .getVirtualNetworkApplianceFactory ().getDcDao ();
91+ final DataCenterVO dcVO = dcDao .findById (router .getDataCenterId ());
92+ final NetworkTopology networkTopology = networkTopologyContext .retrieveNetworkTopology (dcVO );
93+
94+ final String typeString = "vpc ip association before unplugging nics" ;
95+ final boolean isPodLevelException = false ;
96+ final boolean failWhenDisconnect = false ;
97+ final Long podId = null ;
98+ final VpcIpAssociationRules ipAssociationRules = new VpcIpAssociationRules (_network , _ipAddresses );
99+ final boolean result = networkTopology .applyRules (_network , router , typeString , isPodLevelException , podId , failWhenDisconnect ,
100+ new RuleApplierWrapper <RuleApplier >(ipAssociationRules ));
101+ if (!result ) {
102+ s_logger .warn ("Failed to de-associate IPs before unplugging nics" );
103+ return false ;
104+ }
105+ }
106+
80107 // 1) Unplug the nics
81108 for (Entry <String , PublicIpAddress > entry : nicsToUnplug .entrySet ()) {
82109 Network publicNtwk = null ;
0 commit comments