/* * Copyright (c) 2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.service.impl.resource.utils; import static com.emc.storageos.api.mapper.TaskMapper.toTask; import java.net.URI; import java.util.List; import com.emc.storageos.db.client.DbClient; import com.emc.storageos.db.client.model.DataObject; import com.emc.storageos.db.client.model.Operation; import com.emc.storageos.model.TaskList; import com.emc.storageos.svcs.errorhandling.resources.APIException; import com.emc.storageos.volumecontroller.ArrayAffinityAsyncTask; import com.emc.storageos.volumecontroller.AsyncTask; import com.emc.storageos.volumecontroller.ControllerException; /** * Template base object that encapsulate scheduling of Scan/Discover tasks. * Task can be scheduled in 2 ways. All at once as required for scan jobs. * One at the time distributed across multiple nodes as for discover jobs. */ public class DiscoveredObjectTaskScheduler { private DbClient _dbClient; private AsyncTaskExecutorIntf _taskExecutor; public DiscoveredObjectTaskScheduler(DbClient dbClient, AsyncTaskExecutorIntf taskExec) { _dbClient = dbClient; _taskExecutor = taskExec; } public TaskList scheduleAsyncTasks(List<AsyncTask> tasks) { TaskList list = new TaskList(); for (AsyncTask task : tasks) { if (task instanceof ArrayAffinityAsyncTask) { List<URI> systemIds = ((ArrayAffinityAsyncTask) task).getSystemIds(); for (URI uri : systemIds) { DataObject discoveredObject = (DataObject) _dbClient.queryObject(task._clazz, uri); Operation op = new Operation(); op.setResourceType(_taskExecutor.getOperation()); _dbClient.createTaskOpStatus(task._clazz, uri, task._opId, op); list.getTaskList().add(toTask(discoveredObject, task._opId, op)); } } else { DataObject discoveredObject = (DataObject) _dbClient.queryObject(task._clazz, task._id); Operation op = new Operation(); op.setResourceType(_taskExecutor.getOperation()); _dbClient.createTaskOpStatus(task._clazz, task._id, task._opId, op); list.getTaskList().add(toTask(discoveredObject, task._opId, op)); } } try { _taskExecutor.executeTasks(tasks.toArray(new AsyncTask[tasks.size()])); } catch (ControllerException | APIException ex) { for (AsyncTask task : tasks) { DataObject discoveredObject = (DataObject) _dbClient.queryObject(task._clazz, task._id); Operation op = _dbClient.error(task._clazz, task._id, task._opId, ex); list.getTaskList().add(toTask(discoveredObject, task._opId, op)); } } return list; } }