Initial commit to create repository for Identity Service API docs (for Keystone)

Change-Id: Ia3ebb17a7175b287ea92d0a604836f3b7cadcf8b
This commit is contained in:
Anne Gentle 2011-09-08 13:56:09 -05:00
parent c2af80449c
commit 23ef2ee0c6
73 changed files with 2970 additions and 0 deletions

9
README Normal file
View File

@ -0,0 +1,9 @@
This repository contains the RESTful API information for the OpenStack Identity Service, also known as the Keystone project. The Keystone project provides authentication for OpenStack services, with plans to also provide authorization.
Contributing
============
Our community welcomes all people interested in open source cloud computing, and there are no formal membership requirements. The best way to join the community is to talk with others online or at a meetup and offer contributions through Launchpad, the OpenStack wiki, or blogs. We welcome all types of contributions, from blueprint designs to documentation to testing to deployment scripts.
Installing
==========
Refer to http://keystone.openstack.org to learn more about installing an OpenStack Identity Service server that can respond to these API commands.

View File

@ -0,0 +1,201 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- POM Build file for the Keystone Developer Guide -->
<modelVersion>4.0.0</modelVersion>
<groupId>org.openstack.identity</groupId>
<artifactId>docs</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Keystone Dev Guide</name>
<profiles>
<profile>
<id>Rackspace Research Repositories</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>rackspace-research</id>
<name>Rackspace Research Repository</name>
<url>http://maven.research.rackspacecloud.com/content/groups/public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>rackspace-research</id>
<name>Rackspace Research Repository</name>
<url>http://maven.research.rackspacecloud.com/content/groups/public/</url>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<doctools.version>1.0.5-SNAPSHOT</doctools.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.1.12</version>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.1</version>
</dependency>
<!-- We need Saxon 9 and clouddocs-maven-plugin here to normalize wadls -->
<dependency>
<groupId>net.sourceforge.saxon</groupId>
<artifactId>saxon</artifactId>
<version>9.1.0.8</version>
</dependency>
<dependency>
<groupId>com.rackspace.cloud.api</groupId>
<artifactId>clouddocs-maven-plugin</artifactId>
<version>${doctools.version}</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>target/docbkx/pdf</directory>
<excludes>
<exclude>**/*.fo</exclude>
</excludes>
</resource>
</resources>
<plugins>
<!-- Unpack the wadl normalization xslts -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-shared-resources</id>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<outputDirectory>${project.build.directory}/generated-resources</outputDirectory>
<includeGroupIds>com.rackspace.cloud.api</includeGroupIds>
<includeArtifactIds>clouddocs-maven-plugin</includeArtifactIds>
<!-- <includeClassifiers>ns-resources</includeClassifiers> -->
<excludeTransitive>true</excludeTransitive>
<includes>**/normalizeWadl/*.xsl</includes>
</configuration>
</execution>
</executions>
</plugin>
<!-- Normalize the wadl -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>ant</id>
<phase>generate-sources</phase>
<configuration>
<target>
<java
jar="${net.sourceforge.saxon:saxon:jar}"
fork="true">
<arg value="-u"/>
<arg value="-s:https://raw.github.com/openstack/keystone/master/keystone/content/service/identity.wadl"/>
<arg value="-xsl:${project.build.directory}/generated-resources/cloud/normalizeWadl/normalizeWadl.xsl"/>
<arg value="-o:${project.build.directory}/generated-resources/xml/xslt/identity.wadl"/>
</java>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.rackspace.cloud.api</groupId>
<artifactId>clouddocs-maven-plugin</artifactId>
<version>${doctools.version}</version>
<executions>
<execution>
<id>g1</id>
<goals>
<goal>generate-pdf</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<highlightSource>false</highlightSource>
</configuration>
</execution>
<execution>
<id>g2</id>
<goals>
<goal>generate-webhelp</goal>
</goals>
<phase>generate-sources</phase>
<configuration>
<!-- These parameters only apply to webhelp -->
<enableDisqus>1</enableDisqus>
<disqusShortname>os-identitydevguide</disqusShortname>
<enableGoogleAnalytics>1</enableGoogleAnalytics>
<googleAnalyticsId>UA-17511903-6</googleAnalyticsId>
<generateToc>
appendix toc,title
article/appendix nop
article toc,title
book title,figure,table,example,equation
chapter toc,title
part toc,title
preface toc,title
qandadiv toc
qandaset toc
reference toc,title
set toc,title
</generateToc>
<postProcess>
<!-- Copies the figures to the correct location for webhelp -->
<copy todir="${basedir}/target/docbkx/webhelp/identity-dev-guide/figures">
<fileset dir="${basedir}/src/docbkx/img">
<include name="**/*.svg" />
</fileset>
</copy>
<!--Moves PDF to the needed placement -->
<move failonerror="false"
file="${basedir}/target/docbkx/pdf/identity-dev-guide.pdf"
tofile="${basedir}/target/docbkx/webhelp/identity-dev-guide/identity-dev-guide.pdf"/>
</postProcess>
</configuration>
</execution>
</executions>
<configuration>
<!-- These parameters apply to pdf and webhelp -->
<xincludeSupported>true</xincludeSupported>
<sourceDirectory>src/docbkx</sourceDirectory>
<includes>
identity-dev-guide.xml
</includes>
<profileSecurity>reviewer</profileSecurity>
<branding>openstack</branding>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,175 @@
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE chapter [<!-- Some useful entities borrowed from HTML -->
<!ENTITY ndash "&#x2013;">
<!ENTITY mdash "&#x2014;">
<!ENTITY hellip "&#x2026;">
<!-- Useful for describing APIs -->
<!ENTITY GET '<command xmlns="http://docbook.org/ns/docbook">GET</command>'>
<!ENTITY PUT '<command xmlns="http://docbook.org/ns/docbook">PUT</command>'>
<!ENTITY POST '<command xmlns="http://docbook.org/ns/docbook">POST</command>'>
<!ENTITY DELETE '<command xmlns="http://docbook.org/ns/docbook">DELETE</command>'>
<!ENTITY HEAD '<command xmlns="http://docbook.org/ns/docbook">HEAD</command>'>
<!ENTITY CHECK '<inlinemediaobject xmlns="http://docbook.org/ns/docbook">
<imageobject>
<imagedata fileref="img/Check_mark_23x20_02.svg"
format="SVG" scale="60"/>
</imageobject>
</inlinemediaobject>'>
<!ENTITY CODES 'Normal Response Code(s):'>
<!ENTITY ERROR_CODES 'Error Response Code(s):'>
<!ENTITY NO_REQUEST '<para xmlns="http://docbook.org/ns/docbook">
This operation does not require a request body.</para>'>
<!ENTITY LONG_URI_REFHEAD '
<thead xmlns="http://docbook.org/ns/docbook">
<tr>
<td colspan="1">Verb</td>
<td colspan="4">URI</td>
<td colspan="3">Description</td>
</tr>
</thead>'>
<!ENTITY URI_REFHEAD '
<thead xmlns="http://docbook.org/ns/docbook">
<tr>
<td colspan="1">Verb</td>
<td colspan="1">URI</td>
<td colspan="4">Description</td>
</tr>
</thead>'>
]>
<chapter
xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:id="Service_API_Client_Operations-d1e1110"
version="5.0">
<title>Service API (Client Operations)</title>
<para>The operations described in this chapter allow clients to authenticate and get
access tokens and service endpoints. </para>
<section xml:id="Core_Service_API-d1e1124">
<title>Core Service API</title>
<para>The following calls are core Keystone Service APIs in version 2.0</para>
<informaltable rules="all">
&URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &POST; </td>
<td colspan="1">/tokens</td>
<td colspan="4">Authenticate to generate a token.</td>
</tr>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="1">/tenants</td>
<td colspan="4">Get a list of tenants accessible with supplied token.</td>
</tr>
</tbody>
</informaltable>
</section>
<section xml:id="Available-Operations-Service-API-d100001">
<title>Available Operations</title>
<section xml:id="Authenticate-Service-API-d1e1166">
<title>Authenticate for Service API</title>
<informaltable rules="all">
&URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &POST; </td>
<td colspan="1">/tokens</td>
<td colspan="4">Authenticate to generate a token.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>), userDisabled
(<errorcode>403</errorcode>), badRequest (<errorcode>400</errorcode>), identityFault
(<errorcode>500</errorcode>), serviceUnavailable(<errorcode>503</errorcode>)</simpara>
<para>
This call will return a token if successful. Each ReST request against other services (or other
calls on Keystone such as the GET /tenants call)
requires the inclusion of a specific authorization token HTTP x-header, defined as X-Auth-Token.
Clients obtain
this token, along with the URL to other service APIs, by first authenticating against the
Keystone Service and supplying valid credentials.
</para>
<para>
Client authentication is provided via a ReST interface using the POST method,
with v2.0/tokens supplied as the path. A payload of credentials must be included
in the body.
</para>
<para>
The Keystone Service is a ReSTful web service. It is the entry point to all service APIs.
To access the Keystone Service, you must know URL of the Keystone service.
</para>
<example>
<title>XML Auth Request</title>
<programlisting language="xml">
<xi:include href="samples/auth_credentials.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Auth Request</title>
<programlisting language="javascript">
<xi:include href="samples/auth_credentials.json" parse="text"/>
</programlisting>
</example>
<example>
<title>XML Auth Response</title>
<programlisting language="xml">
<xi:include href="samples/auth.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Auth Response</title>
<programlisting language="javascript">
<xi:include href="samples/auth.json" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Get_Tenants-Service-d1e1264">
<title>Get Tenants</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants</td>
<td colspan="3">Get a list of tenants.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>),
forbidden(<errorcode>403</errorcode>), overLimit(<errorcode>413</errorcode>),
badRequest (<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
<para>
The operation returns a list of tenants which the supplied token provides
access to. This call must be authenticated, so a valid token must
be passed in as a header.
</para>
<example>
<title>Tenants Request with Auth Token</title>
<programlisting language="text">
<xi:include href="samples/tenants-request.txt" parse="text"/>
</programlisting>
</example>
&NO_REQUEST;
<example>
<title>JSON Tenants Response</title>
<programlisting language="javascript">
<xi:include href="samples/tenants.json" parse="text"/>
</programlisting>
</example>
<example>
<title>XML Tenants Response</title>
<programlisting language="xml">
<xi:include href="samples/tenants.xml" parse="text"/>
</programlisting>
</example>
</section>
</section>
</chapter>

View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8"?>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="Identity-Service-Concepts-e1362">
<title>Identity Service Concepts</title>
<para>
The Keystone Identity Service has several key concepts which are
important to understand:
</para>
<variablelist>
<varlistentry>
<term>User</term>
<listitem><para>A digital representation of a person, system, or service who uses OpenStack cloud services.
Keystone authentication services will validate that incoming request are being made by the user
who claims to be making the call. Users have a login and may be assigned tokens to access
resources. Users may be directly assigned to a particular tenant and
behave as if they are contained in that tenant.</para></listitem>
</varlistentry>
<varlistentry>
<term>Credentials</term>
<listitem><para>
Data that belongs to, is owned by, and generally only known by a user that the user can present
to prove they are who they are (since nobody else should know that data).
</para><para>Examples are:
<itemizedlist>
<listitem><para>a matching username and password</para></listitem>
<listitem><para>a matching username and API key</para></listitem>
<listitem><para>yourself and a driver's license with a picture of you</para></listitem>
<listitem><para>a token that was issued to you that nobody else knows of</para></listitem>
</itemizedlist>
</para></listitem>
</varlistentry>
<varlistentry>
<term>Authentication</term>
<listitem><para>
In the context of Keystone, authentication is the act of confirming the identity of a
user or the truth of a claim.
Keystone will confirm that incoming request are being made by the user
who claims to be making the call by validating a set of claims that the user is making.
These claims are initially in the form of a set of credentials (username &amp; password,
or username and API key). After initial confirmation, Keystone will issue the user a token
which the user can then provide to demonstrate that their identity has been authenticated
when making subsequent requests.
</para></listitem>
</varlistentry>
<varlistentry>
<term>Token</term>
<listitem><para>
A token is an arbitrary bit of text that is used to access
resources. Each token has a scope which describes which
resources are accessible with it. A token may be
revoked at anytime and is valid for a finite duration.
</para>
<para>
While Keystone supports token-based authentication in this release,
the intention is for it to support additional protocols in the
future. The intent is for it to be an integration service foremost, and not
a aspire to be a full-fledged identity store and management solution.
</para></listitem>
</varlistentry>
<varlistentry>
<term>Tenant</term>
<listitem><para>
A container used to group or isolate resources and/or identity
objects. Depending on the service operator, a tenant may map to a customer,
account, organization, or project.
</para></listitem>
</varlistentry>
<varlistentry>
<term>Service</term>
<listitem><para>
An OpenStack service, such as Compute (Nova), Object Storage (Swift), or Image Service (Glance). A service provides
one or more endpoints through which users can access resources and perform
(presumably useful) operations.
</para></listitem>
</varlistentry>
<varlistentry>
<term>Endpoint</term>
<listitem> <para>
An network-accessible address, usually described by URL, where a service may be accessed. If using an extension for templates, you can create an endpoint template, which represents the templates of all the consumable services that are available across the regions.
</para></listitem>
</varlistentry>
<varlistentry>
<term>Role</term>
<listitem><para> A personality that a user assumes when performing a specific set of operations.
A role includes a set of right and privileges. A user assuming that role inherits
those rights and privileges.
</para><para>
In Keystone, a token that is issued to a user includes the list of roles that user
can assume. Services that are being called by that user determine how they interpret the set
of roles a user has and which operations or resources each roles grants access to.
</para></listitem>
</varlistentry>
</variablelist>
</chapter>

View File

@ -0,0 +1,49 @@
<?xml version='1.0' encoding='UTF-8'?>
<book xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:db="http://docbook.org/ns/docbook"
version="5.0"
status="draft"
xml:id="Keystone-Developer-Guide"
>
<title>Keystone Developer Guide</title>
<info>
<author>
<personname>
<firstname/>
<surname/>
</personname>
<affiliation>
<orgname>OpenStack</orgname>
</affiliation>
</author>
<copyright>
<year>2010</year>
<year>2011</year>
<holder>OpenStack</holder>
</copyright>
<releaseinfo>API v2.0</releaseinfo>
<productname>Keystone - OpenStack Identity</productname>
<pubdate>2011-08-29</pubdate>
<legalnotice role="apache2">
<annotation>
<remark>Copyright details are filled in by the template.</remark>
</annotation>
</legalnotice>
<abstract>
<para>This document is intended for software developers interested in developing
applications that utilize the Keystone Identity Service for authentication. This
document also includes details on how to integrate services with the Keystone
Identity Service. </para>
</abstract>
</info>
<!-- Chapters are referred from the book file through these include statements. You can add additional chapters using these types of statements. -->
<xi:include href="identity-concepts.xml"/>
<xi:include href="identity-general-api-info.xml"/>
<xi:include href="identity-client-api.xml"/>
<xi:include href="identity-service-api.xml"/>
</book>

View File

@ -0,0 +1,645 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapter [<!-- Some useful entities borrowed from HTML -->
<!ENTITY ndash "&#x2013;">
<!ENTITY mdash "&#x2014;">
<!ENTITY hellip "&#x2026;">
<!-- Useful for describing APIs -->
<!ENTITY GET '<command xmlns="http://docbook.org/ns/docbook">GET</command>'>
<!ENTITY PUT '<command xmlns="http://docbook.org/ns/docbook">PUT</command>'>
<!ENTITY POST '<command xmlns="http://docbook.org/ns/docbook">POST</command>'>
<!ENTITY DELETE '<command xmlns="http://docbook.org/ns/docbook">DELETE</command>'>
<!ENTITY HEAD '<command xmlns="http://docbook.org/ns/docbook">HEAD</command>'>
<!ENTITY CHECK '<inlinemediaobject xmlns="http://docbook.org/ns/docbook">
<imageobject>
<imagedata fileref="img/Check_mark_23x20_02.svg"
format="SVG" scale="60"/>
</imageobject>
</inlinemediaobject>'>
<!ENTITY CODES 'Normal Response Code(s):'>
<!ENTITY ERROR_CODES 'Error Response Code(s):'>
<!ENTITY NO_REQUEST '<para xmlns="http://docbook.org/ns/docbook">
This operation does not require a request body.</para>'>
<!ENTITY LONG_URI_REFHEAD '
<thead xmlns="http://docbook.org/ns/docbook">
<tr>
<td colspan="1">Verb</td>
<td colspan="4">URI</td>
<td colspan="3">Description</td>
</tr>
</thead>'>
<!ENTITY URI_REFHEAD '
<thead xmlns="http://docbook.org/ns/docbook">
<tr>
<td colspan="1">Verb</td>
<td colspan="1">URI</td>
<td colspan="4">Description</td>
</tr>
</thead>'>
]>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0"
xml:id="Overview-Keystone-API-d1e62">
<title>Overview of Keystone API</title>
<para>The Keystone Identity Service allows clients to obtain tokens that can be used to access
OpenStack cloud services. This document is intended for software developers interested in
developing applications that utilize the Keystone Identity Service API for authentication.
</para>
<para>This Guide assumes the reader is familiar with RESTful web services, HTTP/1.1, and JSON
and/or XML serialization formats. </para>
<section xml:id="General_Keystone_API_Information-d1e141">
<title>General API Information</title>
<para>The Keystone API is implemented using a RESTful web service interface. All requests to
authenticate and operate against the Keystone API should be performed using SSL over HTTP
(HTTPS) on TCP port 443.</para>
</section>
<section xml:id="Request_Response_Types-d1e149">
<title>Request/Response Types</title>
<para> The Keystone API supports both the JSON and XML data serialization formats. The request
format is specified using the <code>Content-Type</code> header and is required for
operations that have a request body. The response format can be specified in requests using
either the <code>Accept</code> header or adding an <code>.xml</code> or <code>.json</code>
extension to the request URI. Note that it is possible for a response to be serialized using
a format different from the request (see example below). If no response format is specified,
JSON is the default. If conflicting formats are specified using both an <code>Accept</code>
header and a query extension, the query extension takes precedence.</para>
<table rules="all">
<caption>Response Types</caption>
<thead>
<tr>
<td>Format</td>
<td>Accept Header</td>
<td>Query Extension</td>
<td>Default</td>
</tr>
</thead>
<tbody>
<tr>
<td>JSON</td>
<td>application/json</td>
<td>.json</td>
<td>Yes</td>
</tr>
<tr>
<td>XML</td>
<td>application/xml</td>
<td>.xml</td>
<td>No</td>
</tr>
</tbody>
</table>
<example>
<title>JSON Request with Headers</title>
<programlisting language="xml">
<xi:include href="samples/samplerequestheader.txt" parse="text"/>
</programlisting>
<programlisting language="xml">
<xi:include href="samples/auth_credentials.json" parse="text"/>
</programlisting>
</example>
<example>
<title>XML Response with Headers</title>
<programlisting language="xml">
<xi:include href="samples/sampleresponseheader.txt" parse="text"/>
</programlisting>
<programlisting language="xml">
<xi:include href="samples/auth.xml" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Content_Compression-d1e262">
<title>Content Compression</title>
<para>Request and response body data my be encoded with gzip compression in order to
accelerate interactive performance of API calls and responses. This is controlled using the
<code>Accept-Encoding</code> header on the request from the client and indicated by the
<code>Content-Encoding</code> header in the server response. Unless the header is
explicitly set, encoding defaults to disabled.</para>
<table rules="all">
<caption>Compression Headers</caption>
<thead>
<tr>
<td>Header Type</td>
<td>Name</td>
<td>Value</td>
</tr>
</thead>
<tbody>
<tr>
<td>HTTP/1.1 Request</td>
<td>Accept-Encoding</td>
<td>gzip</td>
</tr>
<tr>
<td>HTTP/1.1 Response</td>
<td>Content-Encoding</td>
<td>gzip</td>
</tr>
</tbody>
</table>
</section>
<section xml:id="Paginated_Collections-d1e325">
<title>Paginated Collections</title>
<para>
To reduce load on the service, list operations will
return a maximum number of items at a time. The
maximum number of items returned is determined by the
Identity provider. To navigate the collection, the
parameters <parameter>limit</parameter> and
<parameter>marker</parameter> can be set in the URI
(e.g.?<parameter>limit</parameter>=100&amp;<parameter>marker</parameter>=1234).
The <parameter>marker</parameter> parameter is the ID
of the last item in the previous list. Items are
sorted by update time. When an update time is not
available they are sorted by ID. The
<parameter>limit</parameter> parameter sets the page
size. Both parameters are optional. If the client
requests a <parameter>limit</parameter> beyond that
which is supported by the deployment an overLimit
(<errorcode>413</errorcode>) fault may be thrown. A
marker with an invalid ID will return an itemNotFound
(<errorcode>404</errorcode>) fault.
</para>
<note>
<para>
Paginated collections never return itemNotFound
(<errorcode>404</errorcode>) faults when the
collection is empty &mdash; clients should expect
an empty collection.
</para>
</note>
<para>
For convenience, collections contain atom "next" and
"previous" links. The first page in the list will not
contain a "previous" link, the last page in the list
will not contain a "next" link. The following examples
illustrate three pages in a collection of tenants. The
first page was retrieved via a &GET; to
http://identity.api.openstack.org/v2.0/1234/tenants?limit=1.
In these examples, the <parameter>limit</parameter>
parameter sets the page size to a single item.
Subsequent "next" and "previous" links will honor the
initial page size. Thus, a client may follow links to
traverse a paginated collection without having to
input the <parameter>marker</parameter> parameter.
</para>
<example>
<title>Tenant Collection, First Page: XML</title>
<programlisting language="xml">
<xi:include href="samples/tenants-1.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Tenant Collection, First Page: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/tenants-1.json" parse="text"/></programlisting>
</example>
<example>
<title>Tenant Collection, Second Page: XML</title>
<programlisting language="xml">
<xi:include href="samples/tenants-2.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Tenant Collection, Second Page: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/tenants-2.json" parse="text"/></programlisting>
</example>
<example>
<title>Tenant Collection, Last Page: XML</title>
<programlisting language="xml">
<xi:include href="samples/tenants-3.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Tenant Collection, Last Page: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/tenants-3.json" parse="text"/></programlisting>
</example>
<para>
In the JSON representation, paginated collections contain
a <property>values</property> property that contains the
items in the collections. Links are accessed via the
<property>links</property> property. The approach allows
for extensibility of both the collection members and of
the paginated collection itself. It also allows
collections to be embedded in other objects as illustrated
below. Here, a subset of groups are presented within a
user. Clients must follow the "next" link to continue to
retrieve additional groups belonging to a user.
</para>
<example>
<title>Paginated Roles in a User: XML</title>
<programlisting language="xml">
<xi:include href="samples/getuser-1.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Paginated Roles in an User: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/getuser-1.json" parse="text"/></programlisting>
</example>
</section>
<section xml:id="Versions-d1e472">
<title>Versions</title>
<para>
The OpenStack Identity API uses both a URI and a MIME
type versioning scheme. In the URI scheme, the first
element of the path contains the target version
identifier (e.g. https://identity.api.openstack.org/
v2.0/&hellip;). The MIME type versioning scheme uses
HTTP content negotiation where the <code>Accept</code>
or <code>Content-Type</code> headers contains a MIME
type that includes the version ID as a parameter
(application/vnd.openstack.identity+xml;version=1.1). A
version MIME type is always linked to a base MIME type
(application/xml or application/json). If conflicting
versions are specified using both an HTTP header and a
URI, the URI takes precedence.
</para>
<example>
<title>Request with MIME type versioning</title>
<literallayout class="monospaced">
GET /tenants HTTP/1.1
Host: identity.api.openstack.org
Accept: application/vnd.openstack.identity+xml;version=1.1
X-Auth-Token: eaaafd18-0fed-4b3a-81b4-663c99ec1cbb
</literallayout>
</example>
<example>
<title>Request with URI versioning</title>
<literallayout class="monospaced">
GET /v1.1/tenants HTTP/1.1
Host: identity.api.openstack.org
Accept: application/xml
X-Auth-Token: eaaafd18-0fed-4b3a-81b4-663c99ec1cbb
</literallayout>
</example>
<note>
<para>
The MIME type versioning approach allows for the
creating of permanent links, because the version
scheme is not specified in the URI path:
https://api.identity.openstack.org/tenants/12234.
</para>
</note>
<para>
If a request is made without a version specified in
the URI or via HTTP headers, then a multiple-choices
response (<returnvalue>300</returnvalue>) will follow
providing links and MIME types to available versions.
</para>
<example>
<title>Multiple Choices Response: XML</title>
<programlisting language="xml">
<xi:include href="samples/choices.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Multiple Choices Response: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/choices.json" parse="text"/></programlisting>
</example>
<para>
New features and functionality that do not break
API-compatibility will be introduced in the current
version of the API as extensions (see below) and the
URI and MIME types will remain unchanged. Features or
functionality changes that would necessitate a break
in API-compatibility will require a new version, which
will result in URI and MIME type version being updated
accordingly. When new API versions are released, older
versions will be marked as
<code>DEPRECATED</code>. Providers should work with
developers and partners to ensure there is adequate
time to migrate to the new version before deprecated
versions are discontinued.
</para>
<para>
Your application can programmatically determine
available API versions by performing a &GET; on the
root URL (i.e. with the version and everything to the
right of it truncated) returned from the
authentication system. Note that an Atom
representation of the versions resources is supported
when issuing a request with the <code>Accept</code>
header containing application/atom+xml or by adding a
.atom to the request URI. This allows standard Atom
clients to track version changes.
</para>
<example>
<title>Versions List Request</title>
<literallayout class="monospaced">
GET HTTP/1.1
Host: identity.api.openstack.org
</literallayout>
</example>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; badRequest
(<errorcode>400</errorcode>), identityFault
(<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>Versions List Response: XML</title>
<programlisting language="xml">
<xi:include href="samples/versions.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Versions List Response: Atom</title>
<programlisting language="xml">
<xi:include href="samples/versions-atom.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Versions List Response: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/versions.json" parse="text"/></programlisting>
</example>
<para>
You can also obtain additional information about a
specific version by performing a &GET; on the base
version URL
(e.g. https://identity.api.openstack.org/v1.1/).
Version request URLs should always end with a trailing
slash (/). If the slash is omitted, the server may
respond with a <returnvalue>302</returnvalue>
redirection request. Format extensions may be placed
after the slash
(e.g. https://identity.api.openstack.org/v1.1/.xml). Note
that this is a special case that does not hold true
for other API requests. In general, requests such as
/tenants.xml and /tenants/.xml are handled
equivalently.
</para>
<example>
<title>Version Details Request</title>
<literallayout class="monospaced">
GET HTTP/1.1
Host: identity.api.openstack.org/v1.1/
</literallayout>
</example>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; badRequest
(<errorcode>400</errorcode>), identityFault
(<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>Version Details Response: XML</title>
<programlisting language="xml">
<xi:include href="samples/version.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Version Details Response: Atom</title>
<programlisting language="xml">
<xi:include href="samples/version-atom.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Version Details Response: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/version.json" parse="text"/></programlisting>
</example>
<para>
The detailed version response contains pointers to
both a human-readable and a machine-processable
description of the API service. The machine-processable description is written in the Web
Application Description Language (WADL).
</para>
<note>
<para>If there is a discrepancy between the two specifications, the WADL is
authoritative as it contains the most accurate and up-to-date description of the
API service. </para>
</note>
</section>
<section xml:id="Extensions-d1e688">
<title>Extensions</title>
<para>
The OpenStack Identity API is extensible. Extensions
serve two purposes: They allow the introduction of new
features in the API without requiring a version change
and they allow the introduction of vendor specific
niche functionality. Applications can programmatically
determine what extensions are available by performing
a &GET; on the /extensions URI. Note that this is a
versioned request &mdash; that is, an extension
available in one API version may not be available in
another.
</para>
<informaltable rules="all">
<thead>
<tr>
<td colspan="1">Verb</td>
<td colspan="2">URI</td>
<td colspan="3">Description</td>
</tr>
</thead>
<tbody>
<tr>
<td colspan="1">&GET;</td>
<td colspan="2">/extensions</td>
<td colspan="3">Returns a list of available extensions</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; badRequest
(<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<para>
Each extension is identified by two unique identifiers, a
<property>namespace</property> and an
<property>alias</property>. Additionally an extension
contains documentation links in various formats.
</para>
<example>
<title>Extensions Response: XML</title>
<programlisting language="xml">
<xi:include href="samples/extensions.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Extensions Response: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/extensions.json" parse="text"/></programlisting>
</example>
<para>
Extensions may also be queried individually by their
unique alias. This provides the simplest method of
checking if an extension is available as an unavailable
extension will issue an itemNotFound
(<errorcode>404</errorcode>) response.
</para>
<informaltable rules="all">
<thead>
<tr>
<td colspan="1">Verb</td>
<td colspan="2">URI</td>
<td colspan="3">Description</td>
</tr>
</thead>
<tbody>
<tr>
<td colspan="1">&GET;</td>
<td colspan="2">/extensions/<parameter>alias</parameter></td>
<td colspan="3">Return details of a single extension</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; itemNotFound
(<errorcode>404</errorcode>), badRequest
(<errorcode>400</errorcode>), identityFault
(<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>Extension Response: xml</title>
<programlisting language="xml">
<xi:include href="samples/extension.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>Extensions Response: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/extension.json" parse="text"/></programlisting>
</example>
<para>
Extensions may define new data types, parameters, actions,
headers, states, and resources. In XML, additional
elements and attributes may be defined. These elements
must be defined in the extension's namespace. In JSON, the
alias must be used. The volumes element in the <xref
linkend="UserEXT" xrefstyle="template: Examples %n"/> and
<xref linkend="UserEXTJ" xrefstyle="select: labelnumber"/>
is defined in the <code>RS-META</code> namespace. Extended
headers are always prefixed with <code>X-</code> followed
by the alias and a dash: (<code>X-RS-META-HEADER1</code>).
Parameters must be prefixed with the extension alias
followed by a colon.
</para>
<important>
<para>
Applications should be prepared to ignore response
data that contains extension elements. Also,
applications should also verify that an extension is
available before submitting an extended request.
</para>
</important>
<example xml:id="UserEXT">
<title>Extended User Response: XML</title>
<programlisting language="xml">
<xi:include href="samples/ext-getuser.xml" parse="text"/>
</programlisting>
</example>
<example xml:id="UserEXTJ">
<title>Extended User Response: JSON</title>
<programlisting language="javascript"><xi:include
href="samples/ext-getuser.json" parse="text"/></programlisting>
</example>
</section>
<section xml:id="Faults-d1e908">
<title>Faults</title>
<para>When an error occurs the system will return an HTTP error response code denoting the
type of error. The system will also return additional information about the fault in the
body of the response. </para>
<example>
<title>XML Fault Response</title>
<programlisting language="xml">
<xi:include href="samples/identity_fault.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Fault Response</title>
<programlisting language="javascript">
<xi:include href="samples/identity_fault.json" parse="text"/>
</programlisting>
</example>
<para>The error code is returned in the body of the response for convenience. The message
section returns a human readable message. The details section is optional and may contain
useful information for tracking down an error (e.g a stack trace). </para>
<para>The root element of the fault (e.g. identityFault) may change depending on the type of error.
The following is an example of an itemNotFound error. </para>
<example>
<title>XML Not Found Fault</title>
<programlisting language="xml">
<xi:include href="samples/item_not_found.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Not Found Fault</title>
<programlisting language="javascript">
<xi:include href="samples/item_not_found.json" parse="text"/>
</programlisting>
</example>
<para> The following is a list of possible fault types along with their associated error
codes. </para>
<table rules="all">
<caption>Fault Types</caption>
<thead>
<tr>
<td>Fault Element</td>
<td>Associated Error Code</td>
<td>Expected in All Requests</td>
</tr>
</thead>
<tbody>
<tr align="center">
<td>identityFault</td>
<td>500, 400</td>
<td> &CHECK; </td>
</tr>
<tr align="center">
<td>serviceUnavailable</td>
<td>503</td>
<td> &CHECK; </td>
</tr>
<tr align="center">
<td>badRequest</td>
<td>400</td>
<td> &CHECK; </td>
</tr>
<tr align="center">
<td>unauthorized</td>
<td>401</td>
<td> &CHECK; </td>
</tr>
<tr align="center">
<td>overLimit</td>
<td>413</td>
<td/>
</tr>
<tr align="center">
<td>userDisabled</td>
<td>403</td>
<td/>
</tr>
<tr align="center">
<td>forbidden</td>
<td>403</td>
<td/>
</tr>
<tr align="center">
<td>itemNotFound</td>
<td>404</td>
<td/>
</tr>
<tr align="center">
<td>tenantConflict</td>
<td>409</td>
<td/>
</tr>
</tbody>
</table>
<para>From an XML schema perspective, all API faults are extensions of the base fault type
<type>identityFault</type>. When working with a system that binds XML to actual classes (such
as JAXB), one should be capable of using <type>identityFault</type> as a “catch-all” if
there&apos;s no interest in distinguishing between individual fault types. </para>
</section>
</chapter>

View File

@ -0,0 +1,591 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE chapter [<!-- Some useful entities borrowed from HTML -->
<!ENTITY ndash "&#x2013;">
<!ENTITY mdash "&#x2014;">
<!ENTITY hellip "&#x2026;">
<!-- Useful for describing APIs -->
<!ENTITY GET '<command xmlns="http://docbook.org/ns/docbook">GET</command>'>
<!ENTITY PUT '<command xmlns="http://docbook.org/ns/docbook">PUT</command>'>
<!ENTITY POST '<command xmlns="http://docbook.org/ns/docbook">POST</command>'>
<!ENTITY DELETE '<command xmlns="http://docbook.org/ns/docbook">DELETE</command>'>
<!ENTITY HEAD '<command xmlns="http://docbook.org/ns/docbook">HEAD</command>'>
<!ENTITY CHECK '<inlinemediaobject xmlns="http://docbook.org/ns/docbook">
<imageobject>
<imagedata fileref="img/Check_mark_23x20_02.svg"
format="SVG" scale="60"/>
</imageobject>
</inlinemediaobject>'>
<!ENTITY CODES 'Normal Response Code(s):'>
<!ENTITY ERROR_CODES 'Error Response Code(s):'>
<!ENTITY NO_REQUEST '<para xmlns="http://docbook.org/ns/docbook">
This operation does not require a request body.</para>'>
<!ENTITY LONG_URI_REFHEAD '
<thead xmlns="http://docbook.org/ns/docbook">
<tr>
<td colspan="1">Verb</td>
<td colspan="4">URI</td>
<td colspan="3">Description</td>
</tr>
</thead>'>
<!ENTITY URI_REFHEAD '
<thead xmlns="http://docbook.org/ns/docbook">
<tr>
<td colspan="1">Verb</td>
<td colspan="1">URI</td>
<td colspan="4">Description</td>
</tr>
</thead>'>
]>
<chapter xmlns="http://docbook.org/ns/docbook"
xmlns:xi="http://www.w3.org/2001/XInclude"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:id="Admin_API_Service_Developer_Operations-d1e1356"
version="5.0">
<title>Admin API (Service Developer Operations)</title>
<para>The operations described in this chapter allow service developers to get and validate
access tokens, manage users, tenants, roles, and service endpoints. </para>
<section xml:id="Core_Admin_API-d1e1370">
<title>Core Admin API</title>
<para>The following calls are core for the Keystone Admin 2.0 APIs</para>
<section xml:id="Admin_Access-d1e1378">
<title>Admin Access</title>
<para>Most calls on the Admin API require authentication. The only calls available without authentication are the calls to discover the service (getting version info, WADL contract, dev guide, help, etc…) and the call to authenticate and get a token.</para>
<para>
Authentication is performed by passing in a valid token in the <code>X-Auth-Token</code> header on the request from the client.
Keystone will verify the token has (or belongs to a user that has) the <code>Admin</code> role.
</para>
<para>
See the readme file or administrator guides for how to bootstrap Keystone and create your first administrator.
</para>
<table rules="all">
<caption>Authentication Header</caption>
<thead>
<tr>
<td>Header Type</td>
<td>Name</td>
<td>Value</td>
</tr>
</thead>
<tbody>
<tr>
<td>HTTP/1.1 Request</td>
<td>X-Auth-Token</td>
<td>txfa8426a08eaf</td>
</tr>
</tbody>
</table>
</section>
<section xml:id="Tokens-d1e1565">
<title>Tokens</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &POST; </td>
<td colspan="4">/tokens</td>
<td colspan="3">Returns a token in exchange for valid credentials.</td>
</tr>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tokens/<parameter>tokenId</parameter>?belongsTo=<parameter>tenantId</parameter></td>
<td colspan="3">Validate a token.If `belongsTo` is provided, validates that a token belongs to a specific tenant.</td>
</tr>
<tr>
<td colspan="1"> &HEAD;</td>
<td colspan="4">/tokens/<parameter>tokenId</parameter>?belongsTo=<parameter>tenantId</parameter></td>
<td colspan="3">Validate a token.(Quick check).Returns no body.
If `belongsTo` is provided, validates that a token belongs to a specific tenant.
</td>
</tr>
</tbody>
</informaltable>
</section>
<section xml:id="Users-d1e1435">
<title>Users</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/users?username=<parameter>userName</parameter></td>
<td colspan="3">Returns detailed information about a specific user, by user name.</td>
</tr>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/users/<parameter>userId</parameter></td>
<td colspan="3">Returns detailed information about a specific user, by user id.</td>
</tr>
<tr>
<td colspan="1">&GET;
</td>
<td colspan="4">/users/<parameter>userId</parameter>/roles
</td>
<td colspan="3">
Get a list of global roles for a specific user (excludes tenant roles).
</td>
</tr>
</tbody>
</informaltable>
</section>
<section xml:id="Tenants-d1e1606">
<title>Tenants</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants</td>
<td colspan="3">Get a list of tenants.</td>
</tr>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants/?tenantname=<parameter>tenantName</parameter></td>
<td colspan="3">Returns detailed information about a tenant, by name.</td>
</tr>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants/<parameter>tenantId</parameter></td>
<td colspan="3">Returns detailed information about a tenant, by id.</td>
</tr>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants/<parameter>tenantId</parameter>/roles</td>
<td colspan="3">Get roles of a tenant.</td>
</tr>
<tr>
<td colspan="1">&GET;
</td>
<td colspan="4">/tenants/<parameter>tenantId</parameter>/endpoints
</td>
<td colspan="3">
Get a list of endpoints for a tenant.
</td>
</tr>
<tr>
<td colspan="1">&GET;
</td>
<td colspan="4">/tenants/<parameter>tenantId</parameter>/users/<parameter>userId</parameter>/roles
</td>
<td colspan="3">
Returns a list of roles for a user on a specific tenant.
</td>
</tr>
</tbody>
</informaltable>
</section>
</section>
<section xml:id="Token_Operations-d1e1900">
<title>Token Operations</title>
<section xml:id="Authenticate-d1e1166">
<title>Authenticate</title>
<informaltable rules="all">
&URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &POST; </td>
<td colspan="1">/tokens</td>
<td colspan="4">Authenticate to generate a token.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>), userDisabled
(<errorcode>403</errorcode>), badRequest (<errorcode>400</errorcode>), identityFault
(<errorcode>500</errorcode>), serviceUnavailable(<errorcode>503</errorcode>)</simpara>
<para>
TenantID is optional and may be used to specify that a
token should be returned that has access to the resources
of that particular tenant.
</para>
<example>
<title>XML Auth Request</title>
<programlisting language="xml">
<xi:include href="samples/auth_credentials.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Auth Request</title>
<programlisting language="javascript">
<xi:include href="samples/auth_credentials.json" parse="text"/>
</programlisting>
</example>
<example>
<title>XML Auth Response</title>
<programlisting language="xml">
<xi:include href="samples/auth.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Auth Response</title>
<programlisting language="javascript">
<xi:include href="samples/auth.json" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Validate_Token-d1e1914">
<title>Validate Token</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4"
>/tokens/<parameter>tokenId</parameter>?belongsTo=<parameter>tenantId</parameter></td>
<td colspan="3">Check that a token is valid and that it belongs to a particular user
and return the permissions relevant to a particular client.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>), forbidden
(<returnvalue>403</returnvalue>), userDisabled(<returnvalue>403</returnvalue>),
badRequest (<errorcode>400</errorcode>), itemNotFound (<errorcode>404</errorcode>),
identityFault(<returnvalue>500</returnvalue>),
serviceUnavailable(<returnvalue>503</returnvalue>)</simpara>
&NO_REQUEST;
<para>
Valid tokens will exist in the
/tokens/<parameter>tokenId</parameter> path and invalid
tokens will not. In other words, a user should expect an
itemNotFound (<errorcode>404</errorcode>) fault for an
invalid token.
</para>
<example>
<title>XML Validate Token Response</title>
<programlisting language="xml">
<xi:include href="samples/validatetoken.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Validate Token Response</title>
<programlisting language="javascript">
<xi:include href="samples/validatetoken.json" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Validate_Token-HEAD-d1e1914">
<title>Validate Token</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &HEAD; </td>
<td colspan="4"
>/tokens/<parameter>tokenId</parameter>?belongsTo=<parameter>tenantId</parameter></td>
<td colspan="3">Check that a token is valid and that it belongs to a particular user
(For perfromance).</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>), forbidden
(<returnvalue>403</returnvalue>), userDisabled(<returnvalue>403</returnvalue>),
badRequest (<errorcode>400</errorcode>), itemNotFound (<errorcode>404</errorcode>),
identityFault(<returnvalue>500</returnvalue>),
serviceUnavailable(<returnvalue>503</returnvalue>)</simpara>
&NO_REQUEST;
<para>
Valid tokens will exist in the
/tokens/<parameter>tokenId</parameter> path and invalid
tokens will not. In other words, a user should expect an
itemNotFound (<errorcode>404</errorcode>) fault for an
invalid token.
</para>
<example>
<title>XML Validate Token Response</title>
<programlisting language="xml">
No Response body is returned.
</programlisting>
</example>
<example>
<title>JSON Validate Token Response</title>
<programlisting language="javascript">
No Response body is returned.
</programlisting>
</example>
</section>
</section>
<section xml:id="User_Operations-d1e1900">
<title>User Operations</title>
<section xml:id="Get_a_User-d1e2242">
<title>Get a User</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/users/<parameter>userId</parameter></td>
<td colspan="3">Get a user by user id.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>),
forbidden(<errorcode>403</errorcode>), itemNotFound(<errorcode>404</errorcode>),
badRequest (<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>XML User Response</title>
<programlisting language="xml">
<xi:include href="samples/user.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON User Response</title>
<programlisting language="javascript">
<xi:include href="samples/user.json" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Get_a_User-By_Name-d1e2242">
<title>Get a User</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/users?username=<parameter>userName</parameter></td>
<td colspan="3">Get a user by user name.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>),
forbidden(<errorcode>403</errorcode>), itemNotFound(<errorcode>404</errorcode>),
badRequest (<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>XML User Response</title>
<programlisting language="xml">
<xi:include href="samples/user.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON User Response</title>
<programlisting language="javascript">
<xi:include href="samples/user.json" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Get_User_Roles-d1e2242">
<title>Get list of User Roles</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/users/<parameter>user_id</parameter>/roles</td>
<td colspan="3">Returns a list of global roles associated with a specific user (excludes tenant roles).</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>),
forbidden(<errorcode>403</errorcode>), itemNotFound(<errorcode>404</errorcode>),
badRequest (<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>XML User Role Response</title>
<programlisting language="xml">
<xi:include href="samples/roles.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON User Role Response</title>
<programlisting language="javascript">
<xi:include href="samples/roles.json" parse="text"/>
</programlisting>
</example>
</section>
</section>
<section xml:id="Tenant_Operations-d1e1900">
<title>Tenant Operations</title>
<section xml:id="Get_Tenants-d1e1264">
<title>Get Tenants</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants</td>
<td colspan="3">Get a list of tenants.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>),
forbidden(<errorcode>403</errorcode>), overLimit(<errorcode>413</errorcode>),
badRequest (<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
<para>
The operation returns a list of tenants which the caller has
access to. This call must be authenticated, so a valid token must
be passed in as a header.
</para>
<example>
<title>Tenants Request with Auth Token</title>
<programlisting language="text">
<xi:include href="samples/tenants-request.txt" parse="text"/>
</programlisting>
</example>
&NO_REQUEST;
<example>
<title>JSON Tenants Response</title>
<programlisting language="javascript">
<xi:include href="samples/tenants.json" parse="text"/>
</programlisting>
</example>
<example>
<title>XML Tenants Response</title>
<programlisting language="xml">
<xi:include href="samples/tenants.xml" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Get_a_Tenant-d1e2242">
<title>Get a Tenant</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants/<parameter>tenantId</parameter></td>
<td colspan="3">Get a tenant.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>),
forbidden(<errorcode>403</errorcode>), itemNotFound(<errorcode>404</errorcode>),
badRequest (<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>XML Tenant Response</title>
<programlisting language="xml">
<xi:include href="samples/tenant.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Tenant Response</title>
<programlisting language="javascript">
<xi:include href="samples/tenant.json" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Get_a_Tenant-By_Name-d1e2242">
<title>Get a Tenant by Name</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants?<parameter>name=tenant_name</parameter></td>
<td colspan="3">Get a tenant by name.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>),
forbidden(<errorcode>403</errorcode>), itemNotFound(<errorcode>404</errorcode>),
badRequest (<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>XML Tenant Response</title>
<programlisting language="xml">
<xi:include href="samples/tenant.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Tenant Response</title>
<programlisting language="javascript">
<xi:include href="samples/tenant.json" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Get_Tenant_Endpoints-d1e2242">
<title>Get list of Tenant Endpoints</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants/<parameter>tenantId</parameter>/endpoints</td>
<td colspan="3"> Returns a list of roles for a user on a specific tenant.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>),
forbidden(<errorcode>403</errorcode>), itemNotFound(<errorcode>404</errorcode>),
badRequest (<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>XML Tenant Response</title>
<programlisting language="xml">
<xi:include href="samples/endpoints.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Tenant Response</title>
<programlisting language="javascript">
<xi:include href="samples/endpoints.json" parse="text"/>
</programlisting>
</example>
</section>
<section xml:id="Get_Tenant_User_Roles-d1e2242">
<title>Get list of Roles assigned for a User on a Tenant</title>
<informaltable rules="all">
&LONG_URI_REFHEAD;
<tbody>
<tr>
<td colspan="1"> &GET; </td>
<td colspan="4">/tenants/<parameter>tenant_id</parameter>/users/<parameter>user_id</parameter>/roles</td>
<td colspan="3">Returns a list of roles assigned to a user for a specific tenant.</td>
</tr>
</tbody>
</informaltable>
<simpara>&CODES;<returnvalue>200</returnvalue>, <returnvalue>203</returnvalue></simpara>
<simpara>&ERROR_CODES; unauthorized (<errorcode>401</errorcode>),
forbidden(<errorcode>403</errorcode>), itemNotFound(<errorcode>404</errorcode>),
badRequest (<errorcode>400</errorcode>), identityFault (<errorcode>500</errorcode>),
serviceUnavailable(<errorcode>503</errorcode>)</simpara>
&NO_REQUEST;
<example>
<title>XML Tenant Response</title>
<programlisting language="xml">
<xi:include href="samples/roles.xml" parse="text"/>
</programlisting>
</example>
<example>
<title>JSON Tenant Response</title>
<programlisting language="javascript">
<xi:include href="samples/roles.json" parse="text"/>
</programlisting>
</example>
</section>
</section>
</chapter>

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://web.resource.org/cc/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="19.21315"
height="18.294994"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.45"
sodipodi:modified="true"
version="1.0">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="17.757032"
inkscape:cy="7.298821"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="984"
inkscape:window-height="852"
inkscape:window-x="148"
inkscape:window-y="66" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-192.905,-516.02064)">
<path
style="fill:#000000"
d="M 197.67968,534.31563 C 197.40468,534.31208 196.21788,532.53719 195.04234,530.37143 L 192.905,526.43368 L 193.45901,525.87968 C 193.76371,525.57497 194.58269,525.32567 195.27896,525.32567 L 196.5449,525.32567 L 197.18129,527.33076 L 197.81768,529.33584 L 202.88215,523.79451 C 205.66761,520.74678 208.88522,517.75085 210.03239,517.13691 L 212.11815,516.02064 L 207.90871,520.80282 C 205.59351,523.43302 202.45735,527.55085 200.93947,529.95355 C 199.42159,532.35625 197.95468,534.31919 197.67968,534.31563 z "
id="path2223" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,67 @@
{
"auth": {
"token": {
"id": "asdasdasd-adsasdads-asdasdasd-adsadsasd",
"expires": "2010-11-01T03:32:15-05:00"
},
"serviceCatalog": [
{
"name": "Cloud Servers",
"type": "compute",
"endpoints": [
{
"publicURL": "https://compute.north.host/v1/1234",
"internalURL": "https://compute.north.host/v1/1234",
"region": "North",
"tenantId": "1234",
"versionId": "1.0",
"versionInfo": "https://compute.north.host/v1.0/",
"versionList": "https://compute.north.host/"
}, {
"publicURL": "https://compute.north.host/v1.1/3456",
"internalURL": "https://compute.north.host/v1.1/3456",
"region": "North",
"tenantId": "3456",
"versionId": "1.1",
"versionInfo": "https://compute.north.host/v1.1/",
"versionList": "https://compute.north.host/"
}
]
}, {
"name": "Cloud Files",
"type": "object-store",
"endpoints": [
{
"publicURL": "https://compute.north.host/v1/blah-blah",
"internalURL": "https://compute.north.host/v1/blah-blah",
"region": "South",
"tenantId": "1234",
"versionId": "1.0",
"versionInfo": "uri",
"versionList": "uri"
}, {
"publicURL": "https://compute.north.host/v1.1/blah-blah",
"internalURL": "https://compute.north.host/v1.1/blah-blah",
"region": "South",
"tenantId": "3456",
"versionId": "1.1",
"versionInfo": "https://compute.north.host/v1.1/",
"versionList": "https://compute.north.host/"
}
],
"endpoint_links": [
{
"rel": "next",
"href": "https://identity.north.host/v2.0/endpoints?marker=2"
}
]
}
],
"serviceCatalog_links": [
{
"rel": "next",
"href": "https://identity.host/v2.0/endpoints?session=2hfh8Ar&marker=2"
}
]
}
}

View File

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<auth xmlns="http://docs.openstack.org/identity/api/v2.0">
<token expires="2010-11-01T03:32:15-05:00"
id="ab48a9efdfedb23ty3494"/>
<serviceCatalog>
<service type="compute" name="Computers in the Cloud">
<endpoint
region="North"
tenantId="1234"
publicURL="https://north.compute.public.com/v2.0/1234"
internalURL="https://north.compute.internal.com/v2.0/1234">
<version
id="2.0"
info="https://north.compute.public.com/v2.0/"
list="https://north.compute.public.com/" />
</endpoint>
<endpoint
region="South"
tenantId="3456"
publicURL="https://south.compute.public.com/v2.0/3456"
internalURL="https://south.compute.internal.com/v2.0/3456">
<version
id="2.0"
info="https://south.compute.public.com/v2.0/"
list="https://south.compute.public.com/" />
</endpoint>
</service>
<service type="object-store" name="HTTP Object Store">
<endpoint
region="North"
tenantId="1234"
publicURL="https://north.object-store.public.com/v1/1234"
internalURL="https://north.object-store.internal.com/v1/1234">
<version
id="1"
info="https://north.object-store.public.com/v1/"
list="https://north.object-store.public.com/" />
</endpoint>
<endpoint
region="South"
tenantId="3456"
publicURL="https://south.object-store.public.com/v2.0/3456"
internalURL="https://south.object-store.internal.com/v2.0/3456">
<version
id="2.0"
info="https://south.object-store.public.com/v1/"
list="https://south.object-store.public.com/" />
</endpoint>
</service>
<service type="dns" name="DNS-as-a-Service">
<endpoint
publicURL="https://dns.public.com/v2.0/blah-blah">
<version
id="2.0"
info="https://dns.public.com/v2.0/"
list="https://dns.public.com/" />
</endpoint>
</service>
</serviceCatalog>
</auth>

View File

@ -0,0 +1,10 @@
{
"auth": {
"OS-EC2-ec2Credentials": {
"username": "test_user",
"secret": "aaaaa",
"signature": "bbb",
},
"tenantId": "77654"
}
}

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<auth
xmlns="http://docs.openstack.org/identity/api/v2.0"
tenantId="1234">
<ec2Credentials
xmlns="http://docs.openstack.org/identity/api/ext/OS-EC2/v1.0"
username="testuser"
key="aaaaa"
signature="bbbbb"
tenantId="77654"/>
</auth>

View File

@ -0,0 +1,8 @@
{
"auth": {
"RAX-KEY:apikeyCredentials": {
"username": "test_user",
"apikey": "aaaaa-bbbbb-ccccc-12345678"
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<auth xmlns="http://docs.openstack.org/identity/api/v2.0">
<apikeyCredentials
xmlns="http://docs.rackspace.com/identity/api/ext/RAX-KEY/v1.0"
username="testuser"
apikey="aaaaa-bbbbb-ccccc-12345678"/>
</auth>

View File

@ -0,0 +1,9 @@
{
"auth": {
"passwordCredentials": {
"username": "test_user",
"password": "mypass"
},
"tenantId": "1234"
}
}

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<auth
xmlns="http://docs.openstack.org/identity/api/v2.0"
tenantId="1234">
<passwordCredentials
username="testuser"
password="P@ssword1"/>
</auth>

View File

@ -0,0 +1,67 @@
{
"choices": {
"values": [
{
"id": "v1.0",
"status": "DEPRECATED",
"links": [
{
"rel": "self",
"href": "http://identity.api.openstack.org/v1.0"
}
],
"media-types": {
"values": [
{
"base": "application/xml",
"type": "application/vnd.openstack.identity+xml;version=1.0"
}, {
"base": "application/json",
"type": "application/vnd.openstack.identity+json;version=1.0"
}
]
}
}, {
"id": "v1.1",
"status": "CURRENT",
"links": [
{
"rel": "self",
"href": "http://identity.api.openstack.org/v1.1"
}
],
"media-types": {
"values": [
{
"base": "application/xml",
"type": "application/vnd.openstack.identity+xml;version=1.1"
}, {
"base": "application/json",
"type": "application/vnd.openstack.identity+json;version=1.1"
}
]
}
}, {
"id": "v2.0",
"status": "BETA",
"links": [
{
"rel": "self",
"href": "http://identity.api.openstack.org/v2.0"
}
],
"media-types": {
"values": [
{
"base": "application/xml",
"type": "application/vnd.openstack.identity+xml;version=2.0"
}, {
"base": "application/json",
"type": "application/vnd.openstack.identity+json;version=2.0"
}
]
}
}
]
}
}

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<choices
xmlns="http://docs.openstack.org/common/api/v2.0"
xmlns:atom="http://www.w3.org/2005/Atom">
<version id="v1.0" status="DEPRECATED">
<media-types>
<media-type
base="application/xml"
type="application/vnd.openstack.identity+xml;version=1.0" />
<media-type
base="application/json"
type="application/vnd.openstack.identity+json;version=1.0" />
</media-types>
<atom:link rel="self" href="http://identity.api.openstack.org/v1.0" />
</version>
<version id="v1.1" status="CURRENT">
<media-types>
<media-type
base="application/xml"
type="application/vnd.openstack.identity+xml;version=1.1" />
<media-type
base="application/json"
type="application/vnd.openstack.identity+json;version=1.1" />
</media-types>
<atom:link rel="self" href="http://identity.api.openstack.org/v1.1" />
</version>
<version id="v2.0" status="BETA">
<media-types>
<media-type
base="application/xml"
type="application/vnd.openstack.identity+xml;version=2.0" />
<media-type
base="application/json"
type="application/vnd.openstack.identity+json;version=2.0" />
</media-types>
<atom:link rel="self" href="http://identity.api.openstack.org/v2.0" />
</version>
</choices>

View File

@ -0,0 +1,6 @@
{
"endpoint": {
"id": 3,
"href": "https://auth.keystone.com/v2.0/endpoints/3"
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<endpoint xmlns="http://docs.openstack.org/identity/api/v2.0"
id="3"
href="https://auth.keystone.com/v2.0/endpoints/3"
/>

View File

@ -0,0 +1,14 @@
{
"endpointTemplate": {
"id": 1,
"region": "North",
"global": true,
"type": "compute",
"publicURL": "https://compute.north.public.com/v1",
"internalURL": "https://compute.north.internal.com/v1",
"versionId": "1",
"versionInfo": "https://compute.north.public.com/v1/",
"versionList": "https://compute.north.public.com/",
"enabled": true
}
}

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<endpointTemplate
xmlns="http://docs.openstack.org/identity/api/v2.0"
id="1"
region="North"
global="true"
type="compute"
publicURL="https://service-public.com/v1"
internalURL="https://service-internal.com/v1"
enabled="true">
<version
ID="1"
Info="https://compute.north.public.com/v1/"
List="https://compute.north.public.com/"
/>
</endpointTemplate>

View File

@ -0,0 +1,54 @@
{
"endpointsTemplates": [
{
"id": 1,
"region": "North",
"global": true,
"type": "compute",
"publicURL": "https://compute.north.public.com/v1",
"internalURL": "https://compute.north.internal.com/v1",
"versionId": "1",
"versionInfo": "https://compute.north.public.com/v1/",
"versionList": "https://compute.north.public.com/",
"enabled": true
}, {
"id": 2,
"region": "South",
"serviceName": "compute",
"publicURL": "https://compute.south.public.com/v1",
"internalURL": "https://compute.south.internal.com/v1",
"versionId": "1",
"versionInfo": "https://compute.south.public.com/v1/",
"versionList": "https://compute.south.public.com/",
"enabled": false
}, {
"id": 3,
"region": "North",
"global": true,
"serviceName": "object-store",
"publicURL": "https://object-store.north.public.com/v1.0",
"versionId": "1.0",
"versionInfo": "https://object-store.north.public.com/v1.0/",
"versionList": "https://object-store.north.public.com/",
"enabled": true
}, {
"id": 4,
"region": "South",
"serviceName": "object-store",
"publicURL": "https://object-store.south.public.com/v2",
"versionId": "2",
"versionInfo": "https://object-store.south.public.com/v2/",
"versionList": "https://object-store.south.public.com/",
"enabled": true
}, {
"id": 5,
"global": true,
"serviceName": "OS-DNS:DNS",
"publicURL": "https://dns.public.com/v3.2",
"versionId": "1.0",
"versionInfo": "https://dns.public.com/v1.0/",
"versionList": "https://dns.public.com/",
"enabled": true
}
]
}

View File

@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<endpointTemplates xmlns="http://docs.openstack.org/identity/api/v2.0">
<endpointTemplate
id="1"
region="North"
global="true"
serviceType="compute"
publicURL="https://compute.north.public.com/v1"
internalURL="https://compute.north.internal.com/v1"
enabled="true">
<version
ID="1"
List="https://compute.north.public.com/"
Info="https://compute.north.public.com/v1"/>
</endpointTemplate>
<endpointTemplate
id="2"
region="south"
serviceType="service2"
publicURL="https://service2.public.com/v1"
internalURL="https://service2.internal.public.com/v1"
enabled="false">
<version
ID="1"
List="https://service1.public.com/"
Info="https://service1.public.com/v1"/>
</endpointTemplate>
<endpointTemplate
id="3"
region="DFW"
global="true"
serviceType="service1"
publicURL="https://service1.public.com/v1"
enabled="true">
<version
ID="1"
List="https://service1.public.com/"
Info="https://service1.public.com/v1"/>
</endpointTemplate>
<endpointTemplate
id="4"
region="ORD"
serviceType="service2"
publicURL="https://service2.public.com/v1"
enabled="true">
<version
ID="1"
List="https://service1.public.com/"
Info="https://service1.public.com/v1"/>
</endpointTemplate>
<endpointTemplate
id="5"
global="true"
serviceType="service3"
publicURL="https://service3.public.com/v1">
<version
ID="1"
List="https://service1.public.com/"
Info="https://service1.public.com/v1"/>
</endpointTemplate>
</endpointTemplates>

View File

@ -0,0 +1,20 @@
{
"endpoints": [
{
"id": 1,
"href": "https://auth.keystone.com/v2.0/endpoints/1"
}, {
"id": 2,
"href": "https://auth.keystone.com/v2.0/endpoints/2"
}, {
"id": 3,
"href": "https://auth.keystone.com/v2.0/endpoints/3"
}, {
"id": 4,
"href": "https://auth.keystone.com/v2.0/endpoints/4"
}, {
"id": 5,
"href": "https://auth.keystone.com/v2.0/endpoints/5"
}
]
}

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<endpoints
xmlns="http://docs.openstack.org/identity/api/v2.0">
<endpoint
href="https://auth.keystone.com/v2.0/endpoints/1"
id="1" />
<endpoint
href="https://auth.keystone.com/v2.0/endpoints/2"
id="2" />
<endpoint
href="https://auth.keystone.com/v2.0/endpoints/3"
id="3" />
<endpoint
href="https://auth.keystone.com/v2.0/endpoints/4"
id="4" />
<endpoint
href="https://auth.keystone.com/v2.0/endpoints/5"
id="5" />
</endpoints>

View File

@ -0,0 +1,22 @@
{
"user": {
"roles": {
"values": [
{
"tenantId": "1234",
"id": "Admin"
}
]
},
"id": "u1000",
"username": "jqsmith",
"email": "john.smith@example.org",
"enabled": true,
"RS-META:metadata": {
"values": {
"MetaKey1": "MetaValue1",
"MetaKey2": "MetaValue2"
}
}
}
}

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<user xmlns="http://docs.openstack.org/identity/api/v2.0"
enabled="true" email="john.smith@example.org"
id="u1000" username="jqsmith">
<roles>
<role tenantId="1234" id="Admin"/>
</roles>
<metadata
xmlns="http://docs.rackspacecloud.com/identity/api/ext/meta/v2.0">
<meta key="MetaKey1">MetaValue1</meta>
<meta key="MetaKey2">MetaValue2</meta>
</metadata>
</user>

View File

@ -0,0 +1,20 @@
{
"extension": {
"name": "User Metadata Extension",
"namespace": "http://docs.rackspacecloud.com/identity/api/ext/meta/v2.0",
"alias": "RS-META",
"updated": "2011-01-12T11:22:33-06:00",
"description": "Allows associating arbritrary metadata with a user.",
"links": [
{
"rel": "describedby",
"type": "application/pdf",
"href": "http://docs.rackspacecloud.com/identity/api/ext/identity-meta-20111201.pdf"
}, {
"rel": "describedby",
"type": "application/vnd.sun.wadl+xml",
"href": "http://docs.rackspacecloud.com/identity/api/ext/identity-cbs.wadl"
}
]
}
}

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<extension xmlns="http://docs.openstack.org/common/api/v1.0"
xmlns:atom="http://www.w3.org/2005/Atom"
name="User Metadata Extension"
namespace="http://docs.rackspacecloud.com/identity/api/ext/meta/v2.0"
alias="RS-META"
updated="2011-01-12T11:22:33-06:00">
<description>
Allows associating arbritrary metadata with a user.
</description>
<atom:link rel="describedby"
type="application/pdf"
href="http://docs.rackspacecloud.com/identity/api/ext/identity-meta-20111201.pdf"/>
<atom:link rel="describedby"
type="application/vnd.sun.wadl+xml"
href="http://docs.rackspacecloud.com/identity/api/ext/identity-meta.wadl"/>
</extension>

View File

@ -0,0 +1,41 @@
{
"extensions": {
"values": [
{
"name": "Reset Password Extension",
"namespace": "http://docs.rackspacecloud.com/identity/api/ext/rpe/v2.0",
"alias": "RS-RPE",
"updated": "2011-01-22T13:25:27-06:00",
"description": "Adds the capability to reset a user's password. The user is emailed when the password has been reset.",
"links": [
{
"rel": "describedby",
"type": "application/pdf",
"href": "http://docs.rackspacecloud.com/identity/api/ext/identity-rpe-20111111.pdf"
}, {
"rel": "describedby",
"type": "application/vnd.sun.wadl+xml",
"href": "http://docs.rackspacecloud.com/identity/api/ext/identity-rpe.wadl"
}
]
}, {
"name": "User Metadata Extension",
"namespace": "http://docs.rackspacecloud.com/identity/api/ext/meta/v2.0",
"alias": "RS-META",
"updated": "2011-01-12T11:22:33-06:00",
"description": "Allows associating arbritrary metadata with a user.",
"links": [
{
"rel": "describedby",
"type": "application/pdf",
"href": "http://docs.rackspacecloud.com/identity/api/ext/identity-meta-20111201.pdf"
}, {
"rel": "describedby",
"type": "application/vnd.sun.wadl+xml",
"href": "http://docs.rackspacecloud.com/identity/api/ext/identity-meta.wadl"
}
]
}
]
}
}

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<extensions xmlns="http://docs.openstack.org/common/api/v1.0"
xmlns:atom="http://www.w3.org/2005/Atom">
<extension
name="Reset Password Extension"
namespace="http://docs.rackspacecloud.com/identity/api/ext/rpe/v1.0"
alias="RS-RPE"
updated="2011-01-22T13:25:27-06:00">
<description>
Adds the capability to reset a user's password. The user is
emailed when the password has been reset.
</description>
<atom:link rel="describedby"
type="application/pdf"
href="http://docs.rackspacecloud.com/identity/api/ext/identity-rpe-20111111.pdf"/>
<atom:link rel="describedby"
type="application/vnd.sun.wadl+xml"
href="http://docs.rackspacecloud.com/identity/api/ext/identity-rpe.wadl"/>
</extension>
<extension
name="User Metadata Extension"
namespace="http://docs.rackspacecloud.com/identity/api/ext/meta/v2.0"
alias="RS-META"
updated="2011-01-12T11:22:33-06:00">
<description>
Allows associating arbritrary metadata with a user.
</description>
<atom:link rel="describedby"
type="application/pdf"
href="http://docs.rackspacecloud.com/identity/api/ext/identity-meta-20111201.pdf"/>
<atom:link rel="describedby"
type="application/vnd.sun.wadl+xml"
href="http://docs.rackspacecloud.com/identity/api/ext/identity-meta.wadl"/>
</extension>
</extensions>

View File

@ -0,0 +1,25 @@
{
"user": {
"roles": {
"values": [
{
"tenantId": "1234",
"id": "Admin"
}, {
"tenantId": "1234",
"id": "DBUser"
}
],
"links": [
{
"rel": "next",
"href": "http://identity.api.openstack.org/v2.0/tenants/1234/users/u1000/roles?marker=Super"
}
]
},
"id": "u1000",
"username": "jqsmith",
"email": "john.smith@example.org",
"enabled": true
}
}

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<user xmlns="http://docs.openstack.org/identity/api/v2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
enabled="true" email="john.smith@example.org"
username="jqsmith" id="u1000">
<roles>
<role tenantId="1234" id="Admin"/>
<role tenantId="1234" id="DBUser"/>
<atom:link
rel="next"
href="http://identity.api.openstack.org/v2.0/tenants/1234/users/u1000/groups?marker=Super"/>
</roles>
</user>

View File

@ -0,0 +1,7 @@
{
"identityFault": {
"message": "Fault",
"details": "Error Details...",
"code": 500
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<identityFault xmlns="http://docs.openstack.org/identity/api/v2.0"
code="500">
<message>Fault</message>
<details>Error Details...</details>
</identityFault>

View File

@ -0,0 +1,7 @@
{
"itemNotFound": {
"message": "Item not found.",
"details": "Error Details...",
"code": 404
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<itemNotFound xmlns="http://docs.openstack.org/identity/api/v2.0"
code="404">
<message>Item not found.</message>
<details>Error Details...</details>
</itemNotFound>

View File

@ -0,0 +1,6 @@
{
"role": {
"id": "Guest",
"description": "Guest Access"
}
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<role xmlns="http://docs.openstack.org/identity/api/v2.0" id="Admin"
description="All Access" />

View File

@ -0,0 +1,13 @@
{
"roles": [
{
"id": "Admin",
"tenantId": "1234",
"description": "All access"
}, {
"id": "Guest",
"tenantId": "3456",
"description": "Guest Access"
}
]
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<roles xmlns="http://docs.openstack.org/identity/api/v2.0">
<role id="Admin" tenantId="1234" description="All Access" />
<role id="Guest" tenantId="3456" description="Guest Access" />
</roles>

View File

@ -0,0 +1,4 @@
POST /v2.0/tokens HTTP/1.1
Host: identity.api.openstack.org
Content-Type: application/json
Accept: application/xml

View File

@ -0,0 +1,4 @@
HTTP/1.1 200 OKAY
Date: Mon, 12 Nov 2010 15:55:01 GMT
Content-Length:
Content-Type: application/xml; charset=UTF-8

View File

@ -0,0 +1,7 @@
{
"service": {
"id": "nova",
"type": "compute",
"description": "A description ..."
}
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<service xmlns="http://docs.openstack.org/identity/api/v2.0" id="nova"
type="compute" description="OpenStack Compute Service" />

View File

@ -0,0 +1,13 @@
{
"services": [
{
"id": "nova",
"type": "compute",
"description": "Computers in the Cloud"
}, {
"id": "glance",
"type": "image-service",
"description": "Server Images"
}
]
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<services xmlns="http://docs.openstack.org/identity/api/v2.0">
<service id="Nova" type="compute" description="Openstack Service" />
<service id="Glance" type="image-service" description="Openstack Service" />
</services>

View File

@ -0,0 +1,8 @@
{
"tenant": {
"id": "1234",
"name": "ACME corp",
"description": "A description ...",
"enabled": true
}
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<tenant xmlns="http://docs.openstack.org/identity/api/v2.0"
enabled="true" id="1234" name="ACME Corp">
<description>A description...</description>
</tenant>

View File

@ -0,0 +1,5 @@
{
"tenant": {
"description": "A NEW description..."
}
}

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<tenant xmlns="http://docs.openstack.org/identity/api/v2.0">
<description>A NEW description...</description>
</tenant>

View File

@ -0,0 +1,18 @@
{
"tenants": {
"values": [
{
"id": "1234",
"name": "ACME corp",
"description": "A description ...",
"enabled": true
}
],
"links": [
{
"rel": "next",
"href": "http://identity.api.openstack.org/v2.0/tenants?limit=1&marker=1234"
}
]
}
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<tenants xmlns="http://docs.openstack.org/identity/api/v2.0"
xmlns:atom="http://www.w3.org/2005/Atom">
<tenant enabled="true" id="1234" name="ACME Corp">
<description>A description...</description>
</tenant>
<atom:link
rel="next"
href="http://identity.api.openstack.org/v2.0/tenants?limit=1&amp;marker=1234"/>
</tenants>

View File

@ -0,0 +1,21 @@
{
"tenants": {
"values": [
{
"id": "3645",
"name": "Iron Works",
"description": "A description ...",
"enabled": true
}
],
"links": [
{
"rel": "next",
"href": "http://identity.api.openstack.org/v2.0/tenants?limit=1&marker=3645"
}, {
"rel": "previous",
"href": "http://identity.api.openstack.org/v2.0/tenants?limit=1"
}
]
}
}

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<tenants xmlns="http://docs.openstack.org/identity/api/v2.0"
xmlns:atom="http://www.w3.org/2005/Atom">
<tenant enabled="true" id="3645" name="Iron Works">
<description>A description...</description>
</tenant>
<atom:link
rel="previous"
href="http://identity.api.openstack.org/v2.0/tenants?limit=1"/>
<atom:link
rel="next"
href="http://identity.api.openstack.org/v2.0/tenants?limit=1&amp;marker=3645"/>
</tenants>

View File

@ -0,0 +1,18 @@
{
"tenants": {
"values": [
{
"id": "9999",
"name": "Bigz",
"description": "A description ...",
"enabled": true
}
],
"links": [
{
"rel": "previous",
"href": "http://identity.api.openstack.org/v2.0/tenants?limit=1&marker=1234"
}
]
}
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<tenants xmlns="http://docs.openstack.org/identity/api/v2.0"
xmlns:atom="http://www.w3.org/2005/Atom">
<tenant enabled="true" id="9999" name="Bigz">
<description>A description...</description>
</tenant>
<atom:link
rel="previous"
href="http://identity.api.openstack.org/v2.0/tenants?limit=1&amp;marker=1234"/>
</tenants>

View File

@ -0,0 +1,5 @@
GET /v2.0/tenants HTTP/1.1
Host: identity.api.openstack.org
Content-Type: application/json
X-Auth-Token: fa8426a0-8eaf-4d22-8e13-7c1b16a9370c
Accept: application/json

View File

@ -0,0 +1,17 @@
{
"tenants": {
"values": [
{
"id": "1234",
"name": "ACME Corp",
"description": "A description ...",
"enabled": true
}, {
"id": "3456",
"name": "Iron Works",
"description": "A description ...",
"enabled": true
}
]
}
}

View File

@ -0,0 +1,14 @@
HTTP/1.1 200 OK
Content-Type: application/xml; charset=UTF-8
Content-Length: 200
Date: Sun, 1 Jan 2011 9:00:00 GMT
<?xml version="1.0" encoding="UTF-8"?>
<tenants xmlns="http://docs.openstack.org/identity/api/v2.0">
<tenant enabled="true" id="1234" name="ACME Corp">
<description>A description...</description>
</tenant>
<tenant enabled="true" id="3645" name="Iron Works">
<description>A description...</description>
</tenant>
</tenants>

View File

@ -0,0 +1,8 @@
{
"tenant": {
"id": "1234",
"name": "ACME Corp",
"description": "A NEW description...",
"enabled": true
}
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<tenant xmlns="http://docs.openstack.org/identity/api/v2.0"
enabled="true" id="1234" name="ACME Corp">
<description>A NEW description...</description>
</tenant>

View File

@ -0,0 +1,8 @@
{
"user": {
"id": "u1000",
"username": "jqsmith",
"email": "john.smith@example.org",
"enabled": true
}
}

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<user xmlns="http://docs.openstack.org/identity/api/v2.0"
enabled="true" email="john.smith@example.org"
username="jqsmith" id="u1000">
</user>

View File

@ -0,0 +1,19 @@
{
"auth": {
"token": {
"expires": "2010-11-01T03:32:15-05:00",
"id": "ab48a9efdfedb23ty3494"
},
"user": {
"username": "jqsmith",
"roles": [
{
"id": "Admin",
"tenantId": "one"
}, {
"id": "compute:cloud_admin"
}
]
}
}
}

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<auth xmlns="http://docs.openstack.org/identity/api/v2.0">
<token expires="2010-11-01T03:32:15-05:00"
id="ab48a9efdfedb23ty3494"/>
<user username="jqsmith">
<roles xmlns="http://docs.openstack.org/identity/api/v2.0">
<role xmlns="http://docs.openstack.org/identity/api/v2.0"
id="Admin" tenantId="one"/>
<role xmlns="http://docs.openstack.org/identity/api/v2.0"
id="compute:cloud_admin"/>
</roles>
</user>
</auth>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title type="text">About This Version</title>
<updated>2011-01-21T11:33:21-06:00</updated>
<id>http://identity.api.openstack.org/v2.0/</id>
<author><name>OpenStack</name><uri>http://www.openstack.org/</uri></author>
<link rel="self" href="http://identity.api.openstack.org/v2.0/"/>
<entry>
<id>http://identity.api.openstack.org/v2.0/</id>
<title type="text">Version v2.0</title>
<updated>2011-01-21T11:33:21-06:00</updated>
<link rel="self" href="http://identity.api.openstack.org/v2.0/"/>
<link rel="describedby" type="application/pdf"
href="http://docs.openstack.org/identity/api/v2.0/identity-latest.pdf"/>
<link rel="describedby" type="application/vnd.sun.wadl+xml"
href="http://docs.openstack.org/identity/api/v2.0/application.wadl"/>
<content type="text">Version v2.0 CURRENT (2011-01-21T11:33:21-06:00)</content>
</entry>
</feed>

View File

@ -0,0 +1,30 @@
{
"version": {
"id": "v2.0",
"status": "CURRENT",
"updated": "2011-01-21T11:33:21-06:00",
"links": [
{
"rel": "self",
"href": "http://identity.api.openstack.org/v2.0/"
}, {
"rel": "describedby",
"type": "application/pdf",
"href": "http://docs.openstack.org/identity/api/v2.0/identity-latest.pdf"
}, {
"rel": "describedby",
"type": "application/vnd.sun.wadl+xml",
"href": "http://docs.openstack.org/identity/api/v2.0/identity.wadl"
}
],
"media-types": [
{
"base": "application/xml",
"type": "application/vnd.openstack.identity+xml;version=2.0"
}, {
"base": "application/json",
"type": "application/vnd.openstack.identity+json;version=2.0"
}
]
}
}

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<version xmlns="http://docs.openstack.org/common/api/v1.0"
xmlns:atom="http://www.w3.org/2005/Atom"
id="v2.0" status="CURRENT" updated="2011-01-21T11:33:21-06:00">
<media-types>
<media-type base="application/xml"
type="application/vnd.openstack.identity+xml;version=2.0"/>
<media-type base="application/json"
type="application/vnd.openstack.identity+json;version=2.0"/>
</media-types>
<atom:link rel="self"
href="http://identity.api.openstack.org/v2.0/"/>
<atom:link rel="describedby"
type="application/pdf"
href="http://docs.openstack.org/identity/api/v2.0/identity-latest.pdf" />
<atom:link rel="describedby"
type="application/vnd.sun.wadl+xml"
href="http://docs.openstack.org/identity/api/v2.0/identity.wadl" />
</version>

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title type="text">Available API Versions</title>
<updated>2010-12-12T18:30:02.25Z</updated>
<id>http://identity.api.openstack.org/</id>
<author><name>OpenStack</name><uri>http://www.openstack.org/</uri></author>
<link rel="self" href="http://identity.api.openstack.org/"/>
<entry>
<id>http://identity.api.openstack.org/v2.0/</id>
<title type="text">Version v2.0</title>
<updated>2011-05-27T20:22:02.25Z</updated>
<link rel="self" href="http://identity.api.openstack.org/v2.0/"/>
<content type="text">Version v2.1 CURRENT (2011-05-27T20:22:02.25Z)</content>
</entry>
<entry>
<id>http://identity.api.openstack.org/v1.1/</id>
<title type="text">Version v1.1</title>
<updated>2010-12-12T18:30:02.25Z</updated>
<link rel="self" href="http://identity.api.openstack.org/v1.1/"/>
<content type="text">Version v1.1 CURRENT (2010-12-12T18:30:02.25Z)</content>
</entry>
<entry>
<id>http://identity.api.openstack.org/v1.0/</id>
<title type="text">Version v1.0</title>
<updated>2009-10-09T11:30:00Z</updated>
<link rel="self" href="http://identity.api.openstack.org/v1.0/"/>
<content type="text">Version v1.0 DEPRECATED (2009-10-09T11:30:00Z)</content>
</entry>
</feed>

View File

@ -0,0 +1,37 @@
{
"versions": {
"values": [
{
"id": "v1.0",
"status": "DEPRECATED",
"updated": "2009-10-09T11:30:00Z",
"links": [
{
"rel": "self",
"href": "http://identity.api.openstack.org/v1.0/"
}
]
}, {
"id": "v1.1",
"status": "CURRENT",
"updated": "2010-12-12T18:30:02.25Z",
"links": [
{
"rel": "self",
"href": "http://identity.api.openstack.org/v1.1/"
}
]
}, {
"id": "v2.0",
"status": "BETA",
"updated": "2011-05-27T20:22:02.25Z",
"links": [
{
"rel": "self",
"href": "http://identity.api.openstack.org/v2.0/"
}
]
}
]
}
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<versions xmlns="http://docs.openstack.org/common/api/v1.0"
xmlns:atom="http://www.w3.org/2005/Atom">
<version id="v1.0" status="DEPRECATED"
updated="2009-10-09T11:30:00Z">
<atom:link rel="self"
href="http://identity.api.openstack.org/v1.0/"/>
</version>
<version id="v1.1" status="CURRENT"
updated="2010-12-12T18:30:02.25Z">
<atom:link rel="self"
href="http://identity.api.openstack.org/v1.1/"/>
</version>
<version id="v2.0" status="BETA"
updated="2011-05-27T20:22:02.25Z">
<atom:link rel="self"
href="http://identity.api.openstack.org/v2.0/"/>
</version>
</versions>