Github user ahgittin commented on a diff in the pull request: https://github.com/apache/brooklyn-server/pull/810#discussion_r140454692 --- Diff: rest/rest-api/src/main/java/org/apache/brooklyn/rest/api/BundleApi.java --- @@ -0,0 +1,158 @@ +/* + * 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.rest.api; + +import java.util.List; + +import javax.validation.Valid; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.apache.brooklyn.rest.domain.BundleInstallationRestResult; +import org.apache.brooklyn.rest.domain.BundleSummary; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; + +@Path("/bundles") +@Api("Bundles") +@Consumes(MediaType.APPLICATION_JSON) +@Produces(MediaType.APPLICATION_JSON) +public interface BundleApi { + + @GET + @ApiOperation(value = "List bundles registered in the system including their types", + response = BundleSummary.class, + 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") + @QueryParam("versions") + String versions); + + @Path("/{symbolicName}") + @GET + @ApiOperation(value = "Get summaries for all versions of the given bundle, with more recent ones first (preferring non-SNAPSHOTs)", + response = BundleSummary.class, + responseContainer = "List") + public List<BundleSummary> listVersions( + @ApiParam(name = "symbolicName", value = "Bundle name to query", required = true) + @PathParam("symbolicName") + String symbolicName); + + @Path("/{symbolicName}/{version}") + @GET + @ApiOperation(value = "Get detail on a specific bundle given its symbolic name and version", + response = BundleSummary.class) + public BundleSummary detail( + @ApiParam(name = "symbolicName", value = "Bundle name to query", required = true) + @PathParam("symbolicName") + String symbolicName, + @ApiParam(name = "version", value = "Version to query", required = true) + @PathParam("version") + String version); + + + @Path("/{symbolicName}/{version}") + @DELETE + @ApiOperation(value = "Removes a bundle, unregistering all the types it declares", + response = BundleInstallationRestResult.class) + public BundleInstallationRestResult remove( + @ApiParam(name = "symbolicName", value = "Bundle name to query", required = true) + @PathParam("symbolicName") + String symbolicName, + @ApiParam(name = "version", value = "Version to query", required = true) + @PathParam("version") + String version, + @ApiParam(name = "force", value = "Whether to forcibly remove it, even if in use and/or errors", required = false, defaultValue = "false") + @QueryParam("force") @DefaultValue("false") + Boolean force); + + @POST + @Consumes({MediaType.APPLICATION_JSON, "application/x-yaml", + // see http://stackoverflow.com/questions/332129/yaml-mime-type + "text/yaml", "text/x-yaml", "application/yaml"}) + @ApiOperation( + value = "Adds types to the registry from a given BOM YAML/JSON descriptor (creating a bundle with just this file in it)", + response = BundleInstallationRestResult.class + ) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Error processing the given YAML"), + @ApiResponse(code = 201, message = "Items added successfully") + }) + public Response createFromYaml( + @ApiParam(name = "yaml", value = "BOM YAML declaring the types to be installed", required = true) + @Valid String yaml, + @ApiParam(name="force", value="Force installation including replacing any different bundle of the same name and version") + @QueryParam("force") @DefaultValue("false") + Boolean forceUpdate); + + @POST + @Consumes({"application/x-zip", "application/x-jar"}) + @ApiOperation( + value = "Adds types to the registry from a given JAR or ZIP", + notes = "Accepts either an OSGi bundle JAR, or ZIP which will be turned into bundle JAR. Either format must " + + "contain a catalog.bom at the root of the archive, which must contain the bundle and version key.", + response = BundleInstallationRestResult.class) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Error processing the given archive, or the catalog.bom is invalid"), + @ApiResponse(code = 201, message = "Catalog items added successfully") + }) + public Response createFromArchive( + @ApiParam( + name = "archive", + value = "Bundle to install, in ZIP or JAR format, requiring catalog.bom containing bundle name and version", + required = true) + byte[] archive, + @ApiParam(name = "force", value = "Whether to forcibly remove it, even if in use and/or errors", required = false, defaultValue = "false") + @QueryParam("force") @DefaultValue("false") + Boolean force); + + @POST + @Consumes // anything (if doesn't match other methods with specific content types + @ApiOperation( + value = "Adds types to the registry from the given item, autodetecting type as ZIP/JAR or BOM YAML", + response = BundleInstallationRestResult.class + ) + @ApiResponses(value = { + @ApiResponse(code = 400, message = "Error processing the given archive, or the catalog.bom is invalid"), + @ApiResponse(code = 201, message = "Catalog items added successfully") + }) + public Response createAutodetecting( --- End diff -- this is all being removed as we will just have `POST /catalog` -- but i agree with you
---