| /* |
| * 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.jclouds.openstack.glance.v1_0.features; |
| |
| import static javax.ws.rs.core.MediaType.APPLICATION_JSON; |
| import static javax.ws.rs.core.MediaType.APPLICATION_OCTET_STREAM; |
| |
| import java.io.InputStream; |
| |
| import javax.ws.rs.Consumes; |
| import javax.ws.rs.DELETE; |
| import javax.ws.rs.GET; |
| import javax.ws.rs.HEAD; |
| import javax.ws.rs.HeaderParam; |
| import javax.ws.rs.POST; |
| import javax.ws.rs.PUT; |
| import javax.ws.rs.Path; |
| import javax.ws.rs.PathParam; |
| import javax.ws.rs.Produces; |
| |
| import org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404; |
| import org.jclouds.Fallbacks.FalseOnNotFoundOr404; |
| import org.jclouds.Fallbacks.NullOnNotFoundOr404; |
| import org.jclouds.collect.PagedIterable; |
| import org.jclouds.io.Payload; |
| import org.jclouds.javax.annotation.Nullable; |
| import org.jclouds.openstack.glance.v1_0.domain.Image; |
| import org.jclouds.openstack.glance.v1_0.domain.ImageDetails; |
| import org.jclouds.openstack.glance.v1_0.functions.ParseImageDetailsFromHeaders; |
| import org.jclouds.openstack.glance.v1_0.functions.internal.ParseImageDetails; |
| import org.jclouds.openstack.glance.v1_0.functions.internal.ParseImages; |
| import org.jclouds.openstack.glance.v1_0.options.CreateImageOptions; |
| import org.jclouds.openstack.glance.v1_0.options.ListImageOptions; |
| import org.jclouds.openstack.glance.v1_0.options.UpdateImageOptions; |
| import org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404; |
| import org.jclouds.openstack.v2_0.domain.PaginatedCollection; |
| import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest; |
| import org.jclouds.rest.annotations.Fallback; |
| import org.jclouds.rest.annotations.RequestFilters; |
| import org.jclouds.rest.annotations.ResponseParser; |
| import org.jclouds.rest.annotations.SelectJson; |
| import org.jclouds.rest.annotations.Transform; |
| |
| /** |
| * Image Services |
| * |
| * @see <a href="http://glance.openstack.org/glanceapi.html">api doc</a> |
| * @see <a |
| * href="https://github.com/openstack/glance/blob/master/glance/api/v1/images.py">api |
| * src</a> |
| */ |
| @RequestFilters(AuthenticateRequest.class) |
| public interface ImageApi { |
| |
| /** |
| * List all images (IDs, names, links) |
| * |
| * @return all images (IDs, names, links) |
| */ |
| @GET |
| @Consumes(APPLICATION_JSON) |
| @Path("/images") |
| @RequestFilters(AuthenticateRequest.class) |
| @ResponseParser(ParseImages.class) |
| @Transform(ParseImages.ToPagedIterable.class) |
| @Fallback(EmptyPagedIterableOnNotFoundOr404.class) |
| PagedIterable<? extends Image> list(); |
| |
| @GET |
| @Consumes(APPLICATION_JSON) |
| @Path("/images") |
| @RequestFilters(AuthenticateRequest.class) |
| @ResponseParser(ParseImages.class) |
| @Fallback(EmptyPaginatedCollectionOnNotFoundOr404.class) |
| PaginatedCollection<? extends Image> list(ListImageOptions options); |
| |
| /** |
| * List all images (all details) |
| * |
| * @return all images (all details) |
| */ |
| @GET |
| @Consumes(APPLICATION_JSON) |
| @Path("/images/detail") |
| @RequestFilters(AuthenticateRequest.class) |
| @ResponseParser(ParseImageDetails.class) |
| @Transform(ParseImageDetails.ToPagedIterable.class) |
| @Fallback(EmptyPagedIterableOnNotFoundOr404.class) |
| PagedIterable<? extends ImageDetails> listInDetail(); |
| |
| @GET |
| @Consumes(APPLICATION_JSON) |
| @Path("/images/detail") |
| @RequestFilters(AuthenticateRequest.class) |
| @ResponseParser(ParseImageDetails.class) |
| @Fallback(EmptyPaginatedCollectionOnNotFoundOr404.class) |
| PaginatedCollection<? extends ImageDetails> listInDetail(ListImageOptions options); |
| |
| /** |
| * Return metadata about an image with id |
| */ |
| @HEAD |
| @Path("/images/{id}") |
| @ResponseParser(ParseImageDetailsFromHeaders.class) |
| @Fallback(NullOnNotFoundOr404.class) |
| @Nullable |
| ImageDetails get(@PathParam("id") String id); |
| |
| /** |
| * Return image data for image with id |
| */ |
| @GET |
| @Path("/images/{id}") |
| @Fallback(NullOnNotFoundOr404.class) |
| @Nullable |
| InputStream getAsStream(@PathParam("id") String id); |
| |
| /** |
| * Create a new image |
| * |
| * @return detailed metadata about the newly stored image |
| */ |
| @POST |
| @Path("/images") |
| @Produces(APPLICATION_OCTET_STREAM) |
| @SelectJson("image") |
| @Consumes(APPLICATION_JSON) |
| ImageDetails create(@HeaderParam("x-image-meta-name") String name, Payload payload, CreateImageOptions... options); |
| |
| /** |
| * Reserve a new image to be uploaded later |
| * |
| * @return detailed metadata about the newly stored image |
| * @see #upload |
| */ |
| @POST |
| @Path("/images") |
| @SelectJson("image") |
| @Consumes(APPLICATION_JSON) |
| ImageDetails reserve(@HeaderParam("x-image-meta-name") String name, CreateImageOptions... options); |
| |
| /** |
| * Upload image data for a previously-reserved image |
| * <p/> |
| * If an image was previously reserved, and thus is in the queued state, then |
| * image data can be added using this method. If the image already as data |
| * associated with it (e.g. not in the queued state), then you will receive a |
| * 409 Conflict exception. |
| * |
| * @param imageData |
| * the new image to upload |
| * @param options |
| * can be used to adjust the metadata stored for the image in the |
| * same call |
| * @return detailed metadata about the updated image |
| * @see #reserve |
| */ |
| @PUT |
| @Path("/images/{id}") |
| @Produces(APPLICATION_OCTET_STREAM) |
| @SelectJson("image") |
| @Consumes(APPLICATION_JSON) |
| ImageDetails upload(@PathParam("id") String id, Payload imageData, UpdateImageOptions... options); |
| |
| /** |
| * Adjust the metadata stored for an existing image |
| * |
| * @return detailed metadata about the updated image |
| */ |
| @PUT |
| @Path("/images/{id}") |
| @SelectJson("image") |
| @Consumes(APPLICATION_JSON) |
| ImageDetails update(@PathParam("id") String id, UpdateImageOptions... options); |
| |
| /** |
| * Delete the image with the specified id |
| * |
| * @return true if successful |
| */ |
| @DELETE |
| @Path("/images/{id}") |
| @Fallback(FalseOnNotFoundOr404.class) |
| boolean delete(@PathParam("id") String id); |
| } |