Amit Aviram has uploaded a new change for review.

Change subject: core: Image configuration adjustments for cloning a VM
......................................................................

core: Image configuration adjustments for cloning a VM

While cloning a VM, in some cases disk image configurations must be
applied before executing the command. Specifically when cloning a
VM's snapshot with thin NFS, raw disk allocation, to a VM with thin
block disk allocation- the raw format needs to be changed to COW.

Change-Id: Id924e9beab5d84277fad4f3a2a40b14571beaf22
Bug-Url: https://bugzilla.redhat.com/1121397
Signed-off-by: Amit Aviram <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java
4 files changed, 29 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/99/35599/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
index ae9e442..4379aaf 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmAndCloneImageCommand.java
@@ -317,10 +317,10 @@
      * @return
      */
     protected Collection<DiskImage> getDiskImagesToBeCloned() {
-        return getDiskImagesFromConfiguration();
+        return getAdjustedDiskImagesFromConfiguration();
     }
 
-    protected abstract Collection<DiskImage> getDiskImagesFromConfiguration();
+    protected abstract Collection<DiskImage> 
getAdjustedDiskImagesFromConfiguration();
 
     protected DiskImage 
getDiskImageToRemoveByParam(MoveOrCopyImageGroupParameters param) {
         Guid imageGroupId = param.getDestImageGroupId();
@@ -396,9 +396,9 @@
     protected boolean addVmImages() {
         int numberOfStartedCopyTasks = 0;
         try {
-            if (!getDiskImagesFromConfiguration().isEmpty()) {
+            if (!getAdjustedDiskImagesFromConfiguration().isEmpty()) {
                 lockEntities();
-                for (DiskImage diskImage : getDiskImagesFromConfiguration()) {
+                for (DiskImage diskImage : 
getAdjustedDiskImagesFromConfiguration()) {
                     // For illegal image check if it was snapshot as illegal 
(therefore
                     // still exists at DB, or was it erased after snapshot - 
therefore the
                     // query returned to UI an illegal image)
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java
index 937d8c6..55c469f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommand.java
@@ -11,9 +11,12 @@
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.Snapshot;
 import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotStatus;
+import org.ovirt.engine.core.common.businessentities.StorageType;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
 import org.ovirt.engine.core.common.businessentities.VmStatic;
+import org.ovirt.engine.core.common.businessentities.VolumeFormat;
+import org.ovirt.engine.core.common.businessentities.VolumeType;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.locks.LockingGroup;
 import org.ovirt.engine.core.common.queries.IdQueryParameters;
@@ -83,15 +86,31 @@
         return (getSnapshot() != null) ? getSnapshot().getVmId() : Guid.Empty;
     }
 
-    protected Collection<DiskImage> getDiskImagesFromConfiguration() {
+    @Override
+    protected Collection<DiskImage> getAdjustedDiskImagesFromConfiguration() {
         if (diskImagesFromConfiguration == null) {
             diskImagesFromConfiguration =
                     
ImagesHandler.filterImageDisks(vmFromConfiguration.getDiskMap().values(),
                             false,
                             true,
                             true);
+            adjustDisksImageConfiguration(diskImagesFromConfiguration);
         }
         return diskImagesFromConfiguration;
+    }
+
+    private void adjustDisksImageConfiguration(Collection<DiskImage> 
diskImages) {
+        for (DiskImage diskImage : diskImages) {
+            // Adjust disk image configuration if needed.
+            if ( diskImage.getVolumeType().equals(VolumeType.Sparse) && 
diskImage.getVolumeFormat().equals(VolumeFormat.RAW) &&
+                    
getDestintationDomainTypeFromDisk(diskImage).isBlockDomain()) {
+                diskImage.setvolumeFormat(VolumeFormat.COW);
+            }
+        }
+    }
+
+    private StorageType getDestintationDomainTypeFromDisk(DiskImage diskImage) 
{
+        return 
destStorages.get(diskInfoDestinationMap.get(diskImage.getId()).getStorageIds().get(0)).getStorageStaticData().getStorageType();
     }
 
     @Override
@@ -131,7 +150,7 @@
 
         VmValidator vmValidator = createVmValidator(vmFromConfiguration);
         if (Boolean.FALSE.equals(getParameters().isVirtioScsiEnabled()) &&
-                
!validate(vmValidator.canDisableVirtioScsi(getDiskImagesFromConfiguration()))) {
+                
!validate(vmValidator.canDisableVirtioScsi(getAdjustedDiskImagesFromConfiguration())))
 {
             return false;
         }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
index 96fdd96..23c9b96 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneVmCommand.java
@@ -88,7 +88,8 @@
         return locks;
     }
 
-    protected Collection<DiskImage> getDiskImagesFromConfiguration() {
+    @Override
+    protected Collection<DiskImage> getAdjustedDiskImagesFromConfiguration() {
         VdcQueryReturnValue vdcReturnValue = runInternalQuery(
                 VdcQueryType.GetAllDisksByVmId,
                 new IdQueryParameters(oldVmId));
@@ -151,7 +152,7 @@
 
     private void fillDisksToParameters() {
 
-        for (Disk image : getDiskImagesFromConfiguration()) {
+        for (Disk image : getAdjustedDiskImagesFromConfiguration()) {
                 diskInfoDestinationMap.put(image.getId(), (DiskImage) image);
         }
 
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java
index ba66f30..e440bbc 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/AddVmFromSnapshotCommandTest.java
@@ -97,7 +97,7 @@
         DiskImage disk = new DiskImage();
         disk.setDiskInterface(DiskInterface.VirtIO_SCSI);
         disk.setPlugged(true);
-        
doReturn(Collections.singletonList(disk)).when(command).getDiskImagesFromConfiguration();
+        
doReturn(Collections.singletonList(disk)).when(command).getAdjustedDiskImagesFromConfiguration();
 
         VmValidator vmValidator = spy(new VmValidator(vm));
         doReturn(vmValidator).when(command).createVmValidator(vm);


-- 
To view, visit http://gerrit.ovirt.org/35599
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Id924e9beab5d84277fad4f3a2a40b14571beaf22
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Amit Aviram <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to