Contract changes

Change-Id: Idc44eebb9e3312e8dddb93efc9fecff9a540f138
This commit is contained in:
Ziad Sawalha 2011-08-16 16:31:20 -05:00
parent 4f1f3d422b
commit 6af517348e
29 changed files with 244 additions and 116 deletions

View File

@ -2,17 +2,4 @@
<extensions xmlns="http://docs.openstack.org/common/api/v2.0" <extensions xmlns="http://docs.openstack.org/common/api/v2.0"
xmlns:atom="http://www.w3.org/2005/Atom"> xmlns:atom="http://www.w3.org/2005/Atom">
<extension
name="Rackspace" namespace="http://docs.rackspace.com/identity/api/ext/rpe/v1.0" alias="RS-KV2"
updated="2011-08-14T13:25:27-06:00">
<description>
Rackspace extensions to Keystone v2.0 API
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>
</extensions> </extensions>

View File

@ -317,7 +317,11 @@
<method name="POST" id="authenticate"> <method name="POST" id="authenticate">
<request> <request>
<representation mediaType="application/xml" element="identity:passwordCredentials"/> <representation mediaType="application/xml" element="identity:passwordCredentials">
<param name="passwordCredentials" style="plain" required="true"
type="identity:PasswordCredentialsWithoutUsername"
path="/identity:passwordCredentials"/>
</representation>
<representation mediaType="application/json"/> <representation mediaType="application/json"/>
</request> </request>
<response status="200 203"> <response status="200 203">

View File

