Skip to content

Commit e0a3f40

Browse files
Cleanup unused network port groups on all the hosts.
1 parent 69fed99 commit e0a3f40

4 files changed

Lines changed: 56 additions & 14 deletions

File tree

plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/manager/VmwareManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public interface VmwareManager {
4747
"Vmware script timeout for ova packaging process", true, ConfigKey.Scope.Global, 1000);
4848

4949
static final ConfigKey<Boolean> s_vmwareCleanupPortGroups = new ConfigKey<Boolean>("Advanced", Boolean.class, "vmware.cleanup.port.groups", "false",
50-
"Remove unused port groups. WARNING: When set to true, native VMware HA might not work.", true, ConfigKey.Scope.Global);
50+
"When set to true, the unused port groups are removed from VMware hypervisor hosts. WARNING: Native VMware HA might not work when enabled.", true, ConfigKey.Scope.Global);
5151

5252
String composeWorkerName();
5353

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

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5823,27 +5823,54 @@ protected Answer execute(UnregisterNicCommand cmd) {
58235823
}
58245824
}
58255825

5826-
public void cleanupNetwork(HostMO hostMo, NetworkDetails netDetails) {
5826+
public void cleanupNetwork(DatacenterMO dcMO, NetworkDetails netDetails) {
58275827
if (!VmwareManager.s_vmwareCleanupPortGroups.value()){
58285828
return;
58295829
}
5830+
58305831
try {
58315832
synchronized(this) {
5832-
if (netDetails.getName() == null) {
5833-
throw new CloudRuntimeException("Unspecified port group name, unable to cleanup network");
5833+
if (!areVMsOnNetwork(dcMO, netDetails)) {
5834+
cleanupPortGroup(dcMO, netDetails.getName());
58345835
}
5835-
NetworkMO networkMo = new NetworkMO(hostMo.getContext(), netDetails.getNetworkMor());
5836+
}
5837+
} catch(Throwable e) {
5838+
s_logger.warn("Unable to cleanup network due to exception: " + e.getMessage(), e);
5839+
}
5840+
}
5841+
5842+
private void cleanupPortGroup(DatacenterMO dcMO, String portGroupName) throws Exception {
5843+
if (StringUtils.isBlank(portGroupName)) {
5844+
s_logger.debug("Unspecified network port group, couldn't cleanup");
5845+
return;
5846+
}
5847+
5848+
List<HostMO> hosts = dcMO.getAllHostsOnDatacenter();
5849+
if (!CollectionUtils.isEmpty(hosts)) {
5850+
for (HostMO host : hosts) {
5851+
host.deletePortGroup(portGroupName);
5852+
}
5853+
}
5854+
}
5855+
5856+
private boolean areVMsOnNetwork(DatacenterMO dcMO, NetworkDetails netDetails) throws Exception {
5857+
if (netDetails == null || netDetails.getName() == null) {
5858+
throw new CloudRuntimeException("Unspecified network details / port group, couldn't check VMs on network port group");
5859+
}
5860+
5861+
List<HostMO> hosts = dcMO.getAllHostsOnDatacenter();
5862+
if (!CollectionUtils.isEmpty(hosts)) {
5863+
for (HostMO host : hosts) {
5864+
NetworkMO networkMo = new NetworkMO(host.getContext(), netDetails.getNetworkMor());
58365865
List<ManagedObjectReference> vms = networkMo.getVMsOnNetwork();
5837-
if (CollectionUtils.isEmpty(vms)) {
5838-
if(s_logger.isInfoEnabled()) {
5839-
s_logger.info("Cleanup network as it is currently not in use: " + netDetails.getName());
5840-
}
5841-
hostMo.deletePortGroup(netDetails.getName());
5866+
if (!CollectionUtils.isEmpty(vms)) {
5867+
s_logger.debug("Network port group: " + netDetails.getName() + " is in use");
5868+
return true;
58425869
}
58435870
}
5844-
} catch(Throwable e) {
5845-
s_logger.warn("Unable to cleanup network due to exception: " + e.getMessage());
58465871
}
5872+
5873+
return false;
58475874
}
58485875

58495876
@Override

plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2650,6 +2650,8 @@ public Answer deleteVolume(DeleteCommand cmd) {
26502650
DatastoreMO dsMo = new DatastoreMO(context, morDs);
26512651

26522652
ManagedObjectReference morDc = hyperHost.getHyperHostDatacenter();
2653+
DatacenterMO dcMo = new DatacenterMO(context, morDc);
2654+
26532655
ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
26542656
ClusterMO clusterMo = new ClusterMO(context, morCluster);
26552657

@@ -2660,7 +2662,6 @@ public Answer deleteVolume(DeleteCommand cmd) {
26602662
VirtualMachineMO vmMo = clusterMo.findVmOnHyperHost(vmName);
26612663
if (vmMo == null) {
26622664
// Volume might be on a zone-wide storage pool, look for VM in datacenter
2663-
DatacenterMO dcMo = new DatacenterMO(context, morDc);
26642665
vmMo = dcMo.findVm(vmName);
26652666
}
26662667

@@ -2715,7 +2716,7 @@ public Answer deleteVolume(DeleteCommand cmd) {
27152716
for (NetworkDetails netDetails : networks) {
27162717
if (netDetails.getGCTag() != null && netDetails.getGCTag().equalsIgnoreCase("true")) {
27172718
if (netDetails.getVMMorsOnNetwork() == null || netDetails.getVMMorsOnNetwork().length == 1) {
2718-
resource.cleanupNetwork(hostMo, netDetails);
2719+
resource.cleanupNetwork(dcMo, netDetails);
27192720
}
27202721
}
27212722
}

vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatacenterMO.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Arrays;
2222
import java.util.List;
2323

24+
import org.apache.commons.collections.CollectionUtils;
2425
import org.apache.log4j.Logger;
2526

2627
import com.vmware.vim25.CustomFieldStringValue;
@@ -172,6 +173,19 @@ public List<Pair<ManagedObjectReference, String>> getAllVmsOnDatacenter() throws
172173
return vms;
173174
}
174175

176+
public List<HostMO> getAllHostsOnDatacenter() throws Exception {
177+
List<HostMO> hosts = new ArrayList<>();
178+
179+
List<ObjectContent> ocs = getHostPropertiesOnDatacenterHostFolder(new String[] {"name"});
180+
if (CollectionUtils.isNotEmpty(ocs)) {
181+
for (ObjectContent oc : ocs) {
182+
hosts.add(new HostMO(getContext(), oc.getObj()));
183+
}
184+
}
185+
186+
return hosts;
187+
}
188+
175189
public ManagedObjectReference findDatastore(String name) throws Exception {
176190
assert (name != null);
177191

0 commit comments

Comments
 (0)