diff --git a/api/src/main/java/com/cloud/agent/api/to/VirtualMachineTO.java b/api/src/main/java/com/cloud/agent/api/to/VirtualMachineTO.java index 9af6c731fd2..79ed4deee6e 100644 --- a/api/src/main/java/com/cloud/agent/api/to/VirtualMachineTO.java +++ b/api/src/main/java/com/cloud/agent/api/to/VirtualMachineTO.java @@ -91,6 +91,7 @@ public class VirtualMachineTO { private String metadataManufacturer; private String metadataProductName; private VirtualMachineMetadataTO metadata; + private boolean excludeMetadata; public VirtualMachineTO(long id, String instanceName, VirtualMachine.Type type, int cpus, Integer speed, long minRam, long maxRam, BootloaderType bootloader, String os, boolean enableHA, boolean limitCpuUse, String vncPassword) { @@ -509,6 +510,10 @@ public class VirtualMachineTO { this.metadata = metadata; } + public boolean isExcludeMetadata() { return excludeMetadata; } + + public void setExcludeMetadata(boolean excludeMetadata) { this.excludeMetadata = excludeMetadata;} + @Override public String toString() { return String.format("VM {id: \"%s\", name: \"%s\", uuid: \"%s\", type: \"%s\"}", id, name, uuid, type); diff --git a/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java index e1963313eb6..43a8bb369fa 100644 --- a/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java +++ b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java @@ -71,6 +71,14 @@ public interface UnmanagedVMsManager extends VmImportService, UnmanageVMService, true, ConfigKey.Scope.Global, null); + ConfigKey VmUnmanageLibvirtMetadataCleanup = new ConfigKey<>(Boolean.class, + "vm.unmanage.libvirt.metadata.cleanup", + "Advanced", + "true", + "Specifies whether metadata should be cleaned up when a VM is unmanaged, applicable to the KVM hypervisor.", + true, + ConfigKey.Scope.Global, + null); static boolean isSupported(Hypervisor.HypervisorType hypervisorType) { return hypervisorType == VMware || hypervisorType == KVM; diff --git a/core/src/main/java/com/cloud/agent/api/UnmanageInstanceCommand.java b/core/src/main/java/com/cloud/agent/api/UnmanageInstanceCommand.java index dd504b9ea26..e5540c2e80d 100644 --- a/core/src/main/java/com/cloud/agent/api/UnmanageInstanceCommand.java +++ b/core/src/main/java/com/cloud/agent/api/UnmanageInstanceCommand.java @@ -28,6 +28,7 @@ public class UnmanageInstanceCommand extends Command { boolean executeInSequence = false; VirtualMachineTO vm; boolean isConfigDriveAttached; + boolean isLibvirtMetadataCleanUpEnabled; @Override public boolean executeInSequence() { @@ -58,4 +59,10 @@ public class UnmanageInstanceCommand extends Command { public void setConfigDriveAttached(boolean configDriveAttached) { isConfigDriveAttached = configDriveAttached; } + + public boolean isLibvirtMetadataCleanupEnabled() {return isLibvirtMetadataCleanUpEnabled;} + + public void setLibvirtMetadataCleanup(boolean libvirtMetadataCleanUp) { + isLibvirtMetadataCleanUpEnabled = libvirtMetadataCleanUp; + } } diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index a232bdd05da..5ac7a3c1a99 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -2147,6 +2147,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac unmanageInstanceCommand = new UnmanageInstanceCommand(vmName); unmanageInstanceCommand.setConfigDriveAttached(vmInstanceDetailsDao.findDetail(vm.getId(), VmDetailConstants.CONFIG_DRIVE_LOCATION) != null); } + boolean isEnabled = UnmanagedVMsManager.VmUnmanageLibvirtMetadataCleanup.value(); + unmanageInstanceCommand.setLibvirtMetadataCleanup(isEnabled); logger.debug("Selected host ID: {} to persist domain XML for Instance: {}.", agentHostId, vmName); try { diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 41716881fa4..45217daf658 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -3160,7 +3160,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv vm.addComp(createDevicesDef(vmTO, guest, vcpus, isUefiEnabled)); MetadataDef metaDef; - if ((metaDef = createMetadataDef(vmTO)) != null) { + boolean excludeMetadata = vmTO.isExcludeMetadata(); + if (!excludeMetadata && (metaDef = createMetadataDef(vmTO)) != null) { vm.addComp(metaDef); } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUnmanageInstanceCommandWrapper.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUnmanageInstanceCommandWrapper.java index 33ad274b8d1..2d4344b1adf 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUnmanageInstanceCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUnmanageInstanceCommandWrapper.java @@ -67,6 +67,9 @@ public final class LibvirtUnmanageInstanceCommandWrapper extends CommandWrapper< public Answer execute(final UnmanageInstanceCommand command, final LibvirtComputingResource libvirtComputingResource) { String instanceName = command.getInstanceName(); VirtualMachineTO vmSpec = command.getVm(); + if (command.isLibvirtMetadataCleanupEnabled()) { + vmSpec.setExcludeMetadata(true); + } final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); logger.debug("Attempting to unmanage KVM instance: {}", instanceName); Domain dom = null; diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java index 36905fb40ec..9e3b5458469 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -3177,7 +3177,8 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager { ThreadsOnMSToImportVMwareVMFiles, ThreadsOnKVMHostToImportVMwareVMFiles, ConvertVmwareInstanceToKvmExtraParamsAllowed, - ConvertVmwareInstanceToKvmExtraParamsAllowedList + ConvertVmwareInstanceToKvmExtraParamsAllowedList, + VmUnmanageLibvirtMetadataCleanup }; } }