Ravi Nori has uploaded a new change for review.

Change subject: engine : Refactoring Async tasks code
......................................................................

engine : Refactoring Async tasks code

This patch moves all async task handling code out of
the bll packages and moves it to a taskmgr package
parallel to bll.

TasksUtil class currently contains all the task handling
handling code such as createTask, cancelTask, revertTask
that was in CommandBase. This is the first step in moving
all the code out of bll.

The next step would be to define an interface which
would define a single entry point into the task manager
package, lets call it TaskManager and TaskManagerImpl.
The bll package would be modified to use this single entry
for all task manager related activities. At this stage the
methods in TasksUtil class would be absorbed into the
TaskManagerImpl.

Once the bll package has been abstracted from the
implementation details of the async task manager
implementation. We can begin modifying the internals of
the taskmgr package.

This patch only moves the code out of bll package and
defines a new parallel package taskmgr.

Change-Id: I7d2770f355274159c30def80c7c263bb590a64f7
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/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/GetTasksStatusesByTasksIDsQuery.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/InitBackendServicesOnStartupBean.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/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/RemoveVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.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/VdsEventListener.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/CreateImagePlaceholderTaskHandler.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/LiveMigrateDisksTaskHandler.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/lsm/LiveSnapshotTaskHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskStartTaskHandler.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskFactory.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskManager.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskState.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskUtils.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/EntityAsyncTask.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/EntityMultiAsyncTasks.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/SPMAsyncTask.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/SPMAsyncTaskHandler.java
R 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/TaskHandlerCommand.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/TasksUtil.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/CommandBaseTest.java
36 files changed, 238 insertions(+), 129 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/93/12693/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 ffb1f13..38be891 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
@@ -1,8 +1,8 @@
 package org.ovirt.engine.core.bll;
 
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
-import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
-import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.tasks.SPMAsyncTaskHandler;
+import org.ovirt.engine.core.tasks.TaskHandlerCommand;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
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 a1f68e7..3ec98f6 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
@@ -1,5 +1,7 @@
 package org.ovirt.engine.core.bll;
 
+import org.ovirt.engine.core.tasks.AsyncTaskManager;
+import org.ovirt.engine.core.tasks.SPMAsyncTask;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -31,8 +33,8 @@
 import org.ovirt.engine.core.bll.quota.QuotaStorageDependent;
 import org.ovirt.engine.core.bll.quota.QuotaVdsDependent;
 import org.ovirt.engine.core.bll.session.SessionDataContainer;
-import org.ovirt.engine.core.bll.tasks.AsyncTaskUtils;
-import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
+import org.ovirt.engine.core.tasks.SPMAsyncTaskHandler;
+import org.ovirt.engine.core.tasks.TasksUtil;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
@@ -41,14 +43,10 @@
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.action.VdcReturnValueBase;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
-import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
 import org.ovirt.engine.core.common.businessentities.ActionGroup;
 import org.ovirt.engine.core.common.businessentities.ActionVersionMap;
-import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
-import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
-import org.ovirt.engine.core.common.businessentities.AsyncTasks;
 import org.ovirt.engine.core.common.businessentities.BusinessEntity;
 import org.ovirt.engine.core.common.businessentities.BusinessEntitySnapshot;
 import 
org.ovirt.engine.core.common.businessentities.BusinessEntitySnapshot.EntityStatusSnapshot;
@@ -60,7 +58,6 @@
 import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import org.ovirt.engine.core.common.errors.VdcFault;
 import org.ovirt.engine.core.common.interfaces.IVdcUser;
-import org.ovirt.engine.core.common.job.ExternalSystemType;
 import org.ovirt.engine.core.common.job.Step;
 import org.ovirt.engine.core.common.job.StepEnum;
 import org.ovirt.engine.core.common.utils.Pair;
@@ -93,7 +90,6 @@
 import org.ovirt.engine.core.utils.lock.LockManagerFactory;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
-import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
 import org.ovirt.engine.core.utils.transaction.RollbackHandler;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
