You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by al...@apache.org on 2015/07/24 07:07:20 UTC

[1/4] incubator-brooklyn git commit: Introduce constants for commonly used strings

Repository: incubator-brooklyn
Updated Branches:
  refs/heads/master d01554af2 -> bfcb8c35e


Introduce constants for commonly used strings


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/ea763893
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/ea763893
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/ea763893

Branch: refs/heads/master
Commit: ea763893004159942ce2089f7f60083177b288c5
Parents: d7ac3ac
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Thu Jul 16 14:13:39 2015 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Jul 16 14:13:55 2015 +0300

----------------------------------------------------------------------
 .../camp/brooklyn/BrooklynCampReservedKeys.java | 29 ++++++++++++++++++++
 .../BrooklynComponentTemplateResolver.java      |  5 ++--
 .../BrooklynEntityDecorationResolver.java       |  7 +++--
 .../creation/BrooklynYamlTypeInstantiator.java  |  3 +-
 .../spi/dsl/methods/BrooklynDslCommon.java      |  3 +-
 .../camp/brooklyn/JavaWebAppsMatchingTest.java  |  6 ++--
 6 files changed, 43 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ea763893/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/BrooklynCampReservedKeys.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/BrooklynCampReservedKeys.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/BrooklynCampReservedKeys.java
new file mode 100644
index 0000000..b81e223
--- /dev/null
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/BrooklynCampReservedKeys.java
@@ -0,0 +1,29 @@
+/*
+ * 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 io.brooklyn.camp.brooklyn;
+
+public interface BrooklynCampReservedKeys {
+    public static final String BROOKLYN_CONFIG = "brooklyn.config";
+    public static final String BROOKLYN_FLAGS = "brooklyn.flags";
+    public static final String BROOKLYN_POLICIES = "brooklyn.policies";
+    public static final String BROOKLYN_ENRICHERS = "brooklyn.enrichers";
+    public static final String BROOKLYN_CHILDREN = "brooklyn.children";
+    public static final String BROOKLYN_INITIALIZERS = "brooklyn.initializers";
+    public static final String BROOKLYN_CATALOG = "brooklyn.catalog";
+}

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ea763893/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index c157e93..e26240f 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -19,6 +19,7 @@
 package io.brooklyn.camp.brooklyn.spi.creation;
 
 import io.brooklyn.camp.brooklyn.BrooklynCampConstants;
+import io.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import io.brooklyn.camp.brooklyn.spi.creation.service.BrooklynServiceTypeResolver;
 import io.brooklyn.camp.brooklyn.spi.creation.service.ServiceTypeResolver;
 import io.brooklyn.camp.spi.AbstractResource;
@@ -293,7 +294,7 @@ public class BrooklynComponentTemplateResolver {
         if (planId==null)
             planId = (String) attrs.getStringKey(BrooklynCampConstants.PLAN_ID_FLAG);
 
-        Object childrenObj = attrs.getStringKey("brooklyn.children");
+        Object childrenObj = attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_CHILDREN);
         if (childrenObj != null) {
             // Creating a new set of encounteredCatalogTypes means that this won't check things recursively;
             // but we are looking at children so we probably *should* be resetting the recursive list we've looked at;
@@ -462,7 +463,7 @@ public class BrooklynComponentTemplateResolver {
     @SuppressWarnings("unchecked")
     protected List<Map<String, Object>> getChildren(Map<String, Object> attrs) {
         if (attrs==null) return null;
-        return (List<Map<String, Object>>) attrs.get("brooklyn.children");
+        return (List<Map<String, Object>>) attrs.get(BrooklynCampReservedKeys.BROOKLYN_CHILDREN);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ea763893/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
index ce814b4..f0fd10f 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityDecorationResolver.java
@@ -18,6 +18,7 @@
  */
 package io.brooklyn.camp.brooklyn.spi.creation;
 
+import io.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import io.brooklyn.camp.brooklyn.spi.creation.BrooklynYamlTypeInstantiator.InstantiatorFromKey;
 
 import java.util.List;
@@ -98,7 +99,7 @@ public abstract class BrooklynEntityDecorationResolver<DT> {
         
         @Override
         protected Object getDecorationAttributeJsonValue(ConfigBag attrs) {
-            return attrs.getStringKey("brooklyn.policies");
+            return attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_POLICIES);
         }
 
         @Override
@@ -144,7 +145,7 @@ public abstract class BrooklynEntityDecorationResolver<DT> {
         
         @Override
         protected Object getDecorationAttributeJsonValue(ConfigBag attrs) {
-            return attrs.getStringKey("brooklyn.enrichers");
+            return attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_ENRICHERS);
         }
 
         @Override
