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/04/12 23:48:07 UTC
[2/3] incubator-brooklyn git commit: Better documentation and added
check suggested in review
Better documentation and added check suggested in review
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/1f6731ef
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/1f6731ef
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/1f6731ef
Branch: refs/heads/master
Commit: 1f6731ef0ebbb5ddc27859cba0295e5a1685c063
Parents: 303c388
Author: Andrew Kennedy <gr...@apache.org>
Authored: Thu Apr 9 14:09:36 2015 +0100
Committer: Andrew Kennedy <gr...@apache.org>
Committed: Thu Apr 9 14:13:52 2015 +0100
----------------------------------------------------------------------
.../BrooklynComponentTemplateResolver.java | 23 +++++++------
.../service/BrooklynServiceTypeResolver.java | 2 +-
.../service/CatalogServiceTypeResolver.java | 36 +++++++++++++++-----
.../service/ChefServiceTypeResolver.java | 4 +--
.../service/JavaServiceTypeResolver.java | 9 +++++
.../creation/service/ServiceTypeResolver.java | 30 ++++++++++++++++
6 files changed, 83 insertions(+), 21 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/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 37fccf8..67e5af1 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
@@ -28,6 +28,7 @@ import io.brooklyn.camp.spi.PlatformComponentTemplate;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.ServiceLoader;
import java.util.Set;
@@ -71,12 +72,8 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
/**
- * This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code brooklyn:}
- * to Brooklyn {@link EntitySpec} instances.
- * <p>
- * but TODO this should probably be done by {@link BrooklynEntityMatcher}
- * so we have a spec by the time we come to instantiate.
- * (currently privileges "brooklyn.*" key names are checked in both places!)
+ * This generates instances of a template resolver that use a {@link ServiceTypeResolver}
+ * to parse the {@code serviceType} line in the template.
*/
public class BrooklynComponentTemplateResolver {
@@ -118,11 +115,17 @@ public class BrooklynComponentTemplateResolver {
return findService(context, type);
}
+ // TODO This could be extended to support multiple prefixes per resolver and a 'best-match' algorithm
protected static ServiceTypeResolver findService(BrooklynClassLoadingContext context, String type) {
- String prefix = Splitter.on(":").splitToList(type).get(0);
- ServiceLoader<ServiceTypeResolver> loader = ServiceLoader.load(ServiceTypeResolver.class, context.getManagementContext().getCatalog().getRootClassLoader());
- for (ServiceTypeResolver resolver : loader) {
- if (prefix.equalsIgnoreCase(resolver.getTypePrefix())) return resolver;
+ if (type.indexOf(':') != -1) {
+ String prefix = Splitter.on(":").splitToList(type).get(0);
+ ServiceLoader<ServiceTypeResolver> loader = ServiceLoader.load(ServiceTypeResolver.class,
+ context.getManagementContext().getCatalog().getRootClassLoader());
+ for (ServiceTypeResolver resolver : loader) {
+ if (prefix.equals(resolver.getTypePrefix())) {
+ return resolver;
+ }
+ }
}
return null;
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java
index 3528cee..2fd134a 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/BrooklynServiceTypeResolver.java
@@ -39,7 +39,7 @@ import brooklyn.util.text.Strings;
*/
public class BrooklynServiceTypeResolver implements ServiceTypeResolver {
- private static final Logger log = LoggerFactory.getLogger(ServiceTypeResolver.class);
+ private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class);
@Override
public String getTypePrefix() { return DEFAULT_TYPE_PREFIX; }
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java
index 4b33649..d082b13 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/CatalogServiceTypeResolver.java
@@ -20,21 +20,43 @@ package io.brooklyn.camp.brooklyn.spi.creation.service;
import io.brooklyn.camp.spi.PlatformComponentTemplate;
+import java.util.Map;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import brooklyn.entity.basic.VanillaSoftwareProcess;
+import brooklyn.entity.brooklynnode.BrooklynNode;
import brooklyn.entity.group.DynamicCluster;
import brooklyn.entity.group.DynamicRegionsFabric;
+import brooklyn.entity.java.VanillaJavaApp;
import brooklyn.entity.proxying.EntitySpec;
+import com.google.common.base.CaseFormat;
+import com.google.common.base.Converter;
+import com.google.common.collect.ImmutableMap;
+
/**
* This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code catalog:}
* to Brooklyn {@link EntitySpec} instances.
*/
public class CatalogServiceTypeResolver extends BrooklynServiceTypeResolver {
- private static final Logger log = LoggerFactory.getLogger(ServiceTypeResolver.class);
+ private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class);
+
+ // TODO currently a hardcoded list of aliases; would like that to come from mgmt somehow
+ private static final Map<String, String> CATALOG_TYPES = ImmutableMap.<String, String>builder()
+ .put("cluster", DynamicCluster.class.getName())
+ .put("fabric", DynamicRegionsFabric.class.getName())
+ .put("vanilla", VanillaSoftwareProcess.class.getName())
+ .put("software-process", VanillaSoftwareProcess.class.getName())
+ .put("java-app", VanillaJavaApp.class.getName())
+ .put("brooklyn-node", BrooklynNode.class.getName())
+ .put("web-app-cluster","brooklyn.entity.webapp.ControlledDynamicWebAppCluster")
+ .build();
+
+ // Allow catalog-type or CatalogType as service type string
+ private static final Converter<String, String> FMT = CaseFormat.LOWER_HYPHEN.converterTo(CaseFormat.UPPER_CAMEL);
@Override
public String getTypePrefix() { return "catalog"; }
@@ -44,13 +66,11 @@ public class CatalogServiceTypeResolver extends BrooklynServiceTypeResolver {
String type = super.getBrooklynType(serviceType);
if (type == null) return null;
- // TODO currently a hardcoded list of aliases; would like that to come from mgmt somehow
- if (type.equals("cluster") || type.equals("Cluster")) return DynamicCluster.class.getName();
- if (type.equals("fabric") || type.equals("Fabric")) return DynamicRegionsFabric.class.getName();
- if (type.equals("vanilla") || type.equals("Vanilla")) return VanillaSoftwareProcess.class.getName();
- if (type.equals("web-app-cluster") || type.equals("WebAppCluster"))
- // TODO use service discovery; currently included as string to avoid needing a reference to it
- return "brooklyn.entity.webapp.ControlledDynamicWebAppCluster";
+ for (String check : CATALOG_TYPES.keySet()) {
+ if (type.equals(check) || type.equals(FMT.convert(check))) {
+ return CATALOG_TYPES.get(check);
+ }
+ }
return type;
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java
index 9f266e5..da7be21 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ChefServiceTypeResolver.java
@@ -37,7 +37,7 @@ import brooklyn.util.text.Strings;
*/
public class ChefServiceTypeResolver extends BrooklynServiceTypeResolver {
- private static final Logger log = LoggerFactory.getLogger(ServiceTypeResolver.class);
+ private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class);
@Override
public String getTypePrefix() { return "chef"; }
@@ -47,7 +47,7 @@ public class ChefServiceTypeResolver extends BrooklynServiceTypeResolver {
return ChefEntity.class.getName();
}
- // chef: items are not in catalog
+ /** Chef items are not in the catalog. */
@Override
public CatalogItem<Entity, EntitySpec<?>> getCatalogItem(BrooklynComponentTemplateResolver resolver, String serviceType) {
return null;
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java
index 7c30c6a..f348ea8 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/JavaServiceTypeResolver.java
@@ -18,12 +18,21 @@
*/
package io.brooklyn.camp.brooklyn.spi.creation.service;
+import io.brooklyn.camp.spi.PlatformComponentTemplate;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import brooklyn.entity.proxying.EntitySpec;
+
/**
* This converts {@link PlatformComponentTemplate} instances whose type is prefixed {@code java:}
* to Brooklyn {@link EntitySpec} instances.
*/
public class JavaServiceTypeResolver extends BrooklynServiceTypeResolver {
+ private static final Logger LOG = LoggerFactory.getLogger(ServiceTypeResolver.class);
+
@Override
public String getTypePrefix() { return "java"; }
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/1f6731ef/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java
----------------------------------------------------------------------
diff --git a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java
index 74c7990..3a96a89 100644
--- a/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java
+++ b/usage/camp/src/main/java/io/brooklyn/camp/brooklyn/spi/creation/service/ServiceTypeResolver.java
@@ -18,17 +18,40 @@
*/
package io.brooklyn.camp.brooklyn.spi.creation.service;
+import java.util.ServiceLoader;
+
import io.brooklyn.camp.brooklyn.spi.creation.BrooklynComponentTemplateResolver;
import brooklyn.catalog.CatalogItem;
import brooklyn.entity.Entity;
import brooklyn.entity.proxying.EntitySpec;
+/**
+ * Resolves and decorates {@link EntitySpec entity specifications} based on the {@code serviceType} in a template.
+ * <p>
+ * The {@link #getTypePrefix()} method returns a string that should match the beginning of the
+ * service type. The resolver implementation will use the rest of the service type information
+ * to create and decorate an approprate {@link EntitySpec entity}.
+ * <p>
+ * The resolvers are loaded using the {@link ServiceLoader} mechanism, allowing external libraries
+ * to add extra service type implementations that will be picked up at runtime.
+ *
+ * @see BrooklynServiceTypeResolver
+ * @see ChefServiceTypeResolver
+ */
public interface ServiceTypeResolver {
String DEFAULT_TYPE_PREFIX = "brooklyn";
+ /**
+ * The service type prefix the resolver is responsible for.
+ */
String getTypePrefix();
+ /**
+ * The name of the Java type that Brooklyn will instantiate to create the
+ * service. This can be generated from parts of the service type information
+ * or may be a fixed value.
+ */
String getBrooklynType(String serviceType);
/**
@@ -38,6 +61,13 @@ public interface ServiceTypeResolver {
*/
CatalogItem<Entity, EntitySpec<?>> getCatalogItem(BrooklynComponentTemplateResolver resolver, String serviceType);
+ /**
+ * Takes the provided {@link EntitySpec} and decorates it appropriately for the service type.
+ * <p>
+ * This includes setting configuration and adding policies, enrichers and initializers.
+ *
+ * @see BrooklynServiceTypeResolver#decorateSpec(BrooklynComponentTemplateResolver, EntitySpec)
+ */
<T extends Entity> void decorateSpec(BrooklynComponentTemplateResolver resolver, EntitySpec<T> spec);
}