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:41 UTC
[brooklyn-server] 08/09: notes on unsupported cases for scopeRoot
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 471003d76487fe92372a0f70f1336e2554185360
Author: Alex Heneveld <al...@cloudsoftcorp.com>
AuthorDate: Fri Aug 6 14:07:07 2021 +0100
notes on unsupported cases for scopeRoot
---
.../camp/brooklyn/spi/creation/CampResolver.java | 27 ++++++++++++---------
.../camp/brooklyn/spi/dsl/DslYamlTest.java | 28 ++++++++++++++++++++++
2 files changed, 44 insertions(+), 11 deletions(-)
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
index 548bc1e..ca27432 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
@@ -213,12 +213,13 @@ class CampResolver {
private static void fixScopeRoot(ManagementContext mgmt, Object value, Consumer<Object> updater) {
Function<String,String> fixString = v -> "$brooklyn:self()" + Strings.removeFromStart((String)v, "$brooklyn:scopeRoot()");
- if (value instanceof String) {
- if (((String)value).startsWith("$brooklyn:scopeRoot()")) {
- updater.accept( fixString.apply((String)value) );
- }
- return;
- }
+ // TODO better approach to replacing scopeRoot
+ // we could replace within maps and strings, and inside DSL; currently only supported at root of config or flags
+ // but that's hard, we'd need to rebuild those maps and strings, which might be inside objects;
+ // and we'd need to replace references to scopeRoot inside a DSL, eg formatString;
+ // better would be to collect the DSL items we just created, and convert those if they belong to the now-root node (possibly promoted);
+ // it is a rare edge case however, so for now we use this poor-man's logic which captures the most common case --
+ // see DslYamlTest.testDslScopeRootEdgeCases
if (value instanceof BrooklynDslDeferredSupplier) {
if (value.toString().startsWith("$brooklyn:scopeRoot()")) {
updater.accept(DslUtils.parseBrooklynDsl(mgmt, fixString.apply(value.toString())));
@@ -226,17 +227,21 @@ class CampResolver {
}
}
+ // don't think blocks below here ever get used...
+ if (value instanceof String) {
+ if (((String)value).startsWith("$brooklyn:scopeRoot()")) {
+ updater.accept( fixString.apply((String)value) );
+ }
+ return;
+ }
+
if (value instanceof DslComponent) {
- // superseded by above - no longer used?
+ // superseded by above - no longer used
if ( ((DslComponent)value).getScope() == Scope.SCOPE_ROOT ) {
updater.accept( DslComponent.newInstanceChangingScope(Scope.THIS, (DslComponent) value, fixString) );
}
return;
}
-
- // TODO replace within maps and strings; currently only supported at root of config or flags
- // or have some way to gather the scope root components created and convert them all; easy enough for outer, but harder for nested DSL items,
- // we need to update the dsl string as well as the items themselves
}
}
\ No newline at end of file
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
index 71238c9..d0128f6 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/spi/dsl/DslYamlTest.java
@@ -15,6 +15,7 @@
*/
package org.apache.brooklyn.camp.brooklyn.spi.dsl;
+import org.apache.brooklyn.core.entity.EntityAsserts;
import static org.testng.Assert.assertEquals;
import java.util.Map;
@@ -270,6 +271,33 @@ public class DslYamlTest extends AbstractYamlTest {
}
@Test
+ public void testDslScopeRootEdgeCases() throws Exception {
+ addCatalogItems(
+ "brooklyn.catalog:",
+ " version: " + TEST_VERSION,
+ " items:",
+ " - id: simple-item",
+ " itemType: entity",
+ " item:",
+ " type: "+ BasicEntity.class.getName(),
+ " brooklyn.config:",
+ " v: 1",
+ " refInDsl: $brooklyn:formatString(\"%s\", scopeRoot().config(\"v\"))",
+ " refInMap:",
+ " v: $brooklyn:scopeRoot().config(\"v\")");
+
+ final Entity app = createAndStartApplication(
+ "services:",
+ "- type: simple-item",
+ "brooklyn.config:",
+ " v: 2");
+ Entity child = Iterables.get(app.getChildren(), 0);
+ // TODO - these should both be 1, but scopeRoot for the simple-item goes to the blueprint where it is used; see notes in CampResolver.fixScopeRoot
+ Asserts.assertEquals( child.getConfig(ConfigKeys.newConfigKey(Object.class, "refInDsl")), "2" );
+ Asserts.assertEquals( child.getConfig(ConfigKeys.newConfigKey(Object.class, "refInMap")), MutableMap.of("v", 2) );
+ }
+
+ @Test
public void testDslConfig() throws Exception {
final Entity app = createAndStartApplication(
"services:",