You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sv...@apache.org on 2016/04/06 16:22:16 UTC

[1/2] brooklyn-server git commit: BROOKLYN-248: fix location displayName inheritance

Repository: brooklyn-server
Updated Branches:
  refs/heads/master 3f8171dc8 -> dc6a313d7


BROOKLYN-248: fix location displayName inheritance


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

Branch: refs/heads/master
Commit: 4e2114d6ebaec4aade56a3b67c83bd0acf26c70c
Parents: cce75a1
Author: Aled Sage <al...@gmail.com>
Authored: Wed Apr 6 11:09:45 2016 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Apr 6 14:04:43 2016 +0100

----------------------------------------------------------------------
 .../brooklyn/spi/creation/CampResolver.java     |  16 +-
 .../camp/brooklyn/ApplicationsYamlTest.java     | 142 +++++++++++++++
 .../brooklyn/catalog/CatalogYamlAppTest.java    |   6 +-
 .../catalog/CatalogYamlLocationTest.java        | 172 +++++++++++++++++++
 4 files changed, 332 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4e2114d6/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
index 5639945..3813476 100644
--- a/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
+++ b/camp/camp-brooklyn/src/main/java/org/apache/brooklyn/camp/brooklyn/spi/creation/CampResolver.java
@@ -25,6 +25,7 @@ import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.EntitySpec;
 import org.apache.brooklyn.api.internal.AbstractBrooklynObjectSpec;
 import org.apache.brooklyn.api.location.Location;
+import org.apache.brooklyn.api.location.LocationSpec;
 import org.apache.brooklyn.api.mgmt.ManagementContext;
 import org.apache.brooklyn.api.mgmt.classloading.BrooklynClassLoadingContext;
 import org.apache.brooklyn.api.policy.Policy;
@@ -116,9 +117,18 @@ class CampResolver {
 
         ((AbstractBrooklynObjectSpec<?, ?>)spec).catalogItemIdIfNotNull(item.getId());
 
-        if (Strings.isBlank( ((AbstractBrooklynObjectSpec<?, ?>)spec).getDisplayName() ))
-            ((AbstractBrooklynObjectSpec<?, ?>)spec).displayName(item.getDisplayName());
-
+        if (spec instanceof EntitySpec) {
+            if (Strings.isBlank( ((AbstractBrooklynObjectSpec<?, ?>)spec).getDisplayName() )) {
+                ((AbstractBrooklynObjectSpec<?, ?>)spec).displayName(item.getDisplayName());
+            }
+        } else {
+            // See https://issues.apache.org/jira/browse/BROOKLYN-248, and the tests in 
+            // ApplicationYamlTest and CatalogYamlLocationTest.
+            if (Strings.isNonBlank(item.getDisplayName())) {
+                ((AbstractBrooklynObjectSpec<?, ?>)spec).displayName(item.getDisplayName());
+            }
+        }
+        
         return spec;
     }
  

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4e2114d6/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ApplicationsYamlTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ApplicationsYamlTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ApplicationsYamlTest.java
index 374df13..979dadc 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ApplicationsYamlTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/ApplicationsYamlTest.java
@@ -25,6 +25,8 @@ import static org.testng.Assert.assertTrue;
 import org.apache.brooklyn.api.entity.Application;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.camp.brooklyn.TestSensorAndEffectorInitializer.TestConfigurableInitializer;
+import org.apache.brooklyn.camp.brooklyn.catalog.CatalogYamlLocationTest;
+import org.apache.brooklyn.core.entity.EntityInternal;
 import org.apache.brooklyn.core.mgmt.EntityManagementUtils;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
@@ -36,6 +38,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 
 @Test
@@ -228,6 +232,144 @@ public class ApplicationsYamlTest extends AbstractYamlTest {
         assertDoesNotWrap(app, BasicApplication.class, "catalogServiceLevel");
     }
 
