Changes between Initial Version and Version 1 of AaronHelsinger/GAPI_AM_API_DRAFT2


Ignore:
Timestamp:
04/04/12 10:49:41 (12 years ago)
Author:
Aaron Helsinger
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AaronHelsinger/GAPI_AM_API_DRAFT2

    v1 v1  
     1[[PageOutline]]
     2
     3= GENI Aggregate Manager API Draft Revisions =
     4
     5This page documents DRAFT revisions to the GENI Aggregate Manager API, proposed for the next version of the API. As indicated below, some of the revisions documented here have been discussed on the GENI developer mailing list, and during at least one GEC. Other revisions are in early discussions and subject to change or abandonment.
     6
     7The GENI Aggregate Manager API allows aggregates to advertise resources and to allocate resources to Slices in the form of Slivers. A Sliver is a set of resources allocated by one Aggregate to one Slice. See below for a proposed complete definition.
     8
     9The current officially adopted version of the API is '''2''' and is documented on [wiki:GAPI_AM_API the main API page].
     10
     11API Version 2 was adopted based on changes previously listed on this page. Those changes have been removed from this page, and are now documented [wiki:GAPI_AM_API_V2_DELTAS on a separate page]. They include:
     12 A. RSpec related changes, specifying that RSpecs are XML following GENI standard schemas.
     13  * Since June 2011, the latest software from ProtoGENI and SFA (as of code tag 1.0-24) has complied with these changes.
     14  * Omni version 1.3 (released June 2011) added client software support for these changes.
     15 B. Supporting flexible arguments and returns. Specifically, adding a property list to all calls, and making all returns be a property list.
     16
     17This page documents proposed changes for AM API version '''3'''. These changes are grouped into sets. API Version 3 will be the collection of changes from the change sets below which we next agree on. Change sets still under discussion will then be targeted at a future release.
     18
     19== Proposing Additional Changes ==
     20GENI community members are encouraged to propose changes to the GENI Aggregate Manager API.
     21
     22Technical discussions are generally held on the [mailto:dev@geni.net Developers mailing list]
     23
     24Specific questions may be directed to the software team at the GPO (Tom Mitchell, Aaron Helsinger, and Sarah Edwards) at {tmitchel, ahelsing, sedwards} at geni.net
     25
     26= Proposed changes for GENI Aggregate Manager API version 3 =
     27
     28This page documents a long list of proposed changes for AM API version 3. These changes provide ways for aggregates to expand GENI functionality, without requiring further API modifications.
     29
     30There are many changes here. As such, aggregates may implement these to varying degrees.
     31 - Clients are reminded that these methods are requests - based on the AM type and resource types, these requests may fail or not make sense. Clients should watch for {{{UNSUPPORTED}}} returns.
     32 - AMs are encouraged to implement as much of this API as reasonable to provide a common front for clients. When a function is not possible, return {{{UNSUPPORTED}}}, document publicly what functions do work, and suggest alternative ways to get the result the client desired.
     33
     34= Summary =
     35== Proposed Changes ==
     36Multiple change sets have been proposed.
     37
     38Below, you will see that some change sets have been withdrawn (J). Others have been superseded, meaning that other proposals implement similar concepts in an alternative way (Change Sets F1 and F2). Some sets may be postponed, to be considered for a later version of this API (L). In addition, two change sets are waiting on revised proposals (C and E).
     39
     40Given that, readers of this page should focus on Change Sets F, G, I, K, and M.
     41
     42Proposals currently under discusion:
     43 - [wiki:GAPI_AM_API_DRAFT2#ChangeSetD:Sliver-specificoperations Change Set D: Slivers]: ''Partially superseded.'' Change methods to clarify that there may be multiple slivers per slice at an AM, and to allow operating on individual slivers
     44 - [wiki:GAPI_AM_API_DRAFT2#ChangeSetF3:SliverAllocationStatesandmethods Change Set F3]: Sliver Allocation States and methods
     45 - [wiki:GAPI_AM_API_DRAFT2#ChangeSetF4:SliverOperationsMethod Change Set F4]: Method to perform Sliver Operational actions
     46 - [wiki:GAPI_AM_API_DRAFT2#ChangeSetF5:SliverOperationalStates Change Set F5]: Sliver Operational States
     47 - [wiki:GAPI_AM_API_DRAFT2#ChangeSetM:NewMethodSignatures Change Set M]: New method signatures, incorporating all previous adopted change sets
     48
     49We are awaiting new proposals on !UpdateSlivers, and the semantics of adding multiple sets of resources to a slice at an aggregate.
     50
     51Proposals previously adopted:
     52 - '''ADOPTED''': [wiki:GAPI_AM_API_DRAFT2#Adopted:ChangeSetG:Credentialsaregeneralauthorizationtokens. Change Set G]: Generalize the credentials argument, allowing ABAC support
     53 - '''ADOPTED''': Change Set I1: !SliversStatus return structure includes sliver expiration
     54 - '''ADOPTED''' with changes: Change Set I2: !SliversStatus return includes SSH logins/key for nodes that support SSH access
     55 - '''ADOPTED''': Change Set I3: !CreateSlivers return becomes a struct, adds sliver expiration
     56 - '''ADOPTED''': wiki:GAPI_AM_API_DRAFT2#Adopted:ChangeSetK:Standardizecertificatesandcredentials Change Set K]: Standardize certificate contents, etc
     57  - Include a real serial number, holder email, holder uuid, and optionally authority URL in certificates
     58  - Define slice ID as the UUID plus URN in slice certificates
     59  - Define slice name, sliver name, and user name restrictions, and similar for URNs
     60  - Publish schemas for credentials and certificates
     61
     62For a  full listing of the proposed API methods after all these changes, see [wiki:GAPI_AM_API_DRAFT2/MethodSignatures the Method Signatures Summary page].
     63
     64Older proposals, withdrawn, superseded, or postponed:
     65 - [wiki:GAPI_AM_API_DRAFT2/Archive#ChangeSetC Change Set C]: ''On hold'' (waiting for a revised proposal). Add the ability to !UpdateSlivers to immediately modify your reservation
     66 - [wiki:GAPI_AM_API_DRAFT2/Archive#ChangeSetE:Tickets Change Set E: Tickets]: ''On hold'' (waiting for a revised proposal). Add methods using tickets to do negotiated reservations
     67 - [wiki:GAPI_AM_API_DRAFT2/Archive#ChangeSetF1:DefineSliverStates Change Set F1]: ''Superseded'' by F3 and F4: Define sliver states, and the state changes that various methods cause
     68 - [wiki:GAPI_AM_API_DRAFT2/Archive#ChangeSetF2:ActOnSlivers Change Set F2]: ''Superseded'' by F3 and F4: Add a new general !ActOnSlivers method allowing AMs to support AM and resource-type specific operations
     69 - [wiki:GAPI_AM_API_DRAFT2/Archive#ChangeSetH Change Set H]: ''Superseded by F3'': Clarify: A second call to !CreateSlivers without an intervening !DeleteSlivers is an error.
     70 - [wiki:GAPI_AM_API_DRAFT2/Archive#ChangeSetI4 Change Set I4]: ''Superseded by F3 and F4'': !CreateSlivers optionally does not start resources.
     71 - ''Withdrawn'': [wiki:GAPI_AM_API_DRAFT2/Archive#Withdrawn:ChangeSetJ Change Set J]: Support proxy aggregates with 1 new option and 1 new !GetVersion entry
     72 - ''Postponed'': [wiki:GAPI_AM_API_DRAFT2/Archive#ChangeSetL:ChangeSFAcredentialsprivileges Change Set L]: Standardize slice credential privileges
     73
     74== Unspecified items ==
     75 - Semantics of adding or removing slivers from the full set of slivers in a slice at an aggregate
     76 - An acceptable Update proposal
     77 - RSpec for advertising operational states for a sliver type
     78 - Publish credential schema
     79 - Define error codes returned by new methods, conditions
     80
     81----
     82
     83
     84= Change Set D: Sliver-specific operations =
     85A slice may have multiple slivers at a single AM. Experimenters can operate on slivers independently, if the AM supports it. AMs define slivers as groups of resources, and give them locally unique sliver_urns for identifying that group of resources.
     86
     87This change was briefly discussed at GEC13, and remains open for discussion. Concerns include whether aggregates can support individually operating on slivers, and whether we should make this change without that functionality.
     88
     89See http://lists.geni.net/pipermail/dev/2012-March/000593.html as well.
     90
     91== Motivation ==
     92This change set was discussed at the [http://groups.geni.net/geni/wiki/GEC12GeniAmAPI GEC12 AM API session].
     93
     94The current AM API calls take a Slice URN, and operate on all resources under that label at the given aggregate - all the resources for that slice at the aggregate are allocated, renewed, and deleted together. There is no provision for releasing some of the resources allocated to the slice at that aggregate, or for adding new resources to the reservation for that slice at a given aggregate.
     95
     96This ties closely to the precise definition of a Slice vs a Sliver. The current AM API methods imply that a sliver represents all resources at an aggregate for a given slice. However, this does not match the definition that previous GENI documents have used, nor the functionality that experimenters desire.
     97
     98Previous GENI documents have used this definition:
     99''A sliver is the smallest set of resources at an aggregate that can be independently reserved and allocated. A given slice may contain multiple slivers at a single aggregate. A sliver may contain multiple components.''
     100
     101Given this definition, the current AM API methods in fact operate on a group of slivers.
     102
     103This change set would provide a means for experimenters to operate on individual slivers within their slice at a given aggregate.
     104
     105== Define sliver ==
     106A Sliver is an aggregate defined grouping of resources within a slice at this aggregate, whose URN identifies the sliver, and can be used as an argument to methods such as !DeleteSlivers or !RenewSlivers, and whose status can be independently reported in the return from !SliversStatus. The AM defines 1 or more of these groupings to satisfy a given resource request for a slice. All reserved resources are directly contained by exactly 1 such sliver container, which is in precisely 1 slice.
     107
     108Slivers are identified by an aggregate selected URN. See other change proposals for details on standardizing such URNs.
     109
     110== Addressable Slivers ==
     111Considering the clarified sliver definition, several API names are misleading. This change proposal modifies those method names to clarify that they may work with multiple slivers. Additionally, some methods can logically operate on individual slivers: this change modifies those methods' arguments to allow specifying a particular sliver.
     112
     113'''This proposal is missing a supplementary proposal of the semantics involved in operating on individual slivers, part of the slice at an AM.''' In particular, defining whether !CreateSlivers can be called multiple times, and the semantics of doing !DeleteSlivers or !RenewSlivers on only some of the slivers in a slice at an aggregate.
     114
     115'''The specific method signature changes of this proposal are superseded by proposal F3 and the proposed summary methods at the bottom of this page.'''
     116
     117 1. Rename some existing methods to clarify that they act on 1+ slivers:
     118  - !CreateSliver -> !CreateSlivers
     119  - !RenewSliver -> !RenewSlivers
     120  - !DeleteSliver -> !DeleteSlivers
     121  - !SliverStatus -> !SliversStatus
     122
     123 2. Some methods that take {{{slice_urn}}} now take a {{{urn}}} that may be a slice or sliver:
     124  - !RenewSlivers, !DeleteSlivers, !SliversStatus
     125  - AMs are responsible for distinguishing whether the request operates on a slice or a sliver (see [#ChangeSetK:Standardizecertificatesandcredentials Change Set K] which defines how slice and sliver URNs differ).
     126  - AMs are free to refuse to Renew, Delete, or provide status on an individual sliver, if the local AM or that resource type does not support it.
     127   - AMs should return an error message. Clients may often use !UpdateSlivers instead to similar effect.
     128
     129Open Question: Should the methods take a list of urns, 1 of which may be a slice_urn?
     130
     131
     132= Change Set F: Support AM and resource-type specific methods. =
     133Define the control API (the AM API) as about moving slivers through various states at an AM.
     134
     135The proposal originally here elicited concerns (the method !ActOnSlivers is an ioctl, and the states mix allocation and operational states).
     136
     137A later alternative proposal, see http://lists.geni.net/pipermail/dev/2012-March/000721.html
     138
     139At the GEC13 coding sprint, a variant on the above was approved. It is documented here as [#ChangeSetF3:SliverAllocationStatesandmethods Change Set F3].
     140
     141A variant on the operational states proposal is defined as Change Set F4 and documented here: https://openflow.stanford.edu/display/FOAM/GENI+-+PerformOperationalAction
     142
     143== Motivation ==
     144AM API methods logically change the state of the slivers at this AM. But the API is not clear what experimenters should expect, and does not provide easy ways for experimenters to control when and how states change. There is in particular no way to move slivers through states and change them in ways otherwise undefined by the API.
     145
     146
     147== Change Set F3: Sliver Allocation States and methods ==
     148'''This change was discussed and adopted at the GEC13 Coding Sprint.'''
     149
     150For meeting minutes, see: [wiki:GEC13Agenda/CodingSprint the GEC13 Coding Sprint agenda page].
     151
     152 - We agreed to use two kinds of states: allocation states, and operational states. We put off discussion of operational states (ie is the node booted), noting however that this is critical. See Change Set F4.
     153 - We debated whether the API should specify a limited number of states, or allow for aggregate or resource specific states. We agreed that for allocation states, the API should define a limited set of states, while operational states might be more permissive.
     154 - We discussed the pros and cons of including a single all-in-one method to change allocation states, or a single method per desired transition. There is at least 1 case where there are 2 paths between the same 2 allocation states with very different meaning. As a result, we agreed to use a separate method per allocation state change.
     155
     156We agreed on 3 allocation states for slivers and an enumeration of methods for transitioning between those states.
     157
     158[[Image(sliver-alloc-states3.jpg)]]
     159
     160Allocation states:
     161 1. `geni_unallocated` (alternatively called 'null'). The sliver does not exist. This is the small black circle in typical state diagrams.
     162 2. `geni_allocated` (alternatively called 'offered' or 'promised'). The sliver exists, defines particular resources, and is in a sliver. The aggregate has not (if possible) done any time consuming or expensive work to instantiate the resources, provision them, or make it difficult to revert the slice to the state prior to allocating this sliver. This state is what the aggregate is offering the experimenter.
     163 3. `geni_provisioned`. The aggregate has started instantiating resources, and otherwise making changes to resources and the slice to make the resources available to the experimenter. At this point, operational states are valid to specify further when the resources are available for experimenter use.
     164
     165The key change is the addition of state 2, representing resources that have been allocated to a slice without provisioning the resources. This represents a cheap and un-doable resource allocation, such as we previously discussed in the context of tickets. This compares reasonably well to the 'transaction' proposal written up by Gary Wong (http://www.protogeni.net/trac/protogeni/wiki/AM_API_proposals). When a sliver is created and moved into state 2 (`geni_allocated`), the aggregate produces a manifest RSpec identifying which resources are included in the sliver. This is something like the current !CreateSliver, except that it does not provision nor start the resources. These resources are exclusively available to the containing sliver, but are not ready for use. In particular, allocating a sliver should be a cheap and quick operation, which the aggregate can readily un-do without impacting the state of slivers which are fully provisioned. For some aggregates, transitioning to this state may be a no-op.
     166
     167States 2 and 3 (`geni_allocated` and `geni_provisioned`) have aggregate and possibly resource specific timeouts. By convention the `geni_allocated` state timeout is typically short, like the {{{redeem_before}}} in ProtoGENI tickets, or the {{{commit_by}}} in Gary's transactions proposal. The `geni_provisioned` state timeout is the existing sliver expiration. If the client does not transition the sliver from `geni_allocated` to `geni_provisioned` before the end of the `geni_allocated` state timeout, the sliver reverts to `geni_unallocated`. If the experimenter needs more time, the experimenter should be allowed to request a renewal of either timeout.  Note that typically the sliver expiration time (timeout for state 3, `geni_provisioned`) will be notably longer than the timeout for state 2, `geni_allocated`.
     168
     169State 3, `geni_provisioned`, is the state of the sliver allocation after the aggregate begins to instantiate the sliver. Note that fully provisioning a sliver may take noticeable time. This state also includes a timeout - the sliver expiration time (which is not necessarily related to the time it takes to provision a resource). !RenewSliver extends this timeout. For some aggregates and resource types, moving to this state from state 2 (`geni_allocated`) may be a no-op.
     170
     171If the transition from one state to another fails, the sliver shall remain in its original state.
     172
     173These are the only allocation states supported by this API. Since the state transitions are finite, but include potentially multiple transitions between the same two states, this API uses separate methods to perform each state transition, rather than a single method for requesting a new state for the sliver.
     174 1. Allocate moves 1+ slivers from `geni_unallocated` (state 1)  to `geni_allocated` (state 2). This method can be described as creating an instance of the state machine for each sliver. If the aggregate cannot fully satisfy the request, the whole request fails. This is a change from the version 2 !CreateSliver, which also provisioned the resources, and 'started' them. That is Allocate does 1 of the 3 things that !CreateSliver did previously.
     175 2. Delete moves 1+ slivers from either state 2 or 3 (`geni_allocated` or `geni_provisioned`), back to state 1 (`geni_unallocated`). This is similar to the AM API version 2 !DeleteSliver.
     176 3. Renew, when given allocated slivers, requests an extended timeout for slivers in state 2 (`geni_allocated`).
     177 4. Renew can also be used to request an extended timeout for slivers in state 3 - the `geni_provisioned` state. That is, this method's semantics can be the same as !RenewSliver from AM API v2.
     178 5. Provision moves 1+ slivers from state 2 (`geni_allocated`) to state 3 (`geni_provisioned`). This is some of what version 2 !CreateSliver did. Note however that this does not 'start' the resources, or otherwise change their operational state. This method only fully instantiates the resources in the slice. This may be a no-op for some aggregates or resources.
     179
     180These states apply to each sliver individually. Logically, the state transition methods then take a single sliver URN. For convenience, these methods accept a list of sliver URNs, or a slice URN as a simple alias for all slivers in this slice at this aggregate.
     181
     182Since each method may operate on multiple slivers, each of these methods returns a list of structs as the value:
     183{{{
     184value = [
     185  {
     186   geni_sliver_urn: <string>,
     187   geni_allocation_status: <string>,
     188   geni_expires: <time when the sliver expires from its current state>,
     189   <others AM or method specific>
     190   <Provision returns geni_operational_status>
     191  },
     192  ...
     193]
     194}}}
     195
     196Allocate returns a single manifest RSpec, plus the above list of structs.
     197
     198Aggregates must be consistent across all these methods whether they are all or nothing, or support partial success.
     199
     200These methods all take a new option (aggregates must support it, clients do not need to supply it):
     201{{{
     202   geni_best_effort: <XML-RPC boolean 1/0, default 0>
     203}}}
     204If false, the client is requesting that the aggregate either fully satisfy the request, moving all listed slivers to the desired state, or fully fail the request, leaving all slivers in their original state.
     205If the aggregate cannot guarantee all or nothing success or failure given the included slivers and resource types, the aggregate shall fail the request, returning an appropriate error code. If this option is true, then some slivers may transition to the new state, and some note. Aggregates must examine the return closely to know the state of their slivers.
     206
     207'''Note''': Allocate remains (like v2 !CreateSliver) all or nothing (either the aggregate can allocate all desired resources as requested, or the call fails).
     208
     209'''Note''': These calls are synchronous - when they return, the slivers shall be in their final state. In particular, the transition from state 2 to 3 (`geni_allocated` to `geni_provisioned`) should be quick. The resource that is now in the 'provisioned' state may take a long time to actually be ready for operational use (e.g. imaging and booting the node) -- this remains true as in version 2 after !CreateSliver. Note that the `geni_allocated` state is by definition cheap, such that transitioning to this state should also be quick.
     210
     211!SliverStatus, where it currently includes {{{geni_status}}} for each `geni_resource`, shall now return {{{geni_allocation_status}}} with one of the above defined values, and {{{geni_operational_status}}}. The values of {{{geni_operational_status}}} are still under discussion.
     212
     213Currently, !SliverStatus returns a single {{{geni_status}}} for the entire slice at this aggregate. With this change, the top-level allocation status for the slice is not defined, and that field is not required.
     214
     215Open Questions:
     216 - What about an !UpdateAllocations method, similar to !UpdateTickets or !UpdateTransactions from other similar proposals, for modifying allocated resources in place, without losing allocated resources?
     217
     218== Change Set F4: Sliver Operations Method ==
     219This proposal was discussed on the geni-dev mailing list: http://lists.geni.net/pipermail/dev/2012-March/000743.html
     220
     221The canonical source for documentation on this proposal is here: https://openflow.stanford.edu/display/FOAM/GENI+-+PerformOperationalAction
     222
     223Open questions include:
     224 - Do we need a state discovery mechanism? A method? An RSpec ad extension?
     225 - Should the method default to all or nothing? Or to partial success?
     226 - What are the defined operational states, and GENI standard actions for transitions?
     227 - Does the API specify how operational state of slivers rolls up to the state of the slice at the aggregate?
     228 - Make option names and returns consistent between this change set and [#ChangeSetF3:SliverAllocationStatesandmethods change set F3]
     229
     230{{{
     231struct PerformOperationalAction (string urn[], struct credentials[], string action,
     232                                         struct options={})
     233}}}
     234
     235{{{
     236{
     237  struct code = {
     238       int geni_code;
     239       [optional: string am_type;]
     240       [optional: int am_code;]
     241         }
     242  struct value = [ {
     243        'geni_urn' : string,
     244        'geni_operational_status' : string,
     245        [optional: 'geni_resource_status' : string]
     246        }, ... ];
     247  string output;
     248}
     249}}}
     250
     251Performs the given action on the given sliver_urn(s) (or slice_urn as a proxy for "all slivers").  Actions are constrained to the set of default GENI actions, as well as resource-specific actions which reasonably perform operational resource tasks as defined by the aggregate manager for the given resource type.  This method is not intended to allow for reconfiguration of options found in the request rspec.  Aggregate Managers SHOULD return an error code of `13` (`UNSUPPORTED`) if they do not support a given action for a given resource. Actions are performed on all slivers, or none - if an action cannot be performed on a sliver given, the entire operation MUST fail. Passing the option `geni_best_effort` allows for partial success.
     252
     253An AM SHOULD constrain actions based on the current operational state of the resource, such that attempting to perform the action `geni_stop` on a resource that is `geni_busy` will fail, but SHOULD also be idempotent for all actions which result in a steady state.
     254
     255`geni_operational_status` MUST be the current operational status of the sliver after this action (as would be returned by !SliverStatus). An optional `geni_resource_status` field MAY be returned for each sliver which contains a resource-specific status that may be more nuanced than the options for `geni_operational_status`.
     256
     257Calling this method with a slice_urn functions as if all the child sliver_urn's had been passed in - specifically the action is performed on all slivers and all sliver_urn's and their statuses are returned. No status is returned for the slice as a whole.
     258
     259This is a fast synchronous operation, and MAY start long-running sliver transitions whose status can be queried using !SliverStatus.
     260
     261== Change Set F5: Sliver Operational States ==
     262Currently, geni_status in !SliverStatus can have values `configuring`, `ready`, `failed`, `unknown`.
     263
     264This proposal modifies that list, and renames those to use the standard 'geni_' prefix.
     265
     266These states would be reported by various AM API methods, specifically !SliverStatus. And would be used in reasoning about valid operations in !PerformOperationalAction
     267
     268The AM API defines a few operational states with particular semantics. AMs are not required to support them for a given set of resources, but if they use them, they must follow the given semantics. AMs are however STRONGLY encouraged to support them, to provide maximum utility.
     269
     270Similarly, the API defines a few operational actions: these need not be supported. AMs are encouraged to support these if possible, but only if they can be supported following the defined semantics.
     271
     272AMs may have their own operational states/state-machine internally. AMs are required to advertise such states and actions that  experimenters may see or use, by using Ad RSpec extensions. Operational states which the experimenter never sees, need not be advertised. Operational states and actions are generally by resource type. The standard RSpec extension attaches such definitions to the `sliver_type` element of RSpecs.
     273
     274'''TODO''': Jon Duerig will propose this extension, with examples covering PG/Emulab sliver_types.
     275
     276Tools must use the operational states and actions advertisement to determine what operational actions to offer to  experimenters, and what actions to perform for the experimenter. Tools may choose to offer actions which the tool does not understand, relying on the experimenter to understand the meaning of the new action.
     277
     278States should be defined in terms of (a) whether the resource is accessible to the experimenter on the data or control planes, (b) whether an experimenter action is required to change from this state,
     279and if so, (c) what action or actions are useful. If the resource will change states without explicit experimenter action, what is the expected next state on success.
     280
     281Note that states represent the AM's view of the operational condition of the resource. This state may be wrong due to faulty information at the AM.
     282
     283Any operational action may fail. When this happens, the API method should return an error code. The sliver may remain in the  original state. In some cases, the sliver may transition to the `geni_failed` state.
     284
     285There is no `busy` state. Instead, AMs are encouraged to define separate such transition states for each separate transition path, allowing experimenters to distinguish the start and end states for this transition.
     286
     287`shutdown` is not an operational state for a sliver. The Shutdown() API method applies to an entire slice.
     288
     289GENI defined operational states:
     290 - `geni_notready`: A final state. The resource is not usable / accessible by the experimenter, and requires explicit experimenter action before it is usable/accessible by the experimenter. For some resources, `geni_start` will move the resource out of this state and towards `geni_ready`.
     291 - `geni_configuring`: A wait state. The resource is in process of changing to geni_ready, and on success will do so without additional experimenter action. For example, the resource may be powering on.
     292 - `geni_ready`: A final state. The resource is usable/accessible by the experimenter, and ready for slice operations.
     293 - `geni_ready_busy`: A wait state. The resource is performing some operational action, but remains accessible/usable by the experimenter. Upon completion of the action, the resource will return to `geni_ready`.
     294 - `geni_failed`: A final state. Some operational action failed, rendering the resource unusable. An administrator action, undefined by this API, may be required to return the resource to operations.
     295
     296GENI defined operational actions:
     297 - `geni_start`: This action results in the sliver becoming `geni_ready` eventually. The operation may fail (move to `geni_failed`), or move through some number of transition states. See EG booting a VM.
     298 - `geni_restart`: This action results in the sliver becoming `geni_ready` eventually. The operation may fail (move to `geni_failed`), or move through some number of transition states. During this operation, the resource may largely remain accessible/usable. Dynamic state associated with this resource may be lost by performing this operation. See EG re-booting a VM.
     299 - `geni_stop`: This action results in the sliver becoming `geni_notready` eventually. The operation may fail (move to `geni_failed`), or move through some number of transition states. See EG powering down a VM.
     300
     301Actions are performed using the above proposed !PerformOperationalAction.
     302
     303= Adopted: Change Set G: Credentials are general authorization tokens. =
     304
     305'''This change was adopted at GEC13.'''
     306
     307== Motivation ==
     308Most AM API methods take a list of credentials to authorize operations. Currently the API requires credentials in a particular format, and would disallow others, such as ABAC.
     309The API should allow for other innovative authorization tokens.
     310
     311== Make credentials more general ==
     312This change modifies the credentials argument to all methods. Each credential is now defined only as a signed document. A given list of credentials may contain credentials in multiple formats. The list may be empty. A given authorization policy at an AM may require 0, 1, or many credentials. Aggregates are required to allow credentials which are not used by local authorization policy or engines, using only credentials locally relevant.
     313
     314 - An AM must pick credentials out of the list that it understands and be robust to receiving credentials it does not understand.
     315  - Current slice and user credentials will be recognizable for following the schema defined in [#ChangeSetK:Standardizecertificatesandcredentials Change Set K].
     316 - AMs are required to continue to accept current-format credentials.
     317  - In particular, a single standard slice credential remains sufficient for most authorization policies.
     318 - Other credential formats acceptable by some aggregates might include ABAC x509 Attribute certificates, eg.
     319 - AMs may get other authorization material from other sources: EG a future Credential Store service.
     320
     321== Advertising supported credentials ==
     322
     323We agreed that aggregates must advertise what types of credentials they accept so clients know how to gain authorization for API methods.
     324
     325Aggregates are required to return a new entry in !GetVersion:
     326{{{
     327geni_credential_types = <a list of structs>: [
     328  {
     329   geni_type: <string, case insensitive>,
     330   geni_version: <string containing an integer>,
     331   <others fields optionally. EG A URL for more info, or a schema>
     332  }
     333]
     334}}}
     335
     336We agreed that "sfa" slice credentials as defined pre AM API version 3 will have type=`geni_sfa` and version=`2`. "sfa" slice credentials as of AM API version 3 will be type=`geni_sfa`, version=`3`.
     337ABAC credentials as of AM API version 3 will be type=`geni_abac`, version=`1`.
     338
     339For example, an aggregate that accepts ABAC credentials, SFA slice credentials that were issued prior to AM API v3, and SFA slice credentials from AM API version 3, would include this in !GetVersion:
     340
     341{{{
     342geni_credential_types = [
     343  {
     344   geni_type = "geni_sfa",
     345   geni_version = "2"
     346  },
     347  {
     348   geni_type="geni_sfa",
     349   geni_version = "3"
     350  },
     351  {
     352   geni_type="geni_abac",
     353   geni_version="1"
     354  }
     355]
     356}}}
     357
     358Note that there might be multiple {{{geni_type}}} entries to support multiple versions of SFA credentials.
     359Note there might also be multiple kinds of ABAC credentials: identity certificates, attribute certificates, references to those certificates, bundles of those certificates. We briefly considered adding a sub_type field or a flag for 'credentials' that are really references to credentials.
     360
     361== Specifying Type of Supplied Credentials ==
     362
     363For  AMs to understand the type of each supplied credential, per-AM heuristics are not sufficient - they might differ at different AMs.
     364
     365The API will require that credentials be explicitly typed. This change makes methods take in the credentials argument a struct:
     366{{{
     367credentials = [
     368   {
     369    geni_type: <string>,
     370    geni_version: <string>,
     371    geni_value: <string>,
     372    <others>
     373   }
     374]
     375}}}
     376
     377Note that the value may be a credential, a URL, an [http://www.w3.org/TR/xlink11/ XLink] compliant string, etc. Clients are required to identify the type of each credential they supply. Instead of requiring clients to apply similar heuristics, authorities are required to identify credentials they supply with the same type and version fields. Specifically, ProtoGENI representatives suggested that their slice authorities would issue credentials as these structures in the near future.
     378
     379= Changes to existing methods =
     380Modify a few existing methods to make certain operations easier or more experimenter friendly.
     381
     382== Change Sets H&I: Misc other method changes ==
     383
     384 - '''Adopted: Change Set I1''': Add {{{geni_expires}}} to return from !SliversStatus for whole slice and then each sliver
     385  - '''This change was adopted at GEC13'''
     386  - This change standardizes behavior necessary for experimenters to determine their sliver expiration times.
     387  - Format is RFC3339 (http://www.ietf.org/rfc/rfc3339.txt)
     388   - Full date and time with explicit timezone: offset from UTC or in UTC)
     389   - eg: {{{1985-04-12T23:20:50.52Z}}} or {{{1996-12-19T16:39:57-08:00}}}
     390
     391 - '''Adopted: Change Set I2''': Add SSH logins/keys to each node that supports SSH login in the manifest RSpec
     392This change standardizes behavior so experimenters can readily find how to log in to reserved resources. Aggregates that allocate resources that an experimenter can 'log in to', should use this struct to return that information. Other aggregates will not use this at all.
     393
     394'''This change was adopted at GEC13.'''
     395
     396Aggregates shall use a new RSpec extension to include all login information in manifest RSpecs. This extension is version controlled in the GENI RSpec git repository.
     397
     398The extension adds information to the `<services>` tag, which already has the `<login>` tag.
     399
     400The `<login>` tag tells you the kind of authentication (ssh), the port, and the username.
     401The new extension adds an entry per login username
     402 - URN of the user
     403 - 1+ public SSH keys that can be used under that login
     404
     405Note that 1 of the `<user:services_user login>`s in the extension duplicates the default username already in the base `<login>` tag. The extension allows specifying the keys usable with that login username.
     406
     407EG:
     408{{{
     409.......
     410  <services>
     411    <login authentication="ssh-keys" hostname="pc27.emulab.net" port="22" username="flooby"/>
     412    <ssh-user:services_user login="flooby" user-urn="http://urn:publicid:IDN+jonlab.tbres.emulab.net+user+flooby">
     413      <ssh-user:public-key>asdfasdfasdf;lkasdf=foo@bar</ssh-user:public-key>
     414      <ssh-user:public-key>asdfasdfasdf;lkjasdf;lasdf=foobar@barfoo</ssh-user:public-key>
     415    </ssh-user:services_user>
     416    <ssh-user:services_user login="io" user-urn="http://urn:publicid:IDN+jonlab.tbres.emulab.net+user+io">
     417      <ssh-user:public-key>asdfasdfasdf;lkasdf=foo@bar</ssh-user:public-key>
     418      <ssh-user:public-key>asdfasdfasdf;lkjasdf;lasdf=foobar@barfoo</ssh-user:public-key>
     419    </ssh-user:services_user>
     420  </services>
     421}}}
     422
     423And the RNC schema:
     424{{{
     425# An extension for describing user SSH login credentials in the manifest
     426
     427default namespace = "http://www.protogeni.net/resources/rspec/ext/ssh_user/1"
     428
     429# This is meant to extend the services element
     430Services = element services_user {
     431  attribute login { string } &
     432  attribute user_urn { string }? &
     433  element public-key { string }*
     434}
     435
     436# Both of the above are start elements.
     437start = Services
     438}}}
     439
     440 - A note on distinguishing !ListResources from !SliversStatus:
     441  - !ListResources in the context of a slice URN is for listing the reserved resources. It provides mostly static information. (But if the manifest contains things which can change, then the manifest must change when those things (like say IP addresses) change.)
     442  - !SliversStatus is for everything else: anything which the AM can change for you using API calls, or which changes over time. So it has up/down state, expiration time, and now login keys. It provides that for your whole slice at this aggregate and all contained slivers.
     443
     444 - '''Adopted: Change Set I3''': Return sliver expiration from !CreateSlivers
     445'''This change was adopted at GEC13.'''
     446
     447Experimenters currently do not know the expiration of their slivers without explicitly asking.
     448This change makes the !CreateSlivers return value become a struct:
     449{{{
     450{
     451 rspec: <string manifest>,
     452 geni_expires: =<RFC3339 sliver expiration string, as in geni_expires from SliversStatus>,
     453 geni_allocation_status: <string sliver state - allocated or changing or ready>,
     454 <others that are AM specific>
     455}
     456}}}
     457
     458
     459= Adopted: Change Set K: Standardize certificates and credentials =
     460'''This proposal was adopted at GEC13'''
     461== Motivation ==
     462The current AM API specifies that certificates and credentials follow a particular format, using URNs that are based on experimenter supplied names. However that specification is not sufficiently specific, and there are currently differences in implementation among existing certificate and credential producers. This has led to errors, experimenter confusion, and messy code.
     463
     464== Changes ==
     465This proposal requires that certificates include a UUID and email address for the subject.
     466It codifies restrictions on usernames, sliver names, and slice names.
     467The proposal specifies that slices have a UUID to be used to help identify slices in a consistent way over time (slice names may be re-used).
     468
     469Some overall points:
     470 - Aggregates are expected to fail requests that use certificates or URNs or names that violate this API.
     471 - Schemas for certificates & credentials will be published on geni.net.
     472
     473Certificates:
     474 - GENI uses x509v3 identity certificates to identity users, slices, aggregates, and authorities, and these restrictions apply to all such certificates.
     475 - See http://groups.geni.net/geni/wiki/GeniApiCertificates.
     476 - Aggregates are required to properly validate all certificates to authenticate access to AM API calls, and fail calls that supply invalid certificates.
     477
     478Certificate contents:
     479 - {{{Version}}} shall be properly marked: 3
     480 - {{{serialNum}}} is required to be unique within the certificate authority: each newly issued certificate must have a unique serial number.
     481 - The Distinguished Name should include a human readable identifier, for both subject and issuer. Details are not specified
     482 - Only authority certificates (but all authorities that issue certificates) shall be marked {{{CA:TRUE}}} in the x509 v3 basic constraints; Slices and users shall be marked {{{FALSE}}}.
     483 - The Subject Alternative Name field must include 3 pieces of information
     484  - Entries are comma separated ('{{{, }}}'), and may be in any order.
     485  - The URN identifier, following GENI URN standards as described here: http://groups.geni.net/geni/wiki/GeniApiIdentifiers
     486   - The URN is identifiable by looking for the entry beginning "{{{URI:urn:publicid:IDN}}}", for example: {{{URI:urn:publicid:IDN+emulab.net+user+stoller}}}.
     487  - A UUID, providing a unique ID for the entity.
     488   - The UUID must be used with the URN to fully identify the slice or user. UUID alone should not be accepted. This ensures that the authority certifying the slice or user is always identified when referring to the slice or user.
     489   - In the hexadecimal digit string format given in [http://www.ietf.org/rfc/rfc4122.txt RFC 4122]
     490   - The UUID is identified with this prefix: "{{{URI:urn:uuid}}}" (as specified by RFC4122), for example: {{{URI:urn:uuid:33178d77-a930-40b1-9469-3aae08755743}}}.
     491   - The `COPY` tag is not supported.
     492  - The email address is an [http://tools.ietf.org/html/rfc2822#section-3.4.1 RFC2822] compliant and working address for contacting the subject of the certificate (experimenter, authority administrator, or slice owner).
     493   - The email entry is identified by the prefix "{{{email:}}}", for example: {{{email:stoller@emulab.net}}}
     494   - The `COPY` tag is not supported.
     495   - Note that the slice and user email addresses are addresses for contacting the responsible party - the slice owner or creator and the user. These may be aliases.
     496 - Recommendation: Authorities are encouraged but not required to include a URL where more information about the subject is available (eg slice authority registry URL). That URL may be included in a certificate extension, in the DN, or in the subjectAltName.
     497
     498Slices:
     499 - Slice ID for use over time and space is the UUID plus the URN in the slice certificate.
     500  - Currently URNs identify slices, but they are not unique over time. This change adds UUIDs to slice identifiers. URNs remain the identifier for slices in AM API calls, and uniquely identify slices for a moment in time. UUID plus URN together uniquely identify slices over time, and can be used for forensics, or for use by authorization modules, such as ABAC. UUIDs alone should not be used to identify slices, but only in conjunction with the URN, which scopes the UUID to the authority which generated the UUID. The UUID essentially may only be used to distinguish between slices with identical URNs.
     501  - Monitoring and instrumentation interfaces will likely require both the URN and the UUID for recording slice measurements that can be used past the life of the slice, and aggregates must be prepared to provide both.
     502 - Slice URN alone is a label - unique at a point in time but not over time.
     503  - Format: {{{urn:publicid:IDN+<SA name>+slice+<slice name>}}}
     504 - Slice names are <=19 characters, only alphanumeric plus hyphen (no hyphen in first character): {{{'^[a-zA-Z0-9][-a-zA-Z0-9]+$'}}}
     505 - Aggregates are required to accept any compliant slice name and URN.
     506  - Note that this currently causes problems at PlanetLab/SFA aggregates, where node login names are based on slice names and are limited to 31 characters.
     507
     508Slivers:
     509 - Have a URN (returned in manifest RSpec), determined by the aggregate.
     510 - This URN should be unique over time within an AM for record-keeping / operations purposes.
     511  - Format: {{{urn:publicid:IDN+<AM name>+sliver+<sliver name>}}}
     512 - Sliver names
     513  - Must be unique over time within that AM, and are selected by the AM.
     514  - May use only alphanumeric characters plus hyphen.
     515
     516Usernames:
     517 - Usernames (user identifiers to the system) are set at the authority.
     518 - Usernames are case-insensitive internally, though they may be case-sensitive in display.
     519  - EG {{{JohnSmth}}} as a display name is {{{johnsmth}}} internally, and there cannot also be a user {{{JOHNSMTH}}}.
     520 - Usernames should begin with a letter and be alphanumeric or underscores - no hyphen or '.': ({{{'^[a-zA-Z][\w]+$'}}}).
     521 - Usernames are limited to 8 characters.
     522 - User URNs (which contain the authority name and the username) are required to be temporally and globally unique.
     523
     524
     525= Change Set M: New Method Signatures =
     526If all the other adopted change set proposals are adopted, there will be new method signatures.
     527
     528In some cases, the proposals are not clear in terms of the details of the resulting method signatures. This proposal consolidates those separate proposals, to propose a new set of method signatures.
     529
     530There are a few other small changes that this change set covers.
     531
     532The details of the proposed final method signatures are listed [#Changesummary-methodsignatures below].
     533
     534== M1: users struct an option ==
     535Previously, the !CreateSliver method took a `users[]` struct to specify information for logging in to resources. But this struct is not universally applicable. This change moves that struct to be an option within the `options` struct, named `geni_users[]`.
     536
     537== M2: Split !ListResources ==
     538Currently, !ListResources has two forms: get an advertisement general to the aggregate, and get a manifest specific to a slice. This proposal splits those two modes into two separate methods, !ListResources, and Describe.
     539
     540!ListResources would no longer take a `slice_urn` option, and no longer ever return a manifest RSpec.
     541
     542Describe would be used to achieve the same functionality.
     543{{{
     544struct Describe(string urns[], struct credentials[], struct options[])
     545}}}
     546
     547Where options include:
     548{{{
     549{
     550  boolean geni_compressed <optional>;
     551  struct geni_rspec_version {
     552    string type;
     553    string version;
     554  };
     555}
     556}}}
     557
     558Return struct:
     559{{{
     560{
     561   geni_rspec: <geni.rspec, Manifest - may be empty though)>
     562   geni_urn: <string slice urn, as requested>
     563   geni_slivers: [
     564               {
     565                  geni_sliver_urn: <string sliver urn>
     566                  geni_expires: <dateTime.rfc3339 allocation expiration string, as in geni_expires from SliversStatus>,
     567                  geni_allocation_status: <string sliver state - allocated or ?? >,
     568                  geni_operational_status: <string sliver operational state>
     569               },
     570               ...
     571         ]
     572}
     573}}}
     574
     575Aggregates are expected to combine the manifests of all requested slivers into a single manifest RSpec.
     576
     577-----
     578= Changes Not Included =
     579== RSpec changes resulting in GENI v4 RSpecs ==
     580 - Support unbound manifests
     581 - Make manifest an extension of Request, so you can readily edit & resubmit a manifest
     582 - Make configuration information in request and manifest optional, so it can be supplied/returned separately
     583 - Fully implement the compute ontology from Ilia
     584 - Ilia's other requests (Openflow related information)
     585 - Document process for updates per my dev list email
     586 - Be consistent: ref vs idref vs href
     587 - Include AM name/URL in RSpecs? Experimenter who allocated it URN?
     588 - Incorporate stitching extension as part of the 'base' RSpec
     589
     590== Misc ==
     591
     592 - Allow Shutdown on a single sliver or a list of slivers
     593 - Add {{{geni_am_info}}} block to !GetVersion return (name, id, url, location, description, is_proxy, proxy: {(a geni_am_info block)}, proxy_for[] (list of geni_am_info blocks))
     594 - Allow the update methods to take a generic rspec argument, allowing AMs to accept full or diff RSpecs
     595 - Tickets
     596  - Remove requestor certificate?
     597  - Support brokers: Make ticket methods return multiple tickets. Define tickets as optionally diffs (additive). Make !RedeemTicket and !UpdateTicket take a list of tickets. Tickets are delegatable via signing, but the delegated ticket must be for a strict subset of the resources in the original.
     598  - Drop ticket struct, not a signed document. Just reference by ID
     599 - Support message passing
     600  - Add sendMsg (and getMsgs?) methods that take a signed document, allowing freely passing messages instead of XMLRPC?
     601
     602== Stitching ==
     603AMs must support the stitching extension where Layer 2 connections are available:
     604 - including in ads, requests, and manifests.
     605 - Advertise available VLANs, attempt to honor requested VLANs, reserve VLANs with tickets, and report reserved or instantiated VLANs in manifests
     606 - Use schema http://hpn.east.isi.edu/rspec/ext/stitch/0.1/stitch-schema.xsd
     607
     608Update stitching schema per changes here: https://geni.maxgigapop.net/twiki/bin/view/GENI/NetworkStitchingGeniApiAndRspec