Liron Aravot has uploaded a new change for review.

Change subject: tmp
......................................................................

tmp

Change-Id: I5b5bb672c5027c262619691007593a16875024aa
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/CloneImageGroupVolumesCommand.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/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/ImageSpmCommand.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/SerialChildCommandsExecutionCallback.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildExecutingCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TempParentCommandForTasksCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/TempParentCommandForTasksParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java
20 files changed, 441 insertions(+), 248 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/42/39542/1

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 3be8467..2e37fff 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
@@ -427,13 +427,20 @@
         
parameters.setShouldRemainIllegalOnFailedExecution(getParameters().isShouldRemainIllegalOnFailedExecution());
         parameters.setStorageDomainId(getStorageDomainId());
 
-        if (isExecutedAsChildCommand()) {
-            parameters.setParentCommand(getParameters().getParentCommand());
-            
parameters.setParentParameters(getParameters().getParentParameters());
-        } else {
-            parameters.setParentCommand(VdcActionType.AddDisk);
-            parameters.setParentParameters(getParameters());
-        }
+        // used as child command only from createOvfStore flow- commenting as 
it's unneeded there now
+        // setting the parent as the ovf store command will lead to it's 
endAction to be called on tasks scenario
+        // and to the addImageFromScratch command to be inspected as child 
command of the grandpa command on callback use scenario.
+
+//        if (isExecutedAsChildCommand()) {
+//            parameters.setParentCommand(getParameters().getParentCommand());
+//            
parameters.setParentParameters(getParameters().getParentParameters());
+//        } else {
+//            parameters.setParentCommand(VdcActionType.AddDisk);
+//            parameters.setParentParameters(getParameters());
+//        }
+
+        parameters.setParentCommand(VdcActionType.AddDisk);
+        parameters.setParentParameters(getParameters());
 
         parameters.setEntityInfo(getParameters().getEntityInfo());
         parameters.setStoragePoolId(getStorageDomain().getStoragePoolId());
@@ -462,8 +469,11 @@
                     
runInternalActionWithTasksContext(VdcActionType.AddImageFromScratch,
                             parameters,
                             getLock());
-            ArrayList<Guid> taskList = isExecutedAsChildCommand() ? 
getReturnValue().getInternalVdsmTaskIdList() : 
getReturnValue().getVdsmTaskIdList();
-            taskList.addAll(tmpRetValue.getInternalVdsmTaskIdList());
+
+            // TODO: RELATED TO PREVIOUS COMMENT ON STOP USING 
isExecutedAsChildCommand()
+//            ArrayList<Guid> taskList = isExecutedAsChildCommand() ? 
getReturnValue().getInternalVdsmTaskIdList() : 
getReturnValue().getVdsmTaskIdList();
+//            taskList.addAll(tmpRetValue.getInternalVdsmTaskIdList());
+            
getReturnValue().getVdsmTaskIdList().addAll(tmpRetValue.getInternalVdsmTaskIdList());
         } else {
             tmpRetValue = 
executeCoCoCommandSyncWithTasksContext(VdcActionType.AddImageFromScratch, 
parameters);
         }
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 aeab32b..b3e412c 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
@@ -34,10 +34,6 @@
     }
 
     @Override
-    protected void insertAsyncTaskPlaceHolders() {
-    }
-
-    @Override
     protected AsyncTaskType getTaskType() {
         if (isDataCenterWithoutSpm()) {
             return AsyncTaskType.notSupported;
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 63dcd5d..f215820 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
@@ -57,7 +57,7 @@
     }
 
     @Override
-    public void performNextOperation(int completedChildren) {
+    public boolean performNextOperation(int completedChildren) {
         Guid imageId = getParameters().getImageIds().get(completedChildren);
         log.info("Starting child command {} of {}, image '{}'",
                 completedChildren + 1, getParameters().getImageIds().size(), 
imageId);
@@ -69,6 +69,8 @@
                 VdcActionType.CloneImageGroupVolume,
                 parameters,
                 cloneContextAndDetachFromParent());
+
+        return true;
     }
 
     @Override
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 9126cdac..7cdcd1b 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
@@ -581,8 +581,10 @@
             List<VdcActionParametersBase> parameters = new LinkedList<>();
             for (Guid id : childCommands) {
                 CommandBase<?> command = 
CommandCoordinatorUtil.retrieveCommand(id);
-                
command.getParameters().setCommandType(command.getActionType());
-                parameters.add(command.getParameters());
+                if (command.getParameters().isShouldBeEndedByParent()) {
+                    
command.getParameters().setCommandType(command.getActionType());
+                    parameters.add(command.getParameters());
+                }
             }
 
             commandBase.getParameters().setImagesParameters(parameters);
@@ -1393,8 +1395,9 @@
                     startPollingAsyncTasks();
                 }
             } finally {
-                if (!hasTasks() && 
!ExecutionHandler.checkIfJobHasTasks(getExecutionContext())) {
+                if (getCallBack() == null && !hasTasks() && 
!ExecutionHandler.checkIfJobHasTasks(getExecutionContext())) {
                     ExecutionHandler.endJob(getExecutionContext(), 
getSucceeded());
+                    setCommandStatus(getSucceeded() ? CommandStatus.SUCCEEDED 
: CommandStatus.FAILED);
                 }
             }
         }
