From e2d790ce0b95cb7100aeb1a8651df1bc21104dd1 Mon Sep 17 00:00:00 2001 From: rajujith Date: Fri, 13 Mar 2026 10:05:28 +0530 Subject: [PATCH 1/3] Added support for skipping volume backing when importing unmanaged volumes and VMs. This allows users to import volumes and VMs without creating a backing volume, which can be useful in certain scenarios where the backing volume is not needed or desired. --- .../VolumeImportUnmanageManagerImpl.java | 25 +++++++++++++++++-- .../vm/UnmanagedVMsManagerImpl.java | 16 +++++++++--- .../VolumeImportUnmanageManagerImplTest.java | 16 ++++++++++++ .../vm/UnmanagedVMsManagerImplTest.java | 21 ++++++++++++++++ 4 files changed, 73 insertions(+), 5 deletions(-) diff --git a/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java b/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java index 383644f9aa20..414f5c5bc7d2 100644 --- a/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java @@ -73,6 +73,8 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.utils.bytescale.ByteScaleUtils; import org.apache.commons.collections.CollectionUtils; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -84,7 +86,7 @@ import java.util.List; import java.util.Map; -public class VolumeImportUnmanageManagerImpl implements VolumeImportUnmanageService { +public class VolumeImportUnmanageManagerImpl implements VolumeImportUnmanageService, Configurable { protected Logger logger = LogManager.getLogger(VolumeImportUnmanageManagerImpl.class); @Inject @@ -123,6 +125,15 @@ public class VolumeImportUnmanageManagerImpl implements VolumeImportUnmanageServ static final String DISK_OFFERING_NAME_SUFFIX_LOCAL = " - Local Storage"; static final String DISK_OFFERING_UNIQUE_NAME_SUFFIX_LOCAL = "-Local"; + ConfigKey AllowImportVolumeWithBackingFile = new ConfigKey<>(Boolean.class, + "allow.import.volume.with.backing.file", + "Advanced", + "false", + "If enabled, allows QCOW2 volumes with backing files to be imported or unmanaged", + true, + ConfigKey.Scope.Global, + null); + protected void logFailureAndThrowException(String msg) { logger.error(msg); throw new CloudRuntimeException(msg); @@ -394,7 +405,7 @@ protected void checkIfVolumeHasBackingFile(VolumeOnStorageTO volume) { Map volumeDetails = volume.getDetails(); if (volumeDetails != null && volumeDetails.containsKey(VolumeOnStorageTO.Detail.BACKING_FILE)) { String backingFile = volumeDetails.get(VolumeOnStorageTO.Detail.BACKING_FILE); - if (StringUtils.isNotBlank(backingFile)) { + if (StringUtils.isNotBlank(backingFile) && !AllowImportVolumeWithBackingFile.value()) { logFailureAndThrowException("Volume with backing file cannot be imported or unmanaged."); } } @@ -513,4 +524,14 @@ private void unmanageVolumeFromDatabase(VolumeVO volume) { volume.setRemoved(new Date()); volumeDao.update(volume.getId(), volume); } + + @Override + public String getConfigComponentName() { + return VolumeImportUnmanageManagerImpl.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[]{ AllowImportVolumeWithBackingFile }; + } } 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 13fa2608016c..edc8febd2922 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -220,6 +220,15 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager { ConfigKey.Scope.Global, null); + ConfigKey AllowImportVolumeWithBackingFile = new ConfigKey<>(Boolean.class, + "allow.import.volume.with.backing.file", + "Advanced", + "false", + "If enabled, allows QCOW2 volumes with backing files to be imported or unmanaged", + true, + ConfigKey.Scope.Global, + null); + ConfigKey ConvertVmwareInstanceToKvmExtraParamsAllowedList = new ConfigKey<>(ConfigKey.CATEGORY_ADVANCED, String.class, "convert.vmware.instance.to.kvm.extra.params.allowed.list", @@ -2889,7 +2898,7 @@ private UserVm importKvmVirtualMachineFromDisk(final ImportSource importSource, return userVm; } - private void checkVolume(Map volumeDetails) { + protected void checkVolume(Map volumeDetails) { if (MapUtils.isEmpty(volumeDetails)) { return; } @@ -2908,7 +2917,7 @@ private void checkVolume(Map volumeDetails) { } if (volumeDetails.containsKey(VolumeOnStorageTO.Detail.BACKING_FILE)) { String backingFile = volumeDetails.get(VolumeOnStorageTO.Detail.BACKING_FILE); - if (StringUtils.isNotBlank(backingFile)) { + if (StringUtils.isNotBlank(backingFile) && !AllowImportVolumeWithBackingFile.value()) { logFailureAndThrowException("Volume with backing file cannot be imported or unmanaged."); } } @@ -3037,7 +3046,8 @@ public ConfigKey[] getConfigKeys() { ThreadsOnMSToImportVMwareVMFiles, ThreadsOnKVMHostToImportVMwareVMFiles, ConvertVmwareInstanceToKvmExtraParamsAllowed, - ConvertVmwareInstanceToKvmExtraParamsAllowedList + ConvertVmwareInstanceToKvmExtraParamsAllowedList, + AllowImportVolumeWithBackingFile }; } } diff --git a/server/src/test/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImplTest.java index 9ee34d32a177..acc9e3ac9683 100644 --- a/server/src/test/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImplTest.java @@ -61,6 +61,7 @@ import org.apache.cloudstack.api.response.VolumeForImportResponse; import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; @@ -134,6 +135,8 @@ public class VolumeImportUnmanageManagerImplTest { private VolumeApiService volumeApiService; @Mock private SnapshotDataStoreDao snapshotDataStoreDao; + @Mock + private ConfigKey mockAllowImportVolumeWithBackingFile; @Mock StoragePoolVO storagePoolVO; @@ -343,6 +346,8 @@ public void testCheckIfVolumeIsEncrypted() { @Test public void testCheckIfVolumeHasBackingFile() { + volumeImportUnmanageManager.AllowImportVolumeWithBackingFile = mockAllowImportVolumeWithBackingFile; + Mockito.when(mockAllowImportVolumeWithBackingFile.value()).thenReturn(false); try { VolumeOnStorageTO volumeOnStorageTO = new VolumeOnStorageTO(hypervisorType, path, name, fullPath, format, size, virtualSize); @@ -356,6 +361,17 @@ public void testCheckIfVolumeHasBackingFile() { } } + @Test + public void testCheckIfVolumeHasBackingFileAllowEnabled() { + volumeImportUnmanageManager.AllowImportVolumeWithBackingFile = mockAllowImportVolumeWithBackingFile; + Mockito.when(mockAllowImportVolumeWithBackingFile.value()).thenReturn(true); + VolumeOnStorageTO volumeOnStorageTO = new VolumeOnStorageTO(hypervisorType, path, name, fullPath, + format, size, virtualSize); + volumeOnStorageTO.addDetail(VolumeOnStorageTO.Detail.BACKING_FILE, BACKING_FILE); + volumeOnStorageTO.addDetail(VolumeOnStorageTO.Detail.BACKING_FILE_FORMAT, BACKING_FILE_FORMAT); + volumeImportUnmanageManager.checkIfVolumeHasBackingFile(volumeOnStorageTO); + } + @Test public void testUnmanageVolume() { when(volumeVO.getState()).thenReturn(Volume.State.Ready); diff --git a/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java index a24ba7f068b2..1d7ccc34408a 100644 --- a/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java @@ -171,6 +171,7 @@ import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.dao.VMInstanceDetailsDao; +import org.apache.cloudstack.storage.volume.VolumeOnStorageTO; @RunWith(MockitoJUnitRunner.class) public class UnmanagedVMsManagerImplTest { @@ -257,6 +258,8 @@ public class UnmanagedVMsManagerImplTest { private ConfigKey configKeyMockParamsAllowed; @Mock private ConfigKey configKeyMockParamsAllowedList; + @Mock + private ConfigKey configKeyMockAllowBackingFile; private static final long virtualMachineId = 1L; @@ -1351,4 +1354,22 @@ public void testAddServiceOfferingDetailsToParamsCustomUnconstrainedOffering() { Assert.assertFalse(params.containsKey(VmDetailConstants.CPU_SPEED)); Assert.assertFalse(params.containsKey(VmDetailConstants.MEMORY)); } + + @Test(expected = CloudRuntimeException.class) + public void testCheckVolumeWithBackingFileSettingDisabled() { + unmanagedVMsManager.AllowImportVolumeWithBackingFile = configKeyMockAllowBackingFile; + Mockito.when(configKeyMockAllowBackingFile.value()).thenReturn(false); + Map details = new HashMap<>(); + details.put(VolumeOnStorageTO.Detail.BACKING_FILE, "backing.qcow2"); + unmanagedVMsManager.checkVolume(details); + } + + @Test + public void testCheckVolumeWithBackingFileSettingEnabled() { + unmanagedVMsManager.AllowImportVolumeWithBackingFile = configKeyMockAllowBackingFile; + Mockito.when(configKeyMockAllowBackingFile.value()).thenReturn(true); + Map details = new HashMap<>(); + details.put(VolumeOnStorageTO.Detail.BACKING_FILE, "backing.qcow2"); + unmanagedVMsManager.checkVolume(details); + } } From e3bc8f593c8d609e9d3c17217e7580b0852df09d Mon Sep 17 00:00:00 2001 From: Manoj Kumar Date: Fri, 13 Mar 2026 13:15:19 +0530 Subject: [PATCH 2/3] cleanup conflicting key --- .../cloudstack/vm/UnmanagedVMsManager.java | 9 +++++++ .../VolumeImportUnmanageManagerImpl.java | 25 +++---------------- .../vm/UnmanagedVMsManagerImpl.java | 11 +------- .../VolumeImportUnmanageManagerImplTest.java | 16 ------------ .../vm/UnmanagedVMsManagerImplTest.java | 21 ---------------- 5 files changed, 13 insertions(+), 69 deletions(-) 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 b6233b9c2704..375e4254b0a2 100644 --- a/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java +++ b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java @@ -70,6 +70,15 @@ public interface UnmanagedVMsManager extends VmImportService, UnmanageVMService, ConfigKey.Scope.Global, null); + ConfigKey AllowImportVolumeWithBackingFile = new ConfigKey<>(Boolean.class, + "allow.import.volume.with.backing.file", + "Advanced", + "false", + "If enabled, allows QCOW2 volumes with backing files to be imported or unmanaged", + true, + ConfigKey.Scope.Global, + null); + static boolean isSupported(Hypervisor.HypervisorType hypervisorType) { return hypervisorType == VMware || hypervisorType == KVM; } diff --git a/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java b/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java index 414f5c5bc7d2..889dad72a534 100644 --- a/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java @@ -17,6 +17,8 @@ package org.apache.cloudstack.storage.volume; +import static org.apache.cloudstack.vm.UnmanagedVMsManager.AllowImportVolumeWithBackingFile; + import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.GetVolumesOnStorageAnswer; @@ -73,8 +75,6 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.utils.bytescale.ByteScaleUtils; import org.apache.commons.collections.CollectionUtils; -import org.apache.cloudstack.framework.config.ConfigKey; -import org.apache.cloudstack.framework.config.Configurable; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -86,7 +86,7 @@ import java.util.List; import java.util.Map; -public class VolumeImportUnmanageManagerImpl implements VolumeImportUnmanageService, Configurable { +public class VolumeImportUnmanageManagerImpl implements VolumeImportUnmanageService { protected Logger logger = LogManager.getLogger(VolumeImportUnmanageManagerImpl.class); @Inject @@ -125,15 +125,6 @@ public class VolumeImportUnmanageManagerImpl implements VolumeImportUnmanageServ static final String DISK_OFFERING_NAME_SUFFIX_LOCAL = " - Local Storage"; static final String DISK_OFFERING_UNIQUE_NAME_SUFFIX_LOCAL = "-Local"; - ConfigKey AllowImportVolumeWithBackingFile = new ConfigKey<>(Boolean.class, - "allow.import.volume.with.backing.file", - "Advanced", - "false", - "If enabled, allows QCOW2 volumes with backing files to be imported or unmanaged", - true, - ConfigKey.Scope.Global, - null); - protected void logFailureAndThrowException(String msg) { logger.error(msg); throw new CloudRuntimeException(msg); @@ -524,14 +515,4 @@ private void unmanageVolumeFromDatabase(VolumeVO volume) { volume.setRemoved(new Date()); volumeDao.update(volume.getId(), volume); } - - @Override - public String getConfigComponentName() { - return VolumeImportUnmanageManagerImpl.class.getSimpleName(); - } - - @Override - public ConfigKey[] getConfigKeys() { - return new ConfigKey[]{ AllowImportVolumeWithBackingFile }; - } } 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 edc8febd2922..51def517c539 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -220,15 +220,6 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager { ConfigKey.Scope.Global, null); - ConfigKey AllowImportVolumeWithBackingFile = new ConfigKey<>(Boolean.class, - "allow.import.volume.with.backing.file", - "Advanced", - "false", - "If enabled, allows QCOW2 volumes with backing files to be imported or unmanaged", - true, - ConfigKey.Scope.Global, - null); - ConfigKey ConvertVmwareInstanceToKvmExtraParamsAllowedList = new ConfigKey<>(ConfigKey.CATEGORY_ADVANCED, String.class, "convert.vmware.instance.to.kvm.extra.params.allowed.list", @@ -2898,7 +2889,7 @@ private UserVm importKvmVirtualMachineFromDisk(final ImportSource importSource, return userVm; } - protected void checkVolume(Map volumeDetails) { + private void checkVolume(Map volumeDetails) { if (MapUtils.isEmpty(volumeDetails)) { return; } diff --git a/server/src/test/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImplTest.java index acc9e3ac9683..9ee34d32a177 100644 --- a/server/src/test/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImplTest.java @@ -61,7 +61,6 @@ import org.apache.cloudstack.api.response.VolumeForImportResponse; import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; @@ -135,8 +134,6 @@ public class VolumeImportUnmanageManagerImplTest { private VolumeApiService volumeApiService; @Mock private SnapshotDataStoreDao snapshotDataStoreDao; - @Mock - private ConfigKey mockAllowImportVolumeWithBackingFile; @Mock StoragePoolVO storagePoolVO; @@ -346,8 +343,6 @@ public void testCheckIfVolumeIsEncrypted() { @Test public void testCheckIfVolumeHasBackingFile() { - volumeImportUnmanageManager.AllowImportVolumeWithBackingFile = mockAllowImportVolumeWithBackingFile; - Mockito.when(mockAllowImportVolumeWithBackingFile.value()).thenReturn(false); try { VolumeOnStorageTO volumeOnStorageTO = new VolumeOnStorageTO(hypervisorType, path, name, fullPath, format, size, virtualSize); @@ -361,17 +356,6 @@ public void testCheckIfVolumeHasBackingFile() { } } - @Test - public void testCheckIfVolumeHasBackingFileAllowEnabled() { - volumeImportUnmanageManager.AllowImportVolumeWithBackingFile = mockAllowImportVolumeWithBackingFile; - Mockito.when(mockAllowImportVolumeWithBackingFile.value()).thenReturn(true); - VolumeOnStorageTO volumeOnStorageTO = new VolumeOnStorageTO(hypervisorType, path, name, fullPath, - format, size, virtualSize); - volumeOnStorageTO.addDetail(VolumeOnStorageTO.Detail.BACKING_FILE, BACKING_FILE); - volumeOnStorageTO.addDetail(VolumeOnStorageTO.Detail.BACKING_FILE_FORMAT, BACKING_FILE_FORMAT); - volumeImportUnmanageManager.checkIfVolumeHasBackingFile(volumeOnStorageTO); - } - @Test public void testUnmanageVolume() { when(volumeVO.getState()).thenReturn(Volume.State.Ready); diff --git a/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java b/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java index 1d7ccc34408a..a24ba7f068b2 100644 --- a/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java +++ b/server/src/test/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImplTest.java @@ -171,7 +171,6 @@ import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.dao.VMInstanceDetailsDao; -import org.apache.cloudstack.storage.volume.VolumeOnStorageTO; @RunWith(MockitoJUnitRunner.class) public class UnmanagedVMsManagerImplTest { @@ -258,8 +257,6 @@ public class UnmanagedVMsManagerImplTest { private ConfigKey configKeyMockParamsAllowed; @Mock private ConfigKey configKeyMockParamsAllowedList; - @Mock - private ConfigKey configKeyMockAllowBackingFile; private static final long virtualMachineId = 1L; @@ -1354,22 +1351,4 @@ public void testAddServiceOfferingDetailsToParamsCustomUnconstrainedOffering() { Assert.assertFalse(params.containsKey(VmDetailConstants.CPU_SPEED)); Assert.assertFalse(params.containsKey(VmDetailConstants.MEMORY)); } - - @Test(expected = CloudRuntimeException.class) - public void testCheckVolumeWithBackingFileSettingDisabled() { - unmanagedVMsManager.AllowImportVolumeWithBackingFile = configKeyMockAllowBackingFile; - Mockito.when(configKeyMockAllowBackingFile.value()).thenReturn(false); - Map details = new HashMap<>(); - details.put(VolumeOnStorageTO.Detail.BACKING_FILE, "backing.qcow2"); - unmanagedVMsManager.checkVolume(details); - } - - @Test - public void testCheckVolumeWithBackingFileSettingEnabled() { - unmanagedVMsManager.AllowImportVolumeWithBackingFile = configKeyMockAllowBackingFile; - Mockito.when(configKeyMockAllowBackingFile.value()).thenReturn(true); - Map details = new HashMap<>(); - details.put(VolumeOnStorageTO.Detail.BACKING_FILE, "backing.qcow2"); - unmanagedVMsManager.checkVolume(details); - } } From a9c333286e3e67cb609b0cab2f9011158bfffad6 Mon Sep 17 00:00:00 2001 From: Manoj Kumar Date: Fri, 13 Mar 2026 17:19:48 +0530 Subject: [PATCH 3/3] move configkey into VolumeImportUnmanageService --- .../volume/VolumeImportUnmanageService.java | 13 ++++++++++++- .../apache/cloudstack/vm/UnmanagedVMsManager.java | 9 --------- .../volume/VolumeImportUnmanageManagerImpl.java | 15 +++++++++++++-- .../cloudstack/vm/UnmanagedVMsManagerImpl.java | 4 ++-- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/api/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageService.java b/api/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageService.java index 5f69f3e46e73..78c598272e03 100644 --- a/api/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageService.java +++ b/api/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageService.java @@ -25,11 +25,13 @@ import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.VolumeForImportResponse; import org.apache.cloudstack.api.response.VolumeResponse; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; import java.util.Arrays; import java.util.List; -public interface VolumeImportUnmanageService extends PluggableService { +public interface VolumeImportUnmanageService extends PluggableService, Configurable { List SUPPORTED_HYPERVISORS = Arrays.asList(Hypervisor.HypervisorType.KVM, Hypervisor.HypervisorType.VMware); @@ -37,6 +39,15 @@ public interface VolumeImportUnmanageService extends PluggableService { List SUPPORTED_STORAGE_POOL_TYPES_FOR_KVM = Arrays.asList(Storage.StoragePoolType.NetworkFilesystem, Storage.StoragePoolType.Filesystem, Storage.StoragePoolType.RBD); + ConfigKey AllowImportVolumeWithBackingFile = new ConfigKey<>(Boolean.class, + "allow.import.volume.with.backing.file", + "Advanced", + "false", + "If enabled, allows QCOW2 volumes with backing files to be imported or unmanaged", + true, + ConfigKey.Scope.Global, + null); + ListResponse listVolumesForImport(ListVolumesForImportCmd cmd); VolumeResponse importVolume(ImportVolumeCmd cmd); 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 375e4254b0a2..b6233b9c2704 100644 --- a/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java +++ b/api/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManager.java @@ -70,15 +70,6 @@ public interface UnmanagedVMsManager extends VmImportService, UnmanageVMService, ConfigKey.Scope.Global, null); - ConfigKey AllowImportVolumeWithBackingFile = new ConfigKey<>(Boolean.class, - "allow.import.volume.with.backing.file", - "Advanced", - "false", - "If enabled, allows QCOW2 volumes with backing files to be imported or unmanaged", - true, - ConfigKey.Scope.Global, - null); - static boolean isSupported(Hypervisor.HypervisorType hypervisorType) { return hypervisorType == VMware || hypervisorType == KVM; } diff --git a/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java b/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java index 889dad72a534..62b5ac38ee2e 100644 --- a/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/storage/volume/VolumeImportUnmanageManagerImpl.java @@ -17,8 +17,6 @@ package org.apache.cloudstack.storage.volume; -import static org.apache.cloudstack.vm.UnmanagedVMsManager.AllowImportVolumeWithBackingFile; - import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.GetVolumesOnStorageAnswer; @@ -70,6 +68,7 @@ import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; +import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; @@ -515,4 +514,16 @@ private void unmanageVolumeFromDatabase(VolumeVO volume) { volume.setRemoved(new Date()); volumeDao.update(volume.getId(), volume); } + + @Override + public String getConfigComponentName() { + return VolumeImportUnmanageManagerImpl.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[]{ + AllowImportVolumeWithBackingFile + }; + } } 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 51def517c539..8bc710d113f0 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -195,6 +195,7 @@ import static org.apache.cloudstack.api.ApiConstants.MAX_IOPS; import static org.apache.cloudstack.api.ApiConstants.MIN_IOPS; +import static org.apache.cloudstack.storage.volume.VolumeImportUnmanageService.AllowImportVolumeWithBackingFile; import static org.apache.cloudstack.vm.ImportVmTask.Step.CloningInstance; import static org.apache.cloudstack.vm.ImportVmTask.Step.Completed; import static org.apache.cloudstack.vm.ImportVmTask.Step.ConvertingInstance; @@ -3037,8 +3038,7 @@ public ConfigKey[] getConfigKeys() { ThreadsOnMSToImportVMwareVMFiles, ThreadsOnKVMHostToImportVMwareVMFiles, ConvertVmwareInstanceToKvmExtraParamsAllowed, - ConvertVmwareInstanceToKvmExtraParamsAllowedList, - AllowImportVolumeWithBackingFile + ConvertVmwareInstanceToKvmExtraParamsAllowedList }; } }