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 2014/07/09 23:46:19 UTC
[06/50] git commit: extend brooklyn.catalog syntax to support name,
description, and icon_url, in addition to the registered-type/id
extend brooklyn.catalog syntax to support name, description, and icon_url, in addition to the registered-type/id
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/9b93d308
Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/9b93d308
Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/9b93d308
Branch: refs/heads/master
Commit: 9b93d30836eb57c3077e5a23c1d9c5305760c3f7
Parents: 0868c2f
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Jul 4 15:51:08 2014 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Jul 9 22:34:42 2014 +0100
----------------------------------------------------------------------
.../brooklyn/camp/spi/pdp/DeploymentPlan.java | 10 +++-
.../catalog/internal/BasicBrooklynCatalog.java | 60 +++++++++++++-------
.../rest/resources/CatalogResourceTest.java | 35 ++++++++----
.../brooklyn/util/collections/MutableMap.java | 7 +++
4 files changed, 76 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9b93d308/camp/camp-base/src/main/java/io/brooklyn/camp/spi/pdp/DeploymentPlan.java
----------------------------------------------------------------------
diff --git a/camp/camp-base/src/main/java/io/brooklyn/camp/spi/pdp/DeploymentPlan.java b/camp/camp-base/src/main/java/io/brooklyn/camp/spi/pdp/DeploymentPlan.java
index c11ab6b..fc14999 100644
--- a/camp/camp-base/src/main/java/io/brooklyn/camp/spi/pdp/DeploymentPlan.java
+++ b/camp/camp-base/src/main/java/io/brooklyn/camp/spi/pdp/DeploymentPlan.java
@@ -116,13 +116,17 @@ public class DeploymentPlan {
* Does not remove the attribute from the custom attribute map.
*/
@SuppressWarnings("unchecked")
- public <T> Maybe<T> getCustomAttribute(String attributeName, Class<T> type) {
+ public <T> Maybe<T> getCustomAttribute(String attributeName, Class<T> type, boolean throwIfTypeMismatch) {
Object attribute = customAttributes.get(attributeName);
if (attribute == null) {
return Maybe.absent("Custom attributes does not contain " + attributeName);
} else if (!type.isAssignableFrom(attribute.getClass())) {
- return Maybe.absent("Custom attribute " + attributeName + " is not of expected type: " +
- "expected=" + type.getName() + " actual=" + attribute.getClass().getName());
+ String message = "Custom attribute " + attributeName + " is not of expected type: " +
+ "expected=" + type.getName() + " actual=" + attribute.getClass().getName();
+ if (throwIfTypeMismatch) {
+ throw new IllegalArgumentException(message);
+ }
+ return Maybe.absent(message);
} else {
return Maybe.of((T) attribute);
}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9b93d308/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
index c6bc164..59d60da 100644
--- a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
+++ b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java
@@ -40,6 +40,7 @@ import brooklyn.catalog.CatalogItem;
import brooklyn.catalog.CatalogPredicates;
import brooklyn.config.BrooklynServerConfig;
import brooklyn.management.ManagementContext;
+import brooklyn.util.collections.MutableMap;
import brooklyn.util.exceptions.Exceptions;
import brooklyn.util.javalang.AggregateClassLoader;
import brooklyn.util.javalang.LoadedClassLoader;
@@ -207,42 +208,59 @@ public class BasicBrooklynCatalog implements BrooklynCatalog {
private CatalogItemDtoAbstract<?,?> getAbstractCatalogItem(String yaml) {
DeploymentPlan plan = makePlanFromYaml(yaml);
- String name = null;
CatalogLibrariesDto libraries = null;
- Maybe<Map> possibleCatalog = plan.getCustomAttribute("brooklyn.catalog", Map.class);
+ @SuppressWarnings("rawtypes")
+ Maybe<Map> possibleCatalog = plan.getCustomAttribute("brooklyn.catalog", Map.class, true);
+ MutableMap<String, Object> catalog = MutableMap.of();
if (possibleCatalog.isPresent()) {
- Map catalog = possibleCatalog.get();
- Map<String, Object> cast = (Map<String, Object>) possibleCatalog.get();
- if (catalog.containsKey("name") && catalog.get("name") != null) {
- name = String.valueOf(catalog.get("name"));
- }
- Object possibleLibraries = catalog.get("libraries");
- if (possibleLibraries != null) {
- if (possibleLibraries instanceof List) {
- libraries = CatalogLibrariesDto.fromList((List<?>) possibleLibraries);
- }
- }
+ @SuppressWarnings("unchecked")
+ Map<String, Object> catalog2 = (Map<String, Object>) possibleCatalog.get();
+ catalog.putAll(catalog2);
}
- // TODO #3 support version info
+ Maybe<Object> possibleLibraries = catalog.getMaybe("libraries");
+ if (possibleLibraries.isAbsent()) possibleLibraries = catalog.getMaybe("brooklyn.libraries");
+ if (possibleLibraries.isPresentAndNonNull()) {
+ if (!(possibleLibraries.get() instanceof List))
+ throw new IllegalArgumentException("Libraries should be a list, not "+possibleLibraries.get());
+ libraries = CatalogLibrariesDto.fromList((List<?>) possibleLibraries.get());
+ }
+ // TODO clear up the abundance of id, name, registered type, java type
+ String registeredTypeName = (String) catalog.getMaybe("id").orNull();
+ if (Strings.isBlank(registeredTypeName))
+ registeredTypeName = (String) catalog.getMaybe("name").orNull();
// take name from plan if not specified in brooklyn.catalog section not supplied
- if (Strings.isBlank(name)) {
- name = plan.getName();
- if (Strings.isBlank(name)) {
+ if (Strings.isBlank(registeredTypeName)) {
+ registeredTypeName = plan.getName();
+ if (Strings.isBlank(registeredTypeName)) {
if (plan.getServices().size()==1) {
Service svc = Iterables.getOnlyElement(plan.getServices());
- name = svc.getServiceType();
+ registeredTypeName = svc.getServiceType();
}
}
}
+ // TODO long-term: support applications / templates, policies
+
// build the catalog item from the plan (as CatalogItem<Entity> for now)
- // TODO applications / templates
- // TODO long-term support policies etc
+ CatalogEntityItemDto dto = CatalogItems.newEntityFromPlan(registeredTypeName, libraries, plan, yaml);
+
+ // and populate other fields
+ Maybe<Object> name = catalog.getMaybe("name");
+ if (name.isPresent()) dto.name = (String)name.get();
+
+ Maybe<Object> description = catalog.getMaybe("description");
+ if (description.isPresent()) dto.description = (String)description.get();
+
+ Maybe<Object> iconUrl = catalog.getMaybe("iconUrl");
+ if (iconUrl.isAbsent()) iconUrl = catalog.getMaybe("icon_url");
+ if (iconUrl.isPresent()) dto.iconUrl = (String)iconUrl.get();
+
+ // TODO #3 support version info
- return CatalogItems.newEntityFromPlan(name, libraries, plan, yaml);
+ return dto;
}
private DeploymentPlan makePlanFromYaml(String yaml) {
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9b93d308/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
----------------------------------------------------------------------
diff --git a/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java b/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
index e7e7f13..eff17d7 100644
--- a/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
+++ b/usage/rest-server/src/test/java/brooklyn/rest/resources/CatalogResourceTest.java
@@ -38,10 +38,12 @@ import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.testng.reporters.Files;
+import brooklyn.catalog.CatalogItem;
import brooklyn.policy.autoscaling.AutoScalerPolicy;
import brooklyn.rest.domain.CatalogEntitySummary;
import brooklyn.rest.domain.CatalogItemSummary;
import brooklyn.rest.testing.BrooklynRestResourceTest;
+import brooklyn.util.collections.MutableList;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.GenericType;
@@ -65,17 +67,18 @@ public class CatalogResourceTest extends BrooklynRestResourceTest {
@Test
public void testRegisterCustomEntity() {
String registeredTypeName = "my.catalog.app.id";
+ String bundleUrl = "http://myurl/my.jar";
String yaml =
"name: "+registeredTypeName+"\n"+
// FIXME name above should be unnecessary when brooklyn.catalog below is working
"brooklyn.catalog:\n"+
- "- id: " + registeredTypeName + "\n"+
- "- name: My Catalog App\n"+
- "- description: My description\n"+
- "- icon_url: classpath://path/to/myicon.jpg\n"+
- "- version: 0.1.2\n"+
- "- brooklyn.libraries:\n"+
- " - url: http://myurl/my.jar\n"+
+ " id: " + registeredTypeName + "\n"+
+ " name: My Catalog App\n"+
+ " description: My description\n"+
+ " icon_url: classpath://path/to/myicon.jpg\n"+
+ " version: 0.1.2\n"+
+ " libraries:\n"+
+ " - url: " + bundleUrl + "\n"+
"\n"+
"services:\n"+
"- type: brooklyn.test.entity.TestEntity\n";
@@ -95,11 +98,19 @@ public class CatalogResourceTest extends BrooklynRestResourceTest {
Assert.assertNotNull(entityItem.getPlanYaml());
Assert.assertTrue(entityItem.getPlanYaml().contains("brooklyn.test.entity.TestEntity"));
- // TODO @sjcorbett more checks, when brooklyn.catalog working
-// assertEquals(entityItem.getId(), registeredTypeName);
-// assertEquals(entityItem.getName(), "My Catalog App");
-// assertEquals(entityItem.getDescription(), "My description");
-// assertEquals(entityItem.getIconUrl(), "classpath://path/to/myicon.jpg");
+ assertEquals(entityItem.getId(), registeredTypeName);
+
+ // and internally let's check we have libraries
+ CatalogItem<?, ?> item = getManagementContext().getCatalog().getCatalogItem(registeredTypeName);
+ Assert.assertNotNull(item);
+ List<String> libs = item.getLibraries().getBundles();
+ assertEquals(libs, MutableList.of(bundleUrl));
+
+ // now let's check other things on the item
+ assertEquals(entityItem.getName(), "My Catalog App");
+ assertEquals(entityItem.getDescription(), "My description");
+ assertEquals(entityItem.getIconUrl(), "/v1/catalog/icon/my.catalog.app.id");
+ assertEquals(item.getIconUrl(), "classpath://path/to/myicon.jpg");
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/9b93d308/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java b/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java
index f38ba19..2d21d67 100644
--- a/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java
+++ b/utils/common/src/main/java/brooklyn/util/collections/MutableMap.java
@@ -25,6 +25,8 @@ import java.util.Map.Entry;
import javax.annotation.Nullable;
+import brooklyn.util.guava.Maybe;
+
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
@@ -129,6 +131,11 @@ public class MutableMap<K,V> extends LinkedHashMap<K,V> {
return this;
}
+ public Maybe<V> getMaybe(K key) {
+ if (containsKey(key)) return Maybe.of(get(key));
+ return Maybe.absent("No entry for key '"+key+"' in this map");
+ }
+
public ImmutableMap<K,V> toImmutable() {
return ImmutableMap.copyOf(this);
}