Liron Aravot has uploaded a new change for review.

Change subject: tmp2
......................................................................

tmp2

Change-Id: I85ddaf7abb736d6298be7f5e358d52cf2e5a48cb
Signed-off-by: lara...@redhat.com <lara...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
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/AddVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesWithCollapseCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ConcurrentChildCommandsExecutionCallback.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CopyImageGroupCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntitiesPollingCallback.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesWithCollapseCommandParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/LeaseState.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/GetImageInfoVDSCommandParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/DoesImageExistVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/GetImageInfoVDSCommand.java
32 files changed, 617 insertions(+), 254 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/10/39210/2

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
index c13a568..3be8467 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddDiskCommand.java
@@ -465,7 +465,7 @@
             ArrayList<Guid> taskList = isExecutedAsChildCommand() ? 
getReturnValue().getInternalVdsmTaskIdList() : 
getReturnValue().getVdsmTaskIdList();
             taskList.addAll(tmpRetValue.getInternalVdsmTaskIdList());
         } else {
-            tmpRetValue = 
executeCommandCoordinatorCommandSync(VdcActionType.AddImageFromScratch, 
parameters);
+            tmpRetValue = 
executeCoCoCommandSyncWithTasksContext(VdcActionType.AddImageFromScratch, 
parameters);
         }
 
         getReturnValue().setFault(tmpRetValue.getFault());
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
index e5c756e..aeab32b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddImageFromScratchCommand.java
@@ -39,7 +39,11 @@
 
     @Override
     protected AsyncTaskType getTaskType() {
-        return AsyncTaskType.notSupported;
+        if (isDataCenterWithoutSpm()) {
+            return AsyncTaskType.notSupported;
+        }
+
+        return super.getTaskType();
     }
 
     @Override
@@ -121,10 +125,17 @@
         } else {
             runVdsCommand(
                     VDSCommandType.CreateVolumeContainer,
-                    new 
CreateVolumeVDSCommandParameters(getParameters().getStoragePoolId(), 
getParameters()
-                            .getStorageDomainId(), getImageGroupId(), 
getParameters().getDiskInfo().getSize(),
-                            getParameters().getDiskInfo().getVolumeType(), 
getParameters().getDiskInfo()
-                            .getVolumeFormat(), getDestinationImageId(), 
diskDescription != null ? diskDescription : "", null, null));
+                    new 
CreateVolumeVDSCommandParameters(getParameters().getStoragePoolId(),
+                            getParameters()
+                                    .getStorageDomainId(),
+                            getImageGroupId(),
+                            getParameters().getDiskInfo().getSize(),
+                            getParameters().getDiskInfo()
+                                    .getVolumeFormat(),
+                            getDestinationImageId(),
+                            diskDescription != null ? diskDescription : "",
+                            null,
+                            null));
             return true;
         }
     }
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 b8ad07f..4876829 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
@@ -9,6 +9,7 @@
 import java.util.Set;
 
 import org.ovirt.engine.core.bll.network.vm.VnicProfileHelper;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.bll.validator.DiskImagesValidator;
