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;
+ }
+ };
+ }
+
+}