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);
     }