diff --git a/providers/hpcloud-compute/pom.xml b/providers/hpcloud-compute/pom.xml
index 98bd011f18..4237ff38b9 100644
--- a/providers/hpcloud-compute/pom.xml
+++ b/providers/hpcloud-compute/pom.xml
@@ -76,6 +76,13 @@
test-jar
test
+
+ org.jclouds.api
+ openstack-keystone
+ ${project.version}
+ test-jar
+ test
+
org.jclouds.driver
jclouds-slf4j
diff --git a/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadata.java b/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadata.java
index 796269d83f..c7a547043e 100644
--- a/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadata.java
+++ b/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadata.java
@@ -31,6 +31,7 @@ import org.jclouds.hpcloud.compute.config.HPCloudComputeServiceContextModule;
import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule;
import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule;
import org.jclouds.openstack.nova.v2_0.NovaApiMetadata;
+import org.jclouds.openstack.nova.v2_0.config.NovaParserModule;
import org.jclouds.openstack.nova.v2_0.config.NovaRestClientModule;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.providers.internal.BaseProviderMetadata;
@@ -88,6 +89,7 @@ public class HPCloudComputeProviderMetadata extends BaseProviderMetadata {
.defaultModules(ImmutableSet.>builder()
.add(KeystoneAuthenticationModule.class)
.add(ZoneModule.class)
+ .add(NovaParserModule.class)
.add(NovaRestClientModule.class)
.add(HPCloudComputeServiceContextModule.class).build())
.build())
diff --git a/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadataExpectTest.java b/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadataExpectTest.java
new file mode 100644
index 0000000000..3391e0d5f6
--- /dev/null
+++ b/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadataExpectTest.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.hpcloud.compute;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * This test ensures that the wiring in {@link HPCloudComputeProviderMetadata} is correct.
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "HPCloudComputeProviderMetadataExpectTest")
+public class HPCloudComputeProviderMetadataExpectTest extends BaseNovaApiExpectTest {
+
+ public HPCloudComputeProviderMetadataExpectTest() {
+ this.provider = "hpcloud-compute";
+ this.identity = "tenant:username";
+ this.credential = "password";
+ }
+
+ public void testCanGetConfiguredZones() {
+
+ HttpRequest authenticate = HttpRequest.builder().method("POST")
+ .endpoint("https://region-a.geo-1.identity.hpcloudsvc.com:35357/v2.0/tokens")
+ .addHeader("Accept", "application/json")
+ .payload(payloadFromStringWithContentType(
+ "{\"auth\":{\"passwordCredentials\":{\"username\":\"username\",\"password\":\"password\"},\"tenantName\":\"tenant\"}}"
+ , "application/json")).build();
+
+
+ HttpResponse authenticationResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResourceWithContentType("/access_hpcloud.json", "application/json")).build();
+
+ NovaApi whenNovaRegionExists = requestSendsResponse(authenticate, authenticationResponse);
+
+ assertEquals(whenNovaRegionExists.getConfiguredZones(), ImmutableSet.of("az-3.region-a.geo-1", "az-2.region-a.geo-1", "az-1.region-a.geo-1"));
+
+ }
+
+}
diff --git a/providers/hpcloud-compute/src/test/resources/access_hpcloud.json b/providers/hpcloud-compute/src/test/resources/access_hpcloud.json
new file mode 100644
index 0000000000..d444d93a31
--- /dev/null
+++ b/providers/hpcloud-compute/src/test/resources/access_hpcloud.json
@@ -0,0 +1,225 @@
+{"access": {
+ "token": {
+ "expires": "2012-09-30T12:56:12.481Z",
+ "id": "HPAuth_e2b86593f73366704ed4f9e4441a2467f1a67568d5363e561a72f36a96da3b4a",
+ "tenant": {
+ "id": "37936628937291",
+ "name": "adrian@jclouds.org"
+ }
+ },
+ "user": {
+ "id": "54297837463082",
+ "name": "adrian@jclouds.org",
+ "roles": [
+ {
+ "id": "00000000004016",
+ "serviceId": "120",
+ "name": "netadmin",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004025",
+ "serviceId": "120",
+ "name": "sysadmin",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004014",
+ "serviceId": "150",
+ "name": "cdn-admin",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004013",
+ "serviceId": "130",
+ "name": "block-admin",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004022",
+ "serviceId": "110",
+ "name": "Admin",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004016",
+ "serviceId": "120",
+ "name": "netadmin",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004024",
+ "serviceId": "140",
+ "name": "user",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004013",
+ "serviceId": "130",
+ "name": "block-admin",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004003",
+ "serviceId": "100",
+ "name": "domainadmin"
+ },
+ {
+ "id": "00000000004025",
+ "serviceId": "120",
+ "name": "sysadmin",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004024",
+ "serviceId": "140",
+ "name": "user",
+ "tenantId": "37936628937291"
+ },
+ {
+ "id": "00000000004004",
+ "serviceId": "100",
+ "name": "domainuser"
+ }
+ ]
+ },
+ "serviceCatalog": [
+ {
+ "name": "CDN",
+ "type": "hpext:cdn",
+ "endpoints": [{
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/region-a.geo-1.cdnmgmt.hpcloudsvc.com\/v1.0\/AUTH_651c939f-04f0-4fbf-bd50-27f114ccaa15",
+ "region": "region-a.geo-1",
+ "versionId": "1.0",
+ "versionInfo": "https:\/\/region-a.geo-1.cdnmgmt.hpcloudsvc.com\/v1.0\/",
+ "versionList": "https:\/\/region-a.geo-1.cdnmgmt.hpcloudsvc.com\/"
+ }]
+ },
+ {
+ "name": "Object Storage",
+ "type": "object-store",
+ "endpoints": [{
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/region-a.geo-1.objects.hpcloudsvc.com\/v1.0\/AUTH_651c939f-04f0-4fbf-bd50-27f114ccaa15",
+ "region": "region-a.geo-1",
+ "versionId": "1.0",
+ "versionInfo": "https:\/\/region-a.geo-1.objects.hpcloudsvc.com\/v1.0\/",
+ "versionList": "https:\/\/region-a.geo-1.objects.hpcloudsvc.com"
+ }]
+ },
+ {
+ "name": "Identity",
+ "type": "identity",
+ "endpoints": [
+ {
+ "publicURL": "https:\/\/region-b.geo-1.identity.hpcloudsvc.com:35357\/v2.0\/",
+ "region": "region-b.geo-1",
+ "versionId": "2.0",
+ "versionInfo": "https:\/\/region-b.geo-1.identity.hpcloudsvc.com:35357\/v2.0\/",
+ "versionList": "https:\/\/region-b.geo-1.identity.hpcloudsvc.com:35357"
+ },
+ {
+ "publicURL": "https:\/\/region-a.geo-1.identity.hpcloudsvc.com:35357\/v2.0\/",
+ "region": "region-a.geo-1",
+ "versionId": "2.0",
+ "versionInfo": "https:\/\/region-a.geo-1.identity.hpcloudsvc.com:35357\/v2.0\/",
+ "versionList": "https:\/\/region-a.geo-1.identity.hpcloudsvc.com:35357"
+ }
+ ]
+ },
+ {
+ "name": "Image Management",
+ "type": "image",
+ "endpoints": [
+ {
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/glance2.uswest.hpcloud.net:9292\/v1.0",
+ "region": "az-2.region-a.geo-1",
+ "versionId": "1.0",
+ "versionInfo": "https:\/\/glance2.uswest.hpcloud.net:9292\/v1.0\/",
+ "versionList": "https:\/\/glance2.uswest.hpcloud.net:9292"
+ },
+ {
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/glance3.uswest.hpcloud.net:9292\/v1.0",
+ "region": "az-3.region-a.geo-1",
+ "versionId": "1.0",
+ "versionInfo": "https:\/\/glance3.uswest.hpcloud.net:9292\/v1.0\/",
+ "versionList": "https:\/\/glance3.uswest.hpcloud.net:9292"
+ },
+ {
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/glance1.uswest.hpcloud.net:9292\/v1.0",
+ "region": "az-1.region-a.geo-1",
+ "versionId": "1.0",
+ "versionInfo": "https:\/\/glance1.uswest.hpcloud.net:9292\/v1.0\/",
+ "versionList": "https:\/\/glance1.uswest.hpcloud.net:9292"
+ }
+ ]
+ },
+ {
+ "name": "Block Storage",
+ "type": "volume",
+ "endpoints": [
+ {
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/az-1.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/37936628937291",
+ "region": "az-1.region-a.geo-1",
+ "versionId": "1.1",
+ "versionInfo": "https:\/\/az-1.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/",
+ "versionList": "https:\/\/az-1.region-a.geo-1.compute.hpcloudsvc.com"
+ },
+ {
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/az-3.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/37936628937291",
+ "region": "az-3.region-a.geo-1",
+ "versionId": "1.1",
+ "versionInfo": "https:\/\/az-3.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/",
+ "versionList": "https:\/\/az-3.region-a.geo-1.compute.hpcloudsvc.com"
+ },
+ {
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/az-2.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/37936628937291",
+ "region": "az-2.region-a.geo-1",
+ "versionId": "1.1",
+ "versionInfo": "https:\/\/az-2.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/",
+ "versionList": "https:\/\/az-2.region-a.geo-1.compute.hpcloudsvc.com"
+ }
+ ]
+ },
+ {
+ "name": "Compute",
+ "type": "compute",
+ "endpoints": [
+ {
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/az-3.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/37936628937291",
+ "publicURL2": "https:\/\/az-3.region-a.geo-1.ec2-compute.hpcloudsvc.com\/services\/Cloud",
+ "region": "az-3.region-a.geo-1",
+ "versionId": "1.1",
+ "versionInfo": "https:\/\/az-3.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/",
+ "versionList": "https:\/\/az-3.region-a.geo-1.compute.hpcloudsvc.com"
+ },
+ {
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/az-2.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/37936628937291",
+ "publicURL2": "https:\/\/az-2.region-a.geo-1.ec2-compute.hpcloudsvc.com\/services\/Cloud",
+ "region": "az-2.region-a.geo-1",
+ "versionId": "1.1",
+ "versionInfo": "https:\/\/az-2.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/",
+ "versionList": "https:\/\/az-2.region-a.geo-1.compute.hpcloudsvc.com"
+ },
+ {
+ "tenantId": "37936628937291",
+ "publicURL": "https:\/\/az-1.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/37936628937291",
+ "publicURL2": "https:\/\/az-1.region-a.geo-1.ec2-compute.hpcloudsvc.com\/services\/Cloud",
+ "region": "az-1.region-a.geo-1",
+ "versionId": "1.1",
+ "versionInfo": "https:\/\/az-1.region-a.geo-1.compute.hpcloudsvc.com\/v1.1\/",
+ "versionList": "https:\/\/az-1.region-a.geo-1.compute.hpcloudsvc.com"
+ }
+ ]
+ }
+ ]
+}}
diff --git a/providers/rackspace-cloudservers-uk/pom.xml b/providers/rackspace-cloudservers-uk/pom.xml
index f3b75d7b70..41293785e8 100644
--- a/providers/rackspace-cloudservers-uk/pom.xml
+++ b/providers/rackspace-cloudservers-uk/pom.xml
@@ -88,6 +88,13 @@
test-jar
test
+
+ org.jclouds.api
+ openstack-keystone
+ ${project.version}
+ test-jar
+ test
+
org.jclouds.driver
jclouds-slf4j
diff --git a/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadata.java b/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadata.java
index 59696f916b..d84effa2b3 100644
--- a/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadata.java
+++ b/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadata.java
@@ -28,6 +28,7 @@ import java.util.Properties;
import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule;
import org.jclouds.openstack.nova.v2_0.NovaApiMetadata;
+import org.jclouds.openstack.nova.v2_0.config.NovaParserModule;
import org.jclouds.openstack.nova.v2_0.config.NovaRestClientModule;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.providers.internal.BaseProviderMetadata;
@@ -88,6 +89,7 @@ public class CloudServersUKProviderMetadata extends BaseProviderMetadata {
.defaultModules(ImmutableSet.>builder()
.add(CloudIdentityAuthenticationModule.class)
.add(ZoneModule.class)
+ .add(NovaParserModule.class)
.add(NovaRestClientModule.class)
.add(CloudServersUKComputeServiceContextModule.class).build())
.build())
diff --git a/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadataExpectTest.java b/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadataExpectTest.java
new file mode 100644
index 0000000000..ef6abe25f2
--- /dev/null
+++ b/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadataExpectTest.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not uke this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.rackspace.cloudservers.uk;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * This test ensures that the wiring in {@link CloudServersUKProviderMetadata} is correct.
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "CloudServersUKProviderMetadataExpectTest")
+public class CloudServersUKProviderMetadataExpectTest extends BaseNovaApiExpectTest {
+
+ public CloudServersUKProviderMetadataExpectTest() {
+ this.provider = "rackspace-cloudservers-uk";
+ this.identity = "myUsername";
+ this.credential = "myApiKey";
+ }
+
+ public void testCanGetConfiguredZones() {
+
+ HttpRequest authenticate = HttpRequest.builder().method("POST")
+ .endpoint("https://lon.identity.api.rackspacecloud.com/v2.0/tokens")
+ .addHeader("Accept", "application/json")
+ .payload(payloadFromStringWithContentType(
+ "{\"auth\":{\"RAX-KSKEY:apiKeyCredentials\":{\"username\":\"myUsername\",\"apiKey\":\"myApiKey\"}}}"
+ , "application/json")).build();
+
+
+ HttpResponse authenticationResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResourceWithContentType("/access_rax_uk.json", "application/json")).build();
+
+ NovaApi whenNovaRegionExists = requestSendsResponse(authenticate, authenticationResponse);
+
+ assertEquals(whenNovaRegionExists.getConfiguredZones(), ImmutableSet.of("LON"));
+
+ }
+
+}
diff --git a/providers/rackspace-cloudservers-uk/src/test/resources/access_rax_uk.json b/providers/rackspace-cloudservers-uk/src/test/resources/access_rax_uk.json
new file mode 100644
index 0000000000..b8bd64494e
--- /dev/null
+++ b/providers/rackspace-cloudservers-uk/src/test/resources/access_rax_uk.json
@@ -0,0 +1 @@
+{"access":{"token":{"id":"bdd18214-e266-4ad3-b985-d9bfb22c8da8","expires":"2012-10-01T02:11:16.000+01:00","tenant":{"id":"10001786","name":"10001786"}},"serviceCatalog":[{"endpoints":[{"region":"LON","tenantId":"MossoCloudFS_83a9d536-2e25-4166-bd3b-a503a934f953","publicURL":"https:\/\/storage101.lon3.clouddrive.com\/v1\/MossoCloudFS_83a9d536-2e25-4166-bd3b-a503a934f953","internalURL":"https:\/\/snet-storage101.lon3.clouddrive.com\/v1\/MossoCloudFS_83a9d536-2e25-4166-bd3b-a503a934f953"}],"name":"cloudFiles","type":"object-store"},{"endpoints":[{"region":"LON","tenantId":"MossoCloudFS_83a9d536-2e25-4166-bd3b-a503a934f953","publicURL":"https:\/\/cdn3.clouddrive.com\/v1\/MossoCloudFS_83a9d536-2e25-4166-bd3b-a503a934f953"}],"name":"cloudFilesCDN","type":"rax:object-cdn"},{"endpoints":[{"tenantId":"10001786","publicURL":"https:\/\/lon.servers.api.rackspacecloud.com\/v1.0\/10001786","versionInfo":"https:\/\/lon.servers.api.rackspacecloud.com\/v1.0","versionList":"https:\/\/lon.servers.api.rackspacecloud.com\/","versionId":"1.0"}],"name":"cloudServers","type":"compute"},{"endpoints":[{"tenantId":"10001786","publicURL":"https:\/\/lon.dns.api.rackspacecloud.com\/v1.0\/10001786"}],"name":"cloudDNS","type":"rax:dns"},{"endpoints":[{"region":"LON","tenantId":"10001786","publicURL":"https:\/\/lon.loadbalancers.api.rackspacecloud.com\/v1.0\/10001786"}],"name":"cloudLoadBalancers","type":"rax:load-balancer"},{"endpoints":[{"tenantId":"10001786","publicURL":"https:\/\/monitoring.api.rackspacecloud.com\/v1.0\/10001786"}],"name":"cloudMonitoring","type":"rax:monitor"},{"endpoints":[{"region":"LON","tenantId":"10001786","publicURL":"https:\/\/lon.databases.api.rackspacecloud.com\/v1.0\/10001786"}],"name":"cloudDatabases","type":"rax:database"},{"endpoints":[{"region":"LON","tenantId":"10001786","publicURL":"https:\/\/lon.servers.api.rackspacecloud.com\/v2\/10001786","versionInfo":"https:\/\/lon.servers.api.rackspacecloud.com\/v2","versionList":"https:\/\/lon.servers.api.rackspacecloud.com\/","versionId":"2"}],"name":"cloudServersOpenStack","type":"compute"}],"user":{"id":"378","roles":[{"id":"3","description":"User Admin Role.","name":"identity:user-admin"}],"name":"jclouds","RAX-AUTH:defaultRegion":""}}}
\ No newline at end of file
diff --git a/providers/rackspace-cloudservers-us/pom.xml b/providers/rackspace-cloudservers-us/pom.xml
index 33875b9e5e..e312a7a33e 100644
--- a/providers/rackspace-cloudservers-us/pom.xml
+++ b/providers/rackspace-cloudservers-us/pom.xml
@@ -88,6 +88,13 @@
test-jar
test
+
+ org.jclouds.api
+ openstack-keystone
+ ${project.version}
+ test-jar
+ test
+
org.jclouds.driver
jclouds-slf4j
diff --git a/providers/rackspace-cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/us/CloudServersUSProviderMetadata.java b/providers/rackspace-cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/us/CloudServersUSProviderMetadata.java
index 2758535e3b..845b3d2650 100644
--- a/providers/rackspace-cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/us/CloudServersUSProviderMetadata.java
+++ b/providers/rackspace-cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/us/CloudServersUSProviderMetadata.java
@@ -28,6 +28,7 @@ import java.util.Properties;
import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule;
import org.jclouds.openstack.nova.v2_0.NovaApiMetadata;
+import org.jclouds.openstack.nova.v2_0.config.NovaParserModule;
import org.jclouds.openstack.nova.v2_0.config.NovaRestClientModule;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.providers.internal.BaseProviderMetadata;
@@ -89,6 +90,7 @@ public class CloudServersUSProviderMetadata extends BaseProviderMetadata {
.defaultModules(ImmutableSet.>builder()
.add(CloudIdentityAuthenticationModule.class)
.add(ZoneModule.class)
+ .add(NovaParserModule.class)
.add(NovaRestClientModule.class)
.add(CloudServersUSComputeServiceContextModule.class).build())
.build())
diff --git a/providers/rackspace-cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/us/CloudServersUSProviderMetadataExpectTest.java b/providers/rackspace-cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/us/CloudServersUSProviderMetadataExpectTest.java
new file mode 100644
index 0000000000..e3d5df400f
--- /dev/null
+++ b/providers/rackspace-cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/us/CloudServersUSProviderMetadataExpectTest.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.rackspace.cloudservers.us;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * This test ensures that the wiring in {@link CloudServersUSProviderMetadata} is correct.
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "CloudServersUSProviderMetadataExpectTest")
+public class CloudServersUSProviderMetadataExpectTest extends BaseNovaApiExpectTest {
+
+ public CloudServersUSProviderMetadataExpectTest() {
+ this.provider = "rackspace-cloudservers-us";
+ this.identity = "myUsername";
+ this.credential = "myApiKey";
+ }
+
+ public void testCanGetConfiguredZones() {
+
+ HttpRequest authenticate = HttpRequest.builder().method("POST")
+ .endpoint("https://identity.api.rackspacecloud.com/v2.0/tokens")
+ .addHeader("Accept", "application/json")
+ .payload(payloadFromStringWithContentType(
+ "{\"auth\":{\"RAX-KSKEY:apiKeyCredentials\":{\"username\":\"myUsername\",\"apiKey\":\"myApiKey\"}}}"
+ , "application/json")).build();
+
+
+ HttpResponse authenticationResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResourceWithContentType("/access_rax_us.json", "application/json")).build();
+
+ NovaApi whenNovaRegionExists = requestSendsResponse(authenticate, authenticationResponse);
+
+ assertEquals(whenNovaRegionExists.getConfiguredZones(), ImmutableSet.of("ORD", "DFW"));
+
+ }
+
+}
diff --git a/providers/rackspace-cloudservers-us/src/test/resources/access_rax_us.json b/providers/rackspace-cloudservers-us/src/test/resources/access_rax_us.json
new file mode 100644
index 0000000000..a8399465c6
--- /dev/null
+++ b/providers/rackspace-cloudservers-us/src/test/resources/access_rax_us.json
@@ -0,0 +1 @@
+{"access":{"token":{"id":"myToken","expires":"2012-09-30T17:15:32.000-05:00","tenant":{"id":"717071","name":"717071"}},"serviceCatalog":[{"endpoints":[{"tenantId":"717071","publicURL":"https:\/\/dns.api.rackspacecloud.com\/v1.0\/717071"}],"name":"cloudDNS","type":"rax:dns"},{"endpoints":[{"tenantId":"717071","publicURL":"https:\/\/monitoring.api.rackspacecloud.com\/v1.0\/717071"}],"name":"cloudMonitoring","type":"rax:monitor"},{"endpoints":[{"region":"DFW","tenantId":"717071","publicURL":"https:\/\/dfw.servers.api.rackspacecloud.com\/v2\/717071","versionInfo":"https:\/\/dfw.servers.api.rackspacecloud.com\/v2","versionList":"https:\/\/dfw.servers.api.rackspacecloud.com\/","versionId":"2"},{"region":"ORD","tenantId":"717071","publicURL":"https:\/\/ord.servers.api.rackspacecloud.com\/v2\/717071","versionInfo":"https:\/\/ord.servers.api.rackspacecloud.com\/v2","versionList":"https:\/\/ord.servers.api.rackspacecloud.com\/","versionId":"2"}],"name":"cloudServersOpenStack","type":"compute"},{"endpoints":[{"region":"ORD","tenantId":"717071","publicURL":"https:\/\/ord.loadbalancers.api.rackspacecloud.com\/v1.0\/717071"},{"region":"DFW","tenantId":"717071","publicURL":"https:\/\/dfw.loadbalancers.api.rackspacecloud.com\/v1.0\/717071"}],"name":"cloudLoadBalancers","type":"rax:load-balancer"},{"endpoints":[{"region":"DFW","tenantId":"717071","publicURL":"https:\/\/dfw.databases.api.rackspacecloud.com\/v1.0\/717071"},{"region":"ORD","tenantId":"717071","publicURL":"https:\/\/ord.databases.api.rackspacecloud.com\/v1.0\/717071"}],"name":"cloudDatabases","type":"rax:database"},{"endpoints":[{"region":"DFW","tenantId":"MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9","publicURL":"https:\/\/storage101.dfw1.clouddrive.com\/v1\/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9","internalURL":"https:\/\/snet-storage101.dfw1.clouddrive.com\/v1\/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9"},{"region":"ORD","tenantId":"MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9","publicURL":"https:\/\/storage101.ord1.clouddrive.com\/v1\/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9","internalURL":"https:\/\/snet-storage101.ord1.clouddrive.com\/v1\/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9"}],"name":"cloudFiles","type":"object-store"},{"endpoints":[{"region":"DFW","tenantId":"MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9","publicURL":"https:\/\/cdn1.clouddrive.com\/v1\/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9"},{"region":"ORD","tenantId":"MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9","publicURL":"https:\/\/cdn2.clouddrive.com\/v1\/MossoCloudFS_5bcf396e-39dd-45ff-93a1-712b9aba90a9"}],"name":"cloudFilesCDN","type":"rax:object-cdn"},{"endpoints":[{"tenantId":"717071","publicURL":"https:\/\/servers.api.rackspacecloud.com\/v1.0\/717071","versionInfo":"https:\/\/servers.api.rackspacecloud.com\/v1.0","versionList":"https:\/\/servers.api.rackspacecloud.com\/","versionId":"1.0"}],"name":"cloudServers","type":"compute"},{"endpoints":[{"region":"DFW","tenantId":"717071","publicURL":"https:\/\/dfw.blockstorage.api.rackspacecloud.com\/v1\/717071"}],"name":"cloudBlockStorage","type":"volume"}],"user":{"id":"224085","roles":[{"id":"3","description":"User Admin Role.","name":"identity:user-admin"}],"name":"myUsername","RAX-AUTH:defaultRegion":"DFW"}}}
\ No newline at end of file
diff --git a/providers/trystack-nova/pom.xml b/providers/trystack-nova/pom.xml
index 8d01cdbb27..27206c4945 100644
--- a/providers/trystack-nova/pom.xml
+++ b/providers/trystack-nova/pom.xml
@@ -76,6 +76,13 @@
test-jar
test
+
+ org.jclouds.api
+ openstack-keystone
+ ${project.version}
+ test-jar
+ test
+
org.jclouds.driver
jclouds-slf4j
diff --git a/providers/trystack-nova/src/main/java/org/jclouds/trystack/nova/TryStackNovaProviderMetadata.java b/providers/trystack-nova/src/main/java/org/jclouds/trystack/nova/TryStackNovaProviderMetadata.java
index fa58662f01..206f1d2697 100644
--- a/providers/trystack-nova/src/main/java/org/jclouds/trystack/nova/TryStackNovaProviderMetadata.java
+++ b/providers/trystack-nova/src/main/java/org/jclouds/trystack/nova/TryStackNovaProviderMetadata.java
@@ -24,7 +24,10 @@ import static org.jclouds.openstack.nova.v2_0.config.NovaProperties.AUTO_GENERAT
import java.net.URI;
import java.util.Properties;
+import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule;
+import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule;
import org.jclouds.openstack.nova.v2_0.NovaApiMetadata;
+import org.jclouds.openstack.nova.v2_0.config.NovaParserModule;
import org.jclouds.openstack.nova.v2_0.config.NovaRestClientModule;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.providers.internal.BaseProviderMetadata;
@@ -74,7 +77,12 @@ public class TryStackNovaProviderMetadata extends BaseProviderMetadata {
.name("TryStack.org (Nova)")
.apiMetadata(
new NovaApiMetadata().toBuilder()
- .defaultModules(ImmutableSet.>of(NovaRestClientModule.class, TryStackNovaServiceContextModule.class))
+ .defaultModules(ImmutableSet.>builder()
+ .add(KeystoneAuthenticationModule.class)
+ .add(ZoneModule.class)
+ .add(NovaParserModule.class)
+ .add(NovaRestClientModule.class)
+ .add(TryStackNovaServiceContextModule.class).build())
.build())
.homepage(URI.create("https://trystack.org"))
.console(URI.create("https://trystack.org/dash"))
diff --git a/providers/trystack-nova/src/test/java/org/jclouds/trystack/nova/TryStackNovaProviderMetadataExpectTest.java b/providers/trystack-nova/src/test/java/org/jclouds/trystack/nova/TryStackNovaProviderMetadataExpectTest.java
new file mode 100644
index 0000000000..83a356b470
--- /dev/null
+++ b/providers/trystack-nova/src/test/java/org/jclouds/trystack/nova/TryStackNovaProviderMetadataExpectTest.java
@@ -0,0 +1,64 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.trystack.nova;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiExpectTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * This test ensures that the wiring in {@link TryStackNovaProviderMetadata} is correct.
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "TryStackNovaProviderMetadataExpectTest")
+public class TryStackNovaProviderMetadataExpectTest extends BaseNovaApiExpectTest {
+
+ public TryStackNovaProviderMetadataExpectTest() {
+ this.provider = "trystack-nova";
+ this.identity = "demo:demo";
+ this.credential = "password";
+ }
+
+ public void testCanGetConfiguredZones() {
+
+ HttpRequest authenticate = HttpRequest.builder().method("POST")
+ .endpoint("https://nova-api.trystack.org:5443/v2.0/tokens")
+ .addHeader("Accept", "application/json")
+ .payload(payloadFromStringWithContentType(
+ "{\"auth\":{\"passwordCredentials\":{\"username\":\"demo\",\"password\":\"password\"},\"tenantName\":\"demo\"}}"
+ , "application/json")).build();
+
+
+ HttpResponse authenticationResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResourceWithContentType("/access_trystack.json", "application/json")).build();
+
+ NovaApi whenNovaRegionExists = requestSendsResponse(authenticate, authenticationResponse);
+
+ assertEquals(whenNovaRegionExists.getConfiguredZones(), ImmutableSet.of("RegionOne"));
+
+ }
+
+}
diff --git a/providers/trystack-nova/src/test/resources/access_trystack.json b/providers/trystack-nova/src/test/resources/access_trystack.json
new file mode 100644
index 0000000000..27844f2fd8
--- /dev/null
+++ b/providers/trystack-nova/src/test/resources/access_trystack.json
@@ -0,0 +1,49 @@
+{
+ "access": {
+ "token": {
+ "expires": "2012-03-23T21:44:09",
+ "id": "Auth_4f173437e4b013bee56d1007",
+ "tenant": {
+ "id": "3456",
+ "name": "508151008"
+ }
+ },
+ "serviceCatalog": [{
+ "endpoints": [{
+ "adminURL": "https://nova-api.trystack.org:9774/v1.1/3456",
+ "region": "RegionOne",
+ "internalURL": "https://nova-api.trystack.org:9774/v1.1/3456",
+ "publicURL": "https://nova-api.trystack.org:9774/v1.1/3456"
+ }],
+ "type": "compute",
+ "name": "nova"
+ }, {
+ "endpoints": [{
+ "adminURL": "https://GLANCE_API_IS_NOT_DISCLOSED/v1.1/3456",
+ "region": "RegionOne",
+ "internalURL": "https://GLANCE_API_IS_NOT_DISCLOSED/v1.1/3456",
+ "publicURL": "https://GLANCE_API_IS_NOT_DISCLOSED/v1.1/3456"
+ }],
+ "type": "image",
+ "name": "glance"
+ }, {
+ "endpoints": [{
+ "adminURL": "https://nova-api.trystack.org:5443/v2.0",
+ "region": "RegionOne",
+ "internalURL": "https://keystone.thefreecloud.org:5000/v2.0",
+ "publicURL": "https://keystone.thefreecloud.org:5000/v2.0"
+ }],
+ "type": "identity",
+ "name": "keystone"
+ }],
+ "user": {
+ "id": "43",
+ "roles": [{
+ "tenantId": "3456",
+ "id": "2",
+ "name": "Member"
+ }],
+ "name": "508151008"
+ }
+ }
+}
\ No newline at end of file