Ravi Nori has uploaded a new change for review.

Change subject: engine : Introduction of TaskHelper interface
......................................................................

engine : Introduction of TaskHelper interface

This patch introduces the patch helper interface and
removes methods from AsyncTaskManager and SPMAsyncTask
and moves them to CommandCoordinator

Change-Id: I7c5b3db8d679096aab5d791ba61084d54c26b9de
Signed-off-by: Ravi Nori <rn...@redhat.com>
---
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/tasks/AsyncTaskManager.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskUtils.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandCoordinatorImpl.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/SPMTask.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/BackwardCompatibilityTaskCreationTest.java
10 files changed, 245 insertions(+), 70 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/34/26334/1

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 58ca7ae..b2de356 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,6 +1,5 @@
 package org.ovirt.engine.core.bll;
 
-import org.ovirt.engine.core.bll.tasks.SPMAsyncTask;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -38,6 +37,7 @@
 import org.ovirt.engine.core.bll.session.SessionDataContainer;
 import org.ovirt.engine.core.bll.tasks.SPMAsyncTaskHandler;
 import org.ovirt.engine.core.bll.tasks.TaskManagerUtil;
+import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
 import org.ovirt.engine.core.bll.utils.PermissionSubject;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
@@ -1568,7 +1568,7 @@
      * @param parentCommand The type of command issuing the task
      * @return An {@link SPMAsyncTask} object representing the task to be run
      */
