This is an automated email from the ASF dual-hosted git repository.

nvazquez pushed a commit to branch 4.22
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.22 by this push:
     new e93ae1a4f45 New config key "allow.import.volume.with.backing.file" to 
skip volume backing (#12809)
e93ae1a4f45 is described below

commit e93ae1a4f455a0dff010db673b47b913220f9037
Author: Manoj Kumar <[email protected]>
AuthorDate: Tue Mar 17 20:04:34 2026 +0530

    New config key "allow.import.volume.with.backing.file" to skip volume 
backing (#12809)
    
    * 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.
    
    * cleanup conflicting key
    
    * move configkey into VolumeImportUnmanageService
    
    ---------
    
    Co-authored-by: rajujith <[email protected]>
---
 .../storage/volume/VolumeImportUnmanageService.java       | 13 ++++++++++++-
 .../storage/volume/VolumeImportUnmanageManagerImpl.java   | 15 ++++++++++++++-
 .../org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java |  3 ++-
 3 files changed, 28 insertions(+), 3 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 5f69f3e46e7..78c598272e0 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.command.admin.volume.ImportVolumeCmd;
 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<Hypervisor.HypervisorType> SUPPORTED_HYPERVISORS =
             Arrays.asList(Hypervisor.HypervisorType.KVM, 
Hypervisor.HypervisorType.VMware);
@@ -37,6 +39,15 @@ public interface VolumeImportUnmanageService extends 
PluggableService {
     List<Storage.StoragePoolType> SUPPORTED_STORAGE_POOL_TYPES_FOR_KVM = 
Arrays.asList(Storage.StoragePoolType.NetworkFilesystem,
             Storage.StoragePoolType.Filesystem, Storage.StoragePoolType.RBD);
 
+    ConfigKey<Boolean> 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<VolumeForImportResponse> 
listVolumesForImport(ListVolumesForImportCmd cmd);
 
     VolumeResponse importVolume(ImportVolumeCmd cmd);
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 383644f9aa2..62b5ac38ee2 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
@@ -68,6 +68,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.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;
@@ -394,7 +395,7 @@ public class VolumeImportUnmanageManagerImpl implements 
VolumeImportUnmanageServ
         Map<VolumeOnStorageTO.Detail, String> 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 +514,16 @@ public class VolumeImportUnmanageManagerImpl implements 
VolumeImportUnmanageServ
         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 13fa2608016..8bc710d113f 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 java.util.stream.Collectors;
 
 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;
@@ -2908,7 +2909,7 @@ public class UnmanagedVMsManagerImpl implements 
UnmanagedVMsManager {
         }
         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.");
             }
         }

Reply via email to