@ -12,8 +12,8 @@
"internalURL": "https://compute.north.host/v1/blah-blah", "internalURL": "https://compute.north.host/v1/blah-blah",
"region": "North", "region": "North",
"versionId": "1.0", "versionId": "1.0",
"versionInfo": "uri", "versionInfo": "https://compute.north.host/v1.0/",
"versionList": "uri" "versionList": "https://compute.north.host/"
}, { }, {
"publicURL": "https://compute.north.host/v1.1/blah-blah", "publicURL": "https://compute.north.host/v1.1/blah-blah",
"internalURL": "https://compute.north.host/v1.1/blah-blah", "internalURL": "https://compute.north.host/v1.1/blah-blah",

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,11 +1,14 @@
{ {
"endpointTemplate":{ "endpointTemplate":{
"id":1, "id":1,
"region":"DFW", "region":"North",
"global":true, "global":true,
"serviceName":"service1", "type":"compute",
"publicURL":"https://service-public.com/v1", "publicURL":"https://compute.north.public.com/v1",
"internalURL":"https://service-internal.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 "enabled":true
} }
} }

View File

@ -3,10 +3,15 @@
<endpointTemplate <endpointTemplate
xmlns="http://docs.openstack.org/identity/api/v2.0" xmlns="http://docs.openstack.org/identity/api/v2.0"
id="1" id="1"
region="DFW" region="North"
global="true" global="true"
serviceName="service1" type="compute"
publicURL="https://service-public.com/v1" publicURL="https://service-public.com/v1"
internalURL="https://service-internal.com/v1" internalURL="https://service-internal.com/v1"
enabled="true" enabled="true">
/> <version
ID="1"
Info="https://compute.north.public.com/v1/"
List="https://compute.north.public.com/"
/>
</endpointTemplate>

View File

@ -2,41 +2,56 @@
"endpointsTemplates":[ "endpointsTemplates":[
{ {
"id":1, "id":1,
"region":"DFW", "region":"North",
"global":true, "global":true,
"serviceName":"service1", "type":"compute",
"publicURL":"https://service1.public.com/v1", "publicURL":"https://compute.north.public.com/v1",
"internalURL":"https://service1.internal.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 "enabled":true
}, },
{ {
"id":2, "id":2,
"region":"ORD", "region":"South",
"serviceName":"service2", "serviceName":"compute",
"publicURL":"https://service2.public.com/v1", "publicURL":"https://compute.south.public.com/v1",
"internalURL":"https://service2.internal.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 "enabled":false
}, },
{ {
"id":3, "id":3,
"region":"DFW", "region":"North",
"global":true, "global":true,
"serviceName":"service1", "serviceName":"object-store",
"publicURL":"https://service.public.com/v1.0", "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 "enabled":true
}, },
{ {
"id":4, "id":4,
"region":"ORD", "region":"South",
"serviceName":"service2", "serviceName":"object-store",
"publicURL":"https://service2.public.com/v2", "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 "enabled":true
}, },
{ {
"id":5, "id":5,
"global":true, "global":true,
"serviceName":"service3", "serviceName":"OS-DNS:DNS",
"publicURL":"https://service3.public.com/v3.2", "publicURL":"https://dns.public.com/v3.2",
"versionId": "1.0",
"versionInfo": "https://dns.public.com/v1.0/",
"versionList": "https://dns.public.com/"
"enabled":true "enabled":true
} }
] ]

View File

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

View File

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

View File

@ -3,18 +3,18 @@
<endpoints <endpoints
xmlns="http://docs.openstack.org/identity/api/v2.0"> xmlns="http://docs.openstack.org/identity/api/v2.0">
<endpoint <endpoint
href="https://auth.keystone.com/v2.0/baseURLs/1" href="https://auth.keystone.com/v2.0/endpoints/1"
id="1" /> id="1" />
<endpoint <endpoint
href="https://auth.keystone.com/v2.0/baseURLs/2" href="https://auth.keystone.com/v2.0/endpoints/2"
id="2" /> id="2" />
<endpoint <endpoint
href="https://auth.keystone.com/v2.0/baseURLs/3" href="https://auth.keystone.com/v2.0/endpoints/3"
id="3" /> id="3" />
<endpoint <endpoint
href="https://auth.keystone.com/v2.0/baseURLs/4" href="https://auth.keystone.com/v2.0/endpoints/4"
id="4" /> id="4" />
<endpoint <endpoint
href="https://auth.keystone.com/v2.0/baseURLs/5" href="https://auth.keystone.com/v2.0/endpoints/5"
id="5" /> id="5" />
</endpoints> </endpoints>

View File

@ -13,6 +13,7 @@
<application xmlns="http://wadl.dev.java.net/2009/02" <application xmlns="http://wadl.dev.java.net/2009/02"
xmlns:identity="http://docs.openstack.org/identity/api/v2.0" xmlns:identity="http://docs.openstack.org/identity/api/v2.0"
xmlns:RAX-KEY="http://docs.rackspace.com/identity/api/ext/RAX-KEY/v1.0"
xmlns:capi="http://docs.openstack.org/common/api/v2.0" xmlns:capi="http://docs.openstack.org/common/api/v2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
@ -24,7 +25,7 @@
<grammars> <grammars>
<include href="xsd/api.xsd"/> <include href="xsd/api.xsd"/>
<include href="xsd/api-common.xsd"/> <include href="xsd/api-common.xsd"/>
<include href="xsd/RS-KEY-credentials.xsd"/> <include href="xsd/RAX-KEY-credentials.xsd"/>
</grammars> </grammars>
@ -38,6 +39,11 @@
<resource id="tokens" path="tokens"> <resource id="tokens" path="tokens">
<method href="#authenticate"/> <method href="#authenticate"/>
</resource> </resource>
<resource id="extensions" type="#ExtensionList" path="extensions">
<resource id="extension" path="RAX-KEY">
<method href="#getExtension"/>
</resource>
</resource>
</resource> </resource>
</resources> </resources>
@ -49,7 +55,7 @@
<!-- Token Operations --> <!-- Token Operations -->
<method name="POST" id="authenticate"> <method name="POST" id="authenticate">
<request> <request>
<representation mediaType="application/xml" element="identity:RS-KEY-apikeyCredentials"/> <representation mediaType="application/xml" element="RAX-KEY:apikeyCredentials"/>
<representation mediaType="application/json"/> <representation mediaType="application/json"/>
</request> </request>
<response status="200 203"> <response status="200 203">
@ -63,5 +69,18 @@
&commonFaults; &commonFaults;
&getFaults; &getFaults;
</method> </method>
<method name="GET" id="getExtension">
<doc xml:lang="EN" title="Get Extension Details">
<p xmlns="http://www.w3.org/1999/xhtml">
Get details about the RAX-KEY extension.
</p>
</doc>
<response status="200 203">
<representation mediaType="application/xml" element="capi:extension"/>
<representation mediaType="application/json"/>
</response>
&commonFaults;
&getFaults;
</method>
</application> </application>

View File

@ -12,14 +12,15 @@
]> ]>
<application xmlns="http://wadl.dev.java.net/2009/02" <application xmlns="http://wadl.dev.java.net/2009/02"
xmlns:identity="http://docs.openstack.org/identity/api/v2.0" xmlns:identity="http://docs.openstack.org/identity/api/v2.0"
xmlns:capi="http://docs.openstack.org/common/api/v2.0" xmlns:capi="http://docs.openstack.org/common/api/v2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://docs.openstack.org/identity/api/v2.0 xsd/api.xsd xmlns:html="http://www.w3.org/1999/xhtml"
http://docs.openstack.org/common/api/v1.0 xsd/api-common.xsd xsi:schemaLocation="http://docs.openstack.org/identity/api/v2.0 xsd/api.xsd
http://wadl.dev.java.net/2009/02 http://www.w3.org/Submission/wadl/wadl.xsd http://docs.openstack.org/common/api/v1.0 xsd/api-common.xsd
"> http://wadl.dev.java.net/2009/02 http://www.w3.org/Submission/wadl/wadl.xsd
">
<grammars> <grammars>
<include href="xsd/api.xsd"/> <include href="xsd/api.xsd"/>
@ -121,6 +122,25 @@
<!-- Token Operations --> <!-- Token Operations -->
<method name="POST" id="authenticate"> <method name="POST" id="authenticate">
<doc>
Client authentication is provided via a ReST interface using the POST method,
with v2.0/tokens supplied as the path.
Additionally, a payload of credentials must be included in the body.
See <html:a href="xsd/credentials.xsd">supported credentials</html:a>
Each ReST request against the Keystone system 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.
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.
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.
</doc>
<request> <request>
<representation mediaType="application/xml" element="identity:passwordCredentials"/> <representation mediaType="application/xml" element="identity:passwordCredentials"/>
<representation mediaType="application/json"/> <representation mediaType="application/json"/>

