blob: 7e7b056fcf331d38c1da4453e71ab7a218540634 [file] [log] [blame]
/*
* 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.elasticstack;
import java.io.Closeable;
import java.util.Set;
import javax.ws.rs.Consumes;
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.core.MediaType;
import org.jclouds.Fallbacks.NullOnNotFoundOr404;
import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
import org.jclouds.elasticstack.binders.BindDriveDataToPlainTextString;
import org.jclouds.elasticstack.binders.BindDriveToPlainTextString;
import org.jclouds.elasticstack.binders.BindServerToPlainTextString;
import org.jclouds.elasticstack.domain.Drive;
import org.jclouds.elasticstack.domain.DriveData;
import org.jclouds.elasticstack.domain.DriveInfo;
import org.jclouds.elasticstack.domain.ImageConversionType;
import org.jclouds.elasticstack.domain.Server;
import org.jclouds.elasticstack.domain.ServerInfo;
import org.jclouds.elasticstack.domain.StandardDrive;
import org.jclouds.elasticstack.functions.KeyValuesDelimitedByBlankLinesToDriveInfo;
import org.jclouds.elasticstack.functions.KeyValuesDelimitedByBlankLinesToServerInfo;
import org.jclouds.elasticstack.functions.ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet;
import org.jclouds.elasticstack.functions.ListOfKeyValuesDelimitedByBlankLinesToServerInfoSet;
import org.jclouds.elasticstack.functions.ListOfKeyValuesDelimitedByBlankLinesToStandardDriveSet;
import org.jclouds.elasticstack.functions.ReturnPayload;
import org.jclouds.elasticstack.functions.SplitNewlines;
import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.io.Payload;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
/**
* Provides synchronous access to elasticstack via their REST API.
* <p/>
*
* @see <a href="TODO: insert URL of provider documentation" />
* @author Adrian Cole
*/
@RequestFilters(BasicAuthentication.class)
@Consumes(MediaType.TEXT_PLAIN)
public interface ElasticStackApi extends Closeable {
/**
* list of server uuids in your account
*
* @return or empty set if no servers are found
*/
@GET
@Path("/servers/list")
@ResponseParser(SplitNewlines.class)
Set<String> listServers();
/**
* Get all servers info
*
* @return or empty set if no servers are found
*/
@GET
@Path("/servers/info")
@ResponseParser(ListOfKeyValuesDelimitedByBlankLinesToServerInfoSet.class)
Set<ServerInfo> listServerInfo();
/**
* @param uuid
* what to get
* @return null, if not found
*/
@GET
@Fallback(NullOnNotFoundOr404.class)
@ResponseParser(KeyValuesDelimitedByBlankLinesToServerInfo.class)
@Path("/servers/{uuid}/info")
ServerInfo getServerInfo(@PathParam("uuid") String uuid);
/**
* create a new server
*
* @param createServer
* @return newly created server
*/
@POST
@Fallback(NullOnNotFoundOr404.class)
@ResponseParser(KeyValuesDelimitedByBlankLinesToServerInfo.class)
@Path("/servers/create/stopped")
ServerInfo createServer(
@BinderParam(BindServerToPlainTextString.class) Server createServer);
/**
* set server configuration
*
* @param uuid
* what server to change
* @param setServer
* what values to change
* @return new data
*/
@POST
@Fallback(NullOnNotFoundOr404.class)
@ResponseParser(KeyValuesDelimitedByBlankLinesToServerInfo.class)
@Path("/servers/{uuid}/set")
ServerInfo setServerConfiguration(@PathParam("uuid") String uuid,
@BinderParam(BindServerToPlainTextString.class) Server setServer);
/**
* Destroy a server
*
* @param uuid
* what to destroy
*/
@POST
@Path("/servers/{uuid}/destroy")
@Fallback(VoidOnNotFoundOr404.class)
void destroyServer(@PathParam("uuid") String uuid);
/**
* Start a server
*
* @param uuid
* what to start
*/
@POST
@Path("/servers/{uuid}/start")
void startServer(@PathParam("uuid") String uuid);
/**
* Stop a server
* <p/>
* Kills the server immediately, equivalent to a power failure. Server reverts to a stopped
* status if it is persistent and is automatically destroyed otherwise.
*
* @param uuid
* what to stop
*/
@POST
@Path("/servers/{uuid}/stop")
void stopServer(@PathParam("uuid") String uuid);
/**
* Shutdown a server
* <p/>
* Sends the server an ACPI power-down event. Server reverts to a stopped status if it is
* persistent and is automatically destroyed otherwise.
* <h4>note</h4> behaviour on shutdown depends on how your server OS is set up to respond to an
* ACPI power button signal.
*
* @param uuid
* what to shutdown
*/
@POST
@Path("/servers/{uuid}/shutdown")
void shutdownServer(@PathParam("uuid") String uuid);
/**
* Reset a server
*
* @param uuid
* what to reset
*/
@POST
@Path("/servers/{uuid}/reset")
void resetServer(@PathParam("uuid") String uuid);
/**
* list of drive uuids in your account
*
* @return or empty set if no drives are found
*/
@GET
@Path("/drives/list")
@ResponseParser(SplitNewlines.class)
Set<String> listDrives();
/**
* Get all drives info
*
* @return or empty set if no drives are found
*/
@GET
@Path("/drives/info")
@ResponseParser(ListOfKeyValuesDelimitedByBlankLinesToDriveInfoSet.class)
Set<DriveInfo> listDriveInfo();
/**
* Lists standard drive UUIDs in your account
*
* @return or empty set if no standard drives are found
*/
@GET
@Path("/drives/list/standard")
@ResponseParser(SplitNewlines.class)
Set<String> listStandardDrives();
/**
* Gets information about all standard drives
*
* @return or empty set if no standard drives are found
*/
@GET
@Path("/drives/info/standard")
@ResponseParser(ListOfKeyValuesDelimitedByBlankLinesToStandardDriveSet.class)
Set<StandardDrive> listStandardDriveInfo();
/**
* @param uuid
* what to get
* @return null, if not found
*/
@GET
@Fallback(NullOnNotFoundOr404.class)
@ResponseParser(KeyValuesDelimitedByBlankLinesToDriveInfo.class)
@Path("/drives/{uuid}/info")
DriveInfo getDriveInfo(@PathParam("uuid") String uuid);
/**
* create a new drive
*
* @param createDrive
* required parameters: name, size
* @return newly created drive
*/
@POST
@Fallback(NullOnNotFoundOr404.class)
@ResponseParser(KeyValuesDelimitedByBlankLinesToDriveInfo.class)
@Path("/drives/create")
DriveInfo createDrive(@BinderParam(BindDriveToPlainTextString.class) Drive createDrive);
/**
* set extra drive data
*
* @param uuid
* what drive to change
* @param setDrive
* what values to change
* @return new data
*/
@POST
@Fallback(NullOnNotFoundOr404.class)
@ResponseParser(KeyValuesDelimitedByBlankLinesToDriveInfo.class)
@Path("/drives/{uuid}/set")
DriveInfo setDriveData(@PathParam("uuid") String uuid,
@BinderParam(BindDriveDataToPlainTextString.class) DriveData setDrive);
/**
* Destroy a drive
*
* @param uuid
* what to delete
*/
@POST
@Path("/drives/{uuid}/destroy")
@Fallback(VoidOnNotFoundOr404.class)
void destroyDrive(@PathParam("uuid") String uuid);
/**
* create and start a new server
*
* @param createServer
* @return newly created server
*/
@POST
@Fallback(NullOnNotFoundOr404.class)
@ResponseParser(KeyValuesDelimitedByBlankLinesToServerInfo.class)
@Path("/servers/create")
ServerInfo createAndStartServer(
@BinderParam(BindServerToPlainTextString.class) Server createServer);
/**
* Image a drive from another drive. The actual imaging process is asynchronous, with progress
* reported via drive info.
*
* @param source
* drive to copy from
* @param destination
* drive to copy to
*/
@POST
@Path("/drives/{destination}/image/{source}")
@Fallback(VoidOnNotFoundOr404.class)
void imageDrive(@PathParam("source") String source, @PathParam("destination") String destination);
/**
* @see #imageDrive(String, String)
* @param conversionType
* Supports 'gzip' or 'gunzip' conversions.
*/
@POST
@Path("/drives/{destination}/image/{source}/{conversion}")
@Fallback(VoidOnNotFoundOr404.class)
void imageDrive(@PathParam("source") String source, @PathParam("destination") String destination,
@PathParam("conversion") ImageConversionType conversionType);
/**
* Read binary data from a drive
*
* @param uuid
* drive to read
* @param offset
* start at the specified offset in bytes
* @param size
* the specified size in bytes; must be <=4096k
* @return binary content of the drive.
*/
@POST
@Consumes(MediaType.APPLICATION_OCTET_STREAM)
@Path("/drives/{uuid}/read/{offset}/{size}")
@ResponseParser(ReturnPayload.class)
@Fallback(NullOnNotFoundOr404.class)
Payload readDrive(@PathParam("uuid") String uuid, @PathParam("offset") long offset,
@PathParam("size") long size);
/**
* Write binary data to a drive
*
* @param uuid
* drive to write
* @param content
* what to write.
* <ul>
* <li>Binary data (Content-Type: application/octet-stream)</li>
* <li>Supports raw data or Content-Encoding: gzip</li>
* <li>Does not support Transfer-Encoding: chunked</li>
* </ul>
*/
@POST
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Path("/drives/{uuid}/write")
@Fallback(VoidOnNotFoundOr404.class)
void writeDrive(@PathParam("uuid") String uuid, Payload content);
/**
* @see ElasticStackApi#writeDrive(String, Payload)
* @param offset
* the byte offset in the target drive at which to start writing, not an offset in the
* input stream.
*/
@POST
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@Path("/drives/{uuid}/write/{offset}")
@Fallback(VoidOnNotFoundOr404.class)
void writeDrive(@PathParam("uuid") String uuid, Payload content, @PathParam("offset") long offset);
}