Changes between Initial Version and Version 1 of GAPI_AM_API_V3


Ignore:
Timestamp:
04/27/12 10:16:51 (12 years ago)
Author:
Aaron Helsinger
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • GAPI_AM_API_V3

    v1 v1  
     1[[PageOutline]]
     2
     3= GENI Aggregate Manager API Version 3 =
     4
     5The GENI Aggregate Manager API allows aggregates to advertise resources and to allocate resources to Slices in the form of Slivers.
     6
     7This page documents the GENI Aggregate Manager API Version '''3'''.
     8
     9See Also:
     10 * [wiki:GAPI_AM_API_V3/CommonConcepts API Version 3 Common concepts, arguments, and returns]
     11 * [wiki:GAPI_AM_API_V3_DETAILS API Version 3 Details page]
     12 * [http://svn.planet-lab.org/attachment/wiki/WikiStart/sfa.pdf Slice-based Facility Architecture (SFA) specification]
     13 * [http://svn.planet-lab.org/attachment/wiki/WikiStart/sfa-impl.pdf PlanetLab Implementation of the Slice-Based Facility Architecture]
     14 * [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2 ProtoGENI Component Manager API revision 2]
     15 * [wiki:GeniApi GENI API] implementation status
     16 * [wiki:GeniApiCredentials GENI credentials] for authorization
     17 * [wiki:GeniApiCertificates GENI certificates] for authentication. The GENI AM API uses XML-RPC over SSL with client authentication using certificates.
     18 * [wiki:GAPI_AM_API_DRAFT Draft API Revisions] proposed for future versions of this API
     19 * [wiki:GAPI_AM_API_ISSUES Open issues with this API]
     20
     21For a summary of the Aggregate Manager API common concepts, arguments, and returns, see [wiki:GAPI_AM_API_V3/CommonConcepts this sub page].
     22
     23== Versions ==
     24
     25 * Latest: 3 - Documented here. Changes since version 2 include:
     26  * All new method names
     27  * Change Set D: Addressable slivers: the ability to add or delete resources from an existing slice reservation at a single aggregate
     28  * Change Set F3: New sliver allocation states & methods.
     29    * Including a cheap 'allocated' state, that tools can use to negotiate resource reservations, and coordinate resource reservations among multiple aggregates (necessary for VLAN stitching)
     30   * Change Sets F4&5: Operational states, and a way for aggregates to advertise resource specific operational states and methods in the Ad RSpec.
     31   * Change Set G: Generalized credential argument, allowing aggregates to accept and tools to supply credentials of alternate types
     32   * Change Set I: Return sliver expiration in most method returns
     33   * Change Set I: Specify SSH node login information in a standard RSpec extension
     34   * Change Set K: Standardize certificate contents, specifically including a UUID and email address with particular semantics
     35   * Change Set K: Standardize slice and user name character and length restrictions
     36   * Change Set M: Split !ListResources in two: !ListResources for Ad RSpecs, and Describe for a slice' manifest RSpec
     37
     38 * Previous: 2 - Documented on [wiki:GAPI_AM_API_V2 the v2 page]. Changes since v1 include:
     39  * Includes Change Sets A and B from the [wiki:GAPI_AM_API_V2_DELTAS v2 Deltas page]
     40  * Specify that GENI RSpecs are XML documents following standard schemas published [http://www.geni.net/resources/rspec on geni.net] and documented [http://www.protogeni.net/trac/protogeni/wiki/RSpec on the ProtoGENI wiki]
     41  * Include additional options in !GetVersion and !ListResources to allow aggregates to specify the RSpec formats they support
     42  * Add an 'options' argument, an XML-RPC struct, to all methods with no required values. This allows Aggregates to innovate or support resource-specific functionality.
     43  * Modify all methods to return an XML-RPC struct consisting of at least (1) a return 'code', (2) the 'value' specified by v1 of the API, and (3) a human-readable 'output' on errors. Aggregates are free to innovate by adding additional return values.
     44
     45 * Original: [wiki:GAPI_AM_API_V1 Version 1]
     46 * [wiki:GAPI_AM_API_DRAFT Draft changes for version 4+
     47  * Covers changes proposed for future versions of this API. Documented changes include:
     48  * Change Set C: Add an !UpdateSliver method to add/remove/modify resources from a slice at an aggregate
     49  * Change Set E: Add the use of Tickets to API methods
     50  * Others to be proposed
     51
     52-----
     53
     54== API Overview ==
     55The GENI Aggregate Manager API is the control plane interface by which experimenters discover, reserve and control resources at resource providers. It does not include resource specific interactions, application level interactions, or monitoring and management functions.
     56
     57=== API Protocols and Data Structures ===
     58
     59GENI specifies that the AM API is provided via [http://www.xmlrpc.com/spec XML-RPC] over an SSL connection. Aggregate Managers shall require client side [wiki:GeniApiCertificates GENI certificates] to authenticate users, accepting only certificates that comply with the adopted [wiki:GeniApiCertificates GENI certificates] standards. The GENI AM API therefore assumes that users have already been authenticated, and that the aggregate manager has available the client certificate to identify the user.
     60
     61Clients are authorized to take actions at aggregates using [wiki:GeniApiCredentials GENI credentials]. To that end, all methods that require authorization take an argument {{{credentials}}}. In particular, operations on a single GENI slice will require a credential (set) that authorizes the client whose certificate was used to authenticate to operate on the slice named by a {{{urn}}} argument to the method or on the slice containing the slivers named by a {{{urns}}} argument.
     62
     63The primary data structure used within this API is a resource specification, known as an [wiki:GAPI_AM_API_V3/CommonConcepts#RSpecdatatype RSpec]. These XML documents follow a specific set of schemas. They are used by aggregates to list and describe local resources (advertisement RSpecs), by experimenters to describe desired resources (request RSpecs), and then by aggregates to describe reserved resources (manifest RSpecs). For more information on RSpecs, see [wiki:GAPI_AM_API_V3/CommonConcepts#RSpecdatatype the RSpecs section on the detail page].
     64
     65=== Using the GENI AM API ===
     66
     67Clients (experimenters) use the AM API to discover resources (`ListResources`), request resources (`Allocate`), provision reserved resources (`Provision`), start resources (`PerformOperationalAction`), check the status of resources as they are started (`Status`), extend their reservation (`Renew`), and then return the resources when done (`Delete`). Client tools may use `GetVersion` to ensure aggregates speak a compatible version of the AM API and known formats for RSpecs. Administrators may call `Shutdown` to stop the resources of a slice at this aggregate, perhaps if that slice is misbehaving.
     68
     69`ListResources` returns to the client an advertisement RSpec - a detailed listing of the resources available at that aggregate. From this information, the experimenter may determine which resources to reserve for their use. The RSpec should also have enough information to help the experimenter set the initial configuration for their resources.
     70
     71Once the experimenter has selected the resources they want and how to configure them, they produce a request RSpec, detailing the resources they want and how they should be configured. They separately contact their slice authority to obtain a slice credential (or set of credentials), granting them rights to reserve resources for that slice. The experimenter then calls `Allocate` on this API, passing in both the slice credential and the request RSpec. The aggregate then attempts to satisfy the experimenter's resource request. If the aggregate can satisfy the request, the aggregate reserves the resources for the experimenter. The resources have not been provisioned yet, giving the experimenter a chance to verify the reservation, or check for corresponding resource availability in another aggregate. If it is acceptable, the experimenter calls `Provision` to set up the resources. The aggregate then starts the process of instantiating the resources and configuring them as requested in the request RSpec. Once that process has started, the `Provision` call returns with a manifest RSpec, listing the resources as reserved and initially configured for the experimenter. 
     72
     73The experimenter can then poll the aggregate manager to watch as the resources are configured and become ready for use, by calling `Status`, looking for an operational state other than `geni_pending_allocation. A given aggregate and sliver type may use a different set of states once provisioning is complete, and further operational actions are possible - see the AM's Ad RSpec. In many cases, this indication comes with a `geni_operational_state` value of `geni_notready`.  Once the resources are ready for use, the experimenter will typically call `!PerformOperationalAction(geni_start)` to start the resources (e.g. boot a machine). The experimenter will also call `Renew` to request that their reservation lasts as long as they require the resources for. When the experimenter is done using the resources, they call `Delete` to end their reservation. The aggregate then stops and clears the resources, freeing them for use by other clients.
     74
     75Typical client work flow:
     76 0. <Experimenter gets a [wiki:GeniApiCertificates GENI certificate] and slice [wiki:GeniApiCredentials credential]>
     77 1. {{{GetVersion()}}}: learn RSpec formats supported at this aggregate
     78 2. {{{ListResources(<user credential>, options)}}}: get Ad RSpec describing available resources
     79 3. <Experimenter constructs a request RSpec>
     80 4. {{{Allocate(<slice URN>, <slice credential>, <request RSpec>, {})}}}:
     81  * Aggregate reserves resources
     82  * Return is a manifest RSpec describing the reserved resources
     83  * Optionally {{{Delete}}} some slivers, if you made a mistake, or don't like what the aggregate picked for you.
     84 5. {{{Provision(<slice URN or sliver URNs>, <slice credential>, <request RSpec>, <users struct>, {})}}}:
     85  * Aggregate instantiates resources
     86  * Return is a manifest RSpec describing the reserved resources, plus any instantiation-specific configuration information
     87 6. {{{Status(<slice URN or sliver URNs>, <slice credential>, {})}}} to check that resources are provisioned (e.g. look for operational state `geni_notready`.
     88 7. {{{PerformOperationalAction(<slice URN>, <slice credential>, geni_start, {})}}}:
     89  * Aggregate starts resources
     90 8. {{{Status(<slice URN or sliver URNs>, <slice credential>, {})}}} to check that resources have started
     91 9. {{{Renew(<slice URN or sliver URNs>, <slice credential>, newtime, {})}}} to extend reservation
     92 10. <Experimenter uses resources>
     93 11. {{{Delete(<slice URN or sliver URNs>, <slice credential>, {})}}} when done
     94
     95=== Changes from AM API v2 ===
     96This version of the AM API includes multiple changes since version 2 of the AM API. For experimenters, a few things are worth noting:
     97 - The old `CreateSliver` operation has now been broken into 3 steps:
     98  - `Allocate` to reserve the resources
     99  - `Provision` to instantiate the resources, which may take time to complete
     100  - `PerformOperationalAction(geni_start)` to start (e.g. boot) the resources, which also may take time to complete
     101 - Use the new intermediate `geni_allocated` state after `Allocate` to coordinate reservations across aggregates, e.g. to ensure another aggregate can give you nodes to be the other end of a requested link.
     102 - Multiple methods have been renamed, typically by removing the `Sliver` term from method names.
     103 - Sliver expiration is available in the return from multiple other methods, like `Provision`
     104 - You no longer use `ListResources` to see the contents of your slice - use `Describe` instead. `ListResources` is only for the AM's Ad RSpec.
     105 - Experimenters can select when to start or stop resources, e.g. when to boot a VM. Consult the operational state machine in the AM's Ad RSpec, and use `PerformOperationalAction`.
     106 - SSH login names and keys should be available in manifest RSpecs in a standard format.
     107 - Slice name restrictions have been codified and standardized.
     108   - Slice names are <=19 characters, only alphanumeric plus hyphen (no hyphen in first character): `'^[a-zA-Z0-9][-a-zA-Z0-9]+$'`
     109
     110Tool developers should also be aware:
     111 - The `credentials` argument to methods is now a struct, including a type and version for each credential. AMs should advertise which credential types they accept. SAs should advertise which type they provide.
     112 - Aggregates may have their own operational states and actions. The Ad RSpec should define these, probably by `sliver_type`.
     113
     114-----
     115 == !GetVersion ==
     116Query static configuration information about this aggregate manager implementation, such as API and RSpec versions supported.
     117
     118For details on the arguments, return structure, and semantics, see [wiki:GAPI_AM_API_V3_DETAILS#GetVersionDetails the details page].
     119
     120The !GetVersion operation is similar to ProtoGENI's [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2#GetVersion GetVersion] operation. The [http://svn.planet-lab.org/attachment/wiki/WikiStart/sfa.pdf SFA] specification does not include this operation.
     121
     122{{{
     123struct GetVersion([optional: struct options])
     124}}}
     125
     126The `options` argument may be omitted entirely by clients.
     127
     128The result is an [http://www.xmlrpc.com/spec XML-RPC] struct with at least the following members:
     129{{{
     130{
     131  int geni_api;
     132  struct code = {
     133       int geni_code;
     134       [optional: string am_type;]
     135       [optional: int am_code;]
     136         }
     137  struct value
     138      {
     139        int geni_api;
     140        struct geni_api_versions {
     141             URL <this API version #>; # value is a URL, name is a number
     142             [optional: other supported API versions and the URLs where they run]
     143        }
     144        array geni_request_rspec_versions of {
     145             string type;
     146             string version;
     147             string schema;
     148             string namespace;
     149             array extensions of string;
     150        };
     151        array geni_ad_rspec_versions of {
     152             string type;
     153             string version;
     154             string schema;
     155             string namespace;
     156             array extensions of string;
     157        };
     158        array geni_credential_types of {
     159             string geni_type <case insensitive>;
     160             string geni_version <containing an integer>;
     161       };
     162      }
     163  string output;
     164}
     165}}}
     166
     167=== Return Summary ===
     168
     169As with all AM API methods, the return is an XML-RPC struct. For !GetVersion, it includes:
     170 * The standard AM API {{{code}}}, {{{value}}}, and {{{output}}} entries. For details, see [wiki:GAPI_AM_API_V3/CommonConcepts#ReturnStruct the Common Concepts page]
     171 * {{{geni_api}}}: integer version of this API ('''3'''). Repeated here for backwards compatibility.
     172
     173!GetVersion {{{value}}} required return members:
     174 * {{{geni_api}}} = '''3''' (Integer current version of this API).
     175 * List of versions of the API supported by this aggregate. For details on doing this, see [wiki:GAPI_AM_API_V3/CommonConcepts#SupportingMultipleAPIVersions the Common Concepts page].
     176 * List of request RSpec formats supported by this aggregate. For details on RSpecs, see [wiki:GAPI_AM_API_V3/CommonConcepts#RSpecs the Common Concepts page].
     177 * List of advertisement RSpec formats supported by this aggregate. For details on RSpecs, see [wiki:GAPI_AM_API_V3/CommonConcepts#RSpecs the Common Concepts page]. 
     178 * List of supported credential types and versions. For details, see [wiki:GAPI_AM_API_V3/CommonConcepts the Common Concepts page].
     179
     180For details on !GetVersion arguments, returns, and semantics, and a sample minimal return, see [wiki:GAPI_AM_API_V3_DETAILS#GetVersionDetails the Details page].
     181
     182 == !ListResources ==
     183Return a listing and description of available resources at this aggregate. The resource listing and description provides sufficient information for clients to select among available resources. These listings are known as RSpecs.
     184
     185{{{
     186struct ListResources(struct credentials[], struct options)
     187}}}
     188
     189The following members are available for use in the options parameter. All aggregate managers are required to honor these options.:
     190{{{
     191{
     192  boolean geni_available <optional>;
     193  boolean geni_compressed <optional>;
     194  struct geni_rspec_version {
     195    string type;
     196    string version;
     197  };
     198}
     199}}}
     200
     201Note that all options may be omitted by the client, except `geni_rspec_version` which is required.
     202
     203Return:
     204A `geni.rspec` advertisment RSpec.
     205
     206Note that this is only part of what !ListResources did in earlier versions of this API. For the what-is-in-my-slice functionality, see `Describe()`.
     207
     208This operation is similar to ProtoGENI's [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2#DiscoverResources DiscoverResources] operation and to the [http://svn.planet-lab.org/attachment/wiki/WikiStart/sfa.pdf SFA]'s !GetResources operation (sec. 6.2.4).
     209
     210 == Describe ==
     211AKA !ListResources when supplied a slice URN.
     212
     213Retrieve a manifest RSpec describing the resources contained by the entities named, e.g. a single slice or a set of the slivers in a slice. This listing and description should be sufficient to allow experimenters to use the resources.
     214{{{
     215struct Describe(string urns[], struct credentials[], struct options[])
     216}}}
     217
     218The following members are available for use in the options parameter. All aggregate managers are required to honor these options.:
     219{{{
     220{
     221  boolean geni_compressed <optional>;
     222  struct geni_rspec_version {
     223    string type;
     224    string version;
     225  };
     226}
     227}}}
     228
     229Note that all options may be omitted by the client, exception `geni_rspec_version` which is required.
     230
     231This method is part of what !ListResources used to do, and is similar to ProtoGENI [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2#Resolve Resolve].
     232
     233Return struct:
     234{{{
     235{
     236   geni_rspec: <geni.rspec, Manifest >
     237   geni_urn: <string slice urn of the containing slice>
     238   geni_slivers: [
     239               {
     240                  geni_sliver_urn: <string sliver urn>
     241                  geni_expires: <dateTime.rfc3339 allocation expiration string, as in geni_expires from SliversStatus>,
     242                  geni_allocation_status: <string sliver state - allocated or ?? >,
     243                  geni_operational_status: <string sliver operational state>
     244               },
     245               ...
     246         ]
     247}
     248}}}
     249
     250Note that the manifest RSpec for allocated slivers may contain less detail than for provisioned slivers. Aggregates are expected to combine the manifests of all requested slivers into a single manifest RSpec. Note that a manifest returned here for only some of the slivers in a slice at this aggregate, may contain references to resources not described in this manifest (they are in other slivers). As a result, such manifests may not be directly usable as a subsequent request.
     251
     252 == Allocate ==
     253AKA !CreateSlivers()
     254
     255Allocate resources as described in a request RSpec argument to a slice with the named URN.  On success, one or more slivers are allocated, containing resources satisfying the request, and assigned to the given slice. This method returns a listing and description of the resources reserved for the slice by this operation, in the form of a manifest RSpec.
     256Allocated slivers are held for an aggregate-determined period. Clients must Renew or Provision slivers before the expiration time (given in the return struct), or the aggregate will automatically Delete them.
     257Aggregates should implement Allocate() as quick, cheap, and not impacting Provisioned resources, such that it can be readily undone.
     258
     259{{{
     260struct Allocate(string slice_urn,
     261                    struct credentials[],
     262                    geni.rspec rspec,
     263                    struct options)
     264}}}
     265
     266This is the first part of what !CreateSliver used to do. The next part is now done by Provision.
     267
     268This operation is similar to ProtoGENI's [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2#GetTicket GetTicket] operation.
     269
     270 * {{{slice_urn}}}: The URN of the slice to which the resources specified in {{{rspec}}} will be allocated. For details on GENI AM API URN identifiers, see the [wiki:GeniApiIdentifiers GENI wiki page].
     271
     272 * {{{rspec}}}: An RSpec matching the [http://www.protogeni.net/trac/protogeni/wiki/RSpec GENI standard] request RSpec [http://www.geni.net/resources/rspec/3/request.xsd schema] containing the resources that the caller is requesting for allocation to the slice specified in {{{slice_urn}}}.
     273
     274Options include:
     275{{{
     276{
     277  [optional geni_end_time: <dateTime.rfc3339: requested expiration of all new slivers, may be ignored by aggregates>]
     278}
     279}}}
     280
     281Return struct:
     282{{{
     283{
     284 geni_rspec: <geni.rspec manifest>,
     285 geni_slivers: [
     286        {
     287                  geni_sliver_urn: <string sliver urn>
     288                  geni_expires: <dateTime.rfc3339 allocation expiration string, as in geni_expires from Status>,
     289                  geni_allocation_status: <string sliver state - allocated or ?? >
     290        },
     291        ...
     292    ]
     293}
     294}}}
     295
     296The manifest is a manifest of only newly allocated slivers.
     297
     298 == Renew ==
     299AKA !RenewSliver() or !RenewAllocated
     300Request that the named slivers be renewed, with their expiration extended. If possible, the aggregate should extend the slivers to the requested expiration time, or to a sooner time if policy limits apply. This method applies to slivers that are `geni_allocated` or to slivers that are `geni_provisioned`, though different policies may apply to slivers in the different states, resulting in much shorter max expiration times for `geni_allocated` slivers.
     301
     302{{{
     303struct Renew(string urns[],
     304                    struct credentials[],
     305                    dateTime.rfc3339 expiration_time,
     306                    struct options)
     307}}}
     308
     309This operation used to be called !RenewSliver. Use Renew(<slice_urn>) to get the equivalent functionality.
     310
     311This operation is similar to ProtoGENI's [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2#RenewSlice RenewSlice] operation.
     312
     313Options include {{{geni_best_effort}}}, specifying whether the client prefers all included slivers to be renewed or none, or wants a partial success if possible.
     314
     315{{{expiration_time}}}: The date-time string in [http://tools.ietf.org/html/rfc3339 RFC 3339] format in UTC when the reservation(s) should be extended until.
     316
     317Return value is a list of structs:
     318{{{
     319[
     320  {
     321   geni_sliver_urn: <string>,
     322   geni_allocation_status: <string>,
     323   geni_operational_status: <string>,
     324   geni_expires: <dateTime.rfc3339 when the sliver expires from its current state>,
     325  },
     326  ...
     327]
     328}}}
     329
     330 == !UpdateAllocations ==
     331AKA !UpdateAllocated()
     332This method modifies a set of allocated slivers in place. The existing reservations are not lost if the newly requested allocations cannot be satisfied by the aggregate.
     333
     334Details are suppressed pending agreement on this method.
     335{{{
     336#!comment
     337
     338{{{
     339struct UpdateAllocations(string urns[], struct credentials[], geni.rspec rspec,
     340                                struct options)
     341}}}
     342
     343`credentials` is the standard argument defined above.
     344
     345Options include:
     346 - {{{geni_end_time}}}:
     347 - {{{geni_best_effort}}}
     348
     349Return struct:
     350{{{
     351{
     352 geni_rspec: <geni.rspec manifest>,
     353 geni_slivers: [
     354        {
     355                  geni_sliver_urn: <string sliver urn>
     356                  geni_expires: <dateTime.rfc3339 allocation expiration string, as in geni_expires from SliversStatus>,
     357                  geni_allocation_status: <string sliver state - allocated or ?? >
     358        },
     359        ...
     360    ]
     361}
     362}}}
     363
     364The manifest is a manifest of only referenced allocated slivers.
     365
     366FIXME: Is this the same method as for updating provisioned slivers?
     367}}}
     368
     369 == Provision ==
     370AKA !ProvisionSlivers()
     371Request that the named `geni_allocated` slivers be made `geni_provisioned`, instantiating or otherwise realizing the resources, such that they have a valid `geni_operational_status` and may possibly be made `geni_ready` for experimenter use. This operation is synchronous, but may start a longer process, such as creating and imaging a virtual machine.
     372
     373{{{
     374struct Provision(string urns[], struct credentials[], 
     375                                   struct options)
     376}}}
     377
     378This operation is part of what !CreateSliver used to do. The first part of what !CreateSliver did is now in `Allocate()`. Note that resources are not necessarily ready for experimenter use after the work that this function initiates finally completes. Consult the `geni_operational_status`, and the advertised operational state machine. Consider calling `PerformOperationalAction`, e.g. with the command name `geni_start`.
     379
     380The operation is similar to ProtoGENI's [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2#RedeemTicket RedeemTicket] method.
     381
     382Options include:
     383 - {{{geni_best_effort}}}
     384 - {{{geni_end_time}}}
     385 - `struct geni_users[]`
     386
     387Return struct:
     388{{{
     389  geni_rspec: <geni.rspec, RSpec manifest>,
     390  geni_slivers:
     391  [
     392    {
     393     geni_sliver_urn: <string>,
     394     geni_allocation_status: <string>,
     395     geni_operational_status: <string>,
     396     geni_expires <dateTime.rfc3339 when the sliver expires from its current state>,
     397    },
     398    ...
     399  ],
     400}}}
     401
     402The returned manifest covers only newly provisioned slivers. Use `Describe` to get a manifest of all provisioned slivers.
     403
     404 == !UpdateSlivers ==
     405AKA Update()
     406This method requests a modification to 1 or more provisioned slivers. The slivers end up in a new `geni_allocated+geni_provisioned` state.
     407
     408Details are suppressed pending agreement on this method.
     409{{{
     410#!comment
     411
     412{{{
     413struct UpdateSlivers(string urns[], struct credentials[], geni.rspec rspec,
     414                                                 struct options)
     415}}}
     416
     417`credentials` is the standard argument defined above.
     418
     419Options include:
     420 - {{{geni_end_time}}}
     421 - {{{geni_best_effort}}}
     422 - `struct geni_users[]`
     423
     424Return struct:
     425{{{
     426{
     427 rspec: <geni.rspec manifest>,
     428 geni_slivers: [
     429        {
     430                  geni_sliver_urn: <string sliver urn>
     431                  geni_expires: <dateTime.rfc3339 allocation expiration string, as in geni_expires from SliversStatus>,
     432                  geni_allocation_status: <string sliver state - allocated or ?? >
     433        },
     434        ...
     435    ]
     436}
     437}}}
     438
     439The RSpec argument may be a new delta format.
     440The manifest is a manifest of only referenced provisioned slivers.
     441
     442FIXME: Is this the same method as for updating allocated slivers?
     443FIXME: Return both a manifest and a delta RSpec?
     444}}}
     445
     446 == Status ==
     447AKA !SliverStatus
     448
     449Get the status of a sliver or slivers belonging to a single slice at the given aggregate. Status may include other dynamic reservation or instantiation information as required by the resource type and aggregate. This method is used to provide updates on the state of the resources after the completion of Provision, which began to asynchronously provision the resources. This should be relatively dynamic data, not descriptive data as returned in the manifest RSpec.
     450
     451{{{
     452struct Status(string urns[], struct credentials[], struct options)
     453}}}
     454
     455This operation used to be called !SliverStatus in earlier versions of the AM API. `geni_slivers` has replaced `geni_resources` and `geni_sliver_urn` replaces `geni_urn`. `geni_status` is replaced with 2 fields, `geni_allocation_status` and `geni_operational_status`.
     456
     457This operation is similar to ProtoGENI's [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2#SliverStatus,WaitForStatus SliverStatus] operation. The [http://svn.planet-lab.org/attachment/wiki/WikiStart/sfa.pdf SFA] specification does not include this operation.
     458
     459Return `value` is a struct:
     460{{{
     461{
     462  geni_urn: <slice URN>
     463  geni_slivers: [
     464                    { geni_sliver_urn: <sliver URN>
     465                      geni_allocation_status: <string, eg provisioned>
     466                      geni_operational_status: <string, eg ready>
     467                      geni_expires: <dateTime.rfc3339 of individual sliver expiration>
     468                      geni_error: <string, eg ''>,
     469                     },
     470                    { geni_sliver_urn: <sliver URN>
     471                      geni_allocation_status: <string, eg provisioned>
     472                      geni_operational_status: <string, eg ready>
     473                      geni_expires: <dateTime.rfc3339 of individual sliver expiration>
     474                      geni_error: <string, eg ''>,
     475                      }
     476                  ]
     477}
     478}}}
     479
     480 == !PerformOperationalAction ==
     481Perform the named operational action on the named slivers, possibly changing the `geni_operational_status` of the named slivers. E.G. 'start' a VM. For valid operations and expected states, consult the state diagram advertised in the Aggregate's Ad RSpec.
     482
     483{{{
     484struct PerformOperationalAction (string urns[], struct credentials[], string action,
     485                                                    struct options={})
     486}}}
     487
     488This operation is similar to ProtoGENI functions like `StartSliver`, `StopSliver`, and `RestartSliver` in the [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2 PG CMv2 API].
     489
     490Aggregate Managers SHOULD return an error code of `13` (`UNSUPPORTED`) if they do not support a given action for a given resource. An AM SHOULD constrain actions based on the current operational state of the resource. This is a fast synchronous operation, and MAY start long-running sliver transitions whose status can be queried using `Status`. This method should only be called, and is only valid, when the sliver is fully allocated (allocation state is not `geni_pending_allocation`).
     491
     492Options include: {{{geni_best_effort}}}. Default is false (action applies to all slivers equally or none.
     493
     494Return value is a list of structs:
     495{{{
     496[ {
     497        geni_sliver_urn : <string>,
     498        geni_allocation_status: <string, eg provisioned>
     499        geni_operational_status : <string>,
     500        geni_expires: <dateTime.rfc3339 of individual sliver expiration>
     501        [optional: 'geni_resource_status' : string]
     502        },
     503        ...
     504]
     505;
     506}}}
     507
     508 == Delete ==
     509AKA !DeleteSliver
     510Delete the named slivers, making them `geni_unallocated`. Resources are stopped in necessary, and both de-provisioned and de-allocated. No further AM API operations may be performed on slivers that have been deleted.
     511
     512{{{
     513struct Delete(string urns, struct credentials[], struct options)
     514}}}
     515
     516This operation used to be called !DeleteSliver in earlier versions of this API. To get the functionality of !DeleteSliver, call Delete with the slice URN.
     517
     518This operation is similar to ProtoGENI's [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2#DeleteSliver DeleteSliver] operation and to the [http://svn.planet-lab.org/attachment/wiki/WikiStart/sfa.pdf SFA]'s !DeleteSlice operation (sec. 6.2.3).
     519
     520Options include: {{{geni_best_effort}}}
     521
     522Return list of structs:
     523{{{
     524[
     525  {
     526   geni_sliver_urn: <string>,
     527   geni_allocation_status: <string>,
     528   geni_expires: <dateTime.rfc3339 when the sliver expires from its current state>,
     529  },
     530  ...
     531]
     532}}}
     533
     534 == Shutdown ==
     535Perform an emergency shutdown on the slice at this aggregate. Resources should be taken offline, such that experimenter access (on both the control and data plane) is cut off. No further actions on the slice should be possible at this aggregate, until an un-specified operator action restores the slice. This operation is intended for operator use. The sliver is shut down but remains available for further forensics.
     536{{{
     537struct Shutdown(string slice_urn, struct credentials[], struct options)
     538}}}
     539
     540This operation is similar to ProtoGENI's [http://www.protogeni.net/trac/protogeni/wiki/ComponentManagerAPIV2#Shutdown Shutdown] operation. The [http://svn.planet-lab.org/attachment/wiki/WikiStart/sfa.pdf SFA] specification does not include this operation.
     541
     542Return: XML-RPC boolean, indicating whether the resources associated with this reservation were successfully shut down to a state suitable for forensics.