Repository: brooklyn-server Updated Branches: refs/heads/master d09b58f9f -> ce5ee7b86
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java index 664ddfe..9bc8e94 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/BrooklynMementoManifestImpl.java @@ -25,6 +25,7 @@ import java.util.Map; import org.apache.brooklyn.api.mgmt.rebind.mementos.BrooklynMementoManifest; import org.apache.brooklyn.api.mgmt.rebind.mementos.CatalogItemMemento; +import org.apache.brooklyn.api.mgmt.rebind.mementos.ManagedBundleMemento; import org.apache.brooklyn.api.objs.BrooklynObjectType; import com.google.common.collect.Maps; @@ -46,10 +47,12 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser protected final Map<String, String> enricherIdToType = Maps.newConcurrentMap(); protected final Map<String, String> feedIdToType = Maps.newConcurrentMap(); protected final Map<String, CatalogItemMemento> catalogItems = Maps.newConcurrentMap(); + protected final Map<String, ManagedBundleMemento> bundles = Maps.newConcurrentMap(); public Builder planeId(String planeId) { this.planeId = planeId; return this; } + /** @deprecated since 0.11.0; value is not used */ @Deprecated public Builder brooklynVersion(String val) { @@ -89,6 +92,12 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser public Builder catalogItem(CatalogItemMemento val) { catalogItems.put(val.getId(), val); return this; } + public Builder bundles(Map<String, ManagedBundleMemento> vals) { + bundles.putAll(vals); return this; + } + public Builder bundle(ManagedBundleMemento val) { + bundles.put(val.getId(), val); return this; + } public Builder putType(BrooklynObjectType type, String id, String javaType) { switch (type) { @@ -97,7 +106,9 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser case POLICY: return policy(id, javaType); case ENRICHER: return enricher(id, javaType); case FEED: return feed(id, javaType); - case CATALOG_ITEM: throw new IllegalArgumentException(type.toCamelCase()+" requires different parameters"); + case CATALOG_ITEM: + case MANAGED_BUNDLE: + throw new IllegalArgumentException(type.toCamelCase()+" requires different parameters"); case UNKNOWN: default: throw new IllegalArgumentException(type.toCamelCase()+" not supported"); @@ -116,6 +127,7 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser private final Map<String, String> enricherIdToType; private final Map<String, String> feedIdToType; private Map<String, CatalogItemMemento> catalogItems; + private Map<String, ManagedBundleMemento> bundles; private BrooklynMementoManifestImpl(Builder builder) { planeId = builder.planeId; @@ -125,6 +137,7 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser enricherIdToType = builder.enricherIdToType; feedIdToType = builder.feedIdToType; catalogItems = builder.catalogItems; + bundles = builder.bundles; } @Override @@ -171,6 +184,21 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser public Map<String, CatalogItemMemento> getCatalogItemMementos() { return Collections.unmodifiableMap(catalogItems); } + + @Override + public ManagedBundleMemento getBundle(String id) { + return bundles.get(id); + } + + @Override + public Collection<String> getBundleIds() { + return Collections.unmodifiableSet(bundles.keySet()); + } + + @Override + public Map<String, ManagedBundleMemento> getBundles() { + return Collections.unmodifiableMap(bundles); + } @Override public boolean isEmpty() { @@ -179,7 +207,8 @@ public class BrooklynMementoManifestImpl implements BrooklynMementoManifest, Ser policyIdToType.isEmpty() && enricherIdToType.isEmpty() && feedIdToType.isEmpty() && - catalogItems.isEmpty(); + catalogItems.isEmpty() && + bundles.isEmpty(); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java index da54080..fbf24b8 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/dto/MementosGenerators.java @@ -38,6 +38,7 @@ import org.apache.brooklyn.api.mgmt.rebind.mementos.EnricherMemento; import org.apache.brooklyn.api.mgmt.rebind.mementos.EntityMemento; import org.apache.brooklyn.api.mgmt.rebind.mementos.FeedMemento; import org.apache.brooklyn.api.mgmt.rebind.mementos.LocationMemento; +import org.apache.brooklyn.api.mgmt.rebind.mementos.ManagedBundleMemento; import org.apache.brooklyn.api.mgmt.rebind.mementos.Memento; import org.apache.brooklyn.api.mgmt.rebind.mementos.PolicyMemento; import org.apache.brooklyn.api.objs.BrooklynObject; @@ -48,6 +49,7 @@ import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.api.sensor.AttributeSensor.SensorPersistenceMode; import org.apache.brooklyn.api.sensor.Enricher; import org.apache.brooklyn.api.sensor.Feed; +import org.apache.brooklyn.api.typereg.ManagedBundle; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.catalog.internal.CatalogItemDo; import org.apache.brooklyn.core.enricher.AbstractEnricher; @@ -111,6 +113,8 @@ public class MementosGenerators { return newFeedMemento((Feed)instance); } else if (instance instanceof CatalogItem) { return newCatalogItemMemento((CatalogItem<?,?>) instance); + } else if (instance instanceof ManagedBundle) { + return newManagedBundleMemento((ManagedBundle) instance); } else { throw new IllegalArgumentException("Unexpected brooklyn type: "+(instance == null ? "null" : instance.getClass())+" ("+instance+")"); } @@ -442,6 +446,15 @@ public class MementosGenerators { return builder.build(); } + private static ManagedBundleMemento newManagedBundleMemento(ManagedBundle bundle) { + BasicManagedBundleMemento.Builder builder = BasicManagedBundleMemento.builder(); + populateBrooklynObjectMementoBuilder(bundle, builder); + builder.url(bundle.getUrl()) + .symbolicName(bundle.getSymbolicName()) + .version(bundle.getVersion()); + return builder.build(); + } + private static void populateBrooklynObjectMementoBuilder(BrooklynObject instance, AbstractMemento.Builder<?> builder) { if (Proxy.isProxyClass(instance.getClass())) { throw new IllegalStateException("Attempt to create memento from proxy "+instance+" (would fail with wrong type)"); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java index 74b8bb0..ce4a2bf 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/rebind/transformer/CompoundTransformer.java @@ -246,6 +246,7 @@ public class CompoundTransformer { Map<String, String> enrichers = MutableMap.copyOf(rawData.getEnrichers()); Map<String, String> feeds = MutableMap.copyOf(rawData.getFeeds()); Map<String, String> catalogItems = MutableMap.copyOf(rawData.getCatalogItems()); + Map<String, String> bundles = MutableMap.copyOf(rawData.getBundles()); // TODO @neykov asks whether transformers should be run in registration order, // rather than in type order. TBD. (would be an easy change.) @@ -303,6 +304,14 @@ public class CompoundTransformer { } catalogItems.keySet().removeAll(itemsToDelete); break; + case MANAGED_BUNDLE: + missing = Sets.difference(itemsToDelete, bundles.keySet()); + if (missing.size() > 0) { + LOG.warn("Unable to delete " + type + " id"+Strings.s(missing.size())+" ("+missing+"), " + + "because not found in persisted state (continuing)"); + } + bundles.keySet().removeAll(itemsToDelete); + break; case UNKNOWN: break; // no-op default: @@ -344,6 +353,11 @@ public class CompoundTransformer { entry.setValue(transformer.transform(entry.getValue())); } break; + case MANAGED_BUNDLE: + for (Map.Entry<String, String> entry : bundles.entrySet()) { + entry.setValue(transformer.transform(entry.getValue())); + } + break; case UNKNOWN: break; // no-op default: @@ -360,6 +374,7 @@ public class CompoundTransformer { .enrichers(enrichers) .feeds(feeds) .catalogItems(catalogItems) + .bundles(bundles) .build(); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java index f7df463..0c2c87b 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicBrooklynTypeRegistry.java @@ -32,6 +32,7 @@ import org.apache.brooklyn.api.typereg.BrooklynTypeRegistry; import org.apache.brooklyn.api.typereg.RegisteredType; import org.apache.brooklyn.api.typereg.RegisteredType.TypeImplementationPlan; import org.apache.brooklyn.api.typereg.RegisteredTypeLoadingContext; +import org.apache.brooklyn.api.typereg.ManagedBundle; import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; import org.apache.brooklyn.core.catalog.internal.CatalogItemBuilder; import org.apache.brooklyn.core.catalog.internal.CatalogUtils; @@ -48,6 +49,7 @@ import com.google.common.annotations.Beta; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry { @@ -55,6 +57,7 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry { private static final Logger log = LoggerFactory.getLogger(BasicBrooklynTypeRegistry.class); private ManagementContext mgmt; + private Map<String,ManagedBundle> uploadedBundles = MutableMap.of(); private Map<String,RegisteredType> localRegisteredTypes = MutableMap.of(); public BasicBrooklynTypeRegistry(ManagementContext mgmt) { @@ -321,4 +324,5 @@ public class BasicBrooklynTypeRegistry implements BrooklynTypeRegistry { throw new IllegalStateException("Cannot add "+type+" to catalog; different "+oldType+" is already present"); } } + } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java new file mode 100644 index 0000000..4223e79 --- /dev/null +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicManagedBundle.java @@ -0,0 +1,150 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.brooklyn.core.typereg; + +import java.util.Map; + +import org.apache.brooklyn.api.mgmt.rebind.RebindSupport; +import org.apache.brooklyn.api.typereg.ManagedBundle; +import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; +import org.apache.brooklyn.config.ConfigKey; +import org.apache.brooklyn.core.objs.AbstractBrooklynObject; +import org.apache.brooklyn.core.objs.BrooklynObjectInternal; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Objects; +import com.google.common.base.Preconditions; + +public class BasicManagedBundle extends AbstractBrooklynObject implements ManagedBundle, BrooklynObjectInternal { + + private String symbolicName; + private String version; + private String url; + + // for deserializing (not sure if needed?) + @SuppressWarnings("unused") + private BasicManagedBundle() {} + + public BasicManagedBundle(String name, String version, String url) { + if (name == null && version == null) { + Preconditions.checkNotNull(url, "Either a URL or both name and version are required"); + } else { + Preconditions.checkNotNull(name, "Either a URL or both name and version are required"); + Preconditions.checkNotNull(version, "Either a URL or both name and version are required"); + } + + this.symbolicName = name; + this.version = version; + this.url = url; + } + + @Override + public boolean isNameResolved() { + return symbolicName != null && version != null; + } + + @Override + public String getSymbolicName() { + return symbolicName; + } + + @Override + public String getVersion() { + return version; + } + + @Override + public String getUrl() { + return url; + } + + @Override + public String getOsgiUniqueUrl() { + return "brooklyn:"+getId(); + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("symbolicName", symbolicName) + .add("version", version) + .add("url", url) + .toString(); + } + + @Override + public int hashCode() { + return Objects.hashCode(symbolicName, version, url); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null) return false; + if (getClass() != obj.getClass()) return false; + OsgiBundleWithUrl other = (OsgiBundleWithUrl) obj; + if (!Objects.equal(symbolicName, other.getSymbolicName())) return false; + if (!Objects.equal(version, other.getVersion())) return false; + if (!Objects.equal(url, other.getUrl())) return false; + return true; + } + + // --- + + @Override + public String getDisplayName() { + return null; + } + + @Override + public <T> T setConfig(ConfigKey<T> key, T val) { + throw new UnsupportedOperationException(); + } + + @Override + public <T> T getConfig(ConfigKey<T> key) { + throw new UnsupportedOperationException(); + } + + @Override + public RebindSupport<?> getRebindSupport() { + throw new UnsupportedOperationException(); + } + + @Override + public ConfigurationSupportInternal config() { + throw new UnsupportedOperationException(); + } + + @Override + public SubscriptionSupportInternal subscriptions() { + throw new UnsupportedOperationException(); + } + + @Override + public void setDisplayName(String newName) { + throw new UnsupportedOperationException(); + } + + @Override + protected BrooklynObjectInternal configure(Map<?, ?> flags) { + throw new UnsupportedOperationException(); + } + +} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java index 1c8cc40..5db9820 100644 --- a/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java +++ b/core/src/main/java/org/apache/brooklyn/core/typereg/BasicOsgiBundleWithUrl.java @@ -21,6 +21,7 @@ package org.apache.brooklyn.core.typereg; import org.apache.brooklyn.api.catalog.CatalogItem.CatalogBundle; import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl; +import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.base.Preconditions; @@ -35,16 +36,20 @@ public class BasicOsgiBundleWithUrl implements CatalogBundle, OsgiBundleWithUrl public BasicOsgiBundleWithUrl(String name, String version, String url) { if (name == null && version == null) { - Preconditions.checkNotNull(url, "url to an OSGi bundle is required"); + Preconditions.checkNotNull(url, "Either a URL or both name and version are required"); } else { - Preconditions.checkNotNull(name, "both name and version are required"); - Preconditions.checkNotNull(version, "both name and version are required"); + Preconditions.checkNotNull(name, "Either a URL or both name and version are required"); + Preconditions.checkNotNull(version, "Either a URL or both name and version are required"); } this.symbolicName = name; this.version = version; this.url = url; } + + public BasicOsgiBundleWithUrl(OsgiBundleWithUrl b) { + this(b.getSymbolicName(), b.getVersion(), b.getUrl()); + } @Override public boolean isNameResolved() { @@ -74,7 +79,7 @@ public class BasicOsgiBundleWithUrl implements CatalogBundle, OsgiBundleWithUrl @Override public String toString() { - return Objects.toStringHelper(this) + return MoreObjects.toStringHelper(this) .add("symbolicName", symbolicName) .add("version", version) .add("url", url) http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java index 29ea68b..4e18336 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RebindTestUtils.java @@ -537,7 +537,7 @@ public class RebindTestUtils { BrooklynMementoRawData data = persister.loadMementoRawData(RebindExceptionHandlerImpl.builder().build()); List<BrooklynObjectType> types = ImmutableList.of(BrooklynObjectType.ENTITY, BrooklynObjectType.LOCATION, BrooklynObjectType.POLICY, BrooklynObjectType.ENRICHER, BrooklynObjectType.FEED, - BrooklynObjectType.CATALOG_ITEM); + BrooklynObjectType.CATALOG_ITEM, BrooklynObjectType.MANAGED_BUNDLE); for (BrooklynObjectType type : types) { LOG.info(type+" ("+data.getObjectsOfType(type).keySet()+"):"); for (Map.Entry<String, String> entry : data.getObjectsOfType(type).entrySet()) { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java index b94970d..e012ac4 100644 --- a/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java +++ b/core/src/test/java/org/apache/brooklyn/core/mgmt/rebind/RecordingRebindExceptionHandler.java @@ -69,7 +69,7 @@ public class RecordingRebindExceptionHandler extends RebindExceptionHandlerImpl @Override public void onCreateFailed(BrooklynObjectType type, String id, String instanceType, Exception e) { - createFailures.put(id, new IllegalStateException("problem creating location "+id+" of type "+instanceType, e)); + createFailures.put(id, new IllegalStateException("problem creating "+type+" "+id+" of type "+instanceType, e)); super.onCreateFailed(type, id, instanceType, e); } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/fbe99f1f/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java ---------------------------------------------------------------------- diff --git a/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java b/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java index b64f291..9cac744 100644 --- a/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java +++ b/launcher/src/test/java/org/apache/brooklyn/launcher/AbstractCleanOrphanedStateTest.java @@ -55,6 +55,7 @@ public abstract class AbstractCleanOrphanedStateTest extends RebindTestFixtureWi .planeId(input.getPlaneId()) .brooklynVersion(input.getBrooklynVersion()) .catalogItems(input.getCatalogItems()) + .bundles(input.getBundles()) .entities(MutableMap.<String, String>builder().putAll(input.getEntities()).removeAll(deletions.entities).build()) .locations(MutableMap.<String, String>builder().putAll(input.getLocations()).removeAll(deletions.locations).build()) .feeds(MutableMap.<String, String>builder().putAll(input.getFeeds()).removeAll(deletions.feeds).build())
