You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2017/11/10 11:05:18 UTC

[1/4] brooklyn-server git commit: Merge branch 'enhancements' into r2

Repository: brooklyn-server
Updated Branches:
  refs/heads/master b7ad01e96 -> c68cbaffe


Merge branch 'enhancements' into r2


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

Branch: refs/heads/master
Commit: 4f607ecee1cdb00e112244375be3fdd60fb79400
Parents: 34016b6 6fa3b7a
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 9 18:52:58 2017 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 9 18:52:58 2017 +0000

----------------------------------------------------------------------
 .../brooklyn/api/mgmt/ManagementContext.java    | 13 +++--
 .../brooklyn/core/entity/EntityAsserts.java     |  4 +-
 .../internal/AbstractManagementContext.java     | 50 +++++++++++++++++++-
 .../NonDeploymentManagementContext.java         | 13 +++++
 .../brooklyn/util/core/task/BasicTask.java      |  9 ++--
 .../apache/brooklyn/util/core/task/Tasks.java   |  5 +-
 .../brooklyn/enricher/stock/EnrichersTest.java  | 11 +++++
 7 files changed, 94 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


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


[2/4] brooklyn-server git commit: mark the batch config read as transient

Posted by al...@apache.org.
mark the batch config read as transient

otherwise it wipes out other things from activity history


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

Branch: refs/heads/master
Commit: ff1ed3cd66be2168f8386da163fb287b131bf54e
Parents: 4f607ec
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 9 18:51:17 2017 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 9 18:53:14 2017 +0000

----------------------------------------------------------------------
 .../apache/brooklyn/rest/resources/EntityConfigResource.java   | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ff1ed3cd/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
index 3431b99..a3698b9 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java
@@ -29,6 +29,8 @@ import org.apache.brooklyn.core.config.BasicConfigKey;
 import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.entity.internal.EntityConfigMap;
+import org.apache.brooklyn.core.mgmt.BrooklynTags;
+import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
 import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.EntityAndItem;
 import org.apache.brooklyn.rest.api.EntityConfigApi;
@@ -88,7 +90,9 @@ public class EntityConfigResource extends AbstractBrooklynRestResource implement
         }
 
         // wrap in a task for better runtime view
