You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2017/07/22 02:14:40 UTC

[01/10] brooklyn-server git commit: REST call to get entity activities now supports optional "recursive" parameter

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 9795c4746 -> 34efce103


REST call to get entity activities now supports optional "recursive" parameter


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/1e615f55
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/1e615f55
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/1e615f55

Branch: refs/heads/master
Commit: 1e615f55c71f23dfc8f65d8ddd2bb79254fce71a
Parents: 15447e1
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu May 11 13:20:15 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu May 11 13:21:36 2017 +0100

----------------------------------------------------------------------
 .../org/apache/brooklyn/rest/api/EntityApi.java | 10 ++++++-
 .../brooklyn/rest/resources/EntityResource.java | 28 +++++++++++++++++---
 2 files changed, 33 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e615f55/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
index de9cc77..7330365 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
@@ -111,8 +111,16 @@ public interface EntityApi {
     })
     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 = "Entity ID or name", required = true) @PathParam("entity") String entityId,
+            @ApiParam(value = "Whether to include subtasks recursively across different entities", required = false)
+            @QueryParam("recurse") @DefaultValue("false") Boolean recurse);
 
+    /** @deprecated since 0.12.0 use {@link #listTasks(String, String, Boolean)} */
+    @Deprecated
+    public List<TaskSummary> listTasks(
+        String applicationId,
+        String entityId);
+        
     @GET
     @Path("/{entity}/activities/{task}")
     @ApiOperation(value = "Fetch task details", response = org.apache.brooklyn.rest.domain.TaskSummary.class)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/1e615f55/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 e914d1e..47ec3ee 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
@@ -24,6 +24,7 @@ import static javax.ws.rs.core.Response.Status.ACCEPTED;
 import static org.apache.brooklyn.rest.util.WebResourceUtils.serviceAbsoluteUriBuilder;
 
 import java.net.URI;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -38,6 +39,7 @@ import javax.ws.rs.core.UriInfo;
 
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
+import org.apache.brooklyn.api.mgmt.HasTaskChildren;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.core.mgmt.BrooklynTags;
 import org.apache.brooklyn.core.mgmt.BrooklynTags.NamedStringTag;
@@ -58,6 +60,7 @@ import org.apache.brooklyn.rest.transform.LocationTransformer.LocationDetailLeve
 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.collections.MutableMap;
 import org.apache.brooklyn.util.core.ResourceUtils;
 import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
@@ -129,11 +132,28 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
     }
 
     @Override
-    public List<TaskSummary> listTasks(String applicationId, String entityId) {
+    public List<TaskSummary> listTasks(String applicationId, String entityId, Boolean recurse) {
         Entity entity = brooklyn().getEntity(applicationId, entityId);
-        Set<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity);
-        return new LinkedList<TaskSummary>(Collections2.transform(tasks, 
-                TaskTransformer.fromTask(ui.getBaseUriBuilder())));
+        List<Task<?>> tasksToScan = MutableList.copyOf(BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity));
+        Map<String,Task<?>> tasksLoaded = MutableMap.of();
+        
+        while (!tasksToScan.isEmpty()) {
+            Task<?> t = tasksToScan.remove(0);
+            if (tasksLoaded.put(t.getId(), t)==null) {
+                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())));
+    }
+    
+    @Override @Deprecated
+    public List<TaskSummary> listTasks(String applicationId, String entityId) {
+        return listTasks(applicationId, entityId, false);
     }
 
     @Override


[07/10] brooklyn-server git commit: tests for activity limits/depths

Posted by he...@apache.org.
tests for activity limits/depths


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/157c3858
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/157c3858
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/157c3858

Branch: refs/heads/master
Commit: 157c3858e62d3345ac81cefb093cae1d64480c43
Parents: 36fd318
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Jul 6 23:43:01 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Jul 6 23:43:01 2017 +0100

----------------------------------------------------------------------
 .../brooklyn/core/effector/AddEffector.java     |   2 +-
 .../apache/brooklyn/core/entity/Entities.java   |   4 +
 .../apache/brooklyn/util/core/task/Tasks.java   |  29 +-
 .../core/effector/SampleManyTasksEffector.java  |  23 +-
 .../rest/resources/ActivityResource.java        |   4 +-
 .../rest/resources/ActivityRestTest.java        | 344 +++++++++++++++++++
 .../rest/resources/ApplicationResourceTest.java |  13 +-
 .../rest/resources/EffectorUtilsRestTest.java   |   1 +
 .../rest/resources/ErrorResponseTest.java       |   2 -
 9 files changed, 403 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/157c3858/core/src/main/java/org/apache/brooklyn/core/effector/AddEffector.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/effector/AddEffector.java b/core/src/main/java/org/apache/brooklyn/core/effector/AddEffector.java
