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 2017/10/27 10:57:05 UTC

[3/7] brooklyn-server git commit: Add support for `force-remove-bundles: *`

Add support for `force-remove-bundles: *`

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

Branch: refs/heads/master
Commit: 54ecbf9605154e6f134a73578b6300bcba614a65
Parents: 22fda0d
Author: Aled Sage <al...@gmail.com>
Authored: Wed Oct 25 08:32:50 2017 +0100
Committer: Aled Sage <al...@gmail.com>
Committed: Wed Oct 25 08:37:58 2017 +0100

----------------------------------------------------------------------
 .../core/typereg/BundleUpgradeParser.java       | 30 ++++++++++--
 .../core/typereg/BundleUpgradeParserTest.java   | 51 ++++++++++++++++----
 .../util/text/BrooklynVersionSyntax.java        | 14 ++++++
 .../util/text/BrooklynVersionSyntaxTest.java    | 23 +++++++++
 4 files changed, 104 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/54ecbf96/core/src/main/java/org/apache/brooklyn/core/typereg/BundleUpgradeParser.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BundleUpgradeParser.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BundleUpgradeParser.java
index 96cd2b6..9766514 100644
--- a/core/src/main/java/org/apache/brooklyn/core/typereg/BundleUpgradeParser.java
+++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BundleUpgradeParser.java
@@ -213,18 +213,33 @@ public class BundleUpgradeParser {
     }
 
     public static CatalogUpgrades parseBundleManifestForCatalogUpgrades(Bundle bundle) {
-        // TODO Add support for "*" for "force-remove-bundles", to indicate all lower-versioned 
-        // bundles with the same symbolic name as this bundle. Also add support for the other 
-        // options described in the proposal:
+        // TODO Add support for the other options described in the proposal:
         //   https://docs.google.com/document/d/1Lm47Kx-cXPLe8BO34-qrL3ZMPosuUHJILYVQUswEH6Y/edit#
         //   section "Bundle Upgrade Metadata"
         
         Dictionary<String, String> headers = bundle.getHeaders();
         return CatalogUpgrades.builder()
                 .removedLegacyItems(parseVersionRangedNameList(headers.get(MANIFEST_HEADER_FORCE_REMOVE_LEGACY_ITEMS), false))
-                .removedBundles(parseVersionRangedNameList(headers.get(MANIFEST_HEADER_FORCE_REMOVE_BUNDLES), false))
+                .removedBundles(parseForceRemoveBundlesHeader(bundle, headers.get(MANIFEST_HEADER_FORCE_REMOVE_BUNDLES)))
                 .build();
     }
+
+    @VisibleForTesting
+    static List<VersionRangedName> parseForceRemoveBundlesHeader(Bundle context, String input) {
+        if (input == null) return ImmutableList.of();
+        if (stripQuotes(input).equals("*")) {
+            String bundleVersion = context.getVersion().toString();
+            String maxVersion;
+            if (BrooklynVersionSyntax.isSnapshot(bundleVersion)) {
+                maxVersion = BrooklynVersionSyntax.stripSnapshot(bundleVersion);
+            } else {
+                maxVersion = bundleVersion;
+            }
+            return ImmutableList.of(new VersionRangedName(context.getSymbolicName(), "[0,"+maxVersion+")"));
+        } else {
+            return parseVersionRangedNameList(input, false);
+        }
+    }
     
     @VisibleForTesting
     static List<VersionRangedName> parseVersionRangedNameList(String input, boolean singleVersionIsOsgiRange) {
@@ -242,4 +257,11 @@ public class BundleUpgradeParser {
         }
         return versionedItems;
     }
