Ravi Nori has uploaded a new change for review.

Change subject: core: Persist all async task place holders
......................................................................

core: Persist all async task place holders

Add the infra structure code for persisiting
all async task place holder for all child commands
before submitting any task to vdsm

Change-Id: I66628b98298ed1f500946889604ad906f0a68022
Signed-off-by: Ravi Nori <rn...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.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/Backend.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/CreateCloneOfTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateSnapshotCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.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/RemoveSnapshotSingleDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.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/RunVmCommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
20 files changed, 142 insertions(+), 26 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/15561/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java
index c96b2ee..7a58726 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AbstractSPMAsyncTaskHandler.java
@@ -36,7 +36,8 @@
         if (getEnclosingCommand().getParameters().getTaskGroupSuccess()) {
             getReturnValue().setSucceeded(false);
             beforeTask();
-            Guid taskId = cmd.persistAsyncTaskPlaceHolder(cmd.getActionType());
+            cmd.persistAsyncTaskPlaceHolder(cmd.getActionType());
+            Guid taskId = cmd.getAsyncTaskId();
 
             addTask(taskId, Backend.getInstance().getResourceManager()
                     .RunVdsCommand(getVDSCommandType(), getVDSParameters()), 
false);
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 e2a4973..c60ff64 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
@@ -71,7 +71,8 @@
     }
 
     protected boolean processImageInIrs() {
-        Guid taskId = 
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+        persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+        Guid taskId = getAsyncTaskId();
         getReturnValue().getTaskPlaceHolderIdList().add(taskId);
 
         VDSReturnValue vdsReturnValue = runVdsCommand(
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
index f1b2745..db3c6b0 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
@@ -329,6 +329,8 @@
         command.setContext(context);
         ExecutionHandler.prepareCommandForMonitoring(command, actionType, 
runAsInternal);
 
+        command.checkCanDoAction();
+        command.insertAsyncTaskPlaceHolders();
         returnValue = command.executeAction();
         returnValue.setCorrelationId(parameters.getCorrelationId());
         returnValue.setJobId(command.getJobId());
@@ -483,6 +485,8 @@
         case LoginUser:
         case LoginAdminUser:
             CommandBase<?> command = 
CommandsFactory.CreateCommand(parameters.getActionType(), parameters);
+            command.checkCanDoAction();
+            command.insertAsyncTaskPlaceHolders();
             return command.executeAction();
         default:
             return 
getErrorCommandReturnValue(VdcBllMessages.USER_NOT_AUTHORIZED_TO_PERFORM_ACTION);
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 3715b1e..1a2bc0b 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
@@ -4,6 +4,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -106,6 +107,7 @@
      * Multiplier used to convert GB to bytes or vice versa.
      */
     protected static final long BYTES_IN_GB = 1024 * 1024 * 1024;
+    private static final String DEFAULT_TASK_KEY = "DEFAULT_TASK_KEY";
     private static final Guid[] EMPTY_GUID_ARRAY = new Guid[0];
     private T _parameters;
     private VdcReturnValueBase _returnValue;
@@ -299,6 +301,12 @@
         return _returnValue;
     }
 
+    private boolean actionAllowed = false;
+
+    protected void checkCanDoAction() {
+        actionAllowed = getReturnValue().getCanDoAction() || 
internalCanDoAction();
+    }
+
     public VdcReturnValueBase executeAction() {
         determineExecutionReason();
         _actionState = CommandActionState.EXECUTE;
@@ -306,11 +314,9 @@
         getReturnValue().setDescription((tempVar != null) ? tempVar : 
getReturnValue().getDescription());
         setActionMessageParameters();
 
-        boolean actionAllowed = false;
         Step validatingStep = ExecutionHandler.addStep(getExecutionContext(), 
StepEnum.VALIDATING, null);
 
         try {
-            actionAllowed = getReturnValue().getCanDoAction() || 
internalCanDoAction();
             ExecutionHandler.endStep(getExecutionContext(), validatingStep, 
actionAllowed);
 
             if (actionAllowed) {
@@ -1216,7 +1222,68 @@
         return annotation != null && annotation.forceCompensation();
     }
 
+    /**
+     * This method is called before executeAction and after checkCanDoAction
+     * to insert the async task place holders for the child commands.
+     */
+    protected void insertAsyncTaskPlaceHolders() {
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                Map<Guid, CommandBase<?>> childCommands = buildChildCommands();
+                for (CommandBase<?> command : childCommands.values()) {
+                    command.checkCanDoAction();
+                    command.insertAsyncTaskPlaceHolders();
+                }
+                return null;
+            }
+        });
+    }
+
     protected abstract void executeCommand();