@@ -65,6 +66,15 @@
 
     @Override
     protected Map<String, Pair<String, String>> getSharedLocks() {
+        return null;
+    }
+
+    @Override
+    public CommandCallBack getCallBack() {
+        if (isDataCenterWithoutSpm()){
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
+
         return null;
     }
 
@@ -255,7 +265,11 @@
      * @return
      */
     protected VdcReturnValueBase 
executeChildCopyingCommand(VdcActionParametersBase parameters) {
-        return runInternalActionWithTasksContext(getChildActionType(), 
parameters);
+        if (isDataCenterWithSpm()) {
+            return runInternalActionWithTasksContext(getChildActionType(), 
parameters);
+        } else {
+            return 
executeCoCoCommandSyncWithTasksContext(getChildActionType(), parameters);
+        }
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
index 16aee42..d1623e9 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
@@ -22,6 +22,7 @@
 import org.ovirt.engine.core.bll.quota.QuotaStorageDependent;
 import org.ovirt.engine.core.bll.quota.QuotaVdsDependent;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsManager;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
@@ -1099,6 +1100,15 @@
     }
 
     @Override
+    public CommandCallBack getCallBack() {
+        if (isDataCenterWithoutSpm()){
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
+
+        return null;
+    }
+
+    @Override
     protected void endWithFailure() {
         super.endActionOnDisks();
         removeVmRelatedEntitiesFromDb();
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
index 46ca248..69f658f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmTemplateCommand.java
@@ -11,6 +11,7 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
+
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.profiles.CpuProfileHelper;
@@ -23,6 +24,7 @@
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.storage.StoragePoolValidator;
 import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.bll.validator.DiskImagesValidator;
@@ -107,6 +109,7 @@
         VmStatic parameterMasterVm = parameters.getMasterVm();
         if (parameterMasterVm != null) {
             super.setVmId(parameterMasterVm.getId());
+            parameters.setVmId(parameterMasterVm.getId());
             setVdsGroupId(parameterMasterVm.getVdsGroupId());
 
             // API backward compatibility
@@ -134,6 +137,15 @@
             setStoragePoolId(getVdsGroup().getStoragePoolId());
         }
         updateDiskInfoDestinationMap();
+    }
+
+    @Override
+    public CommandCallBack getCallBack() {
+        if (isDataCenterWithoutSpm()){
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
+
+        return null;
     }
 
     protected void separateCustomProperties(VmStatic parameterMasterVm) {
@@ -203,9 +215,11 @@
 
     @Override
     protected void buildChildCommandInfos() {
-        Guid vmSnapshotId = Guid.newGuid();
-        for (DiskImage diskImage : mImages) {
-            addChildCommandInfo(diskImage.getImageId(), 
VdcActionType.CreateImageTemplate, buildChildCommandParameters(diskImage, 
vmSnapshotId));
+        if (isDataCenterWithSpm()) {
+            Guid vmSnapshotId = Guid.newGuid();
+            for (DiskImage diskImage : mImages) {
+                addChildCommandInfo(diskImage.getImageId(), 
VdcActionType.CreateImageTemplate, buildChildCommandParameters(diskImage, 
vmSnapshotId));
+            }
         }
     }
 
@@ -220,6 +234,7 @@
                 .get(0));
         
createParams.setDiskAlias(diskInfoDestinationMap.get(diskImage.getId()).getDiskAlias());
         createParams.setParentParameters(getParameters());
+        createParams.setParentCommand(getActionType());
         createParams.setQuotaId(getQuotaIdForDisk(diskImage));
         
createParams.setDiskProfileId(diskInfoDestinationMap.get(diskImage.getId()).getDiskProfileId());
         return createParams;
@@ -315,7 +330,7 @@
 
         // means that there are no asynchronous tasks to execute and that we 
can
         // end the command synchronously
-        pendingAsyncTasks = !getReturnValue().getVdsmTaskIdList().isEmpty();
+        pendingAsyncTasks = !getReturnValue().getVdsmTaskIdList().isEmpty() || 
(isDataCenterWithoutSpm() && 
!CommandCoordinatorUtil.getChildCommandIds(getCommandId()).isEmpty());
         if (!pendingAsyncTasks) {
             endSuccessfullySynchronous();
         }
@@ -662,29 +677,31 @@
     }
 
     protected void addVmTemplateImages(Map<Guid, Guid> 
srcDeviceIdToTargetDeviceIdMapping) {
+        Guid vmSnapshotId = Guid.newGuid();
         for (DiskImage diskImage : mImages) {
-            // The return value of this action is the 'copyImage' task GUID:
-            VdcReturnValueBase retValue = 
executeChildCommand(diskImage.getImageId());
+            VdcReturnValueBase retValue;
+            if (isDataCenterWithSpm()) {
+                // The return value of this action is the 'copyImage' task 
GUID:
+                retValue = executeChildCommand(diskImage.getImageId());
 
-            if (!retValue.getSucceeded()) {
-                throw new VdcBLLException(retValue.getFault().getError(), 
retValue.getFault().getMessage());
+                if (!retValue.getSucceeded()) {
+                    throw new VdcBLLException(retValue.getFault().getError(), 
retValue.getFault().getMessage());
+                }
+
+                
getReturnValue().getVdsmTaskIdList().addAll(retValue.getInternalVdsmTaskIdList());
+            } else {
+                retValue = 
executeCoCoCommandSyncWithTasksContext(VdcActionType.CreateImageTemplate, 
buildChildCommandParameters(diskImage, vmSnapshotId));
             }
 
-            
getReturnValue().getVdsmTaskIdList().addAll(retValue.getInternalVdsmTaskIdList());
             DiskImage newImage = (DiskImage) retValue.getActionReturnValue();
             srcDeviceIdToTargetDeviceIdMapping.put(diskImage.getId(), 
newImage.getId());
         }
     }
 
-
-    private Guid getVmIdFromImageParameters(){
-        return 
((CreateImageTemplateParameters)getParameters().getImagesParameters().get(0)).getVmId();
-    }
-
     @Override
     protected void endSuccessfully() {
         setVmTemplateId(getParameters().getVmTemplateId());
-        setVmId(getVmIdFromImageParameters());
+        setVmId(getParameters().getVmId());
         isVmInDb = getVm() != null;
 
         getVmStaticDAO().incrementDbGeneration(getVmTemplateId());
@@ -763,7 +780,7 @@
         // statement.
         // (a template without images doesn't exist in the 'vm_template_view').
         setVmTemplateId(getParameters().getVmTemplateId());
-        setVmId(getVmIdFromImageParameters());
+        setVmId(getParameters().getVmId());
 
         for (VdcActionParametersBase p : 
getParameters().getImagesParameters()) {
             p.setTaskGroupSuccess(false);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java
index ac05aa1..83c2873 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumeCommand.java
@@ -4,12 +4,17 @@
 import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumeCommandParameters;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import org.ovirt.engine.core.common.businessentities.DiskImage;
+import org.ovirt.engine.core.common.businessentities.ImageStatus;
+import org.ovirt.engine.core.common.businessentities.LeaseState;
 import org.ovirt.engine.core.common.businessentities.VdsmImageLocationInfo;
 import 
org.ovirt.engine.core.common.vdscommands.CopyVolumeDataVDSCommandParameters;
 import 
org.ovirt.engine.core.common.vdscommands.CreateVolumeVDSCommandParameters;
+import 
org.ovirt.engine.core.common.vdscommands.GetImageInfoVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.compat.CommandStatus;
 
+@InternalCommandAttribute
 public class CloneImageGroupVolumeCommand<T extends 
CloneImageGroupVolumeCommandParameters> extends BaseImagesCommand<T> implements 
EntityPollingCommand {
 
     public CloneImageGroupVolumeCommand(T parameters, CommandContext 
cmdContext) {
@@ -37,10 +42,17 @@
 
     private void createVolume() {
         runVdsCommand(VDSCommandType.CreateVolumeContainer,
-                new 
CreateVolumeVDSCommandParameters(getParameters().getStoragePoolId(), 
getParameters()
-                        .getDstDomainId(), getImageGroupId(), 
getImage().getSize(),
-                        getImage().getVolumeType(), getImage()
-                                .getVolumeFormat(), getImageId(), 
getImage().getDiskDescription() != null ? getImage().getDescription() : "", 
null, null));
+                new 
CreateVolumeVDSCommandParameters(getParameters().getStoragePoolId(),
+                        getParameters()
+                                .getDstDomainId(),
+                        getParameters().getDstImageGroupId(),
+                        getImage().getSize(),
+                        ImagesHandler.getVolumeFormatForDomain(getImage()
+                                .getVolumeFormat(), 
getImage().getVolumeType(), getParameters().getDstDomainId()),
+                        getParameters().getDstImageId(),
+                        getImage().getDiskDescription() != null ? 
getImage().getDescription() : "",
+                        null,
+                        null));
     }
 
     protected AsyncTaskType getTaskType() {
@@ -68,27 +80,25 @@
 
     @Override
     public CommandStatus poll() {
-//        DiskImage imageInfo =
-//                (DiskImage) runVdsCommand(
-//                        VDSCommandType.GetImageInfo,
-//                        new 
GetImageInfoVDSCommandParameters(getParameters().getStoragePoolId(),
-//                                getParameters().getDstDomainId(),
-//                                getParameters().getImageGroupId(),
-//                                
getParameters().getImageId())).getReturnValue();
-//        if (imageInfo.getLeaseState() != LeaseState.FREE) {
-//            return null;
-//        }
-//
-//        if (imageInfo.getImageStatus() == ImageStatus.ILLEGAL) {
-//            return CommandStatus.FAILED;
-//        }
-//
-//        if (imageInfo.getImageStatus() == ImageStatus.OK) {
-//            return CommandStatus.SUCCEEDED;
-//        }
-//
-//        return null;
+        DiskImage imageInfo =
+                (DiskImage) runVdsCommand(
+                        VDSCommandType.GetImageInfo,
+                        new 
GetImageInfoVDSCommandParameters(getParameters().getStoragePoolId(),
+                                getParameters().getDstDomainId(),
+                                getParameters().getDstImageGroupId(),
+                                
getParameters().getDstImageId())).getReturnValue();
+        if (imageInfo.getLeaseState() != LeaseState.FREE) {
+            return null;
+        }
 
-        return CommandStatus.SUCCEEDED;
+        if (imageInfo.getImageStatus() == ImageStatus.ILLEGAL) {
+            return CommandStatus.FAILED;
+        }
+
+        if (imageInfo.getImageStatus() == ImageStatus.OK) {
+            return CommandStatus.SUCCEEDED;
+        }
+
+        return null;
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java
index dcf24dc..63dcd5d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesCommand.java
@@ -1,24 +1,24 @@
 package org.ovirt.engine.core.bll;
 
+import java.util.Collections;
 import java.util.List;
 
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
 import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumeCommandParameters;
-import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
-import org.ovirt.engine.core.common.businessentities.ImageStatus;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 
-public class CloneImageGroupVolumesCommand<T extends 
MoveOrCopyImageGroupParameters> extends BaseImagesCommand<T> implements 
SerialChildExecutingCommand {
+@InternalCommandAttribute
+public class CloneImageGroupVolumesCommand<T extends 
CloneImageGroupVolumesCommandParameters> extends CommandBase<T> implements 
SerialChildExecutingCommand {
     public CloneImageGroupVolumesCommand(T parameters, CommandContext 
cmdContext) {
         super(parameters, cmdContext);
-        setImageGroupId(getParameters().getImageGroupID());
-        setImageId(getParameters().getImageId());
     }
 
     public CloneImageGroupVolumesCommand(T parameters) {
@@ -28,16 +28,13 @@
     @Override
     public CommandCallBack getCallBack() {
         return new SerialChildCommandsExecutionCallback();
-
     }
 
     @Override
     protected void executeCommand() {
-        // Lock all disk images in advance
-        updateImagesChainStatus(ImageStatus.LOCKED);
         List<DiskImage> images = DbFacade.getInstance()
                 .getDiskImageDao()
-                
.getAllSnapshotsForImageGroup(getParameters().getImageGroupID());
+                
.getAllSnapshotsForImageGroup(getParameters().getSrcImageGroupId());
         ImagesHandler.sortImageList(images);
         getParameters().setImageIds(ImagesHandler.getDiskImageIds(images));
         setSucceeded(true);
@@ -46,31 +43,17 @@
     private VdcActionParametersBase buildChildCommandParams(Guid imageId) {
         //will be used to pass further parameters
         CloneImageGroupVolumeCommandParameters params = new 
CloneImageGroupVolumeCommandParameters();
-        params.setSrcDomainId(getParameters().getSourceDomainId());
-        params.setDstDomainId(getParameters().getStorageDomainId());
-        params.setImageGroupID(getParameters().getImageGroupID());
+        params.setSrcDomainId(getParameters().getSrcDomain());
+        params.setDstDomainId(getParameters().getDestDomain());
+        params.setImageGroupID(getParameters().getSrcImageGroupId());
         params.setImageId(imageId);
         params.setStoragePoolId(getParameters().getStoragePoolId());
         params.setParentCommand(getActionType());
         params.setParentParameters(getParameters());
         params.setDstImageId(imageId);
-        params.setDstImageGroupId(getParameters().getImageGroupID());
+        params.setDstImageGroupId(getParameters().getDstImageGroupId());
+        params.setCollapse(false);
         return params;
-    }
-
-    @Override
-    public void endSuccessfully() {
-        updateImagesChainStatus(ImageStatus.OK);
-    }
-
-    @Override
-    public void endWithFailure() {
-        updateImagesChainStatus(ImageStatus.OK);
-    }
-
-    private void updateImagesChainStatus(ImageStatus imagesStatus) {
-        ImagesHandler.updateAllDiskImageSnapshotsStatus(getImageGroupId(), 
imagesStatus);
-
     }
 
     @Override
@@ -89,6 +72,11 @@
     }
 
     @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        return Collections.emptyList();
+    }
+
+    @Override
     public int getChildCount() {
         return getParameters().getImageIds().size();
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesWithCollapseCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesWithCollapseCommand.java
new file mode 100644
index 0000000..37df986
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CloneImageGroupVolumesWithCollapseCommand.java
@@ -0,0 +1,59 @@
+package org.ovirt.engine.core.bll;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.ovirt.engine.core.bll.context.CommandContext;
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
+import org.ovirt.engine.core.bll.utils.PermissionSubject;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumeCommandParameters;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesWithCollapseCommandParameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+
+@InternalCommandAttribute
+public class CloneImageGroupVolumesWithCollapseCommand<T extends 
CloneImageGroupVolumesWithCollapseCommandParameters> extends CommandBase<T>{
+    public CloneImageGroupVolumesWithCollapseCommand(T parameters, 
CommandContext cmdContext) {
+        super(parameters, cmdContext);
+    }
+
+    public CloneImageGroupVolumesWithCollapseCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    @Override
+    public CommandCallBack getCallBack() {
+        return new ConcurrentChildCommandsExecutionCallback();
+    }
+
+    @Override
+    protected void executeCommand() {
+        CommandCoordinatorUtil.executeAsyncCommand(
+                VdcActionType.CloneImageGroupVolume,
+                buildChildCommandParams(),
+                cloneContextAndDetachFromParent());
+        setSucceeded(true);
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        return Collections.emptyList();
+    }
+
+    private VdcActionParametersBase buildChildCommandParams() {
+        // will be used to pass further parameters
+        CloneImageGroupVolumeCommandParameters params = new 
CloneImageGroupVolumeCommandParameters();
+        params.setSrcDomainId(getParameters().getSrcDomain());
+        params.setDstDomainId(getParameters().getDestDomain());
+        params.setImageGroupID(getParameters().getSrcImageGroupId());
+        params.setImageId(getParameters().getSrcImageId());
+        params.setStoragePoolId(getParameters().getStoragePoolId());
+        params.setParentCommand(getActionType());
+        params.setParentParameters(getParameters());
+        params.setDstImageId(getParameters().getDstImageId());
+        params.setDstImageGroupId(getParameters().getDstImageGroupId());
+        params.setCollapse(true);
+        return params;
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
index 1a7a017..91b08a4 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandBase.java
@@ -7,6 +7,7 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -508,7 +509,7 @@
         if (!hasTaskHandlers() || getExecutionIndex() == 
getTaskHandlers().size() - 1) {
             startFinalizingStep();
         }
-
+        obtainChildCommands();
         try {
             initiateLockEndAction();
             setActionState();
@@ -569,6 +570,22 @@
             _actionState = CommandActionState.END_SUCCESS;
         } else {
             _actionState = CommandActionState.END_FAILURE;
+        }
+    }
+
+    public void obtainChildCommands() {
+        if (getCallBack() != null) {
+            List<Guid> childCommands = 
CommandCoordinatorUtil.getChildCommandIds(getCommandId());
+            CommandBase<?> commandBase = 
CommandCoordinatorUtil.retrieveCommand(getCommandId());
+            //List<Pair<VdcActionType, VdcActionParametersBase>> parameters = 
new LinkedList<>();
+            List<VdcActionParametersBase> parameters = new LinkedList<>();
+            for (Guid id : childCommands) {
+                CommandBase<?> command = 
CommandCoordinatorUtil.retrieveCommand(id);
+                
command.getParameters().setCommandType(command.getActionType());
+                parameters.add(command.getParameters());
+            }
+
+            commandBase.getParameters().setImagesParameters(parameters);
         }
     }
 
@@ -2296,16 +2313,13 @@
         return null;
     }
 
-    public VdcReturnValueBase 
executeCommandCoordinatorCommandSync(VdcActionType actionType, 
VdcActionParametersBase parameters) {
-        try {
-            return CommandCoordinatorUtil.executeAsyncCommand(actionType, 
parameters, cloneContextAndDetachFromParent()).get();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
 
     protected VdcReturnValueBase runInternalAction(VdcActionType actionType, 
VdcActionParametersBase parameters) {
         return getBackend().runInternalAction(actionType, parameters, 
context.clone());
+    }
+
+    protected VdcReturnValueBase executeCoCoCommandSync(VdcActionType 
actionType, VdcActionParametersBase parameters) {
+        return executeCoCoCommandSync(actionType, parameters, context.clone());
     }
 
     protected VdcReturnValueBase runInternalAction(VdcActionType actionType,
@@ -2314,6 +2328,16 @@
         return getBackend().runInternalAction(actionType,
                 parameters,
                 internalCommandContext);
+    }
+
+    public VdcReturnValueBase executeCoCoCommandSync(VdcActionType actionType,
+                                                     VdcActionParametersBase 
parameters,
+                                                     CommandContext 
internalCommandContext) {
+        try {
+            return CommandCoordinatorUtil.executeAsyncCommand(actionType, 
parameters, internalCommandContext).get();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
     }
 
     protected ArrayList<VdcReturnValueBase> 
runInternalMultipleActions(VdcActionType actionType,
@@ -2334,12 +2358,16 @@
         return runInternalActionWithTasksContext(actionType, parameters, null);
     }
 
+    public VdcReturnValueBase 
executeCoCoCommandSyncWithTasksContext(VdcActionType actionType, 
VdcActionParametersBase parameters) {
+        return executeCoCoCommandSyncWithTasksContext(actionType, parameters, 
null);
+    }
+
     protected VdcReturnValueBase 
runChildActionWithTasksContextIfNeeded(VdcActionType actionType,
                                                                    
VdcActionParametersBase parameters) {
         if (isDataCenterWithSpm()) {
             return runInternalActionWithTasksContext(actionType, parameters, 
null);
         } else {
-            return executeCommandCoordinatorCommandSync(actionType, 
parameters);
+            return executeCoCoCommandSync(actionType, parameters, null);
         }
     }
 
@@ -2351,6 +2379,18 @@
                 ExecutionHandler.createDefaultContextForTasks(getContext(), 
lock));
     }
 
+    protected VdcReturnValueBase 
runInternalActionWithTasksContextAndCompensationContext(VdcActionType 
actionType,
+                                                                   
VdcActionParametersBase parameters, EngineLock lock) {
+        return runInternalAction(
+                actionType,
+                parameters,
+                ExecutionHandler.createDefaultContextForTasks(getContext(), 
lock));
+    }
+
+    public VdcReturnValueBase 
executeCoCoCommandSyncWithTasksContext(VdcActionType actionType, 
VdcActionParametersBase parameters, EngineLock lock) {
+        return executeCoCoCommandSync(actionType, parameters, 
ExecutionHandler.createDefaultContextForTasks(getContext(), lock));
+    }
+
     protected VdcQueryReturnValue runInternalQuery(VdcQueryType type, 
VdcQueryParametersBase queryParams) {
         return getBackend().runInternalQuery(type, queryParams, 
context.getEngineContext());
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ConcurrentChildCommandsExecutionCallback.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ConcurrentChildCommandsExecutionCallback.java
index b70ccac..1497b6c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ConcurrentChildCommandsExecutionCallback.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ConcurrentChildCommandsExecutionCallback.java
@@ -103,21 +103,22 @@
 //        }
 //    }
 
-        private void endAction(CommandBase<?> commandBase, List<Guid> 
childCmdIds) {
+     private void endAction(CommandBase<?> commandBase, List<Guid> 
childCmdIds) {
         //List<Pair<VdcActionType, VdcActionParametersBase>> parameters = new 
LinkedList<>();
-        List<VdcActionParametersBase> parameters = new LinkedList<>();
-        for (Guid id : childCmdIds) {
-            CommandBase<?> command = getCommand(id);
-            command.getParameters().setCommandType(command.getActionType());
-            parameters.add(command.getParameters());
-            //parameters.add(new Pair<>(command.getActionType(), 
command.getParameters()));
-        }
+//        List<VdcActionParametersBase> parameters = new LinkedList<>();
+//        for (Guid id : childCmdIds) {
+//            CommandBase<?> command = getCommand(id);
+//            command.getParameters().setCommandType(command.getActionType());
+//            parameters.add(command.getParameters());
+//            //parameters.add(new Pair<>(command.getActionType(), 
command.getParameters()));
+//        }
 
         //TODO: handle case of grandpa command
 //        commandBase.getParameters().setCocoChildCommands(parameters);
-        commandBase.getParameters().setImagesParameters(parameters);
-        commandBase.endAction();
+
         if (commandBase.getParameters().getParentCommand() == 
VdcActionType.Unknown) {
+            //endaction method will set the child commands.
+            commandBase.endAction();
             // well remove the hirerchy only if there's no parent, otherwise 
the parent will clean
             // the hirerchy. #TODO: consider change to add a member to the 
parameters for that
             
CommandCoordinatorUtil.removeAllCommandsInHierarchy(commandBase.getCommandId());
@@ -135,6 +136,7 @@
         CommandBase<?> commandBase = getCommand(cmdId);
         //This should be removed as soon as infra bug will be fixed and failed 
execution will reach endWithFailure
         commandBase.getParameters().setTaskGroupSuccess(false);
+
         endAction(commandBase, childCmdIds);
 
 //        endAction(cmdId, childCmdIds);
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CopyImageGroupCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CopyImageGroupCommand.java
index 3f6e869..1ae7fbf 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CopyImageGroupCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CopyImageGroupCommand.java
@@ -1,11 +1,13 @@
 package org.ovirt.engine.core.bll;
 
-import org.ovirt.engine.core.bll.context.CommandContext;
-
 import java.util.List;
 
+import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.storage.PostZeroHandler;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.common.VdcObjectType;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesCommandParameters;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesWithCollapseCommandParameters;
 import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters;
 import org.ovirt.engine.core.common.action.RemoveImageParameters;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
@@ -17,9 +19,6 @@
 import org.ovirt.engine.core.common.businessentities.DiskImage;
 import org.ovirt.engine.core.common.businessentities.ImageOperation;
 import org.ovirt.engine.core.common.businessentities.ImageStorageDomainMapId;
-import org.ovirt.engine.core.common.businessentities.StorageDomainStatic;
-import org.ovirt.engine.core.common.businessentities.VolumeFormat;
-import org.ovirt.engine.core.common.businessentities.VolumeType;
 import org.ovirt.engine.core.common.businessentities.image_storage_domain_map;
 import org.ovirt.engine.core.common.vdscommands.CopyImageVDSCommandParameters;
 import 
org.ovirt.engine.core.common.vdscommands.MoveImageGroupVDSCommandParameters;
@@ -57,61 +56,19 @@
         }
     }
 
+    public CommandCallBack getCallBack() {
+        if (isDataCenterWithoutSpm()){
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
+
+        return null;
+    }
+
     @Override
     protected void executeCommand() {
         lockImage();
-        VDSReturnValue vdsReturnValue = null;
 
-        Guid sourceDomainId = getParameters().getSourceDomainId() != null ? 
getParameters().getSourceDomainId()
-                : getDiskImage().getStorageIds().get(0);
-
-        Guid taskId = 
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
-
-        if (getParameters().getUseCopyCollapse()) {
-            vdsReturnValue = runVdsCommand(
-                    VDSCommandType.CopyImage,
-                    PostZeroHandler.fixParametersWithPostZero(
-                            new 
CopyImageVDSCommandParameters(getStorageDomain().getStoragePoolId(),
-                                    sourceDomainId,
-                                    getParameters().getContainerId(),
-                                    getParameters().getImageGroupID(),
-                                    getParameters().getImageId(),
-                                    getParameters().getDestImageGroupId(),
-                                    getParameters().getDestinationImageId(),
-                                    "",
-                                    getParameters().getStorageDomainId(),
-                                    getParameters().getCopyVolumeType(),
-                                    getVolumeFormatForDomain(),
-                                    getParameters().getVolumeType(),
-                                    isWipeAfterDelete(),
-                                    getParameters().getForceOverride())));
-        } else {
-            vdsReturnValue = runVdsCommand(
-                    VDSCommandType.MoveImageGroup,
-                    PostZeroHandler.fixParametersWithPostZero(
-                            new MoveImageGroupVDSCommandParameters(
-                                    getDiskImage() != null ? 
getDiskImage().getStoragePoolId()
-                                            : 
getStorageDomain().getStoragePoolId(),
-                                    sourceDomainId,
-                                    getDiskImage() != null ?
-                                            getDiskImage().getId() : 
getParameters().getImageGroupID(),
-                                    getParameters().getStorageDomainId(),
-                                    getParameters().getContainerId(),
-                                    ImageOperation.Copy,
-                                    isWipeAfterDelete(),
-                                    getParameters().getForceOverride())));
-        }
-
-        if (vdsReturnValue.getSucceeded()) {
-            AsyncTaskCreationInfo taskCreationInfo = 
vdsReturnValue.getCreationInfo();
-            getReturnValue().getInternalVdsmTaskIdList().add(
-                    createTask(taskId,
-                            taskCreationInfo,
-                            getParameters().getParentCommand(),
-                            VdcObjectType.Storage,
-                            sourceDomainId,
-                            getParameters().getStorageDomainId()));
-
+        if (performVdsmOperation()) {
             // Add storage domain in db only if there is new entity in DB.
             if (!shouldUpdateStorageDisk() && 
getParameters().getAddImageDomainMapping()) {
                 getImageStorageDomainMapDao().save
@@ -130,26 +87,88 @@
                 : getParameters().getWipeAfterDelete();
     }
 
-    /**
-     * Since we are supporting copy/move operations between different storage 
families (file/block) we have to
-     * predetermine the volume format according to the destination storage 
type, for block domains we cannot use sparse
-     * combined with raw so we will change the raw to cow in that case, file 
domains will have the original format
-     * retained
-     */
-    private VolumeFormat getVolumeFormatForDomain() {
-        if (getParameters().getVolumeFormat() == VolumeFormat.COW) {
-            return VolumeFormat.COW;
-        }
 
-        StorageDomainStatic destDomain = 
getStorageDomainStaticDAO().get(getParameters().getStorageDomainId());
-        if (destDomain.getStorageType().isBlockDomain() && 
getParameters().getVolumeType() == VolumeType.Sparse) {
-            return VolumeFormat.COW;
-        }
-        else {
-            return VolumeFormat.RAW;
+    private boolean performVdsmOperation() {
+        Guid sourceDomainId = getParameters().getSourceDomainId() != null ? 
getParameters().getSourceDomainId()
+                : getDiskImage().getStorageIds().get(0);
+        VDSReturnValue vdsReturnValue;
+        if (isDataCenterWithSpm()) {
+            Guid taskId = 
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+            if (getParameters().getUseCopyCollapse()) {
+                vdsReturnValue = runVdsCommand(
+                        VDSCommandType.CopyImage,
+                        PostZeroHandler.fixParametersWithPostZero(
+                                new 
CopyImageVDSCommandParameters(getStorageDomain().getStoragePoolId(),
+                                        sourceDomainId,
+                                        getParameters().getContainerId(),
+                                        getParameters().getImageGroupID(),
+                                        getParameters().getImageId(),
+                                        getParameters().getDestImageGroupId(),
+                                        
getParameters().getDestinationImageId(),
+                                        "",
+                                        getParameters().getStorageDomainId(),
+                                        getParameters().getCopyVolumeType(),
+                                        
ImagesHandler.getVolumeFormatForDomain(getParameters().getVolumeFormat(), 
getParameters().getVolumeType(), getParameters().getStorageDomainId()),
+                                        getParameters().getVolumeType(),
+                                        isWipeAfterDelete(),
+                                        getParameters().getForceOverride())));
+            } else {
+                vdsReturnValue = runVdsCommand(
+                        VDSCommandType.MoveImageGroup,
+                        PostZeroHandler.fixParametersWithPostZero(
+                                new MoveImageGroupVDSCommandParameters(
+                                        getDiskImage() != null ? 
getDiskImage().getStoragePoolId()
+                                                : 
getStorageDomain().getStoragePoolId(),
+                                        sourceDomainId,
+                                        getDiskImage() != null ?
+                                                getDiskImage().getId() : 
getParameters().getImageGroupID(),
+                                        getParameters().getStorageDomainId(),
+                                        getParameters().getContainerId(),
+                                        ImageOperation.Copy,
+                                        isWipeAfterDelete(),
+                                        getParameters().getForceOverride())));
+            }
+
+            if (vdsReturnValue.getSucceeded()) {
+                AsyncTaskCreationInfo taskCreationInfo = 
vdsReturnValue.getCreationInfo();
+                getReturnValue().getInternalVdsmTaskIdList().add(
+                        createTask(taskId,
+                                taskCreationInfo,
+                                getParameters().getParentCommand(),
+                                VdcObjectType.Storage,
+                                sourceDomainId,
+                                getParameters().getStorageDomainId()));
+            }
+
+            return vdsReturnValue.getSucceeded();
+        } else {
+            if (getParameters().getUseCopyCollapse()) {
+                return 
executeCoCoCommandSyncWithTasksContext(VdcActionType.CloneImageGroupVolumesWithCollapse,
+                        new CloneImageGroupVolumesWithCollapseCommandParameters
+                                (getStorageDomain().getStoragePoolId(),
+                                        null,
+                                        sourceDomainId,
+                                        getParameters().getImageGroupID(),
+                                        getParameters().getImageId(),
+                                        getParameters().getStorageDomainId(),
+                                        getParameters().getDestImageGroupId(),
+                                        
getParameters().getDestinationImageId(),
+                                        getActionType(),
+                                        getParameters())).getSucceeded();
+
+            } else {
+                return 
executeCoCoCommandSyncWithTasksContext(VdcActionType.CloneImageGroupVolumes,
+                        new CloneImageGroupVolumesCommandParameters
+                                (getStorageDomain().getStoragePoolId(),
+                                        sourceDomainId,
+                                        getParameters().getImageGroupID(),
+                                        getParameters().getStorageDomainId(),
+                                        getParameters().getDestImageGroupId(),
+                                        getActionType(),
+                                        getParameters())).getSucceeded();
+            }
         }
     }
-
     /**
      * Shareable disk which shared between more then one VM, will be returned 
more then once when fetching the images by image group
      * since it has multiple VM devices (one for each VM it is attached to) 
and not because he has snapshots,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
index 4583ff6..3ad9aa8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateAllSnapshotsFromVmCommand.java
@@ -262,7 +262,7 @@
                             "Failed to create snapshot!");
                 }
             } else {
-                
executeCommandCoordinatorCommandSync(VdcActionType.CreateSnapshot, 
buildCreateSnapshotParameters(image));
+                
executeCoCoCommandSyncWithTasksContext(VdcActionType.CreateSnapshot, 
buildCreateSnapshotParameters(image));
             }
         }
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
index 90a0d0f..5d8f170 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
@@ -6,7 +6,9 @@
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.storage.PostZeroHandler;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.common.VdcObjectType;
+import 
org.ovirt.engine.core.common.action.CloneImageGroupVolumesWithCollapseCommandParameters;
 import org.ovirt.engine.core.common.action.CreateImageTemplateParameters;
 import org.ovirt.engine.core.common.action.RemoveImageParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
@@ -37,8 +39,19 @@
     }
 
     @Override
+    public CommandCallBack getCallBack() {
+        if (isDataCenterWithoutSpm()){
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
+
+        return null;
+    }
+
+    @Override
     protected void insertAsyncTaskPlaceHolders() {
-        persistAsyncTaskPlaceHolder(VdcActionType.AddVmTemplate);
+        if (isDataCenterWithSpm()) {
+            persistAsyncTaskPlaceHolder(VdcActionType.AddVmTemplate);
+        }
     }
 
     @Override
@@ -59,21 +72,35 @@
         VolumeFormat targetFormat = 
getTargetVolumeFormat(newImage.getVolumeFormat(), newImage.getVolumeType(),
                 getParameters().getDestinationStorageDomainId());
 
-        VDSReturnValue vdsReturnValue = runVdsCommand(VDSCommandType.CopyImage,
-                PostZeroHandler.fixParametersWithPostZero(
-                        new CopyImageVDSCommandParameters(storagePoolId, 
getParameters().getStorageDomainId(),
-                                getParameters().getVmId(), imageGroupId, 
snapshotId, destinationImageGroupID,
-                                getDestinationImageId(), 
StringUtils.defaultString(newImage.getDescription()),
-                                
getParameters().getDestinationStorageDomainId(), CopyVolumeType.SharedVol,
-                                targetFormat, newImage.getVolumeType(), 
getDiskImage().isWipeAfterDelete(), false)));
+        if (isDataCenterWithSpm()) {
+            VDSReturnValue vdsReturnValue = 
runVdsCommand(VDSCommandType.CopyImage,
+                    PostZeroHandler.fixParametersWithPostZero(
+                            new CopyImageVDSCommandParameters(storagePoolId, 
getParameters().getStorageDomainId(),
+                                    getParameters().getVmId(), imageGroupId, 
snapshotId, destinationImageGroupID,
+                                    getDestinationImageId(), 
StringUtils.defaultString(newImage.getDescription()),
+                                    
getParameters().getDestinationStorageDomainId(), CopyVolumeType.SharedVol,
+                                    targetFormat, newImage.getVolumeType(), 
getDiskImage().isWipeAfterDelete(), false)));
 
-        getReturnValue().getInternalVdsmTaskIdList().add(
-                createTask(taskId,
-                        vdsReturnValue.getCreationInfo(),
-                        VdcActionType.AddVmTemplate,
-                        VdcObjectType.Storage,
-                        getParameters().getStorageDomainId(),
-                        getParameters().getDestinationStorageDomainId()));
+            getReturnValue().getInternalVdsmTaskIdList().add(
+                    createTask(taskId,
+                            vdsReturnValue.getCreationInfo(),
+                            VdcActionType.AddVmTemplate,
+                            VdcObjectType.Storage,
+                            getParameters().getStorageDomainId(),
+                            getParameters().getDestinationStorageDomainId()));
+        } else {
+            
executeCoCoCommandSyncWithTasksContext(VdcActionType.CloneImageGroupVolumesWithCollapse,
+                    new 
CloneImageGroupVolumesWithCollapseCommandParameters(storagePoolId,
+                            null,
+                            getParameters().getStorageDomainId(),
+                            imageGroupId,
+                            snapshotId,
+                            getParameters().getDestinationStorageDomainId(),
+                            destinationImageGroupID,
+                            getDestinationImageId(),
+                            getActionType(),
+                            getParameters()));
+        }
 
         newImage.setId(destinationImageGroupID);
         newImage.setDiskAlias(getParameters().getDiskAlias() != null ?
@@ -138,7 +165,11 @@
 
     @Override
     protected AsyncTaskType getTaskType() {
-        return AsyncTaskType.copyImage;
+        if (isDataCenterWithSpm()) {
+            return AsyncTaskType.copyImage;
+        }
+
+        return super.getTaskType();
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
index 3868a5c..eef142c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
@@ -129,9 +129,15 @@
                 vdsReturnValue =
                         runVdsCommand(
                                 VDSCommandType.CreateVolumeContainer,
-                                new 
CreateVolumeVDSCommandParameters(getStoragePoolId(), 
getDestinationStorageDomainId(),
-                                        getImageGroupId(), 
getDiskImage().getSize(), newDiskImage.getVolumeType(), 
newDiskImage.getVolumeFormat(),
-                                        getDestinationImageId(), "", 
getImageGroupId(), getImage().getImageId()));
+                                new 
CreateVolumeVDSCommandParameters(getStoragePoolId(),
+                                        getDestinationStorageDomainId(),
+                                        getImageGroupId(),
+                                        getDiskImage().getSize(),
+                                        newDiskImage.getVolumeFormat(),
+                                        getDestinationImageId(),
+                                        "",
+                                        getImageGroupId(),
+                                        getImage().getImageId()));
             }
         } catch (Exception e) {
             log.error("Failed creating snapshot from image id '{}'", 
getImage().getImageId());
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntitiesPollingCallback.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntitiesPollingCallback.java
index 14bb2ab..42a787c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntitiesPollingCallback.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntitiesPollingCallback.java
@@ -17,23 +17,26 @@
 
     @Override
     public void doPolling(Guid cmdId, List<Guid> childCmdIds) {
-        CommandExecutionStatus status = 
CommandCoordinatorUtil.getCommandExecutionStatus(cmdId);
+        CommandExecutionStatus commandExecutionStatus = 
CommandCoordinatorUtil.getCommandExecutionStatus(cmdId);
+        CommandStatus commandStatus = 
CommandCoordinatorUtil.getCommandStatus(cmdId);
         // TODO: should be removed when doPolloing will be moved to run only 
after execute finish - here for test purpose only.
-        if (status != CommandExecutionStatus.EXECUTED &&
-                CommandCoordinatorUtil.getCommandStatus(cmdId) == 
CommandStatus.ACTIVE) {
+        if (commandExecutionStatus != CommandExecutionStatus.EXECUTED &&
+                commandStatus == CommandStatus.ACTIVE) {
             return;
         }
 
         EntityPollingCommand entityPollingCommand = getCommand(cmdId);
-        CommandBase<?> command = (CommandBase<?>)entityPollingCommand;
+        CommandBase<?> command = (CommandBase<?>) entityPollingCommand;
+        if (commandStatus == commandStatus.ACTIVE) {
+            CommandStatus pollingStatus = entityPollingCommand.poll();
 
-        CommandStatus commandStatus = entityPollingCommand.poll();
+            if (pollingStatus == null) {
+                return;
+            }
 
-        if (commandStatus == null) {
-            return;
+            command.setCommandStatus(pollingStatus);
         }
 
-        command.setCommandStatus(commandStatus);
         log.info("Polling ended on entites of '{}' (id : '{}'), status '{}'", 
command.getActionType(), cmdId, command.getCommandStatus());
     }
 
@@ -43,8 +46,8 @@
 
     private void endAction(Guid cmdId, List<Guid> childCmdIds) {
         CommandBase<?> commandBase = (CommandBase<?>)getCommand(cmdId);
-        commandBase.endAction();
         if (commandBase.getParameters().getParentCommand() == 
VdcActionType.Unknown) {
+            commandBase.endAction();
             CommandCoordinatorUtil.removeAllCommandsInHierarchy(cmdId);
         }
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java
index b1630fa..d63502c7 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ExportVmCommand.java
@@ -21,7 +21,6 @@
 import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.bll.validator.VmValidator;
 import org.ovirt.engine.core.common.AuditLogType;
-import org.ovirt.engine.core.common.FeatureSupported;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.LockProperties;
 import org.ovirt.engine.core.common.action.LockProperties.Scope;
@@ -395,24 +394,11 @@
         return params;
     }
 
-    private boolean isDataCenterWithoutSpm() {
-        return 
FeatureSupported.dataCenterWithoutSpm(getStoragePool().getcompatibility_version());
-    }
-
-    public VdcActionType getActionTypeForOperation() {
-        if (isDataCenterWithoutSpm()) {
-            return VdcActionType.CloneImageGroupVolumes;
-        }
-
-        return VdcActionType.CopyImageGroup;
-    }
-
-
     @Override
     protected void moveOrCopyAllImageGroups(Guid containerID, 
Iterable<DiskImage> disks) {
         for (DiskImage disk : disks) {
             VdcReturnValueBase vdcRetValue = 
runChildActionWithTasksContextIfNeeded(
-                    getActionTypeForOperation(),
+                    VdcActionType.CopyImageGroup,
                     buildMoveOrCopyImageGroupParametersForDisk(containerID, 
disk));
             if (!vdcRetValue.getSucceeded()) {
                 throw new VdcBLLException(vdcRetValue.getFault().getError(), 
"Failed during ExportVmCommand");
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
index 9b269e6..3f15df8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImagesHandler.java
@@ -850,4 +850,24 @@
         
dummy.getSnapshots().addAll(ImagesHandler.getAllImageSnapshots(dummy.getImageId()));
         return dummy;
     }
+
+    /**
+     * Since we are supporting copy/move operations between different storage 
families (file/block) we have to
+     * predetermine the volume format according to the destination storage 
type, for block domains we cannot use sparse
+     * combined with raw so we will change the raw to cow in that case, file 
domains will have the original format
+     * retained
+     */
+    public static VolumeFormat getVolumeFormatForDomain(VolumeFormat 
volumeFormat, VolumeType volumeType, Guid dstDomain) {
+        if (volumeFormat == VolumeFormat.COW) {
+            return VolumeFormat.COW;
+        }
+
+        StorageDomainStatic destDomain = 
DbFacade.getInstance().getStorageDomainStaticDao().get(dstDomain);
+        if (destDomain.getStorageType().isBlockDomain() && volumeType == 
VolumeType.Sparse) {
+            return VolumeFormat.COW;
+        }
+        else {
+            return VolumeFormat.RAW;
+        }
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
index c4da09c..9fbdb38 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyDiskCommand.java
@@ -13,6 +13,7 @@
 import org.ovirt.engine.core.bll.quota.QuotaConsumptionParameter;
 import org.ovirt.engine.core.bll.quota.QuotaStorageConsumptionParameter;
 import org.ovirt.engine.core.bll.quota.QuotaStorageDependent;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.validator.DiskValidator;
 import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
@@ -39,7 +40,7 @@
 import org.ovirt.engine.core.dao.VmDeviceDAO;
 
 @DisableInPrepareMode
-@NonTransactiveCommandAttribute
+@NonTransactiveCommandAttribute(forceCompensation = true)
 public class MoveOrCopyDiskCommand<T extends MoveOrCopyImageGroupParameters> 
extends CopyImageGroupCommand<T>
         implements QuotaStorageDependent {
 
@@ -207,6 +208,15 @@
         return 
validate(createDiskValidator().isDiskPluggedToVmsThatAreNotDown(false, 
getVmsWithVmDeviceInfoForDiskId()));
     }
 
+    @Override
+    public CommandCallBack getCallBack() {
+        if (isDataCenterWithoutSpm()){
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
+
+        return null;
+    }
+
     /**
      * Cache method to retrieve all the VMs with the device info related to 
the image
      */
@@ -244,12 +254,19 @@
         return VdcActionType.CopyImageGroup;
     }
 
+    protected VdcReturnValueBase performOperation() {
+        if (isDataCenterWithSpm()) {
+            return runInternalActionWithTasksContext(
+                    getImagesActionType(),
+                    createChildParameters());
+        } else {
+            return 
executeCoCoCommandSyncWithTasksContext(getImagesActionType(), 
createChildParameters());
+        }
+    }
+
     @Override
     protected void executeCommand() {
-        overrideParameters();
-        VdcReturnValueBase vdcRetValue = runInternalActionWithTasksContext(
-                getImagesActionType(),
-                getParameters());
+        VdcReturnValueBase vdcRetValue = performOperation();
         if (!vdcRetValue.getSucceeded()) {
             setSucceeded(false);
             getReturnValue().setFault(vdcRetValue.getFault());
@@ -260,10 +277,12 @@
     }
 
     private void endCommandActions() {
-        getBackend().endAction(getImagesActionType(),
-                getParameters(),
-                
getContext().clone().withoutCompensationContext().withoutLock());
-        setSucceeded(true);
+        if (!getParameters().getImagesParameters().isEmpty()) {
+            getBackend().endAction(getImagesActionType(),
+                    getParameters().getImagesParameters().get(0),
+                    
getContext().clone().withoutCompensationContext().withoutLock());
+            setSucceeded(true);
+        }
     }
 
     @Override
@@ -328,6 +347,7 @@
      * correct values for these scenario in order to be used at parent class
      */
     private void overrideParameters() {
+
         if (getParameters().getOperation() == ImageOperation.Copy) {
             getParameters().setUseCopyCollapse(true);
             getParameters().setAddImageDomainMapping(true);
@@ -345,6 +365,28 @@
         getParameters().setDiskProfileId(getImage().getDiskProfileId());
     }
 
+    private MoveOrCopyImageGroupParameters createChildParameters() {
+        MoveOrCopyImageGroupParameters params = new 
MoveOrCopyImageGroupParameters();
+        if (getParameters().getOperation() == ImageOperation.Copy) {
+            params.setUseCopyCollapse(true);
+            params.setAddImageDomainMapping(true);
+        } else {
+            params.setUseCopyCollapse(false);
+        }
+        params.setStorageDomainId(getParameters().getStorageDomainId());
+        params.setDestinationImageId(getImageId());
+        params.setImageGroupID(getImageGroupId());
+        params.setImageId(getParameters().getImageId());
+        params.setDestImageGroupId(getImageGroupId());
+        params.setVolumeFormat(getDiskImage().getVolumeFormat());
+        params.setVolumeType(getDiskImage().getVolumeType());
+        params.setCopyVolumeType(CopyVolumeType.SharedVol);
+        params.setParentCommand(getActionType());
+        params.setParentParameters(getParameters());
+        params.setDiskProfileId(getImage().getDiskProfileId());
+        return params;
+    }
+
     /**
      * The following method will determine if a provided vm/template exists
      * @return
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java
index 544ea2f..cd0c3ad 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddVmTemplateParameters.java
@@ -24,6 +24,7 @@
         templateType = VmEntityType.TEMPLATE;
     }
 
+    private Guid vmId;
     private VmStatic _masterVm;
     private Guid privateVmTemplateID;
     private Guid destinationStorageDomainId;
@@ -171,4 +172,11 @@
         this.baseTemplateId = baseTemplateId;
     }
 
+    public Guid getVmId() {
+        return vmId;
+    }
+
+    public void setVmId(Guid vmId) {
+        this.vmId = vmId;
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java
index 1b96e8c..26b6b1c 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesCommandParameters.java
@@ -4,16 +4,30 @@
 
 import org.ovirt.engine.core.compat.Guid;
 
-public class CloneImageGroupVolumesCommandParameters extends 
ImagesContainterParametersBase {
+public class CloneImageGroupVolumesCommandParameters extends 
StoragePoolParametersBase {
     private List<Guid> imageIds;
     private Guid destDomain;
     private Guid srcDomain;
-
-    public CloneImageGroupVolumesCommandParameters(List<Guid> images) {
-        this.imageIds = images;
-    }
+    private Guid srcImageGroupId;
+    private Guid dstImageGroupId;
 
     public CloneImageGroupVolumesCommandParameters() {
+    }
+
+    public CloneImageGroupVolumesCommandParameters(Guid storagePoolId,
+            Guid srcDomain,
+            Guid srcImageGroupId,
+            Guid destDomain,
+            Guid dstImageGroupId,
+            VdcActionType parentType,
+            VdcActionParametersBase parentParams) {
+        super(storagePoolId, null);
+        this.destDomain = destDomain;
+        this.srcDomain = srcDomain;
+        this.srcImageGroupId = srcImageGroupId;
+        this.dstImageGroupId = dstImageGroupId;
+        setParentCommand(parentType);
+        setParentParameters(parentParams);
     }
 
     public List<Guid> getImageIds() {
@@ -39,4 +53,20 @@
     public void setSrcDomain(Guid srcDomain) {
         this.srcDomain = srcDomain;
     }
+
+    public Guid getSrcImageGroupId() {
+        return srcImageGroupId;
+    }
+
+    public void setSrcImageGroupId(Guid srcImageGroupId) {
+        this.srcImageGroupId = srcImageGroupId;
+    }
+
+    public Guid getDstImageGroupId() {
+        return dstImageGroupId;
+    }
+
+    public void setDstImageGroupId(Guid dstImageGroupId) {
+        this.dstImageGroupId = dstImageGroupId;
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesWithCollapseCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesWithCollapseCommandParameters.java
new file mode 100644
index 0000000..a688b83
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CloneImageGroupVolumesWithCollapseCommandParameters.java
@@ -0,0 +1,84 @@
+package org.ovirt.engine.core.common.action;
+
+import org.ovirt.engine.core.compat.Guid;
+
+public class CloneImageGroupVolumesWithCollapseCommandParameters extends 
StoragePoolParametersBase {
+    private Guid destDomain;
+    private Guid srcDomain;
+    private Guid srcImageGroupId;
+    private Guid srcImageId;
+    private Guid dstImageGroupId;
+    private Guid dstImageId;
+
+    public CloneImageGroupVolumesWithCollapseCommandParameters(Guid 
storagePoolId,
+            Guid vdsId,
+            Guid srcDomain,
+            Guid srcImageGroupId,
+            Guid srcImageId,
+            Guid destDomain,
+            Guid dstImageGroupId,
+            Guid dstImageId,
+            VdcActionType parentCommand,
+            VdcActionParametersBase parentParmaters) {
+        super(storagePoolId, vdsId);
+        this.destDomain = destDomain;
+        this.srcDomain = srcDomain;
+        this.srcImageGroupId = srcImageGroupId;
+        this.srcImageId = srcImageId;
+        this.dstImageGroupId = dstImageGroupId;
+        this.dstImageId = dstImageId;
+        setParentParameters(parentParmaters);
+        setParentCommand(parentCommand);
+    }
+
+    public Guid getDestDomain() {
+        return destDomain;
+    }
+
+    public void setDestDomain(Guid destDomain) {
+        this.destDomain = destDomain;
+    }
+
+    public Guid getSrcDomain() {
+        return srcDomain;
+    }
+
+    public void setSrcDomain(Guid srcDomain) {
+        this.srcDomain = srcDomain;
+    }
+
+    public Guid getSrcImageGroupId() {
+        return srcImageGroupId;
+    }
+
+    public void setSrcImageGroupId(Guid srcImageGroupId) {
+        this.srcImageGroupId = srcImageGroupId;
+    }
+
+    public Guid getDstImageGroupId() {
+        return dstImageGroupId;
+    }
+
+    public void setDstImageGroupId(Guid dstImageGroupId) {
+        this.dstImageGroupId = dstImageGroupId;
+    }
+
+    public Guid getDstImageId() {
+        return dstImageId;
+    }
+
+    public void setDstImageId(Guid dstImageId) {
+        this.dstImageId = dstImageId;
+    }
+
+    public Guid getSrcImageId() {
+        return srcImageId;
+    }
+
+    public void setSrcImageId(Guid srcImageId) {
+        this.srcImageId = srcImageId;
+    }
+
+    public CloneImageGroupVolumesWithCollapseCommandParameters() {
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
index 8c7717b..29a07cc4 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ImagesActionsParametersBase.java
@@ -40,7 +40,7 @@
     /**
      * Needed in order to be able to deserialize this field.
      */
-    protected void setImageId(Guid imageId) {
+    public void setImageId(Guid imageId) {
         this.imageId = imageId;
     }
 
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
index 1fb7abb..da28982 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
@@ -267,7 +267,7 @@
     SyncLunsInfoForBlockStorageDomain(1018, false, QuotaDependency.NONE),
     CloneImageGroupVolume(1019, QuotaDependency.STORAGE),
     CloneImageGroupVolumes(1020, QuotaDependency.STORAGE),
-    CloneImageGroups(1021, QuotaDependency.STORAGE),
+    CloneImageGroupVolumesWithCollapse(1021, QuotaDependency.STORAGE),
 
     // Event Notification
     AddEventSubscription(1100, false, QuotaDependency.NONE),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/LeaseState.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/LeaseState.java
index 4a51f01..b672d3f 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/LeaseState.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/LeaseState.java
@@ -1,5 +1,5 @@
 package org.ovirt.engine.core.common.businessentities;
 
 public enum LeaseState {
-    FREE, HELD, UNCHECKED;
+    FREE, HELD, UNCHECKED, LeaseState;
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java
index 30277ac..0f11d2b 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/CreateVolumeVDSCommandParameters.java
@@ -1,24 +1,21 @@
 package org.ovirt.engine.core.common.vdscommands;
 
 import org.ovirt.engine.core.common.businessentities.VolumeFormat;
-import org.ovirt.engine.core.common.businessentities.VolumeType;
 import org.ovirt.engine.core.compat.Guid;
 
 public class CreateVolumeVDSCommandParameters extends 
StorageDomainVdsCommandParameters {
 
     private long imageSizeInBytes;
-    private VolumeType imageType;
     private Guid newImageID;
     private Guid srcVolume;
     private Guid srcImageGroupId;
     private Guid imageGroupId;
 
     public CreateVolumeVDSCommandParameters(Guid storagePoolId, Guid 
storageDomainId, Guid imageGroupId,
-            long imageSizeInBytes, VolumeType imageType, VolumeFormat 
volFormat, Guid newImageId,
+            long imageSizeInBytes, VolumeFormat volFormat, Guid newImageId,
             String newImageDescription, Guid srcImageGroupId, Guid srcVolume) {
         super(storagePoolId, storageDomainId, null);
         this.imageSizeInBytes = imageSizeInBytes;
-        this.imageType = imageType;
         this.setVolumeFormat(volFormat);
         this.setImageGroupId(imageGroupId);
         setStoragePoolGuid(storagePoolId);
@@ -30,10 +27,6 @@
 
     public long getImageSizeInBytes() {
         return imageSizeInBytes;
-    }
-
-    public VolumeType getImageType() {
-        return imageType;
     }
 
     private VolumeFormat privateVolumeFormat;
@@ -66,10 +59,6 @@
 
     public void setImageSizeInBytes(long imageSizeInBytes) {
         this.imageSizeInBytes = imageSizeInBytes;
-    }
-
-    public void setImageType(VolumeType imageType) {
-        this.imageType = imageType;
     }
 
     public Guid getSrcVolume() {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/GetImageInfoVDSCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/GetImageInfoVDSCommandParameters.java
index 61014ab..78ea3a5 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/GetImageInfoVDSCommandParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/GetImageInfoVDSCommandParameters.java
@@ -9,8 +9,8 @@
     public GetImageInfoVDSCommandParameters() {
     }
 
-    public GetImageInfoVDSCommandParameters(Guid storagePoolId, Guid 
storageDomainId, Guid vdsId, Guid imageGroupId, Guid imageId) {
-        super(storagePoolId, storageDomainId, vdsId);
+    public GetImageInfoVDSCommandParameters(Guid storagePoolId, Guid 
storageDomainId, Guid imageGroupId, Guid imageId) {
+        super(storagePoolId, storageDomainId, null);
         this.imageGroupId = imageGroupId;
         this.imageId = imageId;
     }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java
index 8610263..c5c0591 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/StorageDomainVdsCommandParameters.java
@@ -26,6 +26,7 @@
         super(vdsId);
         this.storagePoolId = storagePoolId;
         this.storageDomainId = storageDomainId;
+        setStoragePoolGuid(storagePoolId);
     }
 
     public StorageDomainVdsCommandParameters() {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
index d1121ee..1d7f53d 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
@@ -59,7 +59,7 @@
     CopyVolumeData("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     AllocateVolume("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     DestroyImage("org.ovirt.engine.core.vdsbroker.irsbroker"),
-    GetImageInfo("org.ovirt.engine.core.vdsbroker.irsbroker"),
+    GetImageInfo("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     SetVolumeDescription("org.ovirt.engine.core.vdsbroker.irsbroker"),
     DoesImageExist("org.ovirt.engine.core.vdsbroker.irsbroker"),
     CopyImage("org.ovirt.engine.core.vdsbroker.irsbroker"),
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/DoesImageExistVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/DoesImageExistVDSCommand.java
index 3d3f22c..d5314b7 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/DoesImageExistVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/DoesImageExistVDSCommand.java
@@ -14,7 +14,7 @@
     }
 
     @Override
-    protected void executeIrsBrokerCommand() {
+    protected void executeVdsBrokerCommand() {
         imageInfoReturn = 
getBroker().getVolumeInfo(getParameters().getStorageDomainId().toString(),
                 getParameters().getStoragePoolId().toString(), 
getParameters().getImageGroupId().toString(),
                 getParameters().getImageId().toString());
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
index 56cef81..57b7d5d 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/jsonrpc/JsonRpcIIrsServer.java
@@ -9,14 +9,13 @@
 import org.ovirt.engine.core.vdsbroker.irsbroker.IIrsServer;
 import org.ovirt.engine.core.vdsbroker.irsbroker.ImagesListReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.irsbroker.IrsStatsAndStatusXmlRpc;
-import org.ovirt.engine.core.vdsbroker.irsbroker.OneImageInfoReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.irsbroker.StoragePoolInfoReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.irsbroker.StorageStatusReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.irsbroker.UUIDListReturnForXmlRpc;
+import org.ovirt.engine.core.vdsbroker.irsbroker.VolumeListReturnForXmlRpc;
 import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusOnlyReturnForXmlRpc;
 import 
org.ovirt.engine.core.vdsbroker.vdsbroker.StorageDomainListReturnForXmlRpc;
-import org.ovirt.engine.core.vdsbroker.irsbroker.VolumeListReturnForXmlRpc;
 import org.ovirt.vdsm.jsonrpc.client.JsonRpcClient;
 import org.ovirt.vdsm.jsonrpc.client.JsonRpcRequest;
 import org.ovirt.vdsm.jsonrpc.client.RequestBuilder;
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java
index d2f0205..32d23e5 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/CopyVolumeDataVDSCommand.java
@@ -5,7 +5,6 @@
 import org.ovirt.engine.core.common.businessentities.LocationInfo;
 import org.ovirt.engine.core.common.utils.LocationInfoHelper;
 import 
org.ovirt.engine.core.common.vdscommands.CopyVolumeDataVDSCommandParameters;
-import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturnForXmlRpc;
 
 public class CopyVolumeDataVDSCommand<P extends 
CopyVolumeDataVDSCommandParameters> extends VdsBrokerCommand<P> {
     public CopyVolumeDataVDSCommand(P parameters) {
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/GetImageInfoVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/GetImageInfoVDSCommand.java
index 5ba4498..ea5a418 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/GetImageInfoVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/GetImageInfoVDSCommand.java
@@ -13,17 +13,12 @@
 import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import org.ovirt.engine.core.common.utils.EnumUtils;
 import 
org.ovirt.engine.core.common.vdscommands.GetImageInfoVDSCommandParameters;
-import 
org.ovirt.engine.core.common.vdscommands.GetVolumeInfoVDSCommandParameters;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
-import org.ovirt.engine.core.vdsbroker.irsbroker.IRSErrorException;
-import org.ovirt.engine.core.vdsbroker.irsbroker.IrsBrokerCommand;
 import org.ovirt.engine.core.vdsbroker.irsbroker.IrsProperties;
 import org.ovirt.engine.core.vdsbroker.irsbroker.OneImageInfoReturnForXmlRpc;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
-public class GetImageInfoVDSCommand<P extends 
GetVolumeInfoVDSCommandParameters> extends VdsBrokerCommand<P> {
+public class GetImageInfoVDSCommand<P extends 
GetImageInfoVDSCommandParameters> extends VdsBrokerCommand<P> {
 
 
     protected OneImageInfoReturnForXmlRpc imageInfoReturn;


-- 
To view, visit https://gerrit.ovirt.org/39210
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I85ddaf7abb736d6298be7f5e358d52cf2e5a48cb
Gerrit-PatchSet: 2
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Liron Aravot <lara...@redhat.com>
Gerrit-Reviewer: automat...@ovirt.org
Gerrit-Reviewer: oVirt Jenkins CI Server
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to