/* * Copyright (c) 2015 EMC Corporation * All Rights Reserved */ package com.emc.vipr.client.core; import static com.emc.vipr.client.core.util.ResourceUtils.defaultList; import java.net.URI; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.ws.rs.core.UriBuilder; import com.emc.storageos.model.BulkIdParam; import com.emc.storageos.model.NamedRelatedResourceRep; import com.emc.storageos.model.TaskList; import com.emc.storageos.model.TaskResourceRep; import com.emc.storageos.model.search.SearchResultResourceRep; import com.emc.storageos.model.tasks.TaskBulkRep; import com.emc.storageos.model.tasks.TaskStatsRestRep; import com.emc.storageos.model.tasks.TasksList; import com.emc.vipr.client.core.impl.PathConstants; import com.emc.vipr.client.impl.RestClient; /** * Tasks resources. * <p> * Base URL: <tt>/vdc/task</tt> */ public class TasksResources extends AbstractBulkResources<TaskResourceRep> { public static final URI SYSTEM_TENANT = URI.create("system"); public static final URI USER_TENANT = null; // Null tells calls to not pass the user tenant public static final Integer FETCH_ALL = -1; public static final String TENANT_PARAM = "tenant"; public static final String RESOURCE_PARAM = "resource"; public static final String MAX_COUNT_PARAM = "max_count"; public static final String START_TIME_PARAM = "startTime"; public static final String END_TIME_PARAM = "endTime"; public static final String STATE_PARAM = "state"; public static enum State { PENDING("pending"), COMPLETED("completed"), ERROR("error"); String literal; State(String literal) { this.literal = literal; } public String getLiteral() { return literal; } } public TasksResources(RestClient client) { super(client, TaskResourceRep.class, PathConstants.TASK_URL); } /** * @return All tasks in the users tenant */ public List<NamedRelatedResourceRep> listAll() { return listByTenant(null, FETCH_ALL, null, null); } /** * List ALL tasks for a specific tenant (use {@link #SYSTEM_TENANT} for System level tasks). * * Tasks are returned sorted with the most recent task first * * @param tenantId The tenant tasks are required for */ public List<NamedRelatedResourceRep> listByTenant(URI tenantId) { return listByTenant(tenantId, FETCH_ALL, null, null); } /** * List specified number of tasks for a specific tenant (use {@link #SYSTEM_TENANT} for System level tasks). * * Tasks are returned sorted with the most recent task first * * @param tenantId The tenant tasks are required for * @param maxCount The maximum number of tasks to return. Use {@link #FETCH_ALL} for all tasks */ public List<NamedRelatedResourceRep> listByTenant(URI tenantId, int maxCount) { return listByTenant(tenantId, maxCount, null, null); } /** * List all tasks for a specific tenant (use {@link #SYSTEM_TENANT} for System level tasks) that were started between * startTime and endTime * * Tasks are returned sorted with the most recent task first * * @param tenantId The tenant tasks are required for * @param maxCount Number of tasks to return or {@link #FETCH_ALL} for all matching tasks * @param startTime Time in milliseconds (Null if not required) * @param endTime End time in milliseconds (Null if not required) */ public List<NamedRelatedResourceRep> listByTenant(URI tenantId, int maxCount, Long startTime, Long endTime) { UriBuilder builder = client.uriBuilder(baseUrl); addTenant(builder, tenantId); builder.queryParam(MAX_COUNT_PARAM, maxCount); if (startTime != null) { builder.queryParam(START_TIME_PARAM, startTime); } if (endTime != null) { builder.queryParam(END_TIME_PARAM, endTime); } URI uri = builder.build(); return client.resource(uri).get(TasksList.class).getTasks(); } public List<TaskResourceRep> findByResource(URI resourceId) { List<SearchResultResourceRep> results = performSearchBy(RESOURCE_PARAM, resourceId); return getByRefs(results); } /** * Returns tasks matching a particular state for the given tenant */ public List<TaskResourceRep> findByState(URI tenantId, State state) { Map<String, Object> params = new HashMap<>(); params.put(TENANT_PARAM, tenantId); params.put(STATE_PARAM, state.getLiteral()); List<SearchResultResourceRep> results = performSearch(params); return getByRefs(results); } /** * Returns the specified number of tasks that have been created for the given client since startTime * * @param tenantId The tenant (use {@link #USER_TENANT} for current users tasks, or {@link #SYSTEM_TENANT} for system level tasks * @param startTime Number of milliseconds since Jan 1 (or Date().getTime()) * @param maxCount Number of tasks to return or {@link #FETCH_ALL} for all matching tasks */ public List<TaskResourceRep> findCreatedSince(URI tenantId, long startTime, int maxCount) { return getByRefs(listByTenant(tenantId, maxCount, startTime, null)); } public TaskStatsRestRep getStats() { return getStatsByTenant(null); } /** * Delete a task * * @param taskId task to delete */ public void delete(URI taskId) { client.postURI(String.class, client.uriBuilder(getIdUrl() + "/delete").build(taskId)); } /** * Resume a task * * @param taskId task to resume */ public void resume(URI taskId) { client.postURI(String.class, client.uriBuilder(getIdUrl() + "/resume").build(taskId)); } /** * Rollback a task * * @param taskId task to rollback */ public void rollback(URI taskId) { client.postURI(String.class, client.uriBuilder(getIdUrl() + "/rollback").build(taskId)); } /** * Returns task statistics for the given tenant */ public TaskStatsRestRep getStatsByTenant(URI tenantId) { UriBuilder builder = client.uriBuilder(baseUrl + "/stats"); addTenant(builder, tenantId); URI uri = builder.build(); return client.resource(uri).get(TaskStatsRestRep.class); } @Override public TasksResources withInactive(boolean inactive) { return (TasksResources) super.withInactive(inactive); } @Override public TasksResources withInternal(boolean internal) { return (TasksResources) super.withInternal(internal); } /** * Gets a list of tasks for the specified URI */ protected List<TaskResourceRep> getList(URI uri) { TaskList tasks = client.resource(uri).get(TaskList.class); return defaultList(tasks.getTaskList()); } private void addTenant(UriBuilder builder, URI tenantId) { if (tenantId != null) { builder.queryParam(TENANT_PARAM, tenantId); } } private void addResource(UriBuilder builder, URI tenantId) { if (tenantId != null) { builder.queryParam(RESOURCE_PARAM, tenantId); } } @Override protected List<TaskResourceRep> getBulkResources(BulkIdParam input) { TaskBulkRep response = client.post(TaskBulkRep.class, input, getBulkUrl()); return defaultList(response.getTasks()); } }