+    // FIXME Fails with name "My App 1" rather than the overridden value. 
+    // See discussion in https://issues.apache.org/jira/browse/BROOKLYN-248
+    @Test(groups="WIP")
+    public void testTypeInheritance() throws Exception {
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  items:",
+                "  - id: app1",
+                "    name: My App 1",
+                "    item:",
+                "      type: " + BasicApplication.class.getName(),
+                "      brooklyn.config:",
+                "        mykey1: myval1",
+                "        mykey1b: myval1b",
+                "  - id: app2",
+                "    name: My App 2",
+                "    item:",
+                "      type: app1",
+                "      brooklyn.config:",
+                "        mykey1: myvalOverridden",
+                "        mykey2: myval2");
+        
+        addCatalogItems(yaml);
+        Entity app1 = createAndStartApplication("services: [ {type: app1} ]");
+        assertDoesNotWrap(app1, BasicApplication.class, "My App 1");
+        CatalogYamlLocationTest.assertContainsAll(((EntityInternal)app1).config().getBag().getAllConfig(), ImmutableMap.of("mykey1", "myval1", "mykey1b", "myval1b"));
+
+        Entity app2 = createAndStartApplication("services: [ {type: app2} ]");
+        assertDoesNotWrap(app2, BasicApplication.class, "My App 2");
+        CatalogYamlLocationTest.assertContainsAll(((EntityInternal)app2).config().getBag().getAllConfig(), ImmutableMap.of("mykey1", "myvalOverridden", "mykey1b", "myval1b", "mykey2", "myval2"));
+    }
+    
+    // FIXME Fails for app3b, which gets the name "My name within item 3a" rather than the 
+    // overridden value. See discussion in https://issues.apache.org/jira/browse/BROOKLYN-248
+    @Test(groups="WIP")
+    public void testNamePrecedence() throws Exception {
+        String yaml1 = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  name: My name in top-level metadata",
+                "  items:",
+                "  - id: app1",
+                "    name: My name in item metadata",
+                "    item:",
+                "      type: " + BasicApplication.class.getName(),
+                "      name: My name within item");
+
+        String yaml2 = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  name: My name in top-level metadata",
+                "  items:",
+                "  - id: app2",
+                "    item:",
+                "      type: " + BasicApplication.class.getName(),
+                "      name: My name within item");
+
+        String yaml3 = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  items:",
+                "  - id: app3a",
+                "    name: My name in item 3a metadata",
+                "    item:",
+                "      type: " + BasicApplication.class.getName(),
+                "      name: My name within item 3a",
+                "  items:",
+                "  - id: app3b",
+                "    item:",
+                "      type: app3a",
+                "      name: My name within item 3b");
+        
+        addCatalogItems(yaml1);
+        addCatalogItems(yaml2);
+        addCatalogItems(yaml3);
+
+        Entity app1 = createAndStartApplication("services: [ {type: app1} ]");
+        assertDoesNotWrap(app1, BasicApplication.class, "My name within item");
+
+        Entity app2 = createAndStartApplication("services: [ {type: app2} ]");
+        assertDoesNotWrap(app2, BasicApplication.class, "My name within item");
+
+        Entity app3b = createAndStartApplication("services: [ {type: app3b} ]");
+        assertDoesNotWrap(app3b, BasicApplication.class, "My name within item 3b");
+    }
+    
+    @Test
+    public void testNameInCatalogMetadata() throws Exception {
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  name: My name in top-level",
+                "  items:",
+                "  - id: app1",
+                "    item:",
+                "      type: " + BasicApplication.class.getName());
+        
+        addCatalogItems(yaml);
+
+        Entity app1 = createAndStartApplication("services: [ {type: app1} ]");
+        assertDoesNotWrap(app1, BasicApplication.class, "My name in top-level");
+    }
+    
+    @Test
+    public void testNameInItemMetadata() throws Exception {
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  items:",
+                "  - id: app1",
+                "    name: My name in item metadata",
+                "    item:",
+                "      type: " + BasicApplication.class.getName());
+        
+        addCatalogItems(yaml);
+
+        Entity app1 = createAndStartApplication("services: [ {type: app1} ]");
+        assertDoesNotWrap(app1, BasicApplication.class, "My name in item metadata");
+    }
+    
+    @Test
+    public void testNameWithinItem() throws Exception {
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  items:",
+                "  - id: app1",
+                "    item:",
+                "      type: " + BasicApplication.class.getName(),
+                "      name: My name within item");
+        
+        addCatalogItems(yaml);
+
+        Entity app1 = createAndStartApplication("services: [ {type: app1} ]");
+        assertDoesNotWrap(app1, BasicApplication.class, "My name within item");
+    }
+    
     @Override
     protected Logger getLogger() {
         return log;

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4e2114d6/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java
index f4e58be..2deeb3d 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlAppTest.java
@@ -21,10 +21,14 @@ package org.apache.brooklyn.camp.brooklyn.catalog;
 import org.testng.annotations.Test;
 
 import org.apache.brooklyn.camp.brooklyn.AbstractYamlTest;
+import org.apache.brooklyn.camp.brooklyn.ApplicationsYamlTest;
 import org.apache.brooklyn.core.mgmt.internal.LocalManagementContext;
 import org.apache.brooklyn.core.test.entity.LocalManagementContextForTests;
 
-
+/**
+ * Also see related tests in {@link ApplicationsYamlTest}.
+ * TODO Not clear what the difference is between these two test classes!
+ */
 public class CatalogYamlAppTest extends AbstractYamlTest {
 
     @Override

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/4e2114d6/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
----------------------------------------------------------------------
diff --git a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
index 9dd9118..ae269a4 100644
--- a/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
+++ b/camp/camp-brooklyn/src/test/java/org/apache/brooklyn/camp/brooklyn/catalog/CatalogYamlLocationTest.java
@@ -18,11 +18,14 @@
  */
 package org.apache.brooklyn.camp.brooklyn.catalog;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.location.Location;
@@ -46,7 +49,9 @@ import org.testng.Assert;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
@@ -180,6 +185,173 @@ public class CatalogYamlLocationTest extends AbstractYamlTest {
         deleteCatalogEntity(symbolicName);
     }
     
+    // See https://issues.apache.org/jira/browse/BROOKLYN-248
+    @Test
+    public void testTypeInheritance() throws Exception {
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  itemType: location",
+                "  items:",
+                "  - id: loc1",
+                "    name: My Loc 1",
+                "    item:",
+                "      type: localhost",
+                "      brooklyn.config:",
+                "        mykey1: myval1",
+                "        mykey1b: myval1b",
+                "  - id: loc2",
+                "    name: My Loc 2",
+                "    item:",
+                "      type: loc1",
+                "      brooklyn.config:",
+                "        mykey1: myvalOverridden",
+                "        mykey2: myval2");
+        
+        addCatalogItems(yaml);
+
+        Map<String, LocationDefinition> defs = mgmt().getLocationRegistry().getDefinedLocations();
+        LocationDefinition def1 = checkNotNull(defs.get("loc1"), "loc1 missing; has %s", defs.keySet());
+        LocationDefinition def2 = checkNotNull(defs.get("loc2"), "loc2 missing; has %s", defs.keySet());
+        LocationSpec<? extends Location> spec1 = mgmt().getLocationRegistry().getLocationSpec(def1).get();
+        LocationSpec<? extends Location> spec2 = mgmt().getLocationRegistry().getLocationSpec(def2).get();
+        
+        assertEquals(spec1.getCatalogItemId(), "loc1:0.1.2");
+        assertEquals(spec1.getDisplayName(), "My Loc 1");
+        assertContainsAll(spec1.getFlags(), ImmutableMap.of("mykey1", "myval1", "mykey1b", "myval1b"));
+        assertEquals(spec2.getCatalogItemId(), "loc2:0.1.2");
+        assertEquals(spec2.getDisplayName(), "My Loc 2");
+        assertContainsAll(spec2.getFlags(), ImmutableMap.of("mykey1", "myvalOverridden", "mykey1b", "myval1b", "mykey2", "myval2"));
+    }
+    
+    // TODO Debatable whether loc1/loc2 should use "My name within item" instead (which was Aled's 
+    // initial expectation). That would be more consistent with the way entities behave - see
+    // {@link ApplicationYamlTest#testNamePrecedence()}.
+    // See discussion in https://issues.apache.org/jira/browse/BROOKLYN-248.
+    @Test
+    public void testNamePrecedence() throws Exception {
+        String yaml1 = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  itemType: location",
+                "  name: My name in top-level metadata",
+                "  items:",
+                "  - id: loc1",
+                "    name: My name in item metadata",
+                "    item:",
+                "      type: localhost",
+                "      name: My name within item");
+
+        String yaml2 = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  itemType: location",
+                "  name: My name in top-level metadata",
+                "  items:",
+                "  - id: loc2",
+                "    item:",
+                "      type: localhost",
+                "      name: My name within item");
+
+        String yaml3 = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  itemType: location",
+                "  items:",
+                "  - id: loc3a",
+                "    name: My name in item 3a metadata",
+                "    item:",
+                "      type: localhost",
+                "      name: My name within item 3a",
+                "  items:",
+                "  - id: loc3b",
+                "    item:",
+                "      type: loc3a",
+                "      name: My name within item 3b");
+        
+        addCatalogItems(yaml1);
+        addCatalogItems(yaml2);
+        addCatalogItems(yaml3);
+
+        LocationDefinition def1 = mgmt().getLocationRegistry().getDefinedLocations().get("loc1");
+        LocationSpec<? extends Location> spec1 = mgmt().getLocationRegistry().getLocationSpec(def1).get();
+        assertEquals(spec1.getDisplayName(), "My name in item metadata");
+        
+        LocationDefinition def2 = mgmt().getLocationRegistry().getDefinedLocations().get("loc2");
+        LocationSpec<? extends Location> spec2 = mgmt().getLocationRegistry().getLocationSpec(def2).get();
+        assertEquals(spec2.getDisplayName(), "My name in top-level metadata");
+        
+        LocationDefinition def3b = mgmt().getLocationRegistry().getDefinedLocations().get("loc3b");
+        LocationSpec<? extends Location> spec3b = mgmt().getLocationRegistry().getLocationSpec(def3b).get();
+        assertEquals(spec3b.getDisplayName(), "My name within item 3b");
+    }
+    
+    @Test
+    public void testNameInCatalogMetadata() throws Exception {
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  itemType: location",
+                "  name: My name in top-level",
+                "  items:",
+                "  - id: loc1",
+                "    item:",
+                "      type: localhost");
+        
+        addCatalogItems(yaml);
+
+        LocationDefinition def = mgmt().getLocationRegistry().getDefinedLocations().get("loc1");
+        LocationSpec<? extends Location> spec = mgmt().getLocationRegistry().getLocationSpec(def).get();
+        assertEquals(spec.getDisplayName(), "My name in top-level");
+    }
+    
+    @Test
+    public void testNameInItemMetadata() throws Exception {
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  itemType: location",
+                "  items:",
+                "  - id: loc1",
+                "    name: My name in item metadata",
+                "    item:",
+                "      type: localhost");
+        
+        addCatalogItems(yaml);
+
+        LocationDefinition def = mgmt().getLocationRegistry().getDefinedLocations().get("loc1");
+        LocationSpec<? extends Location> spec = mgmt().getLocationRegistry().getLocationSpec(def).get();
+        assertEquals(spec.getDisplayName(), "My name in item metadata");
+    }
+    
+    @Test
+    public void testNameWithinItem() throws Exception {
+        String yaml = Joiner.on("\n").join(
+                "brooklyn.catalog:",
+                "  version: 0.1.2",
+                "  itemType: location",
+                "  items:",
+                "  - id: loc1",
+                "    item:",
+                "      type: localhost",
+                "      name: My name within item");
+        
+        addCatalogItems(yaml);
+
+        LocationDefinition def = mgmt().getLocationRegistry().getDefinedLocations().get("loc1");
+        LocationSpec<? extends Location> spec = mgmt().getLocationRegistry().getLocationSpec(def).get();
+        assertEquals(spec.getDisplayName(), "My name within item");
+    }
+    
+    // TODO Can move to common test utility, if proves more generally useful
+    public static void assertContainsAll(Map<?,?> actual, Map<?,?> expectedSubset) {
+        String errMsg = "actual="+actual+"; expetedSubset="+expectedSubset;
+        for (Map.Entry<?, ?> entry : expectedSubset.entrySet()) {
+            assertTrue(actual.containsKey(entry.getKey()), errMsg);
+            assertEquals(actual.get(entry.getKey()), entry.getValue(), errMsg);
+        }
+    }
+    
     protected void runLaunchApplicationReferencingLocation(String locTypeInYaml, String locType) throws Exception {
         Entity app = createAndStartApplication(
             "name: simple-app-yaml",


[2/2] brooklyn-server git commit: Closes #104

Posted by sv...@apache.org.
Closes #104

BROOKLYN-248: fix location displayName inheritance


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

Branch: refs/heads/master
Commit: dc6a313d79c5f38968c7eea65dde3a3fc05e3b89
Parents: 3f8171d 4e2114d
Author: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Authored: Wed Apr 6 17:21:33 2016 +0300
Committer: Svetoslav Neykov <sv...@cloudsoftcorp.com>
Committed: Wed Apr 6 17:21:33 2016 +0300

----------------------------------------------------------------------
 .../brooklyn/spi/creation/CampResolver.java     |  16 +-
 .../camp/brooklyn/ApplicationsYamlTest.java     | 142 +++++++++++++++
 .../brooklyn/catalog/CatalogYamlAppTest.java    |   6 +-
 .../catalog/CatalogYamlLocationTest.java        | 172 +++++++++++++++++++
 4 files changed, 332 insertions(+), 4 deletions(-)
----------------------------------------------------------------------