@@ -1114,6 +1114,9 @@ public ExecutionResult prepareCommand(NetworkElementCommand cmd) {
11141114
11151115 @ Override
11161116 public ExecutionResult cleanupCommand (NetworkElementCommand cmd ) {
1117+ if (cmd instanceof IpAssocCommand && !(cmd instanceof IpAssocVpcCommand )) {
1118+ return cleanupNetworkElementCommand ((IpAssocCommand )cmd );
1119+ }
11171120 return new ExecutionResult (true , null );
11181121 }
11191122
@@ -1339,15 +1342,7 @@ private void plugNicCommandInternal(String vmName, VirtualEthernetCardType nicDe
13391342 nicTo .getMac (), deviceNumber + 1 , true , true );
13401343 }
13411344
1342- VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1343- VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1344- deviceConfigSpec .setDevice (nic );
1345- deviceConfigSpec .setOperation (VirtualDeviceConfigSpecOperation .ADD );
1346-
1347- vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1348- if (!vmMo .configureVm (vmConfigSpec )) {
1349- throw new Exception ("Failed to configure devices when running PlugNicCommand" );
1350- }
1345+ configureNicDevice (vmMo , nic , VirtualDeviceConfigSpecOperation .ADD );
13511346 }
13521347
13531348 private ReplugNicAnswer execute (ReplugNicCommand cmd ) {
@@ -1412,16 +1407,7 @@ private ReplugNicAnswer execute(ReplugNicCommand cmd) {
14121407 VmwareHelper .updateNicDevice (nic , networkInfo .first (), networkInfo .second ());
14131408 }
14141409
1415- VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1416- //VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[1];
1417- VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1418- deviceConfigSpec .setDevice (nic );
1419- deviceConfigSpec .setOperation (VirtualDeviceConfigSpecOperation .EDIT );
1420-
1421- vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1422- if (!vmMo .configureVm (vmConfigSpec )) {
1423- throw new Exception ("Failed to configure devices when running ReplugNicCommand" );
1424- }
1410+ configureNicDevice (vmMo , nic , VirtualDeviceConfigSpecOperation .EDIT );
14251411
14261412 return new ReplugNicAnswer (cmd , true , "success" );
14271413 } catch (Exception e ) {
@@ -1466,16 +1452,7 @@ private UnPlugNicAnswer execute(UnPlugNicCommand cmd) {
14661452 if (nic == null ) {
14671453 return new UnPlugNicAnswer (cmd , true , "success" );
14681454 }
1469- VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1470- //VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[1];
1471- VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1472- deviceConfigSpec .setDevice (nic );
1473- deviceConfigSpec .setOperation (VirtualDeviceConfigSpecOperation .REMOVE );
1474-
1475- vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1476- if (!vmMo .configureVm (vmConfigSpec )) {
1477- throw new Exception ("Failed to configure devices when running unplugNicCommand" );
1478- }
1455+ configureNicDevice (vmMo , nic , VirtualDeviceConfigSpecOperation .REMOVE );
14791456
14801457 return new UnPlugNicAnswer (cmd , true , "success" );
14811458 } catch (Exception e ) {
@@ -1522,17 +1499,7 @@ private void plugPublicNic(VirtualMachineMO vmMo, final String vlanId, final IpA
15221499 device .setBacking (dataCenterMo .getDvPortBackingInfo (networkInfo ));
15231500 }
15241501
1525- VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1526-
1527- //VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[1];
1528- VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1529- deviceConfigSpec .setDevice (device );
1530- deviceConfigSpec .setOperation (VirtualDeviceConfigSpecOperation .EDIT );
1531-
1532- vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1533- if (!vmMo .configureVm (vmConfigSpec )) {
1534- throw new Exception ("Failed to configure devices when plugPublicNic" );
1535- }
1502+ configureNicDevice (vmMo , device , VirtualDeviceConfigSpecOperation .EDIT );
15361503 } catch (Exception e ) {
15371504
15381505 // restore allocation mask in case of exceptions
@@ -1600,15 +1567,15 @@ private ExecutionResult prepareNetworkElementCommand(IpAssocCommand cmd) {
16001567 }
16011568 String vlanId = BroadcastDomainType .getValue (broadcastUri );
16021569
1603- String publicNeworkName = HypervisorHostHelper .getPublicNetworkNamePrefix (vlanId );
1604- Pair <Integer , VirtualDevice > publicNicInfo = vmMo .getNicDeviceIndex (publicNeworkName );
1570+ String publicNetworkName = HypervisorHostHelper .getPublicNetworkNamePrefix (vlanId );
1571+ Pair <Integer , VirtualDevice > publicNicInfo = vmMo .getNicDeviceIndex (publicNetworkName );
16051572
16061573 if (s_logger .isDebugEnabled ()) {
1607- s_logger .debug ("Find public NIC index, public network name: " + publicNeworkName + ", index: " + publicNicInfo .first ());
1574+ s_logger .debug ("Find public NIC index, public network name: " + publicNetworkName + ", index: " + publicNicInfo .first ());
16081575 }
16091576
16101577 boolean addVif = false ;
1611- if (ip .isAdd () && publicNicInfo .first (). intValue () == -1 ) {
1578+ if (ip .isAdd () && publicNicInfo .first () == -1 ) {
16121579 if (s_logger .isDebugEnabled ()) {
16131580 s_logger .debug ("Plug new NIC to associate" + controlIp + " to " + ip .getPublicIp ());
16141581 }
@@ -1622,18 +1589,18 @@ private ExecutionResult prepareNetworkElementCommand(IpAssocCommand cmd) {
16221589 nicDeviceType = VirtualEthernetCardType .valueOf (ip .getDetails ().get ("nicAdapter" ));
16231590 }
16241591 plugNicCommandInternal (routerName , nicDeviceType , nicTO , VirtualMachine .Type .DomainRouter );
1625- publicNicInfo = vmMo .getNicDeviceIndex (publicNeworkName );
1626- if (publicNicInfo .first (). intValue () >= 0 ) {
1592+ publicNicInfo = vmMo .getNicDeviceIndex (publicNetworkName );
1593+ if (publicNicInfo .first () >= 0 ) {
16271594 networkUsage (controlIp , "addVif" , "eth" + publicNicInfo .first ());
16281595 }
16291596 }
16301597
1631- if (publicNicInfo .first (). intValue () < 0 ) {
1598+ if (publicNicInfo .first () < 0 ) {
16321599 String msg = "Failed to find DomR VIF to associate/disassociate IP with." ;
16331600 s_logger .error (msg );
16341601 throw new InternalErrorException (msg );
16351602 }
1636- ip .setNicDevId (publicNicInfo .first (). intValue () );
1603+ ip .setNicDevId (publicNicInfo .first ());
16371604 ip .setNewNic (addVif );
16381605 }
16391606 } catch (Throwable e ) {
@@ -1643,6 +1610,72 @@ private ExecutionResult prepareNetworkElementCommand(IpAssocCommand cmd) {
16431610 return new ExecutionResult (true , null );
16441611 }
16451612
1613+ private ExecutionResult cleanupNetworkElementCommand (IpAssocCommand cmd ) {
1614+ VmwareContext context = getServiceContext ();
1615+ try {
1616+ VmwareHypervisorHost hyperHost = getHyperHost (context );
1617+ IpAddressTO [] ips = cmd .getIpAddresses ();
1618+ String routerName = cmd .getAccessDetail (NetworkElementCommand .ROUTER_NAME );
1619+
1620+ VirtualMachineMO vmMo = hyperHost .findVmOnHyperHost (routerName );
1621+ // command may sometimes be redirect to a wrong host, we relax
1622+ // the check and will try to find it within cluster
1623+ if (vmMo == null ) {
1624+ if (hyperHost instanceof HostMO ) {
1625+ final DatacenterMO dcMo = new DatacenterMO (context , hyperHost .getHyperHostDatacenter ());
1626+ vmMo = dcMo .findVm (routerName );
1627+ }
1628+ }
1629+
1630+ if (vmMo == null ) {
1631+ String msg = String .format ("Router %s no longer exists to execute IPAssoc command " , routerName );
1632+ s_logger .error (msg );
1633+ throw new Exception (msg );
1634+ }
1635+
1636+ if (ips .length == 1 && !ips [0 ].isAdd ()) {
1637+ IpAddressTO ip = ips [0 ];
1638+ NicTO nicTO = ip .getNicTO ();
1639+ URI broadcastUri = BroadcastDomainType .fromString (ip .getBroadcastUri ());
1640+ if (BroadcastDomainType .getSchemeValue (broadcastUri ) != BroadcastDomainType .Vlan ) {
1641+ throw new InternalErrorException (String .format ("Unable to assign a public IP to a VIF on network %s" , ip .getBroadcastUri ()));
1642+ }
1643+ String vlanId = BroadcastDomainType .getValue (broadcastUri );
1644+
1645+ String publicNetworkName = HypervisorHostHelper .getPublicNetworkNamePrefix (vlanId );
1646+ Pair <Integer , VirtualDevice > publicNicInfo = vmMo .getNicDeviceIndex (publicNetworkName );
1647+
1648+ if (s_logger .isDebugEnabled ()) {
1649+ s_logger .debug (String .format ("Find public NIC index, public network name: %s , index: %s" , publicNetworkName , publicNicInfo .first ()));
1650+ }
1651+
1652+ VirtualDevice nic = findVirtualNicDevice (vmMo , nicTO .getMac ());
1653+
1654+ if (nic == null ) {
1655+ return new ExecutionResult (false , "Couldn't find NIC" );
1656+ }
1657+ configureNicDevice (vmMo , nic , VirtualDeviceConfigSpecOperation .REMOVE );
1658+ }
1659+ } catch (Throwable e ) {
1660+ s_logger .error ("Unexpected exception: " + e .toString () + " will shortcut rest of IPAssoc commands" , e );
1661+ return new ExecutionResult (false , e .toString ());
1662+ }
1663+ return new ExecutionResult (true , null );
1664+ }
1665+
1666+ private void configureNicDevice (VirtualMachineMO vmMo , VirtualDevice nic , VirtualDeviceConfigSpecOperation operation ) throws Exception {
1667+ VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1668+ VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1669+ deviceConfigSpec .setDevice (nic );
1670+ deviceConfigSpec .setOperation (operation );
1671+
1672+
1673+ vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1674+ if (!vmMo .configureVm (vmConfigSpec )) {
1675+ throw new Exception ("Failed to configure devices when running unplugNicCommand" );
1676+ }
1677+ }
1678+
16461679 @ Override
16471680 public ExecutionResult executeInVR (String routerIP , String script , String args ) {
16481681 return executeInVR (routerIP , script , args , VRScripts .VR_SCRIPT_EXEC_TIMEOUT );
0 commit comments