-        return Entities.submit(entity, Tasks.<Map<String,Object>>builder().displayName("REST API batch config read").body(new BatchConfigRead(mgmt(), this, entity, raw)).build()).getUnchecked();
+        return Entities.submit(entity, Tasks.<Map<String,Object>>builder().displayName("REST API batch config read")
+            .tag(BrooklynTaskTags.TRANSIENT_TASK_TAG)
+            .body(new BatchConfigRead(mgmt(), this, entity, raw)).build()).getUnchecked();
     }
     
     private static class BatchConfigRead implements Callable<Map<String,Object>> {


[4/4] brooklyn-server git commit: This closes #890

Posted by al...@apache.org.
This closes #890


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

Branch: refs/heads/master
Commit: c68cbaffee6e5f8bac0441d634e1cf2a31e8ee81
Parents: b7ad01e ba1c37c
Author: Aled Sage <al...@gmail.com>
Authored: Fri Nov 10 10:59:40 2017 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Fri Nov 10 10:59:40 2017 +0000

----------------------------------------------------------------------
 .../brooklyn/rest/api/ApplicationApi.java       | 15 ++++---
 .../org/apache/brooklyn/rest/api/EntityApi.java |  6 +--
 .../brooklyn/rest/domain/EntitySummary.java     | 24 ++++++++++-
 .../rest/resources/ApplicationResource.java     | 45 +++++++++++++++-----
 .../rest/resources/EntityConfigResource.java    |  6 ++-
 .../rest/resources/ApplicationResourceTest.java | 41 +++++++++---------
 6 files changed, 97 insertions(+), 40 deletions(-)
----------------------------------------------------------------------



[3/4] brooklyn-server git commit: add to REST API ability to include specific sensors when fetching

Posted by al...@apache.org.
add to REST API ability to include specific sensors when fetching


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

Branch: refs/heads/master
Commit: ba1c37c54e980647e2a6029e84e279986c1eab04
Parents: ff1ed3c
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Thu Nov 9 18:45:42 2017 +0000
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Thu Nov 9 18:53:23 2017 +0000

----------------------------------------------------------------------
 .../brooklyn/rest/api/ApplicationApi.java       | 15 ++++---
 .../org/apache/brooklyn/rest/api/EntityApi.java |  6 +--
 .../brooklyn/rest/domain/EntitySummary.java     | 24 ++++++++++-
 .../rest/resources/ApplicationResource.java     | 45 +++++++++++++++-----
 .../rest/resources/ApplicationResourceTest.java | 41 +++++++++---------
 5 files changed, 92 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ba1c37c5/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 2e66fa4..3dab15e 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
@@ -56,16 +56,21 @@ public interface ApplicationApi {
     @GET
     @Path("/fetch")
     @ApiOperation(
-            value = "Fetch display details for all applications and optionally selected additional entities"
+            value = "Fetch details for all applications and optionally selected additional entity items, "
+                + "optionally also with the values for selected sensors"
     )
     public List<EntityDetail> fetch(
-            @ApiParam(value="Selected additional entity ID's to include, comma-separated", required=false)
+            @ApiParam(value="Any additional entity ID's to include, as JSON or comma-separated list", required=false)
             @DefaultValue("")
-            @QueryParam("items") String items);
+            @QueryParam("items") String items,
+            @ApiParam(value="Any additional sensors to include, as JSON or comma-separated list; "
+                + "current sensor values if present are returned for each entity in a name-value map under the 'sensors' key", required=false)
+            @DefaultValue("")
+            @QueryParam("sensors") String sensors);
 
     @GET
     @ApiOperation(
-            value = "Fetch list of applications, as ApplicationSummary objects",
+            value = "Fetch the list of applications managed here",
             response = org.apache.brooklyn.rest.domain.ApplicationSummary.class
     )
     public List<ApplicationSummary> list(
@@ -82,7 +87,7 @@ public interface ApplicationApi {
     @GET
     @Path("/{application}")
     @ApiOperation(
-            value = "Fetch a specific application",
+            value = "Fetch details of an application",
             response = org.apache.brooklyn.rest.domain.ApplicationSummary.class
     )
     @ApiResponses(value = {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ba1c37c5/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 d475b52..9455575 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
@@ -42,7 +42,7 @@ import java.util.Map;
 public interface EntityApi {
 
     @GET
-    @ApiOperation(value = "Fetch the list of entities for a given application",
+    @ApiOperation(value = "Fetch the list of children entities directly under the root of an application",
             response = org.apache.brooklyn.rest.domain.EntitySummary.class,
             responseContainer = "List")
     @ApiResponses(value = {
@@ -54,7 +54,7 @@ public interface EntityApi {
 
     @GET
     @Path("/{entity}")
-    @ApiOperation(value = "Fetch details about a specific application entity",
+    @ApiOperation(value = "Fetch details of an entity",
             response = org.apache.brooklyn.rest.domain.EntitySummary.class)
     @ApiResponses(value = {
             @ApiResponse(code = 404, message = "Application or entity missing")
@@ -67,7 +67,7 @@ public interface EntityApi {
 
     // TODO rename as "/children" ?
     @GET
-    @ApiOperation(value = "Fetch details about a specific application entity's children",
+    @ApiOperation(value = "Fetch the list of children of an entity",
             response = org.apache.brooklyn.rest.domain.EntitySummary.class)
     @Path("/{entity}/children")
     public List<EntitySummary> getChildren(

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ba1c37c5/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySummary.java
index ae123ef..ae8585c 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/EntitySummary.java
@@ -23,6 +23,12 @@ import java.net.URI;
 import java.util.Map;
 import java.util.Objects;
 
+import org.apache.brooklyn.util.collections.MutableMap;
+import org.apache.brooklyn.util.javalang.JavaClassNames;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.annotation.JsonProperty;
@@ -39,6 +45,11 @@ public class EntitySummary implements HasId, HasName, Serializable {
     private final String catalogItemId;
     private final Map<String, URI> links;
 
+    // not exported directly, but used to provide other top-level json fields
+    // for specific types
+    @JsonIgnore
+    private final Map<String,Object> others = MutableMap.of();
+
     public EntitySummary(
             @JsonProperty("id") String id,
             @JsonProperty("name") String name,
@@ -74,6 +85,16 @@ public class EntitySummary implements HasId, HasName, Serializable {
         return links;
     }
 
+    /** Mutable map of other top-level metadata included on this DTO (eg listing config keys or effectors) */ 
+    @JsonAnyGetter 
+    public Map<String,Object> getExtraFields() {
+        return others;
+    }
+    @JsonAnySetter
+    public void setExtraField(String name, Object value) {
+        others.put(name, value);
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -93,11 +114,12 @@ public class EntitySummary implements HasId, HasName, Serializable {
 
     @Override
     public String toString() {
-        return "EntitySummary{" +
+        return JavaClassNames.simpleClassName(this)+"{" +
                 "id='" + id + '\'' +
                 ", name='" + name + '\'' +
                 ", type='" + type + '\'' +
                 ", catalogItemId='" + catalogItemId + '\'' +
+                (!getExtraFields().isEmpty() ? ", others='"+getExtraFields()+"'" : "")+
                 ", links=" + links +
                 '}';
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ba1c37c5/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
index e7176b9..c9973ce 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java
@@ -32,6 +32,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
 
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
@@ -84,6 +85,7 @@ import org.apache.brooklyn.util.guava.Maybe;
 import org.apache.brooklyn.util.javalang.JavaClassNames;
 import org.apache.brooklyn.util.net.Urls;
 import org.apache.brooklyn.util.repeat.Repeater;
+import org.apache.brooklyn.util.text.StringEscapes.JavaStringEscapes;
 import org.apache.brooklyn.util.text.Strings;
 import org.apache.brooklyn.util.time.Duration;
 import org.slf4j.Logger;
@@ -177,25 +179,22 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
     }
 
     @Override
-    public List<EntityDetail> fetch(String entityIds) {
+    public List<EntityDetail> fetch(String entityIds, String extraSensorsS) {
+        List<String> extraSensorNames = JavaStringEscapes.unwrapOptionallyQuotedJavaStringList(extraSensorsS);
+        List<AttributeSensor<?>> extraSensors = extraSensorNames.stream().map((s) -> Sensors.newSensor(Object.class, s)).collect(Collectors.toList());
 
         List<EntityDetail> entitySummaries = Lists.newArrayList();
         for (Entity application : mgmt().getApplications()) {
-            entitySummaries.add(fromEntity(application));
+            entitySummaries.add(addSensors(fromEntity(application), application, extraSensors));
         }
 
-        if (entityIds != null) {
-            entityIds = entityIds.trim();
-            if ((entityIds.startsWith("{") && entityIds.endsWith("}")) ||
-                    (entityIds.startsWith("[") && entityIds.endsWith("]"))) {
-                // trim [] or {} in case caller supplied glob or json syntax
-                entityIds = entityIds.substring(1, entityIds.length()-1);
-            }
-            for (String entityId: entityIds.split(",")) {
+        if (Strings.isNonBlank(entityIds)) {
+            List<String> extraEntities = JavaStringEscapes.unwrapOptionallyQuotedJavaStringList(entityIds);
+            for (String entityId: extraEntities) {
                 Entity entity = mgmt().getEntityManager().getEntity(entityId.trim());
                 while (entity != null && entity.getParent() != null) {
                     if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) {
-                        entitySummaries.add(fromEntity(entity));
+                        entitySummaries.add(addSensors(fromEntity(entity), entity, extraSensors));
                     }
                     entity = entity.getParent();
                 }
@@ -204,6 +203,30 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements
         return entitySummaries;
     }
 
+    private EntityDetail addSensors(EntityDetail result, Entity entity, List<AttributeSensor<?>> extraSensors) {
+        if (extraSensors!=null && !extraSensors.isEmpty()) {
+            Object sensorsO = result.getExtraFields().get("sensors");
+            if (sensorsO==null) {
+                sensorsO = MutableMap.of();
+                result.setExtraField("sensors", sensorsO);
+            }
+            if (!(sensorsO instanceof Map)) {
+                throw new IllegalStateException("sensors field in result for "+entity+" should be a Map; found: "+sensorsO);
+            }
+            @SuppressWarnings("unchecked")
+            Map<String,Object> sensors = (Map<String, Object>) sensorsO;
+            
+            for (AttributeSensor<?> s: extraSensors) {
+                Object sv = entity.sensors().get(s);
+                if (sv!=null) {
+                    sv = resolving(sv).preferJson(true).asJerseyOutermostReturnValue(false).raw(true).context(entity).immediately(true).timeout(Duration.ZERO).resolve();
+                    sensors.put(s.getName(), sv);
+                }
+            }
+        }
+        return result;
+    }
+
     @Override
     public List<ApplicationSummary> list(String typeRegex) {
         if (Strings.isBlank(typeRegex)) {

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/ba1c37c5/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 03607bb..b3b5260 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
@@ -49,6 +49,7 @@ import org.apache.brooklyn.core.entity.Entities;
 import org.apache.brooklyn.core.entity.EntityFunctions;
 import org.apache.brooklyn.core.entity.EntityPredicates;
 import org.apache.brooklyn.core.entity.lifecycle.Lifecycle;
+import org.apache.brooklyn.core.entity.lifecycle.Lifecycle.Transition;
 import org.apache.brooklyn.core.location.AbstractLocation;
 import org.apache.brooklyn.core.location.LocationConfigKeys;
 import org.apache.brooklyn.core.location.geo.HostGeoInfo;
@@ -76,6 +77,7 @@ import org.apache.brooklyn.rest.testing.mocks.RestMockApp;
 import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity;
 import org.apache.brooklyn.test.Asserts;
 import org.apache.brooklyn.util.collections.CollectionFunctionals;
+import org.apache.brooklyn.util.collections.MutableMap;
 import org.apache.brooklyn.util.exceptions.Exceptions;
 import org.apache.brooklyn.util.http.HttpAsserts;
 import org.apache.brooklyn.util.stream.Streams;
@@ -91,6 +93,7 @@ import org.testng.annotations.Test;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableMap;
@@ -332,22 +335,8 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
         }
     }
 
-    /**
-     * TODO BROOKLYN-272, Disabled, because fails non-deterministically in jenkins (windows),
-     *      as commented by Svet in https://github.com/apache/brooklyn-library/pull/39.
-     * testFetchApplicationsAndEntity(org.apache.brooklyn.rest.resources.ApplicationResourceTest)  Time elapsed: 0.073 sec  <<< FAILURE!
-     * java.lang.AssertionError: expected [4] but found [3]
-     *     at org.testng.Assert.fail(Assert.java:94)
-     *     at org.testng.Assert.failNotEquals(Assert.java:494)
-     *     at org.testng.Assert.assertEquals(Assert.java:123)
-     *     at org.testng.Assert.assertEquals(Assert.java:370)
-     *     at org.testng.Assert.assertEquals(Assert.java:380)
-     *     at org.apache.brooklyn.rest.resources.ApplicationResourceTest.testFetchApplicationsAndEntity(ApplicationResourceTest.java:387)
-     * 
-     * When re-enabling, be sure to add it back to dependsOnMethods in testDeleteApplication.
-     */
     @SuppressWarnings({ "rawtypes", "unchecked" })
-    @Test(dependsOnMethods = "testDeployApplication", groups={"Broken"})
+    @Test(dependsOnMethods = "testDeployApplication")
     public void testFetchApplicationsAndEntity() {
         Collection apps = client().path("/applications/fetch").get(Collection.class);
         log.info("Applications fetched are: " + apps);
@@ -378,11 +367,17 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
         Assert.assertNotNull(groupSummary);
 
         String itemIds = app.get("id") + "," + entitySummary.get("id") + "," + groupSummary.get("id");
-        Collection entities = client().path("/applications/fetch").query("items", itemIds)
+        Collection entities = client().path("/applications/fetch")
+                .query("items", itemIds)
+                .query("sensors", "[ service.state.expected, \"host.address\" ]")
                 .get(Collection.class);
         log.info("Applications+Entities fetched are: " + entities);
 
-        Assert.assertEquals(entities.size(), apps.size() + 2);
+        // on jenkins/windows a while ago (early 2016) this would sometimes fail with expected 4 but found 3,
+        // as per BROOKLYN-272 and PR 156; re-enabling now (2017-11) to test sensor query param; 
+        // and using assertSize to see which entity/app is missing if it does still fail
+        // (it should definitely be 4, as we got 2 before, and we've asked for 2 more entities)
+        Asserts.assertSize(entities, apps.size() + 2);
         Map entityDetails = (Map) Iterables.find(entities, withValueForKey("name", "simple-ent"), null);
         Map groupDetails = (Map) Iterables.find(entities, withValueForKey("name", "simple-group"), null);
         Assert.assertNotNull(entityDetails);
@@ -410,6 +405,15 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
         Map entityMemberDetails = (Map) Iterables.find(groupMembers, withValueForKey("name", "simple-ent"), null);
         Assert.assertNotNull(entityMemberDetails);
         Assert.assertEquals(entityMemberDetails.get("id"), entityDetails.get("id"));
+        
+        Map<String,Object> simpleEntSensors = Preconditions.checkNotNull(Map.class.cast(entityDetails.get("sensors")), "sensors");
+        org.apache.brooklyn.api.entity.Entity simpleEnt = Preconditions.checkNotNull(getManagementContext().<org.apache.brooklyn.api.entity.Entity>lookup(
+            EntityPredicates.displayNameEqualTo("simple-ent")));
+        Assert.assertEquals(simpleEntSensors.get("host.address"), simpleEnt.sensors().get(Attributes.ADDRESS));
+        Transition expected = simpleEnt.sensors().get(Attributes.SERVICE_STATE_EXPECTED);
+        Assert.assertEquals(simpleEntSensors.get("service.state.expected"), 
+            MutableMap.of("state", expected.getState().name(),
+                "timestampUtc", expected.getTimestamp().getTime()));
     }
 
     @Test(dependsOnMethods = "testDeployApplication")
@@ -581,8 +585,7 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest {
     }
 
     
-    // TODO BROOKLYN-272: testFetchApplicationsAndEntity is temporarily disabled; therefore removed from dependsOnMethod list
-    @Test(dependsOnMethods = {"testListEffectors", /*"testFetchApplicationsAndEntity",*/ "testTriggerSampleEffector", "testListApplications","testReadEachSensor","testPolicyWhichCapitalizes","testLocatedLocation"})
+    @Test(dependsOnMethods = {"testListEffectors", "testFetchApplicationsAndEntity", "testTriggerSampleEffector", "testListApplications","testReadEachSensor","testPolicyWhichCapitalizes","testLocatedLocation"})
     public void testDeleteApplication() throws TimeoutException, InterruptedException {
         waitForPageFoundResponse("/applications/simple-app", ApplicationSummary.class);
         Collection<Application> apps = getManagementContext().getApplications();