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 2021/05/03 08:29:26 UTC
[brooklyn-server] 03/04: Test to verify custom relationship via
fetch request
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 <my...@cloudsoftcorp.com>
AuthorDate: Mon Apr 26 18:04:51 2021 +0100
Test to verify custom relationship via fetch request
Signed-off-by: Mykola Mandra <my...@cloudsoftcorp.com>
---
.../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));
+ }
+ };
+ }
}