You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sj...@apache.org on 2016/11/16 12:30:11 UTC
[1/4] brooklyn-server git commit: BROOKLYN-383: fix json
serialisation of tasks
Repository: brooklyn-server
Updated Branches:
refs/heads/master 8735a0a56 -> 5b65fadc9
BROOKLYN-383: fix json serialisation of tasks
* Also do the same for policies, enrichers and feeds.
* Adds AbstractEntityAdjunct.getEntity() to make that easier.
* Adds TestEntity.sleepEffector
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/db16acb4
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/db16acb4
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/db16acb4
Branch: refs/heads/master
Commit: db16acb4fc9103abed6f73f3948624f69eead77b
Parents: 6a4ca64
Author: Aled Sage <al...@gmail.com>
Authored: Thu Nov 10 13:18:43 2016 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Nov 10 14:15:11 2016 +0000
----------------------------------------------------------------------
.../apache/brooklyn/core/feed/AbstractFeed.java | 1 +
.../core/objs/AbstractEntityAdjunct.java | 4 +
.../util/core/json/BidiSerialization.java | 133 ++++++++++++++++---
.../core/json/BrooklynObjectsJsonMapper.java | 4 +
.../brooklyn/core/test/entity/TestEntity.java | 5 +
.../core/test/entity/TestEntityImpl.java | 9 ++
.../rest/resources/SensorResourceTest.java | 116 +++++++++++++++-
.../system_service/SystemServiceEnricher.java | 5 -
.../base/ShellEnvironmentSerializerTest.java | 2 +-
9 files changed, 255 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/db16acb4/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java b/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java
index 5b057dd..6351d2e 100644
--- a/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java
+++ b/core/src/main/java/org/apache/brooklyn/core/feed/AbstractFeed.java
@@ -180,6 +180,7 @@ public abstract class AbstractFeed extends AbstractEntityAdjunct implements Feed
return activated;
}
+ @Override
public EntityLocal getEntity() {
return entity;
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/db16acb4/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
index 5b1dc88..4acf141 100644
--- a/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
+++ b/core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java
@@ -383,6 +383,10 @@ public abstract class AbstractEntityAdjunct extends AbstractBrooklynObject imple
}
}
+ public Entity getEntity() {
+ return entity;
+ }
+
/** @deprecated since 0.7.0 only {@link AbstractEnricher} has emit convenience */
protected <T> void emit(Sensor<T> sensor, Object val) {
checkState(entity != null, "entity must first be set");
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/db16acb4/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java b/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java
index 08f3bc1..74a5cf4 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java
@@ -24,7 +24,14 @@ import java.util.Map;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.mgmt.Task;
import org.apache.brooklyn.api.objs.BrooklynObject;
+import org.apache.brooklyn.api.objs.EntityAdjunct;
+import org.apache.brooklyn.api.policy.Policy;
+import org.apache.brooklyn.api.sensor.Enricher;
+import org.apache.brooklyn.api.sensor.Feed;
+import org.apache.brooklyn.core.entity.EntityInternal;
+import org.apache.brooklyn.core.objs.AbstractEntityAdjunct;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
@@ -33,6 +40,7 @@ import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.google.common.base.Optional;
public class BidiSerialization {
@@ -101,10 +109,14 @@ public class BidiSerialization {
}
protected void writeBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
- jgen.writeStringField("type", value.getClass().getCanonicalName());
+ jgen.writeStringField("type", customType(value));
customWriteBody(value, jgen, provider);
}
+ protected String customType(T value) throws IOException {
+ return value.getClass().getCanonicalName();
+ }
+
public abstract void customWriteBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException;
public T deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
@@ -125,7 +137,12 @@ public class BidiSerialization {
public static class ManagementContextSerialization extends AbstractWithManagementContextSerialization<ManagementContext> {
public ManagementContextSerialization(ManagementContext mgmt) { super(ManagementContext.class, mgmt); }
@Override
- public void customWriteBody(ManagementContext value, JsonGenerator jgen, SerializerProvider provider) throws IOException {}
+ protected String customType(ManagementContext value) throws IOException {
+ return type.getCanonicalName();
+ }
+ @Override
+ public void customWriteBody(ManagementContext value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
+ }
@Override
protected ManagementContext customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException {
return mgmt;
@@ -137,9 +154,8 @@ public class BidiSerialization {
super(type, mgmt);
}
@Override
- protected void writeBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
- jgen.writeStringField("type", type.getCanonicalName());
- customWriteBody(value, jgen, provider);
+ protected String customType(T value) throws IOException {
+ return type.getCanonicalName();
}
@Override
public void customWriteBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
@@ -152,22 +168,109 @@ public class BidiSerialization {
protected abstract T getInstanceFromId(String id);
}
+ public abstract static class AbstractBrooklynAdjunctSerialization<T extends BrooklynObject & EntityAdjunct> extends AbstractWithManagementContextSerialization<T> {
+ public AbstractBrooklynAdjunctSerialization(Class<T> type, ManagementContext mgmt) {
+ super(type, mgmt);
+ }
+ @Override
+ protected String customType(T value) throws IOException {
+ return type.getCanonicalName();
+ }
+ @Override
+ public void customWriteBody(T value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
+ Optional<String> entityId = getEntityId(value);
+ jgen.writeStringField("id", value.getId());
+ if (entityId.isPresent()) jgen.writeStringField("entityId", entityId.get());
+ }
+ @Override
+ protected T customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException {
+ Optional<String> entityId = Optional.fromNullable((String) values.get("entityId"));
+ Optional<Entity> entity = Optional.fromNullable(entityId.isPresent() ? null: mgmt.getEntityManager().getEntity(entityId.get()));
+ String id = (String) values.get("id");
+ return getInstanceFromId(entity, id);
+ }
+ protected Optional<String> getEntityId(T value) {
+ if (value instanceof AbstractEntityAdjunct) {
+ Entity entity = ((AbstractEntityAdjunct)value).getEntity();
+ return Optional.fromNullable(entity == null ? null : entity.getId());
+ }
+ return Optional.absent();
+ }
+ protected abstract T getInstanceFromId(Optional<Entity> entity, String id);
+ }
+
public static class EntitySerialization extends AbstractBrooklynObjectSerialization<Entity> {
public EntitySerialization(ManagementContext mgmt) { super(Entity.class, mgmt); }
@Override protected Entity getInstanceFromId(String id) { return mgmt.getEntityManager().getEntity(id); }
}
+
public static class LocationSerialization extends AbstractBrooklynObjectSerialization<Location> {
public LocationSerialization(ManagementContext mgmt) { super(Location.class, mgmt); }
@Override protected Location getInstanceFromId(String id) { return mgmt.getLocationManager().getLocation(id); }
}
- // TODO how to look up policies and enrichers? (not essential...)
-// public static class PolicySerialization extends AbstractBrooklynObjectSerialization<Policy> {
-// public EntitySerialization(ManagementContext mgmt) { super(Policy.class, mgmt); }
-// @Override protected Policy getKind(String id) { return mgmt.getEntityManager().getEntity(id); }
-// }
-// public static class EnricherSerialization extends AbstractBrooklynObjectSerialization<Enricher> {
-// public EntitySerialization(ManagementContext mgmt) { super(Entity.class, mgmt); }
-// @Override protected Enricher getKind(String id) { return mgmt.getEntityManager().getEntity(id); }
-// }
-
+
+ public static class PolicySerialization extends AbstractBrooklynAdjunctSerialization<Policy> {
+ public PolicySerialization(ManagementContext mgmt) {
+ super(Policy.class, mgmt);
+ }
+ @Override protected Policy getInstanceFromId(Optional<Entity> entity, String id) {
+ if (id == null || !entity.isPresent()) return null;
+ for (Policy policy : entity.get().policies()) {
+ if (id.equals(policy.getId())) {
+ return policy;
+ }
+ }
+ return null;
+ }
+ }
+
+ public static class EnricherSerialization extends AbstractBrooklynAdjunctSerialization<Enricher> {
+ public EnricherSerialization(ManagementContext mgmt) {
+ super(Enricher.class, mgmt);
+ }
+ @Override protected Enricher getInstanceFromId(Optional<Entity> entity, String id) {
+ if (id == null || !entity.isPresent()) return null;
+ for (Enricher enricher : entity.get().enrichers()) {
+ if (id.equals(enricher.getId())) {
+ return enricher;
+ }
+ }
+ return null;
+ }
+ }
+
+ public static class FeedSerialization extends AbstractBrooklynAdjunctSerialization<Feed> {
+ public FeedSerialization(ManagementContext mgmt) {
+ super(Feed.class, mgmt);
+ }
+ @Override protected Feed getInstanceFromId(Optional<Entity> entity, String id) {
+ if (id == null || !entity.isPresent()) return null;
+ for (Feed feed : ((EntityInternal)entity).feeds().getFeeds()) {
+ if (id.equals(feed.getId())) {
+ return feed;
+ }
+ }
+ return null;
+ }
+ }
+
+ public static class TaskSerialization extends AbstractWithManagementContextSerialization<Task<?>> {
+ @SuppressWarnings("unchecked")
+ public TaskSerialization(ManagementContext mgmt) {
+ super((Class<Task<?>>)(Class<?>)Task.class, mgmt);
+ }
+ @Override
+ protected String customType(Task<?> value) throws IOException {
+ return type.getCanonicalName();
+ }
+ @Override
+ public void customWriteBody(Task<?> value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
+ jgen.writeStringField("id", value.getId());
+ jgen.writeStringField("displayName", value.getDisplayName());
+ }
+ @Override
+ protected Task<?> customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException {
+ return mgmt.getExecutionManager().getTask((String) values.get("id"));
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/db16acb4/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java b/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java
index 175e62a..f6c5bee 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java
@@ -36,6 +36,10 @@ public class BrooklynObjectsJsonMapper {
new BidiSerialization.ManagementContextSerialization(mgmt).install(mapperModule);
new BidiSerialization.EntitySerialization(mgmt).install(mapperModule);
new BidiSerialization.LocationSerialization(mgmt).install(mapperModule);
+ new BidiSerialization.PolicySerialization(mgmt).install(mapperModule);
+ new BidiSerialization.EnricherSerialization(mgmt).install(mapperModule);
+ new BidiSerialization.FeedSerialization(mgmt).install(mapperModule);
+ new BidiSerialization.TaskSerialization(mgmt).install(mapperModule);
mapper.registerModule(new GuavaModule()).registerModule(mapperModule);
return mapper;
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/db16acb4/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java b/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java
index 71e84fe..a3a4fa4 100644
--- a/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java
+++ b/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java
@@ -44,6 +44,7 @@ import org.apache.brooklyn.core.entity.trait.Startable;
import org.apache.brooklyn.core.sensor.BasicNotificationSensor;
import org.apache.brooklyn.core.sensor.Sensors;
import org.apache.brooklyn.util.core.flags.SetFromFlag;
+import org.apache.brooklyn.util.time.Duration;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -81,6 +82,7 @@ public interface TestEntity extends Entity, Startable, EntityLocal, EntityIntern
public static final MethodEffector<Void> MY_EFFECTOR = new MethodEffector<Void>(TestEntity.class, "myEffector");
public static final MethodEffector<Object> IDENTITY_EFFECTOR = new MethodEffector<Object>(TestEntity.class, "identityEffector");
+ public static final MethodEffector<Void> SLEEP_EFFECTOR = new MethodEffector<Void>(TestEntity.class, "sleepEffector");
public boolean isLegacyConstruction();
@@ -90,6 +92,9 @@ public interface TestEntity extends Entity, Startable, EntityLocal, EntityIntern
@Effector(description="returns the arg passed in")
public Object identityEffector(@EffectorParam(name="arg", description="val to return") Object arg);
+ @Effector(description="sleeps for the given duration")
+ public void sleepEffector(@EffectorParam(name="duration") Duration duration);
+
public AtomicInteger getCounter();
public int getCount();
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/db16acb4/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java b/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java
index 77d4672..50d14a8 100644
--- a/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java
+++ b/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java
@@ -33,6 +33,8 @@ import org.apache.brooklyn.core.entity.AbstractEntity;
import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.time.Duration;
+import org.apache.brooklyn.util.time.Time;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -88,6 +90,13 @@ public class TestEntityImpl extends AbstractEntity implements TestEntity {
}
@Override
+ public void sleepEffector(Duration duration) {
+ if (LOG.isTraceEnabled()) LOG.trace("In sleepEffector for {}", this);
+ callHistory.add("sleepEffector");
+ Time.sleep(duration);
+ }
+
+ @Override
public AtomicInteger getCounter() {
return counter;
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/db16acb4/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
index 99ef87a..f8bc636 100644
--- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
+++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/SensorResourceTest.java
@@ -20,16 +20,30 @@ package org.apache.brooklyn.rest.resources;
import static org.testng.Assert.assertEquals;
+import java.io.InputStream;
import java.util.Map;
+import java.util.concurrent.Callable;
+import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+import org.apache.brooklyn.api.entity.Entity;
+import org.apache.brooklyn.api.location.Location;
+import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.mgmt.Task;
+import org.apache.brooklyn.api.policy.Policy;
import org.apache.brooklyn.api.sensor.AttributeSensor;
+import org.apache.brooklyn.api.sensor.Enricher;
+import org.apache.brooklyn.api.sensor.Feed;
import org.apache.brooklyn.core.config.render.RendererHints;
import org.apache.brooklyn.core.entity.EntityInternal;
import org.apache.brooklyn.core.entity.EntityPredicates;
import org.apache.brooklyn.core.sensor.Sensors;
+import org.apache.brooklyn.core.test.entity.TestEntity;
+import org.apache.brooklyn.core.test.policy.TestEnricher;
+import org.apache.brooklyn.core.test.policy.TestPolicy;
+import org.apache.brooklyn.feed.function.FunctionFeed;
import org.apache.brooklyn.rest.api.SensorApi;
import org.apache.brooklyn.rest.domain.ApplicationSpec;
import org.apache.brooklyn.rest.domain.EntitySpec;
@@ -37,19 +51,22 @@ import org.apache.brooklyn.rest.test.config.render.TestRendererHints;
import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest;
import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.core.task.Tasks;
import org.apache.brooklyn.util.http.HttpAsserts;
import org.apache.brooklyn.util.stream.Streams;
import org.apache.brooklyn.util.text.StringFunctions;
+import org.apache.brooklyn.util.time.Duration;
+import org.apache.brooklyn.util.time.Time;
+import org.apache.cxf.jaxrs.client.WebClient;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.base.Functions;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
-import java.io.InputStream;
-import javax.ws.rs.core.GenericType;
-import org.apache.cxf.jaxrs.client.WebClient;
+import com.google.common.util.concurrent.Callables;
/**
* Test the {@link SensorApi} implementation.
@@ -263,5 +280,98 @@ public class SensorResourceTest extends BrooklynRestResourceTest {
} finally { addAmphibianSensor(entity); }
}
+
+ @Test
+ public void testGetSensorValueOfTypeManagementContext() throws Exception {
+ entity.sensors().set(Sensors.newSensor(ManagementContext.class, "myMgmt"), getManagementContext());
+ doGetSensorTest("myMgmt", Map.class, ImmutableMap.of("type", ManagementContext.class.getName()));
+ }
+
+ @Test
+ public void testGetSensorValueOfTypeEntity() throws Exception {
+ // Note that non-raw will render it with just the entity's displayName
+ entity.sensors().set(Sensors.newSensor(Entity.class, "myEntity"), entity);
+ doGetSensorTest("myEntity", Map.class, ImmutableMap.of("type", Entity.class.getName(), "id", entity.getId()), true);
+ doGetSensorTest("myEntity", String.class, "\"simple-ent\"", false);
+ }
+
+ @Test
+ public void testGetSensorValueOfTypeLocation() throws Exception {
+ Location loc = getManagementContext().getLocationRegistry().getLocationManaged("localhost");
+ entity.sensors().set(Sensors.newSensor(Location.class, "myLocation"), loc);
+ doGetSensorTest("myLocation", Map.class, ImmutableMap.of("type", Location.class.getName(), "id", loc.getId()));
+ }
+
+ @Test
+ public void testGetSensorValueOfTypePolicy() throws Exception {
+ Policy policy = entity.policies().add(org.apache.brooklyn.api.policy.PolicySpec.create(TestPolicy.class));
+ entity.sensors().set(Sensors.newSensor(Policy.class, "myPolicy"), policy);
+ doGetSensorTest("myPolicy", Map.class, ImmutableMap.of("type", Policy.class.getName(), "id", policy.getId(), "entityId", entity.getId()));
+ }
+
+ @Test
+ public void testGetSensorValueOfTypeEnricher() throws Exception {
+ Enricher enricher = entity.enrichers().add(org.apache.brooklyn.api.sensor.EnricherSpec.create(TestEnricher.class));
+ entity.sensors().set(Sensors.newSensor(Enricher.class, "myEnricher"), enricher);
+ doGetSensorTest("myEnricher", Map.class, ImmutableMap.of("type", Enricher.class.getName(), "id", enricher.getId(), "entityId", entity.getId()));
+ }
+
+ @Test
+ public void testGetSensorValueOfTypeFeed() throws Exception {
+ Feed feed = entity.feeds().add(FunctionFeed.builder().entity(entity).build());
+ entity.sensors().set(Sensors.newSensor(Feed.class, "myFeed"), feed);
+ doGetSensorTest("myFeed", Map.class, ImmutableMap.of("type", Feed.class.getName(), "id", feed.getId(), "entityId", entity.getId()));
+ }
+
+ @Test
+ public void testGetSensorValueOfTypeCompletedTask() throws Exception {
+ Task<String> task = entity.getExecutionContext().submit(Callables.returning("myval"));
+ task.get();
+ entity.sensors().set(Sensors.newSensor(Task.class, "myTask"), task);
+ doGetSensorTest("myTask", String.class, "\"myval\"");
+ }
+
+ @Test
+ public void testGetSensorValueOfTypeInprogressTask() throws Exception {
+ Task<Void> task = Tasks.<Void>builder().displayName("my-task-name").body(new SleepingCallable(Duration.THIRTY_SECONDS)).build();
+ entity.getExecutionContext().submit(task);
+ entity.sensors().set(Sensors.newSensor(Task.class, "myTask"), task);
+ doGetSensorTest("myTask", Map.class, ImmutableMap.of("type", Task.class.getName(), "id", task.getId(), "displayName", "my-task-name"));
+ }
+
+ @Test
+ public void testGetSensorValueOfTypeEffectorTask() throws Exception {
+ TestEntity testEntity = entity.addChild(org.apache.brooklyn.api.entity.EntitySpec.create(TestEntity.class));
+ Task<Void> task = testEntity.invoke(TestEntity.SLEEP_EFFECTOR, ImmutableMap.of("duration", Duration.THIRTY_SECONDS));
+ entity.sensors().set(Sensors.newSensor(Task.class, "myTask"), task);
+ doGetSensorTest("myTask", Map.class, ImmutableMap.of("type", Task.class.getName(), "id", task.getId(), "displayName", "sleepEffector"));
+ }
+
+ protected <T> void doGetSensorTest(String sensorName, Class<T> expectedType, T expectedVal) throws Exception {
+ doGetSensorTest(sensorName, expectedType, expectedVal, true);
+ doGetSensorTest(sensorName, expectedType, expectedVal, false);
+ }
+
+ protected <T> void doGetSensorTest(String sensorName, Class<T> expectedType, T expectedVal, boolean raw) throws Exception {
+ Response response = client().path(SENSORS_ENDPOINT + "/" + sensorName)
+ .query("raw", raw)
+ .accept(MediaType.APPLICATION_JSON_TYPE)
+ .get();
+
+ HttpAsserts.assertHealthyStatusCode(response.getStatus());
+ T value = response.readEntity(expectedType);
+ assertEquals(value, expectedVal);
+ }
+ public static class SleepingCallable implements Callable<Void> {
+ private final Duration duration;
+
+ SleepingCallable(Duration duration) {
+ this.duration = duration;
+ }
+ public Void call() throws Exception {
+ Time.sleep(duration);
+ return null;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/db16acb4/software/base/src/main/java/org/apache/brooklyn/entity/system_service/SystemServiceEnricher.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/system_service/SystemServiceEnricher.java b/software/base/src/main/java/org/apache/brooklyn/entity/system_service/SystemServiceEnricher.java
index c018d3f..43beb99 100644
--- a/software/base/src/main/java/org/apache/brooklyn/entity/system_service/SystemServiceEnricher.java
+++ b/software/base/src/main/java/org/apache/brooklyn/entity/system_service/SystemServiceEnricher.java
@@ -133,9 +133,4 @@ public class SystemServiceEnricher extends AbstractEnricher implements Enricher
ExecutionContext getEntityExecutionContext() {
return getManagementContext().getExecutionContext(entity);
}
-
- protected Entity getEntity() {
- return entity;
- }
-
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/db16acb4/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java
index 9eb1575..5328ee5 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java
@@ -60,7 +60,7 @@ public class ShellEnvironmentSerializerTest extends BrooklynAppUnitTestSupport {
assertSerialize(app, appExpected);
assertSerialize(ImmutableList.of(app), "[" + appExpected + "]");
assertSerialize(ImmutableMap.of("app", app), "{\"app\":" + appExpected + "}");
- assertSerialize(mgmt, "{\"type\":\"org.apache.brooklyn.core.test.entity.LocalManagementContextForTests\"}");
+ assertSerialize(mgmt, "{\"type\":\"org.apache.brooklyn.api.mgmt.ManagementContext\"}");
// TODO Fails with java.lang.OutOfMemoryError: GC overhead limit exceeded
// https://issues.apache.org/jira/browse/BROOKLYN-304
// assertSerialize(getClass().getClassLoader(), "???");
[2/4] brooklyn-server git commit: BROOKLYN-304: avoid json err
serializing ClassLoader
Posted by sj...@apache.org.
BROOKLYN-304: avoid json err serializing ClassLoader
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/04711a5d
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/04711a5d
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/04711a5d
Branch: refs/heads/master
Commit: 04711a5d66906e496c0894769219fc35c408ed34
Parents: db16acb
Author: Aled Sage <al...@gmail.com>
Authored: Thu Nov 10 14:14:32 2016 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Nov 10 14:15:12 2016 +0000
----------------------------------------------------------------------
.../util/core/json/BidiSerialization.java | 19 +++++++++++++++++++
.../core/json/BrooklynObjectsJsonMapper.java | 1 +
.../base/ShellEnvironmentSerializerTest.java | 4 ++--
3 files changed, 22 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/04711a5d/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java b/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java
index 74a5cf4..8601904 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/json/BidiSerialization.java
@@ -273,4 +273,23 @@ public class BidiSerialization {
return mgmt.getExecutionManager().getTask((String) values.get("id"));
}
}
+
+ /**
+ * Serializes a classloader to just tell us about its type; cannot deserialize it again though!
+ *
+ * See https://issues.apache.org/jira/browse/BROOKLYN-304 - this new behaviour is better than the
+ * {@link OutOfMemoryError} we used to get.
+ */
+ public static class ClassLoaderSerialization extends AbstractWithManagementContextSerialization<ClassLoader> {
+ public ClassLoaderSerialization(ManagementContext mgmt) {
+ super(ClassLoader.class, mgmt);
+ }
+ @Override
+ public void customWriteBody(ClassLoader value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
+ }
+ @Override
+ protected ClassLoader customReadBody(String type, Map<Object, Object> values, JsonParser jp, DeserializationContext ctxt) throws IOException {
+ return null;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/04711a5d/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java b/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java
index f6c5bee..37601a5 100644
--- a/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java
+++ b/core/src/main/java/org/apache/brooklyn/util/core/json/BrooklynObjectsJsonMapper.java
@@ -40,6 +40,7 @@ public class BrooklynObjectsJsonMapper {
new BidiSerialization.EnricherSerialization(mgmt).install(mapperModule);
new BidiSerialization.FeedSerialization(mgmt).install(mapperModule);
new BidiSerialization.TaskSerialization(mgmt).install(mapperModule);
+ new BidiSerialization.ClassLoaderSerialization(mgmt).install(mapperModule);
mapper.registerModule(new GuavaModule()).registerModule(mapperModule);
return mapper;
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/04711a5d/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java
----------------------------------------------------------------------
diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java
index 5328ee5..4820b37 100644
--- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java
+++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java
@@ -61,9 +61,9 @@ public class ShellEnvironmentSerializerTest extends BrooklynAppUnitTestSupport {
assertSerialize(ImmutableList.of(app), "[" + appExpected + "]");
assertSerialize(ImmutableMap.of("app", app), "{\"app\":" + appExpected + "}");
assertSerialize(mgmt, "{\"type\":\"org.apache.brooklyn.api.mgmt.ManagementContext\"}");
- // TODO Fails with java.lang.OutOfMemoryError: GC overhead limit exceeded
// https://issues.apache.org/jira/browse/BROOKLYN-304
- // assertSerialize(getClass().getClassLoader(), "???");
+ assertSerialize(getClass().getClassLoader(), "{\"type\":\""+getClass().getClassLoader().getClass().getCanonicalName()+"\"}");
+ assertSerialize(getClass(), "class "+getClass().getName());
}
private void assertSerialize(Object actual, String expected) {
[3/4] brooklyn-server git commit: Test XML persistence of task
Posted by sj...@apache.org.
Test XML persistence of task
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/a36ecc8e
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/a36ecc8e
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/a36ecc8e
Branch: refs/heads/master
Commit: a36ecc8eb3f018444d50b7406b6b5ae06ce59b3f
Parents: 04711a5
Author: Aled Sage <al...@gmail.com>
Authored: Thu Nov 10 13:19:16 2016 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Nov 10 14:15:12 2016 +0000
----------------------------------------------------------------------
.../mgmt/persist/XmlMementoSerializerTest.java | 36 +++++++++++++++++++-
.../org/apache/brooklyn/test/LogWatcher.java | 4 +++
2 files changed, 39 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a36ecc8e/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
index fab0059..b708eb7 100644
--- a/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/persist/XmlMementoSerializerTest.java
@@ -39,6 +39,7 @@ import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.api.location.LocationSpec;
import org.apache.brooklyn.api.mgmt.ManagementContext;
+import org.apache.brooklyn.api.mgmt.Task;
import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoPersister.LookupContext;
import org.apache.brooklyn.api.objs.BrooklynObject;
import org.apache.brooklyn.api.objs.BrooklynObjectType;
@@ -56,16 +57,19 @@ import org.apache.brooklyn.core.mgmt.ha.OsgiManager;
import org.apache.brooklyn.core.mgmt.internal.ManagementContextInternal;
import org.apache.brooklyn.core.mgmt.osgi.OsgiStandaloneTest;
import org.apache.brooklyn.core.mgmt.osgi.OsgiVersionMoreEntityTest;
+import org.apache.brooklyn.core.mgmt.rebind.RebindEntityTest.ReffingEntity;
import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
import org.apache.brooklyn.core.test.entity.TestApplication;
import org.apache.brooklyn.core.test.entity.TestEntity;
import org.apache.brooklyn.entity.group.DynamicCluster;
+import org.apache.brooklyn.test.LogWatcher;
+import org.apache.brooklyn.test.LogWatcher.EventPredicates;
import org.apache.brooklyn.test.support.TestResourceUnavailableException;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
import org.apache.brooklyn.util.collections.MutableSet;
-import org.apache.brooklyn.util.core.ClassLoaderUtils;
import org.apache.brooklyn.util.core.osgi.Osgis;
+import org.apache.brooklyn.util.core.task.BasicTask;
import org.apache.brooklyn.util.javalang.Reflections;
import org.apache.brooklyn.util.net.Networking;
import org.apache.brooklyn.util.net.UserAndHostAndPort;
@@ -80,17 +84,21 @@ import org.testng.annotations.Test;
import com.google.common.base.Joiner;
import com.google.common.base.Objects;
+import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.util.concurrent.Callables;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+
public class XmlMementoSerializerTest {
private static final Logger LOG = LoggerFactory.getLogger(XmlMementoSerializerTest.class);
@@ -518,6 +526,32 @@ public class XmlMementoSerializerTest {
}
}
+ @Test
+ public void testTask() throws Exception {
+ final TestApplication app = TestApplication.Factory.newManagedInstanceForTests();
+ mgmt = app.getManagementContext();
+ Task<String> completedTask = app.getExecutionContext().submit(Callables.returning("myval"));
+ completedTask.get();
+
+ String loggerName = UnwantedStateLoggingMapper.class.getName();
+ ch.qos.logback.classic.Level logLevel = ch.qos.logback.classic.Level.WARN;
+ Predicate<ILoggingEvent> filter = EventPredicates.containsMessage("Task object serialization is not supported or recommended");
+ LogWatcher watcher = new LogWatcher(loggerName, logLevel, filter);
+
+ String serializedForm;
+ watcher.start();
+ try {
+ serializedForm = serializer.toString(completedTask);
+ watcher.assertHasEvent();
+ } finally {
+ watcher.close();
+ }
+
+ assertEquals(serializedForm.trim(), "<"+BasicTask.class.getName()+">myval</"+BasicTask.class.getName()+">");
+ Object deserialized = serializer.fromString(serializedForm);
+ assertEquals(deserialized, null, "serializedForm="+serializedForm+"; deserialized="+deserialized);
+ }
+
public static class ReffingEntity {
public Entity entity;
public Object obj;
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a36ecc8e/test-support/src/main/java/org/apache/brooklyn/test/LogWatcher.java
----------------------------------------------------------------------
diff --git a/test-support/src/main/java/org/apache/brooklyn/test/LogWatcher.java b/test-support/src/main/java/org/apache/brooklyn/test/LogWatcher.java
index 9326f1b..6baa852 100644
--- a/test-support/src/main/java/org/apache/brooklyn/test/LogWatcher.java
+++ b/test-support/src/main/java/org/apache/brooklyn/test/LogWatcher.java
@@ -130,6 +130,10 @@ public class LogWatcher implements Closeable {
}
}
+ public void assertHasEvent() {
+ assertFalse(events.isEmpty());
+ }
+
public void assertHasEventEventually() {
Asserts.succeedsEventually(new Runnable() {
public void run() {
[4/4] brooklyn-server git commit: This closes #424
Posted by sj...@apache.org.
This closes #424
BROOKLYN-383: fix json serialisation of 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/5b65fadc
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/5b65fadc
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/5b65fadc
Branch: refs/heads/master
Commit: 5b65fadc9dc2b4e8ca3e524e540872527af4fb1b
Parents: 8735a0a a36ecc8
Author: Sam Corbett <sa...@cloudsoftcorp.com>
Authored: Wed Nov 16 12:29:53 2016 +0000
Committer: Sam Corbett <sa...@cloudsoftcorp.com>
Committed: Wed Nov 16 12:29:53 2016 +0000
----------------------------------------------------------------------
.../apache/brooklyn/core/feed/AbstractFeed.java | 1 +
.../core/objs/AbstractEntityAdjunct.java | 4 +
.../util/core/json/BidiSerialization.java | 152 +++++++++++++++++--
.../core/json/BrooklynObjectsJsonMapper.java | 5 +
.../mgmt/persist/XmlMementoSerializerTest.java | 36 ++++-
.../brooklyn/core/test/entity/TestEntity.java | 5 +
.../core/test/entity/TestEntityImpl.java | 9 ++
.../rest/resources/SensorResourceTest.java | 116 +++++++++++++-
.../system_service/SystemServiceEnricher.java | 5 -
.../base/ShellEnvironmentSerializerTest.java | 6 +-
.../org/apache/brooklyn/test/LogWatcher.java | 4 +
11 files changed, 316 insertions(+), 27 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/5b65fadc/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntity.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/5b65fadc/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java
----------------------------------------------------------------------
diff --cc core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java
index a17bce3,50d14a8..33f2114
--- a/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java
+++ b/core/src/test/java/org/apache/brooklyn/core/test/entity/TestEntityImpl.java
@@@ -32,8 -32,9 +32,10 @@@ import org.apache.brooklyn.api.location
import org.apache.brooklyn.core.entity.AbstractEntity;
import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic;
+import org.apache.brooklyn.core.feed.ConfigToAttributes;
import org.apache.brooklyn.util.collections.MutableMap;
+ import org.apache.brooklyn.util.time.Duration;
+ import org.apache.brooklyn.util.time.Time;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;