Skip to content

Commit 6632809

Browse files
Added support to remove CloudStack metadata (zone, pod, cluster, host details) from Libvirt XML for KVM VMs after an unmanage operation, controlled by the global config vm.unmanage.libvirt.metadata.cleanup [default: true]
1 parent 8171d95 commit 6632809

File tree

7 files changed

+29
-2
lines changed

7 files changed

+29
-2
lines changed

api/src/main/java/com/cloud/agent/api/to/VirtualMachineTO.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public class VirtualMachineTO {
9090
private String metadataManufacturer;
9191
private String metadataProductName;
9292
private VirtualMachineMetadataTO metadata;
93+
private boolean excludeMetadata;
9394

9495
public VirtualMachineTO(long id, String instanceName, VirtualMachine.Type type, int cpus, Integer speed, long minRam, long maxRam, BootloaderType bootloader,
9596
String os, boolean enableHA, boolean limitCpuUse, String vncPassword) {
@@ -503,6 +504,10 @@ public void setMetadata(VirtualMachineMetadataTO metadata) {
503504
this.metadata = metadata;
504505
}
505506

507+
public boolean isExcludeMetadata() { return excludeMetadata; }
508+
509+
public void setExcludeMetadata(boolean excludeMetadata) { this.excludeMetadata = excludeMetadata;}
510+
506511
@Override
507512
public String toString() {
508513
return String.format("VM {id: \"%s\", name: \"%s\", uuid: \"%s\", type: \"%s\"}", id, name, uuid, type);

api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ public interface UnmanagedVMsManager extends VmImportService, UnmanageVMService,
6969
true,
7070
ConfigKey.Scope.Global,
7171
null);
72+
ConfigKey<Boolean> VmUnmanageLibvirtMetadataCleanup = new ConfigKey<>(Boolean.class,
73+
"vm.unmanage.libvirt.metadata.cleanup",
74+
"Advanced",
75+
"true",
76+
"Specifies whether metadata should be cleaned up when a VM is unmanaged, applicable to the KVM hypervisor.",
77+
true,
78+
ConfigKey.Scope.Global,
79+
null);
7280

7381
static boolean isSupported(Hypervisor.HypervisorType hypervisorType) {
7482
return hypervisorType == VMware || hypervisorType == KVM;

core/src/main/java/com/cloud/agent/api/UnmanageInstanceCommand.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class UnmanageInstanceCommand extends Command {
2828
boolean executeInSequence = false;
2929
VirtualMachineTO vm;
3030
boolean isConfigDriveAttached;
31+
boolean isLibvirtMetadataCleanUpEnabled;
3132

3233
@Override
3334
public boolean executeInSequence() {
@@ -58,4 +59,10 @@ public boolean isConfigDriveAttached() {
5859
public void setConfigDriveAttached(boolean configDriveAttached) {
5960
isConfigDriveAttached = configDriveAttached;
6061
}
62+
63+
public boolean isLibvirtMetadataCleanupEnabled() {return isLibvirtMetadataCleanUpEnabled;}
64+
65+
public void setLibvirtMetadataCleanup(boolean libvirtMetadataCleanUp) {
66+
isLibvirtMetadataCleanUpEnabled = libvirtMetadataCleanUp;
67+
}
6168
}

engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,6 +2091,8 @@ Long persistDomainForKVM(VMInstanceVO vm, Long paramHostId) {
20912091
unmanageInstanceCommand = new UnmanageInstanceCommand(vmName);
20922092
unmanageInstanceCommand.setConfigDriveAttached(vmInstanceDetailsDao.findDetail(vm.getId(), VmDetailConstants.CONFIG_DRIVE_LOCATION) != null);
20932093
}
2094+
boolean isEnabled = UnmanagedVMsManager.VmUnmanageLibvirtMetadataCleanup.value();
2095+
unmanageInstanceCommand.setLibvirtMetadataCleanup(isEnabled);
20942096

20952097
logger.debug("Selected host ID: {} to persist domain XML for Instance: {}.", agentHostId, vmName);
20962098
try {

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3014,7 +3014,8 @@ private void configureVM(VirtualMachineTO vmTO, LibvirtVMDef vm, Map<String, Str
30143014
vm.addComp(createDevicesDef(vmTO, guest, vcpus, isUefiEnabled));
30153015

30163016
MetadataDef metaDef;
3017-
if ((metaDef = createMetadataDef(vmTO)) != null) {
3017+
boolean excludeMetadata = vmTO.isExcludeMetadata();
3018+
if (!excludeMetadata && (metaDef = createMetadataDef(vmTO)) != null) {
30183019
vm.addComp(metaDef);
30193020
}
30203021

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUnmanageInstanceCommandWrapper.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ public final class LibvirtUnmanageInstanceCommandWrapper extends CommandWrapper<
6767
public Answer execute(final UnmanageInstanceCommand command, final LibvirtComputingResource libvirtComputingResource) {
6868
String instanceName = command.getInstanceName();
6969
VirtualMachineTO vmSpec = command.getVm();
70+
if (command.isLibvirtMetadataCleanupEnabled()) {
71+
vmSpec.setExcludeMetadata(true);
72+
}
7073
final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper();
7174
logger.debug("Attempting to unmanage KVM instance: {}", instanceName);
7275
Domain dom = null;

server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3037,7 +3037,8 @@ public ConfigKey<?>[] getConfigKeys() {
30373037
ThreadsOnMSToImportVMwareVMFiles,
30383038
ThreadsOnKVMHostToImportVMwareVMFiles,
30393039
ConvertVmwareInstanceToKvmExtraParamsAllowed,
3040-
ConvertVmwareInstanceToKvmExtraParamsAllowedList
3040+
ConvertVmwareInstanceToKvmExtraParamsAllowedList,
3041+
VmUnmanageLibvirtMetadataCleanup
30413042
};
30423043
}
30433044
}

0 commit comments

Comments
 (0)