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 74f61cf98fe5d892d3542a33b95e6cee09ca26bd Author: iuliana <[email protected]> AuthorDate: Fri May 21 16:32:18 2021 +0100 Added decorateWithHierarchySpecTag(..) method to be used to create spec tags when deployign blueprints --- .../api/internal/AbstractBrooklynObjectSpec.java | 5 ++ .../spi/creation/CampTypePlanTransformer.java | 4 +- .../brooklyn/catalog/CatalogYamlEntityTest.java | 6 ++ .../apache/brooklyn/core/mgmt/BrooklynTags.java | 86 ++++++++++++++++++++++ .../core/typereg/AbstractTypePlanTransformer.java | 18 +++++ .../typereg/JavaClassNameTypePlanTransformer.java | 2 +- .../internal/StaticTypePlanTransformer.java | 6 +- .../typereg/ExampleXmlTypePlanTransformer.java | 8 +- 8 files changed, 126 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java b/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java index f6ee41a..8cd4e60 100644 --- a/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java +++ b/api/src/main/java/org/apache/brooklyn/api/internal/AbstractBrooklynObjectSpec.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.google.common.base.Predicate; import org.apache.brooklyn.api.mgmt.EntityManager; import org.apache.brooklyn.api.mgmt.Task; import org.apache.brooklyn.api.objs.BrooklynObject; @@ -296,6 +297,10 @@ public abstract class AbstractBrooklynObjectSpec<T, SpecT extends AbstractBrookl return ImmutableSet.copyOf(tags); } + public final Object getTag(Predicate<Object> predicate) { + return tags.stream().filter(predicate::apply).findAny().orElse(null); + } + /** * A list of configuration options that the entity supports. */ diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java index 9170083..8dc8508 100644 --- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java +++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampTypePlanTransformer.java @@ -20,6 +20,7 @@ package org.apache.brooklyn.camp.brooklyn.spi.creation; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.BiFunction; import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec; @@ -27,6 +28,7 @@ import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry.RegisteredTypeKind; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.api.typereg.RegisteredType.TypeImplementationPlan; import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext; +import org.apache.brooklyn.core.mgmt.BrooklynTags; import org.apache.brooklyn.core.typereg.*; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.guava.Maybe; @@ -104,7 +106,7 @@ public class CampTypePlanTransformer extends AbstractTypePlanTransformer { @Override protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception { try { - return new CampResolver(mgmt, type, context).createSpec(); + return decorateWithHierarchySpecTag(new CampResolver(mgmt, type, context).createSpec(), type, FORMAT); } catch (Exception e) { Exceptions.propagateIfFatal(e); String message = null; diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java index 7340640..57e18ad 100644 --- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java +++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java @@ -22,7 +22,10 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.Throwables; import java.util.Collection; import java.util.Set; + +import org.apache.brooklyn.api.objs.BrooklynObject; import org.apache.brooklyn.core.entity.Dumper; +import org.apache.brooklyn.core.mgmt.BrooklynTags; import org.apache.brooklyn.util.collections.MutableSet; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; @@ -261,6 +264,9 @@ public class CatalogYamlEntityTest extends AbstractYamlTest { Entity entity = Iterables.getOnlyElement(app.getChildren()); assertEquals(entity.getEntityType().getName(), TestEntity.class.getName()); + // tests that the plan tag was set + assertTrue(entity.tags().getTags().stream().anyMatch(tag -> tag instanceof BrooklynTags.SpecTag)); + deleteCatalogRegisteredType(referencedSymbolicName); deleteCatalogRegisteredType(referrerSymbolicName); } diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java index e0cc2d6..ff165e1 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/BrooklynTags.java @@ -21,7 +21,9 @@ package org.apache.brooklyn.core.mgmt; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import com.google.common.base.MoreObjects; import org.apache.brooklyn.util.collections.MutableList; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -30,12 +32,14 @@ import com.google.common.annotations.Beta; import com.google.common.base.Function; import com.google.common.base.Objects; import com.google.common.collect.Lists; +import org.apache.brooklyn.util.collections.MutableMap; /** @since 0.7.0 some strongly typed tags for reference; note these may migrate elsewhere! */ @Beta public class BrooklynTags { public static final String YAML_SPEC_KIND = "yaml_spec"; + public static final String YAML_SPEC_HIERARCHY = "yaml_spec_hierarchy"; public static final String NOTES_KIND = "notes"; public static final String OWNER_ENTITY_ID = "owner_entity_id"; public static final String ICON_URL = "icon_url"; @@ -80,6 +84,88 @@ public class BrooklynTags { } } + public static class SpecTag implements Serializable { + private static final long serialVersionUID = 3805124696862755492L; + + @JsonProperty + final String kind; + + @JsonProperty + final List<Object> specList; + + public SpecTag(@JsonProperty("kind")String kind, @JsonProperty("specList")List<Object> specList) { + this.kind = kind; + this.specList = specList; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .omitNullValues() + .add("kind", kind) + .add("specList", specList) + .toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SpecTag specTag = (SpecTag) o; + return Objects.equal(kind, specTag.kind) && Objects.equal(specList, specTag.specList) ; + } + + @Override + public int hashCode() { + return Objects.hashCode(kind, specList); + } + + public String getKind() { + return kind; + } + + public List<Object> getSpecList() { + return specList; + } + + public void push(SpecTag currentSpecTag) { + // usually the list has a single element here, if + currentSpecTag.getSpecList().forEach(e -> specList.add(0, e)); + } + } + + public static class HierarchySpecTagBuilder { + private String format; + private String summary; + private Object contents; + + public HierarchySpecTagBuilder format(final String format) { + this.format = format; + return this; + } + + public HierarchySpecTagBuilder summary(final String summary) { + this.summary = summary; + return this; + } + + public HierarchySpecTagBuilder contents(final Object contents) { + this.contents = contents; + return this; + } + + + public SpecTag build() { + return new SpecTag(BrooklynTags.YAML_SPEC_HIERARCHY, MutableList.of( + MutableMap.of( + "format", format, + "summary", summary, + "contents", contents + ) + )); + } + } + public static class ListTag<T> { @JsonIgnore final List<T> list; diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java index d1e28ac..3278aa7 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/AbstractTypePlanTransformer.java @@ -25,6 +25,7 @@ import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext; import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; +import org.apache.brooklyn.core.mgmt.BrooklynTags; import org.apache.brooklyn.util.exceptions.Exceptions; import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.javalang.JavaClassNames; @@ -159,5 +160,22 @@ public abstract class AbstractTypePlanTransformer implements BrooklynTypePlanTra protected abstract AbstractBrooklynObjectSpec<?,?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception; protected abstract Object createBean(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception; + + protected AbstractBrooklynObjectSpec<?,?> decorateWithHierarchySpecTag(AbstractBrooklynObjectSpec<?, ?> spec, RegisteredType type, final String format) { + BrooklynTags.SpecTag currentSpecTag = new BrooklynTags.HierarchySpecTagBuilder() + .format(format) + .summary("CAMP plan for " + type.getDisplayName()) + .contents(type.getPlan().getPlanData()) + .build(); + + Object specTagObj = spec.getTag(tag -> tag instanceof BrooklynTags.SpecTag); + if(specTagObj != null) { + BrooklynTags.SpecTag specTag = (BrooklynTags.SpecTag) specTagObj; + specTag.push(currentSpecTag); + } else { + spec.tag(currentSpecTag); + } + return spec; + } } diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java b/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java index 53cb84a..196a254 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/JavaClassNameTypePlanTransformer.java @@ -65,7 +65,7 @@ public class JavaClassNameTypePlanTransformer extends AbstractTypePlanTransforme @SuppressWarnings({ "unchecked" }) @Override protected AbstractBrooklynObjectSpec<?,?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception { - return RegisteredTypes.newSpecInstance(mgmt, (Class<? extends BrooklynObject>) getType(type, context)); + return decorateWithHierarchySpecTag(RegisteredTypes.newSpecInstance(mgmt, (Class<? extends BrooklynObject>) getType(type, context)), type, FORMAT); } @Override diff --git a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java index af1ab0b..ff3ec69 100644 --- a/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java +++ b/core/src/test/java/org/apache/brooklyn/core/catalog/internal/StaticTypePlanTransformer.java @@ -93,9 +93,9 @@ public class StaticTypePlanTransformer extends AbstractTypePlanTransformer { @Override protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception { if (REGISTERED_SPECS.containsKey(type.getSymbolicName())) - return get(type.getSymbolicName()); + return decorateWithHierarchySpecTag(get(type.getSymbolicName()), type, FORMAT); if (type.getPlan().getPlanData()!=null && REGISTERED_SPECS.containsKey(type.getPlan().getPlanData())) - return get((String)type.getPlan().getPlanData()); + return decorateWithHierarchySpecTag(get((String)type.getPlan().getPlanData()), type, FORMAT); return null; } @@ -108,6 +108,4 @@ public class StaticTypePlanTransformer extends AbstractTypePlanTransformer { public static AbstractBrooklynObjectSpec<?, ?> get(String typeName) { return REGISTERED_SPECS.get(typeName); } - - } diff --git a/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java index c058d7b..b82031c 100644 --- a/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java +++ b/core/src/test/java/org/apache/brooklyn/core/typereg/ExampleXmlTypePlanTransformer.java @@ -41,8 +41,10 @@ import org.w3c.dom.Node; * how implementations are meant to be written. */ public class ExampleXmlTypePlanTransformer extends AbstractTypePlanTransformer { + public static final String FORMAT = "example-xml"; + protected ExampleXmlTypePlanTransformer() { - super("example-xml", "Example XML", "Illustration of writing a transformer"); + super(FORMAT, "Example XML", "Illustration of writing a transformer"); } @Override @@ -66,8 +68,8 @@ public class ExampleXmlTypePlanTransformer extends AbstractTypePlanTransformer { @Override protected AbstractBrooklynObjectSpec<?, ?> createSpec(RegisteredType type, RegisteredTypeLoadingContext context) throws Exception { - return toEntitySpec(parseXml((String)type.getPlan().getPlanData()), - isApplicationExpected(type, context) ? 0 : 1); + return decorateWithHierarchySpecTag(toEntitySpec(parseXml((String)type.getPlan().getPlanData()), + isApplicationExpected(type, context) ? 0 : 1), type, "example-xml"); } private static boolean isApplicationExpected(RegisteredType type, RegisteredTypeLoadingContext context) {