@@ -203,7 +199,7 @@
         return new VdcReturnValueBase();
     }
 
-    protected BackendInternal getBackend() {
+    public BackendInternal getBackend() {
         return Backend.getInstance();
     }
 
@@ -1031,7 +1027,7 @@
      * @param parameters parameter of the creating command
      * @return
      */
-    protected VdcActionParametersBase getParametersForTask(VdcActionType 
parentCommandType,
+    public VdcActionParametersBase getParametersForTask(VdcActionType 
parentCommandType,
             VdcActionParametersBase parameters) {
         // If there is no parent command, the command that its type
         // will be stored in the DB for thr task is the one creating the 
command
@@ -1187,7 +1183,7 @@
         }
     }
 
-    private boolean hasTasks() {
+    public boolean hasTasks() {
         return !getReturnValue().getTaskIdList().isEmpty();
     }
 
@@ -1211,7 +1207,7 @@
         return annotation == null;
     }
 
-    protected T getParameters() {
+    public T getParameters() {
         return _parameters;
     }
 
@@ -1309,75 +1305,17 @@
     protected Guid createTask(AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand,
             String description, VdcObjectType entityType, Guid... entityIds) {
-        Guid retValue = Guid.Empty;
-
-        Transaction transaction = TransactionSupport.suspend();
-
-        try {
-            Step taskStep =
-                    ExecutionHandler.addTaskStep(getExecutionContext(),
-                            
StepEnum.getStepNameByTaskType(asyncTaskCreationInfo.getTaskType()),
-                            description);
-            if (taskStep != null) {
-                asyncTaskCreationInfo.setStepId(taskStep.getId());
-            }
-            SPMAsyncTask task = concreteCreateTask(asyncTaskCreationInfo, 
parentCommand);
-            retValue = task.getTaskID();
-            task.setEntityType(entityType);
-            task.setAssociatedEntities(entityIds);
-            AsyncTaskUtils.addOrUpdateTaskInDB(task);
-            getAsyncTaskManager().lockAndAddTaskToManager(task);
-            retValue = task.getTaskID();
-            ExecutionHandler.updateStepExternalId(taskStep, retValue, 
ExternalSystemType.VDSM);
-        } catch (RuntimeException ex) {
-            log.errorFormat("Error during CreateTask for command: {0}. 
Exception {1}", getClass().getName(), ex);
-        } finally {
-            TransactionSupport.resume(transaction);
-        }
-
-        return retValue;
+        return TasksUtil.createTask(this, asyncTaskCreationInfo, 
parentCommand, description, entityType, entityIds);
     }
 
-    /**
-     * Create the {@link SPMAsyncTask} object to be run
-     * @param asyncTaskCreationInfo Info on how to create the task
-     * @param parentCommand The type of command issuing the task
-     * @return An {@link SPMAsyncTask} object representing the task to be run
-     */
-    protected SPMAsyncTask concreteCreateTask
-            (AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType 
parentCommand) {
-
-        VdcActionParametersBase parentParameters = 
getParametersForTask(parentCommand, getParameters());
-        if (parentParameters.getParametersCurrentUser() == null && 
getCurrentUser() != null) {
-            parentParameters.setParametersCurrentUser(getCurrentUser());
-        }
-        AsyncTaskParameters p =
-                new AsyncTaskParameters(asyncTaskCreationInfo, new 
AsyncTasks(parentCommand,
-                        AsyncTaskResultEnum.success,
-                        AsyncTaskStatusEnum.running,
-                        asyncTaskCreationInfo.getTaskID(),
-                        parentParameters,
-                        getParameters(),
-                        asyncTaskCreationInfo.getStepId(),
-                        
getCommandId(),asyncTaskCreationInfo.getStoragePoolID(),
-                        asyncTaskCreationInfo.getTaskType()));
-        p.setEntityId(getParameters().getEntityId());
-        return 
AsyncTaskManager.getInstance().CreateTask(internalGetTaskType(), p);
+    public SPMAsyncTask concreteCreateTask(
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
+            VdcActionType parentCommand) {
+        return TasksUtil.concreteCreateTask(this, asyncTaskCreationInfo, 
parentCommand);
     }
 
     /** @return The type of task that should be created for this command. 
Commands that do not create async tasks should throw a {@link 
UnsupportedOperationException} */
-    private AsyncTaskType internalGetTaskType() {
-        if (hasTaskHandlers()) {
-            if (getParameters().getExecutionReason() == 
CommandExecutionReason.REGULAR_FLOW) {
-                return getCurrentTaskHandler().getTaskType();
-            }
-            return getCurrentTaskHandler().getRevertTaskType();
-        }
-        return getTaskType();
-    }
-
-    /** @return The type of task that should be created for this command. 
Commands that do not create async tasks should throw a {@link 
UnsupportedOperationException} */
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         throw new UnsupportedOperationException();
     }
 
@@ -1410,23 +1348,11 @@
     }
 
     private void cancelTasks() {
-        if (hasTasks()) {
-            ThreadPoolUtil.execute(new Runnable() {
-                @Override
-                public void run() {
-                    log.infoFormat("Rollback for command: {0}.", 
CommandBase.this.getClass().getName());
-                    try {
-                        
getAsyncTaskManager().CancelTasks(getReturnValue().getTaskIdList());
-                    } catch (Exception e) {
-                        log.errorFormat("Failed to cancel tasks for command: 
{0}.",
-                                CommandBase.this.getClass().getName());
-                    }
-                }
-            });
-        }
+        TasksUtil.cancelTasks(this);
     }
 
     protected void revertTasks() {
+        TasksUtil.revertTasks(this);
         if (getParameters().getTaskIds() != null) {
             // list to send to the PollTasks method
             ArrayList<Guid> taskIdAsList = new ArrayList<Guid>();
@@ -1817,11 +1743,11 @@
         return taskHandlers;
     }
 
-    protected boolean hasTaskHandlers() {
+    public boolean hasTaskHandlers() {
         return getTaskHandlers() != null;
     }
 
-    protected SPMAsyncTaskHandler getCurrentTaskHandler() {
+    public SPMAsyncTaskHandler getCurrentTaskHandler() {
         return getTaskHandlers().get(getExecutionIndex());
     }
 
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 8713df9..a8fc05f 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
@@ -88,7 +88,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.copyImage;
     }
 }
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 10c9837..33958e0 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
@@ -108,7 +108,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.copyImage;
     }
 
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 c205b42..8e408b8 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
@@ -126,7 +126,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.createVolume;
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTasksStatusesByTasksIDsQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTasksStatusesByTasksIDsQuery.java
index a872672..3ac20bc 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTasksStatusesByTasksIDsQuery.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetTasksStatusesByTasksIDsQuery.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll;
 
+import org.ovirt.engine.core.tasks.AsyncTaskManager;
 import org.ovirt.engine.core.common.queries.*;
 
 public class GetTasksStatusesByTasksIDsQuery<P extends 
GetTasksStatusesByTasksIDsParameters>
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 47ad678..062237f 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
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll;
 
+import org.ovirt.engine.core.tasks.AsyncTaskManager;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -186,7 +187,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.createVolume;
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
index 789cf38..216660b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.core.bll;
 
 
+import org.ovirt.engine.core.tasks.AsyncTaskManager;
 import javax.annotation.PostConstruct;
 import javax.ejb.DependsOn;
 import javax.ejb.Singleton;
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 91a9170..89c239c 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
@@ -145,7 +145,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.moveImage;
     }
 
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 34a7132..981f91d 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
@@ -92,7 +92,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.deleteImage;
     }
 
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 0324a48..089f906 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
@@ -61,7 +61,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.mergeSnapshots;
     }
 
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 2dd3caa..7651dcb 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
@@ -40,7 +40,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.deleteImage;
     }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
