blob: b5b041864c0adef925c276ae0b9eb124f33421a7 [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.cloudsigma2;
import com.google.inject.name.Named;
import org.jclouds.Fallbacks;
import org.jclouds.cloudsigma2.binders.BindCreateSubscriptionRequest;
import org.jclouds.cloudsigma2.binders.BindCreateSubscriptionRequestList;
import org.jclouds.cloudsigma2.binders.BindDriveToJson;
import org.jclouds.cloudsigma2.binders.BindDrivesToJson;
import org.jclouds.cloudsigma2.binders.BindFirewallPoliciesListToJsonRequest;
import org.jclouds.cloudsigma2.binders.BindFirewallPolicyToJsonRequest;
import org.jclouds.cloudsigma2.binders.BindIPInfoToJsonRequest;
import org.jclouds.cloudsigma2.binders.BindLibraryDriveToJson;
import org.jclouds.cloudsigma2.binders.BindProfileInfoToJsonRequest;
import org.jclouds.cloudsigma2.binders.BindServerInfoListToJsonRequest;
import org.jclouds.cloudsigma2.binders.BindServerInfoToJsonRequest;
import org.jclouds.cloudsigma2.binders.BindTagListToJsonRequest;
import org.jclouds.cloudsigma2.binders.BindTagToJsonRequest;
import org.jclouds.cloudsigma2.binders.BindUuidStringsToJsonArray;
import org.jclouds.cloudsigma2.binders.BindVLANToJsonRequest;
import org.jclouds.cloudsigma2.domain.AccountBalance;
import org.jclouds.cloudsigma2.domain.CalcSubscription;
import org.jclouds.cloudsigma2.domain.CreateSubscriptionRequest;
import org.jclouds.cloudsigma2.domain.CurrentUsage;
import org.jclouds.cloudsigma2.domain.Discount;
import org.jclouds.cloudsigma2.domain.Drive;
import org.jclouds.cloudsigma2.domain.DriveInfo;
import org.jclouds.cloudsigma2.domain.DrivesListRequestFieldsGroup;
import org.jclouds.cloudsigma2.domain.FirewallPolicy;
import org.jclouds.cloudsigma2.domain.IP;
import org.jclouds.cloudsigma2.domain.IPInfo;
import org.jclouds.cloudsigma2.domain.LibraryDrive;
import org.jclouds.cloudsigma2.domain.License;
import org.jclouds.cloudsigma2.domain.PaginatedCollection;
import org.jclouds.cloudsigma2.domain.Pricing;
import org.jclouds.cloudsigma2.domain.ProfileInfo;
import org.jclouds.cloudsigma2.domain.Server;
import org.jclouds.cloudsigma2.domain.ServerAvailabilityGroup;
import org.jclouds.cloudsigma2.domain.ServerInfo;
import org.jclouds.cloudsigma2.domain.Subscription;
import org.jclouds.cloudsigma2.domain.SubscriptionCalculator;
import org.jclouds.cloudsigma2.domain.Tag;
import org.jclouds.cloudsigma2.domain.Transaction;
import org.jclouds.cloudsigma2.domain.VLANInfo;
import org.jclouds.cloudsigma2.functions.internal.ParseDiscounts;
import org.jclouds.cloudsigma2.functions.internal.ParseDriveInfos;
import org.jclouds.cloudsigma2.functions.internal.ParseDrives;
import org.jclouds.cloudsigma2.functions.internal.ParseFirewallPolicies;
import org.jclouds.cloudsigma2.functions.internal.ParseIPInfos;
import org.jclouds.cloudsigma2.functions.internal.ParseIPs;
import org.jclouds.cloudsigma2.functions.internal.ParseLibraryDrives;
import org.jclouds.cloudsigma2.functions.internal.ParseLicenses;
import org.jclouds.cloudsigma2.functions.internal.ParseServerInfos;
import org.jclouds.cloudsigma2.functions.internal.ParseServers;
import org.jclouds.cloudsigma2.functions.internal.ParseSubscriptions;
import org.jclouds.cloudsigma2.functions.internal.ParseTags;
import org.jclouds.cloudsigma2.functions.internal.ParseTransactions;
import org.jclouds.cloudsigma2.functions.internal.ParseVLANs;
import org.jclouds.cloudsigma2.options.PaginationOptions;
import org.jclouds.collect.PagedIterable;
import org.jclouds.http.filters.BasicAuthentication;
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.OnlyElement;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.SelectJson;
import org.jclouds.rest.annotations.SkipEncoding;
import org.jclouds.rest.annotations.Transform;
import org.jclouds.rest.binders.BindToJsonPayload;
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.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import java.io.Closeable;
import java.util.List;
/**
* Provides synchronous access to CloudSigma v2 API.
*
* @see <a href="https://zrh.cloudsigma.com/docs/" />
*/
@RequestFilters(BasicAuthentication.class)
@Consumes(javax.ws.rs.core.MediaType.APPLICATION_JSON)
@SkipEncoding({'?', '/', '='})
public interface CloudSigma2Api extends Closeable {
/**
* Gets the list of drives to which the authenticated user has access.
*
* @return list of drives or empty list if no drives are found
*/
@Named("drive:listDrives")
@GET
@Path("/drives/")
@ResponseParser(ParseDrives.class)
@Transform(ParseDrives.ToPagedIterable.class)
PagedIterable<Drive> listDrives();
/**
* Gets the list of drives to which the authenticated user has access.
*
* @return PaginatedCollection of drives
*/
@Named("drive:listDrives")
@GET
@Path("/drives/")
@ResponseParser(ParseDrives.class)
PaginatedCollection<Drive> listDrives(PaginationOptions options);
/**
* Gets the list of drives to which the authenticated user has access.
*
* @param fields A set of field names specifying the returned fields
* @param limit number of drives to show
* @return or empty set if no drives are found
*/
@Named("drive:listDrives")
@GET
@Path("/drives/")
@SelectJson("objects")
List<DriveInfo> listDrives(@QueryParam("fields") DrivesListRequestFieldsGroup fields,
@DefaultValue("0") @QueryParam("limit") int limit);
/**
* Gets the detailed list of drives with additional information to which the authenticated user has access.
*
* @return list of drives or empty list if no drives are found
*/
@Named("drive:listDrivesInfo")
@GET
@Path("/drives/detail/")
@ResponseParser(ParseDriveInfos.class)
@Transform(ParseDriveInfos.ToPagedIterable.class)
PagedIterable<DriveInfo> listDrivesInfo();
/**
* Gets the detailed list of drives with additional information to which the authenticated user has access.
*
* @return PaginatedCollection of drives
*/
@Named("drive:listDrivesInfo")
@GET
@Path("/drives/detail/")
@ResponseParser(ParseDriveInfos.class)
PaginatedCollection<DriveInfo> listDrivesInfo(PaginationOptions options);
/**
* Gets detailed information for drive identified by drive uuid
*
* @param uuid drive uuid to get
* @return null, if not found
*/
@Named("drive:getDriveInfo")
@GET
@Path("/drives/{uuid}/")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
DriveInfo getDriveInfo(@PathParam("uuid") String uuid);
/**
* Creates a new drive
*
* @param createDrive required parameters: name, size, media
* @return newly created drive
*/
@Named("drive:createDrive")
@POST
@Path("/drives/")
@SelectJson("objects")
@OnlyElement
DriveInfo createDrive(@BinderParam(BindDriveToJson.class) DriveInfo createDrive);
/**
* Creates multiple new drives
*
* @param createDrives required parameters: name, size, media
* @return newly created drives
*/
@Named("drive:listDrives")
@POST
@SelectJson("objects")
@Path("/drives/")
List<DriveInfo> createDrives(@BinderParam(BindDrivesToJson.class) List<DriveInfo> createDrives);
/**
* Deletes a single mounted or unmounted drive.
*
* @param uuid what to delete
*/
@Named("drive:deleteDrive")
@DELETE
@Path("/drives/{uuid}/")
@Fallback(Fallbacks.VoidOnNotFoundOr404.class)
void deleteDrive(@PathParam("uuid") String uuid);
/**
* Deletes multiple mounted or unmounted drives specified by their UUID’s.
*
* @param uuids what drives to delete
*/
@Named("drive:deleteDrives")
@DELETE
@Path("/drives/")
@Fallback(Fallbacks.VoidOnNotFoundOr404.class)
void deleteDrives(@BinderParam(BindUuidStringsToJsonArray.class) Iterable<String> uuids);
/**
* Edits a mounted or unmounted drive. If mounted, the server mounted on should be stopped.
*
* @param sourceUuid source drive to edit
* @param driveInfo drive parameters to change
* @return changed drive
*/
@Named("drive:editDrive")
@PUT
@Path("/drives/{uuid}/")
DriveInfo editDrive(@PathParam("uuid") String sourceUuid, @BinderParam(BindDriveToJson.class) DriveInfo driveInfo);
/**
* Clones a drive. Request body is optional and any or all of the key/value pairs can be omitted.
*
* @param sourceUuid source drive to clone
* @param driveInfo drive parameters to change
* @return new drive
*/
@Named("drive:cloneDrive")
@POST
@Path("/drives/{uuid}/action/?do=clone")
@SelectJson("objects")
@OnlyElement
DriveInfo cloneDrive(@PathParam("uuid") String sourceUuid,
@Nullable @BinderParam(BindDriveToJson.class) DriveInfo driveInfo);
/**
* Gets the list of library drives to which the authenticated user has access.
*
* @return list of library drives to which the authenticated user has access
*/
@Named("libdrive:listLibraryDrives")
@GET
@Path("/libdrives/")
@ResponseParser(ParseLibraryDrives.class)
@Transform(ParseLibraryDrives.ToPagedIterable.class)
PagedIterable<LibraryDrive> listLibraryDrives();
/**
* Gets the list of library drives to which the authenticated user has access.
*
* @return PaginatedCollection of library drives
*/
@Named("libdrive:listLibraryDrives")
@GET
@Path("/libdrives/")
@ResponseParser(ParseLibraryDrives.class)
PaginatedCollection<LibraryDrive> listLibraryDrives(PaginationOptions options);
/**
* Gets detailed information for library drive identified by uuid.
*
* @param uuid uuid of library drive to be listed
* @return drive information or null if not found
*/
@Named("libdrive:getLibraryDrive")
@GET
@Path("/libdrives/{uuid}/")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
LibraryDrive getLibraryDrive(@PathParam("uuid") String uuid);
/**
* If a library drive is not a CDROM, you have to clone it in your account in order to use it.
*
* @param uuid uuid of library drive to clone
* @param libraryDrive cloned drive
* @return cloned drive information or null if not found
*/
@Named("libdrive:cloneLibraryDrive")
@POST
@Path("/libdrives/{uuid}/action/?do=clone")
@SelectJson("objects")
@OnlyElement
LibraryDrive cloneLibraryDrive(@PathParam("uuid") String uuid,
@Nullable @BinderParam(BindLibraryDriveToJson.class) LibraryDrive libraryDrive);
/**
* Gets the list of servers to which the authenticated user has access.
*
* @return list of servers or empty list if no servers are found
*/
@Named("server:listServers")
@GET
@Path("/servers/")
@ResponseParser(ParseServers.class)
@Transform(ParseServers.ToPagedIterable.class)
PagedIterable<Server> listServers();
/**
* Gets the list of servers to which the authenticated user has access.
*
* @return PaginatedCollection of servers
*/
@Named("server:listServers")
@GET
@Path("/servers/")
@ResponseParser(ParseServers.class)
PaginatedCollection<Server> listServers(PaginationOptions options);
/**
* Gets the detailed list of servers to which the authenticated user has access.
*
* @return list of servers or empty list if no servers are found
*/
@Named("server:listServersInfo")
@GET
@Path("/servers/detail/")
@ResponseParser(ParseServerInfos.class)
@Transform(ParseServerInfos.ToPagedIterable.class)
PagedIterable<ServerInfo> listServersInfo();
/**
* Gets the detailed list of servers to which the authenticated user has access.
*
* @return PaginatedCollection of servers
*/
@Named("server:listServersInfo")
@GET
@Path("/servers/detail/")
@ResponseParser(ParseServerInfos.class)
PaginatedCollection<ServerInfo> listServersInfo(PaginationOptions options);
/**
* Creates a new virtual server or multiple servers.
* The minimial amount of information you need to set is:
* cpu
* memory
* name
* vncPassword
*
* @param createServer required parameters: cpu, memory, name, vncPassword
* @return newly created server
*/
@Named("server:createServer")
@POST
@Path("/servers/")
@SelectJson("objects")
@OnlyElement
ServerInfo createServer(@BinderParam(BindServerInfoToJsonRequest.class) ServerInfo createServer);
/**
* create a new servers
*
* @param servers servers to create. Required parameters: cpu, memory, name, vncPassword
* @return newly created servers
*/
@Named("server:createServers")
@POST
@Path("/servers/")
@SelectJson("objects")
List<ServerInfo> createServers(@BinderParam(BindServerInfoListToJsonRequest.class) Iterable<ServerInfo> servers);
/**
* Edits a server. Used also for attaching NIC’s and drives to servers.
*
* @param uuid server uuid
* @param server data to change
* @return modified server
*/
@Named("server:editServer")
@PUT
@Path("/servers/{uuid}/")
ServerInfo editServer(@PathParam("uuid") String uuid,
@BinderParam(BindServerInfoToJsonRequest.class) ServerInfo server);
/**
* Deletes a single server.
*
* @param uuid uuid of server to delete
*/
@Named("server:deleteServer")
@DELETE
@Path("/servers/{uuid}/")
@Fallback(Fallbacks.VoidOnNotFoundOr404.class)
void deleteServer(@PathParam("uuid") String uuid);
/**
* Deletes multiple servers specified by their UUID’s.
*
* @param uuids server uuids to delete
*/
@Named("server:deleteServers")
@DELETE
@Path("/servers/")
@Fallback(Fallbacks.VoidOnNotFoundOr404.class)
void deleteServers(@BinderParam(BindUuidStringsToJsonArray.class) Iterable<String> uuids);
/**
* Clones a server. Empty body.
* Does cascading clone of server drives.
* IPs of the cloned server are set to DHCP.
* All other properties of the clone are equal to the original.
*
* @param uuid server what to clone
* @return cloned server
*/
@Named("server:cloneServer")
@POST
@Path("/servers/{uuid}/action/?do=clone")
ServerInfo cloneServer(@PathParam("uuid") String uuid);
/**
* Gets detailed information for server identified by server uuid.
*
* @param uuid server uuid
* @return server info or null, if not found
*/
@Named("server:getServerInfo")
@GET
@Path("/servers/{uuid}/")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
ServerInfo getServerInfo(@PathParam("uuid") String uuid);
/**
* Starts a server with specific UUID.
*
* @param uuid uuid of server to start
*/
@Named("server:startServer")
@POST
@Path("/servers/{uuid}/action/?do=start")
void startServer(@PathParam("uuid") String uuid);
/**
* Stops a server with specific UUID.
*
* @param uuid uuid of server to stop
*/
@Named("server:stopServer")
@POST
@Path("/servers/{uuid}/action/?do=stop")
void stopServer(@PathParam("uuid") String uuid);
/**
* Starts a server with specific UUID assuring that it is started on a different physical infrastructure host
* from the other servers specified in the avoid argument which is
* a single server UUID or a comma-separated list of server UUIDs.
* This way the server specified by uuid is run in a distinct availability group from the other listed servers.
* Note that it might not always be possible to run a server in a different availability group,
* therefore the order of the avoid list also signifies the priority of avoiding other servers.
*
* @param uuid uuid of server to start
* @param uuidGroup availability group to avoid
*/
@Named("server:startServerInSeparateAvailabilityGroup")
@POST
@Path("/servers/{uuid}/action/?do=start")
void startServerInSeparateAvailabilityGroup(@PathParam("uuid") String uuid,
@QueryParam("avoid") List<String> uuidGroup);
/**
* Opens a VNC tunnel to a server with specific UUID.
*
* @param uuid uuid of server to open VNC tunnel
*/
@Named("server:openServerVNCTunnel")
@POST
@Path("/servers/{uuid}/action/?do=open_vnc")
void openServerVNCTunnel(@PathParam("uuid") String uuid);
/**
* Closes a VNC tunnel to a server with specific UUID.
*
* @param uuid uuid of server to close VNC tunnel
*/
@Named("server:closeServerVCNTunnel")
@POST
@Path("/servers/{uuid}/action/?do=close_vnc")
void closeServerVCNTunnel(@PathParam("uuid") String uuid);
/**
* @return which servers share same physical infrastructure host.
*/
@Named("server:listServerAvailabilityGroup")
@GET
@Path("/servers/availability_groups/")
List<List<String>> listServerAvailabilityGroup();
/**
* Queries which other servers share same physical host with the given one.
*
* @param uuid Uuid of server to find availability group
* @return an array holding server UUIDs. The response includes also the UUID of the queried server.
*/
@Named("server:getServerAvailabilityGroup")
@GET
@PathParam("/servers/availability_groups/{uuid}/")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
ServerAvailabilityGroup getServerAvailabilityGroup(@PathParam("uuid") String uuid);
/**
* Gets the list of firewall policies to which the authenticated user has access.
*
* @return list of firewall policies to which the authenticated user has access.
*/
@Named("fwpolicy:listFirewallPolicies")
@GET
@Path("/fwpolicies/")
@ResponseParser(ParseFirewallPolicies.class)
@Transform(ParseFirewallPolicies.ToPagedIterable.class)
PagedIterable<FirewallPolicy> listFirewallPolicies();
/**
* Gets the list of firewall policies to which the authenticated user has access.
*
* @return PaginatedCollection of firewall policies
*/
@Named("fwpolicy:listFirewallPolicies")
@GET
@Path("/fwpolicies/")
@ResponseParser(ParseFirewallPolicies.class)
PaginatedCollection<FirewallPolicy> listFirewallPolicies(PaginationOptions options);
/**
* Gets a detailed list of firewall policies to which the authenticated user has access.
*
* @return list of firewall policies to which the authenticated user has access.
*/
@Named("fwpolicy:listFirewallPoliciesInfo")
@GET
@Path("/fwpolicies/detail/")
@ResponseParser(ParseFirewallPolicies.class)
@Transform(ParseFirewallPolicies.ToPagedIterableInfo.class)
PagedIterable<FirewallPolicy> listFirewallPoliciesInfo();
/**
* Gets a detailed list of firewall policies to which the authenticated user has access.
*
* @return PaginatedCollection of firewall policies
*/
@Named("fwpolicy:listFirewallPoliciesInfo")
@GET
@Path("/fwpolicies/detail/")
@ResponseParser(ParseFirewallPolicies.class)
PaginatedCollection<FirewallPolicy> listFirewallPoliciesInfo(PaginationOptions options);
/**
* Gets firewall policy.
*
* @return firewall policy
*/
@Named("fwpolicy:getFirewallPolicy")
@GET
@Path("/fwpolicies/{uuid}/")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
FirewallPolicy getFirewallPolicy(@PathParam("uuid") String uuid);
/**
* Creates firewall policies.
*
* @param firewallPolicies firewall policies to create
* @return list of created firewall policies
*/
@Named("fwpolicy:createFirewallPolicies")
@POST
@Path("/fwpolicies/")
@SelectJson("objects")
List<FirewallPolicy> createFirewallPolicies(
@BinderParam(BindFirewallPoliciesListToJsonRequest.class) List<FirewallPolicy> firewallPolicies);
/**
* Creates a firewall policy.
*
* @param firewallPolicy firewall policy to create
* @return created firewall policy
*/
@Named("fwpolicy:createFirewallPolicy")
@POST
@Path("/fwpolicies/")
@SelectJson("objects")
@OnlyElement
FirewallPolicy createFirewallPolicy(
@BinderParam(BindFirewallPolicyToJsonRequest.class) FirewallPolicy firewallPolicy);
/**
* Update an existing firewall policy
*
* @param uuid uuid of policy to update
* @param firewallPolicy firewall policy data to update
* @return updated firewall policy
*/
@Named("fwpolicy:editFirewallPolicy")
@PUT
@Path("/fwpolicies/{uuid}/")
FirewallPolicy editFirewallPolicy(@PathParam("uuid") String uuid,
@BinderParam(BindFirewallPolicyToJsonRequest.class) FirewallPolicy firewallPolicy);
/**
* Deletes a single firewall policy.
*
* @param uuid uuid of firewall policy to delete
*/
@Named("tag:deleteFirewallPolicy")
@DELETE
@Path("/fwpolicies/{uuid}/")
@Fallback(Fallbacks.VoidOnNotFoundOr404.class)
void deleteFirewallPolicy(@PathParam("uuid") String uuid);
/**
* Gets detailed information for VLAN identified by VLAN uuid.
*
* @param uuid uuid of VLAN to get
* @return null, if not found
*/
@Named("vlan:getVLANInfo")
@GET
@Path("/vlans/{uuid}/")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
VLANInfo getVLANInfo(@PathParam("uuid") String uuid);
/**
* Gets the list of VLANs to which the authenticated user has access.
*
* @return list of VLANs or empty list if no vlans are found
*/
@Named("vlan:listVLANs")
@GET
@Path("/vlans/")
@ResponseParser(ParseVLANs.class)
@Transform(ParseVLANs.ToPagedIterable.class)
PagedIterable<VLANInfo> listVLANs();
/**
* Gets the list of VLANs to which the authenticated user has access.
*
* @return PaginatedCollection of VLANs
*/
@Named("vlan:listVLANs")
@GET
@Path("/vlans/")
@ResponseParser(ParseVLANs.class)
PaginatedCollection<VLANInfo> listVLANs(PaginationOptions options);
/**
* Gets the list of VLANs to which the authenticated user has access.
*
* @return list of VLANs or empty list if no vlans are found
*/
@Named("vlan:listVLANInfo")
@GET
@Path("/vlans/detail/")
@ResponseParser(ParseVLANs.class)
@Transform(ParseVLANs.ToPagedIterableInfo.class)
PagedIterable<VLANInfo> listVLANInfo();
/**
* Gets the list of VLANs to which the authenticated user has access.
*
* @return PaginatedCollection of VLANs
*/
@Named("vlan:listVLANInfo")
@GET
@Path("/vlans/detail/")
@ResponseParser(ParseVLANs.class)
PaginatedCollection<VLANInfo> listVLANInfo(PaginationOptions options);
/**
* Currently only VLAN meta field can be edited.
*
* @param uuid uuid of VLAN to edit
* @param vlanInfo data to change
* @return changed VLAN
*/
@Named("vlan:listVLANInfo")
@PUT
@Path("/vlans/{uuid}/")
VLANInfo editVLAN(@PathParam("uuid") String uuid,
@BinderParam(BindVLANToJsonRequest.class) VLANInfo vlanInfo);
/**
* Gets the list of IPs to which the authenticated user has access.
*
* @return list of IPs or empty list if no ips are found
*/
@Named("ip:listIPs")
@GET
@Path("/ips/")
@ResponseParser(ParseIPs.class)
@Transform(ParseIPs.ToPagedIterable.class)
PagedIterable<IP> listIPs();
/**
* Gets the list of IPs to which the authenticated user has access.
*
* @return PaginatedCollection of IPs
*/
@Named("ip:listIPs")
@GET
@Path("/ips/")
@ResponseParser(ParseIPs.class)
PaginatedCollection<IP> listIPs(PaginationOptions options);
/**
* Gets the detailed list of IPs with additional information to which the authenticated user has access.
*
* @return list of IPs or empty list if no ips are found
*/
@Named("ip:listIPInfo")
@GET
@Path("/ips/detail/")
@ResponseParser(ParseIPInfos.class)
@Transform(ParseIPInfos.ToPagedIterable.class)
PagedIterable<IPInfo> listIPInfo();
/**
* Gets the detailed list of IPs with additional information to which the authenticated user has access.
*
* @return PaginatedCollection of IPs
*/
@Named("ip:listIPInfo")
@GET
@Path("/ips/detail/")
@ResponseParser(ParseIPInfos.class)
PaginatedCollection<IPInfo> listIPInfo(PaginationOptions options);
/**
* Gets detailed information for IP identified by IP uuid.
*
* @param uuid uuid of IP to get
* @return null, if not found
*/
@Named("ip:getIPInfo")
@GET
@Path("/ips/{uuid}/")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
IPInfo getIPInfo(@PathParam("uuid") String uuid);
/**
* Currently only IP meta field can be edited.
*
* @param uuid uuid of IP to edit
* @param ipInfo data to change
* @return changed IP
*/
@Named("ip:editIP")
@PUT
@Path("/ips/{uuid}/")
IPInfo editIP(@PathParam("uuid") String uuid,
@BinderParam(BindIPInfoToJsonRequest.class) IPInfo ipInfo);
/**
* Gets the list of tags to which the authenticated user has access.
*
* @return list of tags to which the authenticated user has access
*/
@Named("tag:listTags")
@GET
@Path("/tags/")
@ResponseParser(ParseTags.class)
@Transform(ParseTags.ToPagedIterable.class)
PagedIterable<Tag> listTags();
/**
* Gets the list of tags to which the authenticated user has access.
*
* @return PaginatedCollection of tags to which the authenticated user has access
*/
@Named("tag:listTags")
@GET
@Path("/tags/")
@ResponseParser(ParseTags.class)
PaginatedCollection<Tag> listTags(PaginationOptions options);
/**
* Gets detailed information for tag identified by tag uuid.
*
* @param uuid tag uuid
* @return detailed info of tag
*/
@Named("tag:getTagInfo")
@GET
@Path("/tags/{uuid}/")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
Tag getTagInfo(@PathParam("uuid") String uuid);
/**
* Edits a tag.
* It is possible to add or remove resources to a tag by replacing the resources list with a new one
*
* @param uuid tag uuid
* @param tag info to change
* @return detailed info of tag
*/
@Named("tag:editTag")
@PUT
@Path("/tags/{uuid}/")
Tag editTag(@PathParam("uuid") String uuid, @BinderParam(BindTagToJsonRequest.class) Tag tag);
/**
* Creates a new tag
*
* @param tag tag to create
* @return created tag
*/
@Named("tag:createTag")
@POST
@Path("/tags/")
@SelectJson("objects")
@OnlyElement
Tag createTag(@BinderParam(BindTagToJsonRequest.class) Tag tag);
/**
* Deletes a single tag.
*
* @param uuid uuid of tag to delete
*/
@Named("tag:deleteTag")
@DELETE
@Path("/tags/{uuid}/")
@Fallback(Fallbacks.VoidOnNotFoundOr404.class)
void deleteTag(@PathParam("uuid") String uuid);
/**
* Creates a multiple new tags
*
* @param tags tags to create
* @return created tags
*/
@Named("tag:createTags")
@POST
@Path("/tags/")
@SelectJson("objects")
List<Tag> createTags(@BinderParam(BindTagListToJsonRequest.class) List<Tag> tags);
/**
* Gets the user profile.
*
* @return profile information
*/
@Named("profile:getProfileInfo")
@GET
@Path("/profile/")
ProfileInfo getProfileInfo();
/**
* Edits a user profile.
*
* @param profile data to change
* @return info or null, if not found
*/
@Named("profile:editProfileInfo")
@PUT
@Path("/profile/")
ProfileInfo editProfileInfo(@BinderParam(BindProfileInfoToJsonRequest.class) ProfileInfo profile);
/**
* Get the balance and currency of the current account.
*
* @return current account balance and currency
*/
@Named("balance:getAccountBalance")
@GET
@Path("/balance/")
AccountBalance getAccountBalance();
/**
* Get the current usage of the user.
*
* @return current usage of the user
*/
@Named("currentusage:getCurrentUsage")
@GET
@Path("/currentusage/")
CurrentUsage getCurrentUsage();
/**
* Gets the list of subscriptions of the user.
*
* @return list of subscriptions of the user.
*/
@Named("subscription:listSubscriptions")
@GET
@Path("/subscriptions/")
@ResponseParser(ParseSubscriptions.class)
@Transform(ParseSubscriptions.ToPagedIterable.class)
PagedIterable<Subscription> listSubscriptions();
/**
* Gets the list of subscriptions of the user.
*
* @return PaginatedCollection of subscriptions of the user.
*/
@Named("subscription:listSubscriptions")
@GET
@Path("/subscriptions/")
@ResponseParser(ParseSubscriptions.class)
PaginatedCollection<Subscription> listSubscriptions(PaginationOptions options);
/**
* Returns requested subscription
*
* @return requested subscription.
*/
@Named("subscription:getSubscription")
@GET
@Path("/subscriptions/{id}/")
@Fallback(Fallbacks.NullOnNotFoundOr404.class)
Subscription getSubscription(@PathParam("id") String id);
/**
* This is identical to the listSubscriptions(), except that subscriptions are not actually bought.
*
* @return SubscriptionCalculator with subscriptions that are not actually bought.
*/
@Named("subscription:calculateSubscriptions")
@POST
@Path("/subscriptioncalculator/")
SubscriptionCalculator calculateSubscriptions(@BinderParam(BindToJsonPayload.class)
Iterable<CalcSubscription> subscriptions);
/**
* Creates a new subscription.
* Subscription times are rounded to noon UTC, using the following rules:
* - End time is always rounded to the next noon.
* - Start time is rounded to the maximum between the current time an the previous noon.
* This means that subscriptions bought for now do start now, but subscriptions for the future start at the previous noon.
*
* @param subscriptionRequest subscription request object
* @return created subscription
*/
@Named("subscription:createSubscription")
@POST
@Path("/subscriptions/")
@SelectJson("objects")
@OnlyElement
Subscription createSubscription(
@BinderParam(BindCreateSubscriptionRequest.class) CreateSubscriptionRequest subscriptionRequest);
/**
* Creates a new subscription. There is a limit of 500 subscriptions that can be purchased in one request.
* Subscription times are rounded to noon UTC, using the following rules:
* - End time is always rounded to the next noon.
* - Start time is rounded to the maximum between the current time an the previous noon.
* This means that subscriptions bought for now do start now, but subscriptions for the future start at the previous noon.
*
* @param subscriptionRequest parameters for new subscriptions
* @return new subscriptions
*/
@Named("subscription:createSubscriptions")
@POST
@Path("/subscriptions/")
@SelectJson("objects")
List<Subscription> createSubscriptions(
@BinderParam(BindCreateSubscriptionRequestList.class) List<CreateSubscriptionRequest> subscriptionRequest);
/**
* Extends the subscription. An extended subscription is actually just another subscription that is linked to the original
* If a period or and end_time are specified in the request,they are used. If neither are specified,
* the creation length of the subscription is used.
* <p/>
* A caveat to this is that a subscription created initially with an end_time, the exact interval is used.
* Subscriptions that are created with a period have the period parsed again in the context of the new start_time.
* An example would be a subscription created on the 1st of February with a period of ‘1 month’ will be extended for 31 days,
* but one that was created with an end date of 1st of March will be extended for 28 days.
* <p/>
* If the specified subscription has actually been extended, it traverses and extends the last subscription in the chain.
*
* @param id id of subscription to extend
*/
@Named("subscription:extendSubscription")
@POST
@Path("/subscriptions/{id}/action/?do=extend")
void extendSubscription(@PathParam("id") String id);
/**
* Toggles the autorenew flag of the subscription.
*
* @param id id of subscription to enable autorenew
*/
@Named("subscription:enableSubscriptionAutorenew")
@POST
@Path("/subscriptions/{id}/action/?do=auto_renew")
void enableSubscriptionAutorenew(@PathParam("id") String id);
/**
* Gets the pricing information that are applicable to the cloud. Subscription prices use a burst level of 0.
*
* @return pricing information that are applicable to the cloud.
*/
@Named("pricing:getPricing")
@GET
@Path("/pricing/")
Pricing getPricing();
/**
* Get discount information.
*
* @return discount information.
*/
@Named("discount:listDiscounts")
@GET
@Path("/discount/")
@ResponseParser(ParseDiscounts.class)
@Transform(ParseDiscounts.ToPagedIterable.class)
PagedIterable<Discount> listDiscounts();
/**
* Get discount information.
*
* @return PaginatedCollection of discount information.
*/
@Named("discount:listDiscounts")
@GET
@Path("/discount/")
@ResponseParser(ParseDiscounts.class)
PaginatedCollection<Discount> listDiscounts(PaginationOptions options);
/**
* Get the transactions for the account.
*
* @return transactions for the account.
*/
@Named("ledger:listTransactions")
@GET
@Path("/ledger/")
@ResponseParser(ParseTransactions.class)
@Transform(ParseTransactions.ToPagedIterable.class)
PagedIterable<Transaction> listTransactions();
/**
* Get the transactions for the account.
*
* @return PaginatedCollection of account's transactions.
*/
@Named("ledger:listTransactions")
@GET
@Path("/ledger/")
@ResponseParser(ParseTransactions.class)
PaginatedCollection<Transaction> listTransactions(PaginationOptions options);
/**
* Get the licenses available on the cloud. The type of the license can be one of:
* install - These licenses are billed per installation, regardless of whether it is attached to a running guests or not.
* instance - These licenses are billed per running instance of a guest. A license attached to a guest that’s stopped is not billed.
* stub - These licenses are billed per a metric specified by the customer (i.e. per number of users license)
* <p/>
* The user metric field specifies what attribute on the instance of the guest is used for determining the number of licenses.
* For example, “smp” will count one license for each CPU/core in the virtual machine.
*
* @return licenses available on the cloud
*/
@Named("license:listLicenses")
@GET
@Path("/licenses/")
@ResponseParser(ParseLicenses.class)
@Transform(ParseLicenses.ToPagedIterable.class)
PagedIterable<License> listLicenses();
/**
* Get the licenses available on the cloud. The type of the license can be one of:
* install - These licenses are billed per installation, regardless of whether it is attached to a running guests or not.
* instance - These licenses are billed per running instance of a guest. A license attached to a guest that’s stopped is not billed.
* stub - These licenses are billed per a metric specified by the customer (i.e. per number of users license)
* <p/>
* The user metric field specifies what attribute on the instance of the guest is used for determining the number of licenses.
* For example, “smp” will count one license for each CPU/core in the virtual machine.
*
* @return PaginatedCollection of licenses available on the cloud
*/
@Named("license:listLicenses")
@GET
@Path("/licenses/")
@ResponseParser(ParseLicenses.class)
PaginatedCollection<License> listLicenses(PaginationOptions options);
}