From f0fe508941d90c0a76f20542d51b9d8182b23740 Mon Sep 17 00:00:00 2001 From: Martin Harris Date: Thu, 5 Mar 2015 09:29:52 +0000 Subject: [PATCH] Allows catalog items to be deprecated --- .../brooklyn/catalog/BrooklynCatalog.java | 3 ++ .../java/brooklyn/catalog/CatalogItem.java | 6 +++ .../main/java/brooklyn/entity/EntityType.java | 1 - .../brooklyn/mementos/CatalogItemMemento.java | 2 + .../brooklyn/catalog/CatalogPredicates.java | 9 ++++ .../internal/BasicBrooklynCatalog.java | 10 ++++ .../catalog/internal/CatalogItemDo.java | 12 ++++- .../internal/CatalogItemDtoAbstract.java | 11 +++++ .../rebind/BasicCatalogItemRebindSupport.java | 1 + .../rebind/dto/BasicCatalogItemMemento.java | 17 ++++++- .../entity/rebind/dto/MementosGenerators.java | 3 +- .../entity/rebind/RebindCatalogItemTest.java | 20 +++++++- .../java/brooklyn/rest/api/CatalogApi.java | 7 +++ .../rest/domain/CatalogEntitySummary.java | 6 ++- .../rest/domain/CatalogItemSummary.java | 12 ++++- .../rest/domain/CatalogPolicySummary.java | 3 +- .../rest/resources/CatalogResource.java | 21 ++++++++- .../rest/transform/CatalogTransformer.java | 6 +-- .../rest/resources/CatalogResourceTest.java | 47 ++++++++++++++++++- 19 files changed, 180 insertions(+), 17 deletions(-) diff --git a/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java b/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java index 42e42185d8..e2b39b0cbf 100644 --- a/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java +++ b/api/src/main/java/brooklyn/catalog/BrooklynCatalog.java @@ -65,6 +65,9 @@ public interface BrooklynCatalog { /** convenience for filtering items in the catalog; see CatalogPredicates for useful filters */ Iterable> getCatalogItems(Predicate> filter); + /** persists the catalog item to the object store, if persistence is enabled */ + public void persist(CatalogItem catalogItem); + /** @return The classloader which should be used to load classes and entities; * this includes all the catalog's classloaders in the right order */ public ClassLoader getRootClassLoader(); diff --git a/api/src/main/java/brooklyn/catalog/CatalogItem.java b/api/src/main/java/brooklyn/catalog/CatalogItem.java index d3824fdf4d..4dd63faf6f 100644 --- a/api/src/main/java/brooklyn/catalog/CatalogItem.java +++ b/api/src/main/java/brooklyn/catalog/CatalogItem.java @@ -94,4 +94,10 @@ public static interface CatalogItemLibraries { @Override public String getCatalogItemId(); + public void setDeprecated(boolean deprecated); + + /** + * @return True if the item has been deprecated and should not be shown in the catalog + */ + boolean isDeprecated(); } diff --git a/api/src/main/java/brooklyn/entity/EntityType.java b/api/src/main/java/brooklyn/entity/EntityType.java index de8bdfe11a..fd7ae72b43 100644 --- a/api/src/main/java/brooklyn/entity/EntityType.java +++ b/api/src/main/java/brooklyn/entity/EntityType.java @@ -22,7 +22,6 @@ import java.util.Set; import brooklyn.basic.BrooklynType; -import brooklyn.config.ConfigKey; import brooklyn.event.Sensor; import brooklyn.util.guava.Maybe; diff --git a/api/src/main/java/brooklyn/mementos/CatalogItemMemento.java b/api/src/main/java/brooklyn/mementos/CatalogItemMemento.java index 36d497d763..8bc1936994 100644 --- a/api/src/main/java/brooklyn/mementos/CatalogItemMemento.java +++ b/api/src/main/java/brooklyn/mementos/CatalogItemMemento.java @@ -44,4 +44,6 @@ public interface CatalogItemMemento extends Memento { Class getSpecType(); + boolean isDeprecated(); + } diff --git a/core/src/main/java/brooklyn/catalog/CatalogPredicates.java b/core/src/main/java/brooklyn/catalog/CatalogPredicates.java index c2872fea76..82ab689dde 100644 --- a/core/src/main/java/brooklyn/catalog/CatalogPredicates.java +++ b/core/src/main/java/brooklyn/catalog/CatalogPredicates.java @@ -43,6 +43,15 @@ public boolean apply(@Nullable CatalogItem item) { }; } + public static Predicate> deprecated(final boolean deprecated) { + return new Predicate>() { + @Override + public boolean apply(@Nullable CatalogItem item) { + return (item != null) && item.isDeprecated() == deprecated; + } + }; + } + public static final Predicate>> IS_TEMPLATE = CatalogPredicates.>isCatalogItemType(CatalogItemType.TEMPLATE); public static final Predicate>> IS_ENTITY = diff --git a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java index 6b61b4496e..5c5e05fda7 100644 --- a/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java +++ b/core/src/main/java/brooklyn/catalog/internal/BasicBrooklynCatalog.java @@ -18,6 +18,7 @@ */ package brooklyn.catalog.internal; +import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import io.brooklyn.camp.CampPlatform; import io.brooklyn.camp.spi.AssemblyTemplate; @@ -272,6 +273,12 @@ public CatalogItem getCatalogItem(Class type, String id, S return (CatalogItem)result; return null; } + + @Override + public void persist(CatalogItem catalogItem) { + checkArgument(getCatalogItem(catalogItem.getSymbolicName(), catalogItem.getVersion()) != null, "Unknown catalog item %s", catalogItem); + mgmt.getRebindManager().getChangeListener().onChanged(catalogItem); + } @Override public ClassLoader getRootClassLoader() { @@ -453,6 +460,7 @@ private CatalogItemDtoAbstract getAbstractCatalogItem(String yaml) { final String description = (String) catalog.getMaybe("description").orNull(); final String iconUrl = (String) catalog.getMaybe("iconUrl").orNull(); final String iconUrlUnderscore = (String) catalog.getMaybe("icon_url").orNull(); + final String deprecated = (String) catalog.getMaybe("deprecated").orNull(); if ((Strings.isNonBlank(id) || Strings.isNonBlank(symbolicName)) && Strings.isNonBlank(displayName) && @@ -526,6 +534,8 @@ private CatalogItemDtoAbstract getAbstractCatalogItem(String yaml) { catalogIconUrl = null; } + final Boolean catalogDeprecated = Boolean.valueOf(deprecated); + CatalogUtils.installLibraries(mgmt, libraries); String versionedId = CatalogUtils.getVersionedId(catalogSymbolicName, catalogVersion); diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java index b38d5604ee..1fb0707045 100644 --- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java +++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDo.java @@ -80,7 +80,17 @@ public String getId() { public String getCatalogItemId() { return itemDto.getCatalogItemId(); } - + + @Override + public void setDeprecated(boolean deprecated) { + itemDto.setDeprecated(deprecated); + } + + @Override + public boolean isDeprecated() { + return itemDto.isDeprecated(); + } + @Override public void setCatalogItemId(String id) { itemDto.setCatalogItemId(id); diff --git a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java index 521f4d6383..523cd79609 100644 --- a/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java +++ b/core/src/main/java/brooklyn/catalog/internal/CatalogItemDtoAbstract.java @@ -62,6 +62,7 @@ public abstract class CatalogItemDtoAbstract extends AbstractBrooklynO private @SetFromFlag Collection libraries; private @SetFromFlag Set tags = Sets.newLinkedHashSet(); + private @SetFromFlag boolean deprecated; /** * Config not supported for catalog item. See {@link #getPlanYaml()}. @@ -135,6 +136,16 @@ public String getVersion() { } } + @Override + public boolean isDeprecated() { + return deprecated; + } + + @Override + public void setDeprecated(boolean deprecated) { + this.deprecated = deprecated; + } + @Nonnull @Override public Collection getLibraries() { diff --git a/core/src/main/java/brooklyn/entity/rebind/BasicCatalogItemRebindSupport.java b/core/src/main/java/brooklyn/entity/rebind/BasicCatalogItemRebindSupport.java index 8ef2931b5d..62528b99d6 100644 --- a/core/src/main/java/brooklyn/entity/rebind/BasicCatalogItemRebindSupport.java +++ b/core/src/main/java/brooklyn/entity/rebind/BasicCatalogItemRebindSupport.java @@ -50,6 +50,7 @@ public void reconstruct(RebindContext rebindContext, CatalogItemMemento memento) .put("version", memento.getVersion()) .put("libraries", memento.getLibraries()) .put("planYaml", memento.getPlanYaml()) + .put("deprecated", memento.isDeprecated()) .build(), instance); } diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/BasicCatalogItemMemento.java b/core/src/main/java/brooklyn/entity/rebind/dto/BasicCatalogItemMemento.java index 5c07c658e4..75610f80d5 100644 --- a/core/src/main/java/brooklyn/entity/rebind/dto/BasicCatalogItemMemento.java +++ b/core/src/main/java/brooklyn/entity/rebind/dto/BasicCatalogItemMemento.java @@ -53,6 +53,7 @@ public static class Builder extends AbstractMemento.Builder { protected CatalogItem.CatalogItemType catalogItemType; protected Class catalogItemJavaType; protected Class specType; + protected boolean deprecated; public Builder description(String description) { this.description = description; @@ -104,6 +105,11 @@ public Builder specType(Class specType) { return self(); } + public Builder deprecated(boolean deprecated) { + this.deprecated = deprecated; + return self(); + } + public Builder from(CatalogItemMemento other) { super.from(other); description = other.getDescription(); @@ -116,6 +122,7 @@ public Builder from(CatalogItemMemento other) { catalogItemType = other.getCatalogItemType(); catalogItemJavaType = other.getCatalogItemJavaType(); specType = other.getSpecType(); + deprecated = other.isDeprecated(); return self(); } @@ -134,6 +141,7 @@ public BasicCatalogItemMemento build() { private CatalogItem.CatalogItemType catalogItemType; private Class catalogItemJavaType; private Class specType; + private boolean deprecated; @SuppressWarnings("unused") // For deserialisation private BasicCatalogItemMemento() {} @@ -150,6 +158,7 @@ protected BasicCatalogItemMemento(Builder builder) { this.catalogItemType = builder.catalogItemType; this.specType = builder.specType; this.javaType = builder.javaType; + this.deprecated = builder.deprecated; } @Override @@ -211,6 +220,11 @@ public Class getSpecType() { return specType; } + @Override + public boolean isDeprecated() { + return deprecated; + } + @Override protected void setCustomFields(Map fields) { if (!fields.isEmpty()) { @@ -236,7 +250,8 @@ protected Objects.ToStringHelper newVerboseStringHelper() { .add("catalogItemJavaType", getCatalogItemJavaType()) .add("catalogItemType", getCatalogItemType()) .add("javaType", getJavaType()) - .add("specType", getSpecType()); + .add("specType", getSpecType()) + .add("deprecated", isDeprecated()); } } diff --git a/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java b/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java index ed2ad0f51f..a81edefeb3 100644 --- a/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java +++ b/core/src/main/java/brooklyn/entity/rebind/dto/MementosGenerators.java @@ -375,7 +375,8 @@ public static CatalogItemMemento newCatalogItemMemento(CatalogItem catalog .symbolicName(catalogItem.getSymbolicName()) .specType(catalogItem.getSpecType()) .version(catalogItem.getVersion()) - .planYaml(catalogItem.getPlanYaml()); + .planYaml(catalogItem.getPlanYaml()) + .deprecated(catalogItem.isDeprecated()); return builder.build(); } diff --git a/core/src/test/java/brooklyn/entity/rebind/RebindCatalogItemTest.java b/core/src/test/java/brooklyn/entity/rebind/RebindCatalogItemTest.java index 29266e714f..4454354d04 100644 --- a/core/src/test/java/brooklyn/entity/rebind/RebindCatalogItemTest.java +++ b/core/src/test/java/brooklyn/entity/rebind/RebindCatalogItemTest.java @@ -19,6 +19,7 @@ package brooklyn.entity.rebind; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import io.brooklyn.camp.BasicCampPlatform; @@ -32,7 +33,6 @@ import brooklyn.camp.lite.CampPlatformWithJustBrooklynMgmt; import brooklyn.camp.lite.TestAppAssemblyInstantiator; -import brooklyn.catalog.BrooklynCatalog; import brooklyn.catalog.CatalogItem; import brooklyn.catalog.CatalogLoadMode; import brooklyn.catalog.internal.BasicBrooklynCatalog; @@ -192,6 +192,24 @@ public void testSameCatalogItemIdRemovalAndAdditionRebinds() throws Exception { rebindAndAssertCatalogsAreEqual(); } + @Test + public void testRebindAfterItemDeprecated() { + String yaml = + "name: rebind-yaml-catalog-item-test\n" + + "brooklyn.catalog:\n" + + " version: " + TEST_VERSION + "\n" + + "services:\n" + + "- type: io.camp.mock:AppServer"; + BasicBrooklynCatalog catalog = (BasicBrooklynCatalog) origManagementContext.getCatalog(); + CatalogItem catalogItem = catalog.addItem(yaml); + assertNotNull(catalogItem, "catalogItem"); + catalogItem.setDeprecated(true); + catalog.persist(catalogItem); + rebindAndAssertCatalogsAreEqual(); + CatalogItem catalogItemAfterRebind = newManagementContext.getCatalog().getCatalogItem("rebind-yaml-catalog-item-test", TEST_VERSION); + assertTrue(catalogItemAfterRebind.isDeprecated(), "Expected item to be deprecated"); + } + private void rebindAndAssertCatalogsAreEqual() { try { rebind(); diff --git a/usage/rest-api/src/main/java/brooklyn/rest/api/CatalogApi.java b/usage/rest-api/src/main/java/brooklyn/rest/api/CatalogApi.java index a6c5bff47f..1a03134e82 100644 --- a/usage/rest-api/src/main/java/brooklyn/rest/api/CatalogApi.java +++ b/usage/rest-api/src/main/java/brooklyn/rest/api/CatalogApi.java @@ -228,5 +228,12 @@ public Response getIcon( @ApiParam(name = "version", value = "version identifier of catalog item (application, entity, policy)", required=true) @PathParam("version") String version); + @POST + @Path("/entities/{itemId}/deprecated/{deprecated}") + public void setDeprecated( + @ApiParam(name = "itemId", value = "The ID of the catalog item to be deprecated", required = true) + @PathParam("itemId") String itemId, + @ApiParam(name = "deprecated", value = "Whether or not the catalog item is deprecated", required = true) + @PathParam("deprecated") boolean deprecated); } diff --git a/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogEntitySummary.java b/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogEntitySummary.java index 2933451d90..d3833652d2 100644 --- a/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogEntitySummary.java +++ b/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogEntitySummary.java @@ -41,9 +41,10 @@ public CatalogEntitySummary( @JsonProperty("config") Set config, @JsonProperty("sensors") Set sensors, @JsonProperty("effectors") Set effectors, + @JsonProperty("deprecated") boolean deprecated, @JsonProperty("links") Map links ) { - super(symbolicName, version, name, javaType, planYaml, description, iconUrl, links); + super(symbolicName, version, name, javaType, planYaml, description, iconUrl, deprecated, links); this.config = config; this.sensors = sensors; this.effectors = effectors; @@ -66,6 +67,7 @@ public String toString() { return super.toString()+"["+ "config="+getConfig()+"; " + "sensors="+getSensors()+"; "+ - "effectors="+getEffectors()+"]"; + "effectors="+getEffectors()+"; "+ + "deprecated="+isDeprecated()+"]"; } } diff --git a/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogItemSummary.java b/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogItemSummary.java index 553450cee3..570043a8ad 100644 --- a/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogItemSummary.java +++ b/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogItemSummary.java @@ -49,6 +49,7 @@ public class CatalogItemSummary implements HasId, HasName { @JsonSerialize(include=Inclusion.NON_EMPTY) private final String iconUrl; private final String planYaml; + private final boolean deprecated; private final Map links; @@ -60,8 +61,9 @@ public CatalogItemSummary( @JsonProperty("planYaml") String planYaml, @JsonProperty("description") String description, @JsonProperty("iconUrl") String iconUrl, + @JsonProperty("deprecated") boolean deprecated, @JsonProperty("links") Map links - ) { + ) { this.id = symbolicName + ":" + version; this.symbolicName = symbolicName; this.type = symbolicName; @@ -72,6 +74,7 @@ public CatalogItemSummary( this.description = description; this.iconUrl = iconUrl; this.links = (links == null) ? ImmutableMap.of() : ImmutableMap.copyOf(links); + this.deprecated = deprecated; } @Override @@ -116,17 +119,22 @@ public Map getLinks() { return links; } + public boolean isDeprecated() { + return deprecated; + } + @Override public String toString() { return Objects.toStringHelper(this) .add("id", symbolicName) .add("version", version) + .add("deprecated", deprecated) .toString(); } @Override public int hashCode() { - return Objects.hashCode(symbolicName, version, name, javaType); + return Objects.hashCode(symbolicName, version, name, javaType, deprecated); } @Override diff --git a/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogPolicySummary.java b/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogPolicySummary.java index 000bd850c1..daef1204db 100644 --- a/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogPolicySummary.java +++ b/usage/rest-api/src/main/java/brooklyn/rest/domain/CatalogPolicySummary.java @@ -39,9 +39,10 @@ public CatalogPolicySummary( @JsonProperty("description") String description, @JsonProperty("iconUrl") String iconUrl, @JsonProperty("config") Set config, + @JsonProperty("deprecated") boolean deprecated, @JsonProperty("links") Map links ) { - super(symbolicName, version, name, javaType, planYaml, description, iconUrl, links); + super(symbolicName, version, name, javaType, planYaml, description, iconUrl, deprecated, links); // TODO expose config from policies this.config = (config == null) ? ImmutableSet.of() : config; } diff --git a/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java b/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java index 535d923286..baf25b707c 100644 --- a/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java +++ b/usage/rest-server/src/main/java/brooklyn/rest/resources/CatalogResource.java @@ -40,6 +40,7 @@ import brooklyn.catalog.internal.CatalogDto; import brooklyn.catalog.internal.CatalogItemComparator; import brooklyn.catalog.internal.CatalogUtils; +import brooklyn.entity.Application; import brooklyn.entity.Entity; import brooklyn.entity.proxying.EntitySpec; import brooklyn.management.entitlement.Entitlements; @@ -67,6 +68,7 @@ import com.google.common.collect.Lists; import com.google.common.io.Files; import com.sun.jersey.core.header.FormDataContentDisposition; +import com.wordnik.swagger.core.ApiParam; public class CatalogResource extends AbstractBrooklynRestResource implements CatalogApi { @@ -176,10 +178,12 @@ public List listEntities(String regex, String fragment) { @Override public List listApplications(String regex, String fragment) { - return getCatalogItemSummariesMatchingRegexFragment(CatalogPredicates.IS_TEMPLATE, regex, fragment); + Predicate>> filter = + Predicates.and(CatalogPredicates.>deprecated(false), + CatalogPredicates.IS_TEMPLATE); + return getCatalogItemSummariesMatchingRegexFragment(filter, regex, fragment); } - @Override @Deprecated public CatalogEntitySummary getEntity(String entityId) { @@ -311,6 +315,19 @@ public Response getIcon(String itemId, String version) { return getCatalogItemIcon(result); } + @Override + public void setDeprecated(String itemId, boolean deprecated) { + if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, StringAndArgument.of(itemId, "deprecated"))) { + throw WebResourceUtils.unauthorized("User '%s' is not authorized to modify catalog", + Entitlements.getEntitlementContext().user()); + } + CatalogItem item = CatalogUtils.getCatalogItemOptionalVersion(mgmt(), itemId); + if (item==null) + throw WebResourceUtils.notFound("Catalog item with id '%s' not found", itemId); + item.setDeprecated(deprecated); + mgmt().getCatalog().persist(item); + } + private Response getCatalogItemIcon(CatalogItem result) { String url = result.getIconUrl(); if (url==null) { diff --git a/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java b/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java index 261dfb98ee..7222141dc1 100644 --- a/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java +++ b/usage/rest-server/src/main/java/brooklyn/rest/transform/CatalogTransformer.java @@ -74,13 +74,13 @@ public static CatalogEntitySummary catalogEntitySummary(BrooklynRestResourceUtil item.getJavaType(), item.getPlanYaml(), item.getDescription(), tidyIconLink(b, item, item.getIconUrl()), config, sensors, effectors, - makeLinks(item)); + item.isDeprecated(), makeLinks(item)); } public static CatalogItemSummary catalogItemSummary(BrooklynRestResourceUtils b, CatalogItem item) { return new CatalogItemSummary(item.getSymbolicName(), item.getVersion(), item.getDisplayName(), item.getJavaType(), item.getPlanYaml(), - item.getDescription(), tidyIconLink(b, item, item.getIconUrl()), makeLinks(item)); + item.getDescription(), tidyIconLink(b, item, item.getIconUrl()), item.isDeprecated(), makeLinks(item)); } public static CatalogPolicySummary catalogPolicySummary(BrooklynRestResourceUtils b, CatalogItem> item) { @@ -88,7 +88,7 @@ public static CatalogPolicySummary catalogPolicySummary(BrooklynRestResourceUtil return new CatalogPolicySummary(item.getSymbolicName(), item.getVersion(), item.getDisplayName(), item.getJavaType(), item.getPlanYaml(), item.getDescription(), tidyIconLink(b, item, item.getIconUrl()), config, - makeLinks(item)); + item.isDeprecated(), makeLinks(item)); } protected static Map makeLinks(CatalogItem item) { 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 060e3c8aa7..98b20c3a37 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 @@ -224,20 +224,26 @@ public void testGetCatalogEntityIconDetails() throws IOException { } private void addTestCatalogItem(String catalogItemId) { + addTestCatalogItem(catalogItemId, TEST_VERSION, "brooklyn.entity.nosql.redis.RedisStore"); + } + + private void addTestCatalogItem(String catalogItemId, String version, String service) { String yaml = "brooklyn.catalog:\n"+ " id: " + catalogItemId + "\n"+ " name: My Catalog App\n"+ " description: My description\n"+ " icon_url: classpath:///redis-logo.png\n"+ - " version: " + TEST_VERSION + "\n"+ + " version: " + version + "\n"+ "\n"+ "services:\n"+ - "- type: brooklyn.entity.nosql.redis.RedisStore\n"; + "- type: " + service + "\n"; client().resource("/v1/catalog").post(yaml); } + + @Test public void testListPolicies() { Set policies = client().resource("/v1/catalog/policies") @@ -280,6 +286,43 @@ public void testDeleteCustomEntityFromCatalog() { assertEquals(getPostDeleteResponse.getStatus(), Response.Status.NOT_FOUND.getStatusCode()); } + @Test + public void testSetDeprecated() { + String itemId = "my.catalog.item.id.for.deprecation"; + String serviceType = "brooklyn.entity.basic.BasicApplication"; + addTestCatalogItem(itemId, TEST_VERSION, serviceType); + addTestCatalogItem(itemId, "2.0", serviceType); + List applications = client().resource("/v1/catalog/applications") + .queryParam("fragment", itemId).get(new GenericType>() {}); + assertEquals(applications.size(), 2); + CatalogItemSummary summary0 = applications.get(0); + CatalogItemSummary summary1 = applications.get(1); + + // Ensure that the ID required by the API is in the 'usual' format of name:id + String id = String.format("%s:%s", summary0.getSymbolicName(), summary0.getVersion()); + assertEquals(summary0.getId(), id); + ClientResponse getDeprecationResponse = client().resource(String.format("/v1/catalog/entities/%s/deprecated/true", id)) + .post(ClientResponse.class); + + assertEquals(getDeprecationResponse.getStatus(), Response.Status.NO_CONTENT.getStatusCode()); + + List applicationsAfterDeprecation = client().resource("/v1/catalog/applications") + .queryParam("fragment", "basicapp").get(new GenericType>() {}); + + assertEquals(applicationsAfterDeprecation.size(), 1); + assertTrue(applicationsAfterDeprecation.contains(summary1)); + + ClientResponse getUnDeprecationResponse = client().resource(String.format("/v1/catalog/entities/%s/deprecated/false", summary0.getId())) + .post(ClientResponse.class); + + assertEquals(getUnDeprecationResponse.getStatus(), Response.Status.NO_CONTENT.getStatusCode()); + + List applicationsAfterUnDeprecation = client().resource("/v1/catalog/applications") + .queryParam("fragment", "basicapp").get(new GenericType>() {}); + + assertEquals(applications, applicationsAfterUnDeprecation); + } + private static String ver(String id) { return CatalogUtils.getVersionedId(id, TEST_VERSION); }