Liron Aravot has uploaded a new change for review.

Change subject: tmp4
......................................................................

tmp4

Change-Id: Ia0bfedbec4f181afdab91801c2abecde3fb2206e
Signed-off-by: [email protected] <[email protected]>
---
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/AddVmFromTemplateCommand.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/BaseImagesCommand.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/CreateAllSnapshotsFromVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.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/ProcessOvfUpdateForStorageDomainCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java
15 files changed, 237 insertions(+), 119 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/23/39323/1

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 d1623e9..2340495 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
@@ -1082,7 +1082,7 @@
     public AuditLogType getAuditLogTypeValue() {
         switch (getActionState()) {
         case EXECUTE:
-            return getSucceeded() ? 
(!getReturnValue().getVdsmTaskIdList().isEmpty() ? 
AuditLogType.USER_ADD_VM_STARTED
+            return getSucceeded() ? (!noAsyncOperations() ? 
AuditLogType.USER_ADD_VM_STARTED
                     : AuditLogType.USER_ADD_VM) : 
AuditLogType.USER_FAILED_ADD_VM;
 
         case END_SUCCESS:
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
index b6db61c3..c5a6b11 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmFromTemplateCommand.java
@@ -61,7 +61,7 @@
         
getVm().getStaticData().setQuotaId(getParameters().getVmStaticData().getQuotaId());
         
DbFacade.getInstance().getVmStaticDao().update(getVm().getStaticData());
         // if there are no tasks, we can end the command right away.
-        if (getTaskIdList().isEmpty()) {
+        if (noAsyncOperations()) {
             endSuccessfully();
         }
         checkTrustedService();
@@ -97,7 +97,7 @@
             }
             VmHandler.lockVm(getVm().getDynamicData(), 
getCompensationContext());
             for (DiskImage disk : 
getVmTemplate().getDiskTemplateMap().values()) {
-                VdcReturnValueBase result = runInternalActionWithTasksContext(
+                VdcReturnValueBase result = 
runChildActionWithTasksContextIfNeeded(
                         VdcActionType.CreateCloneOfTemplate,
                         buildCreateCloneOfTemplateParameters(disk)
                 );
@@ -125,6 +125,7 @@
         params.setParentCommand(VdcActionType.AddVmFromTemplate);
         params.setParentParameters(getParameters());
         params.setEntityInfo(getParameters().getEntityInfo());
+        params.setStoragePoolId(getStoragePoolId());
         
params.setQuotaId(diskInfoDestinationMap.get(disk.getId()).getQuotaId() != null 
?
                 diskInfoDestinationMap.get(disk.getId()).getQuotaId() : null);
         
params.setDiskProfileId(diskInfoDestinationMap.get(disk.getId()).getDiskProfileId());
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 69f658f..747f9db 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
@@ -330,7 +330,7 @@
 
         // means that there are no asynchronous tasks to execute and that we 
can
         // end the command synchronously
-        pendingAsyncTasks = !getReturnValue().getVdsmTaskIdList().isEmpty() || 
(isDataCenterWithoutSpm() && 
!CommandCoordinatorUtil.getChildCommandIds(getCommandId()).isEmpty());
+        pendingAsyncTasks = !noAsyncOperations();
         if (!pendingAsyncTasks) {
             endSuccessfullySynchronous();
         }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java
index 8eb7a5c..a4bb4c0 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/BaseImagesCommand.java
@@ -24,7 +24,6 @@
 import org.ovirt.engine.core.common.utils.Pair;
 import 
org.ovirt.engine.core.common.vdscommands.GetImageInfoVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
-import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.dao.BaseDiskDao;
@@ -129,7 +128,7 @@
         }
     }
 
-    protected VDSReturnValue performImageVdsmOperation() {
+    protected boolean performImageVdsmOperation() {
         throw new NotImplementedException();
     }
 
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 91b08a4..9126cdac 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
@@ -2367,7 +2367,7 @@
         if (isDataCenterWithSpm()) {
             return runInternalActionWithTasksContext(actionType, parameters, 
null);
         } else {
-            return executeCoCoCommandSync(actionType, parameters, null);
+            return executeCoCoCommandSyncWithTasksContext(actionType, 
parameters, null);
         }
     }
 
@@ -2407,4 +2407,8 @@
     protected MacPoolManagerStrategy getMacPool() {
         return 
MacPoolPerDcSingleton.getInstance().poolForDataCenter(getStoragePoolId());
     }
+
+    protected boolean noAsyncOperations() {
+        return isDataCenterWithSpm() ? 
getReturnValue().getVdsmTaskIdList().isEmpty() : 
CommandCoordinatorUtil.getChildCommandIds(getCommandId()).isEmpty();
+    }
 }
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 3ad9aa8..8ba772c 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
@@ -203,7 +203,7 @@
         fastForwardDisksToActiveSnapshot();
         memoryImageBuilder.build();
 
-        if (getTaskIdList().isEmpty()) {
+        if (noAsyncOperations()) {
             getParameters().setTaskGroupSuccess(true);
             incrementVmGeneration();
         }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
index 5dfda31..fb24e35 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateCloneOfTemplateCommand.java
@@ -5,7 +5,9 @@
 
 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.CreateCloneOfTemplateParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
@@ -45,45 +47,68 @@
     }
 
     @Override
-    protected VDSReturnValue performImageVdsmOperation() {
+    public CommandCallBack getCallBack() {
+        if (isDataCenterWithoutSpm()){
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
+
+        return null;
+    }
+
+    @Override
+    protected boolean performImageVdsmOperation() {
         setDestinationImageId(Guid.newGuid());
         newDiskImage = cloneDiskImage(getDestinationImageId());
         newDiskImage.setId(Guid.newGuid());
         Guid storagePoolID = newDiskImage.getStoragePoolId() != null ? 
newDiskImage
                 .getStoragePoolId() : Guid.Empty;
 
-        VDSReturnValue vdsReturnValue = null;
-        Guid taskId = 
persistAsyncTaskPlaceHolder(VdcActionType.AddVmFromTemplate);
-        try {
-            vdsReturnValue = runVdsCommand(VDSCommandType.CopyImage,
-                    PostZeroHandler.fixParametersWithPostZero(
-                            new CopyImageVDSCommandParameters(storagePoolID, 
getParameters().getStorageDomainId(),
-                                    getVmTemplateId(), getDiskImage().getId(), 
getImage().getImageId(),
-                                    newDiskImage.getId(), 
getDestinationImageId(),
-                                    "", getDestinationStorageDomainId(), 
CopyVolumeType.LeafVol,
-                                    newDiskImage.getVolumeFormat(), 
newDiskImage.getVolumeType(),
-                                    getDiskImage().isWipeAfterDelete(), 
false)));
+        if (isDataCenterWithSpm()) {
+            try {
+                Guid taskId = 
persistAsyncTaskPlaceHolder(VdcActionType.AddVmFromTemplate);
+                VDSReturnValue vdsReturnValue = 
runVdsCommand(VDSCommandType.CopyImage,
+                        PostZeroHandler.fixParametersWithPostZero(
+                                new 
CopyImageVDSCommandParameters(storagePoolID, 
getParameters().getStorageDomainId(),
+                                        getVmTemplateId(), 
getDiskImage().getId(), getImage().getImageId(),
+                                        newDiskImage.getId(), 
getDestinationImageId(),
+                                        "", getDestinationStorageDomainId(), 
CopyVolumeType.LeafVol,
+                                        newDiskImage.getVolumeFormat(), 
newDiskImage.getVolumeType(),
+                                        getDiskImage().isWipeAfterDelete(), 
false)));
 
-        } catch (VdcBLLException e) {
-            log.error("Failed creating snapshot from image id '{}'", 
getImage().getImageId());
-            throw e;
+                if (vdsReturnValue.getSucceeded()) {
+                    getReturnValue().getInternalVdsmTaskIdList().add(
+                            createTask(taskId,
+                                    vdsReturnValue.getCreationInfo(),
+                                    VdcActionType.AddVmFromTemplate,
+                                    VdcObjectType.Storage,
+                                    getParameters().getStorageDomainId(),
+                                    getDestinationStorageDomainId()));
+                }
+
+                vdsReturnValue.getSucceeded();
+
+            } catch (VdcBLLException e) {
+                log.error("Failed creating snapshot from image id '{}'", 
getImage().getImageId());
+                throw e;
+            }
+
+            return false;
+        } else {
+            return 
executeCoCoCommandSyncWithTasksContext(VdcActionType.CloneImageGroupVolumesWithCollapse,
+                    new 
CloneImageGroupVolumesWithCollapseCommandParameters(storagePoolID, null,
+                            getParameters().getStorageDomainId(), 
getDiskImage().getId(), getImage().getImageId(),
+                            getDestinationStorageDomainId(),
+                            newDiskImage.getId(), getDestinationImageId(),
+                            getActionType(), getParameters())).getSucceeded();
         }
-
-        if (vdsReturnValue.getSucceeded()) {
-            getReturnValue().getInternalVdsmTaskIdList().add(
-                    createTask(taskId,
-                            vdsReturnValue.getCreationInfo(),
-                            VdcActionType.AddVmFromTemplate,
-                            VdcObjectType.Storage,
-                            getParameters().getStorageDomainId(),
-                            getDestinationStorageDomainId()));
-        }
-
-        return vdsReturnValue;
     }
 
     @Override
     protected AsyncTaskType getTaskType() {
-        return AsyncTaskType.copyImage;
+        if (isDataCenterWithSpm()) {
+            return AsyncTaskType.copyImage;
+        }
+
+        return super.getTaskType();
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java
index e6df962..16507a1 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfStoresForStorageDomainCommand.java
@@ -3,6 +3,8 @@
 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.AuditLogType;
 import org.ovirt.engine.core.common.action.AddImageFromScratchParameters;
@@ -32,15 +34,28 @@
     }
 
     @Override
+    public CommandCallBack getCallBack() {
+        if (isDataCenterWithoutSpm()) {
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
+
+        return super.getCallBack();
+    }
+
+    @Override
     protected void executeCommand() {
         for (int i = 0; i < getParameters().getStoresCount(); i++) {
             CreateOvfVolumeForStorageDomainCommandParameters parameters = 
createCreateOvfVolumeForStorageDomainParams();
 
-            VdcReturnValueBase vdcReturnValueBase =
-                    
runInternalAction(VdcActionType.CreateOvfVolumeForStorageDomain,
-                            parameters);
+            if (isDataCenterWithSpm()) {
+                VdcReturnValueBase vdcReturnValueBase =
+                        
runInternalAction(VdcActionType.CreateOvfVolumeForStorageDomain,
+                                parameters);
 
-            
getReturnValue().getInternalVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList());
+                
getReturnValue().getInternalVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList());
+            } else {
+                
CommandCoordinatorUtil.executeAsyncCommand(VdcActionType.CreateOvfVolumeForStorageDomain,
 parameters, getContext().clone());
+            }
         }
 
         setSucceeded(true);
@@ -91,11 +106,11 @@
             }
         }
 
-        // if we'd have the possibility to know whether we failed because of 
failure to acquire locks as there's an
-        // update in progress, we could
-        // try again (avoid setSucceeded(true) in that scenario).
-        VdcReturnValueBase returnValue = 
runInternalActionWithTasksContext(VdcActionType.ProcessOvfUpdateForStorageDomain,
 createProcessOvfUpdateForDomainParams(), null);
-        
getReturnValue().getInternalVdsmTaskIdList().addAll(returnValue.getInternalVdsmTaskIdList());
+//        // if we'd have the possibility to know whether we failed because of 
failure to acquire locks as there's an
+//        // update in progress, we could
+//        // try again (avoid setSucceeded(true) in that scenario).
+//        VdcReturnValueBase returnValue = 
runInternalActionWithTasksContext(VdcActionType.ProcessOvfUpdateForStorageDomain,
 createProcessOvfUpdateForDomainParams(), null);
+//        
getReturnValue().getInternalVdsmTaskIdList().addAll(returnValue.getInternalVdsmTaskIdList());
 
         setSucceeded(true);
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java
index 639cec5..5536c20 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateOvfVolumeForStorageDomainCommand.java
@@ -6,6 +6,7 @@
 
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.action.AddDiskParameters;
 import 
org.ovirt.engine.core.common.action.CreateOvfVolumeForStorageDomainCommandParameters;
@@ -38,7 +39,15 @@
     }
 
     @Override
+    public CommandCallBack getCallBack() {
+        if (isDataCenterWithoutSpm()) {
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
 
+        return super.getCallBack();
+    }
+
+    @Override
     protected void executeCommand() {
         AddDiskParameters diskParameters = new AddDiskParameters(null, 
createDisk(getStorageDomainId()));
         diskParameters.setStorageDomainId(getStorageDomainId());
@@ -47,7 +56,7 @@
         diskParameters.setShouldRemainIllegalOnFailedExecution(true);
         
diskParameters.setSkipDomainCheck(getParameters().isSkipDomainChecks());
         VdcReturnValueBase vdcReturnValueBase =
-                runInternalActionWithTasksContext(VdcActionType.AddDisk, 
diskParameters);
+                runChildActionWithTasksContextIfNeeded(VdcActionType.AddDisk, 
diskParameters);
         Guid createdId = (Guid)vdcReturnValueBase.getActionReturnValue();
 
         if (createdId != null) {
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 eef142c..8626d3d 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
@@ -53,8 +53,8 @@
     @Override
     protected void executeCommand() {
         if (canCreateSnapshot()) {
-            VDSReturnValue vdsReturnValue = performImageVdsmOperation();
-            if (vdsReturnValue != null && vdsReturnValue.getSucceeded()) {
+             boolean succeeded = performImageVdsmOperation();
+            if (succeeded) {
                 TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
                     @Override
                     public Void runInTransaction() {
@@ -77,7 +77,7 @@
     }
 
     @Override
-    protected VDSReturnValue performImageVdsmOperation() {
+    protected boolean performImageVdsmOperation() {
         setDestinationImageId(Guid.newGuid());
         newDiskImage = cloneDiskImage(getDestinationImageId());
         newDiskImage.setStorageIds(new 
ArrayList<Guid>(Arrays.asList(getDestinationStorageDomainId())));
@@ -146,7 +146,7 @@
             throw new VdcBLLException(VdcBllErrors.VolumeCreationError);
         }
 
-        return vdsReturnValue;
+        return vdsReturnValue.getSucceeded();
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProcessOvfUpdateForStorageDomainCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProcessOvfUpdateForStorageDomainCommand.java
index e861033..a6dba74 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProcessOvfUpdateForStorageDomainCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ProcessOvfUpdateForStorageDomainCommand.java
@@ -19,6 +19,7 @@
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.common.AuditLogType;
 import 
org.ovirt.engine.core.common.action.CreateOvfStoresForStorageDomainCommandParameters;
@@ -53,7 +54,7 @@
 
 @InternalCommandAttribute
 @NonTransactiveCommandAttribute
-public class ProcessOvfUpdateForStorageDomainCommand<T extends 
ProcessOvfUpdateForStorageDomainCommandParameters> extends 
StorageDomainCommandBase<T> {
+public class ProcessOvfUpdateForStorageDomainCommand<T extends 
ProcessOvfUpdateForStorageDomainCommandParameters> extends 
StorageDomainCommandBase<T> implements SerialChildExecutingCommand {
     private LinkedList<Pair<StorageDomainOvfInfo, DiskImage>> 
domainOvfStoresInfoForUpdate = new LinkedList<>();
     private StorageDomain storageDomain;
     private int ovfDiskCount;
@@ -77,15 +78,19 @@
     }
 
     @Override
+    public CommandCallBack getCallBack() {
+        return new SerialChildCommandsExecutionCallback();
+    }
+
+    @Override
     protected LockProperties applyLockProperties(LockProperties 
lockProperties) {
         return lockProperties.withScope(Scope.Execution);
     }
 
     @Override
     protected boolean canDoAction() {
-        loadStorageDomain();
         if (!getParameters().isSkipDomainChecks()) {
-            StorageDomainValidator storageDomainValidator = new 
StorageDomainValidator(storageDomain);
+            StorageDomainValidator storageDomainValidator = new 
StorageDomainValidator(getStorageDomain());
             if (!validate(storageDomainValidator.isDomainExistAndActive())) {
                 return false;
             }
@@ -121,12 +126,6 @@
                 domainOvfStoresInfoForUpdate.add(new 
Pair(storageDomainOvfInfo, ovfDisk));
             }
         }
-    }
-
-    private void loadStorageDomain() {
-        storageDomain =
-                
getDbFacade().getStorageDomainDao().getForStoragePool(getParameters().getStorageDomainId(),
-                        getParameters().getStoragePoolId());
     }
 
     private String getPostUpdateOvfStoreDescription(long size) {
@@ -260,7 +259,7 @@
         if (!failedOvfDisks.isEmpty()) {
             AuditLogableBase auditLogableBase = new AuditLogableBase();
             auditLogableBase.addCustomValue("DataCenterName", 
getStoragePool().getName());
-            auditLogableBase.addCustomValue("StorageDomainName", 
storageDomain.getName());
+            auditLogableBase.addCustomValue("StorageDomainName", 
getStorageDomain().getName());
             auditLogableBase.addCustomValue("DisksIds", 
StringUtils.join(failedOvfDisks, ", "));
             AuditLogDirector.log(auditLogableBase, 
AuditLogType.UPDATE_FOR_OVF_STORES_FAILED);
         }
@@ -339,28 +338,64 @@
         return false;
     }
 
+    private int getMissingDiskCount() {
+        return Config.<Integer> 
getValue(ConfigValues.StorageDomainOvfStoreCount) - ovfDiskCount;
+    }
+
     @Override
     protected void executeCommand() {
-        int missingDiskCount = Config.<Integer> 
getValue(ConfigValues.StorageDomainOvfStoreCount) - ovfDiskCount;
+//        int missingDiskCount = getMissingDiskCount();
+//
+//        if (missingDiskCount > 0) {
+//            CreateOvfStoresForStorageDomainCommandParameters parameters = 
new 
CreateOvfStoresForStorageDomainCommandParameters(getParameters().getStoragePoolId(),
+//            getParameters().getStorageDomainId(), missingDiskCount);
+//            
parameters.setParentParameters(getParameters().getParentParameters());
+//            parameters.setParentCommand(getParameters().getParentCommand());
+//            
parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks());
+//            VdcReturnValueBase returnValueBase = 
runChildActionWithTasksContextIfNeeded(VdcActionType.CreateOvfStoresForStorageDomain,
+//                    parameters);
+//            if (hasParentCommand()) {
+//                
getReturnValue().getInternalVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList());
+//            } else {
+//                
getReturnValue().getVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList());
+//            }
+//        } else {
+//            updateOvfStoreContent();
+//        }
 
-        if (missingDiskCount > 0) {
-            CreateOvfStoresForStorageDomainCommandParameters parameters = new 
CreateOvfStoresForStorageDomainCommandParameters(getParameters().getStoragePoolId(),
-            getParameters().getStorageDomainId(), missingDiskCount);
-            
parameters.setParentParameters(getParameters().getParentParameters());
-            parameters.setParentCommand(getParameters().getParentCommand());
-            
parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks());
-            VdcReturnValueBase returnValueBase = 
runInternalActionWithTasksContext(VdcActionType.CreateOvfStoresForStorageDomain,
-                    parameters);
-            if (hasParentCommand()) {
-                
getReturnValue().getInternalVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList());
-            } else {
-                
getReturnValue().getVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList());
-            }
+        if (getMissingDiskCount() == 0) {
+            getParameters().setChildCount(1);
         } else {
-            updateOvfStoreContent();
+            getParameters().setChildCount(2);
         }
 
+        persistCommand(getParameters().getParentCommand());
+
         setSucceeded(true);
+    }
+
+    public void createOvfStoreDisks(int missingDiskCount) {
+        CreateOvfStoresForStorageDomainCommandParameters parameters = new 
CreateOvfStoresForStorageDomainCommandParameters(getParameters().getStoragePoolId(),
+                getParameters().getStorageDomainId(), missingDiskCount);
+        parameters.setParentParameters(getParameters());
+        parameters.setParentCommand(getActionType());
+        parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks());
+        VdcReturnValueBase returnValueBase = 
runChildActionWithTasksContextIfNeeded(VdcActionType.CreateOvfStoresForStorageDomain,
+                parameters);
+        if (hasParentCommand()) {
+            
getReturnValue().getInternalVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList());
+        } else {
+            
getReturnValue().getVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList());
+        }
+    }
+
+    @Override
+    public void performNextOperation(int completedChildCount) {
+        if (completedChildCount == 0) {
+            createOvfStoreDisks(getMissingDiskCount());
+            return;
+        }
+        updateOvfStoreContent();
     }
 
     protected Set<Guid> buildFilesForOvfs(List<Pair<Guid, String>> ovfs, 
InMemoryTar inMemoryTar) throws Exception {
@@ -426,4 +461,9 @@
 
         return super.getAuditLogTypeValue();
     }
+
+    @Override
+    public int getChildCount() {
+        return getParameters().getChildCount();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
index 9c6c14f..7b03c78 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveImageCommand.java
@@ -72,32 +72,7 @@
     @Override
     protected void executeCommand() {
         if (getDiskImage() != null) {
-            try {
-                Guid taskId = 
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
-
-                VDSReturnValue vdsReturnValue = performImageVdsmOperation();
-                getReturnValue().getInternalVdsmTaskIdList().add(
-                        createTask(taskId,
-                                vdsReturnValue.getCreationInfo(),
-                                getParameters().getParentCommand(),
-                                VdcObjectType.Storage,
-                                getStorageDomainId()));
-            } catch (VdcBLLException e) {
-                if (e.getErrorCode() == 
VdcBllErrors.ImageDoesNotExistInDomainError) {
-                    log.info("Disk '{}' doesn't exist on storage domain '{}', 
rolling forward",
-                            getDiskImage().getId(), getStorageDomainId());
-                }
-                // VDSM renames the image before deleting it, so technically 
the image doesn't exist after renaming,
-                // but the actual delete can still fail with ImageDeleteError.
-                // In this case, Engine has to check whether image still 
exists on the storage or not.
-                else if (e.getErrorCode() == VdcBllErrors.ImageDeleteError && 
isImageRemovedFromStorage()) {
-                    log.info("Disk '{}' was deleted from storage domain '{}'", 
getDiskImage().getId(),
-                            getStorageDomainId());
-                } else {
-                    throw e;
-                }
-            }
-
+            performImageVdsmOperation();
             if (getParameters().getParentCommand() != 
VdcActionType.RemoveVmFromImportExport
                     && getParameters().getParentCommand() != 
VdcActionType.RemoveVmTemplateFromImportExport) {
                 performImageDbOperations();
@@ -288,20 +263,49 @@
     }
 
     @Override
-    protected VDSReturnValue performImageVdsmOperation() {
-        if (getParameters().isShouldLockImage()) {
-            // the image status should be set to ILLEGAL, so that in case 
compensation runs the image status will
-            // be revert to be ILLEGAL, as we can't tell whether the task 
started on vdsm side or not.
-            
ImagesHandler.updateAllDiskImageSnapshotsStatusWithCompensation(getRelevantDiskImage().getId(),
-                    ImageStatus.LOCKED,
-                    ImageStatus.ILLEGAL,
-                    getCompensationContext());
+    protected boolean performImageVdsmOperation() {
+        try {
+            Guid taskId = 
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+
+            if (getParameters().isShouldLockImage()) {
+                // the image status should be set to ILLEGAL, so that in case 
compensation runs the image status will
+                // be revert to be ILLEGAL, as we can't tell whether the task 
started on vdsm side or not.
+                
ImagesHandler.updateAllDiskImageSnapshotsStatusWithCompensation(getRelevantDiskImage().getId(),
+                        ImageStatus.LOCKED,
+                        ImageStatus.ILLEGAL,
+                        getCompensationContext());
+            }
+            VDSReturnValue vdsReturnValue = 
runVdsCommand(VDSCommandType.DeleteImageGroup,
+                    PostZeroHandler.fixParametersWithPostZero(
+                            new 
DeleteImageGroupVDSCommandParameters(getDiskImage().getStoragePoolId(),
+                                    getStorageDomainId(), 
getDiskImage().getId(),
+                                    getDiskImage().isWipeAfterDelete(), 
getParameters().getForceDelete())));
+
+            getReturnValue().getInternalVdsmTaskIdList().add(
+                    createTask(taskId,
+                            vdsReturnValue.getCreationInfo(),
+                            getParameters().getParentCommand(),
+                            VdcObjectType.Storage,
+                            getStorageDomainId()));
+
+            return true;
+        } catch (VdcBLLException e) {
+            if (e.getErrorCode() == 
VdcBllErrors.ImageDoesNotExistInDomainError) {
+                log.info("Disk '{}' doesn't exist on storage domain '{}', 
rolling forward",
+                        getDiskImage().getId(), getStorageDomainId());
+            }
+            // VDSM renames the image before deleting it, so technically the 
image doesn't exist after renaming,
+            // but the actual delete can still fail with ImageDeleteError.
+            // In this case, Engine has to check whether image still exists on 
the storage or not.
+            else if (e.getErrorCode() == VdcBllErrors.ImageDeleteError && 
isImageRemovedFromStorage()) {
+                log.info("Disk '{}' was deleted from storage domain '{}'", 
getDiskImage().getId(),
+                        getStorageDomainId());
+            } else {
+                throw e;
+            }
         }
-        return runVdsCommand(VDSCommandType.DeleteImageGroup,
-                PostZeroHandler.fixParametersWithPostZero(
-                        new 
DeleteImageGroupVDSCommandParameters(getDiskImage().getStoragePoolId(),
-                                getStorageDomainId(), getDiskImage().getId(),
-                                getDiskImage().isWipeAfterDelete(), 
getParameters().getForceDelete())));
+
+        return false;
     }
 
     protected VmDeviceDAO getVmDeviceDAO() {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
index 8c9107e..1edb8da 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RestoreFromSnapshotCommand.java
@@ -59,8 +59,7 @@
             break;
         }
 
-        VDSReturnValue vdsReturnValue = performImageVdsmOperation();
-        return vdsReturnValue != null && vdsReturnValue.getSucceeded();
+        return performImageVdsmOperation();
     }
 
     @Override
@@ -89,7 +88,7 @@
     }
 
     @Override
-    protected VDSReturnValue performImageVdsmOperation() {
+    protected boolean performImageVdsmOperation() {
         VDSReturnValue vdsReturnValue = null;
         try {
             Guid storagePoolId = getDiskImage().getStoragePoolId() != null ? 
getDiskImage().getStoragePoolId()
@@ -116,6 +115,8 @@
                                 VdcObjectType.Storage,
                                 storageDomainId));
             }
+
+            return vdsReturnValue.getSucceeded();
         }
         // Don't throw an exception when cannot destroy image in the VDSM.
         catch (VdcBLLException e) {
@@ -123,6 +124,7 @@
             getReturnValue().setFault(new VdcFault(e, 
e.getVdsError().getCode()));
             log.info("Image '{}' not exist in Irs", 
getDiskImage().getImageId());
         }
-        return vdsReturnValue;
+
+        return false;
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
index 0e9432a..403fa60 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TryBackToAllSnapshotsOfVmCommand.java
@@ -12,6 +12,7 @@
 import org.ovirt.engine.core.bll.snapshots.SnapshotsManager;
 import org.ovirt.engine.core.bll.snapshots.SnapshotsValidator;
 import org.ovirt.engine.core.bll.storage.StoragePoolValidator;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.bll.validator.DiskImagesValidator;
 import org.ovirt.engine.core.bll.validator.DiskSnapshotsValidator;
 import org.ovirt.engine.core.bll.validator.MultipleStorageDomainsValidator;
@@ -58,6 +59,14 @@
 
     public TryBackToAllSnapshotsOfVmCommand(T parameters) {
         this(parameters, null);
+    }
+
+    public CommandCallBack getCallBack() {
+        if (!isDataCenterWithSpm()) {
+            return new ConcurrentChildCommandsExecutionCallback();
+        }
+
+        return null;
     }
 
     public TryBackToAllSnapshotsOfVmCommand(T parameters, CommandContext 
commandContext) {
@@ -185,7 +194,7 @@
                 public Void runInTransaction() {
                     for (DiskImage image : filteredImages) {
                         VdcReturnValueBase vdcReturnValue =
-                                
runInternalActionWithTasksContext(VdcActionType.TryBackToSnapshot,
+                                
runChildActionWithTasksContextIfNeeded(VdcActionType.TryBackToSnapshot,
                                         
buildTryBackToSnapshotParameters(newActiveSnapshotId, image));
 
                         if (vdcReturnValue.getSucceeded()) {
@@ -210,6 +219,7 @@
                     params.setEntityInfo(getParameters().getEntityInfo());
                     params.setParentParameters(getParameters());
                     params.setQuotaId(image.getQuotaId());
+                    params.setStoragePoolId(getStoragePoolId());
                     return params;
                 }
             });
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java
index e8b8405..a1b348e 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/ProcessOvfUpdateForStorageDomainCommandParameters.java
@@ -4,6 +4,7 @@
 
 public class ProcessOvfUpdateForStorageDomainCommandParameters extends 
StorageDomainParametersBase {
     private boolean skipDomainChecks;
+    private int childCount;
 
     public ProcessOvfUpdateForStorageDomainCommandParameters() {
         super();
@@ -20,4 +21,12 @@
     public void setSkipDomainChecks(boolean skipDomainChecks) {
         this.skipDomainChecks = skipDomainChecks;
     }
+
+    public int getChildCount() {
+        return childCount;
+    }
+
+    public void setChildCount(int childCount) {
+        this.childCount = childCount;
+    }
 }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia0bfedbec4f181afdab91801c2abecde3fb2206e
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Liron Aravot <[email protected]>
Gerrit-Reviewer: [email protected]
Gerrit-Reviewer: oVirt Jenkins CI Server
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to