This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit e926d639633d50128287eda6b84804919a78d589 Author: Mykola Mandra <[email protected]> AuthorDate: Mon Apr 26 18:04:51 2021 +0100 Test to verify custom relationship via fetch request Signed-off-by: Mykola Mandra <[email protected]> --- .../rest/resources/ApplicationResource.java | 5 +- .../brooklyn/rest/resources/EntityResource.java | 25 ++------ .../brooklyn/rest/util/EntityRelationUtils.java | 49 ++++++++++++++++ .../rest/resources/ApplicationResourceTest.java | 11 ---- .../resources/EntityRelationsResourceTest.java | 66 +++++++++++++++++++--- .../rest/testing/BrooklynRestResourceTest.java | 11 ++++ 6 files changed, 127 insertions(+), 40 deletions(-) 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 e9803182..fd6887e 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 @@ -80,6 +80,7 @@ import org.apache.brooklyn.rest.transform.ApplicationTransformer; import org.apache.brooklyn.rest.transform.EntityTransformer; import org.apache.brooklyn.rest.transform.TaskTransformer; import org.apache.brooklyn.rest.util.BrooklynRestResourceUtils; +import org.apache.brooklyn.rest.util.EntityRelationUtils; import org.apache.brooklyn.rest.util.WebResourceUtils; import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.collections.MutableMap; @@ -185,7 +186,9 @@ public class ApplicationResource extends AbstractBrooklynRestResource implements result.setExtraField("creationTimeUtc", entity.getCreationTime()); addSensorsByGlobs(result, entity, extraSensorGlobs); addConfigByGlobs(result, entity, extraConfigGlobs); - + + result.setExtraField("relations", EntityRelationUtils.getRelations(entity)); + return result; } 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 8809007..fdd5ea7 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,10 +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.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -40,8 +37,6 @@ import com.google.common.collect.*; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.location.Location; import org.apache.brooklyn.api.mgmt.Task; -import org.apache.brooklyn.api.objs.BrooklynObject; -import org.apache.brooklyn.api.relations.RelationshipType; import org.apache.brooklyn.core.mgmt.BrooklynTags; import org.apache.brooklyn.core.mgmt.BrooklynTags.NamedStringTag; import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; @@ -57,6 +52,7 @@ import org.apache.brooklyn.rest.transform.EntityTransformer; import org.apache.brooklyn.rest.transform.LocationTransformer; import org.apache.brooklyn.rest.transform.LocationTransformer.LocationDetailLevel; import org.apache.brooklyn.rest.transform.TaskTransformer; +import org.apache.brooklyn.rest.util.EntityRelationUtils; import org.apache.brooklyn.rest.util.WebResourceUtils; import org.apache.brooklyn.util.collections.MutableList; import org.apache.brooklyn.util.core.ResourceUtils; @@ -107,24 +103,11 @@ public class EntityResource extends AbstractBrooklynRestResource implements Enti @Override public List<RelationSummary> getRelations(final String applicationId, final String entityId) { - List<RelationSummary> entityRelations = Lists.newLinkedList(); - Entity entity = brooklyn().getEntity(applicationId, entityId); if (entity != null) { - for (RelationshipType<?,? extends BrooklynObject> relationship: entity.relations().getRelationshipTypes()) { - @SuppressWarnings({ "unchecked", "rawtypes" }) - Set relations = entity.relations().getRelations((RelationshipType) relationship); - Set<String> relationIds = Sets.newLinkedHashSet(); - for (Object r: relations) { - relationIds.add(((BrooklynObject) r).getId()); - } - RelationType relationType = new RelationType(relationship.getRelationshipTypeName(), relationship.getTargetName(), relationship.getSourceName()); - RelationSummary relationSummary = new RelationSummary(relationType, relationIds); - entityRelations.add(relationSummary); - } + return EntityRelationUtils.getRelations(entity); } - - return entityRelations; + return Collections.emptyList(); } @Override diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/EntityRelationUtils.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/EntityRelationUtils.java new file mode 100644 index 0000000..d9c1e7e --- /dev/null +++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/util/EntityRelationUtils.java @@ -0,0 +1,49 @@ +/* + * 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.util; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import org.apache.brooklyn.api.entity.Entity; +import org.apache.brooklyn.api.objs.BrooklynObject; +import org.apache.brooklyn.api.relations.RelationshipType; +import org.apache.brooklyn.rest.domain.RelationSummary; +import org.apache.brooklyn.rest.domain.RelationType; + +import java.util.List; +import java.util.Set; + +public class EntityRelationUtils { + + public static List<RelationSummary> getRelations(final Entity entity) { + List<RelationSummary> entityRelations = Lists.newArrayList(); + for (RelationshipType<?,? extends BrooklynObject> relationship: entity.relations().getRelationshipTypes()) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + Set relations = entity.relations().getRelations((RelationshipType) relationship); + Set<String> relationIds = Sets.newLinkedHashSet(); + for (Object r: relations) { + relationIds.add(((BrooklynObject) r).getId()); + } + RelationType relationType = new RelationType(relationship.getRelationshipTypeName(), relationship.getTargetName(), relationship.getSourceName()); + RelationSummary relationSummary = new RelationSummary(relationType, relationIds); + entityRelations.add(relationSummary); + } + return entityRelations; + } +} 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 bd85306..311abea 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 @@ -153,17 +153,6 @@ public class ApplicationResourceTest extends BrooklynRestResourceTest { }; } - // Convenience for finding a Map within a collection, based on the value of one of its keys - private static Predicate<? super Map<?,?>> withValueForKey(final Object key, final Object value) { - return new Predicate<Object>() { - @Override - public boolean apply(Object input) { - if (!(input instanceof Map)) return false; - return value.equals(((Map<?, ?>) input).get(key)); - } - }; - } - @Test public void testGetUndefinedApplication() { try { diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityRelationsResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityRelationsResourceTest.java index 3d271a4..71e39d7 100644 --- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityRelationsResourceTest.java +++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/resources/EntityRelationsResourceTest.java @@ -20,6 +20,7 @@ package org.apache.brooklyn.rest.resources; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.core.entity.EntityRelations; import org.apache.brooklyn.rest.domain.ApplicationSpec; @@ -28,6 +29,8 @@ import org.apache.brooklyn.rest.domain.RelationSummary; import org.apache.brooklyn.rest.testing.BrooklynRestResourceTest; import org.apache.brooklyn.rest.testing.mocks.NameMatcherGroup; import org.apache.brooklyn.rest.testing.mocks.RestMockSimpleEntity; +import org.apache.brooklyn.test.Asserts; +import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -36,6 +39,7 @@ import javax.ws.rs.core.Response; import java.net.URI; import java.util.Collection; import java.util.List; +import java.util.Map; import static org.testng.Assert.*; @@ -63,9 +67,9 @@ public class EntityRelationsResourceTest extends BrooklynRestResourceTest { } @Test - public void testCustomRelations() { + public void testCustomRelationship() { - // Expect no initial relations. + // Expect no initial relationship. List<RelationSummary> simpleEntRelations = client().path( URI.create("/applications/simple-app/entities/simple-ent/relations")) .get(new GenericType<List<RelationSummary>>() {}); @@ -75,15 +79,15 @@ public class EntityRelationsResourceTest extends BrooklynRestResourceTest { assertTrue(simpleEntRelations.isEmpty()); assertTrue(simpleGroupRelations.isEmpty()); - // Add custom relation between 'simple-ent' and 'simple-group'. + // Add custom relationship between 'simple-ent' and 'simple-group'. Collection<Entity> entities = manager.getEntityManager().getEntities(); Entity simpleEnt = entities.stream().filter(e -> "simple-ent".equals(e.getDisplayName())).findFirst().orElse(null); Entity simpleGroup = entities.stream().filter(e -> "simple-group".equals(e.getDisplayName())).findFirst().orElse(null); - assertNotNull(simpleEnt, "'simple-ent' was not found"); - assertNotNull(simpleGroup, "'simple-group' was not found"); + assertNotNull(simpleEnt, "Did not find 'simple-ent'"); + assertNotNull(simpleGroup, "Did not find 'simple-group'"); simpleGroup.relations().add(EntityRelations.HAS_TARGET, simpleEnt); - // Verify simple-ent relations. + // Verify simple-ent relationship. simpleEntRelations = client().path( URI.create("/applications/simple-app/entities/simple-ent/relations")) .get(new GenericType<List<RelationSummary>>() {}); @@ -95,7 +99,7 @@ public class EntityRelationsResourceTest extends BrooklynRestResourceTest { assertEquals(simpleEntRelationSummary.getTargets().size(), 1, "'simple-ent' must have 1 target only"); assertTrue(simpleEntRelationSummary.getTargets().contains(simpleGroup.getId()), "'simple-ent' must target id of 'simple-group'"); - // Verify simple-group relations. + // Verify simple-group relationship. simpleGroupRelations = client().path( URI.create("/applications/simple-app/entities/simple-group/relations")) .get(new GenericType<List<RelationSummary>>() {}); @@ -107,4 +111,52 @@ public class EntityRelationsResourceTest extends BrooklynRestResourceTest { assertEquals(simpleGroupRelationSummary.getTargets().size(), 1, "'simple-group' must have 1 target only"); assertTrue(simpleGroupRelationSummary.getTargets().contains(simpleEnt.getId()), "'simple-group' must target id of 'simple-ent'"); } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Test + public void testCustomRelationshipInFetch() { + + // Add custom relationship between 'simple-ent' and 'simple-group'. + Collection<Entity> entities = manager.getEntityManager().getEntities(); + Entity simpleEnt = entities.stream().filter(e -> "simple-ent".equals(e.getDisplayName())).findFirst().orElse(null); + Entity simpleGroup = entities.stream().filter(e -> "simple-group".equals(e.getDisplayName())).findFirst().orElse(null); + assertNotNull(simpleEnt, "Did not find 'simple-ent'"); + assertNotNull(simpleGroup, "Did not find 'simple-group'"); + simpleGroup.relations().add(EntityRelations.HAS_TARGET, simpleEnt); + + // Get relationship via 'fetch' request. + Collection apps = client().path("/applications/fetch").get(Collection.class); + Map app = ((Collection<Map>)apps).stream().filter(m -> "simple-app".equals(m.get("name"))).findFirst().orElse(null); + Assert.assertNotNull(app, "Did not find 'simple-app'"); + Collection children = (Collection) app.get("children"); + Asserts.assertSize(children, 2); + Map entitySummary = (Map) Iterables.find(children, withValueForKey("name", "simple-ent"), null); + Map groupSummary = (Map) Iterables.find(children, withValueForKey("name", "simple-group"), null); + Assert.assertNotNull(entitySummary, "Did not find 'simple-ent'"); + Assert.assertNotNull(groupSummary,"Did not find 'simple-group'"); + Collection simpleEntRelations = (Collection) entitySummary.get("relations"); + Collection simpleGroupRelations = (Collection) groupSummary.get("relations"); + + // Verify simple-ent relationship. + assertEquals(simpleEntRelations.size(), 1, "'simple-ent' must have 1 relation only"); + Map simpleEntRelationSummary = (Map) simpleEntRelations.toArray()[0]; + Map simpleEntRelationSummaryType = (Map) simpleEntRelationSummary.get("type"); + assertEquals(simpleEntRelationSummaryType.get("name"), "targetted_by"); + assertEquals(simpleEntRelationSummaryType.get("target"), "targetter"); + assertEquals(simpleEntRelationSummaryType.get("source"), "target"); + Collection simpleEntRelationSummaryTargets = (Collection) simpleEntRelationSummary.get("targets"); + assertEquals(simpleEntRelationSummaryTargets.size(), 1, "'simple-ent' must have 1 target only"); + assertTrue(simpleEntRelationSummaryTargets.contains(simpleGroup.getId()), "'simple-ent' must target id of 'simple-group'"); + + // Verify simple-group relationship. + assertEquals(simpleGroupRelations.size(), 1, "'simple-group' must have 1 relation only"); + Map simpleGroupRelationSummary = (Map) simpleGroupRelations.toArray()[0]; + Map simpleGroupRelationSummaryType = (Map) simpleGroupRelationSummary.get("type"); + assertEquals(simpleGroupRelationSummaryType.get("name"), "has_target"); + assertEquals(simpleGroupRelationSummaryType.get("target"), "target"); + assertEquals(simpleGroupRelationSummaryType.get("source"), "targetter"); + Collection simpleGroupRelationSummaryTargets = (Collection) simpleEntRelationSummary.get("targets"); + assertEquals(simpleGroupRelationSummaryTargets.size(), 1, "'simple-ent' must have 1 target only"); + assertTrue(simpleGroupRelationSummaryTargets.contains(simpleGroup.getId()), "'simple-ent' must target id of 'simple-group'"); + } } diff --git a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestResourceTest.java b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestResourceTest.java index a1c1067..576a535 100644 --- a/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestResourceTest.java +++ b/rest/rest-resources/src/test/java/org/apache/brooklyn/rest/testing/BrooklynRestResourceTest.java @@ -34,6 +34,7 @@ import javax.ws.rs.client.Entity; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import com.google.common.base.Predicate; import org.apache.brooklyn.api.entity.Application; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.rest.domain.ApplicationSpec; @@ -234,4 +235,14 @@ public abstract class BrooklynRestResourceTest extends BrooklynRestApiTest { return WebClient.create(getEndpointAddress(), clientProviders); } + // Convenience for finding a Map within a collection, based on the value of one of its keys + protected static Predicate<? super Map<?,?>> withValueForKey(final Object key, final Object value) { + return new Predicate<Object>() { + @Override + public boolean apply(Object input) { + if (!(input instanceof Map)) return false; + return value.equals(((Map<?, ?>) input).get(key)); + } + }; + } }
