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