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/08/06 13:27:36 UTC
[brooklyn-server] 03/09: fix scope root evaluation,
passes previous test
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 16c28fc0a11ec0b5bc56588f16604c3f35b4f56a
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Aug 6 12:22:19 2021 +0100
fix scope root evaluation, passes previous test
changes semantics however for when used on the root node;
test is more flexible in this case
---
.../brooklyn/camp/brooklyn/EntitiesYamlTest.java | 26 +++++++++++++++++-----
.../camp/brooklyn/ReferencingYamlTestEntity.java | 6 +++++
.../org/apache/brooklyn/core/entity/Entities.java | 11 +++++++++
3 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EntitiesYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EntitiesYamlTest.java
index 44cdfe0..4ee8a4c 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EntitiesYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/EntitiesYamlTest.java
@@ -557,7 +557,8 @@ public class EntitiesYamlTest extends AbstractYamlTest {
" test.reference.scope_root: $brooklyn:scopeRoot()",
" brooklyn.children:",
" - type: ref_child",
- " name: RP-grandchild=RC");
+ " name: RP-grandchild=RC",
+ " test.reference.scope_root2: $brooklyn:scopeRoot()");
Entity app = createAndStartApplication(
"brooklyn.config:",
@@ -576,7 +577,8 @@ public class EntitiesYamlTest extends AbstractYamlTest {
" test.reference.scope_root: $brooklyn:scopeRoot()",
" brooklyn.children:",
" - type: ref_parent",
- " name: APP-greatgrandchild=RP");
+ " name: APP-greatgrandchild=RP",
+ " test.reference.scope_root2: $brooklyn:scopeRoot()");
assertScopes(app, "APP", app, app);
Entity e1 = nextChild(app);
@@ -584,20 +586,21 @@ public class EntitiesYamlTest extends AbstractYamlTest {
Entity e2 = nextChild(e1);
assertScopes(e2, "APP-grandchild", app, app);
Entity e3 = nextChild(e2);
- assertScopes(e3, "APP-greatgrandchild=RP", app, e3);
+ assertScopes(e3, "APP-greatgrandchild=RP", app, e2, app);
Entity e4 = nextChild(e3);
assertScopes(e4, "RP-child", app, e3);
Entity e5 = nextChild(e4);
- assertScopes(e5, "RP-grandchild=RC", app, e5);
+ assertScopes(e5, "RP-grandchild=RC", app, e5, e3);
Entity e6 = nextChild(e5);
assertScopes(e6, "RC-child", app, e5);
}
+
@Test
public void testScopeReferences() throws Exception {
doTestScopeReferences(ReferencingYamlTestEntity.class.getName());
}
- @Test(groups="WIP")
+ @Test
public void testScopeReferencesComplex() throws Exception {
addCatalogItems(
"brooklyn.catalog:",
@@ -614,9 +617,20 @@ public class EntitiesYamlTest extends AbstractYamlTest {
return Iterables.getOnlyElement(entity.getChildren());
}
private static void assertScopes(Entity entity, String name, Entity root, Entity scopeRoot) {
+ assertScopes(entity, name, root, scopeRoot, null);
+ }
+ private static void assertScopes(Entity entity, String name, Entity root, Entity scopeRoot, Entity scopeRoot2) {
if (name!=null) assertEquals(entity.getDisplayName(), name);
assertEquals(entity.config().get(ReferencingYamlTestEntity.TEST_REFERENCE_ROOT), root);
- assertEquals(entity.config().get(ReferencingYamlTestEntity.TEST_REFERENCE_SCOPE_ROOT), scopeRoot);
+
+ Entity actualScopeRoot = entity.config().get(ReferencingYamlTestEntity.TEST_REFERENCE_SCOPE_ROOT);
+ if (!actualScopeRoot.equals(scopeRoot) && !actualScopeRoot.equals(scopeRoot2)) {
+ Assert.fail("Wrong scope root; should be either "+scopeRoot+" or "+scopeRoot2+"; but is actually "+actualScopeRoot);
+ }
+ // TODO would be nice if we can capture which blueprint scopeRoot is used in - but this requires introspecting the DSL
+ // currently it will always equal scopeRoot2; if we could convert it to "self()" when the definition is loaded, that would solve it
+
+ assertEquals(entity.config().get(ReferencingYamlTestEntity.TEST_REFERENCE_SCOPE_ROOT2), scopeRoot2);
}
private void checkReferences(final Entity entity, Map<ConfigKey<Entity>, Entity> keyToEntity) throws Exception {
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencingYamlTestEntity.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencingYamlTestEntity.java
index 7a8ac59..bc13ecf 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencingYamlTestEntity.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ReferencingYamlTestEntity.java
@@ -20,7 +20,9 @@ package org.apache.brooklyn.camp.brooklyn;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.entity.ImplementedBy;
+import org.apache.brooklyn.config.ConfigInheritance;
import org.apache.brooklyn.config.ConfigKey;
+import org.apache.brooklyn.core.config.BasicConfigInheritance;
import org.apache.brooklyn.core.config.BasicConfigKey;
import com.google.common.reflect.TypeToken;
@@ -35,6 +37,10 @@ public interface ReferencingYamlTestEntity extends Entity {
public static final ConfigKey<Entity> TEST_REFERENCE_SCOPE_ROOT = BasicConfigKey.builder(new TypeToken<Entity>(){})
.name("test.reference.scope_root")
.build();
+ public static final ConfigKey<Entity> TEST_REFERENCE_SCOPE_ROOT2 = BasicConfigKey.builder(new TypeToken<Entity>(){})
+ .name("test.reference.scope_root2")
+ .runtimeInheritance(BasicConfigInheritance.NEVER_INHERITED)
+ .build();
@SuppressWarnings("serial")
public static final ConfigKey<Entity> TEST_REFERENCE_APP = BasicConfigKey.builder(new TypeToken<Entity>(){})
.name("test.reference.app")
diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
index f794793..cd28df8 100644
--- a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
+++ b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java
@@ -18,6 +18,7 @@
*/
package org.apache.brooklyn.core.entity;
+import org.apache.brooklyn.core.mgmt.BrooklynTags;
import static org.apache.brooklyn.util.guava.Functionals.isSatisfied;
import java.io.Closeable;
@@ -1149,6 +1150,16 @@ public class Entities {
public static Entity catalogItemScopeRoot(Entity entity) {
Entity root = entity;
+
+ Integer depth = BrooklynTags.getDepthInAncestorTag(root.tags().getTags());
+ if (depth!=null && depth>0) {
+ while (depth>0) {
+ root = root.getParent();
+ depth--;
+ }
+ return root;
+ }
+
while (root.getParent() != null &&
root != root.getParent() &&
Objects.equal(root.getParent().getCatalogItemId(), root.getCatalogItemId())) {