+
+    /**
+     * Commands can override this method to build a map of all child commands.
+     * Called from insertAsyncTaskPlaceHolders to build a list of all child
+     * commands and insert async task place holders for them
+     * @return
+     */
+    protected Map<Guid, CommandBase<?>> buildChildCommands() {
+        return Collections.<Guid, CommandBase<?>>emptyMap();
+    }
+
+    /**
+     * Called to construct the child command.
+     * @param actionType
+     * @param parameters
+     * @param runAsInternal
+     * @param context
+     * @return
+     */
+    protected CommandBase<?> constructCommand(VdcActionType actionType,
+            VdcActionParametersBase parameters,
+            boolean runAsInternal,
+            CommandContext context) {
+        ExecutionHandler.evaluateCorrelationId(parameters);
+        CommandBase<?> command = CommandsFactory.CreateCommand(actionType, 
parameters);
+        command.setInternalExecution(runAsInternal);
+        command.setContext(context);
+        ExecutionHandler.prepareCommandForMonitoring(command, actionType, 
runAsInternal);
+        return command;
+    }
+
+    /**
+     * calls execute action the child command.
+     * @param command
+     * @param parameters
+     * @return
+     */
+    protected VdcReturnValueBase runCommand(CommandBase<?> command) {
+        VdcReturnValueBase returnValue = command.executeAction();
+        
returnValue.setCorrelationId(command.getParameters().getCorrelationId());
+        returnValue.setJobId(command.getJobId());
+        return returnValue;
+    }
 
     private void logCommand() {
         Class<?> type = getClass();
@@ -1270,18 +1337,36 @@
         _returnValue.setFault(fault);
     }
 