@@ -167,7 +168,7 @@ public abstract class BrooklynEntityDecorationResolver<DT> {
         
         @Override
         protected Object getDecorationAttributeJsonValue(ConfigBag attrs) {
-            return attrs.getStringKey("brooklyn.initializers");
+            return attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_INITIALIZERS);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ea763893/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
index c5f3dcb..b78f359 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynYamlTypeInstantiator.java
@@ -32,6 +32,7 @@ import brooklyn.util.config.ConfigBag;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.guava.Maybe;
 import brooklyn.util.javalang.Reflections;
+import io.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Optional;
@@ -155,7 +156,7 @@ public abstract class BrooklynYamlTypeInstantiator {
         @Nonnull
         public Map<String,?> getConfigMap() {
             MutableMap<String,Object> result = MutableMap.of();
-            Object bc = data.getStringKey("brooklyn.config");
+            Object bc = data.getStringKey(BrooklynCampReservedKeys.BROOKLYN_CONFIG);
             if (bc!=null) {
                 if (bc instanceof Map)
                     result.putAll((Map<? extends String, ?>) bc);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ea763893/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
index f488d61..efcdd49 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/dsl/methods/BrooklynDslCommon.java
@@ -18,6 +18,7 @@
  */
 package io.brooklyn.camp.brooklyn.spi.dsl.methods;
 
+import io.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import io.brooklyn.camp.brooklyn.spi.creation.BrooklynYamlTypeInstantiator;
 import io.brooklyn.camp.brooklyn.spi.creation.EntitySpecConfiguration;
 import io.brooklyn.camp.brooklyn.spi.dsl.BrooklynDslDeferredSupplier;
@@ -144,7 +145,7 @@ public class BrooklynDslCommon {
         ConfigBag config = ConfigBag.newInstance(arguments);
         String typeName = BrooklynYamlTypeInstantiator.InstantiatorFromKey.extractTypeName("object", config).orNull();
         Map<String,Object> objectFields = (Map<String, Object>) config.getStringKeyMaybe("object.fields").or(MutableMap.of());
-        Map<String,Object> brooklynConfig = (Map<String, Object>) config.getStringKeyMaybe("brooklyn.config").or(MutableMap.of());
+        Map<String,Object> brooklynConfig = (Map<String, Object>) config.getStringKeyMaybe(BrooklynCampReservedKeys.BROOKLYN_CONFIG).or(MutableMap.of());
         try {
             // TODO Should use catalog's classloader, rather than Class.forName; how to get that? Should we return a future?!
             Class<?> type = Class.forName(typeName);

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/ea763893/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/JavaWebAppsMatchingTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/JavaWebAppsMatchingTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/JavaWebAppsMatchingTest.java
index 28e8ef5..a9ddf63 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/JavaWebAppsMatchingTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/JavaWebAppsMatchingTest.java
@@ -87,7 +87,7 @@ public class JavaWebAppsMatchingTest {
         
         DeploymentPlan plan = platform.pdp().parseDeploymentPlan(input);
         log.info("DP is:\n"+plan.toString());
-        Map<?,?> cfg1 = (Map<?, ?>) plan.getServices().get(0).getCustomAttributes().get("brooklyn.config");
+        Map<?,?> cfg1 = (Map<?, ?>) plan.getServices().get(0).getCustomAttributes().get(BrooklynCampReservedKeys.BROOKLYN_CONFIG);
         Map<?,?> cfg = MutableMap.copyOf(cfg1);
         
         Assert.assertEquals(cfg.remove("literalValue1"), "$brooklyn: is a fun place");
@@ -106,7 +106,7 @@ public class JavaWebAppsMatchingTest {
         Assert.assertEquals(at.getCustomAttributes().get("location"), "localhost");
         
         PlatformComponentTemplate pct = at.getPlatformComponentTemplates().links().iterator().next().resolve();
-        Object cfg2 = pct.getCustomAttributes().get("brooklyn.config");
+        Object cfg2 = pct.getCustomAttributes().get(BrooklynCampReservedKeys.BROOKLYN_CONFIG);
         Assert.assertEquals(cfg2, cfg1);
     }
 
@@ -133,7 +133,7 @@ public class JavaWebAppsMatchingTest {
 
         PlatformComponentTemplate pct2 = pcti.next().resolve(); 
 
-        Map<?,?> config = (Map<?, ?>) pct1.getCustomAttributes().get("brooklyn.config");
+        Map<?,?> config = (Map<?, ?>) pct1.getCustomAttributes().get(BrooklynCampReservedKeys.BROOKLYN_CONFIG);
         Map<?,?> javaSysProps = (Map<?, ?>) config.get("java.sysprops");
         Object dbUrl = javaSysProps.get("brooklyn.example.db.url");
         Assert.assertTrue(dbUrl instanceof DeferredSupplier<?>, "url is: "+dbUrl);


[4/4] incubator-brooklyn git commit: This closes #751

Posted by al...@apache.org.
This closes #751


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/bfcb8c35
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/bfcb8c35
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/bfcb8c35

Branch: refs/heads/master
Commit: bfcb8c35efe58d598bb0f9b790f965b173ab0e47
Parents: d01554a b1a730a
Author: Aled Sage <al...@gmail.com>
Authored: Thu Jul 23 22:07:18 2015 -0700
Committer: Aled Sage <al...@gmail.com>
Committed: Thu Jul 23 22:07:18 2015 -0700

----------------------------------------------------------------------
 .../brooklyn/camp/spi/resolve/PdpProcessor.java | 14 +++-
 .../camp/brooklyn/BrooklynCampReservedKeys.java | 29 +++++++
 .../BrooklynComponentTemplateResolver.java      | 37 ++++++--
 .../BrooklynEntityDecorationResolver.java       |  7 +-
 .../spi/creation/BrooklynEntityMatcher.java     | 88 +++++---------------
 .../creation/BrooklynYamlTypeInstantiator.java  |  3 +-
 .../spi/dsl/methods/BrooklynDslCommon.java      |  3 +-
 .../camp/brooklyn/EntitiesYamlTest.java         | 59 +++++++++++++
 .../camp/brooklyn/JavaWebAppsMatchingTest.java  |  6 +-
 .../brooklyn/catalog/CatalogYamlEntityTest.java | 79 ++++++++++++++++++
 10 files changed, 240 insertions(+), 85 deletions(-)
----------------------------------------------------------------------



[3/4] incubator-brooklyn git commit: Apply flags for fields declared in the entity implementation

Posted by al...@apache.org.
Apply flags for fields declared in the entity implementation


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/b1a730a3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/b1a730a3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/b1a730a3

Branch: refs/heads/master
Commit: b1a730a3d5bf49a0bb83663d268b87f78ee6b325
Parents: 68f5bd7
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Thu Jul 16 18:46:54 2015 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Jul 16 18:48:41 2015 +0300

----------------------------------------------------------------------
 .../brooklyn/camp/spi/resolve/PdpProcessor.java | 14 +++++-
 .../BrooklynComponentTemplateResolver.java      | 20 +++++++-
 .../camp/brooklyn/EntitiesYamlTest.java         | 21 +++++++++
 .../brooklyn/catalog/CatalogYamlEntityTest.java | 49 ++++++++++++++++----
 4 files changed, 91 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b1a730a3/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java b/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java
index 44ea105..e4bc537 100644
--- a/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java
+++ b/camp/camp-base/src/main/java/io/brooklyn/camp/spi/resolve/PdpProcessor.java
@@ -39,6 +39,7 @@ import org.apache.commons.compress.archivers.ArchiveInputStream;
 import org.apache.commons.compress.archivers.ArchiveStreamFactory;
 import org.yaml.snakeyaml.error.YAMLException;
 
+import brooklyn.util.collections.MutableMap;
 import brooklyn.util.exceptions.Exceptions;
 import brooklyn.util.stream.Streams;
 import brooklyn.util.yaml.Yamls;
@@ -104,8 +105,17 @@ public class PdpProcessor {
         }
 
         Map<String, Object> attrs = plan.getCustomAttributes();
-        if (attrs!=null && !attrs.isEmpty())
-            atc.addCustomAttributes(attrs);
+        if (attrs!=null && !attrs.isEmpty()) {
+            Map<String, Object> customAttrs = attrs;
+            if (customAttrs.containsKey("id")) {
+                // id shouldn't be leaking to entities, see InternalEntityFactory.createEntityAndDescendantsUninitialized.
+                // If set it will go through to the spec because AbstractBrooklynObject has @SetFromFlag("id") on the id property.
+                // Follows logic in BrooklynEntityMatcher.apply(...).
+                customAttrs = MutableMap.copyOf(attrs);
+                customAttrs.put("planId", customAttrs.remove("id"));
+            }
+            atc.addCustomAttributes(customAttrs);
+        }
         
         if (atc.getInstantiator()==null)
             // set a default instantiator which just invokes the component's instantiators

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b1a730a3/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index ca4748f..cdf1beb 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -27,6 +27,7 @@ import io.brooklyn.camp.spi.ApplicationComponentTemplate;
 import io.brooklyn.camp.spi.AssemblyTemplate;
 import io.brooklyn.camp.spi.PlatformComponentTemplate;
 
+import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -359,7 +360,7 @@ public class BrooklynComponentTemplateResolver {
             bagFlags.putAll((Map<String, Object>) attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_FLAGS));
         }
 
-        List<FlagConfigKeyAndValueRecord> topLevelApparentConfig = FlagUtils.findAllFlagsAndConfigKeys(null, spec.getType(), bagFlags);
+        Collection<FlagConfigKeyAndValueRecord> topLevelApparentConfig = findAllFlagsAndConfigKeys(spec, bagFlags);
         for (FlagConfigKeyAndValueRecord r: topLevelApparentConfig) {
             if (r.getConfigKeyMaybeValue().isPresent())
                 bag.putIfAbsent((ConfigKey)r.getConfigKey(), r.getConfigKeyMaybeValue().get());
@@ -368,7 +369,7 @@ public class BrooklynComponentTemplateResolver {
         }
 
         // now set configuration for all the items in the bag
-        List<FlagConfigKeyAndValueRecord> records = FlagUtils.findAllFlagsAndConfigKeys(null, spec.getType(), bag);
+        Collection<FlagConfigKeyAndValueRecord> records = findAllFlagsAndConfigKeys(spec, bag);
         Set<String> keyNamesUsed = new LinkedHashSet<String>();
         for (FlagConfigKeyAndValueRecord r: records) {
             if (r.getFlagMaybeValue().isPresent()) {
@@ -396,6 +397,21 @@ public class BrooklynComponentTemplateResolver {
         }
     }
 
+    /**
+     * Searches for config keys in the type, additional interfaces and the implementation (if specified)
+     */
+    private Collection<FlagConfigKeyAndValueRecord> findAllFlagsAndConfigKeys(EntitySpec<?> spec, ConfigBag bagFlags) {
+        Set<FlagConfigKeyAndValueRecord> allKeys = MutableSet.of();
+        allKeys.addAll(FlagUtils.findAllFlagsAndConfigKeys(null, spec.getType(), bagFlags));
+        if (spec.getImplementation() != null) {
+            allKeys.addAll(FlagUtils.findAllFlagsAndConfigKeys(null, spec.getImplementation(), bagFlags));
+        }
+        for (Class<?> iface : spec.getAdditionalInterfaces()) {
+            allKeys.addAll(FlagUtils.findAllFlagsAndConfigKeys(null, iface, bagFlags));
+        }
+        return allKeys;
+    }
+
     protected static class SpecialFlagsTransformer implements Function<Object, Object> {
         protected final ManagementContext mgmt;
         /* TODO find a way to make do without loader here?

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b1a730a3/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
index 9885686..ec0d6bd 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
@@ -156,6 +156,16 @@ public class EntitiesYamlTest extends AbstractYamlTest {
     }
 
     @Test
+    public void testFlagAtRootEntityImpl() throws Exception {
+        Entity app = createAndStartApplication(
+                "services:",
+                "- serviceType: " + TestEntityImpl.class.getName(),
+                "  confName: Foo Bar");
+        Entity testEntity = Iterables.getOnlyElement(app.getChildren());
+        Assert.assertEquals(testEntity.getConfig(TestEntity.CONF_NAME), "Foo Bar");
+    }
+
+    @Test
     public void testConfigKeyAtRoot() throws Exception {
         Entity testEntity = setupAndCheckTestEntityInBasicYamlWith( 
             "  test.confName: Foo Bar");
@@ -180,6 +190,17 @@ public class EntitiesYamlTest extends AbstractYamlTest {
     }
 
     @Test
+    public void testExplicitFlagsEntityImpl() throws Exception {
+        Entity app = createAndStartApplication(
+                "services:",
+                "- serviceType: " + TestEntityImpl.class.getName(),
+                "  brooklyn.flags:",
+                "    confName: Foo Bar");
+        Entity testEntity = Iterables.getOnlyElement(app.getChildren());
+        Assert.assertEquals(testEntity.getConfig(TestEntity.CONF_NAME), "Foo Bar");
+    }
+
+    @Test
     public void testUndeclaredExplicitFlagsIgnored() throws Exception {
         Entity testEntity = setupAndCheckTestEntityInBasicYamlWith( 
             "  brooklyn.flags:",

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b1a730a3/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
index fecbe43..1639588 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
@@ -39,6 +39,7 @@ import brooklyn.management.osgi.OsgiStandaloneTest;
 import brooklyn.management.osgi.OsgiTestResources;
 import brooklyn.test.TestResourceUnavailableException;
 import brooklyn.test.entity.TestEntity;
+import brooklyn.test.entity.TestEntityImpl;
 import brooklyn.util.ResourceUtils;
 import brooklyn.util.collections.MutableList;
 import brooklyn.util.exceptions.Exceptions;
@@ -613,7 +614,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
 
     @Test
     public void testConfigAppliedToCatalogItem() throws Exception {
-        addTestEntityCatalogItem();
+        addCatalogOSGiEntity("test", TestEntity.class.getName());
         String testName = "test-applies-config-on-catalog-item";
         Entity app = createAndStartApplication(
                 "services:",
@@ -626,7 +627,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
 
     @Test
     public void testFlagsAppliesToCatalogItem() throws Exception {
-        addTestEntityCatalogItem();
+        addCatalogOSGiEntity("test", TestEntity.class.getName());
         String testName = "test-applies-config-on-catalog-item";
         Entity app = createAndStartApplication(
                 "services:",
@@ -638,7 +639,7 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
 
     @Test
     public void testExplicitFlagsAppliesToCatalogItem() throws Exception {
-        addTestEntityCatalogItem();
+        addCatalogOSGiEntity("test", TestEntity.class.getName());
         String testName = "test-applies-config-on-catalog-item";
         Entity app = createAndStartApplication(
                 "services:",
@@ -649,15 +650,45 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
         assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName);
     }
     
-    private void addTestEntityCatalogItem() {
-        addCatalogItems(
-                "brooklyn.catalog:",
-                "   id: test",
-                "   version: " + TEST_VERSION,
+
+    @Test
+    public void testConfigAppliedToCatalogItemImpl() throws Exception {
+        addCatalogOSGiEntity("test", TestEntityImpl.class.getName());
+        String testName = "test-applies-config-on-catalog-item";
+        Entity app = createAndStartApplication(
+                "services:",
+                "- type: " + ver("test"),
+                "  brooklyn.config:",
+                "    test.confName: " + testName);
+        Entity testEntity = Iterables.getOnlyElement(app.getChildren());
+        assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName);
+    }
+
+    @Test
+    public void testFlagsAppliesToCatalogItemImpl() throws Exception {
+        addCatalogOSGiEntity("test", TestEntityImpl.class.getName());
+        String testName = "test-applies-config-on-catalog-item";
+        Entity app = createAndStartApplication(
                 "services:",
-                "- type: " + TestEntity.class.getName());
+                "- type: " + ver("test"),
+                "  confName: " + testName);
+        Entity testEntity = Iterables.getOnlyElement(app.getChildren());
+        assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName);
     }
 
+    @Test
+    public void testExplicitFlagsAppliesToCatalogItemImpl() throws Exception {
+        addCatalogOSGiEntity("test", TestEntityImpl.class.getName());
+        String testName = "test-applies-config-on-catalog-item";
+        Entity app = createAndStartApplication(
+                "services:",
+                "- type: " + ver("test"),
+                "  brooklyn.flags:",
+                "    confName: " + testName);
+        Entity testEntity = Iterables.getOnlyElement(app.getChildren());
+        assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName);
+    }
+    
     private void registerAndLaunchAndAssertSimpleEntity(String symbolicName, String serviceType) throws Exception {
         addCatalogOSGiEntity(symbolicName, serviceType);
         String yaml = "name: simple-app-yaml\n" +


[2/4] incubator-brooklyn git commit: Apply root flags to catalog items (a.k.a. brooklyn.flags)

Posted by al...@apache.org.
Apply root flags to catalog items (a.k.a. brooklyn.flags)

Root flags weren't applied to catalog items because BrooklynEntityMatcher filtered known root entries based on the entity type and for catalog items it didn't have the type. Instead delegate filtering the flags to later stages, leaving to BrooklynEntityMatcher to put any unused attributes in a brooklyn.flags section.


Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/68f5bd7d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/68f5bd7d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/68f5bd7d

Branch: refs/heads/master
Commit: 68f5bd7d3814e433589fa6adf010aef66f969021
Parents: ea76389
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Thu Jul 16 17:20:30 2015 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Thu Jul 16 17:38:48 2015 +0300

----------------------------------------------------------------------
 .../BrooklynComponentTemplateResolver.java      | 12 ++-
 .../spi/creation/BrooklynEntityMatcher.java     | 88 +++++---------------
 .../camp/brooklyn/EntitiesYamlTest.java         | 38 +++++++++
 .../brooklyn/catalog/CatalogYamlEntityTest.java | 48 +++++++++++
 4 files changed, 115 insertions(+), 71 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/68f5bd7d/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
index e26240f..ca4748f 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynComponentTemplateResolver.java
@@ -348,11 +348,17 @@ public class BrooklynComponentTemplateResolver {
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
     protected void configureEntityConfig(EntitySpec<?> spec) {
-        ConfigBag bag = ConfigBag.newInstance((Map<Object, Object>) attrs.getStringKey("brooklyn.config"));
-
         // first take *recognised* flags and config keys from the top-level, and put them in the bag (of brooklyn.config)
-        // (for component templates this will have been done already by BrooklynEntityMatcher, but for specs it is needed here)
+        // attrs will contain only brooklyn.xxx properties when coming from BrooklynEntityMatcher.
+        // Any top-level flags will go into "brooklyn.flags". When resolving a spec from $brooklyn:entitySpec
+        // top level flags remain in place. Have to support both cases.
+
+        ConfigBag bag = ConfigBag.newInstance((Map<Object, Object>) attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_CONFIG));
         ConfigBag bagFlags = ConfigBag.newInstanceCopying(attrs);
+        if (attrs.containsKey(BrooklynCampReservedKeys.BROOKLYN_FLAGS)) {
+            bagFlags.putAll((Map<String, Object>) attrs.getStringKey(BrooklynCampReservedKeys.BROOKLYN_FLAGS));
+        }
+
         List<FlagConfigKeyAndValueRecord> topLevelApparentConfig = FlagUtils.findAllFlagsAndConfigKeys(null, spec.getType(), bagFlags);
         for (FlagConfigKeyAndValueRecord r: topLevelApparentConfig) {
             if (r.getConfigKeyMaybeValue().isPresent())

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/68f5bd7d/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
index 50b57e9..699bc12 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynEntityMatcher.java
@@ -19,6 +19,7 @@
 package io.brooklyn.camp.brooklyn.spi.creation;
 
 import io.brooklyn.camp.brooklyn.BrooklynCampConstants;
+import io.brooklyn.camp.brooklyn.BrooklynCampReservedKeys;
 import io.brooklyn.camp.spi.PlatformComponentTemplate;
 import io.brooklyn.camp.spi.PlatformComponentTemplate.Builder;
 import io.brooklyn.camp.spi.pdp.AssemblyTemplateConstructor;
@@ -32,15 +33,10 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import brooklyn.catalog.internal.BasicBrooklynCatalog;
-import brooklyn.entity.Entity;
 import brooklyn.management.ManagementContext;
 import brooklyn.management.classloading.BrooklynClassLoadingContext;
 import brooklyn.management.classloading.JavaBrooklynClassLoadingContext;
 import brooklyn.util.collections.MutableMap;
-import brooklyn.util.config.ConfigBag;
-import brooklyn.util.exceptions.Exceptions;
-import brooklyn.util.flags.FlagUtils;
-import brooklyn.util.flags.FlagUtils.FlagConfigKeyAndValueRecord;
 import brooklyn.util.net.Urls;
 import brooklyn.util.text.Strings;
 
@@ -131,37 +127,28 @@ public class BrooklynEntityMatcher implements PdpMatcher {
         if (locations!=null)
             builder.customAttribute("locations", locations);
 
-        MutableMap<Object, Object> brooklynConfig = MutableMap.of();
-        Object origBrooklynConfig = attrs.remove("brooklyn.config");
-        if (origBrooklynConfig!=null) {
-            if (!(origBrooklynConfig instanceof Map))
-                throw new IllegalArgumentException("brooklyn.config must be a map of brooklyn config keys");
-            brooklynConfig.putAll((Map<?,?>)origBrooklynConfig);
+        MutableMap<Object, Object> brooklynFlags = MutableMap.of();
+        Object origBrooklynFlags = attrs.remove(BrooklynCampReservedKeys.BROOKLYN_FLAGS);
+        if (origBrooklynFlags!=null) {
+            if (!(origBrooklynFlags instanceof Map))
+                throw new IllegalArgumentException("brooklyn.flags must be a map of brooklyn flags");
+            brooklynFlags.putAll((Map<?,?>)origBrooklynFlags);
         }
-        // also take *recognised* flags and config keys from the top-level, and put them under config
-        List<FlagConfigKeyAndValueRecord> topLevelApparentConfig = extractValidConfigFlagsOrKeys(type, attrs, true);
-        if (topLevelApparentConfig!=null) for (FlagConfigKeyAndValueRecord r: topLevelApparentConfig) {
-            if (r.getConfigKeyMaybeValue().isPresent())
-                brooklynConfig.put(r.getConfigKey(), r.getConfigKeyMaybeValue().get());
-            if (r.getFlagMaybeValue().isPresent())
-                brooklynConfig.put(r.getFlagName(), r.getFlagMaybeValue().get());
-        }
-        // (any other brooklyn config goes here)
-        if (!brooklynConfig.isEmpty())
-            builder.customAttribute("brooklyn.config", brooklynConfig);
-
-        addCustomListAttributeIfNonNull(builder, attrs, "brooklyn.policies");
-        addCustomListAttributeIfNonNull(builder, attrs, "brooklyn.enrichers");
-        addCustomListAttributeIfNonNull(builder, attrs, "brooklyn.initializers");
-        addCustomListAttributeIfNonNull(builder, attrs, "brooklyn.children");
-        addCustomMapAttributeIfNonNull(builder, attrs, "brooklyn.catalog");
-
-        if (!attrs.isEmpty()) {
-            log.warn("Ignoring PDP attributes on "+deploymentPlanItem+": "+attrs);
+
+        addCustomMapAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_CONFIG);
+        addCustomListAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_POLICIES);
+        addCustomListAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_ENRICHERS);
+        addCustomListAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_INITIALIZERS);
+        addCustomListAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_CHILDREN);
+        addCustomMapAttributeIfNonNull(builder, attrs, BrooklynCampReservedKeys.BROOKLYN_CATALOG);
+
+        brooklynFlags.putAll(attrs);
+        if (!brooklynFlags.isEmpty()) {
+            builder.customAttribute(BrooklynCampReservedKeys.BROOKLYN_FLAGS, brooklynFlags);
         }
-        
+
         atc.add(builder.build());
-        
+
         return true;
     }
 
@@ -203,39 +190,4 @@ public class BrooklynEntityMatcher implements PdpMatcher {
         }
     }
 
-    /** finds flags and keys on the given typeName which are present in the given map;
-     * returns those (using the config key name), and removes them from attrs
-     */
-    protected List<FlagConfigKeyAndValueRecord> extractValidConfigFlagsOrKeys(String typeName, Map<String, Object> attrs, boolean removeIfFound) {
-        if (attrs==null || attrs.isEmpty())
-            return null;
-        try {
-            // TODO don't use the mgmt loader, but instead use something like catalog.createSpec
-            // currently we get warnings and are unable to retrieve flags for items which come from catalog 
-            Class<? extends Entity> type = BrooklynComponentTemplateResolver.Factory.newInstance(JavaBrooklynClassLoadingContext.create(mgmt), typeName).loadEntityClass();
-            ConfigBag bag = ConfigBag.newInstance(attrs);
-            List<FlagConfigKeyAndValueRecord> values = FlagUtils.findAllFlagsAndConfigKeys(null, type, bag);
-            
-            if (removeIfFound) {
-                // remove from attrs
-                MutableMap<String, Object> used = MutableMap.copyOf(bag.getAllConfig());
-                for (String unusedKey: bag.getUnusedConfig().keySet())
-                    used.remove(unusedKey);
-                for (String usedKey: used.keySet())
-                    attrs.remove(usedKey);
-            }
-            
-            return values;
-        } catch (Exception e) {
-            Exceptions.propagateIfFatal(e);
-            if (e.toString().contains("Could not find")) {
-                // normal for catalog items, there will be no java type
-                log.debug("Ignoring configuration attributes on "+typeName+", details: "+e);
-            } else {
-                log.warn("Ignoring configuration attributes on "+typeName+" due to "+e, e);
-            }
-            return null;
-        }
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/68f5bd7d/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
index 6deda0f..9885686 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/EntitiesYamlTest.java
@@ -171,6 +171,23 @@ public class EntitiesYamlTest extends AbstractYamlTest {
         Assert.assertNull(dynamicConfNameValue);
     }
 
+    @Test
+    public void testExplicitFlags() throws Exception {
+        Entity testEntity = setupAndCheckTestEntityInBasicYamlWith( 
+            "  brooklyn.flags:",
+            "    confName: Foo Bar");
+        Assert.assertEquals(testEntity.getConfig(TestEntity.CONF_NAME), "Foo Bar");
+    }
+
+    @Test
+    public void testUndeclaredExplicitFlagsIgnored() throws Exception {
+        Entity testEntity = setupAndCheckTestEntityInBasicYamlWith( 
+            "  brooklyn.flags:",
+            "    test.dynamic.confName: Foo Bar");
+        String dynamicConfNameValue = testEntity.getConfig(ConfigKeys.newStringConfigKey("test.dynamic.confName"));
+        Assert.assertNull(dynamicConfNameValue);
+    }
+
     @SuppressWarnings("unchecked")
     @Test
     public void testEmptyConfig() throws Exception {
@@ -624,6 +641,27 @@ public class EntitiesYamlTest extends AbstractYamlTest {
     }
 
     @Test
+    public void testEntitySpecExplicitFlags() throws Exception {
+        String yaml =
+                "services:\n"+
+                "- serviceType: brooklyn.test.entity.TestEntity\n"+
+                "  brooklyn.flags:\n"+
+                "    confName: inParent\n"+
+                "  brooklyn.config:\n"+
+                "   test.childSpec:\n"+
+                "     $brooklyn:entitySpec:\n"+
+                "       type: brooklyn.test.entity.TestEntity\n"+
+                "       brooklyn.flags:\n"+
+                "         confName: inchildspec\n";
+        
+        Application app = (Application) createStartWaitAndLogApplication(new StringReader(yaml));
+        TestEntity entity = (TestEntity) Iterables.getOnlyElement(app.getChildren());
+        
+        TestEntity child = (TestEntity) entity.createAndManageChildFromConfig();
+        assertEquals(child.getConfig(TestEntity.CONF_NAME), "inchildspec");
+    }
+
+    @Test
     public void testEntitySpecWithChildren() throws Exception {
         String yaml =
                 "services:\n"+

http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/68f5bd7d/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
index 6e17bfb..fecbe43 100644
--- a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/catalog/CatalogYamlEntityTest.java
@@ -38,6 +38,7 @@ import brooklyn.entity.basic.BasicEntity;
 import brooklyn.management.osgi.OsgiStandaloneTest;
 import brooklyn.management.osgi.OsgiTestResources;
 import brooklyn.test.TestResourceUnavailableException;
+import brooklyn.test.entity.TestEntity;
 import brooklyn.util.ResourceUtils;
 import brooklyn.util.collections.MutableList;
 import brooklyn.util.exceptions.Exceptions;
@@ -609,7 +610,54 @@ public class CatalogYamlEntityTest extends AbstractYamlTest {
             assertTrue(e.toString().contains("recursive"), "Unexpected error message: "+e);
         }
     }
+
+    @Test
+    public void testConfigAppliedToCatalogItem() throws Exception {
+        addTestEntityCatalogItem();
+        String testName = "test-applies-config-on-catalog-item";
+        Entity app = createAndStartApplication(
+                "services:",
+                "- type: " + ver("test"),
+                "  brooklyn.config:",
+                "    test.confName: " + testName);
+        Entity testEntity = Iterables.getOnlyElement(app.getChildren());
+        assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName);
+    }
+
+    @Test
+    public void testFlagsAppliesToCatalogItem() throws Exception {
+        addTestEntityCatalogItem();
+        String testName = "test-applies-config-on-catalog-item";
+        Entity app = createAndStartApplication(
+                "services:",
+                "- type: " + ver("test"),
+                "  confName: " + testName);
+        Entity testEntity = Iterables.getOnlyElement(app.getChildren());
+        assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName);
+    }
+
+    @Test
+    public void testExplicitFlagsAppliesToCatalogItem() throws Exception {
+        addTestEntityCatalogItem();
+        String testName = "test-applies-config-on-catalog-item";
+        Entity app = createAndStartApplication(
+                "services:",
+                "- type: " + ver("test"),
+                "  brooklyn.flags:",
+                "    confName: " + testName);
+        Entity testEntity = Iterables.getOnlyElement(app.getChildren());
+        assertEquals(testEntity.config().get(TestEntity.CONF_NAME), testName);
+    }
     
+    private void addTestEntityCatalogItem() {
+        addCatalogItems(
+                "brooklyn.catalog:",
+                "   id: test",
+                "   version: " + TEST_VERSION,
+                "services:",
+                "- type: " + TestEntity.class.getName());
+    }
+
     private void registerAndLaunchAndAssertSimpleEntity(String symbolicName, String serviceType) throws Exception {
         addCatalogOSGiEntity(symbolicName, serviceType);
         String yaml = "name: simple-app-yaml\n" +