index 48f3d0d..dbf5dbe 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmCommand.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll;
 
+import org.ovirt.engine.core.tasks.AsyncTaskManager;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java
index 1520949..10be858 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RemoveVmFromImportExportCommand.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll;
 
+import org.ovirt.engine.core.tasks.AsyncTaskManager;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
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 798a32a..dc00016 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
@@ -62,7 +62,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.deleteVolume;
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java
index 6bd21a7..e745a60 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll;
 
+import org.ovirt.engine.core.tasks.AsyncTaskManager;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
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 dea3cdb..50bb198 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
@@ -1,5 +1,6 @@
 package org.ovirt.engine.core.bll;
 
+import org.ovirt.engine.core.tasks.AsyncTaskManager;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
@@ -293,7 +294,7 @@
     }
 
     @Override
-    protected AsyncTaskType getTaskType() {
+    public AsyncTaskType getTaskType() {
         return AsyncTaskType.deleteImage;
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/CreateImagePlaceholderTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/CreateImagePlaceholderTaskHandler.java
index 58b1f5b..9cb3a4b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/CreateImagePlaceholderTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/CreateImagePlaceholderTaskHandler.java
@@ -2,7 +2,7 @@
 
 import org.ovirt.engine.core.bll.AbstractSPMAsyncTaskHandler;
 import org.ovirt.engine.core.bll.ImagesHandler;
-import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.tasks.TaskHandlerCommand;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
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 d443ec6..b656b2a 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
@@ -6,8 +6,8 @@
 import org.ovirt.engine.core.bll.MoveOrCopyDiskCommand;
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
-import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
-import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.tasks.SPMAsyncTaskHandler;
+import org.ovirt.engine.core.tasks.TaskHandlerCommand;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
index 025bcab..e7c5e42 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveMigrateDisksTaskHandler.java
@@ -3,8 +3,8 @@
 import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
-import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
-import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.tasks.SPMAsyncTaskHandler;
+import org.ovirt.engine.core.tasks.TaskHandlerCommand;
 import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters;
 import org.ovirt.engine.core.common.action.LiveMigrateVmDisksParameters;
 import org.ovirt.engine.core.common.action.VdcActionType;
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 676ff5b..a386bb4 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
@@ -16,8 +16,8 @@
 import org.ovirt.engine.core.bll.quota.QuotaConsumptionParameter;
 import org.ovirt.engine.core.bll.quota.QuotaStorageConsumptionParameter;
 import org.ovirt.engine.core.bll.quota.QuotaStorageDependent;
-import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
-import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.tasks.SPMAsyncTaskHandler;
+import org.ovirt.engine.core.tasks.TaskHandlerCommand;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.bll.validator.StorageDomainValidator;
 import org.ovirt.engine.core.common.VdcObjectType;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
index bdd1c08..33c5a42 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/LiveSnapshotTaskHandler.java
@@ -5,8 +5,8 @@
 import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.ImagesHandler;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
-import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
-import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.tasks.SPMAsyncTaskHandler;
+import org.ovirt.engine.core.tasks.TaskHandlerCommand;
 import org.ovirt.engine.core.common.action.CreateAllSnapshotsFromVmParameters;
 import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters;
 import org.ovirt.engine.core.common.action.LiveMigrateVmDisksParameters;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
index b7ae2ff..9d817c0 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskFinishTaskHandler.java
@@ -3,7 +3,7 @@
 import org.ovirt.engine.core.bll.AbstractSPMAsyncTaskHandler;
 import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.ImagesHandler;
-import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.tasks.TaskHandlerCommand;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskStartTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskStartTaskHandler.java
index f6e06cc..1873d12 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskStartTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/lsm/VmReplicateDiskStartTaskHandler.java
@@ -1,7 +1,7 @@
 package org.ovirt.engine.core.bll.lsm;
 
 import org.ovirt.engine.core.bll.AbstractSPMAsyncTaskHandler;
-import org.ovirt.engine.core.bll.tasks.TaskHandlerCommand;
+import org.ovirt.engine.core.tasks.TaskHandlerCommand;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.LiveMigrateDiskParameters;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskFactory.java
similarity index 98%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskFactory.java
index 0be5349..e732e7b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskFactory.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskFactory.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.tasks;
 
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskManager.java
similarity index 99%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskManager.java
index 155f676..13f53cb 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskManager.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskManager.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.tasks;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -11,7 +11,7 @@
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
-import org.ovirt.engine.core.bll.tasks.AsyncTaskUtils;
+import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.action.VdcActionType;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskState.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskState.java
similarity index 89%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskState.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskState.java
index 40e1f3c..3a8ef19 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AsyncTaskState.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskState.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.tasks;
 
 public enum AsyncTaskState {
     Initializing,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskUtils.java
similarity index 94%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskUtils.java
index 57697ca..b2fb212 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/AsyncTaskUtils.java
@@ -1,6 +1,5 @@
-package org.ovirt.engine.core.bll.tasks;
+package org.ovirt.engine.core.tasks;
 
-import org.ovirt.engine.core.bll.SPMAsyncTask;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/EntityAsyncTask.java
similarity index 97%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/EntityAsyncTask.java
index 0dd8a08..3854abe 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityAsyncTask.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/EntityAsyncTask.java
@@ -1,9 +1,12 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.tasks;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.ovirt.engine.core.bll.Backend;
+import org.ovirt.engine.core.bll.CommandBase;
+import org.ovirt.engine.core.bll.CommandsFactory;
 
 import org.ovirt.engine.core.bll.context.CommandContext;
 import org.ovirt.engine.core.bll.job.ExecutionContext;
@@ -75,7 +78,7 @@
     }
 
     @Override
-    protected void ConcreteStartPollingTask() {
+    public void ConcreteStartPollingTask() {
         EntityMultiAsyncTasks entityInfo = GetEntityMultiAsyncTasks();
         entityInfo.StartPollingTask(getTaskID());
     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityMultiAsyncTasks.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/EntityMultiAsyncTasks.java
similarity index 99%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityMultiAsyncTasks.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/EntityMultiAsyncTasks.java
index 7706695..39fe46c 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/EntityMultiAsyncTasks.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/EntityMultiAsyncTasks.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.tasks;
 
 import java.util.List;
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/SPMAsyncTask.java
similarity index 99%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/SPMAsyncTask.java
index 75ee506..e1980e4 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SPMAsyncTask.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/SPMAsyncTask.java
@@ -1,5 +1,6 @@
-package org.ovirt.engine.core.bll;
+package org.ovirt.engine.core.tasks;
 
+import org.ovirt.engine.core.bll.Backend;
 import static 
org.ovirt.engine.core.common.config.ConfigValues.UknownTaskPrePollingLapse;
 
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
@@ -152,7 +153,7 @@
         return idlePeriodPassed;
     }
 
-    protected void ConcreteStartPollingTask() {
+    public void ConcreteStartPollingTask() {
         setState(AsyncTaskState.Polling);
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTaskHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/SPMAsyncTaskHandler.java
similarity index 95%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTaskHandler.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/SPMAsyncTaskHandler.java
index 2140daa..24bef5e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTaskHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/SPMAsyncTaskHandler.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll.tasks;
+package org.ovirt.engine.core.tasks;
 
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
 
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/tasks/TaskHandlerCommand.java
similarity index 95%
rename from 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/TaskHandlerCommand.java
rename to 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/TaskHandlerCommand.java
index 98974e9..4e2e475 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/tasks/TaskHandlerCommand.java
@@ -1,4 +1,4 @@
-package org.ovirt.engine.core.bll.tasks;
+package org.ovirt.engine.core.tasks;
 
 import org.ovirt.engine.core.bll.job.ExecutionContext;
 import org.ovirt.engine.core.common.VdcObjectType;
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/TasksUtil.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/TasksUtil.java
new file mode 100644
index 0000000..d5ef1bd
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/tasks/TasksUtil.java
@@ -0,0 +1,170 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.ovirt.engine.core.tasks;
+
+import java.util.ArrayList;
+import javax.transaction.Transaction;
+import org.ovirt.engine.core.bll.CommandBase;
+import org.ovirt.engine.core.bll.job.ExecutionHandler;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
+import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum;
+import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
+import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum;
+import org.ovirt.engine.core.common.businessentities.AsyncTasks;
+import org.ovirt.engine.core.common.job.ExternalSystemType;
+import org.ovirt.engine.core.common.job.Step;
+import org.ovirt.engine.core.common.job.StepEnum;
+import 
org.ovirt.engine.core.common.vdscommands.SPMTaskGuidBaseVDSCommandParameters;
+import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.utils.log.Log;
+import org.ovirt.engine.core.utils.log.LogFactory;
+import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
+import org.ovirt.engine.core.utils.transaction.TransactionSupport;
+
+/**
+ *
+ * @author rnori
+ */
+public class TasksUtil {
+    public static final TasksUtil instance = new TasksUtil();
+    public static final Log log = LogFactory.getLog(instance.getClass());
+    /**
+     * Use this method in order to create task in the AsyncTaskManager in a 
safe way. If you use this method within a
+     * certain command, make sure that the command implemented the 
ConcreteCreateTask method.
+     *
+     * @param asyncTaskCreationInfo
+     *            info to send to AsyncTaskManager when creating the task.
+     * @param parentCommand
+     *            VdcActionType of the command that its EndAction we want to 
invoke when tasks are finished.
+     * @param description
+     *            A message which describes the task
+     * @param entityType
+     *            type of entities that are associated with the task
+     * @param entityIds
+     *            Ids of entities to be associated with task
+     * @return Guid of the created task.
+     */
+    public static Guid createTask(
+            CommandBase command,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
+            VdcActionType parentCommand,
+            String description, VdcObjectType entityType, Guid... entityIds) {
+        Guid retValue = Guid.Empty;
+
+        Transaction transaction = TransactionSupport.suspend();
+
+        try {
+            Step taskStep =
+                    ExecutionHandler.addTaskStep(command.getExecutionContext(),
+                            
StepEnum.getStepNameByTaskType(asyncTaskCreationInfo.getTaskType()),
+                            description);
+            if (taskStep != null) {
+                asyncTaskCreationInfo.setStepId(taskStep.getId());
+            }
+            SPMAsyncTask task = concreteCreateTask(command, 
asyncTaskCreationInfo, parentCommand);
+            retValue = task.getTaskID();
+            task.setEntityType(entityType);
+            task.setAssociatedEntities(entityIds);
+            AsyncTaskUtils.addOrUpdateTaskInDB(task);
+            getAsyncTaskManager().lockAndAddTaskToManager(task);
+            retValue = task.getTaskID();
+            ExecutionHandler.updateStepExternalId(taskStep, retValue, 
ExternalSystemType.VDSM);
+        } catch (RuntimeException ex) {
+            log.errorFormat("Error during CreateTask for command: {0}. 
Exception {1}", instance.getClass().getName(), ex);
+        } finally {
+            TransactionSupport.resume(transaction);
+        }
+
+        return retValue;
+    }
+
+    /**
+     * Create the {@link SPMAsyncTask} object to be run
+     * @param asyncTaskCreationInfo Info on how to create the task
+     * @param parentCommand The type of command issuing the task
+     * @return An {@link SPMAsyncTask} object representing the task to be run
+     */
+    public static SPMAsyncTask concreteCreateTask(CommandBase command,
+            AsyncTaskCreationInfo asyncTaskCreationInfo,
+            VdcActionType parentCommand) {
+
+        VdcActionParametersBase parentParameters = 
command.getParametersForTask(parentCommand, command.getParameters());
+        if (parentParameters.getParametersCurrentUser() == null && 
command.getCurrentUser() != null) {
+            
parentParameters.setParametersCurrentUser(command.getCurrentUser());
+        }
+        AsyncTaskParameters p =
+                new AsyncTaskParameters(asyncTaskCreationInfo, new 
AsyncTasks(parentCommand,
+                        AsyncTaskResultEnum.success,
+                        AsyncTaskStatusEnum.running,
+                        asyncTaskCreationInfo.getTaskID(),
+                        parentParameters,
+                        command.getParameters(),
+                        asyncTaskCreationInfo.getStepId(),
+                        
command.getCommandId(),asyncTaskCreationInfo.getStoragePoolID(),
+                        asyncTaskCreationInfo.getTaskType()));
+        p.setEntityId(command.getParameters().getEntityId());
+        return 
AsyncTaskManager.getInstance().CreateTask(internalGetTaskType(command), p);
+    }
+
+    public static void cancelTasks(final CommandBase command) {
+        if (command.hasTasks()) {
+            ThreadPoolUtil.execute(new Runnable() {
+                @Override
+                public void run() {
+                    log.infoFormat("Rollback for command: {0}.", 
command.getClass().getName());
+                    try {
+                        
getAsyncTaskManager().CancelTasks(command.getReturnValue().getTaskIdList());
+                    } catch (Exception e) {
+                        log.errorFormat("Failed to cancel tasks for command: 
{0}.",
+                                command.getClass().getName());
+                    }
+                }
+            });
+        }
+    }
+
+    public static void revertTasks(CommandBase command) {
+        if (command.getParameters().getTaskIds() != null) {
+            // list to send to the PollTasks method
+            ArrayList<Guid> taskIdAsList = new ArrayList<Guid>();
+
+            for (Guid taskId : command.getParameters().getTaskIds()) {
+                taskIdAsList.add(taskId);
+                ArrayList<AsyncTaskStatus> tasksStatuses = 
getAsyncTaskManager().PollTasks(
+                        taskIdAsList);
+                // call revert task only if ended successfully
+                if (tasksStatuses.get(0).getTaskEndedSuccessfully()) {
+                    SPMTaskGuidBaseVDSCommandParameters tempVar = new 
SPMTaskGuidBaseVDSCommandParameters(
+                            command.getStoragePool().getId(), taskId);
+                    
tempVar.setCompatibilityVersion(command.getStoragePool().getcompatibility_version().toString());
+                    
command.getBackend().getResourceManager().RunVdsCommand(VDSCommandType.SPMRevertTask,
 tempVar);
+                }
+                taskIdAsList.clear();
+            }
+        }
+    }
+
+
+    /** @return The type of task that should be created for this command. 
Commands that do not create async tasks should throw a {@link 
UnsupportedOperationException} */
+    public static AsyncTaskType internalGetTaskType(CommandBase command) {
+        if (command.hasTaskHandlers()) {
+            if (command.getParameters().getExecutionReason() == 
VdcActionParametersBase.CommandExecutionReason.REGULAR_FLOW) {
+                return command.getCurrentTaskHandler().getTaskType();
+            }
+            return command.getCurrentTaskHandler().getRevertTaskType();
+        }
+        return command.getTaskType();
+    }
+
+    public static AsyncTaskManager getAsyncTaskManager() {
+        return AsyncTaskManager.getInstance();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
index 6a059b0..53b14b5 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
@@ -1,5 +1,8 @@
 package org.ovirt.engine.core.bll;
 
+import org.ovirt.engine.core.tasks.AsyncTaskState;
+import org.ovirt.engine.core.tasks.EntityAsyncTask;
+import org.ovirt.engine.core.tasks.SPMAsyncTask;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
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 88b4128..f1ad4c5 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
@@ -22,7 +22,7 @@
 import org.junit.ClassRule;
 import org.junit.Test;
 import org.ovirt.engine.core.bll.session.SessionDataContainer;
-import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
+import org.ovirt.engine.core.tasks.SPMAsyncTaskHandler;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.config.ConfigValues;


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7d2770f355274159c30def80c7c263bb590a64f7
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