+    
+    private static String stripQuotes(String input) {
+        String quoteChars = QuotedStringTokenizer.DEFAULT_QUOTE_CHARS;
+        boolean quoted = (input.length() >= 2) && quoteChars.contains(input.substring(0, 1))
+                && quoteChars.contains(input.substring(input.length() - 1));
+        return (quoted ? input.substring(1, input.length() - 1) : input);
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/54ecbf96/core/src/test/java/org/apache/brooklyn/core/typereg/BundleUpgradeParserTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/brooklyn/core/typereg/BundleUpgradeParserTest.java b/core/src/test/java/org/apache/brooklyn/core/typereg/BundleUpgradeParserTest.java
index 143649a..7573bee 100644
--- a/core/src/test/java/org/apache/brooklyn/core/typereg/BundleUpgradeParserTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/typereg/BundleUpgradeParserTest.java
@@ -28,7 +28,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.brooklyn.api.catalog.CatalogItem;
-import org.apache.brooklyn.core.typereg.BundleUpgradeParser;
 import org.apache.brooklyn.core.typereg.BundleUpgradeParser.CatalogUpgrades;
 import org.apache.brooklyn.core.typereg.BundleUpgradeParser.VersionRangedName;
 import org.apache.brooklyn.test.Asserts;
@@ -46,6 +45,7 @@ import com.google.common.collect.ImmutableMap;
 public class BundleUpgradeParserTest {
 
     private VersionRange from0lessThan1 = new VersionRange('[', Version.valueOf("0"), Version.valueOf("1.0.0"), ')');
+    private VersionRange from0lessThan1_2_3 = new VersionRange('[', Version.valueOf("0"), Version.valueOf("1.2.3"), ')');
     private VersionRange exactly0dot1 = new VersionRange('[', Version.valueOf("0.1.0"), Version.valueOf("0.1.0"), ']');
     private VersionRangedName fooFrom0lessThan1 = new VersionRangedName("foo", from0lessThan1);
     private VersionRangedName barFrom0lessThan1 = new VersionRangedName("bar", from0lessThan1);
@@ -82,28 +82,49 @@ public class BundleUpgradeParserTest {
     @Test
     public void testParseSingleQuotedVal() throws Exception {
         String input = "\"foo:[0,1.0.0)\"";
-        assertParsed(input, ImmutableList.of(fooFrom0lessThan1));
+        assertParseList(input, ImmutableList.of(fooFrom0lessThan1));
     }
     
     @Test
     public void testParseSingleQuotedValWithNestedQuotes() throws Exception {
         String input = "\"foo:[0,\"1.0.0\")\"";
-        assertParsed(input, ImmutableList.of(fooFrom0lessThan1));
+        assertParseList(input, ImmutableList.of(fooFrom0lessThan1));
     }
     
     @Test
     public void testParseMultipleVals() throws Exception {
         String input = "\"foo:[0,1.0.0)\",\"bar:[0,1.0.0)\"";
-        assertParsed(input, ImmutableList.of(fooFrom0lessThan1, barFrom0lessThan1));
+        assertParseList(input, ImmutableList.of(fooFrom0lessThan1, barFrom0lessThan1));
     }
 
     @Test
     public void testParseValWithExactVersion() throws Exception {
         String input = "\"foo:0.1.0\"";
-        assertParsed(input, ImmutableList.of(new VersionRangedName("foo", exactly0dot1)));
+        assertParseList(input, ImmutableList.of(new VersionRangedName("foo", exactly0dot1)));
     }
 
     @Test
+    public void testParseForceRemoveBundlesHeader() throws Exception {
+        Bundle bundle = Mockito.mock(Bundle.class);
+        Mockito.when(bundle.getSymbolicName()).thenReturn("foo.bar");
+        Mockito.when(bundle.getVersion()).thenReturn(Version.valueOf("1.2.3"));
+        
+        assertParseForceRemoveBundlesHeader(bundle, "\"foo:0.1.0\"", ImmutableList.of(new VersionRangedName("foo", exactly0dot1)));
+        assertParseForceRemoveBundlesHeader(bundle, "\"*\"", ImmutableList.of(new VersionRangedName("foo.bar", from0lessThan1_2_3)));
+        assertParseForceRemoveBundlesHeader(bundle, "*", ImmutableList.of(new VersionRangedName("foo.bar", from0lessThan1_2_3)));
+    }
+    
+    @Test
+    public void testParseForceRemoveBundlesHeaderWithSnapshot() throws Exception {
+        Bundle bundle = Mockito.mock(Bundle.class);
+        Mockito.when(bundle.getSymbolicName()).thenReturn("foo.bar");
+        Mockito.when(bundle.getVersion()).thenReturn(Version.valueOf("1.2.3.SNAPSHOT"));
+        
+        assertParseForceRemoveBundlesHeader(bundle, "\"*\"", ImmutableList.of(new VersionRangedName("foo.bar", from0lessThan1_2_3)));
+        assertParseForceRemoveBundlesHeader(bundle, "*", ImmutableList.of(new VersionRangedName("foo.bar", from0lessThan1_2_3)));
+    }
+    
+    @Test
     public void testParseBundleEmptyManifest() throws Exception {
         Bundle bundle = newMockBundle(ImmutableMap.of());
         
@@ -147,15 +168,25 @@ public class BundleUpgradeParserTest {
         return result;
     }
     
-    private void assertParsed(String input, List<VersionRangedName> expected) throws Exception {
+    private void assertParseList(String input, List<VersionRangedName> expected) throws Exception {
         List<VersionRangedName> actual = BundleUpgradeParser.parseVersionRangedNameList(input, false);
-        assertEquals(actual.size(), expected.size(), "actual="+actual); 
+        assertListsEqual(actual, expected);
+    }
+    
+    private void assertParseForceRemoveBundlesHeader(Bundle bundle, String input, List<VersionRangedName> expected) throws Exception {
+        List<VersionRangedName> actual = BundleUpgradeParser.parseForceRemoveBundlesHeader(bundle, input);
+        assertListsEqual(actual, expected);
+    }
+
+    private void assertListsEqual(List<VersionRangedName> actual, List<VersionRangedName> expected) throws Exception {
+        String errMsg = "actual="+actual;
+        assertEquals(actual.size(), expected.size(), errMsg); 
         for (int i = 0; i < actual.size(); i++) {
-            assertEquals(actual.get(i).getSymbolicName(), expected.get(i).getSymbolicName());
-            assertEquals(actual.get(i).getOsgiVersionRange(), expected.get(i).getOsgiVersionRange());
+            assertEquals(actual.get(i).getSymbolicName(), expected.get(i).getSymbolicName(), errMsg);
+            assertEquals(actual.get(i).getOsgiVersionRange(), expected.get(i).getOsgiVersionRange(), errMsg);
         }
     }
-    
+
     private void assertVersionRangedNameFails(String input, String expectedFailure, String... optionalOtherExpectedFailures) {
         try {
             VersionRangedName.fromString(input, false);

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/54ecbf96/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java b/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java
index 89262d5..6f23489 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/text/BrooklynVersionSyntax.java
@@ -225,4 +225,18 @@ public class BrooklynVersionSyntax {
         return version.toUpperCase().contains(SNAPSHOT);
     }
 
+    /**
+     * Returns the version without "SNAPSHOT" (normally this will return the next expected release version).
+     * For example, "1.0.0.SNAPSHOT" or "1.0.0-SNAPSHOT" becomes "1.0.0".
+     */
+    public static String stripSnapshot(String input) {
+        if (input==null) return input;
+        int stripIndex = input.toUpperCase().indexOf(SNAPSHOT);
+        if (stripIndex <= 0) return input;
+        char charBeforeSnapshot = input.charAt(stripIndex - 1);
+        if (charBeforeSnapshot == '.' || charBeforeSnapshot == '_' || charBeforeSnapshot == '-') {
+            stripIndex--;
+        }
+        return (stripIndex <= 0) ? input : input.substring(0, stripIndex);
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/54ecbf96/utils/common/src/test/java/org/apache/brooklyn/util/text/BrooklynVersionSyntaxTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/org/apache/brooklyn/util/text/BrooklynVersionSyntaxTest.java b/utils/common/src/test/java/org/apache/brooklyn/util/text/BrooklynVersionSyntaxTest.java
index 1bd8e3a..4fa02d6 100644
--- a/utils/common/src/test/java/org/apache/brooklyn/util/text/BrooklynVersionSyntaxTest.java
+++ b/utils/common/src/test/java/org/apache/brooklyn/util/text/BrooklynVersionSyntaxTest.java
@@ -107,6 +107,29 @@ public class BrooklynVersionSyntaxTest {
         assertOsgiVersionRange("(1.0.0-SNAPSHOT,2.0.0-SNAPSHOT]", "(1.0.0.SNAPSHOT,2.0.0.SNAPSHOT]");
     }
     
+    public void testIsSnapshot() {
+        Assert.assertTrue(BrooklynVersionSyntax.isSnapshot("1.0.0.SNAPSHOT"));
+        Assert.assertTrue(BrooklynVersionSyntax.isSnapshot("1.0.0.20171025_SNAPSHOT"));
+        Assert.assertTrue(BrooklynVersionSyntax.isSnapshot("1.0.0-SNAPSHOT"));
+        Assert.assertFalse(BrooklynVersionSyntax.isSnapshot("1.0.0"));
+    }
+
+    public void testStripSnapshot() {
+        assertStripSnapshot("1.0.0.SNAPSHOT", "1.0.0");
+        assertStripSnapshot("1.0.0-SNAPSHOT", "1.0.0");
+        assertStripSnapshot("1-SNAPSHOT", "1");
+        assertStripSnapshot("1.0.0.20171025_SNAPSHOT", "1.0.0.20171025");
+        assertStripSnapshot("1.0.0", "1.0.0");
+        
+        // for weird things, don't make them even weirder!
+        assertStripSnapshot("SNAPSHOT", "SNAPSHOT");
+        assertStripSnapshot("_SNAPSHOT", "_SNAPSHOT");
+    }
+
+    private void assertStripSnapshot(String input, String expected) {
+        Assert.assertEquals(BrooklynVersionSyntax.stripSnapshot(input), expected, "conversion to strip snapshot");
+    }
+    
     private void assertOsgiVersionRange(String input, String osgi) {
         Assert.assertEquals(BrooklynVersionSyntax.toValidOsgiVersionRange(input), osgi, "conversion to valid osgi range");
     }