View File

@ -6,21 +6,22 @@
attributeFormDefault="unqualified" attributeFormDefault="unqualified"
xmlns="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:identity="http://docs.openstack.org/identity/api/v2.0" xmlns:identity="http://docs.openstack.org/identity/api/v2.0"
xmlns:RAX-GRP="http://docs.rackspace.com/identity/api/ext/RAX-GRP/v1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
xmlns:xsdxt="http://docs.rackspacecloud.com/xsd-ext/v1.0" xmlns:xsdxt="http://docs.rackspacecloud.com/xsd-ext/v1.0"
xmlns:atom="http://www.w3.org/2005/Atom" xmlns:atom="http://www.w3.org/2005/Atom"
targetNamespace="http://docs.openstack.org/identity/api/v2.0" targetNamespace="http://docs.rackspace.com/identity/api/ext/RAX-GRP/v1.0"
> >
<!--Include schema we are extending --> <!--Include schema we are extending -->
<include schemaLocation="user.xsd"/> <import schemaLocation="user.xsd" namespace="http://docs.openstack.org/identity/api/v2.0"/>
<include schemaLocation="roles.xsd"/> <import schemaLocation="roles.xsd" namespace="http://docs.openstack.org/identity/api/v2.0"/>
<include schemaLocation="token.xsd"/> <import schemaLocation="token.xsd" namespace="http://docs.openstack.org/identity/api/v2.0"/>
<!-- Elements --> <!-- Elements -->
<!-- Complex Types --> <!-- Complex Types -->
<complexType name="RAX-UserForAuthData"> <complexType name="UserForAuthData">
<complexContent> <complexContent>
<extension base="identity:UserForAuthenticateResponse"> <extension base="identity:UserForAuthenticateResponse">
<sequence> <sequence>
@ -32,7 +33,7 @@
<complexType name="Groups"> <complexType name="Groups">
<sequence> <sequence>
<element name="group" type="identity:Group" maxOccurs="100"/> <element name="group" type="RAX-GRP:Group" maxOccurs="100"/>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" /> <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
</sequence> </sequence>
<anyAttribute namespace="##other" processContents="lax"/> <anyAttribute namespace="##other" processContents="lax"/>

View File

@ -6,20 +6,22 @@
attributeFormDefault="unqualified" attributeFormDefault="unqualified"
xmlns="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:identity="http://docs.openstack.org/identity/api/v2.0" xmlns:identity="http://docs.openstack.org/identity/api/v2.0"
xmlns:RAX-KEY="http://docs.rackspace.com/identity/api/ext/RAX-KEY/v1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
xmlns:xsdxt="http://docs.rackspacecloud.com/xsd-ext/v1.0" xmlns:xsdxt="http://docs.rackspacecloud.com/xsd-ext/v1.0"
xmlns:atom="http://www.w3.org/2005/Atom" xmlns:atom="http://www.w3.org/2005/Atom"
targetNamespace="http://docs.openstack.org/identity/api/v2.0" targetNamespace="http://docs.rackspace.com/identity/api/ext/RAX-KEY/v1.0"
> >
<!--Include schema we are extending --> <!--Import schema we are extending -->
<include schemaLocation="credentials.xsd"/> <import namespace="http://docs.openstack.org/identity/api/v2.0"
schemaLocation="credentials.xsd"/>
<!-- Elements --> <!-- Elements -->
<element name="apikeyCredentials" type="identity:RS-KEY-apikeyCredentials"/> <element name="apikeyCredentials" type="RAX-KEY:apikeyCredentials"/>
<!-- Complex Types --> <!-- Complex Types -->
<complexType name="RS-KEY-apikeyCredentials"> <complexType name="apikeyCredentials">
<complexContent> <complexContent>
<extension base="identity:CredentialType"> <extension base="identity:CredentialType">
<attribute name="APIKey" type="xsd:string" use="required" ></attribute> <attribute name="APIKey" type="xsd:string" use="required" ></attribute>

