@@ -1268,26 +1268,38 @@ private PlugNicAnswer execute(PlugNicCommand cmd) {
12681268 s_logger .info ("Executing resource PlugNicCommand " + _gson .toJson (cmd ));
12691269 }
12701270
1271+ try {
1272+ VirtualEthernetCardType nicDeviceType = null ;
1273+ if (cmd .getDetails () != null ) {
1274+ nicDeviceType = VirtualEthernetCardType .valueOf (cmd .getDetails ().get ("nicAdapter" ));
1275+ }
1276+ plugNicCommandInternal (cmd .getVmName (), nicDeviceType , cmd .getNic (), cmd .getVMType ());
1277+ return new PlugNicAnswer (cmd , true , "success" );
1278+ } catch (Exception e ) {
1279+ s_logger .error ("Unexpected exception: " , e );
1280+ return new PlugNicAnswer (cmd , false , "Unable to execute PlugNicCommand due to " + e .toString ());
1281+ }
1282+ }
1283+
1284+ private void plugNicCommandInternal (String vmName , VirtualEthernetCardType nicDeviceType , NicTO nicTo , VirtualMachine .Type vmType ) throws Exception {
12711285 getServiceContext ().getStockObject (VmwareManager .CONTEXT_STOCK_NAME );
12721286 VmwareContext context = getServiceContext ();
1273- try {
1274- VmwareHypervisorHost hyperHost = getHyperHost (context );
1287+ VmwareHypervisorHost hyperHost = getHyperHost (context );
12751288
1276- String vmName = cmd .getVmName ();
1277- VirtualMachineMO vmMo = hyperHost .findVmOnHyperHost (vmName );
1289+ VirtualMachineMO vmMo = hyperHost .findVmOnHyperHost (vmName );
12781290
1279- if (vmMo == null ) {
1280- if (hyperHost instanceof HostMO ) {
1281- ClusterMO clusterMo = new ClusterMO (hyperHost .getContext (), ((HostMO ) hyperHost ).getParentMor ());
1282- vmMo = clusterMo .findVmOnHyperHost (vmName );
1283- }
1291+ if (vmMo == null ) {
1292+ if (hyperHost instanceof HostMO ) {
1293+ ClusterMO clusterMo = new ClusterMO (hyperHost .getContext (), ((HostMO ) hyperHost ).getParentMor ());
1294+ vmMo = clusterMo .findVmOnHyperHost (vmName );
12841295 }
1296+ }
12851297
1286- if (vmMo == null ) {
1287- String msg = "Router " + vmName + " no longer exists to execute PlugNic command" ;
1288- s_logger .error (msg );
1289- throw new Exception (msg );
1290- }
1298+ if (vmMo == null ) {
1299+ String msg = "Router " + vmName + " no longer exists to execute PlugNic command" ;
1300+ s_logger .error (msg );
1301+ throw new Exception (msg );
1302+ }
12911303
12921304 /*
12931305 if(!isVMWareToolsInstalled(vmMo)){
@@ -1296,54 +1308,45 @@ private PlugNicAnswer execute(PlugNicCommand cmd) {
12961308 return new PlugNicAnswer(cmd, false, "Unable to execute PlugNicCommand due to " + errMsg);
12971309 }
12981310 */
1299- // Fallback to E1000 if no specific nicAdapter is passed
1300- VirtualEthernetCardType nicDeviceType = VirtualEthernetCardType .E1000 ;
1301- Map <String , String > details = cmd .getDetails ();
1302- if (details != null ) {
1303- nicDeviceType = VirtualEthernetCardType .valueOf ((String ) details .get ("nicAdapter" ));
1304- }
1305-
1306- // find a usable device number in VMware environment
1307- VirtualDevice [] nicDevices = vmMo .getSortedNicDevices ();
1308- int deviceNumber = -1 ;
1309- for (VirtualDevice device : nicDevices ) {
1310- if (device .getUnitNumber () > deviceNumber )
1311- deviceNumber = device .getUnitNumber ();
1312- }
1313- deviceNumber ++;
1311+ // Fallback to E1000 if no specific nicAdapter is passed
1312+ if (nicDeviceType == null ) {
1313+ nicDeviceType = VirtualEthernetCardType .E1000 ;
1314+ }
13141315
1315- NicTO nicTo = cmd .getNic ();
1316- VirtualDevice nic ;
1317- Pair <ManagedObjectReference , String > networkInfo = prepareNetworkFromNicInfo (vmMo .getRunningHost (), nicTo , false , cmd .getVMType ());
1318- String dvSwitchUuid = null ;
1319- if (VmwareHelper .isDvPortGroup (networkInfo .first ())) {
1320- ManagedObjectReference dcMor = hyperHost .getHyperHostDatacenter ();
1321- DatacenterMO dataCenterMo = new DatacenterMO (context , dcMor );
1322- ManagedObjectReference dvsMor = dataCenterMo .getDvSwitchMor (networkInfo .first ());
1323- dvSwitchUuid = dataCenterMo .getDvSwitchUuid (dvsMor );
1324- s_logger .info ("Preparing NIC device on dvSwitch : " + dvSwitchUuid );
1325- nic = VmwareHelper .prepareDvNicDevice (vmMo , networkInfo .first (), nicDeviceType , networkInfo .second (), dvSwitchUuid ,
1326- nicTo .getMac (), deviceNumber + 1 , true , true );
1327- } else {
1328- s_logger .info ("Preparing NIC device on network " + networkInfo .second ());
1329- nic = VmwareHelper .prepareNicDevice (vmMo , networkInfo .first (), nicDeviceType , networkInfo .second (),
1330- nicTo .getMac (), deviceNumber + 1 , true , true );
1331- }
1316+ // find a usable device number in VMware environment
1317+ VirtualDevice [] nicDevices = vmMo .getSortedNicDevices ();
1318+ int deviceNumber = -1 ;
1319+ for (VirtualDevice device : nicDevices ) {
1320+ if (device .getUnitNumber () > deviceNumber )
1321+ deviceNumber = device .getUnitNumber ();
1322+ }
1323+ deviceNumber ++;
13321324
1333- VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ();
1334- VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1335- deviceConfigSpec .setDevice (nic );
1336- deviceConfigSpec .setOperation (VirtualDeviceConfigSpecOperation .ADD );
1325+ VirtualDevice nic ;
1326+ Pair <ManagedObjectReference , String > networkInfo = prepareNetworkFromNicInfo (vmMo .getRunningHost (), nicTo , false , vmType );
1327+ String dvSwitchUuid = null ;
1328+ if (VmwareHelper .isDvPortGroup (networkInfo .first ())) {
1329+ ManagedObjectReference dcMor = hyperHost .getHyperHostDatacenter ();
1330+ DatacenterMO dataCenterMo = new DatacenterMO (context , dcMor );
1331+ ManagedObjectReference dvsMor = dataCenterMo .getDvSwitchMor (networkInfo .first ());
1332+ dvSwitchUuid = dataCenterMo .getDvSwitchUuid (dvsMor );
1333+ s_logger .info ("Preparing NIC device on dvSwitch : " + dvSwitchUuid );
1334+ nic = VmwareHelper .prepareDvNicDevice (vmMo , networkInfo .first (), nicDeviceType , networkInfo .second (), dvSwitchUuid ,
1335+ nicTo .getMac (), deviceNumber + 1 , true , true );
1336+ } else {
1337+ s_logger .info ("Preparing NIC device on network " + networkInfo .second ());
1338+ nic = VmwareHelper .prepareNicDevice (vmMo , networkInfo .first (), nicDeviceType , networkInfo .second (),
1339+ nicTo .getMac (), deviceNumber + 1 , true , true );
1340+ }
13371341
1338- vmConfigSpec . getDeviceChange (). add ( deviceConfigSpec );
1339- if (! vmMo . configureVm ( vmConfigSpec )) {
1340- throw new Exception ( "Failed to configure devices when running PlugNicCommand" );
1341- }
1342+ VirtualMachineConfigSpec vmConfigSpec = new VirtualMachineConfigSpec ( );
1343+ VirtualDeviceConfigSpec deviceConfigSpec = new VirtualDeviceConfigSpec ();
1344+ deviceConfigSpec . setDevice ( nic );
1345+ deviceConfigSpec . setOperation ( VirtualDeviceConfigSpecOperation . ADD );
13421346
1343- return new PlugNicAnswer (cmd , true , "success" );
1344- } catch (Exception e ) {
1345- s_logger .error ("Unexpected exception: " , e );
1346- return new PlugNicAnswer (cmd , false , "Unable to execute PlugNicCommand due to " + e .toString ());
1347+ vmConfigSpec .getDeviceChange ().add (deviceConfigSpec );
1348+ if (!vmMo .configureVm (vmConfigSpec )) {
1349+ throw new Exception ("Failed to configure devices when running PlugNicCommand" );
13471350 }
13481351 }
13491352
@@ -1613,7 +1616,12 @@ private ExecutionResult prepareNetworkElementCommand(IpAssocCommand cmd) {
16131616 }
16141617
16151618 if (addVif ) {
1616- plugPublicNic (vmMo , vlanId , ip );
1619+ NicTO nicTO = ip .getNicTO ();
1620+ VirtualEthernetCardType nicDeviceType = null ;
1621+ if (ip .getDetails () != null ) {
1622+ nicDeviceType = VirtualEthernetCardType .valueOf (ip .getDetails ().get ("nicAdapter" ));
1623+ }
1624+ plugNicCommandInternal (routerName , nicDeviceType , nicTO , VirtualMachine .Type .DomainRouter );
16171625 publicNicInfo = vmMo .getNicDeviceIndex (publicNeworkName );
16181626 if (publicNicInfo .first ().intValue () >= 0 ) {
16191627 networkUsage (controlIp , "addVif" , "eth" + publicNicInfo .first ());
@@ -2313,39 +2321,6 @@ protected StartAnswer execute(StartCommand cmd) {
23132321 int nicMask = 0 ;
23142322 int nicCount = 0 ;
23152323
2316- if (vmSpec .getType () == VirtualMachine .Type .DomainRouter ) {
2317- int extraPublicNics = mgr .getRouterExtraPublicNics ();
2318- if (extraPublicNics > 0 && vmSpec .getDetails ().containsKey ("PeerRouterInstanceName" )) {
2319- //Set identical MAC address for RvR on extra public interfaces
2320- String peerRouterInstanceName = vmSpec .getDetails ().get ("PeerRouterInstanceName" );
2321-
2322- VirtualMachineMO peerVmMo = hyperHost .findVmOnHyperHost (peerRouterInstanceName );
2323- if (peerVmMo == null ) {
2324- peerVmMo = hyperHost .findVmOnPeerHyperHost (peerRouterInstanceName );
2325- }
2326-
2327- if (peerVmMo != null ) {
2328- String oldMacSequence = generateMacSequence (nics );
2329-
2330- for (int nicIndex = nics .length - extraPublicNics ; nicIndex < nics .length ; nicIndex ++) {
2331- VirtualDevice nicDevice = peerVmMo .getNicDeviceByIndex (nics [nicIndex ].getDeviceId ());
2332- if (nicDevice != null ) {
2333- String mac = ((VirtualEthernetCard ) nicDevice ).getMacAddress ();
2334- if (mac != null ) {
2335- s_logger .info ("Use same MAC as previous RvR, the MAC is " + mac + " for extra NIC with device id: " + nics [nicIndex ].getDeviceId ());
2336- nics [nicIndex ].setMac (mac );
2337- }
2338- }
2339- }
2340-
2341- if (!StringUtils .isBlank (vmSpec .getBootArgs ())) {
2342- String newMacSequence = generateMacSequence (nics );
2343- vmSpec .setBootArgs (replaceNicsMacSequenceInBootArgs (oldMacSequence , newMacSequence , vmSpec ));
2344- }
2345- }
2346- }
2347- }
2348-
23492324 VirtualEthernetCardType nicDeviceType ;
23502325
23512326 NiciraNvpApiVersion .logNiciraApiVersion ();
0 commit comments