blob: 46d6730a7acbe9168082b99b3c0e9f8612e44609 [file] [log] [blame]
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.chef;
import com.google.common.util.concurrent.ListenableFuture;
import org.jclouds.Constants;
import org.jclouds.Fallbacks.EmptySetOnNotFoundOr404;
import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
import org.jclouds.chef.binders.BindChecksumsToJsonPayload;
import org.jclouds.chef.binders.BindCreateClientOptionsToJsonPayload;
import org.jclouds.chef.binders.BindGenerateKeyForClientToJsonPayload;
import org.jclouds.chef.binders.BindIsCompletedToJsonPayload;
import org.jclouds.chef.binders.BindNameToJsonPayload;
import org.jclouds.chef.binders.DatabagItemId;
import org.jclouds.chef.binders.EnvironmentName;
import org.jclouds.chef.binders.NodeName;
import org.jclouds.chef.binders.RoleName;
import org.jclouds.chef.domain.Client;
import org.jclouds.chef.domain.CookbookDefinition;
import org.jclouds.chef.domain.CookbookVersion;
import org.jclouds.chef.domain.DatabagItem;
import org.jclouds.chef.domain.Environment;
import org.jclouds.chef.domain.Node;
import org.jclouds.chef.domain.Resource;
import org.jclouds.chef.domain.Role;
import org.jclouds.chef.domain.Sandbox;
import org.jclouds.chef.domain.SearchResult;
import org.jclouds.chef.domain.UploadSandbox;
import org.jclouds.chef.filters.SignedHeaderAuth;
import org.jclouds.chef.functions.ParseCookbookDefinitionFromJsonv10;
import org.jclouds.chef.functions.ParseCookbookDefinitionListFromJsonv10;
import org.jclouds.chef.functions.ParseCookbookDefinitionCheckingChefVersion;
import org.jclouds.chef.functions.ParseCookbookVersionsCheckingChefVersion;
import org.jclouds.chef.functions.ParseKeySetFromJson;
import org.jclouds.chef.functions.ParseSearchClientsFromJson;
import org.jclouds.chef.functions.ParseSearchDatabagFromJson;
import org.jclouds.chef.functions.ParseSearchEnvironmentsFromJson;
import org.jclouds.chef.functions.ParseSearchNodesFromJson;
import org.jclouds.chef.functions.ParseSearchRolesFromJson;
import org.jclouds.chef.functions.UriForResource;
import org.jclouds.chef.options.CreateClientOptions;
import org.jclouds.chef.options.SearchOptions;
import org.jclouds.io.Payload;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.Headers;
import org.jclouds.rest.annotations.MapBinder;
import org.jclouds.rest.annotations.ParamParser;
import org.jclouds.rest.annotations.PayloadParam;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.SinceApiVersion;
import org.jclouds.rest.binders.BindToJsonPayload;
import javax.inject.Named;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
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 javax.ws.rs.core.MediaType;
import java.io.Closeable;
import java.io.InputStream;
import java.net.URI;
import java.util.List;
import java.util.Set;
/**
* Provides asynchronous access to Chef via their REST API.
* <p/>
*
* @see ChefApi
* @author Adrian Cole
* @deprecated please use {@code org.jclouds.ContextBuilder#buildApi(ChefApi.class)} as
* {@link ChefAsyncApi} interface will be removed in jclouds 1.7.
*/
@Deprecated
@RequestFilters(SignedHeaderAuth.class)
@Headers(keys = "X-Chef-Version", values = "{" + Constants.PROPERTY_API_VERSION + "}")
@Consumes(MediaType.APPLICATION_JSON)
public interface ChefAsyncApi extends Closeable {
public static final String VERSION = "0.10.8";
/**
* @see ChefApi#getUploadSandboxForChecksums(Set)
*/
@Named("sandbox:upload")
@POST
@Path("/sandboxes")
ListenableFuture<UploadSandbox> getUploadSandboxForChecksums(
@BinderParam(BindChecksumsToJsonPayload.class) Set<List<Byte>> md5s);
/**
* @see ChefApi#uploadContent(URI, Payload)
*/
@Named("content:upload")
@PUT
@Produces("application/x-binary")
ListenableFuture<Void> uploadContent(@EndpointParam URI location, Payload content);
/**
* @see ChefApi#commitSandbox(String, boolean)
*/
@Named("sandbox:commit")
@PUT
@Path("/sandboxes/{id}")
ListenableFuture<Sandbox> commitSandbox(@PathParam("id") String id,
@BinderParam(BindIsCompletedToJsonPayload.class) boolean isCompleted);
/**
* @see ChefApi#listCookbooks()
*/
@Named("cookbook:list")
@GET
@Path("/cookbooks")
@ResponseParser(ParseCookbookDefinitionCheckingChefVersion.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<String>> listCookbooks();
/**
* @see ChefApi#updateCookbook(String, String, CookbookVersion)
*/
@Named("cookbook:update")
@PUT
@Path("/cookbooks/{cookbookname}/{version}")
ListenableFuture<CookbookVersion> updateCookbook(@PathParam("cookbookname") String cookbookName,
@PathParam("version") String version, @BinderParam(BindToJsonPayload.class) CookbookVersion cookbook);
/**
* @see ChefApi#deleteCookbook(String, String)
*/
@Named("cookbook:delete")
@DELETE
@Path("/cookbooks/{cookbookname}/{version}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<CookbookVersion> deleteCookbook(@PathParam("cookbookname") String cookbookName,
@PathParam("version") String version);
/**
* @see ChefApi#getVersionsOfCookbook(String)
*/
@Named("cookbook:versions")
@GET
@Path("/cookbooks/{cookbookname}")
@ResponseParser(ParseCookbookVersionsCheckingChefVersion.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<String>> getVersionsOfCookbook(@PathParam("cookbookname") String cookbookName);
/**
* @see ChefApi#getCookbook(String, String)
*/
@Named("cookbook:get")
@GET
@Path("/cookbooks/{cookbookname}/{version}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<CookbookVersion> getCookbook(@PathParam("cookbookname") String cookbookName,
@PathParam("version") String version);
/**
* @see ChefApi#createClient(String)
*/
@Named("client:create")
@POST
@Path("/clients")
@MapBinder(BindToJsonPayload.class)
ListenableFuture<Client> createClient(@PayloadParam("name") String clientname);
/**
* @see ChefApi#createClient(String, CreateApiOptions)
*/
@Named("client:create")
@POST
@Path("/clients")
@MapBinder(BindCreateClientOptionsToJsonPayload.class)
ListenableFuture<Client> createClient(@PayloadParam("name") String clientname, CreateClientOptions options);
/**
* @see ChefApi#generateKeyForClient(String)
*/
@Named("client:generatekey")
@PUT
@Path("/clients/{clientname}")
ListenableFuture<Client> generateKeyForClient(
@PathParam("clientname") @BinderParam(BindGenerateKeyForClientToJsonPayload.class) String clientname);
/**
* @see ChefApi#clientExists(String)
*/
@Named("client:exists")
@HEAD
@Path("/clients/{clientname}")
@Fallback(FalseOnNotFoundOr404.class)
ListenableFuture<Boolean> clientExists(@PathParam("clientname") String clientname);
/**
* @see ChefApi#getClient(String)
*/
@Named("client:get")
@GET
@Path("/clients/{clientname}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Client> getClient(@PathParam("clientname") String clientname);
/**
* @see ChefApi#deleteClient(String)
*/
@Named("client:delete")
@DELETE
@Path("/clients/{clientname}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Client> deleteClient(@PathParam("clientname") String clientname);
/**
* @see ChefApi#listClients()
*/
@Named("client:list")
@GET
@Path("/clients")
@ResponseParser(ParseKeySetFromJson.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<String>> listClients();
/**
* @see ChefApi#createNode(Node)
*/
@Named("node:create")
@POST
@Path("/nodes")
ListenableFuture<Void> createNode(@BinderParam(BindToJsonPayload.class) Node node);
/**
* @see ChefApi#updateNode(Node)
*/
@Named("node:update")
@PUT
@Path("/nodes/{nodename}")
ListenableFuture<Node> updateNode(
@PathParam("nodename") @ParamParser(NodeName.class) @BinderParam(BindToJsonPayload.class) Node node);
/**
* @see ChefApi#nodeExists(String)
*/
@Named("node:exists")
@HEAD
@Path("/nodes/{nodename}")
@Fallback(FalseOnNotFoundOr404.class)
ListenableFuture<Boolean> nodeExists(@PathParam("nodename") String nodename);
/**
* @see ChefApi#getNode(String)
*/
@Named("node:get")
@GET
@Path("/nodes/{nodename}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Node> getNode(@PathParam("nodename") String nodename);
/**
* @see ChefApi#deleteNode
*/
@Named("node:delete")
@DELETE
@Path("/nodes/{nodename}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Node> deleteNode(@PathParam("nodename") String nodename);
/**
* @see ChefApi#listNodes()
*/
@Named("node:list")
@GET
@Path("/nodes")
@ResponseParser(ParseKeySetFromJson.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<String>> listNodes();
/**
* @see ChefApi#createRole(Role)
*/
@Named("role:create")
@POST
@Path("/roles")
ListenableFuture<Void> createRole(@BinderParam(BindToJsonPayload.class) Role role);
/**
* @see ChefApi#updateRole(Role)
*/
@Named("role:update")
@PUT
@Path("/roles/{rolename}")
ListenableFuture<Role> updateRole(
@PathParam("rolename") @ParamParser(RoleName.class) @BinderParam(BindToJsonPayload.class) Role role);
/**
* @see ChefApi#roleExists(String)
*/
@Named("role:exists")
@HEAD
@Path("/roles/{rolename}")
@Fallback(FalseOnNotFoundOr404.class)
ListenableFuture<Boolean> roleExists(@PathParam("rolename") String rolename);
/**
* @see ChefApi#getRole(String)
*/
@Named("role:get")
@GET
@Path("/roles/{rolename}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Role> getRole(@PathParam("rolename") String rolename);
/**
* @see ChefApi#deleteRole(String)
*/
@Named("role:delete")
@DELETE
@Path("/roles/{rolename}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Role> deleteRole(@PathParam("rolename") String rolename);
/**
* @see ChefApi#listRoles()
*/
@Named("role:list")
@GET
@Path("/roles")
@ResponseParser(ParseKeySetFromJson.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<String>> listRoles();
/**
* @see ChefApi#listDatabags()
*/
@Named("databag:list")
@GET
@Path("/data")
@ResponseParser(ParseKeySetFromJson.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<String>> listDatabags();
/**
* @see ChefApi#createDatabag(String)
*/
@Named("databag:create")
@POST
@Path("/data")
ListenableFuture<Void> createDatabag(@BinderParam(BindNameToJsonPayload.class) String databagName);
/**
* @see ChefApi#databagExists(String)
*/
@Named("databag:exists")
@HEAD
@Path("/data/{name}")
@Fallback(FalseOnNotFoundOr404.class)
ListenableFuture<Boolean> databagExists(@PathParam("name") String databagName);
/**
* @see ChefApi#deleteDatabag(String)
*/
@Named("databag:delete")
@DELETE
@Path("/data/{name}")
@Fallback(VoidOnNotFoundOr404.class)
ListenableFuture<Void> deleteDatabag(@PathParam("name") String databagName);
/**
* @see ChefApi#listDatabagItems(String)
*/
@Named("databag:listitems")
@GET
@Path("/data/{name}")
@ResponseParser(ParseKeySetFromJson.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<String>> listDatabagItems(@PathParam("name") String databagName);
/**
* @see ChefApi#createDatabagItem(String, DatabagItem)
*/
@Named("databag:createitem")
@POST
@Path("/data/{databagName}")
ListenableFuture<DatabagItem> createDatabagItem(@PathParam("databagName") String databagName,
@BinderParam(BindToJsonPayload.class) DatabagItem databagItem);
/**
* @see ChefApi#updateDatabagItem(String, DatabagItem)
*/
@Named("databag:updateitem")
@PUT
@Path("/data/{databagName}/{databagItemId}")
ListenableFuture<DatabagItem> updateDatabagItem(
@PathParam("databagName") String databagName,
@PathParam("databagItemId") @ParamParser(DatabagItemId.class) @BinderParam(BindToJsonPayload.class) DatabagItem item);
/**
* @see ChefApi#databagItemExists(String, String)
*/
@Named("databag:itemexists")
@HEAD
@Path("/data/{databagName}/{databagItemId}")
@Fallback(FalseOnNotFoundOr404.class)
ListenableFuture<Boolean> databagItemExists(@PathParam("databagName") String databagName,
@PathParam("databagItemId") String databagItemId);
/**
* @see ChefApi#getDatabagItem(String, String)
*/
@Named("databag:getitem")
@GET
@Path("/data/{databagName}/{databagItemId}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<DatabagItem> getDatabagItem(@PathParam("databagName") String databagName,
@PathParam("databagItemId") String databagItemId);
/**
* @see ChefApi#deleteDatabagItem(String, String)
*/
@Named("databag:deleteitem")
@DELETE
@Path("/data/{databagName}/{databagItemId}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<DatabagItem> deleteDatabagItem(@PathParam("databagName") String databagName,
@PathParam("databagItemId") String databagItemId);
/**
* @see ChefApi#listSearchIndexes()
*/
@Named("search:indexes")
@GET
@Path("/search")
@ResponseParser(ParseKeySetFromJson.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<String>> listSearchIndexes();
/**
* @see ChefApi#searchRoles()
*/
@Named("search:roles")
@GET
@Path("/search/role")
@ResponseParser(ParseSearchRolesFromJson.class)
ListenableFuture<? extends SearchResult<? extends Role>> searchRoles();
/**
* @see ChefApi#searchRoles(SearchOptions)
*/
@Named("search:roles")
@GET
@Path("/search/role")
@ResponseParser(ParseSearchRolesFromJson.class)
ListenableFuture<? extends SearchResult<? extends Role>> searchRoles(SearchOptions options);
/**
* @see ChefApi#searchClients()
*/
@Named("search:clients")
@GET
@Path("/search/client")
@ResponseParser(ParseSearchClientsFromJson.class)
ListenableFuture<? extends SearchResult<? extends Client>> searchClients();
/**
* @see ChefApi#searchClients(SearchOptions)
*/
@Named("search:clients")
@GET
@Path("/search/client")
@ResponseParser(ParseSearchClientsFromJson.class)
ListenableFuture<? extends SearchResult<? extends Client>> searchClients(SearchOptions options);
/**
* @see ChefApi#searchNodes()
*/
@Named("search:nodes")
@GET
@Path("/search/node")
@ResponseParser(ParseSearchNodesFromJson.class)
ListenableFuture<? extends SearchResult<? extends Node>> searchNodes();
/**
* @see ChefApi#searchNodes(SearchOptions)
*/
@Named("search:nodes")
@GET
@Path("/search/node")
@ResponseParser(ParseSearchNodesFromJson.class)
ListenableFuture<? extends SearchResult<? extends Node>> searchNodes(SearchOptions options);
/**
* @see ChefApi#searchDatabag(String)
*/
@Named("search:databag")
@GET
@Path("/search/{databagName}")
@ResponseParser(ParseSearchDatabagFromJson.class)
ListenableFuture<? extends SearchResult<? extends DatabagItem>> searchDatabag(
@PathParam("databagName") String databagName);
/**
* @see ChefApi#searchDatabag(String, SearchOptions)
*/
@Named("search:databag")
@GET
@Path("/search/{databagName}")
@ResponseParser(ParseSearchDatabagFromJson.class)
ListenableFuture<? extends SearchResult<? extends DatabagItem>> searchDatabag(
@PathParam("databagName") String databagName, SearchOptions options);
/**
* @see ChefApi#searchEnvironments() ()
*/
@Named("search:environments")
@GET
@SinceApiVersion("0.10.0")
@Path("/search/environment")
@ResponseParser(ParseSearchEnvironmentsFromJson.class)
ListenableFuture<? extends SearchResult<? extends Environment>> searchEnvironments();
/**
* @see ChefApi#searchEnvironments(SearchOptions)
*/
@Named("search:environments")
@GET
@SinceApiVersion("0.10.0")
@Path("/search/environment")
@ResponseParser(ParseSearchEnvironmentsFromJson.class)
ListenableFuture<? extends SearchResult<? extends Environment>> searchEnvironments(SearchOptions options);
/**
* @see ChefApi#getResourceContents(Resource)
*/
@Named("content:get")
@GET
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<InputStream> getResourceContents(@EndpointParam(parser = UriForResource.class) Resource resource);
/**
* @see org.jclouds.chef.ChefApi#listEnvironments()
*/
@Named("environment:list")
@GET
@SinceApiVersion("0.10.0")
@Path("/environments")
@ResponseParser(ParseKeySetFromJson.class)
@Fallback(EmptySetOnNotFoundOr404.class)
ListenableFuture<Set<String>> listEnvironments();
/**
* @see ChefApi#createEnvironment(Environment)
*/
@Named("environment:create")
@POST
@SinceApiVersion("0.10.0")
@Path("/environments")
ListenableFuture<Void> createEnvironment(@BinderParam(BindToJsonPayload.class) Environment environment);
/**
* @see ChefApi#updateEnvironment(Environment)
*/
@Named("environment:update")
@PUT
@SinceApiVersion("0.10.0")
@Path("/environments/{environmentname}")
ListenableFuture<Environment> updateEnvironment(@PathParam("environmentname") @ParamParser(EnvironmentName.class)
@BinderParam(BindToJsonPayload.class) Environment environment);
/**
* @see ChefApi#getEnvironment(String)
*/
@Named("environment:get")
@GET
@SinceApiVersion("0.10.0")
@Path("/environments/{environmentname}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Environment> getEnvironment(@PathParam("environmentname") String environmentname);
/**
* @see ChefApi#deleteEnvironment(String)
*/
@Named("environment:delete")
@DELETE
@SinceApiVersion("0.10.0")
@Path("/environments/{environmentname}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Environment> deleteEnvironment(@PathParam("environmentname") String environmentname);
/**
* @see ChefApi#listEnvironmentCookbooks(String)
*/
@Named("environment:cookbooklist")
@GET
@ResponseParser(ParseCookbookDefinitionListFromJsonv10.class)
@SinceApiVersion("0.10.0")
@Path("/environments/{environmentname}/cookbooks")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Set<CookbookDefinition>> listEnvironmentCookbooks(@PathParam("environmentname") String environmentname);
/**
* @see ChefApi#listEnvironmentCookbooks(String)
*/
@Named("environment:cookbooklist")
@GET
@ResponseParser(ParseCookbookDefinitionListFromJsonv10.class)
@SinceApiVersion("0.10.0")
@Path("/environments/{environmentname}/cookbooks?num_versions={numversions}")
@Fallback(NullOnNotFoundOr404.class)
ListenableFuture<Set<CookbookDefinition>> listEnvironmentCookbooks(@PathParam("environmentname") String environmentname,
@PathParam("numversions") String numversions);
/**
* @see ChefApi#getEnvironmentCookbook(String, String)
*/
@Named("environment:cookbook")
@GET
@ResponseParser(ParseCookbookDefinitionFromJsonv10.class)
@SinceApiVersion("0.10.0")
@Path("/environments/{environmentname}/cookbooks/{cookbookname}")
ListenableFuture<CookbookDefinition> getEnvironmentCookbook(@PathParam("environmentname") String environmentname,
@PathParam("cookbookname") String cookbookname);
/**
* @see ChefApi#getEnvironmentCookbook(String, String, String)
*/
@Named("environment:cookbook")
@GET
@ResponseParser(ParseCookbookDefinitionFromJsonv10.class)
@SinceApiVersion("0.10.0")
@Path("/environments/{environmentname}/cookbooks/{cookbookname}?num_versions={numversions}")
ListenableFuture<CookbookDefinition> getEnvironmentCookbook(@PathParam("environmentname") String environmentname,
@PathParam("cookbookname") String cookbookname,
@PathParam("numversions") String numversions);
}