Skip to content

Commit a03e88e

Browse files
committed
[VMware] Support for removal of NIC on IP disassociation on the VR + address comments + extract common code + rebase to 4.16
1 parent 8db598b commit a03e88e

1 file changed

Lines changed: 81 additions & 48 deletions

File tree

  • plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource

plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java

Lines changed: 81 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)