View File

@ -20,7 +20,7 @@
schemaLocation="atom/atom.xsd" /> schemaLocation="atom/atom.xsd" />
<!-- Elements --> <!-- Elements -->
<element name="passwordCredentials" type="identity:PasswordCredentials"/> <element name="passwordCredentials" type="identity:PasswordCredentialsBase"/>
<element name="credentials" type="identity:CredentialList" > <element name="credentials" type="identity:CredentialList" >
<annotation> <annotation>
@ -43,20 +43,34 @@
<anyAttribute namespace="##other" processContents="lax"/> <anyAttribute namespace="##other" processContents="lax"/>
</complexType> </complexType>
<complexType name="PasswordCredentials"> <complexType name="PasswordCredentialsBase">
<complexContent> <complexContent>
<extension base="identity:CredentialType"> <extension base="identity:CredentialType">
<sequence>
<any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded" />
</sequence>
<attribute name="password" type="xsd:string" use="required" />
<attribute name="username" type="xsd:string" use="optional" /> <attribute name="username" type="xsd:string" use="optional" />
<attribute name="password" type="xsd:string" use="required" />
<attribute name="tenantId" type="xsd:string" use="optional" /> <attribute name="tenantId" type="xsd:string" use="optional" />
<anyAttribute namespace="##other" processContents="lax"/>
</extension> </extension>
</complexContent> </complexContent>
</complexType> </complexType>
<complexType name="PasswordCredentialsWithoutUsernameAndTenant">
<complexContent>
<restriction base="identity:PasswordCredentialsBase">
<attribute name="username" type="xsd:string" use="prohibited" />
<attribute name="password" type="xsd:string" use="required" />
<attribute name="tenantId" type="xsd:string" use="prohibited" />
</restriction>
</complexContent>
</complexType>
<complexType name="PasswordCredentialsRequiredUsername">
<complexContent>
<restriction base="identity:PasswordCredentialsBase">
<attribute name="username" type="xsd:string" use="required" />
</restriction>
</complexContent>
</complexType>
<complexType name="CredentialList"> <complexType name="CredentialList">
<sequence> <sequence>
<element name="credential" type="identity:Credential" minOccurs="0" maxOccurs="unbounded"/> <element name="credential" type="identity:Credential" minOccurs="0" maxOccurs="unbounded"/>

View File

@ -46,6 +46,7 @@
<!-- Complex Types --> <!-- Complex Types -->
<complexType name="Service"> <complexType name="Service">
<attribute name="id" type="xsd:string" use="required"/> <attribute name="id" type="xsd:string" use="required"/>
<attribute name="type" type="identity:ExtensibleServiceType" use="required"/>
<attribute name="description" type="xsd:string" use="optional"/> <attribute name="description" type="xsd:string" use="optional"/>
<anyAttribute namespace="##other" processContents="lax"/> <anyAttribute namespace="##other" processContents="lax"/>
</complexType> </complexType>

View File