-    public SPMAsyncTask concreteCreateTask(
+    public SPMTask concreteCreateTask(
             Guid taskId,
             AsyncTaskCreationInfo asyncTaskCreationInfo,
             VdcActionType parentCommand) {
@@ -1597,7 +1597,7 @@
     }
 
     /** @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 AsyncTaskType internalGetTaskType() {
+    private AsyncTaskType internalGetTaskType() {
         if (hasTaskHandlers()) {
             if (getParameters().getExecutionReason() == 
CommandExecutionReason.REGULAR_FLOW) {
                 return getCurrentTaskHandler().getTaskType();
@@ -1610,6 +1610,10 @@
     /** @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() {
         throw new UnsupportedOperationException();
+    }
+
+    public AsyncTaskType getAsyncTaskType() {
+        return getTaskType();
     }
 
     protected void startPollingAsyncTasks(Collection<Guid> taskIds) {
@@ -1995,11 +1999,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/tasks/AsyncTaskManager.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java
index 63fd1e8..bd68a5e 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/AsyncTaskManager.java
@@ -13,8 +13,8 @@
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.lang.exception.ExceptionUtils;
-import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator;
+import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VdcActionType;
@@ -30,7 +30,6 @@
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBLLException;
 import org.ovirt.engine.core.common.errors.VdcBllErrors;
-import org.ovirt.engine.core.common.vdscommands.IrsBaseVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.compat.DateTime;
 import org.ovirt.engine.core.compat.Guid;
@@ -55,7 +54,7 @@
     private static final Log log = LogFactory.getLog(AsyncTaskManager.class);
 
     /** Map which consist all tasks that currently are monitored **/
-    private ConcurrentMap<Guid, SPMAsyncTask> _tasks;
+    private ConcurrentMap<Guid, SPMTask> _tasks;
 
     /** Indication if _tasks has changed for logging process. **/
     private boolean logChangedMap = true;
@@ -90,7 +89,7 @@
 
     private AsyncTaskManager(CommandCoordinator coco) {
         this.coco = coco;
-        _tasks = new ConcurrentHashMap<Guid, SPMAsyncTask>();
+        _tasks = new ConcurrentHashMap<Guid, SPMTask>();
 
         SchedulerUtil scheduler = SchedulerUtilQuartzImpl.getInstance();
         scheduler.scheduleAFixedDelayJob(this, "_timer_Elapsed", new Class[]{},
@@ -170,7 +169,7 @@
      * @return - true for uncached object , and false when the object should be
      * cached.
      */
-    public synchronized boolean cachingOver(SPMAsyncTask task) {
+    public synchronized boolean cachingOver(SPMTask task) {
         // Get time in milliseconds that the task should be cached
         long SubtractMinutesAsMills = TimeUnit.MINUTES
                 .toMillis(_cacheTimeInMinutes);
@@ -186,7 +185,7 @@
     public synchronized boolean hasTasksByStoragePoolId(Guid storagePoolID) {
         boolean retVal = false;
         if (_tasks != null) {
-            for (SPMAsyncTask task : _tasks.values()) {
+            for (SPMTask task : _tasks.values()) {
                 if (task.getStoragePoolID().equals(storagePoolID)) {
                     retVal = true;
                     break;
@@ -198,7 +197,7 @@
 
     public synchronized boolean hasTasksForEntityIdAndAction(Guid id, 
VdcActionType type) {
         if (_tasks != null) {
-            for (SPMAsyncTask task : _tasks.values()) {
+            for (SPMTask task : _tasks.values()) {
                 if (isCurrentTaskLookedFor(id, task)
                         && 
type.equals(task.getParameters().getDbAsyncTask().getaction_type())) {
                     return true;
@@ -340,14 +339,14 @@
                     task.getTaskId(),
                     (task.getaction_type()));
         AsyncTaskCreationInfo creationInfo = new 
AsyncTaskCreationInfo(Guid.Empty, task.getTaskType(), task.getStoragePoolId());
-        SPMAsyncTask spmTask = AsyncTaskFactory.construct(coco, creationInfo, 
task);
+        SPMTask spmTask = coco.construct(creationInfo, task);
         AsyncTaskStatus failureStatus = new AsyncTaskStatus();
         failureStatus.setStatus(AsyncTaskStatusEnum.finished);
         failureStatus.setResult(AsyncTaskResultEnum.failure);
         failureStatus.setMessage(message);
         spmTask.setState(AsyncTaskState.Ended);
         spmTask.setLastTaskStatus(failureStatus);
-        spmTask.UpdateTask(failureStatus);
+        spmTask.updateTask(failureStatus);
     }
 
     private static VdcActionType getEndActionType(AsyncTasks dbAsyncTask) {
@@ -370,7 +369,7 @@
         }
     }
 
-    private boolean isCurrentTaskLookedFor(Guid id, SPMAsyncTask task) {
+    private boolean isCurrentTaskLookedFor(Guid id, SPMTask task) {
         return (task instanceof CommandAsyncTask) && 
id.equals(task.getParameters().getEntityInfo().getId())
                 && (task.getState() != AsyncTaskState.Cleared)
                 && (task.getState() != AsyncTaskState.ClearFailed);
@@ -379,7 +378,7 @@
     private void cleanZombieTasks() {
         long maxTime = DateTime.getNow()
                 .addMinutes((-1) * 
Config.<Integer>getValue(ConfigValues.AsyncTaskZombieTaskLifeInMinutes)).getTime();
-        for (SPMAsyncTask task : _tasks.values()) {
+        for (SPMTask task : _tasks.values()) {
 
             if (task.getParameters().getDbAsyncTask().getStartTime().getTime() 
< maxTime) {
                 AuditLogableBase logable = new AuditLogableBase();
@@ -412,7 +411,7 @@
 
     private int numberOfTasksToPoll() {
         int retValue = 0;
-        for (SPMAsyncTask task : _tasks.values()) {
+        for (SPMTask task : _tasks.values()) {
             if (task.getShouldPoll()) {
                 retValue++;
             }
@@ -422,7 +421,7 @@
     }
 
     private boolean thereAreTasksToPoll() {
-        for (SPMAsyncTask task : _tasks.values()) {
+        for (SPMTask task : _tasks.values()) {
             if (task.getShouldPoll()) {
                 return true;
             }
@@ -457,7 +456,7 @@
      */
     private void updateTaskStatuses(
                                     Map<Guid, Map<Guid, AsyncTaskStatus>> 
poolsAllTasksMap) {
-        for (SPMAsyncTask task : _tasks.values()) {
+        for (SPMTask task : _tasks.values()) {
             if (task.getShouldPoll()) {
                 Map<Guid, AsyncTaskStatus> asyncTasksForPoolMap = 
poolsAllTasksMap
                         .get(task.getStoragePoolID());
@@ -468,7 +467,7 @@
                             .get(task.getVdsmTaskId());
 
                     // task found in VDSM.
-                    task.UpdateTask(cachedAsyncTaskStatus);
+                    task.updateTask(cachedAsyncTaskStatus);
                 }
             }
         }
@@ -491,10 +490,7 @@
         // For each pool Id (SPM) ,add its tasks to the map.
         for (Guid storagePoolID : poolsOfActiveTasks) {
             try {
-                Map<Guid, AsyncTaskStatus> map =
-                        (Map<Guid, AsyncTaskStatus>) 
Backend.getInstance().getResourceManager().RunVdsCommand(
-                                VDSCommandType.SPMGetAllTasksStatuses,
-                                new 
IrsBaseVDSCommandParameters(storagePoolID)).getReturnValue();
+                Map<Guid, AsyncTaskStatus> map = 
coco.getAllTasksStatuses(storagePoolID);
                 if (map != null) {
                     poolsAsyncTaskMap.put(storagePoolID, map);
                 }
@@ -524,7 +520,7 @@
     private Set<Guid> getPoolIdsTasks() {
         Set<Guid> poolsOfActiveTasks = new HashSet<Guid>();
 
-        for (SPMAsyncTask task : _tasks.values()) {
+        for (SPMTask task : _tasks.values()) {
             if (task.getShouldPoll()) {
                 poolsOfActiveTasks.add(task.getStoragePoolID());
             }
@@ -541,8 +537,8 @@
     synchronized private void removeClearedAndOldTasks() {
         Set<Guid> poolsOfActiveTasks = new HashSet<Guid>();
         Set<Guid> poolsOfClearedAndOldTasks = new HashSet<Guid>();
-        ConcurrentMap<Guid, SPMAsyncTask> activeTaskMap = new 
ConcurrentHashMap<Guid, SPMAsyncTask>();
-        for (SPMAsyncTask task : _tasks.values()) {
+        ConcurrentMap<Guid, SPMTask> activeTaskMap = new 
ConcurrentHashMap<Guid, SPMTask>();
+        for (SPMTask task : _tasks.values()) {
             if (!cachingOver(task)) {
                 activeTaskMap.put(task.getVdsmTaskId(), task);
                 poolsOfActiveTasks.add(task.getStoragePoolID());
@@ -562,11 +558,11 @@
         }
     }
 
-    public synchronized void lockAndAddTaskToManager(SPMAsyncTask task) {
+    public synchronized void lockAndAddTaskToManager(SPMTask task) {
         addTaskToManager(task);
     }
 
-    private void addTaskToManager(SPMAsyncTask task) {
+    private void addTaskToManager(SPMTask task) {
         if (task == null) {
             log.error("Cannot add a null task.");
         } else {
@@ -583,7 +579,7 @@
                 // quartz execution.
                 addTaskToMap(task.getVdsmTaskId(), task);
             } else {
-                SPMAsyncTask existingTask = _tasks.get(task.getVdsmTaskId());
+                SPMTask existingTask = _tasks.get(task.getVdsmTaskId());
                 if 
(existingTask.getParameters().getDbAsyncTask().getaction_type() == 
VdcActionType.Unknown
                         && 
task.getParameters().getDbAsyncTask().getaction_type() != 
VdcActionType.Unknown) {
                     log.infoFormat(
@@ -606,7 +602,7 @@
      * @param guid - Key of the map.
      * @param asyncTask - Value of the map.
      */
-    private void addTaskToMap(Guid guid, SPMAsyncTask asyncTask) {
+    private void addTaskToMap(Guid guid, SPMTask asyncTask) {
         _tasks.put(guid, asyncTask);
         logChangedMap = true;
     }
@@ -617,7 +613,7 @@
      *
      * @param asyncTaskMap - Map to copy to _tasks map.
      */
-    private void setNewMap(ConcurrentMap<Guid, SPMAsyncTask> asyncTaskMap) {
+    private void setNewMap(ConcurrentMap<Guid, SPMTask> asyncTaskMap) {
         // If not the same set _tasks to be as asyncTaskMap.
         _tasks = asyncTaskMap;
 
@@ -628,13 +624,13 @@
         log.infoFormat("Setting new tasks map. The map contains now {0} 
tasks", _tasks.size());
     }
 
-    public SPMAsyncTask createTask(AsyncTaskType taskType, AsyncTaskParameters 
taskParameters) {
-        return AsyncTaskFactory.construct(coco, taskType, taskParameters, 
false);
+    public SPMTask createTask(AsyncTaskType taskType, AsyncTaskParameters 
taskParameters) {
+        return coco.construct(taskType, taskParameters, false);
     }
 
     public synchronized void startPollingTask(Guid vdsmTaskId) {
         if (_tasks.containsKey(vdsmTaskId)) {
-            _tasks.get(vdsmTaskId).StartPollingTask();
+            _tasks.get(vdsmTaskId).startPollingTask();
         }
     }
 
@@ -673,9 +669,7 @@
     public void addStoragePoolExistingTasks(StoragePool sp) {
         List<AsyncTaskCreationInfo> currPoolTasks = null;
         try {
-            currPoolTasks = (ArrayList<AsyncTaskCreationInfo>) 
Backend.getInstance().getResourceManager()
-                    .RunVdsCommand(VDSCommandType.SPMGetAllTasksInfo, new 
IrsBaseVDSCommandParameters(sp.getId()))
-                    .getReturnValue();
+            currPoolTasks = coco.getAllTasksInfo(sp.getId());
         } catch (RuntimeException e) {
             log.error(
                     String.format(
@@ -686,16 +680,16 @@
 
         if (currPoolTasks != null && currPoolTasks.size() > 0) {
             synchronized (this) {
-                final List<SPMAsyncTask> newlyAddedTasks = new 
ArrayList<SPMAsyncTask>();
+                final List<SPMTask> newlyAddedTasks = new ArrayList<SPMTask>();
 
                 for (AsyncTaskCreationInfo creationInfo : currPoolTasks) {
                     creationInfo.setStoragePoolID(sp.getId());
                     if (!_tasks.containsKey(creationInfo.getVdsmTaskId())) {
                         try {
-                            SPMAsyncTask task;
+                            SPMTask task;
                             if 
(partiallyCompletedCommandTasks.containsKey(creationInfo.getVdsmTaskId())) {
                                 AsyncTasks asyncTaskInDb = 
partiallyCompletedCommandTasks.get(creationInfo.getVdsmTaskId());
-                                task = AsyncTaskFactory.construct(coco, 
creationInfo, asyncTaskInDb);
+                                task = coco.construct(creationInfo, 
asyncTaskInDb);
                                 if (task.getEntitiesMap() == null) {
                                     task.setEntitiesMap(new HashMap<Guid, 
VdcObjectType>());
                                 }
@@ -704,7 +698,7 @@
                                 // Will result in failure of the command
                                 task.setPartiallyCompletedCommandTask(true);
                             } else {
-                                task = AsyncTaskFactory.construct(coco, 
creationInfo);
+                                task = coco.construct(creationInfo);
                             }
                             addTaskToManager(task);
                             newlyAddedTasks.add(task);
@@ -719,14 +713,14 @@
                 TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
                     @Override
                     public Void runInTransaction() {
-                        for (SPMAsyncTask task : newlyAddedTasks) {
+                        for (SPMTask task : newlyAddedTasks) {
                             AsyncTaskUtils.addOrUpdateTaskInDB(task);
                         }
                         return null;
                     }
                 });
 
-                for (SPMAsyncTask task : newlyAddedTasks) {
+                for (SPMTask task : newlyAddedTasks) {
                     startPollingTask(task.getVdsmTaskId());
                 }
 
@@ -773,12 +767,12 @@
         if (_tasks.containsKey(vdsmTaskId)) {
             log.infoFormat("Attempting to cancel task '{0}'.", vdsmTaskId);
             _tasks.get(vdsmTaskId).stopTask();
-            _tasks.get(vdsmTaskId).ConcreteStartPollingTask();
+            _tasks.get(vdsmTaskId).concreteStartPollingTask();
         }
     }
 
     public synchronized boolean entityHasTasks(Guid id) {
-        for (SPMAsyncTask task : _tasks.values()) {
+        for (SPMTask task : _tasks.values()) {
             if (isCurrentTaskLookedFor(id, task)) {
                 return true;
             }
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/bll/tasks/AsyncTaskUtils.java
index 978d309..bc47a6a 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/bll/tasks/AsyncTaskUtils.java
@@ -5,6 +5,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskEntity;
 import org.ovirt.engine.core.common.businessentities.AsyncTasks;
@@ -28,7 +29,7 @@
      * @param asyncTask
      *            task to be added or updated
      */
-    public static void addOrUpdateTaskInDB(final SPMAsyncTask asyncTask) {
+    public static void addOrUpdateTaskInDB(final SPMTask asyncTask) {
         try {
             if (asyncTask.getParameters().getDbAsyncTask() != null) {
                 
TransactionSupport.executeInScope(TransactionScopeOption.Required, new 
TransactionMethod<Void>() {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
index 6209f42..97c5839 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/CommandAsyncTask.java
@@ -69,7 +69,7 @@
     }
 
     @Override
-    protected void ConcreteStartPollingTask() {
+    public void concreteStartPollingTask() {
         CommandMultiAsyncTasks entityInfo = GetCommandMultiAsyncTasks();
         entityInfo.StartPollingTask(getVdsmTaskId());
     }
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 7268e2f..4393a6f 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
@@ -10,6 +10,7 @@
 import org.ovirt.engine.core.bll.job.ExecutionContext;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator;
+import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VdcActionParametersBase;
 import org.ovirt.engine.core.common.action.VdcActionType;
@@ -24,8 +25,11 @@
 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.IrsBaseVDSCommandParameters;
 import 
org.ovirt.engine.core.common.vdscommands.SPMTaskGuidBaseVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
+import org.ovirt.engine.core.common.vdscommands.VDSParametersBase;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.log.Log;
@@ -42,6 +46,14 @@
     }
 
     private CommandCoordinatorImpl() {
+    }
+
+    public Step addTaskStep(ExecutionContext context, StepEnum stepName, 
String description) {
+        return ExecutionHandler.getInstance().addTaskStep(context, stepName, 
description);
+    }
+
+    public <P extends VdcActionParametersBase> CommandBase<P> 
createCommand(VdcActionType action, P parameters) {
+        return CommandsFactory.getInstance().createCommand(action, parameters);
     }
 
     /**
@@ -97,7 +109,7 @@
                 new AsyncTaskParameters(asyncTaskCreationInfo,
                         getAsyncTask(taskId, command, asyncTaskCreationInfo, 
parentCommand));
         p.setEntityInfo(command.getParameters().getEntityInfo());
-        return createTask(command.internalGetTaskType(), p);
+        return createTask(internalGetTaskType(command), p);
     }
 
     public SPMAsyncTask createTask(AsyncTaskType taskType, AsyncTaskParameters 
taskParameters) {
@@ -148,6 +160,22 @@
                 asyncTaskCreationInfo.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}
+     *
+     */
+    public 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.getAsyncTaskType();
+    }
+
     public void cancelTasks(final CommandBase command) {
         if (command.hasTasks()) {
             ThreadPoolUtil.execute(new Runnable() {
@@ -186,6 +214,49 @@
         }
     }
 
+    @Override
+    public ArrayList<AsyncTaskCreationInfo> getAllTasksInfo(Guid 
storagePoolID) {
+        return (ArrayList<AsyncTaskCreationInfo>) 
runVdsCommand(VDSCommandType.SPMGetAllTasksInfo,
+                new 
IrsBaseVDSCommandParameters(storagePoolID)).getReturnValue();
+    }
+
+    @Override
+    public Map<Guid, AsyncTaskStatus>  getAllTasksStatuses(Guid storagePoolID) 
{
+        return (Map<Guid, AsyncTaskStatus> ) 
runVdsCommand(VDSCommandType.SPMGetAllTasksStatuses,
+                new 
IrsBaseVDSCommandParameters(storagePoolID)).getReturnValue();
+    }
+
+    @Override
+    public void stopTask(Guid storagePoolID, Guid vdsmTaskID) {
+        runVdsCommand(VDSCommandType.SPMStopTask,
+                new SPMTaskGuidBaseVDSCommandParameters(storagePoolID, 
vdsmTaskID));
+    }
+
+    @Override
+    public VDSReturnValue clearTask(Guid storagePoolID, Guid vdsmTaskID) {
+        return runVdsCommand(VDSCommandType.SPMClearTask,
+                new SPMTaskGuidBaseVDSCommandParameters(storagePoolID, 
vdsmTaskID));
+    }
+
+    private VDSReturnValue runVdsCommand(VDSCommandType commandType, 
VDSParametersBase parameters) {
+        return 
Backend.getInstance().getResourceManager().RunVdsCommand(commandType, 
parameters);
+    }
+
+    @Override
+    public SPMTask construct(AsyncTaskCreationInfo creationInfo) {
+        return AsyncTaskFactory.construct(this, creationInfo);
+    }
+
+    @Override
+    public SPMTask construct(AsyncTaskCreationInfo creationInfo, AsyncTasks 
asyncTask) {
+        return AsyncTaskFactory.construct(this, creationInfo.getTaskType(), 
new AsyncTaskParameters(creationInfo, asyncTask), true);
+    }
+
+    @Override
+    public SPMTask construct(AsyncTaskType taskType, AsyncTaskParameters 
asyncTaskParams, boolean duringInit) {
+        return AsyncTaskFactory.construct(this, taskType, asyncTaskParams, 
duringInit);
+    }
+
     public VdcReturnValueBase endAction(Guid stepId,
                                         VdcActionType actionType,
                                         AsyncTasks dbAsyncTask,
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java
index 030514e..5464890 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/SPMAsyncTask.java
@@ -4,9 +4,9 @@
 
 import java.util.Map;
 
-import org.ovirt.engine.core.bll.Backend;
 import org.ovirt.engine.core.bll.job.ExecutionHandler;
 import org.ovirt.engine.core.bll.tasks.interfaces.CommandCoordinator;
+import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters;
 import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
@@ -14,15 +14,13 @@
 import org.ovirt.engine.core.common.config.Config;
 import org.ovirt.engine.core.common.errors.VdcBllErrors;
 import org.ovirt.engine.core.common.job.JobExecutionStatus;
-import 
org.ovirt.engine.core.common.vdscommands.SPMTaskGuidBaseVDSCommandParameters;
-import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
 
-public class SPMAsyncTask {
+public class SPMAsyncTask implements SPMTask {
     CommandCoordinator coco;
     public SPMAsyncTask(CommandCoordinator coco, AsyncTaskParameters 
parameters) {
         this.coco = coco;
@@ -77,6 +75,7 @@
 
     private AsyncTaskStatus _lastTaskStatus = new 
AsyncTaskStatus(AsyncTaskStatusEnum.init);
 
+    @Override
     public AsyncTaskStatus getLastTaskStatus() {
         return _lastTaskStatus;
     }
@@ -87,13 +86,15 @@
      * @param taskStatus
      *            - task status to set.
      */
-    protected void setLastTaskStatus(AsyncTaskStatus taskStatus) {
+    @Override
+    public void setLastTaskStatus(AsyncTaskStatus taskStatus) {
         _lastTaskStatus = taskStatus;
     }
 
     /**
      * Update task last access date ,only for not active task.
      */
+    @Override
     public void setLastStatusAccessTime() {
         // Change access date to now , when task is not active.
         if (getState() == AsyncTaskState.Ended
@@ -107,21 +108,24 @@
     // Indicates time in milliseconds when task status recently changed.
     protected long _lastAccessToStatusSinceEnd = System.currentTimeMillis();
 
+    @Override
     public long getLastAccessToStatusSinceEnd() {
         return _lastAccessToStatusSinceEnd;
     }
 
+    @Override
     public Guid getCommandId() {
         return getParameters().getDbAsyncTask().getRootCommandId();
     }
 
-    public void StartPollingTask() {
+    @Override
+    public void startPollingTask() {
         AsyncTaskState state = getState();
         if (state != AsyncTaskState.AttemptingEndAction
                 && state != AsyncTaskState.Cleared
                 && state != AsyncTaskState.ClearFailed) {
             log.infoFormat("BaseAsyncTask::startPollingTask: Starting to poll 
task '{0}'.", getVdsmTaskId());
-            ConcreteStartPollingTask();
+            concreteStartPollingTask();
         }
     }
 
@@ -149,7 +153,8 @@
         return idlePeriodPassed;
     }
 
-    protected void ConcreteStartPollingTask() {
+    @Override
+    public void concreteStartPollingTask() {
         setState(AsyncTaskState.Polling);
     }
 
@@ -160,7 +165,7 @@
      *            - Task status returned from VDSM.
      */
     @SuppressWarnings("incomplete-switch")
-    public void UpdateTask(AsyncTaskStatus returnTaskStatus) {
+    public void updateTask(AsyncTaskStatus returnTaskStatus) {
         try {
             switch (getState()) {
             case Polling:
@@ -389,10 +394,7 @@
                         (getParameters().getDbAsyncTask().getaction_type()),
                         getParameters().getClass().getName());
 
-                Backend.getInstance()
-                        .getResourceManager()
-                        .RunVdsCommand(VDSCommandType.SPMStopTask,
-                                new 
SPMTaskGuidBaseVDSCommandParameters(getStoragePoolID(), getVdsmTaskId()));
+                coco.stopTask(getStoragePoolID(), getVdsmTaskId());
             } catch (RuntimeException e) {
                 log.error(
                         String.format("SPMAsyncTask::StopTask: Stopping task 
'%1$s' threw an exception.", getVdsmTaskId()),
@@ -425,11 +427,7 @@
 
         try {
             log.infoFormat("SPMAsyncTask::ClearAsyncTask: Attempting to clear 
task '{0}'", getVdsmTaskId());
-            vdsReturnValue = Backend
-                    .getInstance()
-                    .getResourceManager()
-                    .RunVdsCommand(VDSCommandType.SPMClearTask,
-                            new 
SPMTaskGuidBaseVDSCommandParameters(getStoragePoolID(), getVdsmTaskId()));
+            vdsReturnValue = coco.clearTask(getStoragePoolID(), 
getVdsmTaskId());
         }
 
         catch (RuntimeException e) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java
index ed21ae5..0f8b6f9 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/CommandCoordinator.java
@@ -1,4 +1,4 @@
 package org.ovirt.engine.core.bll.tasks.interfaces;
 
-public abstract class CommandCoordinator implements CallBack {
+public abstract class CommandCoordinator implements CallBack, TaskHelper {
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/SPMTask.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/SPMTask.java
new file mode 100644
index 0000000..3732da0
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/SPMTask.java
@@ -0,0 +1,68 @@
+package org.ovirt.engine.core.bll.tasks.interfaces;
+
+import org.ovirt.engine.core.bll.tasks.AsyncTaskState;
+import org.ovirt.engine.core.common.VdcObjectType;
+import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters;
+import org.ovirt.engine.core.common.businessentities.AsyncTaskStatus;
+import org.ovirt.engine.core.compat.Guid;
+
+import java.util.Map;
+
+public interface SPMTask {
+    void concreteStartPollingTask();
+
+    void startPollingTask();
+
+    /**
+     * For each task set its updated status retrieved from VDSM.
+     *
+     * @param returnTaskStatus
+     *            - Task status returned from VDSM.
+     */
+    void updateTask(AsyncTaskStatus returnTaskStatus);
+
+    void clearAsyncTask();
+
+    void clearAsyncTask(boolean forceDelete);
+
+    Object getCommandId();
+
+    long getLastAccessToStatusSinceEnd();
+
+    AsyncTaskStatus getLastTaskStatus();
+
+    void setLastTaskStatus(AsyncTaskStatus taskStatus);
+
+    AsyncTaskParameters getParameters();
+
+    boolean getShouldPoll();
+
+    AsyncTaskState getState();
+
+    Guid getStoragePoolID();
+
+    Guid getVdsmTaskId();
+
+    /**
+     * Update task last access date ,only for not active task.
+     */
+    void setLastStatusAccessTime();
+
+    void setParameters(AsyncTaskParameters value);
+
+    void setState(AsyncTaskState value);
+
+    void stopTask();
+
+    void stopTask(boolean forceFinish);
+
+    void setPartiallyCompletedCommandTask(boolean val);
+
+    boolean isPartiallyCompletedCommandTask();
+
+    Map<Guid, VdcObjectType> getEntitiesMap();
+
+    void setEntitiesMap(Map<Guid, VdcObjectType> entitiesMap);
+
+}
+
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
new file mode 100644
index 0000000..309083d
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/tasks/interfaces/TaskHelper.java
@@ -0,0 +1,39 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.ovirt.engine.core.bll.tasks.interfaces;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+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.AsyncTaskStatus;
+import org.ovirt.engine.core.common.businessentities.AsyncTasks;
+import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
+import org.ovirt.engine.core.compat.Guid;
+
+/**
+ * This interfaces bridges the gap between the bll and the taskmgr packages
+ * There is still a lot of dependency between the packages and as the modules
+ * are refactored some of the methods could be removed.
+ */
+public interface TaskHelper {
+
+    ArrayList<AsyncTaskCreationInfo> getAllTasksInfo(Guid storagePoolID);
+
+    Map<Guid, AsyncTaskStatus> getAllTasksStatuses(Guid storagePoolID);
+
+    void stopTask(Guid storagePoolID, Guid vdsmTaskID);
+
+    public VDSReturnValue clearTask(Guid storagePoolID, Guid vdsmTaskID);
+
+    public SPMTask construct(AsyncTaskCreationInfo creationInfo);
+
+    public SPMTask construct(AsyncTaskCreationInfo creationInfo, AsyncTasks 
asyncTask);
+
+    public SPMTask construct(AsyncTaskType taskType, AsyncTaskParameters 
asyncTaskParams, boolean duringInit);
+
+}
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 7b921fa..a893ce3 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,7 +1,6 @@
 package org.ovirt.engine.core.bll;
 
 import org.ovirt.engine.core.bll.tasks.CommandAsyncTask;
-import org.ovirt.engine.core.bll.tasks.SPMAsyncTask;
 import org.ovirt.engine.core.bll.tasks.AsyncTaskState;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -21,6 +20,7 @@
 import org.junit.experimental.theories.Theories;
 import org.junit.experimental.theories.Theory;
 import org.junit.runner.RunWith;
+import org.ovirt.engine.core.bll.tasks.interfaces.SPMTask;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.AddImageFromScratchParameters;
 import org.ovirt.engine.core.common.action.CreateCloneOfTemplateParameters;
@@ -160,7 +160,7 @@
 
         AsyncTaskCreationInfo info = nextAsyncTaskCreationInfo();
 
-        SPMAsyncTask spmAsyncTask = cmd.concreteCreateTask(Guid.Empty, info, 
cmd.getParameters().getParentCommand());
+        SPMTask spmAsyncTask = cmd.concreteCreateTask(Guid.Empty, info, 
cmd.getParameters().getParentCommand());
         assertEquals("wrong storage pool ID", info.getStoragePoolID(), 
spmAsyncTask.getStoragePoolID());
         assertEquals("wrong task ID", info.getVdsmTaskId(), 
spmAsyncTask.getVdsmTaskId());
         assertEquals("wrong task result", AsyncTaskResultEnum.success, 
spmAsyncTask.getLastTaskStatus().getResult());


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

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