@@ -1935,8 +1938,8 @@
     }
 
     private void freeLockExecute() {
-        if (releaseLocksAtEndOfExecute || !getSucceeded() ||
-                (!hasTasks() && !(this instanceof IVdsAsyncCommand))) {
+        if ((releaseLocksAtEndOfExecute || !getSucceeded() ||
+                (!hasTasks() && !(this instanceof IVdsAsyncCommand))) && 
CommandCoordinatorUtil.getChildCommandIds(getCommandId()).isEmpty()) {
             freeLock();
         }
     }
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 1497b6c..8a95255 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
@@ -55,10 +55,12 @@
 
         boolean anyFailed = false;
         for (Guid childCmdId : childCmdIds) {
+            //extended logging
+            CommandBase<?> child = getCommand(childCmdId);
             switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) {
                 case NOT_STARTED:
                 case ACTIVE:
-                    log.info("Waiting on child command '{}' of '{}' (id: '{}') 
to complete", childCmdId, command.getActionType(), cmdId);
+                    log.info("Waiting on child command id: '{}' type:'{}' of 
'{}' (id: '{}') to complete", childCmdId, child.getActionType(), 
command.getActionType(), cmdId);
                     return;
                 case FAILED:
                 case FAILED_RESTARTED:
@@ -70,7 +72,7 @@
                     if (cmdEntity.isCallBackNotified() || 
!cmdEntity.isCallBackEnabled()) {
                         break;
                     } else {
-                        log.info("Waiting on child command '{}' of '{}' (id: 
'{}') to complete", childCmdId, command.getActionType(), cmdId);
+                        log.info("Waiting on child command id: '{}' type:'{}' 
of '{}' (id: '{}') to complete", childCmdId, child.getActionType(), 
command.getActionType(), cmdId);
                         return;
                     }
             }
@@ -78,7 +80,8 @@
 
         command.getParameters().setTaskGroupSuccess(!anyFailed && status == 
CommandExecutionStatus.EXECUTED);
         command.setCommandStatus(command.getParameters().getTaskGroupSuccess() 
? CommandStatus.SUCCEEDED : CommandStatus.FAILED);
-        log.info("All executed child commands of '{}' (id : '{}') have been 
completed, status '{}'", command.getActionType(), cmdId, 
command.getCommandStatus());
+        log.info("Command '{}' id: '{}' child commands '{}' executions were 
completed, status '{}'",
+                command.getActionType(), cmdId, childCmdIds, 
command.getCommandStatus());
     }
 
     private CommandBase<?> getCommand(Guid cmdId) {
@@ -113,15 +116,21 @@
 //            //parameters.add(new Pair<>(command.getActionType(), 
command.getParameters()));
 //        }
 
-        //TODO: handle case of grandpa command
+        //TODO: handle case of grandpa command - in case of grandpa command 
with the tasks framework,
+        // we get to the end method of the grandpa command with the parameters 
of the "leaf" command (the task creating command)
+         // and end it from the grandpa (skipping the command in the middle). 
we can imitate this behavior in the command base by setting to the image 
parameters
+         // the parameters of the "leaf" commands. as there are almost no 
scenarios like that - i prefer to fix them at the moment when using the task 
framework to
+         // use coco instead - if needed this change can be made in 
commandbase.
 //        commandBase.getParameters().setCocoChildCommands(parameters);
 
-        if (commandBase.getParameters().getParentCommand() == 
VdcActionType.Unknown) {
+        if (commandBase.getParameters().getParentCommand() == 
VdcActionType.Unknown || 
!commandBase.getParameters().isShouldBeEndedByParent()) {
             //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());
+            if (commandBase.getParameters().getParentCommand() == 
VdcActionType.Unknown) {
+                
CommandCoordinatorUtil.removeAllCommandsInHierarchy(commandBase.getCommandId());
+            }
         }
     }
 
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 16507a1..2ab352c 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
@@ -10,7 +10,6 @@
 import org.ovirt.engine.core.common.action.AddImageFromScratchParameters;
 import 
org.ovirt.engine.core.common.action.CreateOvfStoresForStorageDomainCommandParameters;
 import 
org.ovirt.engine.core.common.action.CreateOvfVolumeForStorageDomainCommandParameters;
-import 
org.ovirt.engine.core.common.action.ProcessOvfUpdateForStorageDomainCommandParameters;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
@@ -115,25 +114,20 @@
         setSucceeded(true);
     }
 
-    private ProcessOvfUpdateForStorageDomainCommandParameters 
createProcessOvfUpdateForDomainParams() {
-        ProcessOvfUpdateForStorageDomainCommandParameters params = new 
ProcessOvfUpdateForStorageDomainCommandParameters(getParameters().getStoragePoolId(),
 getParameters().getStorageDomainId());
-        params.setSkipDomainChecks(getParameters().isSkipDomainChecks());
-        params.setParentCommand(getParameters().getParentCommand());
-        params.setParentParameters(getParameters().getParentParameters());
-        return params;
-    }
-
     public CreateOvfVolumeForStorageDomainCommandParameters 
createCreateOvfVolumeForStorageDomainParams() {
         CreateOvfVolumeForStorageDomainCommandParameters parameters = new 
CreateOvfVolumeForStorageDomainCommandParameters(getParameters().getStoragePoolId(),
                 getParameters().getStorageDomainId());
         parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks());
-        if (hasParentCommand()) {
-            parameters.setParentCommand(getParameters().getParentCommand());
-            
parameters.setParentParameters(getParameters().getParentParameters());
-        } else {
-            parameters.setParentCommand(getActionType());
-            parameters.setParentParameters(getParameters());
-        }
+//        if (hasParentCommand()) {
+//            parameters.setParentCommand(getParameters().getParentCommand());
+//            
parameters.setParentParameters(getParameters().getParentParameters());
+//        } else {
+//            parameters.setParentCommand(getActionType());
+//            parameters.setParentParameters(getParameters());
+//        }
+
+        parameters.setParentCommand(getActionType());
+        parameters.setParentParameters(getParameters());
 
         return parameters;
     }
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 5536c20..88f8629 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
@@ -3,9 +3,11 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
 
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.storage.StorageDomainCommandBase;
+import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
 import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.action.AddDiskParameters;
@@ -20,6 +22,7 @@
 import org.ovirt.engine.core.common.businessentities.VolumeFormat;
 import org.ovirt.engine.core.common.businessentities.VolumeType;
 import org.ovirt.engine.core.common.utils.SizeConverter;
+import org.ovirt.engine.core.compat.CommandStatus;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
 import org.ovirt.engine.core.dao.StorageDomainOvfInfoDao;