@ -1,7 +1,7 @@
{ {
"name": "Rackspace API Key Authentication", "name": "Rackspace API Key Authentication",
"namespace": "http://docs.rackspacecloud.com/identity/api/ext/key/v1.0", "namespace": "http://docs.rackspacecloud.com/identity/api/ext/key/v1.0",
"alias": "RS-KEY", "alias": "RAX-KEY",
"updated": "2011-08-14T13:25:27-06:00", "updated": "2011-08-14T13:25:27-06:00",
"description": "Rackspace extensions to Keystone v2.0 API enabling API Key authentication.", "description": "Rackspace extensions to Keystone v2.0 API enabling API Key authentication.",
"links": [{ "links": [{

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<extension xmlns="http://docs.openstack.org/common/api/v2.0" <extension xmlns="http://docs.openstack.org/common/api/v2.0"
xmlns:atom="http://www.w3.org/2005/Atom" xmlns:atom="http://www.w3.org/2005/Atom"
name="Rackspace" namespace="http://docs.rackspace.com/identity/api/ext/rpe/v1.0" alias="RS-KEY" name="Rackspace" namespace="http://docs.rackspace.com/identity/api/ext/RAX-KEY/v1.0" alias="RAX-KEY"
updated="2011-08-14T13:25:27-06:00"> updated="2011-08-14T13:25:27-06:00">
<description> <description>
Rackspace extensions to Keystone v2.0 API Rackspace extensions to Keystone v2.0 API

View File

@ -16,6 +16,7 @@
# under the License. # under the License.
from webob import Response from webob import Response
import os
from keystone import utils from keystone import utils
from keystone.common import template, wsgi from keystone.common import template, wsgi
@ -62,10 +63,14 @@ class StaticFilesController(wsgi.Controller):
elif utils.is_json_response(req): elif utils.is_json_response(req):
mimetype = "application/json" mimetype = "application/json"
if mimetype == "application/xml": basename, extension = os.path.splitext(file)
resp_file = "%s%s%s.xml" % (root, path, file) if extension == None or extension == '':
elif mimetype == "application/json": if mimetype == "application/xml":
resp_file = "%s%s%s.json" % (root, path, file) resp_file = "%s%s%s.xml" % (root, path, file)
elif mimetype == "application/json":
resp_file = "%s%s%s.json" % (root, path, file)
else:
resp_file = root + path + file
else: else:
resp_file = root + path + file resp_file = root + path + file

View File

@ -201,7 +201,7 @@ class AdminApi(wsgi.Router):
controller=static_files_controller, controller=static_files_controller,
action="get_static_file", action="get_static_file",
root="content/common/", path="xslt/", root="content/common/", path="xslt/",
mimetype="application/xslt", mimetype="application/xml",
conditions=dict(method=["GET"])) conditions=dict(method=["GET"]))
mapper.connect("/js/{file:.*}", mapper.connect("/js/{file:.*}",
controller=static_files_controller, controller=static_files_controller,

View File

@ -83,7 +83,7 @@ class ServiceApi(wsgi.Router):
mapper.connect("/xslt/{file:.*}", mapper.connect("/xslt/{file:.*}",
controller=static_files_controller, controller=static_files_controller,
action="get_static_file", path="common/xslt/", action="get_static_file", path="common/xslt/",
mimetype="application/xslt", mimetype="application/xml",
conditions=dict(method=["GET"])) conditions=dict(method=["GET"]))
mapper.connect("/style/{file:.*}", mapper.connect("/style/{file:.*}",
controller=static_files_controller, controller=static_files_controller,

View File

@ -1,4 +1,4 @@
import unittest import unittest2 as unittest
from common import KeystoneTestCase from common import KeystoneTestCase
@ -12,7 +12,7 @@ class TestExtensions(KeystoneTestCase):
self.assertIsNotNone(content['extensions']['values']) self.assertIsNotNone(content['extensions']['values'])
found = False found = False
for value in content['extensions']['values']: for value in content['extensions']['values']:
if value['alias'] == 'RS-KEY': if value['alias'] == 'RAX-KEY':
found = True found = True
break break
self.assertTrue(found) self.assertTrue(found)
@ -21,7 +21,7 @@ class TestExtensions(KeystoneTestCase):
r = self.service_request(path='/extensions.xml') r = self.service_request(path='/extensions.xml')
self.assertTrue('xml' in r.getheader('Content-Type')) self.assertTrue('xml' in r.getheader('Content-Type'))
content = r.xml content = r.xml
extension = content.find("*[@alias='RS-KEY']") extension = content.find("*[@alias='RAX-KEY']")
self.assertIsNotNone(extension) self.assertIsNotNone(extension)

View File

@ -25,7 +25,7 @@ class TestStaticFiles(KeystoneTestCase):
def test_xslt(self): def test_xslt(self):
r = self.service_request(path='/xslt/schema.xslt') r = self.service_request(path='/xslt/schema.xslt')
self.assertTrue('xslt' in r.getheader('Content-Type')) self.assertTrue('xml' in r.getheader('Content-Type'))
def test_js(self): def test_js(self):
r = self.service_request(path='/js/shjs/sh_java.js') r = self.service_request(path='/js/shjs/sh_java.js')
@ -63,7 +63,7 @@ class TestAdminStaticFiles(KeystoneTestCase):
def test_xslt(self): def test_xslt(self):
r = self.admin_request(path='/xslt/schema.xslt') r = self.admin_request(path='/xslt/schema.xslt')
self.assertTrue('xslt' in r.getheader('Content-Type')) self.assertTrue('xml' in r.getheader('Content-Type'))
def test_js(self): def test_js(self):
r = self.admin_request(path='/js/shjs/sh_java.js') r = self.admin_request(path='/js/shjs/sh_java.js')