index 9590bcf..04c1364 100644
--- a/core/src/main/java/org/apache/brooklyn/core/effector/AddEffector.java
+++ b/core/src/main/java/org/apache/brooklyn/core/effector/AddEffector.java
@@ -63,7 +63,7 @@ public class AddEffector implements EntityInitializer {
     
     public static final ConfigKey<Map<String,Object>> EFFECTOR_PARAMETER_DEFS = new MapConfigKey<Object>(Object.class, "parameters");
 
-    final Effector<?> effector;
+    protected final Effector<?> effector;
     
     public AddEffector(Effector<?> effector) {
         this.effector = Preconditions.checkNotNull(effector, "effector");

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/157c3858/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
index 46a9cea..df904d3 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
@@ -480,6 +480,10 @@ public class Entities {
         out.flush();
     }
 
+    public static void dumpInfo(Task<?> t) {
+        Tasks.dumpInfo(t);
+    }
+    
     public static void dumpInfo(Enricher enr) {
         try {
             dumpInfo(enr, new PrintWriter(System.out), "", "  ");

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/157c3858/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java b/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
index 09116af..0677f74 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
@@ -18,6 +18,9 @@
  */
 package org.apache.brooklyn.util.core.task;
 
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Writer;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -39,7 +42,6 @@ import org.apache.brooklyn.util.repeat.Repeater;
 import org.apache.brooklyn.util.time.CountdownTimer;
 import org.apache.brooklyn.util.time.Duration;
 import org.apache.brooklyn.util.time.Time;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -492,4 +494,29 @@ public class Tasks {
         return "in "+timeout;
     }
 
+
+    public static void dumpInfo(Task<?> t) {
+        try {
+            dumpInfo(t, new PrintWriter(System.out), "", "  ");
+        } catch (IOException exc) {
+            // system.out throwing an exception is odd, so don't have IOException on signature
+            throw new RuntimeException(exc);
+        }
+    }
+    public static void dumpInfo(Task<?> t, Writer out) throws IOException {
+        dumpInfo(t, out, "", "  ");
+    }
+    public static void dumpInfo(Task<?> t, String currentIndentation, String tab) throws IOException {
+        dumpInfo(t, new PrintWriter(System.out), currentIndentation, tab);
+    }
+    public static void dumpInfo(Task<?> t, Writer out, String currentIndentation, String tab) throws IOException {
+        out.append(currentIndentation+t+": "+t.getStatusDetail(false)+"\n");
+
+        if (t instanceof HasTaskChildren) {
+            for (Task<?> child: ((HasTaskChildren)t).getChildren()) {
+                dumpInfo(child, out, currentIndentation+tab, tab);
+            }
+        }
+        out.flush();
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/157c3858/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java b/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
index 6cf4e2c..da36de3 100644
--- a/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
+++ b/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
@@ -1,12 +1,15 @@
 package org.apache.brooklyn.core.effector;
 
 import java.util.List;
+import java.util.Random;
 import java.util.concurrent.Callable;
 
 import org.apache.brooklyn.api.effector.Effector;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.mgmt.Task;
 import org.apache.brooklyn.api.mgmt.TaskAdaptable;
+import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.ConfigKeys;
 import org.apache.brooklyn.core.effector.EffectorTasks.EffectorTaskFactory;
 import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.core.config.ConfigBag;
@@ -39,11 +42,21 @@ services:
  */
 public class SampleManyTasksEffector extends AddEffector {
 
+    public static final ConfigKey<Integer> RANDOM_SEED = ConfigKeys.newIntegerConfigKey("random.seed");
+
     public SampleManyTasksEffector(ConfigBag params) {
         super(Effectors.effector(String.class, params.get(EFFECTOR_NAME)).name("eatand").impl(body(params)).build());
     }
 
+    public Effector<?> getEffector() {
+        return effector;
+    }
+    
     private static EffectorTaskFactory<String> body(ConfigBag params) {
+        Integer seed = params.get(RANDOM_SEED);
+        final Random random = seed!=null ? new Random(seed) : new Random();
+        
+        // NOTE: not nicely serializable
         return new EffectorTaskFactory<String>() {
             @Override
             public TaskAdaptable<String> newTask(Entity entity, Effector<String> effector, ConfigBag parameters) {
@@ -53,13 +66,13 @@ public class SampleManyTasksEffector extends AddEffector {
                 List<Task<Object>> result = MutableList.of();
                 do {
                     TaskBuilder<Object> t = Tasks.builder();
-                    double x = Math.random();
-                    if (depth>4) x *= Math.random();
-                    if (depth>6) x *= Math.random();
+                    double x = random.nextDouble();
+                    if (depth>4) x *= random.nextDouble();
+                    if (depth>6) x *= random.nextDouble();
                     if (x<0.3) {
                         t.displayName("eat").body(new Callable<Object>() { public Object call() { return "eat"; }});
                     } else if (x<0.6) {
-                        final Duration time = Duration.millis(Math.round(10*1000*Math.random()*Math.random()*Math.random()*Math.random()*Math.random()));
+                        final Duration time = Duration.millis(Math.round(10*1000*random.nextDouble()*random.nextDouble()*random.nextDouble()*random.nextDouble()*random.nextDouble()));
                         t.displayName("sleep").description("Sleeping "+time).body(new Callable<Object>() { public Object call() {
                             Tasks.setBlockingDetails("sleeping "+time);
                             Time.sleep(time);
@@ -78,7 +91,7 @@ public class SampleManyTasksEffector extends AddEffector {
                     }
                     result.add(t.build());
                     
-                } while (Math.random()<0.8);
+                } while (random.nextDouble()<0.8);
                 return result;
             }
         };

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/157c3858/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
index 2bc90ad..6e3c2eb 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
@@ -79,13 +79,13 @@ public class ActivityResource extends AbstractBrooklynRestResource implements Ac
             return result;
         }
         Set<Task<?>> nextLayer = MutableSet.copyOf( ((HasTaskChildren) parentTask).getChildren() );
-        outer: while (!nextLayer.isEmpty() && maxDepth-- != 0) {
+        outer: while (limit!=0 && !nextLayer.isEmpty() && maxDepth-- != 0) {
             Set<Task<?>> thisLayer = nextLayer;
             nextLayer = MutableSet.of();
             for (final Task<?> childTask : thisLayer) {
                 TaskSummary wasThere = result.put(childTask.getId(), TaskTransformer.fromTask(ui.getBaseUriBuilder()).apply(childTask));
                 if (wasThere==null) {
-                    if (limit-- == 0) {
+                    if (--limit == 0) {
                         break outer;
                     }
                     if (childTask instanceof HasTaskChildren) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/157c3858/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ActivityRestTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ActivityRestTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ActivityRestTest.java
new file mode 100644
index 0000000..a5424f8
--- /dev/null
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ActivityRestTest.java
@@ -0,0 +1,344 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.brooklyn.rest.resources;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeoutException;
+
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import org.apache.brooklyn.api.effector.Effector;
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.entity.EntitySpec;
+import org.apache.brooklyn.api.mgmt.HasTaskChildren;
+import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.core.effector.SampleManyTasksEffector;
+import org.apache.brooklyn.core.entity.Entities;
+import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
+import org.apache.brooklyn.core.mgmt.EntityManagementUtils.CreationResult;
+import org.apache.brooklyn.core.mgmt.internal.TestEntityWithEffectors;
+import org.apache.brooklyn.entity.stock.BasicApplication;
+import org.apache.brooklyn.rest.domain.TaskSummary;
+import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
+import org.apache.brooklyn.test.Asserts;
+import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.core.config.ConfigBag;
+import org.apache.brooklyn.util.core.task.Tasks;
+import org.apache.brooklyn.util.exceptions.Exceptions;
+import org.apache.brooklyn.util.http.HttpAsserts;
+import org.apache.brooklyn.util.time.CountdownTimer;
+import org.apache.brooklyn.util.time.Duration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.Iterables;
+
+/** Tests {@link ActivityResource} and activity methods on {@link EntityResource} */
+public class ActivityRestTest extends BrooklynRestResourceTest {
+
+    private static final Logger log = LoggerFactory.getLogger(ActivityRestTest.class);
+    
+    /* a nice seed, initial run as follows;
+
+Task[eatand]@J90TKfIX: Waiting on Task[eat-sleep-rave-repeat]@QPa5o4kF
+  Task[eat-sleep-rave-repeat]@QPa5o4kF: Waiting on Task[rave]@yP9KjuWD
+    Task[rave]@yP9KjuWD: Waiting on Task[repeat]@Dd1AqB7Q
+      Task[repeat]@Dd1AqB7Q: Waiting on Task[repeat]@remQL5eD
+        Task[repeat]@remQL5eD: Waiting on Task[repeat]@g1ReP4BP
+          Task[sleep]@iV3iWg2N: Completed, result: slept 46ms
+          Task[eat]@fpIttX07: Completed, result: eat
+          Task[eat]@w6sxLefq: Completed, result: eat
+          Task[repeat]@g1ReP4BP: Waiting on Task[sleep]@zRTOQ4ak
+            Task[eat]@TvcdOUx7: Completed, result: eat
+            Task[rave]@yJndzNLf: Completed, result: raved with 1 tasks
+              Task[eat]@oiJ3eZZQ: Completed, result: eat
+            Task[sleep]@zRTOQ4ak: sleeping 74ms
+            Task[eat]@qoFRPEfM: Not submitted
+            Task[sleep]@fNX16uvi: Not submitted
+
+     */
+    private final int SEED = 1;
+    
+    private Entity entity;
+    private Effector<?> effector;
+
+    private Task<?> lastTask;
+    
+    @BeforeClass(alwaysRun = true)
+    public void setUp() throws Exception {
+        startServer();
+    }
+    
+    @BeforeMethod(alwaysRun = true)
+    public void setUpOneTest() throws Exception {
+        initEntity(SEED);
+    }
+
+    @SuppressWarnings("deprecation")
+    protected void initEntity(int seed) {
+        if (entity!=null) {
+            Entities.destroy(entity.getApplication());
+        }
+        
+        CreationResult<BasicApplication, Void> app = EntityManagementUtils.createStarting(getManagementContext(),
+            EntitySpec.create(BasicApplication.class)
+                .child(EntitySpec.create(TestEntityWithEffectors.class)) );
+        app.blockUntilComplete();
+        entity = Iterables.getOnlyElement( app.get().getChildren() );
+        
+        SampleManyTasksEffector manyTasksAdder = new SampleManyTasksEffector(ConfigBag.newInstance().configure(SampleManyTasksEffector.RANDOM_SEED, seed));
+        effector = manyTasksAdder.getEffector();
+        manyTasksAdder.apply((org.apache.brooklyn.api.entity.EntityLocal) entity);
+    }
+
+    /** finds a good seed, in case the effector changes */
+    public static void main(String[] args) throws Exception {
+        ActivityRestTest me = new ActivityRestTest();
+        me.setUpClass();
+        int i=0;
+        do {
+            me.initEntity(i);
+            try {
+                log.info("Trying seed "+i+"...");
+                me.testGood(Duration.millis(200));
+                break;
+            } catch (Throwable e) {
+                log.info("  "+Exceptions.collapseText(e));
+                // e.printStackTrace();
+                // continue
+            }
+            i++;
+        } while (true);
+        Tasks.dumpInfo(me.lastTask);
+        log.info("Seed "+i+" is good ^");
+    }
+    
+    @Test
+    public void testGood() {
+        testGood(Duration.ONE_SECOND);
+    }
+    
+    void testGood(Duration timeout) {
+        lastTask = entity.invoke(effector, null);
+        Task<?> leaf = waitForCompletedDescendantWithChildAndSibling(lastTask, lastTask, CountdownTimer.newInstanceStarted(timeout), 0);
+        Assert.assertTrue(depthOf(leaf)>=4, "Not deep enough: "+depthOf(leaf));
+    }
+    
+    @Test
+    public void testGetActivity() {
+        Task<?> t = entity.invoke(effector, null);
+        
+        Response response = client().path("/activities/"+t.getId())
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        TaskSummary task = response.readEntity(TaskSummary.class);
+        Assert.assertEquals(task.getId(), t.getId());
+    }
+    
+    @Test
+    public void testGetActivitiesChildren() {
+        Task<?> t = entity.invoke(effector, null);
+        Task<?> leaf = waitForCompletedDescendantWithChildAndSibling(t, t, CountdownTimer.newInstanceStarted(Duration.ONE_SECOND), 0);
+        
+        Response response = client().path("/activities/"+leaf.getSubmittedByTask().getId()+"/children")
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        List<TaskSummary> tasks = response.readEntity(new GenericType<List<TaskSummary>>() {});
+        log.info("Tasks children: "+tasks.size());
+        Assert.assertTrue(tasksContain(tasks, leaf), "tasks should have included leaf "+leaf+"; was "+tasks);
+    }
+    
+    @Test
+    public void testGetActivitiesRecursiveAndWithLimit() {
+        Task<?> t = entity.invoke(effector, null);
+        Task<?> leaf = waitForCompletedDescendantWithChildAndSibling(t, t, CountdownTimer.newInstanceStarted(Duration.ONE_SECOND), 0);
+        Task<?> leafParent = leaf.getSubmittedByTask();
+        Task<?> leafGrandparent = leafParent.getSubmittedByTask();
+        
+        Response response = client().path("/activities/"+leafGrandparent.getId()+"/children")
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        List<TaskSummary> tasksL = response.readEntity(new GenericType<List<TaskSummary>>() {});
+        Assert.assertFalse(tasksContain(tasksL, leaf), "non-recursive tasks should not have included leaf "+leaf+"; was "+tasksL);
+        Assert.assertTrue(tasksContain(tasksL, leafParent), "non-recursive tasks should have included leaf parent "+leafParent+"; was "+tasksL);
+        Assert.assertFalse(tasksContain(tasksL, leafGrandparent), "non-recursive tasks should not have included leaf grandparent "+leafGrandparent+"; was "+tasksL);
+        
+        response = client().path("/activities/"+leafGrandparent.getId()+"/children/recurse")
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        Map<String,TaskSummary> tasks = response.readEntity(new GenericType<Map<String,TaskSummary>>() {});
+        Assert.assertTrue(tasksContain(tasks, leaf), "recursive tasks should have included leaf "+leaf+"; was "+tasks);
+        Assert.assertTrue(tasksContain(tasks, leafParent), "recursive tasks should have included leaf parent "+leafParent+"; was "+tasks);
+        Assert.assertFalse(tasksContain(tasks, leafGrandparent), "recursive tasks should not have included leaf grandparent "+leafGrandparent+"; was "+tasks);
+        
+        response = client().path("/activities/"+leafGrandparent.getId()+"/children/recurse")
+            .query("maxDepth", 1)
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        tasks = response.readEntity(new GenericType<Map<String,TaskSummary>>() {});
+        Assert.assertFalse(tasksContain(tasks, leaf), "depth 1 recursive tasks should nont have included leaf "+leaf+"; was "+tasks);
+        Assert.assertTrue(tasksContain(tasks, leafParent), "depth 1 recursive tasks should have included leaf parent "+leafParent+"; was "+tasks);
+
+        response = client().path("/activities/"+leafGrandparent.getId()+"/children/recurse")
+            .query("maxDepth", 2)
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        tasks = response.readEntity(new GenericType<Map<String,TaskSummary>>() {});
+        Assert.assertTrue(tasksContain(tasks, leaf), "depth 2 recursive tasks should have included leaf "+leaf+"; was "+tasks);
+        Assert.assertTrue(tasksContain(tasks, leafParent), "depth 2 recursive tasks should have included leaf parent "+leafParent+"; was "+tasks);
+        Assert.assertFalse(tasksContain(tasks, leafGrandparent), "depth 2 recursive tasks should not have included leaf grandparent "+leafGrandparent+"; was "+tasks);
+        
+        Assert.assertTrue(children(leafGrandparent).size() >= 2, "children: "+children(leafGrandparent));
+        response = client().path("/activities/"+leafGrandparent.getId()+"/children/recurse")
+            .query("limit", children(leafGrandparent).size())
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        tasks = response.readEntity(new GenericType<Map<String,TaskSummary>>() {});
+        Assert.assertEquals(tasks.size(), children(leafGrandparent).size());
+        Assert.assertTrue(tasksContain(tasks, leafParent), "count limited recursive tasks should have included leaf parent "+leafParent+"; was "+tasks);
+        Assert.assertFalse(tasksContain(tasks, leaf), "count limited recursive tasks should not have included leaf "+leaf+"; was "+tasks);
+        
+        response = client().path("/activities/"+leafGrandparent.getId()+"/children/recurse")
+            .query("limit", children(leafGrandparent).size()+1)
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        tasks = response.readEntity(new GenericType<Map<String,TaskSummary>>() {});
+        Assert.assertEquals(tasks.size(), children(leafGrandparent).size()+1);
+        tasks = response.readEntity(new GenericType<Map<String,TaskSummary>>() {});
+        Assert.assertTrue(tasksContain(tasks, leafParent), "count+1 limited recursive tasks should have included leaf parent "+leafParent+"; was "+tasks);
+        Assert.assertTrue(tasksContain(tasks, leaf), "count+1 limited recursive tasks should have included leaf "+leaf+"; was "+tasks);
+    }
+
+    private boolean tasksContain(Map<String, TaskSummary> tasks, Task<?> leaf) {
+        return tasks.keySet().contains(leaf.getId());
+    }
+
+    private List<Task<?>> children(Task<?> t) {
+        return MutableList.copyOf( ((HasTaskChildren)t).getChildren() );
+    }
+
+    @Test
+    public void testGetEntityActivitiesAndWithLimit() {
+        Task<?> t = entity.invoke(effector, null);
+        Task<?> leaf = waitForCompletedDescendantWithChildAndSibling(t, t, CountdownTimer.newInstanceStarted(Duration.ONE_SECOND), 0);
+        
+        Response response = client().path("/applications/"+entity.getApplicationId()+
+                "/entities/"+entity.getId()+"/activities")
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        List<TaskSummary> tasks = response.readEntity(new GenericType<List<TaskSummary>>() {});
+        log.info("Tasks now: "+tasks.size());
+        Assert.assertTrue(tasks.size() > 4, "tasks should have been big; was "+tasks);
+        Assert.assertTrue(tasksContain(tasks, leaf), "tasks should have included leaf "+leaf+"; was "+tasks);
+        
+        response = client().path("/applications/"+entity.getApplicationId()+
+            "/entities/"+entity.getId()+"/activities")
+            .query("limit", 3)
+            .accept(MediaType.APPLICATION_JSON)
+            .get();
+        assertHealthy(response);
+        tasks = response.readEntity(new GenericType<List<TaskSummary>>() {});
+        log.info("Tasks limited: "+tasks.size());
+        Assert.assertEquals(tasks.size(), 3, "tasks should have been limited; was "+tasks);
+        Assert.assertFalse(tasksContain(tasks, leaf), "tasks should not have included leaf "+leaf+"; was "+tasks);
+    }
+
+    private void assertHealthy(Response response) {
+        if (!HttpAsserts.isHealthyStatusCode(response.getStatus())) {
+            Asserts.fail("Bad response: "+response.getStatus()+" "+response.readEntity(String.class));
+        }
+    }
+
+    private static boolean tasksContain(List<TaskSummary> tasks, Task<?> leaf) {
+        for (TaskSummary ts: tasks) {
+            if (ts.getId().equals(leaf.getId())) return true;
+        }
+        return false;
+    }
+
+    private int depthOf(Task<?> t) {
+        int depth = -1;
+        while (t!=null) {
+            t = t.getSubmittedByTask();
+            depth++;
+        }
+        return depth;
+    }
+    
+    private Task<?> waitForCompletedDescendantWithChildAndSibling(Task<?> tRoot, Task<?> t, CountdownTimer timer, int depthSoFar) {
+        while (timer.isLive()) {
+            Iterable<Task<?>> children = ((HasTaskChildren)t).getChildren();
+            Iterator<Task<?>> ci = children.iterator();
+            Task<?> bestFinishedDescendant = null;
+            while (ci.hasNext()) {
+                Task<?> tc = ci.next();
+                Task<?> finishedDescendant = waitForCompletedDescendantWithChildAndSibling(tRoot, tc, timer, depthSoFar+1);
+                if (depthOf(finishedDescendant) > depthOf(bestFinishedDescendant)) {
+                    bestFinishedDescendant = finishedDescendant;
+                }
+                int finishedDescendantDepth = depthOf(bestFinishedDescendant);
+                // log.info("finished "+tc+", depth "+finishedDescendantDepth);
+                if (finishedDescendantDepth < 2) {
+                    if (ci.hasNext()) continue;
+                    throw new IllegalStateException("not deep enough: "+finishedDescendantDepth);
+                }
+                if (finishedDescendantDepth == depthSoFar+1) {
+                    // child completed; now check we complete soon, and assert we have siblings
+                    if (ci.hasNext()) continue;
+                    if (!t.blockUntilEnded(timer.getDurationRemaining())) {
+                        Entities.dumpInfo(tRoot);
+                        // log.info("Incomplete after "+t+": "+t.getStatusDetail(false));
+                        throw Exceptions.propagate( new TimeoutException("parent didn't complete after child depth "+finishedDescendantDepth) );
+                    }
+                }
+                if (finishedDescendantDepth == depthSoFar+2) {
+                    if (Iterables.size(children)<2) {
+                        Entities.dumpInfo(tRoot);
+                        throw new IllegalStateException("finished child's parent has no sibling");
+                    }
+                }
+                
+                return bestFinishedDescendant;
+            }
+            Thread.yield();
+            
+            // leaf nodeƄ
+            if (t.isDone()) return t;
+        }
+        throw Exceptions.propagate( new TimeoutException("expired waiting for children") );
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/157c3858/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
index 277fd32..76c08e8 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ApplicationResourceTest.java
@@ -32,7 +32,11 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeoutException;
 
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.client.Entity;
+import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedHashMap;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 
@@ -71,7 +75,7 @@ import org.apache.brooklyn.util.collections.CollectionFunctionals;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.http.HttpAsserts;
 import org.apache.brooklyn.util.text.Strings;
-import org.apache.brooklyn.util.time.Duration;
+import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.http.HttpHeaders;
 import org.apache.http.entity.ContentType;
 import org.slf4j.Logger;
@@ -87,13 +91,6 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.MultivaluedHashMap;
-
-import org.apache.cxf.jaxrs.client.WebClient;
-
 @Test(singleThreaded = true,
         // by using a different suite name we disallow interleaving other tests between the methods of this test class, which wrecks the test fixtures
         suiteName = "ApplicationResourceTest")

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/157c3858/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EffectorUtilsRestTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EffectorUtilsRestTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EffectorUtilsRestTest.java
index 5fe729d..d7157fd 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EffectorUtilsRestTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EffectorUtilsRestTest.java
@@ -85,6 +85,7 @@ public class EffectorUtilsRestTest extends BrooklynAppUnitTestSupport {
         } catch (InterruptedException|ExecutionException e) {
             throw Exceptions.propagate(e);
         }
+        log.debug("Result description: "+summary.getDescription());
         assertEquals(
                 summary.getDescription(),
                 "Invoking effector resetPassword on "+TestEntityWithEffectors.class.getSimpleName()+":"+entity.getId().substring(0,4)

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/157c3858/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ErrorResponseTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ErrorResponseTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ErrorResponseTest.java
index 27d8ea5..af5007d 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ErrorResponseTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/ErrorResponseTest.java
@@ -23,7 +23,6 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
 import java.io.IOException;
-import java.io.InputStream;
 
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
@@ -36,7 +35,6 @@ import org.apache.brooklyn.rest.domain.PolicySummary;
 import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
 import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
 import org.apache.brooklyn.rest.testing.mocks.RestMockSimplePolicy;
-import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 


[02/10] brooklyn-server git commit: identify NPE earlier

Posted by he...@apache.org.
identify NPE earlier


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/4f9564f7
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/4f9564f7
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/4f9564f7

Branch: refs/heads/master
Commit: 4f9564f7232287ea52944c98f51967678caa0abc
Parents: 1e615f5
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Jul 5 14:45:24 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jul 5 14:45:24 2017 +0100

----------------------------------------------------------------------
 .../java/org/apache/brooklyn/core/entity/EntityDynamicType.java   | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4f9564f7/core/src/main/java/org/apache/brooklyn/core/entity/EntityDynamicType.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/EntityDynamicType.java b/core/src/main/java/org/apache/brooklyn/core/entity/EntityDynamicType.java
index 1709540..ecf2a17 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/EntityDynamicType.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/EntityDynamicType.java
@@ -47,6 +47,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
 import com.google.common.collect.Maps;
 
@@ -125,7 +126,7 @@ public class EntityDynamicType extends BrooklynDynamicType<Entity, AbstractEntit
      */
     @Beta
     public void addEffector(Effector<?> newEffector) {
-        Effector<?> oldEffector = effectors.put(newEffector.getName(), newEffector);
+        Effector<?> oldEffector = effectors.put(Preconditions.checkNotNull(newEffector.getName(), "Missing 'name' for effector"), newEffector);
         invalidateSnapshot();
         if (oldEffector!=null)
             instance.sensors().emit(AbstractEntity.EFFECTOR_CHANGED, newEffector.getName());


[06/10] brooklyn-server git commit: add limit when retrieving tasks

Posted by he...@apache.org.
add limit when retrieving tasks


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/36fd318c
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/36fd318c
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/36fd318c

Branch: refs/heads/master
Commit: 36fd318c21a54493042cc985c13efeaeaa91a715
Parents: a6c4e13
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Jul 6 15:49:14 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Jul 6 15:49:14 2017 +0100

----------------------------------------------------------------------
 .../apache/brooklyn/rest/api/ActivityApi.java   | 12 ++++++--
 .../brooklyn/rest/api/ApplicationApi.java       |  9 +++---
 .../org/apache/brooklyn/rest/api/EntityApi.java |  6 ++--
 .../rest/resources/ActivityResource.java        | 30 ++++++++++++++++----
 .../brooklyn/rest/resources/EntityResource.java | 10 ++++---
 5 files changed, 48 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/36fd318c/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java
index 45cd25c..31c4d92 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java
@@ -61,13 +61,21 @@ public interface ActivityApi {
     @GET
     @Path("/{task}/children/recurse")
     @ApiOperation(
-            value = "Fetch all child tasks details as Map<String,TaskSummary> map key == Task ID",
+            value = "Fetch all child tasks and their descendants with details as Map<String,TaskSummary> map key == Task ID",
             response = Map.class)
     @ApiResponses(value = {
             @ApiResponse(code = 404, message = "Could not find task")
     })
     public Map<String,TaskSummary> getAllChildrenAsMap(
-            @ApiParam(value = "Task ID", required = true) @PathParam("task") String taskId);
+            @ApiParam(value = "Task ID", required = true) @PathParam("task") String taskId,
+            @ApiParam(value = "Max number of tasks to include, or -1 for all (default 200)", required = false) 
+            @QueryParam("limit") @DefaultValue("200") int limit,
+            @ApiParam(value = "Max depth to traverse, or -1 for all (default)", required = false) 
+            @QueryParam("maxDepth") @DefaultValue("-1") int maxDepth);
+    
+    /** @deprecated since 0.12.0 use {@link #getAllChildrenAsMap(String, int, int)} with depth -1 */
+    @Deprecated
+    public Map<String,TaskSummary> getAllChildrenAsMap(String taskId);
 
     @GET
     @Path("/{task}/stream/{streamId}")

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/36fd318c/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java
index edfdd7d..d0e4d19 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ApplicationApi.java
@@ -18,7 +18,6 @@
  */
 package org.apache.brooklyn.rest.api;
 
-import io.swagger.annotations.Api;
 import java.util.List;
 import java.util.Map;
 
@@ -35,15 +34,15 @@ import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-import org.apache.brooklyn.rest.domain.ApplicationSpec;
 import org.apache.brooklyn.rest.domain.ApplicationSummary;
-import org.apache.brooklyn.rest.domain.EntitySummary;
 import org.apache.brooklyn.rest.domain.EntityDetail;
+import org.apache.brooklyn.rest.domain.EntitySummary;
 
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 
 @Path("/applications")
 @Api("Applications")

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/36fd318c/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
index 7330365..d0788fa 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/EntityApi.java
@@ -112,10 +112,12 @@ public interface EntityApi {
     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 = "Whether to include subtasks recursively across different entities", required = false)
+            @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);
 
-    /** @deprecated since 0.12.0 use {@link #listTasks(String, String, Boolean)} */
+    /** @deprecated since 0.12.0 use {@link #listTasks(String, String, Integer, Boolean)} */
     @Deprecated
     public List<TaskSummary> listTasks(
         String applicationId,

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/36fd318c/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
index af49856..2bc90ad 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
@@ -40,6 +40,7 @@ import org.apache.brooklyn.util.collections.MutableList;
 import org.apache.brooklyn.util.collections.MutableSet;
 
 import com.google.common.collect.Collections2;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
@@ -52,10 +53,15 @@ public class ActivityResource extends AbstractBrooklynRestResource implements Ac
         return TaskTransformer.fromTask(ui.getBaseUriBuilder()).apply(t);
     }
 
-    @Override
+    @Override @Deprecated
     public Map<String, TaskSummary> getAllChildrenAsMap(final String taskId) {
+        return getAllChildrenAsMap(taskId, 200, -1);
+    }
+    
+    @Override
+    public Map<String, TaskSummary> getAllChildrenAsMap(final String taskId, final int limit, final int maxDepth) {
         final Task<?> parentTask = findTask(taskId);
-        return getAllDescendantTasks(parentTask);
+        return getAllDescendantTasks(parentTask, limit, maxDepth);
     }
 
     protected Task<?> findTask(final String taskId) {
@@ -67,14 +73,26 @@ public class ActivityResource extends AbstractBrooklynRestResource implements Ac
         return task;
     }
 
-    private LinkedHashMap<String, TaskSummary> getAllDescendantTasks(final Task<?> parentTask) {
+    private LinkedHashMap<String, TaskSummary> getAllDescendantTasks(final Task<?> parentTask, int limit, int maxDepth) {
         final LinkedHashMap<String, TaskSummary> result = Maps.newLinkedHashMap();
         if (!(parentTask instanceof HasTaskChildren)) {
             return result;
         }
-        for (final Task<?> childTask : ((HasTaskChildren) parentTask).getChildren()) {
-            result.put(childTask.getId(), TaskTransformer.fromTask(ui.getBaseUriBuilder()).apply(childTask));
-            result.putAll(getAllDescendantTasks(childTask));
+        Set<Task<?>> nextLayer = MutableSet.copyOf( ((HasTaskChildren) parentTask).getChildren() );
+        outer: while (!nextLayer.isEmpty() && maxDepth-- != 0) {
+            Set<Task<?>> thisLayer = nextLayer;
+            nextLayer = MutableSet.of();
+            for (final Task<?> childTask : thisLayer) {
+                TaskSummary wasThere = result.put(childTask.getId(), TaskTransformer.fromTask(ui.getBaseUriBuilder()).apply(childTask));
+                if (wasThere==null) {
+                    if (limit-- == 0) {
+                        break outer;
+                    }
+                    if (childTask instanceof HasTaskChildren) {
+                        Iterables.addAll(nextLayer, ((HasTaskChildren)childTask).getChildren());
+                    }
+                }
+            }
         }
         return result;
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/36fd318c/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 47ec3ee..7007a7f 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
@@ -24,11 +24,9 @@ import static javax.ws.rs.core.Response.Status.ACCEPTED;
 import static org.apache.brooklyn.rest.util.WebResourceUtils.serviceAbsoluteUriBuilder;
 
 import java.net.URI;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
@@ -132,7 +130,8 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
     }
 
     @Override
-    public List<TaskSummary> listTasks(String applicationId, String entityId, Boolean recurse) {
+    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));
         Map<String,Task<?>> tasksLoaded = MutableMap.of();
@@ -140,6 +139,9 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
         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() );
@@ -153,7 +155,7 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
     
     @Override @Deprecated
     public List<TaskSummary> listTasks(String applicationId, String entityId) {
-        return listTasks(applicationId, entityId, false);
+        return listTasks(applicationId, entityId, -1, false);
     }
 
     @Override


[09/10] brooklyn-server git commit: add license header

Posted by he...@apache.org.
add license header


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/ca9efdbb
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/ca9efdbb
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/ca9efdbb

Branch: refs/heads/master
Commit: ca9efdbb8ddde482a375f5ca3ae68bed5225471e
Parents: 36e0a8f
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Jul 7 02:40:15 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Jul 7 02:40:15 2017 +0100

----------------------------------------------------------------------
 .../core/effector/SampleManyTasksEffector.java    | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ca9efdbb/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java b/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
index da36de3..d4cb965 100644
--- a/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
+++ b/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
 package org.apache.brooklyn.core.effector;
 
 import java.util.List;


[05/10] brooklyn-server git commit: cleanup how tasks are loaded, better error message for GC case

Posted by he...@apache.org.
cleanup how tasks are loaded, better error message for GC case


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/a6c4e130
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/a6c4e130
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/a6c4e130

Branch: refs/heads/master
Commit: a6c4e1301dc7d5cd4161e34e2631deecee7231ec
Parents: fb04e20
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Jul 6 14:58:58 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Jul 6 14:58:58 2017 +0100

----------------------------------------------------------------------
 .../rest/resources/ActivityResource.java        | 33 ++++++++------------
 1 file changed, 13 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a6c4e130/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
index 81439d5..af49856 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ActivityResource.java
@@ -47,25 +47,26 @@ public class ActivityResource extends AbstractBrooklynRestResource implements Ac
 
     @Override
     public TaskSummary get(String taskId) {
-        Task<?> t = mgmt().getExecutionManager().getTask(taskId);
-        if (t == null) {
-            throw WebResourceUtils.notFound("Cannot find task '%s'", taskId);
-        }
-        checkEntityEntitled(t);
+        Task<?> t = findTask(taskId);
 
         return TaskTransformer.fromTask(ui.getBaseUriBuilder()).apply(t);
     }
 
     @Override
     public Map<String, TaskSummary> getAllChildrenAsMap(final String taskId) {
-        final Task<?> parentTask = mgmt().getExecutionManager().getTask(taskId);
-        if (parentTask == null) {
-            throw WebResourceUtils.notFound("Cannot find task '%s'", taskId);
-        }
-        checkEntityEntitled(parentTask);
+        final Task<?> parentTask = findTask(taskId);
         return getAllDescendantTasks(parentTask);
     }
 
+    protected Task<?> findTask(final String taskId) {
+        final Task<?> task = mgmt().getExecutionManager().getTask(taskId);
+        if (task == null) {
+            throw WebResourceUtils.notFound("Cannot find task '%s' - possibly garbage collected to save memory", taskId);
+        }
+        checkEntityEntitled(task);
+        return task;
+    }
+
     private LinkedHashMap<String, TaskSummary> getAllDescendantTasks(final Task<?> parentTask) {
         final LinkedHashMap<String, TaskSummary> result = Maps.newLinkedHashMap();
         if (!(parentTask instanceof HasTaskChildren)) {
@@ -81,11 +82,7 @@ public class ActivityResource extends AbstractBrooklynRestResource implements Ac
 
     @Override
     public List<TaskSummary> children(String taskId, Boolean includeBackground) {
-        Task<?> t = mgmt().getExecutionManager().getTask(taskId);
-        if (t == null) {
-            throw WebResourceUtils.notFound("Cannot find task '%s'", taskId);
-        }
-        checkEntityEntitled(t);
+        Task<?> t = findTask(taskId);
 
         Set<TaskSummary> result = MutableSet.copyOf(getSubTaskChildren(t));
         if (Boolean.TRUE.equals(includeBackground)) {
@@ -118,11 +115,7 @@ public class ActivityResource extends AbstractBrooklynRestResource implements Ac
 
     @Override
     public String stream(String taskId, String streamId) {
-        Task<?> t = mgmt().getExecutionManager().getTask(taskId);
-        if (t == null) {
-            throw WebResourceUtils.notFound("Cannot find task '%s'", taskId);
-        }
-        checkEntityEntitled(t);
+        Task<?> t = findTask(taskId);
         checkStreamEntitled(t, streamId);
 
         WrappedStream stream = BrooklynTaskTags.stream(t, streamId);


[08/10] brooklyn-server git commit: obscure, but when there are lots of tasks give preference to top-level and recent

Posted by he...@apache.org.
obscure, but when there are lots of tasks give preference to top-level and recent


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/36e0a8f2
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/36e0a8f2
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/36e0a8f2

Branch: refs/heads/master
Commit: 36e0a8f200f7f9252de853b06741b0ba0e14c713
Parents: 157c385
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Jul 7 02:27:33 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Jul 7 02:27:33 2017 +0100

----------------------------------------------------------------------
 .../brooklyn/rest/resources/EntityResource.java | 85 ++++++++++++++++++++
 1 file changed, 85 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/36e0a8f2/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 7007a7f..7d764a4 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
@@ -24,6 +24,7 @@ import static javax.ws.rs.core.Response.Status.ACCEPTED;
 import static org.apache.brooklyn.rest.util.WebResourceUtils.serviceAbsoluteUriBuilder;
 
 import java.net.URI;
+import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -64,10 +65,13 @@ import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.annotations.Beta;
+import com.google.common.base.Objects;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Ordering;
 import com.google.common.io.Files;
 
 @HaHotStateRequired
@@ -134,6 +138,9 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
         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()) {
@@ -153,6 +160,84 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti
             TaskTransformer.fromTask(ui.getBaseUriBuilder())));
     }
     
+    /** 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:
+     * <li>something manually submitted here, submitted two hours ago
+     * <li>something submitted from another entity, submitted ten minutes ago
+     * <li>anything in progress, submitted one minute ago
+     * <li>anything not started, submitted ten seconds ago
+     * <li>anything completed, submitted one second ago
+     * <p>
+     * So if there was a manual "foo" effector invoked via REST on this entity a day ago,
+     * a "bar" effector invoked from a parent effector would only be preferred
+     * if invoked in the last two hours;
+     * active subtasks of "bar" would be preferred if submitted within the last 12 minutes,
+     * unstarted subtasks if submitted within 2 minutes,
+     * and completed subtasks if within the last 12 seconds.
+     * Thus there is a heavy bias over time to show the top-level tasks,
+     * but there is also a bias for detail for very recent activity.
+     * <p>
+     * It's far from perfect but provides a way -- when there are lots of tasks --
+     * that we can show important things, where important things are the top level
+     * and very recent.
+     */
+    @Beta  
+    public static class InterestingTasksFirstComparator implements Comparator<Task<?>> {
+        Entity context;
+        public InterestingTasksFirstComparator() { this(null); }
+        public InterestingTasksFirstComparator(Entity entity) { this.context = entity; }
+        @Override
+        public int compare(Task<?> o1, Task<?> o2) {
+            // absolute pref for submitted items
+            if (!Objects.equal(o1.isSubmitted(), o2.isSubmitted())) {
+                return o1.isSubmitted() ? -1 : 1;
+            }
+
+            // big pref for top-level tasks (manual operations), where submitter null
+            int weight = 0;
+            Task<?> o1s = o1.getSubmittedByTask();
+            Task<?> o2s = o2.getSubmittedByTask();
+            if ("start".equals(o1.getDisplayName()) ||"start".equals(o2.getDisplayName())) {
+                weight = 0;
+            }
+            if (!Objects.equal(o1s==null, o2s==null))
+                weight += 2*60*60 * (o1s==null ? -1 : 1);
+            
+            // pretty big pref for things invoked by other entities
+            if (context!=null && o1s!=null && o2s!=null) {
+                boolean o1se = context.equals(BrooklynTaskTags.getContextEntity(o1s));
+                boolean o2se = context.equals(BrooklynTaskTags.getContextEntity(o2s));
+                if (!Objects.equal(o1se, o2se))
+                    weight += 10*60 *  (o2se ? -1 : 1);
+            }
+            // slight pref for things in progress
+            if (!Objects.equal(o1.isBegun() && !o1.isDone(), o2.isBegun() && !o2.isDone()))
+                weight += 60 * (o1.isBegun() && !o1.isDone() ? -1 : 1);
+            // and very slight pref for things not begun
+            if (!Objects.equal(o1.isBegun(), o2.isBegun())) 
+                weight += 10 * (!o1.isBegun() ? -1 : 1);
+            
+            // sort based on how recently the task changed state
+            long now = System.currentTimeMillis();
+            long t1 = o1.isDone() ? o1.getEndTimeUtc() : o1.isBegun() ? o1.getStartTimeUtc() : o1.getSubmitTimeUtc();
+            long t2 = o2.isDone() ? o2.getEndTimeUtc() : o2.isBegun() ? o2.getStartTimeUtc() : o2.getSubmitTimeUtc();
+            long u1 = now - t1;
+            long u2 = now - t2;
+            // so smaller = more recent
+            // and if there is a weight, increase the other side so it is de-emphasised
+            // IE if weight was -10 that means T1 is "10 times more interesting"
+            // or more precisely, a task T1 from 10 mins ago equals a task T2 from 1 min ago
+            if (weight<0) u2 *= -weight;
+            else if (weight>0) u1 *= weight;
+            if (u1!=u2) return u1 > u2 ? 1 : -1;
+            // if equal under mapping, use weight
+            if (weight!=0) return weight < 0 ? -1 : 1;
+            // lastly use ID to ensure canonical order
+            return o1.getId().compareTo(o2.getId());
+        }
+    }
+    
     @Override @Deprecated
     public List<TaskSummary> listTasks(String applicationId, String entityId) {
         return listTasks(applicationId, entityId, -1, false);


[04/10] brooklyn-server git commit: Merge branch 'master' into rest-entity-activities-recursive

Posted by he...@apache.org.
Merge branch 'master' into rest-entity-activities-recursive


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/fb04e20d
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/fb04e20d
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/fb04e20d

Branch: refs/heads/master
Commit: fb04e20d1dca07f8fa06dc4624e6681ad8aab0d7
Parents: fd99a2e eb9795c
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Jul 5 14:45:57 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jul 5 14:45:57 2017 +0100

----------------------------------------------------------------------
 .mvn/jvm.config                                 |    2 +-
 .../brooklyn/api/catalog/BrooklynCatalog.java   |   15 +-
 .../brooklyn/api/catalog/CatalogItem.java       |    2 +
 .../apache/brooklyn/api/entity/EntityType.java  |   12 -
 .../brooklyn/api/location/LocationSpec.java     |   21 -
 .../brooklyn/api/objs/BrooklynObject.java       |    3 +
 .../brooklyn/api/sensor/EnricherSpec.java       |    2 +-
 .../brooklyn/api/typereg/ManagedBundle.java     |    3 +
 .../brooklyn/api/typereg/OsgiBundleWithUrl.java |    6 +-
 .../brooklyn/api/typereg/RegisteredType.java    |   15 +
 .../interpret/PlanInterpretationContext.java    |    2 +-
 .../apache/brooklyn/camp/util/yaml/Yamls.java   |   24 -
 .../BrooklynComponentTemplateResolver.java      |   25 +-
 .../creation/BrooklynYamlTypeInstantiator.java  |    9 +
 .../service/BrooklynServiceTypeResolver.java    |   78 --
 .../creation/service/ServiceTypeResolver.java   |   77 --
 .../service/ServiceTypeResolverAdaptor.java     |   70 --
 .../brooklyn/spi/dsl/methods/DslComponent.java  |    4 +-
 .../brooklyn/AbstractJcloudsStubYamlTest.java   |    9 +-
 .../camp/brooklyn/AbstractWindowsYamlTest.java  |  138 +++
 .../camp/brooklyn/ByonLocationsYamlTest.java    |   17 +
 .../ConfigLocationInheritanceYamlTest.java      |    5 +-
 .../camp/brooklyn/ExternalConfigYamlTest.java   |    2 +-
 .../JcloudsTemplateOptionsYamlTest.java         |  118 ++
 .../camp/brooklyn/ReferencedYamlTest.java       |  126 ++-
 .../brooklyn/ValidationMissingTypeYamlTest.java |  222 ++++
 .../camp/brooklyn/WindowsYamlLiveTest.java      |   89 +-
 .../brooklyn/camp/brooklyn/WindowsYamlTest.java |  222 ++++
 .../catalog/CatalogMakeOsgiBundleTest.java      |   16 +-
 .../catalog/CatalogOsgiLibraryTest.java         |    9 +-
 .../CatalogOsgiVersionMoreEntityRebindTest.java |  195 +++-
 .../CatalogOsgiVersionMoreEntityTest.java       |   17 +-
 .../catalog/CatalogOsgiYamlEntityTest.java      |   15 +-
 .../camp/brooklyn/catalog/CatalogScanTest.java  |    9 +-
 .../brooklyn/catalog/CatalogYamlRebindTest.java |    4 +
 .../service/ServiceTypeResolverTest.java        |   39 -
 .../service/TestServiceTypeResolver.java        |   54 -
 .../camp/brooklyn/spi/dsl/DslYamlTest.java      |   31 +-
 .../brooklyn/test/lite/CampYamlLiteTest.java    |   21 +-
 ...lyn.spi.creation.service.ServiceTypeResolver |   19 -
 .../brooklyn/camp/server/dto/ApiErrorDto.java   |    3 +-
 .../core/BrooklynFeatureEnablement.java         |    8 -
 .../apache/brooklyn/core/BrooklynVersion.java   |    8 +-
 .../catalog/internal/BasicBrooklynCatalog.java  |  134 ++-
 .../core/catalog/internal/CatalogBundleDto.java |   13 +-
 .../catalog/internal/CatalogBundleLoader.java   |    7 +-
 .../catalog/internal/CatalogClasspathDo.java    |    7 +-
 .../core/catalog/internal/CatalogDto.java       |    4 +-
 .../core/catalog/internal/CatalogItemDo.java    |    5 +
 .../internal/CatalogItemDtoAbstract.java        |   42 +-
 .../core/catalog/internal/CatalogUtils.java     |   40 +-
 .../brooklyn/core/config/BasicConfigKey.java    |   14 +-
 .../apache/brooklyn/core/config/ConfigKeys.java |   11 +-
 .../brooklyn/core/config/ListConfigKey.java     |   53 +-
 .../brooklyn/core/config/MapConfigKey.java      |   34 +-
 .../brooklyn/core/config/SetConfigKey.java      |   55 +-
 .../external/UrlsExternalConfigSupplier.java    |    4 +-
 .../internal/AbstractCollectionConfigKey.java   |    7 +-
 .../internal/AbstractStructuredConfigKey.java   |    5 +
 .../core/effector/BasicParameterType.java       |    3 +-
 .../core/effector/http/HttpCommandEffector.java |   68 +-
 .../brooklyn/core/entity/AbstractEntity.java    |   49 -
 .../apache/brooklyn/core/entity/Entities.java   |    4 +-
 .../core/entity/EntityAndAttribute.java         |    3 +-
 .../core/entity/EntityTypeSnapshot.java         |   26 -
 .../downloads/BasicDownloadRequirement.java     |    4 +-
 .../downloads/BasicDownloadResolver.java        |    4 +-
 .../drivers/downloads/BasicDownloadTargets.java |    4 +-
 .../drivers/downloads/DownloadSubstituters.java |    4 +-
 .../core/entity/factory/ApplicationBuilder.java |  250 -----
 .../core/entity/lifecycle/PolicyDescriptor.java |    3 +-
 .../entity/lifecycle/ServiceStateLogic.java     |    1 -
 .../apache/brooklyn/core/feed/AbstractFeed.java |   20 -
 .../org/apache/brooklyn/core/feed/Poller.java   |    4 +-
 .../core/internal/BrooklynProperties.java       |    4 +-
 .../core/internal/BrooklynPropertiesImpl.java   |    4 +-
 .../core/location/AbstractLocation.java         |   38 -
 .../AggregatingMachineProvisioningLocation.java |    4 +-
 .../core/location/BasicHardwareDetails.java     |    6 +-
 .../core/location/BasicMachineDetails.java      |    4 +-
 .../core/location/BasicMachineMetadata.java     |    7 +-
 .../brooklyn/core/location/BasicOsDetails.java  |    6 +-
 .../core/location/LocationConfigUtils.java      |  102 --
 .../location/access/PortForwardManager.java     |    4 +-
 .../core/location/access/PortMapping.java       |    3 +-
 .../brooklyn/core/mgmt/BrooklynTasks.java       |   25 -
 .../BrooklynClassLoadingContextSequential.java  |    2 -
 ...rFromStackOfBrooklynClassLoadingContext.java |  145 +++
 .../BasicEntitlementClassDefinition.java        |    4 +-
 .../core/mgmt/ha/OsgiArchiveInstaller.java      |  428 +++++++
 .../mgmt/ha/OsgiBundleInstallationResult.java   |   80 ++
 .../brooklyn/core/mgmt/ha/OsgiManager.java      |  268 +++--
 .../ha/dto/BasicManagementNodeSyncRecord.java   |    6 +-
 .../ha/dto/ManagementPlaneSyncRecordImpl.java   |    4 +-
 .../internal/AbstractManagementContext.java     |   26 +-
 .../mgmt/internal/BrooklynShutdownHooks.java    |   24 +-
 .../core/mgmt/internal/EffectorUtils.java       |   34 -
 ...PropertyChangeToCollectionChangeAdapter.java |   68 --
 .../core/mgmt/internal/LocalEntityManager.java  |   14 +-
 .../mgmt/internal/LocalManagementContext.java   |    2 +-
 .../NonDeploymentManagementContext.java         |    4 +-
 .../core/mgmt/internal/ObservableSet.java       |   76 ++
 .../core/mgmt/persist/FileBasedObjectStore.java |    4 +-
 .../core/mgmt/persist/OsgiClassPrefixer.java    |   82 --
 .../core/mgmt/persist/XmlMementoSerializer.java |  171 +--
 .../mgmt/rebind/BasicEntityRebindSupport.java   |   18 -
 .../core/mgmt/rebind/RebindContextImpl.java     |   15 +-
 .../core/mgmt/rebind/RebindIteration.java       |   20 +-
 .../core/mgmt/rebind/dto/AbstractMemento.java   |    5 +-
 .../mgmt/rebind/dto/BrooklynMementoImpl.java    |    3 +
 .../mgmt/rebind/dto/MementosGenerators.java     |  130 +--
 .../mgmt/rebind/dto/MutableBrooklynMemento.java |  331 ------
 .../rebind/transformer/CompoundTransformer.java |   17 +-
 .../core/mgmt/usage/ApplicationUsage.java       |    3 +-
 .../core/objs/AbstractEntityAdjunct.java        |    4 +-
 .../apache/brooklyn/core/objs/AdjunctType.java  |    3 +-
 .../brooklyn/core/objs/BasicSpecParameter.java  |    3 +-
 .../objs/proxy/InternalLocationFactory.java     |   11 -
 .../core/sensor/DependentConfiguration.java     |   31 +-
 .../core/typereg/BasicBrooklynTypeRegistry.java |    4 +-
 .../core/typereg/BasicManagedBundle.java        |   25 +-
 .../core/typereg/BasicOsgiBundleWithUrl.java    |   12 +-
 .../core/typereg/BasicRegisteredType.java       |    6 +
 .../core/typereg/RegisteredTypeNaming.java      |  112 ++
 .../brooklyn/core/typereg/RegisteredTypes.java  |   10 +
 .../stock/AbstractAggregatingEnricher.java      |  175 ---
 .../stock/AbstractTransformingEnricher.java     |    4 +-
 .../stock/AbstractTypeTransformingEnricher.java |    6 +-
 .../brooklyn/enricher/stock/AddingEnricher.java |  109 --
 .../stock/CustomAggregatingEnricher.java        |  352 ------
 .../brooklyn/enricher/stock/Enrichers.java      |   15 +-
 .../stock/SensorPropagatingEnricher.java        |  186 ----
 .../stock/SensorTransformingEnricher.java       |  115 --
 .../brooklyn/enricher/stock/UpdatingMap.java    |    6 -
 .../entity/group/AbstractGroupImpl.java         |   25 -
 .../group/AbstractMembershipTrackingPolicy.java |    4 -
 .../brooklyn/entity/group/DynamicFabric.java    |    4 +
 .../entity/group/DynamicFabricImpl.java         |   13 +-
 .../brooklyn/entity/group/DynamicGroupImpl.java |    8 -
 .../brooklyn/entity/group/SequenceGroup.java    |    2 +-
 .../ProportionalZoneFailureDetector.java        |    4 +-
 .../FixedListMachineProvisioningLocation.java   |    4 +-
 .../location/ssh/SshMachineLocation.java        |    4 +-
 .../brooklyn/util/core/ClassLoaderUtils.java    |   17 +-
 .../brooklyn/util/core/flags/FlagUtils.java     |    3 +-
 .../util/core/flags/MethodCoercions.java        |   89 +-
 .../brooklyn/util/core/flags/TypeCoercions.java |   15 +-
 .../brooklyn/util/core/internal/Repeater.java   |  367 ------
 .../util/core/internal/ssh/SshTool.java         |    4 +
 .../internal/ssh/sshj/SshjClientConnection.java |    3 +-
 .../apache/brooklyn/util/core/osgi/Osgis.java   |   80 +-
 .../util/core/task/BasicExecutionContext.java   |   19 +-
 .../brooklyn/util/core/task/BasicTask.java      |   13 +-
 .../brooklyn/util/core/task/TaskInternal.java   |    4 +-
 .../system/internal/ExecWithLoggingHelpers.java |  112 +-
 .../util/core/xstream/ClassRenamingMapper.java  |   22 +-
 .../util/core/xstream/OsgiClassPrefixer.java    |   82 ++
 .../util/core/xstream/OsgiClassnameMapper.java  |   85 ++
 .../util/core/xstream/XmlSerializer.java        |   67 +-
 .../brooklyn/core/BrooklynVersionTest.java      |    4 +-
 .../internal/CatalogItemComparatorTest.java     |    9 +-
 .../catalog/internal/CatalogVersioningTest.java |   24 +-
 .../core/catalog/internal/MyCatalogItems.java   |    7 -
 .../config/MapConfigKeyAndFriendsMoreTest.java  |   76 ++
 .../core/effector/EffectorConcatenateTest.java  |  246 ----
 .../core/effector/MethodEffectorTest.java       |  419 +++++++
 .../http/HttpCommandEffectorHttpBinTest.java    |   35 +-
 .../effector/http/HttpCommandEffectorTest.java  |   24 +
 .../core/enricher/BasicEnricherTest.java        |   16 +-
 .../core/enricher/EnricherConfigTest.java       |   28 +-
 .../brooklyn/core/entity/AttributeTest.java     |   31 +-
 .../core/entity/EntityAutomanagedTest.java      |    3 +-
 .../brooklyn/core/entity/EntityNameTest.java    |   10 +-
 .../core/entity/EntitySetFromFlagTest.java      |  186 +---
 .../brooklyn/core/entity/EntitySpecTest.java    |    2 +-
 .../brooklyn/core/entity/EntityTypeTest.java    |   46 +-
 .../entity/OwnedChildrenDeprecatedTest.java     |  215 ++++
 .../brooklyn/core/entity/OwnedChildrenTest.java |  160 +--
 .../core/entity/PolicyRegistrationTest.java     |   39 +-
 .../core/entity/PolicySetFromFlagTest.java      |  211 ++++
 .../drivers/BasicEntityDriverManagerTest.java   |   33 +-
 .../drivers/EntityDriverRegistryTest.java       |   35 +-
 .../ReflectiveEntityDriverFactoryTest.java      |   63 +-
 .../RegistryEntityDriverFactoryTest.java        |   31 +-
 .../downloads/BasicDownloadsRegistryTest.java   |   39 +-
 .../DownloadProducerFromLocalRepoTest.java      |   26 +-
 .../DownloadProducerFromPropertiesTest.java     |   33 +-
 .../ApplicationBuilderOverridingTest.java       |  249 -----
 .../core/entity/proxying/EntityManagerTest.java |    3 +-
 .../core/entity/proxying/EntityProxyTest.java   |   20 -
 .../proxying/InternalEntityFactoryTest.java     |   32 +-
 .../core/location/AbstractLocationTest.java     |   33 +-
 .../location/cloud/CloudMachineNamerTest.java   |   31 +-
 .../location/cloud/CustomMachineNamerTest.java  |   20 +-
 ...mStackOfBrooklynClassLoadingContextTest.java |  143 +++
 .../AcmeEntitlementManagerTestFixture.java      |    6 +-
 .../core/mgmt/entitlement/EntitlementsTest.java |   31 +-
 .../mgmt/entitlement/EntityEntitlementTest.java |    5 +-
 .../HighAvailabilityManagerSplitBrainTest.java  |   11 +-
 .../brooklyn/core/mgmt/ha/HotStandbyTest.java   |   12 +-
 .../core/mgmt/internal/AccessManagerTest.java   |   62 +-
 .../internal/EntityExecutionManagerTest.java    |    4 +-
 .../core/mgmt/internal/ObservableSetTest.java   |  182 +++
 .../mgmt/internal/TestEntityWithEffectors.java  |    2 +-
 .../core/mgmt/osgi/OsgiStandaloneTest.java      |   23 +-
 .../mgmt/osgi/OsgiVersionMoreEntityTest.java    |   32 +-
 .../BrooklynMementoPersisterTestFixture.java    |    3 +-
 .../mgmt/persist/OsgiClassPrefixerTest.java     |  111 --
 ...nceStoreObjectAccessorWriterTestFixture.java |    2 +-
 ...entoSerializerDelegatingClassLoaderTest.java |  143 ---
 .../mgmt/persist/XmlMementoSerializerTest.java  |   13 +-
 .../mgmt/rebind/AbstractRebindHistoricTest.java |   66 ++
 .../mgmt/rebind/ActivePartialRebindTest.java    |    5 +-
 .../core/mgmt/rebind/MiscClassesRebindTest.java |  127 +++
 .../rebind/RebindAbstractCommandFeedTest.java   |   61 -
 .../core/mgmt/rebind/RebindCatalogItemTest.java |    3 +
 .../core/mgmt/rebind/RebindEntityTest.java      |   35 -
 .../mgmt/rebind/RebindHistoricSshFeedTest.java  |    2 +-
 .../mgmt/rebind/RebindManagerSorterTest.java    |    2 +-
 .../core/mgmt/rebind/RebindTestUtils.java       |   33 +-
 .../transformer/CompoundTransformerTest.java    |    1 -
 .../network/OnPublicNetworkEnricherTest.java    |    4 +-
 .../core/policy/basic/BasicPolicyTest.java      |   20 +
 .../core/policy/basic/EnricherTypeTest.java     |    8 +-
 .../core/policy/basic/PolicyConfigTest.java     |   68 +-
 .../policy/basic/PolicySubscriptionTest.java    |    9 +-
 .../core/policy/basic/PolicyTypeTest.java       |   16 +-
 .../core/server/entity/BrooklynMetricsTest.java |   28 +-
 .../core/test/entity/TestApplication.java       |    3 +-
 .../brooklyn/core/test/entity/TestEntity.java   |    4 +
 .../core/test/entity/TestEntityImpl.java        |   17 +-
 .../brooklyn/core/test/policy/TestPolicy.java   |    5 -
 .../EntityCleanupLongevityTestFixture.java      |    5 +-
 .../qa/performance/AbstractPerformanceTest.java |   34 +-
 .../EntityPersistencePerformanceTest.java       |    2 +-
 .../core/typereg/RegisteredTypeNamingTest.java  |   92 ++
 ...CustomAggregatingEnricherDeprecatedTest.java |  405 -------
 ...SensorPropagatingEnricherDeprecatedTest.java |  107 --
 .../TransformingEnricherDeprecatedTest.java     |   92 --
 .../YamlRollingTimeWindowMeanEnricherTest.java  |   23 +-
 .../AbstractDynamicClusterOrFabricTest.java     |   45 +
 .../entity/group/DynamicClusterTest.java        |   16 +-
 .../entity/group/DynamicFabricTest.java         |   24 +-
 .../brooklyn/entity/group/DynamicGroupTest.java |  285 ++---
 .../entity/group/DynamicRegionsFabricTest.java  |   62 +-
 .../group/MembershipTrackingPolicyTest.java     |   14 +-
 .../brooklyn/entity/stock/DataEntityTest.java   |   21 +-
 ...stMachineProvisioningLocationRebindTest.java |   32 +-
 .../location/multi/MultiLocationRebindTest.java |   50 +-
 .../ssh/SshMachineLocationIntegrationTest.java  |   36 +
 .../ssh/SshMachineLocationPerformanceTest.java  |    2 +-
 .../location/ssh/SshMachineLocationTest.java    |   51 +-
 .../util/core/ClassLoaderUtilsTest.java         |    2 +-
 .../util/core/flags/MethodCoercionsTest.java    |  133 ++-
 .../util/core/internal/FlagUtilsTest.java       |    3 +-
 .../util/core/internal/RepeaterTest.java        |  251 -----
 .../core/internal/ssh/RecordingSshTool.java     |   13 +-
 .../brooklyn/util/core/osgi/OsgiTestBase.java   |   41 +
 .../core/xstream/OsgiClassPrefixerTest.java     |  111 ++
 .../core/xstream/XmlSerializerOsgiTest.java     |  111 ++
 core/src/test/resources/catalog.bom             |   20 +
 .../effector/http/url-encoded-response.json     |   16 +
 ...7-06-versionedname-entity-n7p20t5h4o.memento |   42 +
 karaf/features/src/main/feature/feature.xml     |   20 +-
 .../brooklyn/launcher/osgi/OsgiLauncher.java    |    2 +
 .../command/support/CloudExplorerSupport.java   |    8 +-
 .../brooklyn/launcher/common/BasicLauncher.java |   59 +-
 .../BrooklynEntityMirrorIntegrationTest.java    |    3 +-
 .../brooklynnode/BrooklynNodeRestTest.java      |    3 +-
 .../brooklyn/launcher/BrooklynLauncherTest.java |   13 -
 locations/container/pom.xml                     |  154 +++
 .../entity/docker/DockerContainer.java          |   92 ++
 .../entity/docker/DockerContainerImpl.java      |   89 ++
 .../entity/kubernetes/KubernetesPod.java        |  102 ++
 .../entity/kubernetes/KubernetesPodImpl.java    |   25 +
 .../entity/kubernetes/KubernetesResource.java   |   58 +
 .../kubernetes/KubernetesResourceImpl.java      |   36 +
 .../entity/openshift/OpenShiftPod.java          |   27 +
 .../entity/openshift/OpenShiftPodImpl.java      |   25 +
 .../entity/openshift/OpenShiftResource.java     |   32 +
 .../entity/openshift/OpenShiftResourceImpl.java |   24 +
 .../location/docker/DockerJcloudsLocation.java  |  198 ++++
 .../location/docker/DockerLocationResolver.java |   89 ++
 .../location/kubernetes/ImageChooser.java       |   87 ++
 .../location/kubernetes/KubernetesCerts.java    |   82 ++
 .../kubernetes/KubernetesClientRegistry.java    |   29 +
 .../KubernetesClientRegistryImpl.java           |   96 ++
 .../location/kubernetes/KubernetesLocation.java | 1054 ++++++++++++++++++
 .../kubernetes/KubernetesLocationConfig.java    |  182 +++
 .../kubernetes/KubernetesLocationResolver.java  |   65 ++
 .../machine/KubernetesEmptyMachineLocation.java |   86 ++
 .../machine/KubernetesMachineLocation.java      |   45 +
 .../machine/KubernetesSshMachineLocation.java   |   46 +
 .../openshift/OpenShiftClientRegistryImpl.java  |   45 +
 .../location/openshift/OpenShiftLocation.java   |  263 +++++
 .../openshift/OpenShiftLocationConfig.java      |   32 +
 .../openshift/OpenShiftLocationResolver.java    |   65 ++
 ...pache.brooklyn.api.location.LocationResolver |   21 +
 .../resources/OSGI-INF/blueprint/blueprint.xml  |   37 +
 .../docker/DockerJcloudsLocationLiveTest.java   |  268 +++++
 .../docker/DockerLocationResolverTest.java      |  118 ++
 .../location/kubernetes/ImageChooserTest.java   |   85 ++
 .../kubernetes/KubernetesCertsTest.java         |  164 +++
 .../kubernetes/KubernetesLocationLiveTest.java  |  238 ++++
 .../KubernetesLocationResolverTest.java         |  102 ++
 .../KubernetesLocationYamlLiveTest.java         |  532 +++++++++
 .../openshift/OpenShiftLocationLiveTest.java    |   65 ++
 .../OpenShiftLocationResolverTest.java          |  103 ++
 .../OpenShiftLocationYamlLiveTest.java          |  146 +++
 .../resources/nginx-replication-controller.yaml |   37 +
 .../src/test/resources/nginx-service.yaml       |   29 +
 .../JcloudsBlobStoreBasedObjectStore.java       |    4 +-
 .../jclouds/AbstractComputeServiceRegistry.java |  151 +++
 ...wsEc2SessionAwareComputeServiceRegistry.java |  115 ++
 .../AwsEc2SessionAwareLocationConfig.java       |   28 +
 .../jclouds/BasicJcloudsLocationCustomizer.java |   20 +-
 .../jclouds/ComputeServiceRegistryImpl.java     |  202 +---
 .../jclouds/JCloudsPropertiesBuilder.java       |  166 +++
 .../jclouds/JcloudsByonLocationResolver.java    |    3 +-
 .../location/jclouds/JcloudsLocation.java       |  257 ++---
 .../jclouds/JcloudsLocationCustomizer.java      |   27 +
 .../jclouds/JcloudsLocationResolver.java        |    6 +-
 .../location/jclouds/JcloudsTypeCoercions.java  |  168 +++
 .../brooklyn/location/jclouds/JcloudsUtil.java  |  279 -----
 .../jclouds/JcloudsWinRmMachineLocation.java    |    4 +-
 .../jclouds/LocationCustomizerDelegate.java     |  239 ++++
 .../jclouds/RebindToMachinePredicate.java       |    4 +-
 .../aws/AbstractEbsVolumeCustomizer.java        |   96 ++
 .../jclouds/aws/EbsVolumeCustomizers.java       |  170 +++
 .../creator/DefaultAzureArmNetworkCreator.java  |  189 ++++
 .../BlobStorePersistencePerformanceTest.java    |    4 +
 .../jclouds/AbstractJcloudsStubbedUnitTest.java |   41 +-
 .../jclouds/BailOutJcloudsLocation.java         |    8 +-
 .../DefaultConnectivityResolverTest.java        |   30 +-
 .../JcloudsSshMachineLocationStubbedTest.java   |  108 ++
 .../jclouds/JcloudsStubTemplateBuilder.java     |  204 +++-
 .../JcloudsTemplateOptionsStubbedTest.java      |  102 ++
 .../JcloudsTypeCoercionsWithBuilderTest.java    |  308 +++++
 .../JcloudsTypeCoercionsWithCreateTest.java     |  278 +++++
 ...loudsLocationUserLoginAndConfigLiveTest.java |   12 +-
 .../DefaultAzureArmNetworkCreatorTest.java      |  280 +++++
 parent/pom.xml                                  |   26 +-
 .../policy/autoscaling/AutoScalerPolicy.java    |   11 +-
 .../autoscaling/MaxPoolSizeReachedEvent.java    |    4 +-
 .../policy/autoscaling/SizeHistory.java         |    4 +-
 .../brooklyn/policy/enricher/DeltaEnricher.java |    7 +-
 .../policy/enricher/HttpLatencyDetector.java    |   34 +-
 .../policy/enricher/RollingMeanEnricher.java    |   15 +-
 .../enricher/RollingTimeWindowMeanEnricher.java |   22 +-
 .../enricher/TimeFractionDeltaEnricher.java     |   56 +-
 .../enricher/TimeWeightedDeltaEnricher.java     |   36 +-
 .../apache/brooklyn/policy/ha/HASensors.java    |    4 +-
 .../policy/ha/ServiceFailureDetector.java       |   15 +-
 .../brooklyn/policy/ha/ServiceReplacer.java     |   20 +-
 .../brooklyn/policy/ha/ServiceRestarter.java    |   23 +-
 .../autoscaling/AutoScalerPolicyMetricTest.java |   79 +-
 .../AutoScalerPolicyReconfigurationTest.java    |   61 +-
 .../autoscaling/AutoScalerPolicyTest.java       |   93 +-
 .../autoscaling/LocallyResizableEntity.java     |   49 +-
 .../autoscaling/LocallyResizableEntityImpl.java |   76 ++
 .../policy/enricher/DeltaEnrichersTests.java    |   97 +-
 .../enricher/HttpLatencyDetectorTest.java       |    8 +-
 .../policy/enricher/RebindEnricherTest.java     |   32 +-
 .../enricher/RollingMeanEnricherTest.java       |   51 +-
 .../RollingTimeWindowMeanEnricherTest.java      |   45 +-
 .../enricher/TimeFractionDeltaEnricherTest.java |   52 +-
 .../AbstractFollowTheSunPolicyTest.java         |   42 +-
 .../followthesun/FollowTheSunModelTest.java     |   43 +-
 .../ha/ConnectionFailureDetectorTest.java       |   42 +-
 ...ServiceFailureDetectorStabilizationTest.java |   23 +-
 .../policy/ha/ServiceFailureDetectorTest.java   |   23 +-
 .../brooklyn/policy/ha/ServiceReplacerTest.java |   43 +-
 .../policy/ha/ServiceRestarterTest.java         |   15 +-
 .../AbstractLoadBalancingPolicyTest.java        |   19 +-
 .../BalanceableWorkerPoolTest.java              |   27 +-
 .../ItemsInContainersGroupTest.java             |   17 +-
 .../loadbalancing/LoadBalancingModelTest.java   |   28 +-
 .../LoadBalancingPolicyConcurrencyTest.java     |    8 +-
 .../loadbalancing/MockItemEntityImpl.java       |    5 +-
 pom.xml                                         |    4 +-
 .../apache/brooklyn/rest/api/CatalogApi.java    |   33 +-
 .../apache/brooklyn/rest/domain/ApiError.java   |   21 +-
 .../brooklyn/rest/domain/EffectorSummary.java   |    3 +-
 .../rest/resources/CatalogResource.java         |  175 ++-
 .../rest/transform/EntityTransformer.java       |   13 +-
 .../rest/util/BrooklynRestResourceUtils.java    |   89 +-
 .../brooklyn/rest/util/WebResourceUtils.java    |    3 +-
 .../rest/resources/ApplicationResourceTest.java |   25 -
 .../rest/resources/CatalogResourceTest.java     |  203 +++-
 .../rest/testing/mocks/RestMockAppBuilder.java  |   41 -
 .../testing/mocks/RestMockSimpleEntity.java     |   19 -
 .../testing/mocks/RestMockSimplePolicy.java     |    7 -
 .../util/BrooklynRestResourceUtilsTest.java     |   45 +-
 .../main/java/org/apache/brooklyn/cli/Main.java |   88 +-
 .../java/org/apache/brooklyn/cli/CliTest.java   |   79 +-
 .../src/test/resources/ExampleAppInFile.groovy  |   22 -
 .../entity/brooklynnode/BrooklynNodeImpl.java   |    8 -
 .../brooklyn/entity/java/JavaAppUtils.java      |   16 +-
 .../entity/java/VanillaJavaAppImpl.java         |   14 +-
 .../software/base/SoftwareProcessImpl.java      |   29 +-
 .../dynamic/clocker/StubContainerLocation.java  |    5 +-
 .../entity/AbstractGoogleComputeLiveTest.java   |   45 +-
 .../entity/AbstractSoftlayerLiveTest.java       |   42 +-
 .../brooklyn/entity/chef/ChefConfigsTest.java   |   16 +-
 .../chef/ChefServerTasksIntegrationTest.java    |   25 +-
 .../entity/java/VanillaJavaAppRebindTest.java   |   16 +-
 .../entity/machine/MachineEntityRebindTest.java |   72 +-
 .../software/base/AbstractDockerLiveTest.java   |   46 +-
 .../SoftwareProcessEntityFeedRebindTest.java    |    5 +-
 .../base/SoftwareProcessEntityTest.java         |   47 +-
 ...twareProcessOpenIptablesStreamsLiveTest.java |   13 +-
 ...SoftwareProcessSshDriverIntegrationTest.java |   31 +-
 ...laWindowsProcessWinrmExitStatusLiveTest.java |    3 +-
 ...nillaWindowsProcessWinrmStreamsLiveTest.java |    3 +-
 .../MachineLifecycleEffectorTasksTest.java      |   16 +-
 .../SoftwareProcessDriverCopyResourcesTest.java |   37 +-
 .../base/lifecycle/StartStopSshDriverTest.java  |   26 +-
 .../performance/ScalabilityPerformanceTest.java |  262 +++++
 .../apache/brooklyn/feed/jmx/JmxFeedTest.java   |   47 +-
 .../WindowsPerformanceCounterSensors.java       |    4 +-
 .../windows/WindowsPerformanceCounterFeed.java  |   14 +-
 .../util/core/internal/winrm/WinRmTool.java     |    4 +
 .../internal/winrm/winrm4j/Winrm4jTool.java     |   22 +-
 ...RebindWindowsPerformanceCounterFeedTest.java |   38 +
 .../feed/windows/RebindWinrmCmdFeedTest.java    |    8 +-
 .../core/internal/winrm/ExecCmdAsserts.java     |  120 ++
 .../core/internal/winrm/RecordingWinRmTool.java |    8 +-
 ...-counter-feed-no-bundle-prefixies-ueauyeu41d |   61 +
 .../windows-performance-counter-feed-tu4kk0xvf8 |   61 +
 .../framework/LoopOverGroupMembersTestCase.java |    1 +
 .../LoopOverGroupMembersTestCaseImpl.java       |   33 +-
 .../LoopOverGroupMembersTestCaseTest.java       |   71 +-
 .../framework/TestFrameworkAssertionsTest.java  |   10 +-
 .../apache/brooklyn/test/EntityTestUtils.java   |  192 ----
 .../org/apache/brooklyn/test/LogWatcher.java    |   14 +-
 .../brooklyn/test/PerformanceTestUtils.java     |   26 -
 .../org/apache/brooklyn/test/TestUtils.java     |   83 --
 .../test/performance/PerformanceMeasurer.java   |  165 ++-
 .../performance/PerformanceTestDescriptor.java  |   49 +-
 .../test/performance/PerformanceTestResult.java |    4 +-
 .../src/main/resources/catalog.bom              |    7 +-
 utils/common/pom.xml                            |   10 +
 .../org/apache/brooklyn/util/ShellUtils.java    |  185 ---
 .../brooklyn/util/http/HttpToolResponse.java    |    4 +-
 .../javalang/MethodAccessibleReflections.java   |  173 +++
 .../brooklyn/util/javalang/Reflections.java     |   47 +-
 .../coerce/CommonAdaptorTryCoercions.java       |  150 +++
 .../coerce/CommonAdaptorTypeCoercions.java      |    6 +-
 .../util/javalang/coerce/TryCoercer.java        |   45 +
 .../javalang/coerce/TypeCoercerExtensible.java  |  101 +-
 .../brooklyn/util/maven/MavenArtifact.java      |    3 +-
 .../java/org/apache/brooklyn/util/os/Os.java    |    5 +-
 .../apache/brooklyn/util/osgi/OsgiUtils.java    |   14 +-
 .../brooklyn/util/osgi/VersionedName.java       |  120 +-
 .../apache/brooklyn/util/pool/BasicPool.java    |    4 +-
 .../util/stream/LoggingOutputStream.java        |  157 +++
 .../brooklyn/util/stream/StreamGobbler.java     |    2 +
 .../util/text/BrooklynVersionSyntax.java        |  195 ++++
 .../util/text/NaturalOrderComparator.java       |   41 +-
 .../brooklyn/util/text/VersionComparator.java   |  214 ++--
 .../org/apache/brooklyn/util/time/Duration.java |    5 +
 .../util/javalang/MemoryUsageTrackerTest.java   |    4 +-
 .../brooklyn/util/javalang/ReflectionsTest.java |   64 ++
 .../coerce/TypeCoercerExtensibleTest.java       |   82 ++
 .../util/javalang/coerce/TypeCoercionsTest.java |   59 +
 .../brooklyn/util/osgi/OsgiTestResources.java   |    3 +-
 .../brooklyn/util/osgi/OsgiUtilsTest.java       |    3 +
 .../apache/brooklyn/util/osgi/OsgisTest.java    |    8 +-
 .../brooklyn/util/osgi/VersionedNameTest.java   |   63 ++
 .../util/stream/LoggingOutputStreamTest.java    |  104 ++
 .../util/text/BrooklynVersionSyntaxTest.java    |   98 ++
 .../util/text/ComparableVersionTest.java        |    5 +-
 .../util/text/NaturalOrderComparatorTest.java   |   63 +-
 .../util/text/VersionComparatorTest.java        |   72 +-
 .../brooklyn-test-osgi-com-example-entities.jar |  Bin 22130 -> 22139 bytes
 .../osgi/brooklyn-test-osgi-entities.jar        |  Bin 22900 -> 22902 bytes
 .../brooklyn-test-osgi-more-entities_0.1.0.jar  |  Bin 15997 -> 16003 bytes
 .../brooklyn-test-osgi-more-entities_0.2.0.jar  |  Bin 16903 -> 16922 bytes
 ...-test-osgi-more-entities_evil-twin_0.2.0.jar |  Bin 14091 -> 14098 bytes
 .../util/groovy/GroovJavaMethodsTest.java       |    4 +-
 480 files changed, 18063 insertions(+), 9638 deletions(-)
----------------------------------------------------------------------



[10/10] brooklyn-server git commit: This closes #756

Posted by he...@apache.org.
This closes #756


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/34efce10
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/34efce10
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/34efce10

Branch: refs/heads/master
Commit: 34efce10337f2b42f1810edc30ee2291a325ff59
Parents: 9795c47 ca9efdb
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Sat Jul 22 03:14:26 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Sat Jul 22 03:14:26 2017 +0100

----------------------------------------------------------------------
 .../brooklyn/core/effector/AddEffector.java     |   2 +-
 .../apache/brooklyn/core/entity/Entities.java   |   4 +
 .../brooklyn/core/entity/EntityDynamicType.java |   3 +-
 .../apache/brooklyn/util/core/task/Tasks.java   |  28 ++
 .../core/effector/SampleManyTasksEffector.java  | 118 +++++++
 .../apache/brooklyn/rest/api/ActivityApi.java   |  12 +-
 .../brooklyn/rest/api/ApplicationApi.java       |   9 +-
 .../org/apache/brooklyn/rest/api/EntityApi.java |  14 +-
 .../rest/resources/ActivityResource.java        |  61 ++--
 .../brooklyn/rest/resources/EntityResource.java | 117 ++++++-
 .../rest/resources/ActivityRestTest.java        | 344 +++++++++++++++++++
 .../rest/resources/EffectorUtilsRestTest.java   |   1 +
 .../rest/resources/ErrorResponseTest.java       |   2 -
 13 files changed, 672 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/34efce10/core/src/main/java/org/apache/brooklyn/util/core/task/Tasks.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/34efce10/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/ActivityApi.java
----------------------------------------------------------------------


[03/10] brooklyn-server git commit: sample effector for use in UI tests

Posted by he...@apache.org.
sample effector for use in UI tests


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/fd99a2e5
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/fd99a2e5
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/fd99a2e5

Branch: refs/heads/master
Commit: fd99a2e56b030cfd95b5c802a4b12e48cd737d6a
Parents: 4f9564f
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Jul 5 14:45:37 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Jul 5 14:45:37 2017 +0100

----------------------------------------------------------------------
 .../core/effector/SampleManyTasksEffector.java  | 87 ++++++++++++++++++++
 1 file changed, 87 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fd99a2e5/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java b/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
new file mode 100644
index 0000000..6cf4e2c
--- /dev/null
+++ b/core/src/test/java/org/apache/brooklyn/core/effector/SampleManyTasksEffector.java
@@ -0,0 +1,87 @@
+package org.apache.brooklyn.core.effector;
+
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import org.apache.brooklyn.api.effector.Effector;
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.api.mgmt.TaskAdaptable;
+import org.apache.brooklyn.core.effector.EffectorTasks.EffectorTaskFactory;
+import org.apache.brooklyn.util.collections.MutableList;
+import org.apache.brooklyn.util.core.config.ConfigBag;
+import org.apache.brooklyn.util.core.task.DynamicTasks;
+import org.apache.brooklyn.util.core.task.TaskBuilder;
+import org.apache.brooklyn.util.core.task.Tasks;
+import org.apache.brooklyn.util.time.Duration;
+import org.apache.brooklyn.util.time.Time;
+
+/** Effector which can be used to create a lot of tasks with delays.
+ * Mainly used for manual UI testing, with a blueprint such as the following:
+
+<pre>
+
+name: Test with many tasks
+location: localhost
+services:
+- type: org.apache.brooklyn.entity.software.base.VanillaSoftwareProcess
+  brooklyn.initializers:
+  - type: org.apache.brooklyn.core.effector.SampleManyTasksEffector
+  launch.command: |
+    echo hello | nc -l 4321 &
+    echo $! > $PID_FILE
+    ## to experiment with errors or sleeping
+    # sleep 10
+    # exit 3
+
+</pre>
+
+ */
+public class SampleManyTasksEffector extends AddEffector {
+
+    public SampleManyTasksEffector(ConfigBag params) {
+        super(Effectors.effector(String.class, params.get(EFFECTOR_NAME)).name("eatand").impl(body(params)).build());
+    }
+
+    private static EffectorTaskFactory<String> body(ConfigBag params) {
+        return new EffectorTaskFactory<String>() {
+            @Override
+            public TaskAdaptable<String> newTask(Entity entity, Effector<String> effector, ConfigBag parameters) {
+                return Tasks.<String>builder().displayName("eat-sleep-rave-repeat").addAll(tasks(0)).build();
+            }
+            List<Task<Object>> tasks(final int depth) {
+                List<Task<Object>> result = MutableList.of();
+                do {
+                    TaskBuilder<Object> t = Tasks.builder();
+                    double x = Math.random();
+                    if (depth>4) x *= Math.random();
+                    if (depth>6) x *= Math.random();
+                    if (x<0.3) {
+                        t.displayName("eat").body(new Callable<Object>() { public Object call() { return "eat"; }});
+                    } else if (x<0.6) {
+                        final Duration time = Duration.millis(Math.round(10*1000*Math.random()*Math.random()*Math.random()*Math.random()*Math.random()));
+                        t.displayName("sleep").description("Sleeping "+time).body(new Callable<Object>() { public Object call() {
+                            Tasks.setBlockingDetails("sleeping "+time);
+                            Time.sleep(time);
+                            return "slept "+time;
+                        }});
+                    } else if (x<0.8) {
+                        t.displayName("rave").body(new Callable<Object>() { public Object call() {
+                            List<Task<Object>> ts = tasks(depth+1);
+                            for (Task<Object> tt: ts) {
+                                DynamicTasks.queue(tt);
+                            }
+                            return "raved with "+ts.size()+" tasks";
+                        }});
+                    } else {
+                        t.displayName("repeat").addAll(tasks(depth+1));
+                    }
+                    result.add(t.build());
+                    
+                } while (Math.random()<0.8);
+                return result;
+            }
+        };
+    }
+
+}