@@ -40,26 +43,27 @@
 
     @Override
     public CommandCallBack getCallBack() {
-        if (isDataCenterWithoutSpm()) {
-            return new ConcurrentChildCommandsExecutionCallback();
-        }
-
-        return super.getCallBack();
+        return new ConcurrentChildCommandsExecutionCallback();
     }
 
     @Override
     protected void executeCommand() {
         AddDiskParameters diskParameters = new AddDiskParameters(null, 
createDisk(getStorageDomainId()));
         diskParameters.setStorageDomainId(getStorageDomainId());
-        diskParameters.setParentCommand(getParameters().getParentCommand());
-        
diskParameters.setParentParameters(getParameters().getParentParameters());
+//        diskParameters.setParentCommand(getParameters().getParentCommand());
+//        
diskParameters.setParentParameters(getParameters().getParentParameters());
+        diskParameters.setParentCommand(getActionType());
+        diskParameters.setParentParameters(getParameters());
+        diskParameters.setShouldBeEndedByParent(false);
         diskParameters.setShouldRemainIllegalOnFailedExecution(true);
         
diskParameters.setSkipDomainCheck(getParameters().isSkipDomainChecks());
         VdcReturnValueBase vdcReturnValueBase =
-                runChildActionWithTasksContextIfNeeded(VdcActionType.AddDisk, 
diskParameters);
+                executeCoCoCommandSync(VdcActionType.AddDisk, diskParameters);
         Guid createdId = (Guid)vdcReturnValueBase.getActionReturnValue();
 
         if (createdId != null) {
+            getParameters().setCreatedDiskId(createdId);
+            persistCommand(getParameters().getParentCommand(), true);
             addStorageDomainOvfInfoToDb(createdId);
         }
 
@@ -110,4 +114,42 @@
     protected StorageDomainOvfInfoDao getStorageDomainOvfInfoDao() {
         return getDbFacade().getStorageDomainOvfInfoDao();
     }
+
+    @Override
+    protected void endSuccessfully() {
+        endCommandOperations();
+    }
+
+    @Override
+    protected void endWithFailure() {
+        endCommandOperations();
+    }
+
+    private void endCommandOperations() {
+        if (getParameters().getCreatedDiskId() == null) {
+            return;
+        }
+        Guid diskId = getParameters().getCreatedDiskId();
+        List<Guid> childCmdIds = 
CommandCoordinatorUtil.getChildCommandIds(getCommandId());
+        boolean childCmdSuccess = !childCmdIds.isEmpty() ? 
CommandCoordinatorUtil.getCommandStatus(childCmdIds.get(0)) == 
CommandStatus.SUCCEEDED : false;
+
+        if (childCmdSuccess) {
+            StorageDomainOvfInfo storageDomainOvfInfoDb =
+                    getStorageDomainOvfInfoDao()
+                            .get(diskId);
+
+            if (storageDomainOvfInfoDb == null
+                    || storageDomainOvfInfoDb.getStatus() != 
StorageDomainOvfInfoStatus.DISABLED) {
+                return;
+            }
+
+            
storageDomainOvfInfoDb.setStatus(StorageDomainOvfInfoStatus.OUTDATED);
+            getStorageDomainOvfInfoDao().update(storageDomainOvfInfoDb);
+        } else {
+            addCustomValue("DiskId", diskId.toString());
+            AuditLogDirector.log(this, 
AuditLogType.CREATE_OVF_STORE_FOR_STORAGE_DOMAIN_FAILED);
+        }
+
+        setSucceeded(true);
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImageSpmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImageSpmCommand.java
index fd63cee..da6da52 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImageSpmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImageSpmCommand.java
@@ -29,11 +29,6 @@
         return lockProperties.withScope(Scope.Execution);
     }
 
-    @Override
-    protected void insertAsyncTaskPlaceHolders() {
-        persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
-    }
-
     private Guid getPoolSpmId() {
         if (cachedSpmId == null) {
             cachedSpmId = getStoragePool().getspm_vds_id();
@@ -79,16 +74,27 @@
 
     @Override
     protected void executeCommand() {
+        if (isDataCenterWithSpm()) {
+            persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+        }
         VDSReturnValue vdsReturnValue = executeVdsCommand();
 
         if (vdsReturnValue.getSucceeded()) {
-            Guid taskId = getAsyncTaskId();
-            getReturnValue().getInternalVdsmTaskIdList().add(createTask(taskId,
-                    vdsReturnValue.getCreationInfo(),
-                    getParameters().getParentCommand(),
-                    VdcObjectType.Storage,
-                    getParameters().getStorageDomainId(),
-                    getParameters().getDestinationImageId()));
+            if (isDataCenterWithSpm()) {
+                Guid taskId = getAsyncTaskId();
+//                getReturnValue().getVdsmTaskIdList().add(createTask(taskId,
+//                        vdsReturnValue.getCreationInfo(),
+//                        getActionType(),
+//                        VdcObjectType.Storage,
+//                        getParameters().getStorageDomainId(),
+//                        getParameters().getDestinationImageId()));
+                
getReturnValue().getInternalVdsmTaskIdList().add(createTask(taskId,
+                        vdsReturnValue.getCreationInfo(),
+                        getParameters().getParentCommand(),
+                        VdcObjectType.Storage,
+                        getParameters().getStorageDomainId(),
+                        getParameters().getDestinationImageId()));
+            }
 
             setSucceeded(true);
         }
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 a6dba74..ca0ea19 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,13 +19,15 @@
 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.CommandCoordinatorUtil;
 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;
+import 
org.ovirt.engine.core.common.action.CreateOvfVolumeForStorageDomainCommandParameters;
 import org.ovirt.engine.core.common.action.LockProperties;
 import org.ovirt.engine.core.common.action.LockProperties.Scope;
 import 
org.ovirt.engine.core.common.action.ProcessOvfUpdateForStorageDomainCommandParameters;
+import org.ovirt.engine.core.common.action.TempParentCommandForTasksParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.businessentities.DiskImage;
@@ -61,6 +63,7 @@
     private String postUpdateDescription;
     private Date updateDate;
     private List<Guid> failedOvfDisks;
+    private Integer missingDiskCount;
 
     public ProcessOvfUpdateForStorageDomainCommand(T parameters) {
         this(parameters, null);
@@ -79,12 +82,16 @@
 
     @Override
     public CommandCallBack getCallBack() {
-        return new SerialChildCommandsExecutionCallback();
+        if (getMissingDiskCount() > 0) {
+            return new SerialChildCommandsExecutionCallback();
+        }
+
+        return super.getCallBack();
     }
 
     @Override
     protected LockProperties applyLockProperties(LockProperties 
lockProperties) {
-        return lockProperties.withScope(Scope.Execution);
+        return lockProperties.withScope(Scope.Command);
     }
 
     @Override
@@ -289,11 +296,13 @@
         storageDomainOvfInfo.setStoredOvfIds(null);
 
         try {
-            setOvfVolumeDescription(storagePoolId,
-                    storageDomainId,
-                    diskId,
-                    volumeId,
-                    
generateOvfStoreDescription(storageDomainOvfInfo.getLastUpdated(), false, 
null));
+            if (isDataCenterWithSpm()) {
+                setOvfVolumeDescription(storagePoolId,
+                        storageDomainId,
+                        diskId,
+                        volumeId,
+                        
generateOvfStoreDescription(storageDomainOvfInfo.getLastUpdated(), false, 
null));
+            }
 
             getStorageDomainOvfInfoDao().update(storageDomainOvfInfo);
 
@@ -306,28 +315,33 @@
                             diskId, volumeId, byteArrayInputStream,
                             size);
 
-            if (hasParentCommand()) {
-                
uploadStreamParameters.setParentCommand(getParameters().getParentCommand());
-                
uploadStreamParameters.setParentParameters(getParameters().getParentParameters());
-            } else {
-                uploadStreamParameters.setParentCommand(getActionType());
-                uploadStreamParameters.setParentParameters(getParameters());
-            }
+            uploadStreamParameters.setParentCommand(getActionType());
+            uploadStreamParameters.setParentParameters(getParameters());
+            uploadStreamParameters.setShouldBeEndedByParent(false);
 
-            VdcReturnValueBase vdcReturnValueBase =
-                    
runInternalActionWithTasksContext(VdcActionType.UploadStream, 
uploadStreamParameters);
-            if (vdcReturnValueBase.getSucceeded()) {
+            boolean succeeded = true;
+            VdcReturnValueBase vdcReturnValueBase = null;
+            if (isDataCenterWithSpm()) {
+//                 vdcReturnValueBase =
+//                        executeCoCoCommandSync(VdcActionType.UploadStream, 
uploadStreamParameters);
+                TempParentCommandForTasksParameters tempParams = new 
TempParentCommandForTasksParameters(VdcActionType.UploadStream, 
uploadStreamParameters);
+                tempParams.setParentCommand(getActionType());
+                tempParams.setParentParameters(getParameters());
+                vdcReturnValueBase =
+                        
executeCoCoCommandSync(VdcActionType.TempParentCommandForTasks, new 
TempParentCommandForTasksParameters(VdcActionType.UploadStream, 
uploadStreamParameters));
+                succeeded = vdcReturnValueBase.getSucceeded();
+            }
+            //TODO: restore old code
+
+            if (succeeded) {
                 
storageDomainOvfInfo.setStatus(StorageDomainOvfInfoStatus.UPDATED);
                 storageDomainOvfInfo.setStoredOvfIds(vmAndTemplatesIds);
                 storageDomainOvfInfo.setLastUpdated(updateDate);
-                setOvfVolumeDescription(storagePoolId, storageDomainId,
-                        diskId, volumeId, 
getPostUpdateOvfStoreDescription(size));
-                getStorageDomainOvfInfoDao().update(storageDomainOvfInfo);
-                if (hasParentCommand()) {
-                    
getReturnValue().getInternalVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList());
-                } else {
-                    
getReturnValue().getVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList());
+                if (isDataCenterWithSpm()) {
+                    setOvfVolumeDescription(storagePoolId, storageDomainId,
+                            diskId, volumeId, 
getPostUpdateOvfStoreDescription(size));
                 }
+                getStorageDomainOvfInfoDao().update(storageDomainOvfInfo);
                 return true;
             }
         } catch (VdcBLLException e) {
@@ -339,7 +353,11 @@
     }
 
     private int getMissingDiskCount() {
-        return Config.<Integer> 
getValue(ConfigValues.StorageDomainOvfStoreCount) - ovfDiskCount;
+        if (missingDiskCount == null) {
+            missingDiskCount = 
Config.<Integer>getValue(ConfigValues.StorageDomainOvfStoreCount) - 
ovfDiskCount;
+        }
+
+        return missingDiskCount;
     }
 
     @Override
@@ -364,38 +382,54 @@
 //        }
 
         if (getMissingDiskCount() == 0) {
-            getParameters().setChildCount(1);
-        } else {
-            getParameters().setChildCount(2);
+            updateOvfStoreContent();
         }
-
-        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());
+//        parameters.setShouldBeEndedByParent(false);
+//        VdcReturnValueBase returnValueBase = 
executeCoCoCommandSync(VdcActionType.CreateOvfStoresForStorageDomain,
+//                parameters);
+//        if (hasParentCommand()) {
+//            
getReturnValue().getInternalVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList());
+//        } else {
+//            
getReturnValue().getVdsmTaskIdList().addAll(returnValueBase.getInternalVdsmTaskIdList());
+//        }
+//    }
 
     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());
+        for (int i = 0; i < missingDiskCount; i++) {
+            CreateOvfVolumeForStorageDomainCommandParameters parameters = 
createCreateOvfVolumeForStorageDomainParams();
+            
CommandCoordinatorUtil.executeAsyncCommand(VdcActionType.CreateOvfVolumeForStorageDomain,
 parameters, getContext().clone());
         }
     }
 
