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 2014/07/04 11:51:04 UTC
[22/45] git commit: Conditional wrapping of YAML app.
Conditional wrapping of YAML app.
When loading YAML with a single application in the services list don't
create a wrapper application, use the one from the services list.
To explicitly force wrapping use custom attribute "wrapApp: true".
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/c43eb16f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/c43eb16f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/c43eb16f
Branch: refs/heads/master
Commit: c43eb16fdc209a09f4cc7ee895816298bf48a785
Parents: 9bb861b
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Wed Jul 2 12:52:17 2014 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Wed Jul 2 16:36:13 2014 +0300
----------------------------------------------------------------------
.../BrooklynAssemblyTemplateInstantiator.java | 80 +++++++++++++++-----
.../io/brooklyn/camp/brooklyn/WrapAppTest.java | 75 ++++++++++++++++++
2 files changed, 134 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c43eb16f/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
index 4ec821f..9492104 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/BrooklynAssemblyTemplateInstantiator.java
@@ -13,6 +13,7 @@ import java.lang.reflect.Constructor;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -211,39 +212,76 @@ public class BrooklynAssemblyTemplateInstantiator implements AssemblyTemplateIns
// AssemblyTemplates created via PDP, _specifying_ then entities to put in
final ManagementContext mgmt = getBrooklynManagementContext(platform);
- Map<Entity, EntitySpec<?>> entitySpecs = Maps.newLinkedHashMap();
-
- BrooklynComponentTemplateResolver appResolver = BrooklynComponentTemplateResolver.Factory.newInstance(mgmt, template);
- EntitySpec<StartableApplication> appSpec = appResolver.resolveSpec(StartableApplication.class, BasicApplicationImpl.class);
- Application app = appResolver.newEntity(appSpec);
- entitySpecs.put(app, appSpec);
+ Map<Entity, EntitySpec<?>> rootEntities = Maps.newLinkedHashMap();
+ Map<Entity, EntitySpec<?>> allEntities = Maps.newLinkedHashMap();
+ buildEntities(template, rootEntities, allEntities, mgmt);
- for (ResolvableLink<PlatformComponentTemplate> ctl: template.getPlatformComponentTemplates().links()) {
- PlatformComponentTemplate appChildComponentTemplate = ctl.resolve();
- BrooklynComponentTemplateResolver entityResolver = BrooklynComponentTemplateResolver.Factory.newInstance(mgmt, appChildComponentTemplate);
- EntitySpec<? extends Entity> spec = entityResolver.resolveSpec();
+ EntitySpec<StartableApplication> appSpec;
+ StartableApplication app;
+ if(shouldWrapInApp(template, rootEntities)) {
+ BrooklynComponentTemplateResolver appResolver = BrooklynComponentTemplateResolver.Factory.newInstance(mgmt, template);
+ appSpec = appResolver.resolveSpec(StartableApplication.class, BasicApplicationImpl.class);
+ app = appResolver.newEntity(appSpec);
+ setEntitiesParent(rootEntities, app);
+ allEntities.put(app, appSpec);
+ } else {
+ Entry<Entity, EntitySpec<?>> entry = rootEntities.entrySet().iterator().next();
+ app = (StartableApplication)entry.getKey();
+ appSpec = (EntitySpec<StartableApplication>)entry.getValue();
+ }
+
+ initEntities(mgmt, allEntities);
+
+ log.info("CAMP placing '{}' under management", appSpec);
+ Entities.startManagement(app, mgmt);
- spec.parent(app);
- Entity entity = entityResolver.newEntity(spec);
- entitySpecs.put(entity, spec);
- buildEntityHierarchy(mgmt, entitySpecs, entity, entityResolver.getChildren(appChildComponentTemplate.getCustomAttributes()));
+ return app;
+ }
+
+ private void setEntitiesParent(Map<Entity, EntitySpec<?>> entities, Application parentApp) {
+ for(Entry<Entity, EntitySpec<?>> entry : entities.entrySet()) {
+ entry.getValue().parent(parentApp);
+ entry.getKey().setParent(parentApp);
}
+ }
- for (final Entity entity : entitySpecs.keySet()) {
- final EntitySpec<?> spec = entitySpecs.get(entity);
+ private void initEntities(final ManagementContext mgmt, Map<Entity, EntitySpec<?>> entities) {
+ for (Entry<Entity, EntitySpec<?>> entry : entities.entrySet()) {
+ final Entity entity = entry.getKey();
+
+ @SuppressWarnings("unchecked")
+ final EntitySpec<Entity> spec = (EntitySpec<Entity>)entry.getValue();
((EntityInternal) entity).getExecutionContext().submit(MutableMap.of(), new Runnable() {
@Override
public void run() {
- initEntity(mgmt, entity, (EntitySpec<Entity>)spec);
+ initEntity(mgmt, entity, spec);
}
}).getUnchecked();
}
-
- log.info("CAMP placing '{}' under management", appSpec);
- Entities.startManagement(app, mgmt);
+ }
- return app;
+ private boolean shouldWrapInApp(AssemblyTemplate template, Map<Entity, EntitySpec<?>> rootEntities) {
+ return isWrapAppRequested(template) ||
+ rootEntities.size() != 1 ||
+ !(rootEntities.keySet().iterator().next() instanceof StartableApplication);
+ }
+
+ private boolean isWrapAppRequested(AssemblyTemplate template) {
+ return Boolean.TRUE.equals(template.getCustomAttributes().get("wrappedApp"));
+ }
+
+ private void buildEntities(AssemblyTemplate template, Map<Entity, EntitySpec<?>> parentEntities,
+ Map<Entity, EntitySpec<?>> allEntities, ManagementContext mgmt) {
+ for (ResolvableLink<PlatformComponentTemplate> ctl: template.getPlatformComponentTemplates().links()) {
+ PlatformComponentTemplate appChildComponentTemplate = ctl.resolve();
+ BrooklynComponentTemplateResolver entityResolver = BrooklynComponentTemplateResolver.Factory.newInstance(mgmt, appChildComponentTemplate);
+ EntitySpec<? extends Entity> spec = entityResolver.resolveSpec();
+ Entity entity = entityResolver.newEntity(spec);
+ parentEntities.put(entity, spec);
+ allEntities.put(entity, spec);
+ buildEntityHierarchy(mgmt, allEntities, entity, entityResolver.getChildren(appChildComponentTemplate.getCustomAttributes()));
+ }
}
protected <T extends Entity> void initEntity(ManagementContext mgmt, T entity, EntitySpec<T> spec) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/c43eb16f/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/WrapAppTest.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/WrapAppTest.java b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/WrapAppTest.java
new file mode 100644
index 0000000..31e9a66
--- /dev/null
+++ b/usage/camp/src/test/java/io/brooklyn/camp/brooklyn/WrapAppTest.java
@@ -0,0 +1,75 @@
+package io.brooklyn.camp.brooklyn;
+
+import java.io.StringReader;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import brooklyn.entity.basic.StartableApplication;
+
+public class WrapAppTest extends AbstractYamlTest {
+ private static final String NO_WRAP_APP_IMPLICIT =
+ "name: Empty App\n" +
+ "services:\n" +
+ " - type: brooklyn.test.entity.TestApplication";
+
+ private static final String NO_WRAP_APP_EXPLICIT =
+ "name: Empty App\n" +
+ "wrappedApp: false\n" +
+ "services:\n" +
+ " - type: brooklyn.test.entity.TestApplication";
+
+ private static final String WRAP_APP_IMPLICIT =
+ "name: Empty App\n" +
+ "services:\n" +
+ " - type: brooklyn.test.entity.TestApplication\n" +
+ " - type: brooklyn.test.entity.TestApplication";
+
+ private static final String WRAP_APP_EXPLICIT =
+ "name: Empty App\n" +
+ "wrappedApp: true\n" +
+ "services:\n" +
+ " - type: brooklyn.test.entity.TestApplication";
+
+ private static final String WRAP_ENTITY =
+ "name: Empty App\n" +
+ "services:\n" +
+ " - type: brooklyn.test.entity.TestEntity";
+
+ @Test
+ public void testNoWrapAppImplicit() throws Exception {
+ StartableApplication app = createApp(NO_WRAP_APP_IMPLICIT);
+ Assert.assertTrue(app.getChildren().size() == 0);
+ }
+
+ @Test
+ public void testNoWrapAppExplicit() throws Exception {
+ StartableApplication app = createApp(NO_WRAP_APP_EXPLICIT);
+ Assert.assertTrue(app.getChildren().size() == 0);
+ }
+
+ @Test
+ public void testWrapAppImplicit() throws Exception {
+ StartableApplication app = createApp(WRAP_APP_IMPLICIT);
+ Assert.assertTrue(app.getChildren().size() == 2);
+ }
+
+ @Test
+ public void testWrapAppExplicit() throws Exception {
+ StartableApplication app = createApp(WRAP_APP_EXPLICIT);
+ Assert.assertTrue(app.getChildren().size() == 1);
+ }
+
+ @Test
+ public void testWrapEntity() throws Exception {
+ StartableApplication app = createApp(WRAP_ENTITY);
+ Assert.assertTrue(app.getChildren().size() == 1);
+ }
+
+ private StartableApplication createApp(String yaml) throws Exception {
+ StringReader in = new StringReader(yaml);
+ StartableApplication app = (StartableApplication)createAndStartApplication(in);
+ in.close();
+ return app;
+ }
+}