@@ -1101,6 +1101,9 @@ public ExecutionResult prepareCommand(NetworkElementCommand cmd) {
11011101
11021102 @ Override
11031103 public ExecutionResult cleanupCommand (NetworkElementCommand cmd ) {
1104+ if (cmd instanceof IpAssocCommand && !(cmd instanceof IpAssocVpcCommand )) {
1105+ return cleanupNetworkElementCommand ((IpAssocCommand )cmd );
1106+ }
11041107 return new ExecutionResult (true , null );
11051108 }
11061109
@@ -1326,15 +1329,7 @@ private void plugNicCommandInternal(String vmName, VirtualEthernetCardType nicDe
13261329 nicTo .getMac (), deviceNumber + 1 , true , true );
13271330 }
13281331
1329- VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1330- VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1331- deviceConfigSpec .setDevice (nic );
1332- deviceConfigSpec .setOperation (VirtualDeviceConfigSpecOperation .ADD );
1333-
1334- vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1335- if (!vmMo .configureVm (vmConfigSpec )) {
1336- throw new Exception ("Failed to configure devices when running PlugNicCommand" );
1337- }
1332+ configureNicDevice (vmMo , nic , VirtualDeviceConfigSpecOperation .ADD );
13381333 }
13391334
13401335 private ReplugNicAnswer execute (ReplugNicCommand cmd ) {
@@ -1395,16 +1390,7 @@ private ReplugNicAnswer execute(ReplugNicCommand cmd) {
13951390 VmwareHelper .updateNicDevice (nic , networkInfo .first (), networkInfo .second ());
13961391 }
13971392
1398- VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1399- //VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[1];
1400- VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1401- deviceConfigSpec .setDevice (nic );
1402- deviceConfigSpec .setOperation (VirtualDeviceConfigSpecOperation .EDIT );
1403-
1404- vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1405- if (!vmMo .configureVm (vmConfigSpec )) {
1406- throw new Exception ("Failed to configure devices when running ReplugNicCommand" );
1407- }
1393+ configureNicDevice (vmMo , nic , VirtualDeviceConfigSpecOperation .EDIT );
14081394
14091395 return new ReplugNicAnswer (cmd , true , "success" );
14101396 } catch (Exception e ) {
@@ -1445,16 +1431,7 @@ private UnPlugNicAnswer execute(UnPlugNicCommand cmd) {
14451431 if (nic == null ) {
14461432 return new UnPlugNicAnswer (cmd , true , "success" );
14471433 }
1448- VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1449- //VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[1];
1450- VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1451- deviceConfigSpec .setDevice (nic );
1452- deviceConfigSpec .setOperation (VirtualDeviceConfigSpecOperation .REMOVE );
1453-
1454- vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1455- if (!vmMo .configureVm (vmConfigSpec )) {
1456- throw new Exception ("Failed to configure devices when running unplugNicCommand" );
1457- }
1434+ configureNicDevice (vmMo , nic , VirtualDeviceConfigSpecOperation .REMOVE );
14581435
14591436 return new UnPlugNicAnswer (cmd , true , "success" );
14601437 } catch (Exception e ) {
@@ -1501,17 +1478,7 @@ private void plugPublicNic(VirtualMachineMO vmMo, final String vlanId, final IpA
15011478 device .setBacking (dataCenterMo .getDvPortBackingInfo (networkInfo ));
15021479 }
15031480
1504- VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1505-
1506- //VirtualDeviceConfigSpec[] deviceConfigSpecArray = new VirtualDeviceConfigSpec[1];
1507- VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1508- deviceConfigSpec .setDevice (device );
1509- deviceConfigSpec .setOperation (VirtualDeviceConfigSpecOperation .EDIT );
1510-
1511- vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1512- if (!vmMo .configureVm (vmConfigSpec )) {
1513- throw new Exception ("Failed to configure devices when plugPublicNic" );
1514- }
1481+ configureNicDevice (vmMo , device , VirtualDeviceConfigSpecOperation .EDIT );
15151482 } catch (Exception e ) {
15161483
15171484 // restore allocation mask in case of exceptions
@@ -1579,15 +1546,15 @@ private ExecutionResult prepareNetworkElementCommand(IpAssocCommand cmd) {
15791546 }
15801547 String vlanId = BroadcastDomainType .getValue (broadcastUri );
15811548
1582- String publicNeworkName = HypervisorHostHelper .getPublicNetworkNamePrefix (vlanId );
1583- Pair <Integer , VirtualDevice > publicNicInfo = vmMo .getNicDeviceIndex (publicNeworkName );
1549+ String publicNetworkName = HypervisorHostHelper .getPublicNetworkNamePrefix (vlanId );
1550+ Pair <Integer , VirtualDevice > publicNicInfo = vmMo .getNicDeviceIndex (publicNetworkName );
15841551
15851552 if (s_logger .isDebugEnabled ()) {
1586- s_logger .debug ("Find public NIC index, public network name: " + publicNeworkName + ", index: " + publicNicInfo .first ());
1553+ s_logger .debug ("Find public NIC index, public network name: " + publicNetworkName + ", index: " + publicNicInfo .first ());
15871554 }
15881555
15891556 boolean addVif = false ;
1590- if (ip .isAdd () && publicNicInfo .first (). intValue () == -1 ) {
1557+ if (ip .isAdd () && publicNicInfo .first () == -1 ) {
15911558 if (s_logger .isDebugEnabled ()) {
15921559 s_logger .debug ("Plug new NIC to associate" + controlIp + " to " + ip .getPublicIp ());
15931560 }
@@ -1601,18 +1568,18 @@ private ExecutionResult prepareNetworkElementCommand(IpAssocCommand cmd) {
16011568 nicDeviceType = VirtualEthernetCardType .valueOf (ip .getDetails ().get ("nicAdapter" ));
16021569 }
16031570 plugNicCommandInternal (routerName , nicDeviceType , nicTO , VirtualMachine .Type .DomainRouter );
1604- publicNicInfo = vmMo .getNicDeviceIndex (publicNeworkName );
1605- if (publicNicInfo .first (). intValue () >= 0 ) {
1571+ publicNicInfo = vmMo .getNicDeviceIndex (publicNetworkName );
1572+ if (publicNicInfo .first () >= 0 ) {
16061573 networkUsage (controlIp , "addVif" , "eth" + publicNicInfo .first ());
16071574 }
16081575 }
16091576
1610- if (publicNicInfo .first (). intValue () < 0 ) {
1577+ if (publicNicInfo .first () < 0 ) {
16111578 String msg = "Failed to find DomR VIF to associate/disassociate IP with." ;
16121579 s_logger .error (msg );
16131580 throw new InternalErrorException (msg );
16141581 }
1615- ip .setNicDevId (publicNicInfo .first (). intValue () );
1582+ ip .setNicDevId (publicNicInfo .first ());
16161583 ip .setNewNic (addVif );
16171584 }
16181585 } catch (Throwable e ) {
@@ -1622,6 +1589,72 @@ private ExecutionResult prepareNetworkElementCommand(IpAssocCommand cmd) {
16221589 return new ExecutionResult (true , null );
16231590 }
16241591
1592+ private ExecutionResult cleanupNetworkElementCommand (IpAssocCommand cmd ) {
1593+ VmwareContext context = getServiceContext ();
1594+ try {
1595+ VmwareHypervisorHost hyperHost = getHyperHost (context );
1596+ IpAddressTO [] ips = cmd .getIpAddresses ();
1597+ String routerName = cmd .getAccessDetail (NetworkElementCommand .ROUTER_NAME );
1598+
1599+ VirtualMachineMO vmMo = hyperHost .findVmOnHyperHost (routerName );
1600+ // command may sometimes be redirect to a wrong host, we relax
1601+ // the check and will try to find it within cluster
1602+ if (vmMo == null ) {
1603+ if (hyperHost instanceof HostMO ) {
1604+ final DatacenterMO dcMo = new DatacenterMO (context , hyperHost .getHyperHostDatacenter ());
1605+ vmMo = dcMo .findVm (routerName );
1606+ }
1607+ }
1608+
1609+ if (vmMo == null ) {
1610+ String msg = String .format ("Router %s no longer exists to execute IPAssoc command " , routerName );
1611+ s_logger .error (msg );
1612+ throw new Exception (msg );
1613+ }
1614+
1615+ if (ips .length == 1 && !ips [0 ].isAdd ()) {
1616+ IpAddressTO ip = ips [0 ];
1617+ NicTO nicTO = ip .getNicTO ();
1618+ URI broadcastUri = BroadcastDomainType .fromString (ip .getBroadcastUri ());
1619+ if (BroadcastDomainType .getSchemeValue (broadcastUri ) != BroadcastDomainType .Vlan ) {
1620+ throw new InternalErrorException (String .format ("Unable to assign a public IP to a VIF on network %s" , ip .getBroadcastUri ()));
1621+ }
1622+ String vlanId = BroadcastDomainType .getValue (broadcastUri );
1623+
1624+ String publicNetworkName = HypervisorHostHelper .getPublicNetworkNamePrefix (vlanId );
1625+ Pair <Integer , VirtualDevice > publicNicInfo = vmMo .getNicDeviceIndex (publicNetworkName );
1626+
1627+ if (s_logger .isDebugEnabled ()) {
1628+ s_logger .debug (String .format ("Find public NIC index, public network name: %s , index: %s" , publicNetworkName , publicNicInfo .first ()));
1629+ }
1630+
1631+ VirtualDevice nic = findVirtualNicDevice (vmMo , nicTO .getMac ());
1632+
1633+ if (nic == null ) {
1634+ return new ExecutionResult (false , "Couldn't find NIC" );
1635+ }
1636+ configureNicDevice (vmMo , nic , VirtualDeviceConfigSpecOperation .REMOVE );
1637+ }
1638+ } catch (Throwable e ) {
1639+ s_logger .error ("Unexpected exception: " + e .toString () + " will shortcut rest of IPAssoc commands" , e );
1640+ return new ExecutionResult (false , e .toString ());
1641+ }
1642+ return new ExecutionResult (true , null );
1643+ }
1644+
1645+ private void configureNicDevice (VirtualMachineMO vmMo , VirtualDevice nic , VirtualDeviceConfigSpecOperation operation ) throws Exception {
1646+ VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1647+ VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1648+ deviceConfigSpec .setDevice (nic );
1649+ deviceConfigSpec .setOperation (operation );
1650+
1651+
1652+ vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1653+ if (!vmMo .configureVm (vmConfigSpec )) {
1654+ throw new Exception ("Failed to configure devices when running unplugNicCommand" );
1655+ }
1656+ }
1657+
16251658 @ Override
16261659 public ExecutionResult executeInVR (String routerIP , String script , String args ) {
16271660 return executeInVR (routerIP , script , args , VRScripts .VR_SCRIPT_EXEC_TIMEOUT );
0 commit comments