-    public Guid persistAsyncTaskPlaceHolder(VdcActionType parentCommand) {
-        Guid retValue = Guid.Empty;
+    Map<String, Guid> taskKeyToTaskIdMap = new HashMap<>();
+
+    public void persistAsyncTaskPlaceHolder(VdcActionType parentCommand) {
+        persistAsyncTaskPlaceHolder(parentCommand, DEFAULT_TASK_KEY);
+    }
+
+    public void persistAsyncTaskPlaceHolder(VdcActionType parentCommand, 
String taskKey) {
+        if (taskKeyToTaskIdMap.containsKey(taskKey)) {
+            return;
+        }
 
         try {
             AsyncTasks task = createAsyncTask(new AsyncTaskCreationInfo(), 
parentCommand);
-            retValue = task.getTaskId();
+            Guid taskId = task.getTaskId();
             AsyncTaskUtils.addOrUpdateTaskInDB(task, null, EMPTY_GUID_ARRAY);
+            taskKeyToTaskIdMap.put(taskKey, taskId);
         } catch (RuntimeException ex) {
-            log.errorFormat("Error during persistAsyncTaskPlaceHolders for 
command: {0}. Exception {1}", this.getClass().getName(), ex);
+            log.errorFormat("Error during persistAsyncTaskPlaceHolder for 
command: {0}. Exception {1}", this.getClass().getName(), ex);
         }
+    }
 
-        return retValue;
+    public Guid getAsyncTaskId() {
+        return getAsyncTaskId(DEFAULT_TASK_KEY);
+    }
+
+    public Guid getAsyncTaskId(String taskKey) {
+        if (!taskKeyToTaskIdMap.containsKey(taskKey)) {
+            return Guid.Empty;
+        }
+        return taskKeyToTaskIdMap.get(taskKey);
     }
 
     /**
@@ -1427,6 +1512,7 @@
             asyncTask = DbFacade.getInstance().getAsyncTaskDao().get(taskId);
         }
         if (asyncTask != null) {
+            asyncTask.setaction_type(parentCommand);
             asyncTask.setVdsmTaskId(asyncTaskCreationInfo.getVdsmTaskId());
             asyncTask.setActionParameters(getParentParameters(parentCommand));
             asyncTask.setTaskParameters(getParameters());
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 2c5f9bf..2c51587 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
@@ -52,7 +52,8 @@
 
         VDSReturnValue vdsReturnValue = null;
         try {
-            Guid taskId = 
persistAsyncTaskPlaceHolder(VdcActionType.AddVmFromTemplate);
+            persistAsyncTaskPlaceHolder(VdcActionType.AddVmFromTemplate);
+            Guid taskId = getAsyncTaskId();
             getReturnValue().getTaskPlaceHolderIdList().add(taskId);
 
             vdsReturnValue = Backend
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
index e8ba26e..0914b25 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CreateImageTemplateCommand.java
@@ -47,7 +47,8 @@
         DiskImage newImage = cloneDiskImage(getDestinationImageId());
         fillVolumeInformation(newImage);
 
-        Guid taskId = persistAsyncTaskPlaceHolder(VdcActionType.AddVmTemplate);
+        persistAsyncTaskPlaceHolder(VdcActionType.AddVmTemplate);
+        Guid taskId = getAsyncTaskId();
         getReturnValue().getTaskPlaceHolderIdList().add(taskId);
 
         VDSReturnValue vdsReturnValue = Backend
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 996d093..ba6051b 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
@@ -88,7 +88,8 @@
         VDSReturnValue vdsReturnValue = null;
 
         try {
-            Guid taskId = 
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+            persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+            Guid taskId = getAsyncTaskId();
             getReturnValue().getTaskPlaceHolderIdList().add(taskId);
 
            vdsReturnValue =
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java
index a5d654a..a9d9c48 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/HibernateVmCommand.java
@@ -36,6 +36,8 @@
 @DisableInPrepareMode
 @NonTransactiveCommandAttribute(forceCompensation = true)
 public class HibernateVmCommand<T extends HibernateVmParameters> extends 
VmOperationCommandBase<T> {
+    private static final String SAVE_IMAGE_TASK_KEY = "SAVE_IMAGE_TASK_KEY";
+    private static final String SAVE_RAM_STATE_TASK_KEY = 
"SAVE_RAM_STATE_TASK_KEY";
     private boolean isHibernateVdsProblematic = false;
     /**
      * Constructor for command creation when compensation is applied on startup
@@ -101,7 +103,8 @@
                         }
                     });
 
-            final Guid taskId1 = 
persistAsyncTaskPlaceHolder(VdcActionType.HibernateVm);
+            persistAsyncTaskPlaceHolder(VdcActionType.HibernateVm, 
SAVE_IMAGE_TASK_KEY);
+            final Guid taskId1 = getAsyncTaskId(SAVE_IMAGE_TASK_KEY);
             getReturnValue().getTaskPlaceHolderIdList().add(taskId1);
 
             Guid image1GroupId = Guid.NewGuid();
@@ -146,7 +149,8 @@
 
             getReturnValue().getVdsmTaskIdList().add(guid1);
 
-            Guid taskId2 = 
persistAsyncTaskPlaceHolder(VdcActionType.HibernateVm);
+            persistAsyncTaskPlaceHolder(VdcActionType.HibernateVm, 
SAVE_RAM_STATE_TASK_KEY);
+            Guid taskId2 = getAsyncTaskId(SAVE_RAM_STATE_TASK_KEY);
             getReturnValue().getTaskPlaceHolderIdList().add(taskId2);
 
             // second vol should be 10kb
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java
index 8578a2b..6572838 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MoveOrCopyImageGroupCommand.java
@@ -59,7 +59,8 @@
                 .getValue()
                 : getDiskImage().getStorageIds().get(0);
 
-        Guid taskId = 
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+        persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+        Guid taskId = getAsyncTaskId();
         getReturnValue().getTaskPlaceHolderIdList().add(taskId);
 
         if (getParameters().getUseCopyCollapse()) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
index 8450d17..27283cc 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MultipleActionsRunner.java
@@ -171,6 +171,8 @@
                     command.isInternalExecution());
         }
         
ThreadLocalParamsContainer.setCorrelationId(command.getCorrelationId());
+        command.checkCanDoAction();
+        command.insertAsyncTaskPlaceHolders();
         command.executeAction();
     }
 
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 dfaad32..dfa53dc 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
@@ -78,7 +78,8 @@
     protected void executeCommand() {
         if (getDiskImage() != null) {
             try {
-                Guid taskId = 
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+                
persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
+                Guid taskId = getAsyncTaskId();
                 getReturnValue().getTaskPlaceHolderIdList().add(taskId);
 
                 VDSReturnValue vdsReturnValue = performImageVdsmOperation();
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java
index c4f14c3..423e57d 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveSnapshotSingleDiskCommand.java
@@ -33,7 +33,8 @@
         Guid imageGroupId = getDiskImage().getimage_group_id() != null ? 
getDiskImage().getimage_group_id().getValue()
                 : Guid.Empty;
 
-        Guid taskId = 
persistAsyncTaskPlaceHolder(VdcActionType.RemoveSnapshot);
+        persistAsyncTaskPlaceHolder(VdcActionType.RemoveSnapshot);
+        Guid taskId = getAsyncTaskId();
         getReturnValue().getTaskPlaceHolderIdList().add(taskId);
 
         VDSReturnValue vdsReturnValue = Backend
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
index 65e50eb..caf4dce 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveTemplateSnapshotCommand.java
@@ -20,7 +20,8 @@
 
     @Override
     protected void executeCommand() {
-        Guid taskId = 
persistAsyncTaskPlaceHolder(VdcActionType.RemoveVmTemplate);
+        persistAsyncTaskPlaceHolder(VdcActionType.RemoveVmTemplate);
+        Guid taskId = getAsyncTaskId();
         getReturnValue().getTaskPlaceHolderIdList().add(taskId);
 
         VDSReturnValue vdsReturnValue = Backend
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 5b2c151..39c3110 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
@@ -104,7 +104,8 @@
             Guid imageGroupId = getDiskImage().getimage_group_id() != null ? 
getDiskImage().getimage_group_id()
                     .getValue() : Guid.Empty;
 
-            Guid taskId = 
persistAsyncTaskPlaceHolder(VdcActionType.RestoreAllSnapshots);
+            persistAsyncTaskPlaceHolder(VdcActionType.RestoreAllSnapshots);
+            Guid taskId = getAsyncTaskId();
             getReturnValue().getTaskPlaceHolderIdList().add(taskId);
 
             vdsReturnValue = runVdsCommand(
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
index 62478a7..699f7eb 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
@@ -171,6 +171,8 @@
             // set the _isRerun flag to false before calling executeAction so 
that we'll know if
             // there is another rerun attempt within the method
             _isRerun = false;
+            checkCanDoAction();
+            insertAsyncTaskPlaceHolders();
             executeAction();
 
             // if there was no rerun attempt in the previous executeAction 
call and the command
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
index 4446490..1296088 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmCommand.java
@@ -44,6 +44,8 @@
 
 public abstract class VmCommand<T extends VmOperationParameterBase> extends 
CommandBase<T> {
 
+    private static final String DELETE_PRIMARY_IMAGE_TASK_KEY = 
"DELETE_PRIMARY_IMAGE_TASK_KEY";
+    private static final String DELETE_SECONDARY_IMAGES_TASK_KEY = 
"DELETE_SECONDARY_IMAGES_TASK_KEY";
     private static final int Kb = 1024;
     protected final static int MAX_NETWORK_INTERFACES_SUPPORTED = 8;
 
@@ -252,7 +254,8 @@
                                 }
                             }).size() > 0;
 
-            Guid taskId1 = persistAsyncTaskPlaceHolder(parentCommand);
+            persistAsyncTaskPlaceHolder(parentCommand, 
DELETE_PRIMARY_IMAGE_TASK_KEY);
+            Guid taskId1 = getAsyncTaskId(DELETE_PRIMARY_IMAGE_TASK_KEY);
             getReturnValue().getTaskPlaceHolderIdList().add(taskId1);
 
             // delete first image
@@ -271,7 +274,8 @@
                     createTask(taskId1, vdsRetValue1.getCreationInfo(), 
parentCommand, VdcObjectType.Storage, imagesList[0]);
             getTaskIdList().add(guid1);
 
-            Guid taskId2 = persistAsyncTaskPlaceHolder(parentCommand);
+            persistAsyncTaskPlaceHolder(parentCommand, 
DELETE_SECONDARY_IMAGES_TASK_KEY);
+            Guid taskId2 = getAsyncTaskId(DELETE_SECONDARY_IMAGES_TASK_KEY);
             getReturnValue().getTaskPlaceHolderIdList().add(taskId2);
 
             // delete second image
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
index 0acabf8..e9c8ec8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDiskCommand.java
@@ -75,8 +75,8 @@
     }
 
     @Override
-    public Guid persistAsyncTaskPlaceHolder(VdcActionType parentCommand) {
-        return super.persistAsyncTaskPlaceHolder(parentCommand);
+    public void persistAsyncTaskPlaceHolder(VdcActionType parentCommand) {
+        super.persistAsyncTaskPlaceHolder(parentCommand);
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
index e9f41e7..583bf99 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateVmDisksCommand.java
@@ -81,8 +81,8 @@
     }
 
     @Override
-    public Guid persistAsyncTaskPlaceHolder(VdcActionType parentCommand) {
-        return super.persistAsyncTaskPlaceHolder(parentCommand);
+    public void persistAsyncTaskPlaceHolder(VdcActionType parentCommand) {
+        super.persistAsyncTaskPlaceHolder(parentCommand);
     }
 
     @Override
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
index e35e6d0..719f3fa 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
@@ -28,5 +28,7 @@
             VdcObjectType entityType,
             Guid... entityIds);
 
-    Guid persistAsyncTaskPlaceHolder(VdcActionType parentCommand);
+    void persistAsyncTaskPlaceHolder(VdcActionType parentCommand);
+
+    Guid getAsyncTaskId();
 }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
index fbd8894..503f52f 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
@@ -119,6 +119,8 @@
         
when(parameterMock.getTransactionScopeOption()).thenReturn(TransactionScopeOption.Required);
         CommandBase<VdcActionParametersBase> command = spy(new 
CommandBaseDummy(parameterMock));
 
+        command.checkCanDoAction();
+        command.insertAsyncTaskPlaceHolders();
         command.executeAction();
         verify(command).executeCommand();
     }


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

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

Reply via email to