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/09/25 09:29:37 UTC
[06/11] brooklyn-server git commit: address most PR comments
address most PR comments
still to do: supertypes as query param, and restructure to hang both of catalog (remove POST /catalog/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/206f744a
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/206f744a
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/206f744a
Branch: refs/heads/master
Commit: 206f744a84e93b364fbd912927ca6849a29873a3
Parents: 831db4a
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Fri Sep 22 11:42:02 2017 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Fri Sep 22 11:42:02 2017 +0100
----------------------------------------------------------------------
.../core/mgmt/entitlement/Entitlements.java | 1 +
.../org/apache/brooklyn/rest/api/BundleApi.java | 14 +++++++--
.../org/apache/brooklyn/rest/api/TypeApi.java | 7 +++--
.../brooklyn/rest/domain/BundleSummary.java | 7 +++++
.../apache/brooklyn/rest/domain/TypeDetail.java | 3 +-
.../brooklyn/rest/domain/TypeSummary.java | 12 ++++++--
.../brooklyn/rest/resources/BundleResource.java | 25 +++++++++-------
.../brooklyn/rest/resources/TypeResource.java | 2 ++
.../rest/transform/TypeTransformer.java | 31 +++++++++++---------
9 files changed, 68 insertions(+), 34 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/206f744a/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/Entitlements.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/Entitlements.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/Entitlements.java
index 60d998e..f7b5f72 100644
--- a/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/Entitlements.java
+++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/entitlement/Entitlements.java
@@ -60,6 +60,7 @@ public class Entitlements {
// ------------------- individual permissions
+ // TODO applies to bundles and registered types; should pass object or probably better add more entitlements?
public static EntitlementClass<String> SEE_CATALOG_ITEM = new BasicEntitlementClassDefinition<String>("catalog.see", String.class);
public static EntitlementClass<Object> ADD_CATALOG_ITEM = new BasicEntitlementClassDefinition<Object>("catalog.add", Object.class);
public static EntitlementClass<StringAndArgument> MODIFY_CATALOG_ITEM = new BasicEntitlementClassDefinition<StringAndArgument>("catalog.modify", StringAndArgument.class);
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/206f744a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/BundleApi.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/BundleApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/BundleApi.java
index 2c2eeae..6bf46ea 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/BundleApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/BundleApi.java
@@ -54,9 +54,13 @@ public interface BundleApi {
responseContainer = "List")
public List<BundleSummary> list(
@ApiParam(name = "versions", value = "Whether to list 'latest' for each symbolic-name or 'all' versions",
- required = false, defaultValue = "latest")
+ required = false, defaultValue = "latest")
@QueryParam("versions")
- String versions);
+ String versions,
+ @ApiParam(name = "detail", value = "Whether to include types and other detail info, default 'false'",
+ required = false, defaultValue = "false")
+ @QueryParam("detail")
+ boolean detail);
@Path("/{symbolicName}")
@GET
@@ -66,7 +70,11 @@ public interface BundleApi {
public List<BundleSummary> listVersions(
@ApiParam(name = "symbolicName", value = "Bundle name to query", required = true)
@PathParam("symbolicName")
- String symbolicName);
+ String symbolicName,
+ @ApiParam(name = "detail", value = "Whether to include types and other detail info, default 'false'",
+ required = false, defaultValue = "false")
+ @QueryParam("detail")
+ boolean detail);
@Path("/{symbolicName}/{version}")
@GET
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/206f744a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/TypeApi.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/TypeApi.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/TypeApi.java
index c39d5ef..f8167b5 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/TypeApi.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/TypeApi.java
@@ -33,6 +33,8 @@ import javax.ws.rs.core.Response;
import org.apache.brooklyn.rest.domain.TypeDetail;
import org.apache.brooklyn.rest.domain.TypeSummary;
+import com.google.common.annotations.Beta;
+
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@@ -41,6 +43,7 @@ import io.swagger.annotations.ApiParam;
@Api("Types")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
+@Beta
public interface TypeApi {
@GET
@@ -52,9 +55,9 @@ public interface TypeApi {
required = false, defaultValue = "latest")
@QueryParam("versions")
String versions,
- @ApiParam(name = "regex", value = "Regular expression to search for")
+ @ApiParam(name = "regex", value = "Regular expression to search for (in name and description)")
@QueryParam("regex") @DefaultValue("") String regex,
- @ApiParam(name = "fragment", value = "Substring case-insensitive to search for")
+ @ApiParam(name = "fragment", value = "Substring case-insensitive to search for (in name and description)")
@QueryParam("fragment") @DefaultValue("") String fragment);
@Path("/{nameOrAlias}")
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/206f744a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BundleSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BundleSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BundleSummary.java
index f14ee07..c8f442b 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BundleSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/BundleSummary.java
@@ -21,6 +21,7 @@ package org.apache.brooklyn.rest.domain;
import java.util.List;
import java.util.Map;
+import org.apache.brooklyn.api.typereg.ManagedBundle;
import org.apache.brooklyn.api.typereg.OsgiBundleWithUrl;
import org.apache.brooklyn.util.collections.MutableList;
import org.apache.brooklyn.util.collections.MutableMap;
@@ -35,6 +36,12 @@ import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.google.common.collect.ComparisonChain;
+/** Summary info of {@link ManagedBundle} bundles in the catalog providing types,
+ * essentially the symbolic name and version.
+ * Extra fields listing the types may be added.
+ * <p>
+ * These are comparable in alpha-then-version order with most recent preferring non-snapshot versions first,
+ * as per {@link VersionComparator}. */
public class BundleSummary implements Comparable<BundleSummary> {
private final String symbolicName;
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/206f744a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeDetail.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeDetail.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeDetail.java
index 2f9e32f..0fafcbe 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeDetail.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeDetail.java
@@ -24,6 +24,7 @@ import org.apache.brooklyn.api.typereg.RegisteredType.TypeImplementationPlan;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
+/** As {@link TypeSummary} but including plan information. */
public class TypeDetail extends TypeSummary {
public static class TypeImplementationPlanSummary {
@@ -42,7 +43,7 @@ public class TypeDetail extends TypeSummary {
return data;
}
}
- private final TypeImplementationPlanSummary plan;
+ private TypeImplementationPlanSummary plan;
/** Constructor for JSON deserialization use only. */
TypeDetail() {
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/206f744a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeSummary.java
----------------------------------------------------------------------
diff --git a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeSummary.java b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeSummary.java
index 0a045d4..70942cf 100644
--- a/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeSummary.java
+++ b/rest/rest-api/src/main/java/org/apache/brooklyn/rest/domain/TypeSummary.java
@@ -34,7 +34,10 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.ImmutableSet;
+/** Summary info of {@link RegisteredType} items in the catalog.
+ * See {@link TypeDetail} for further information. */
public class TypeSummary implements Comparable<TypeSummary> {
private final String symbolicName;
@@ -52,7 +55,7 @@ public class TypeSummary implements Comparable<TypeSummary> {
@JsonInclude(value=Include.NON_EMPTY)
private Set<String> aliases;
@JsonInclude(value=Include.NON_EMPTY)
- private Set<Object> supertypes;
+ private Set<String> supertypes;
@JsonInclude(value=Include.NON_EMPTY)
private Set<Object> tags;
@@ -88,7 +91,10 @@ public class TypeSummary implements Comparable<TypeSummary> {
iconUrl = t.getIconUrl();
aliases = t.getAliases();
- supertypes = t.getSuperTypes();
+ supertypes = ImmutableSet.copyOf(t.getSuperTypes().stream().map(s ->
+ s instanceof Class ? ((Class<?>)s).getName() :
+ s instanceof RegisteredType ? ((RegisteredType)s).getId() :
+ s.toString()).iterator());
tags = t.getTags();
deprecated = t.isDeprecated();
@@ -172,7 +178,7 @@ public class TypeSummary implements Comparable<TypeSummary> {
return aliases;
}
- public Set<Object> getSupertypes() {
+ public Set<String> getSupertypes() {
return supertypes;
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/206f744a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
index a2a6532..b4664ea 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/BundleResource.java
@@ -58,16 +58,18 @@ public class BundleResource extends AbstractBrooklynRestResource implements Bund
private static final String LATEST = "latest";
@Override
- public List<BundleSummary> list(String versions) {
- return list(TypeResource.isLatestOnly(versions, true), Predicates.alwaysTrue());
+ public List<BundleSummary> list(String versions, boolean detail) {
+ return list(Predicates.alwaysTrue(), TypeResource.isLatestOnly(versions, true), detail);
}
- private List<BundleSummary> list(boolean onlyLatest, Predicate<String> symbolicNameFilter) {
+ private List<BundleSummary> list(Predicate<String> symbolicNameFilter, boolean onlyLatest, boolean detail) {
Map<VersionedName,ManagedBundle> bundles = new TreeMap<>(VersionedNameComparator.INSTANCE);
for (ManagedBundle b: ((ManagementContextInternal)mgmt()).getOsgiManager().get().getManagedBundles().values()) {
+ if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, b.getId())) {
+ continue;
+ }
if (symbolicNameFilter.apply(b.getSymbolicName())) {
- // TODO entitlements for bundles
VersionedName key = onlyLatest ? new VersionedName(b.getSymbolicName(), LATEST) : b.getVersionedName();
ManagedBundle oldBundle = bundles.get(key);
if (oldBundle==null || oldBundle.getVersionedName().compareTo(b.getVersionedName()) > 0) {
@@ -75,20 +77,20 @@ public class BundleResource extends AbstractBrooklynRestResource implements Bund
}
}
}
- return toBundleSummary(bundles.values());
+ return toBundleSummary(bundles.values(), detail);
}
- private List<BundleSummary> toBundleSummary(Iterable<ManagedBundle> sortedItems) {
+ private List<BundleSummary> toBundleSummary(Iterable<ManagedBundle> sortedItems, boolean detail) {
List<BundleSummary> result = MutableList.of();
for (ManagedBundle t: sortedItems) {
- result.add(TypeTransformer.bundleSummary(brooklyn(), t, ui.getBaseUriBuilder(), mgmt()));
+ result.add(TypeTransformer.bundleSummary(brooklyn(), t, ui.getBaseUriBuilder(), mgmt(), detail));
}
return result;
}
@Override
- public List<BundleSummary> listVersions(String symbolicName) {
- return list(false, Predicates.equalTo(symbolicName));
+ public List<BundleSummary> listVersions(String symbolicName, boolean detail) {
+ return list(Predicates.equalTo(symbolicName), false, detail);
}
@Override
@@ -98,12 +100,13 @@ public class BundleResource extends AbstractBrooklynRestResource implements Bund
}
protected ManagedBundle lookup(String symbolicName, String version) {
- // TODO entitlements for bundles
-
ManagedBundle b = ((ManagementContextInternal)mgmt()).getOsgiManager().get().getManagedBundle(new VersionedName(symbolicName, version));
if (b==null) {
throw WebResourceUtils.notFound("Bundle with id '%s:%s' not found", symbolicName, version);
}
+ if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, b.getId())) {
+ throw WebResourceUtils.notFound("Bundle with id '%s:%s' not found", symbolicName, version);
+ }
return b;
}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/206f744a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/TypeResource.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/TypeResource.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/TypeResource.java
index 86de57d..52627e3 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/TypeResource.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/resources/TypeResource.java
@@ -48,6 +48,7 @@ import org.apache.brooklyn.util.text.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.annotations.Beta;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
@@ -55,6 +56,7 @@ import com.google.common.collect.ImmutableList;
import com.google.common.io.Files;
@HaHotStateRequired
+@Beta
public class TypeResource extends AbstractBrooklynRestResource implements TypeApi {
private static final Logger log = LoggerFactory.getLogger(TypeResource.class);
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/206f744a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TypeTransformer.java
----------------------------------------------------------------------
diff --git a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TypeTransformer.java b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TypeTransformer.java
index fb3fdd3..4c9ccb2 100644
--- a/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TypeTransformer.java
+++ b/rest/rest-resources/src/main/java/org/apache/brooklyn/rest/transform/TypeTransformer.java
@@ -79,10 +79,10 @@ public class TypeTransformer {
}
private static <T extends TypeSummary> T embellish(T result, RegisteredType item, boolean detail, BrooklynRestResourceUtils b, UriBuilder ub) {
- result.getExtraFields().put("links", makeLinks(item, ub));
+ result.setExtraField("links", makeLinks(item, ub));
if (RegisteredTypes.isTemplate(item)) {
- result.getExtraFields().put("template", true);
+ result.setExtraField("template", true);
}
if (item.getIconUrl()!=null) {
result.setIconUrl(tidyIconLink(b, item, item.getIconUrl(), ub));
@@ -103,7 +103,7 @@ public class TypeTransformer {
config.add(EntityTransformer.adjunctConfigSummary(input));
}
- result.getExtraFields().put("config", config);
+ result.setExtraField("config", config);
} catch (Exception e) {
Exceptions.propagateIfFatal(e);
log.trace("Unable to create spec for "+item+": "+e, e);
@@ -111,7 +111,7 @@ public class TypeTransformer {
} else if (RegisteredTypes.isSubtypeOf(item, Location.class)) {
// TODO include config on location specs? (wasn't done previously so not needed, but good for completeness)
- result.getExtraFields().put("config", Collections.emptyMap());
+ result.setExtraField("config", Collections.emptyMap());
}
}
return result;
@@ -135,9 +135,9 @@ public class TypeTransformer {
for (Effector<?> x: type.getEffectors())
effectors.add(EffectorTransformer.effectorSummaryForCatalog(x));
- result.getExtraFields().put("config", config);
- result.getExtraFields().put("sensors", sensors);
- result.getExtraFields().put("effectors", effectors);
+ result.setExtraField("config", config);
+ result.setExtraField("sensors", sensors);
+ result.setExtraField("effectors", effectors);
} catch (Exception e) {
Exceptions.propagateIfFatal(e);
@@ -152,19 +152,22 @@ public class TypeTransformer {
}
}
- public static BundleSummary bundleSummary(BrooklynRestResourceUtils brooklyn, ManagedBundle b, UriBuilder baseUriBuilder, ManagementContext mgmt) {
+ public static BundleSummary bundleSummary(BrooklynRestResourceUtils brooklyn, ManagedBundle b, UriBuilder baseUriBuilder, ManagementContext mgmt, boolean detail) {
BundleSummary result = new BundleSummary(b);
- for (RegisteredType t: mgmt.getTypeRegistry().getMatching(RegisteredTypePredicates.containingBundle(b))) {
- result.addType(summary(brooklyn, t, baseUriBuilder));
+ if (detail) {
+ result.setExtraField("osgiVersion", b.getOsgiVersionString());
+ result.setExtraField("checksum", b.getChecksum());
+ }
+ if (detail) {
+ for (RegisteredType t: mgmt.getTypeRegistry().getMatching(RegisteredTypePredicates.containingBundle(b))) {
+ result.addType(summary(brooklyn, t, baseUriBuilder));
+ }
}
return result;
}
public static BundleSummary bundleDetails(BrooklynRestResourceUtils brooklyn, ManagedBundle b, UriBuilder baseUriBuilder, ManagementContext mgmt) {
- BundleSummary result = bundleSummary(brooklyn, b, baseUriBuilder, mgmt);
- result.getExtraFields().put("osgiVersion", b.getOsgiVersionString());
- result.getExtraFields().put("checksum", b.getChecksum());
- return result;
+ return bundleSummary(brooklyn, b, baseUriBuilder, mgmt, true);
}
public static BundleInstallationRestResult bundleInstallationResult(OsgiBundleInstallationResult in, ManagementContext mgmt, BrooklynRestResourceUtils brooklynU, UriInfo ui) {