+    public CreateOvfVolumeForStorageDomainCommandParameters 
createCreateOvfVolumeForStorageDomainParams() {
+        CreateOvfVolumeForStorageDomainCommandParameters parameters = new 
CreateOvfVolumeForStorageDomainCommandParameters(getParameters().getStoragePoolId(),
+                getParameters().getStorageDomainId());
+        parameters.setSkipDomainChecks(getParameters().isSkipDomainChecks());
+        parameters.setParentCommand(getActionType());
+        parameters.setParentParameters(getParameters());
+        parameters.setShouldBeEndedByParent(false);
+        return parameters;
+    }
+
     @Override
-    public void performNextOperation(int completedChildCount) {
-        if (completedChildCount == 0) {
+    public boolean performNextOperation(int completedChildCount) {
+        if (getMissingDiskCount() > 0) {
             createOvfStoreDisks(getMissingDiskCount());
-            return;
+            return true;
         }
+
         updateOvfStoreContent();
+        return false;
     }
 
     protected Set<Guid> buildFilesForOvfs(List<Pair<Guid, String>> ovfs, 
InMemoryTar inMemoryTar) throws Exception {
@@ -434,16 +468,6 @@
         }
 
         return lockMap;
-    }
-
-    @Override
-    protected void endSuccessfully() {
-        setSucceeded(true);
-    }
-
-    @Override
-    protected void endWithFailure() {
-        setSucceeded(true);
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildCommandsExecutionCallback.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildCommandsExecutionCallback.java
index 7eb9752..93058ca 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildCommandsExecutionCallback.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildCommandsExecutionCallback.java
@@ -4,6 +4,7 @@
 
 import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
 import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
+import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.businessentities.CommandEntity;
 import org.ovirt.engine.core.compat.CommandStatus;
 import org.ovirt.engine.core.compat.Guid;
@@ -20,10 +21,11 @@
         int completedChildren = 0;
         CommandBase<?> command = getCommand(cmdId);
         for (Guid childCmdId : childCmdIds) {
+            CommandBase<?> child = getCommand(childCmdId);
             switch (CommandCoordinatorUtil.getCommandStatus(childCmdId)) {
                 case NOT_STARTED:
                 case ACTIVE:
-                    log.info("Waiting on child commands of command '{}' id: 
'{}' to complete", command.getActionType(), cmdId);
+                    log.info("Waiting on child command id: '{}' type:'{}' of 
'{}' (id: '{}') to complete", childCmdId, child.getActionType(), 
command.getActionType(), cmdId);
                     return;
                 case FAILED:
                 case FAILED_RESTARTED:
@@ -32,26 +34,35 @@
                     break;
                 default:
                     CommandEntity cmdEntity = 
CommandCoordinatorUtil.getCommandEntity(childCmdId);
-                    if (cmdEntity.isCallBackNotified()) {
+                    if (cmdEntity.isCallBackNotified() || 
!cmdEntity.isCallBackEnabled()) {
                         ++completedChildren;
                         break;
                     } else {
-                        log.info("Waiting on child commands of command '{}' 
id: '{}' to complete", command.getActionType(), cmdId);
+                        //log.info("command '{}' id: '{}' is waiting for child 
command(s) '{}' to complete", command.getActionType(), cmdId, childCmdIds);
+                        log.info("Waiting on child command id: '{}' type:'{}' 
of '{}' (id: '{}') to complete", childCmdId, child.getActionType(), 
command.getActionType(), cmdId);
                         return;
                     }
             }
         }
 
         SerialChildExecutingCommand serialChildExecutingCommand = 
(SerialChildExecutingCommand) command;
-        if (!anyFailed && completedChildren < 
serialChildExecutingCommand.getChildCount()) {
-            
serialChildExecutingCommand.performNextOperation(completedChildren);
-            return;
+        if (!anyFailed) {
+            try {
+                boolean endCommand = 
!serialChildExecutingCommand.performNextOperation(completedChildren);
+                if (!endCommand) {
+                    return;
+                }
+            } catch (Exception e) {
+                log.info("Command '{}' id: '{}' failed when attepting to 
perform the next operation, marking as FAILED '{}'",
+                        command.getActionType(), cmdId, childCmdIds, 
command.getCommandStatus());
+                anyFailed = true;
+            }
         }
 
         command.getParameters().setTaskGroupSuccess(!anyFailed);
         command.setCommandStatus(command.getParameters().getTaskGroupSuccess() 
?  CommandStatus.SUCCEEDED : CommandStatus.FAILED);
-        log.info("All child commands of command '{}' id: '{}' executions were 
completed, status '{}'",
-                command.getActionType(), cmdId, command.getCommandStatus());
+        log.info("Command '{}' id: '{}' child commands '{}' executions were 
completed, status '{}'",
+                command.getActionType(), cmdId, childCmdIds, 
command.getCommandStatus());
     }
 
     private CommandBase<?> getCommand(Guid cmdId) {
@@ -84,4 +95,45 @@
 //        commandBase.getParameters().setTaskGroupSuccess(false);
 //        getCommand(cmdId).endAction();
 //    }
+
+    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()));
+//        }
+
+        //TODO: handle case of grandpa command
+//        commandBase.getParameters().setCocoChildCommands(parameters);
+
+        if (commandBase.getParameters().getParentCommand() == 
VdcActionType.Unknown || 
!commandBase.getParameters().isShouldBeEndedByParent()) {
+            //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
+            if (commandBase.getParameters().getParentCommand() == 
VdcActionType.Unknown) {
+                
CommandCoordinatorUtil.removeAllCommandsInHierarchy(commandBase.getCommandId());
+            }
+        }
+    }
+
+    @Override
+    public void onSucceeded(Guid cmdId, List<Guid> childCmdIds) {
+//        endAction(cmdId, childCmdIds);
+        endAction(getCommand(cmdId), childCmdIds);
+    }
+
+    @Override
+    public void onFailed(Guid cmdId, List<Guid> childCmdIds) {
+        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/SerialChildExecutingCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildExecutingCommand.java
index 39ed325..cc1fd15 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildExecutingCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SerialChildExecutingCommand.java
@@ -1,7 +1,7 @@
 package org.ovirt.engine.core.bll;
 
 public interface SerialChildExecutingCommand {
-    public void performNextOperation(int completedChildCount);
+    public boolean performNextOperation(int completedChildCount);
 
     public int getChildCount();
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TempParentCommandForTasksCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TempParentCommandForTasksCommand.java
new file mode 100644
index 0000000..93c7b14
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/TempParentCommandForTasksCommand.java
@@ -0,0 +1,39 @@
+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.utils.PermissionSubject;
+import org.ovirt.engine.core.common.action.TempParentCommandForTasksParameters;
+import org.ovirt.engine.core.common.action.VdcReturnValueBase;
+
+@NonTransactiveCommandAttribute(forceCompensation = true)
+public class TempParentCommandForTasksCommand<T extends 
TempParentCommandForTasksParameters> extends CommandBase<T>{
+
+    public TempParentCommandForTasksCommand(T parameters, CommandContext 
cmdContext) {
+        super(parameters, cmdContext);
+    }
+
+    public TempParentCommandForTasksCommand(T parameters) {
+        this(parameters, null);
+    }
+
+    @Override
+    protected void executeCommand() {
+        
getParameters().getParametersBase().setParentParameters(getParameters());
+        getParameters().getParametersBase().setParentCommand(getActionType());
+        VdcReturnValueBase vdcReturnValueBase = 
runInternalAction(getParameters().getVdcActionType(), 
getParameters().getParametersBase(), getContext());
+        if (vdcReturnValueBase.getSucceeded()) {
+            
getReturnValue().getVdsmTaskIdList().addAll(vdcReturnValueBase.getInternalVdsmTaskIdList());
+        }
+
+        setSucceeded(vdcReturnValueBase.getSucceeded());
+    }
+
+    @Override
+    public List<PermissionSubject> getPermissionCheckSubjects() {
+        return Collections.emptyList();
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java
index 7937ef1..c93d4af 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainWithOvfUpdateCommand.java
@@ -1,34 +1,25 @@
 package org.ovirt.engine.core.bll.storage;
 
-import java.util.LinkedList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
+import org.ovirt.engine.core.bll.SerialChildCommandsExecutionCallback;
+import org.ovirt.engine.core.bll.SerialChildExecutingCommand;
 import org.ovirt.engine.core.bll.context.CommandContext;
-import org.ovirt.engine.core.bll.context.CompensationContext;
-import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallBack;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.FeatureSupported;
-import 
org.ovirt.engine.core.common.action.CreateOvfStoresForStorageDomainCommandParameters;
 import org.ovirt.engine.core.common.action.LockProperties;
 import 
org.ovirt.engine.core.common.action.ProcessOvfUpdateForStorageDomainCommandParameters;
 import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase;
 import org.ovirt.engine.core.common.action.StoragePoolParametersBase;
-import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
-import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
-import org.ovirt.engine.core.common.businessentities.StorageDomainType;
 import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap;
 import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId;
 import org.ovirt.engine.core.compat.Guid;
-import org.ovirt.engine.core.compat.backendcompat.CommandExecutionStatus;
-import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
 
 @NonTransactiveCommandAttribute(forceCompensation = true)
 public class DeactivateStorageDomainWithOvfUpdateCommand<T extends 
StorageDomainPoolParametersBase> extends
-        DeactivateStorageDomainCommand<T> {
+        DeactivateStorageDomainCommand<T> implements 
SerialChildExecutingCommand {
 
     public DeactivateStorageDomainWithOvfUpdateCommand(T parameters) {
         this(parameters, null);
@@ -37,6 +28,15 @@
     public DeactivateStorageDomainWithOvfUpdateCommand(T parameters, 
CommandContext commandContext) {
         super(parameters, commandContext);
         setCommandShouldBeLogged(false);
+    }
+
+    @Override
+    public CommandCallBack getCallBack() {
+        if (shouldPerformOvfUpdate()) {
+            return new SerialChildCommandsExecutionCallback();
+        }
+
+        return super.getCallBack();
     }
 
 
@@ -59,23 +59,18 @@
         if (shouldPerformOvfUpdate()) {
             runInternalAction(VdcActionType.ProcessOvfUpdateForStoragePool, 
new StoragePoolParametersBase(getStoragePoolId()), null);
 
-            VdcReturnValueBase tmpRetValue = 
runInternalActionWithTasksContext(VdcActionType.ProcessOvfUpdateForStorageDomain,
+            
executeCoCoCommandSyncWithTasksContext(VdcActionType.ProcessOvfUpdateForStorageDomain,
                     createProcessOvfUpdateForDomainParams(), null);
-
-            
getReturnValue().getVdsmTaskIdList().addAll(tmpRetValue.getInternalVdsmTaskIdList());
-        }
-
-        if (getReturnValue().getVdsmTaskIdList().isEmpty()) {
-            executeDeactivateCommnad(true);
         } else {
-            setCommandShouldBeLogged(false);
+            executeDeactivateCommnad(true);
         }
 
         setSucceeded(true);
     }
 
     protected boolean shouldPerformOvfUpdate() {
-        return !getParameters().isInactive() && ovfOnAnyDomainSupported() && 
getStorageDomain().getStatus() == StorageDomainStatus.Active
+        return !getParameters().isInactive() && ovfOnAnyDomainSupported() &&
+                getStorageDomain().getStatus() == StorageDomainStatus.Active
                 && getStorageDomain().getStorageDomainType().isDataDomain();
     }
 
@@ -85,8 +80,9 @@
 
     private ProcessOvfUpdateForStorageDomainCommandParameters 
createProcessOvfUpdateForDomainParams() {
         ProcessOvfUpdateForStorageDomainCommandParameters params = new 
ProcessOvfUpdateForStorageDomainCommandParameters(getStoragePoolId(), 
getStorageDomainId());
-        params.setParentCommand(getActionType());
+        params.setShouldBeEndedByParent(false);
         params.setParentParameters(getParameters());
+        params.setParentCommand(getActionType());
         params.setSkipDomainChecks(true);
         return params;
     }
@@ -96,59 +92,6 @@
                         (new 
StoragePoolIsoMapId(getParameters().getStorageDomainId(),
                                 getParameters().getStoragePoolId()));
     }
-
-    @Override
-    protected void endSuccessfully() {
-        endCommand();
-        setSucceeded(true);
-    }
-
-    @Override
-    protected void endWithFailure() {
-        endCommand();
-        setSucceeded(true);
-    }
-
-    public boolean hasExecutionEnded() {
-        return 
CommandCoordinatorUtil.getCommandExecutionStatus(getParameters().getCommandId())
 == CommandExecutionStatus.EXECUTED;
-    }
-
-    private void endCommand() {
-        if (!hasExecutionEnded()) {
-            return;
-        }
-
-        List<Guid> createdTasks = new LinkedList<>();
-
-        for (VdcActionParametersBase parametersBase : 
getParameters().getImagesParameters()) {
-            if (parametersBase.getCommandType() == 
VdcActionType.AddImageFromScratch) {
-                CreateOvfStoresForStorageDomainCommandParameters parameters = 
new 
CreateOvfStoresForStorageDomainCommandParameters(getParameters().getStoragePoolId(),
-                        getParameters().getStorageDomainId(), 0);
-                
parameters.getImagesParameters().addAll(getParameters().getImagesParameters());
-                parameters.setParentParameters(getParameters());
-                parameters.setParentCommand(getActionType());
-                parameters.setSkipDomainChecks(true);
-                VdcReturnValueBase vdsReturnValue = 
getBackend().endAction(VdcActionType.CreateOvfStoresForStorageDomain, 
parameters, cloneContext().withoutLock());
-                
createdTasks.addAll(vdsReturnValue.getInternalVdsmTaskIdList());
-                break;
-            }
-            
createdTasks.addAll(getBackend().endAction(parametersBase.getCommandType(), 
parametersBase, null).getInternalVdsmTaskIdList());
-        }
-
-        if (!createdTasks.isEmpty()) {
-            // if there are created tasks, avoid release the memory lock.
-            setLock(null);
-            setSucceeded(true);
-            startPollingAsyncTasks(createdTasks);
-            return;
-        }
-
-        super.startFinalizingStep();
-
-        deactivateStorageDomainAfterTaskExecution();
-    }
-
-    protected void startFinalizingStep() {}
 
     public AuditLogType getAuditLogTypeValue() {
         return AuditLogType.UNASSIGNED;
@@ -168,47 +111,57 @@
         return lockProperties.withScope(LockProperties.Scope.Command);
     }
 
-    protected void deactivateStorageDomainAfterTaskExecution() {
-        final StorageDomainPoolParametersBase params = new 
StorageDomainPoolParametersBase(getStorageDomainId(), getStoragePoolId());
-        params.setSkipChecks(true);
-        boolean newThread = getStorageDomain().getStorageDomainType() == 
StorageDomainType.Master && getNewMaster(false) == null;
-        if (newThread) {
-            StoragePoolIsoMap map = loadStoragePoolIsoMap();
-            // The creation of the compensation context is needed in case of 
an engine restart between the tasks clearance and the
-            // execution of the deactivate command from the new thread. If the 
compensation context won't be created and the tasks
-            // will be cleared, when the engine start there's nothing to start 
the thread (as the end method won't be called as there
-            // are no tasks) and the domain will remain locked.
-            final CompensationContext ctx = 
createDefaultCompensationContext(Guid.newGuid());
-            changeDomainStatusWithCompensation(map, 
StorageDomainStatus.Unknown, StorageDomainStatus.Locked, ctx);
-            ThreadPoolUtil.execute(new Runnable() {
-                @Override
-                public void run() {
-                    try {
-                        waitForTasksToBeCleared();
-                        executeDeactivateCommnad(false);
-                        ctx.resetCompensation();
-                    } catch (Exception e) {
-                        log.error("Error when attempting to deactivate storage 
domain {}", getStorageDomainId(), e);
-                        compensate();
-                    }
-                }
-            });
-        } else {
-            executeDeactivateCommnad(false);
-        }
+    @Override
+    public boolean performNextOperation(int completedChildCount) {
+        executeDeactivateCommnad(false);
+        return false;
     }
 
-    protected void waitForTasksToBeCleared() throws InterruptedException {
-        log.info("waiting for all tasks related to domain {} to be cleared (if 
exist) before attempting to deactivate", getStorageDomainId());
-        while (true) {
-            TimeUnit.SECONDS.sleep(3);
-            List<Guid> tasks = 
getDbFacade().getAsyncTaskDao().getAsyncTaskIdsByEntity(getStorageDomainId());
-            if (tasks.isEmpty()) {
-                log.info("no tasks for the deactivated domain {}, proceeding 
with deactivation", getStorageDomainId());
-                return;
-            } else {
-                log.info("tasks {} were found for domain {}, waiting before 
attempting to deactivate", tasks, getStorageDomainId());
-            }
-        }
+    @Override
+    public int getChildCount() {
+        return 0;
     }
+
+//    protected void deactivateStorageDomainAfterTaskExecution() {
+//        final StorageDomainPoolParametersBase params = new 
StorageDomainPoolParametersBase(getStorageDomainId(), getStoragePoolId());
+//        params.setSkipChecks(true);
+//        boolean newThread = getStorageDomain().getStorageDomainType() == 
StorageDomainType.Master && getNewMaster(false) == null;
+//        if (newThread) {
+//            StoragePoolIsoMap map = loadStoragePoolIsoMap();
+//            // The creation of the compensation context is needed in case of 
an engine restart between the tasks clearance and the
+//            // execution of the deactivate command from the new thread. If 
the compensation context won't be created and the tasks
+//            // will be cleared, when the engine start there's nothing to 
start the thread (as the end method won't be called as there
+//            // are no tasks) and the domain will remain locked.
+//            final CompensationContext ctx = 
createDefaultCompensationContext(Guid.newGuid());
+//            changeDomainStatusWithCompensation(map, 
StorageDomainStatus.Unknown, StorageDomainStatus.Locked, ctx);
+//            ThreadPoolUtil.execute(new Runnable() {
+//                @Override
+//                public void run() {
+//                    try {
+//                        waitForTasksToBeCleared();
+//                        executeDeactivateCommnad(false);
+//                        ctx.resetCompensation();
+//                    } catch (Exception e) {
+//                        log.error("Error when attempting to deactivate 
storage domain {}", getStorageDomainId(), e);
+//                        compensate();
+//                    }
+//                }
+//            });
+//        } else {
+//        }
+//    }
+
+//    protected void waitForTasksToBeCleared() throws InterruptedException {
+//        log.info("waiting for all tasks related to domain {} to be cleared 
(if exist) before attempting to deactivate", getStorageDomainId());
+//        while (true) {
+//            TimeUnit.SECONDS.sleep(3);
+//            List<Guid> tasks = 
getDbFacade().getAsyncTaskDao().getAsyncTaskIdsByEntity(getStorageDomainId());
+//            if (tasks.isEmpty()) {
+//                log.info("no tasks for the deactivated domain {}, proceeding 
with deactivation", getStorageDomainId());
+//                return;
+//            } else {
+//                log.info("tasks {} were found for domain {}, waiting before 
attempting to deactivate", tasks, getStorageDomainId());
+//            }
+//        }
+//    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java
index b696d86..6348aed 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CoCoAsyncTaskHelper.java
@@ -199,8 +199,9 @@
                 int retVal = 
DbFacade.getInstance().getAsyncTaskDao().remove(taskId);
                 if (asyncTask != null && 
!Guid.isNullOrEmpty(asyncTask.getCommandId())) {
                     CommandEntity cmdEntity = 
coco.getCommandEntity(asyncTask.getCommandId());
-                    if (cmdEntity != null && !cmdEntity.isCallBackEnabled()) {
+                    if (cmdEntity != null && !cmdEntity.isCallBackEnabled()&& 
coco.getCommandEntity(asyncTask.getRootCommandId()) == null) {
                         coco.removeCommand(asyncTask.getCommandId());
+                        // not sure if this is needed
                         if 
(!coco.hasCommandEntitiesWithRootCommandId(asyncTask.getRootCommandId())) {
                             coco.removeCommand(asyncTask.getRootCommandId());
                         }
@@ -229,7 +230,8 @@
                 int retVal = 
DbFacade.getInstance().getAsyncTaskDao().removeByVdsmTaskId(vdsmTaskId);
                 if (asyncTask != null && 
!Guid.isNullOrEmpty(asyncTask.getCommandId())) {
                     CommandEntity cmdEntity = 
coco.getCommandEntity(asyncTask.getCommandId());
-                    if (cmdEntity != null && !cmdEntity.isCallBackEnabled()) {
+                    // TODO: maybe need to also check here that the command id 
is different from the root command id.
+                    if (cmdEntity != null && !cmdEntity.isCallBackEnabled() && 
coco.getCommandEntity(asyncTask.getRootCommandId()) == null) {
                         coco.removeCommand(asyncTask.getCommandId());
                         if 
(!coco.hasCommandEntitiesWithRootCommandId(asyncTask.getRootCommandId())) {
                             coco.removeCommand(asyncTask.getRootCommandId());
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
index 3f83177..95462c8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
@@ -136,6 +136,17 @@
         return cmdEntities;
     }
 
+
+    public List<CommandEntity> getCommands() {
+        List<CommandEntity> cmdEntities = new ArrayList<>();
+        CommandEntity cmdEntity;
+        for (Guid cmdId : commandsCache.keySet()) {
+            cmdEntity = commandsCache.get(cmdId);
+            cmdEntities.add(cmdEntity);
+        }
+        return cmdEntities;
+    }
+
     @Override
     public CommandBase<?> retrieveCommand(Guid commandId) {
         return buildCommand(commandsCache.get(commandId), 
contextsCache.get(commandId));
@@ -233,7 +244,7 @@
             synchronized(LOCK) {
                 if (!childHierarchyInitialized) {
                     childHierarchy.clear();
-                    for (CommandEntity cmd : getCommandsWithCallBackEnabled()) 
{
+                    for (CommandEntity cmd : getCommands()) {
                         buildCmdHierarchy(cmd);
                     }
                 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java
index 4ee644f..f349367 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/CreateOvfVolumeForStorageDomainCommandParameters.java
@@ -4,6 +4,7 @@
 
 public class CreateOvfVolumeForStorageDomainCommandParameters extends 
StorageDomainParametersBase {
     private boolean skipDomainChecks;
+    private Guid createdDiskId;
 
     public CreateOvfVolumeForStorageDomainCommandParameters() {
         super();
@@ -20,4 +21,12 @@
     public void setSkipDomainChecks(boolean skipDomainChecks) {
         this.skipDomainChecks = skipDomainChecks;
     }
+
+    public Guid getCreatedDiskId() {
+        return createdDiskId;
+    }
+
+    public void setCreatedDiskId(Guid createdDiskId) {
+        this.createdDiskId = createdDiskId;
+    }
 }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/TempParentCommandForTasksParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/TempParentCommandForTasksParameters.java
new file mode 100644
index 0000000..74a5b90
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/TempParentCommandForTasksParameters.java
@@ -0,0 +1,30 @@
+package org.ovirt.engine.core.common.action;
+
+public class TempParentCommandForTasksParameters extends 
VdcActionParametersBase {
+    private VdcActionType vdcActionType;
+    private VdcActionParametersBase parametersBase;
+
+    public TempParentCommandForTasksParameters() {
+    }
+
+    public TempParentCommandForTasksParameters(VdcActionType vdcActionType, 
VdcActionParametersBase parametersBase) {
+        this.vdcActionType = vdcActionType;
+        this.parametersBase = parametersBase;
+    }
+
+    public VdcActionType getVdcActionType() {
+        return vdcActionType;
+    }
+
+    public void setVdcActionType(VdcActionType vdcActionType) {
+        this.vdcActionType = vdcActionType;
+    }
+
+    public VdcActionParametersBase getParametersBase() {
+        return parametersBase;
+    }
+
+    public void setParametersBase(VdcActionParametersBase parametersBase) {
+        this.parametersBase = parametersBase;
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
index ddd7f14..917bf99 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionParametersBase.java
@@ -56,6 +56,8 @@
 
     private List<Pair<VdcActionType, VdcActionParametersBase>> 
cocoChildCommands;
 
+    private boolean shouldBeEndedByParent = true;
+
     /**
      * A cross system identifier of the executed action
      */
@@ -298,4 +300,12 @@
         builder.append(getCommandType());
         return builder.toString();
     }
+
+    public boolean isShouldBeEndedByParent() {
+        return shouldBeEndedByParent;
+    }
+
+    public void setShouldBeEndedByParent(boolean shouldBeEndedByParent) {
+        this.shouldBeEndedByParent = shouldBeEndedByParent;
+    }
 }
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 da28982..92d5072 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
@@ -393,7 +393,8 @@
     // Mac Pool
     AddMacPool(3100, ActionGroup.CREATE_MAC_POOL, false, QuotaDependency.NONE),
     UpdateMacPool(3101, ActionGroup.EDIT_MAC_POOL, false, 
QuotaDependency.NONE),
-    RemoveMacPool(3102, ActionGroup.DELETE_MAC_POOL, false, 
QuotaDependency.NONE);
+    RemoveMacPool(3102, ActionGroup.DELETE_MAC_POOL, false, 
QuotaDependency.NONE),
+    TempParentCommandForTasks(3103, QuotaDependency.NONE);
 
     private int intValue;
     private ActionGroup actionGroup;
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java
index 3624935..8826991 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/StorageDomainMetadataCommand.java
@@ -92,7 +92,7 @@
         selectHost();
         initVdsBroker(getParameters().getVdsId());
         try {
-                executeDomainCommand();
+            executeVdsBrokerCommand();
             }
         catch (UndeclaredThrowableException ex) {
                 getVDSReturnValue().setExceptionString(ex.toString());
@@ -153,8 +153,8 @@
     }
 
     private EngineLock buildLock(Guid id, LockingGroup lockingGroup) {
-        return new EngineLock(null,
-                Collections.singletonMap(id.toString(), new 
Pair<>(lockingGroup.toString(), 
VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED.toString())));
+        return new EngineLock(
+                Collections.singletonMap(id.toString(), new 
Pair<>(lockingGroup.toString(), 
VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED.toString())), null);
     }
 
     private List<VDS> getHostsForOperation() {


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I5b5bb672c5027c262619691007593a16875024aa
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Liron Aravot <lara...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to