diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java index 7d35ac4022..f889b5a231 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java @@ -235,6 +235,10 @@ public static Set> getTasksInEntityContext(ExecutionManager em, Entity e return em.getTasksWithTag(tagForContextEntity(e)); } + public static Set> getTasksInAdjunctContext(ExecutionManager em, EntityAdjunct a) { + return em.getTasksWithTag(tagForContextAdjunct(a)); + } + public static ManagementContext getManagementContext(Task task) { for (Object tag : getTagsFast(task)) if ((tag instanceof ManagementContext)) diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java index ee43441565..9b447b1a99 100644 --- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java +++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java @@ -23,6 +23,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -36,6 +37,7 @@ import org.apache.brooklyn.rest.domain.AdjunctSummary; import org.apache.brooklyn.rest.domain.ConfigSummary; import org.apache.brooklyn.rest.domain.Status; +import org.apache.brooklyn.rest.domain.TaskSummary; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -234,4 +236,21 @@ public Response setConfig( @PathParam("config") String configKeyName, @ApiParam(name = "value", value = "New value for the configuration", required = true) Object value); + + + @GET + @Path("/{adjunct}/activities") + @ApiOperation(value = "Fetch list of tasks for this adjunct") + @ApiResponses(value = { + @ApiResponse(code = 404, message = "Could not find application, entity, or adjunct") + }) + public List listTasks( + @ApiParam(value = "Application ID or name", required = true) @PathParam("application") String applicationId, + @ApiParam(value = "Entity ID or name", required = true) @PathParam("entity") String entityId, + @ApiParam(value = "Adjunct ID or name", required = true) @PathParam("adjunct") String adjunctToken, + @ApiParam(value = "Max number of tasks, or -1 for all (default 200)", required = false) + @QueryParam("limit") @DefaultValue("200") int limit, + @ApiParam(value = "Whether to include subtasks recursively across different entities (default false)", required = false) + @QueryParam("recurse") @DefaultValue("false") Boolean recurse); + } diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java index 111119303e..dae7bb8533 100644 --- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java +++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java @@ -40,6 +40,7 @@ import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.config.ConfigPredicates; import org.apache.brooklyn.core.entity.EntityInternal; +import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; import org.apache.brooklyn.rest.api.AdjunctApi; import org.apache.brooklyn.rest.domain.AdjunctDetail; @@ -47,11 +48,14 @@ import org.apache.brooklyn.rest.domain.ConfigSummary; import org.apache.brooklyn.rest.domain.Status; import org.apache.brooklyn.rest.domain.SummaryComparators; +import org.apache.brooklyn.rest.domain.TaskSummary; import org.apache.brooklyn.rest.filter.HaHotStateRequired; import org.apache.brooklyn.rest.transform.AdjunctTransformer; import org.apache.brooklyn.rest.transform.ConfigTransformer; import org.apache.brooklyn.rest.transform.EntityTransformer; +import org.apache.brooklyn.rest.transform.TaskTransformer; import org.apache.brooklyn.rest.util.WebResourceUtils; +import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.core.ClassLoaderUtils; import org.apache.brooklyn.util.core.flags.TypeCoercions; import org.apache.brooklyn.util.exceptions.Exceptions; @@ -270,4 +274,12 @@ public Response setConfig(String application, String entityToken, String adjunct return Response.status(Response.Status.OK).build(); } + @Override + public List listTasks(String applicationId, String entityId, String adjunctToken, int limit, Boolean recurse) { + Entity entity = brooklyn().getEntity(applicationId, entityId); + EntityAdjunct adjunct = brooklyn().getAdjunct(entity, adjunctToken); + return TaskTransformer.fromTasks(MutableList.copyOf(BrooklynTaskTags.getTasksInAdjunctContext(mgmt().getExecutionManager(), adjunct)), + limit, recurse, entity, ui); + } + } diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java index 7d764a4c57..39eb42b6d7 100644 --- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java +++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java @@ -135,31 +135,11 @@ public Response addChildren(String applicationToken, String entityToken, Boolean @Override public List listTasks(String applicationId, String entityId, int limit, Boolean recurse) { - int sizeRemaining = limit; Entity entity = brooklyn().getEntity(applicationId, entityId); - List> tasksToScan = MutableList.copyOf(BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity)); - if (limit>0) { - tasksToScan = MutableList.copyOf(Ordering.from(new InterestingTasksFirstComparator(entity)).leastOf(tasksToScan, limit)); - } - Map> tasksLoaded = MutableMap.of(); - - while (!tasksToScan.isEmpty()) { - Task t = tasksToScan.remove(0); - if (tasksLoaded.put(t.getId(), t)==null) { - if (--sizeRemaining==0) { - break; - } - if (Boolean.TRUE.equals(recurse)) { - if (t instanceof HasTaskChildren) { - Iterables.addAll(tasksToScan, ((HasTaskChildren) t).getChildren() ); - } - } - } - } - return new LinkedList(Collections2.transform(tasksLoaded.values(), - TaskTransformer.fromTask(ui.getBaseUriBuilder()))); + return TaskTransformer.fromTasks(MutableList.copyOf(BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity)), + limit, recurse, entity, ui); } - + /** API does not guarantee order, but this is a the one we use (when there are lots of tasks): * prefer top-level tasks and to recent tasks, * balanced such that the following are equal: diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TaskTransformer.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TaskTransformer.java index 7abb71a2e9..b4e1f08cf3 100644 --- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TaskTransformer.java +++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TaskTransformer.java @@ -22,6 +22,7 @@ import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -36,7 +37,9 @@ import org.apache.brooklyn.core.mgmt.BrooklynTaskTags.WrappedStream; import org.apache.brooklyn.rest.domain.LinkWithMetadata; import org.apache.brooklyn.rest.domain.TaskSummary; +import org.apache.brooklyn.rest.resources.EntityResource.InterestingTasksFirstComparator; import org.apache.brooklyn.rest.util.WebResourceUtils; +import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.core.task.TaskInternal; import org.apache.brooklyn.util.exceptions.Exceptions; @@ -44,7 +47,13 @@ import com.google.common.base.Function; import com.google.common.base.Preconditions; +import com.google.common.collect.Collections2; +import com.google.common.collect.Iterables; +import com.google.common.collect.Ordering; + import javax.ws.rs.core.UriBuilder; +import javax.ws.rs.core.UriInfo; + import org.apache.brooklyn.rest.api.ActivityApi; import org.apache.brooklyn.rest.api.EntityApi; import static org.apache.brooklyn.rest.util.WebResourceUtils.serviceUriBuilder; @@ -150,4 +159,28 @@ public static LinkWithMetadata asLink(Task t, UriBuilder ub) { URI taskUri = serviceUriBuilder(ub, ActivityApi.class, "get").build(t.getId()); return new LinkWithMetadata(taskUri.toString(), data); } + + public static List fromTasks(List> tasksToScan, int limit, Boolean recurse, Entity entity, UriInfo ui) { + int sizeRemaining = limit; + if (limit>0) { + tasksToScan = MutableList.copyOf(Ordering.from(new InterestingTasksFirstComparator(entity)).leastOf(tasksToScan, limit)); + } + Map> tasksLoaded = MutableMap.of(); + + while (!tasksToScan.isEmpty()) { + Task t = tasksToScan.remove(0); + if (tasksLoaded.put(t.getId(), t)==null) { + if (--sizeRemaining==0) { + break; + } + if (Boolean.TRUE.equals(recurse)) { + if (t instanceof HasTaskChildren) { + Iterables.addAll(tasksToScan, ((HasTaskChildren) t).getChildren() ); + } + } + } + } + return new LinkedList(Collections2.transform(tasksLoaded.values(), + TaskTransformer.fromTask(ui.getBaseUriBuilder()))); + } }