REST API for entity adjunct activities
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/d1ab00c0 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/d1ab00c0 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/d1ab00c0 Branch: refs/heads/master Commit: d1ab00c0f65c9444fd655bbf8759c982fe1d02ab Parents: cf56492 Author: Alex Heneveld <[email protected]> Authored: Tue Sep 19 14:04:06 2017 +0100 Committer: Alex Heneveld <[email protected]> Committed: Mon Sep 25 13:16:42 2017 +0100 ---------------------------------------------------------------------- .../brooklyn/core/mgmt/BrooklynTaskTags.java | 4 +++ .../apache/brooklyn/rest/api/AdjunctApi.java | 19 +++++++++++ .../rest/resources/AdjunctResource.java | 12 +++++++ .../brooklyn/rest/resources/EntityResource.java | 26 ++------------- .../rest/transform/TaskTransformer.java | 33 ++++++++++++++++++++ 5 files changed, 71 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d1ab00c0/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTaskTags.java ---------------------------------------------------------------------- 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 7d35ac4..f889b5a 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 class BrooklynTaskTags extends TaskTags { return em.getTasksWithTag(tagForContextEntity(e)); } + public static Set<Task<?>> 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)) http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d1ab00c0/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/AdjunctApi.java ---------------------------------------------------------------------- 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 1886f63..f07759d 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 java.util.Map; 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.AdjunctDetail; 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; @@ -230,4 +232,21 @@ public interface AdjunctApi { @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<TaskSummary> 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); + } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d1ab00c0/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/AdjunctResource.java ---------------------------------------------------------------------- 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 08f3698..ec9444b 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.api.typereg.RegisteredType; 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,12 +48,15 @@ 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.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.BrooklynRestResourceUtils; 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; @@ -260,5 +264,13 @@ public class AdjunctResource extends AbstractBrooklynRestResource implements Adj public static String getStringValueForDisplay(BrooklynRestResourceUtils utils, EntityAdjunct policy, Object value) { return utils.getStringValueForDisplay(value); } + + @Override + public List<TaskSummary> 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); + } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d1ab00c0/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java ---------------------------------------------------------------------- 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 7d764a4..39eb42b 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 class EntityResource extends AbstractBrooklynRestResource implements Enti @Override public List<TaskSummary> listTasks(String applicationId, String entityId, int limit, Boolean recurse) { - int sizeRemaining = limit; Entity entity = brooklyn().getEntity(applicationId, entityId); - List<Task<?>> tasksToScan = MutableList.copyOf(BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity)); - if (limit>0) { - tasksToScan = MutableList.copyOf(Ordering.from(new InterestingTasksFirstComparator(entity)).leastOf(tasksToScan, limit)); - } - Map<String,Task<?>> 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<TaskSummary>(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: http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d1ab00c0/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TaskTransformer.java ---------------------------------------------------------------------- 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 7abb71a..b4e1f08 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.URI; 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; 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 org.apache.brooklyn.util.text.Strings; 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 class TaskTransformer { URI taskUri = serviceUriBuilder(ub, ActivityApi.class, "get").build(t.getId()); return new LinkWithMetadata(taskUri.toString(), data); } + + public static List<TaskSummary> fromTasks(List<Task<?>> 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<String,Task<?>> 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<TaskSummary>(Collections2.transform(tasksLoaded.values(), + TaskTransformer.fromTask(ui.getBaseUriBuilder()))); + } }
