From 5cb1f2e4267c3547209898cd199e2db80e92c613 Mon Sep 17 00:00:00 2001 From: Everett Toews Date: Thu, 8 Nov 2012 16:08:00 -0600 Subject: [PATCH] Rackspace Cloud Block Storage providers for the OpenStack Cinder API. --- .../VolumeAndSnapshotApiLiveTest.java | 6 +- labs/pom.xml | 6 +- labs/rackspace-cloudblockstorage-uk/pom.xml | 142 +++++++++++++++ .../CloudBlockStorageUKProviderMetadata.java | 111 ++++++++++++ .../org.jclouds.providers.ProviderMetadata | 1 + ...ckStorageUKProviderMetadataExpectTest.java | 67 +++++++ .../uk/CloudBlockStorageUKProviderTest.java | 35 ++++ ...StorageUKVolumeAndSnapshotApiLiveTest.java | 32 ++++ ...udBlockStorageUKVolumeTypeApiLiveTest.java | 32 ++++ .../src/test/resources/access_rax_uk.json | 129 ++++++++++++++ labs/rackspace-cloudblockstorage-us/pom.xml | 142 +++++++++++++++ .../CloudBlockStorageUSProviderMetadata.java | 112 ++++++++++++ .../org.jclouds.providers.ProviderMetadata | 1 + ...ckStorageUSProviderMetadataExpectTest.java | 66 +++++++ .../us/CloudBlockStorageUSProviderTest.java | 34 ++++ ...StorageUSVolumeAndSnapshotApiLiveTest.java | 32 ++++ ...udBlockStorageUSVolumeTypeApiLiveTest.java | 32 ++++ .../src/test/resources/access_rax_us.json | 163 ++++++++++++++++++ 18 files changed, 1138 insertions(+), 5 deletions(-) create mode 100644 labs/rackspace-cloudblockstorage-uk/pom.xml create mode 100644 labs/rackspace-cloudblockstorage-uk/src/main/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderMetadata.java create mode 100644 labs/rackspace-cloudblockstorage-uk/src/main/resources/META-INF/services/org.jclouds.providers.ProviderMetadata create mode 100644 labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderMetadataExpectTest.java create mode 100644 labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderTest.java create mode 100644 labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/features/CloudBlockStorageUKVolumeAndSnapshotApiLiveTest.java create mode 100644 labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/features/CloudBlockStorageUKVolumeTypeApiLiveTest.java create mode 100644 labs/rackspace-cloudblockstorage-uk/src/test/resources/access_rax_uk.json create mode 100644 labs/rackspace-cloudblockstorage-us/pom.xml create mode 100644 labs/rackspace-cloudblockstorage-us/src/main/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderMetadata.java create mode 100644 labs/rackspace-cloudblockstorage-us/src/main/resources/META-INF/services/org.jclouds.providers.ProviderMetadata create mode 100644 labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderMetadataExpectTest.java create mode 100644 labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderTest.java create mode 100644 labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/features/CloudBlockStorageUSVolumeAndSnapshotApiLiveTest.java create mode 100644 labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/features/CloudBlockStorageUSVolumeTypeApiLiveTest.java create mode 100644 labs/rackspace-cloudblockstorage-us/src/test/resources/access_rax_us.json diff --git a/labs/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java b/labs/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java index c203a87211..9db5c04bce 100644 --- a/labs/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java +++ b/labs/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java @@ -40,7 +40,7 @@ import com.google.common.collect.Iterables; /** * Tests behavior of VolumeApi - * + * * @author Everett Toews */ @Test(groups = "live", testName = "VolumeApiLiveTest", singleThreaded = true) @@ -74,7 +74,7 @@ public class VolumeAndSnapshotApiLiveTest extends BaseCinderApiLiveTest { public boolean apply(SnapshotApi snapshotApi) { return snapshotApi.get(testSnapshot.getId()) == null; } - }, 30 * 1000L).apply(snapshotApi)); + }, 300 * 1000L).apply(snapshotApi)); } if (testVolume != null) { @@ -84,7 +84,7 @@ public class VolumeAndSnapshotApiLiveTest extends BaseCinderApiLiveTest { public boolean apply(VolumeApi volumeApi) { return volumeApi.get(testVolume.getId()) == null; } - }, 30 * 1000L).apply(volumeApi)); + }, 300 * 1000L).apply(volumeApi)); } super.tearDownContext(); diff --git a/labs/pom.xml b/labs/pom.xml index 5140fc4c7f..d5759bace4 100644 --- a/labs/pom.xml +++ b/labs/pom.xml @@ -43,10 +43,8 @@ openstack-swift jenkins cdmi - openstack-glance joyent-cloudapi joyentcloud - openstack-quantum greenqloud-compute greenqloud-storage iam @@ -62,6 +60,10 @@ fgcp-de abiquo oauth + openstack-quantum + openstack-glance openstack-cinder + rackspace-cloudblockstorage-us + rackspace-cloudblockstorage-uk diff --git a/labs/rackspace-cloudblockstorage-uk/pom.xml b/labs/rackspace-cloudblockstorage-uk/pom.xml new file mode 100644 index 0000000000..fb372acf82 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-uk/pom.xml @@ -0,0 +1,142 @@ + + + + 4.0.0 + + org.jclouds + jclouds-project + 1.6.0-SNAPSHOT + ../../project/pom.xml + + org.jclouds.labs + rackspace-cloudblockstorage-uk + jclouds Rackspace Next Generation Cloud Block Storage UK provider + OpenStack Cinder implementation targeted to Rackspace Next Generation Cloud Block Storage UK + bundle + + + https://lon.identity.api.rackspacecloud.com/v2.0/ + 1 + + ${test.rackspace-uk.identity} + ${test.rackspace-uk.credential} + + org.jclouds.rackspace.cloudblockstorage.uk*;version="${project.version}" + + org.jclouds.compute.internal;version="${project.version}", + org.jclouds.rest.internal;version="${project.version}", + org.jclouds*;version="${project.version}", + * + + + + + + org.jclouds + jclouds-core + ${project.version} + + + org.jclouds.labs + openstack-cinder + ${project.version} + + + org.jclouds.api + openstack-keystone + ${project.version} + + + org.jclouds.api + rackspace-cloudidentity + ${project.version} + + + org.jclouds + jclouds-core + ${project.version} + test-jar + test + + + org.jclouds.labs + openstack-cinder + ${project.version} + test-jar + test + + + org.jclouds.api + openstack-keystone + ${project.version} + test-jar + test + + + org.jclouds.api + rackspace-cloudidentity + ${project.version} + test-jar + test + + + ch.qos.logback + logback-classic + test + + + + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration + integration-test + + test + + + 1 + + ${test.rackspace-cloudblockstorage-uk.endpoint} + ${test.rackspace-cloudblockstorage-uk.api-version} + ${test.rackspace-cloudblockstorage-uk.build-version} + ${test.rackspace-cloudblockstorage-uk.identity} + ${test.rackspace-cloudblockstorage-uk.credential} + ${test.rackspace-cloudblockstorage-uk.template} + + + + + + + + + + + diff --git a/labs/rackspace-cloudblockstorage-uk/src/main/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderMetadata.java b/labs/rackspace-cloudblockstorage-uk/src/main/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderMetadata.java new file mode 100644 index 0000000000..62cc75035c --- /dev/null +++ b/labs/rackspace-cloudblockstorage-uk/src/main/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderMetadata.java @@ -0,0 +1,111 @@ +/** + * 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.cloudblockstorage.uk; + +import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONE; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONES; +import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE; + +import java.net.URI; +import java.util.Properties; + +import org.jclouds.openstack.cinder.v1.CinderApiMetadata; +import org.jclouds.openstack.cinder.v1.config.CinderParserModule; +import org.jclouds.openstack.cinder.v1.config.CinderRestClientModule; +import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule; +import org.jclouds.providers.ProviderMetadata; +import org.jclouds.providers.internal.BaseProviderMetadata; +import org.jclouds.rackspace.cloudidentity.v2_0.config.CloudIdentityAuthenticationModule; +import org.jclouds.rackspace.cloudidentity.v2_0.config.CloudIdentityCredentialTypes; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + +/** + * Implementation of {@link org.jclouds.types.ProviderMetadata} for Rackspace Next Generation Cloud Block Storage. + * + * @author Everett Toews + */ +public class CloudBlockStorageUKProviderMetadata extends BaseProviderMetadata { + private static final long serialVersionUID = -620987914134012695L; + + public static Builder builder() { + return new Builder(); + } + + @Override + public Builder toBuilder() { + return builder().fromProviderMetadata(this); + } + + public CloudBlockStorageUKProviderMetadata() { + super(builder()); + } + + public CloudBlockStorageUKProviderMetadata(Builder builder) { + super(builder); + } + + public static Properties defaultProperties() { + Properties properties = new Properties(); + properties.setProperty(CREDENTIAL_TYPE, CloudIdentityCredentialTypes.API_KEY_CREDENTIALS); + properties.setProperty(PROPERTY_ZONES, "LON"); + properties.setProperty(PROPERTY_ZONE + ".LON." + ISO3166_CODES, "GB-SLG"); + return properties; + } + + public static class Builder extends BaseProviderMetadata.Builder { + + protected Builder(){ + id("rackspace-cloudblockstorage-uk") + .name("Rackspace Next Generation Cloud Block Storage UK") + .apiMetadata(new CinderApiMetadata().toBuilder() + .identityName("${userName}") + .credentialName("${apiKey}") + .defaultEndpoint("https://lon.identity.api.rackspacecloud.com/v2.0/") + .endpointName("identity service url ending in /v2.0/") + .documentation(URI.create("http://docs.rackspace.com/cbs/api/v1.0/cbs-devguide/content/overview.html")) + .defaultModules(ImmutableSet.>builder() + .add(CloudIdentityAuthenticationModule.class) + .add(ZoneModule.class) + .add(CinderParserModule.class) + .add(CinderRestClientModule.class).build()) + .build()) + .homepage(URI.create("http://www.rackspace.co.uk/cloud-hosting/cloud-products/cloud-block-storage/")) + .console(URI.create("https://mycloud.rackspace.co.uk")) + .linkedServices("rackspace-cloudservers-uk", "cloudfiles-uk") + .iso3166Codes("GB-SLG") + .endpoint("https://lon.identity.api.rackspacecloud.com/v2.0/") + .defaultProperties(CloudBlockStorageUKProviderMetadata.defaultProperties()); + } + + @Override + public CloudBlockStorageUKProviderMetadata build() { + return new CloudBlockStorageUKProviderMetadata(this); + } + + @Override + public Builder fromProviderMetadata(ProviderMetadata in) { + super.fromProviderMetadata(in); + return this; + } + } + +} diff --git a/labs/rackspace-cloudblockstorage-uk/src/main/resources/META-INF/services/org.jclouds.providers.ProviderMetadata b/labs/rackspace-cloudblockstorage-uk/src/main/resources/META-INF/services/org.jclouds.providers.ProviderMetadata new file mode 100644 index 0000000000..97fe43d278 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-uk/src/main/resources/META-INF/services/org.jclouds.providers.ProviderMetadata @@ -0,0 +1 @@ +org.jclouds.rackspace.cloudblockstorage.uk.CloudBlockStorageUKProviderMetadata diff --git a/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderMetadataExpectTest.java b/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderMetadataExpectTest.java new file mode 100644 index 0000000000..4c1328dac2 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderMetadataExpectTest.java @@ -0,0 +1,67 @@ +/** + * 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.cloudblockstorage.uk; + +import static org.testng.Assert.assertEquals; + +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.openstack.cinder.v1.CinderApi; +import org.jclouds.openstack.cinder.v1.internal.BaseCinderApiExpectTest; +import org.jclouds.rackspace.cloudblockstorage.uk.CloudBlockStorageUKProviderMetadata; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; + +/** + * This test ensures that the wiring in {@link CloudBlockStorageUKProviderMetadata} is correct. + * + * @author Everett Toews + */ +@Test(groups = "unit", testName = "CloudBlockStorageUKProviderMetadataExpectTest") +public class CloudBlockStorageUKProviderMetadataExpectTest extends BaseCinderApiExpectTest { + + public CloudBlockStorageUKProviderMetadataExpectTest() { + this.provider = "rackspace-cloudblockstorage-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(); + + CinderApi whenNovaRegionExists = requestSendsResponse(authenticate, authenticationResponse); + + assertEquals(whenNovaRegionExists.getConfiguredZones(), ImmutableSet.of("LON")); + + } + +} diff --git a/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderTest.java b/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderTest.java new file mode 100644 index 0000000000..6dc8f27f24 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/CloudBlockStorageUKProviderTest.java @@ -0,0 +1,35 @@ +/** + * 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 computee 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.cloudblockstorage.uk; + +import org.jclouds.openstack.cinder.v1.CinderApiMetadata; +import org.jclouds.providers.internal.BaseProviderMetadataTest; +import org.jclouds.rackspace.cloudblockstorage.uk.CloudBlockStorageUKProviderMetadata; +import org.testng.annotations.Test; + +/** + * @author Everett Toews + */ +@Test(groups = "unit", testName = "CloudBlockStorageUKProviderTest") +public class CloudBlockStorageUKProviderTest extends BaseProviderMetadataTest { + + public CloudBlockStorageUKProviderTest() { + super(new CloudBlockStorageUKProviderMetadata(), new CinderApiMetadata()); + } +} diff --git a/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/features/CloudBlockStorageUKVolumeAndSnapshotApiLiveTest.java b/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/features/CloudBlockStorageUKVolumeAndSnapshotApiLiveTest.java new file mode 100644 index 0000000000..6bde1a366b --- /dev/null +++ b/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/features/CloudBlockStorageUKVolumeAndSnapshotApiLiveTest.java @@ -0,0 +1,32 @@ +/** + * 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.cloudblockstorage.uk.features; + +import org.jclouds.openstack.cinder.v1.features.VolumeAndSnapshotApiLiveTest; +import org.testng.annotations.Test; + +/** + * @author Everett Toews + */ +@Test(groups = "live", testName = "CloudBlockStorageUKVolumeAndSnapshotApiLiveTest") +public class CloudBlockStorageUKVolumeAndSnapshotApiLiveTest extends VolumeAndSnapshotApiLiveTest { + public CloudBlockStorageUKVolumeAndSnapshotApiLiveTest() { + provider = "rackspace-cloudblockstorage-uk"; + } +} diff --git a/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/features/CloudBlockStorageUKVolumeTypeApiLiveTest.java b/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/features/CloudBlockStorageUKVolumeTypeApiLiveTest.java new file mode 100644 index 0000000000..7a1efed23d --- /dev/null +++ b/labs/rackspace-cloudblockstorage-uk/src/test/java/org/jclouds/rackspace/cloudblockstorage/uk/features/CloudBlockStorageUKVolumeTypeApiLiveTest.java @@ -0,0 +1,32 @@ +/** + * 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.cloudblockstorage.uk.features; + +import org.jclouds.openstack.cinder.v1.features.VolumeTypeApiLiveTest; +import org.testng.annotations.Test; + +/** + * @author Everett Toews + */ +@Test(groups = "live", testName = "CloudBlockStorageUSVolumeTypeApiLiveTest") +public class CloudBlockStorageUKVolumeTypeApiLiveTest extends VolumeTypeApiLiveTest { + public CloudBlockStorageUKVolumeTypeApiLiveTest() { + provider = "rackspace-cloudblockstorage-uk"; + } +} diff --git a/labs/rackspace-cloudblockstorage-uk/src/test/resources/access_rax_uk.json b/labs/rackspace-cloudblockstorage-uk/src/test/resources/access_rax_uk.json new file mode 100644 index 0000000000..a818fefbb9 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-uk/src/test/resources/access_rax_uk.json @@ -0,0 +1,129 @@ +{ + "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" + }, + { + "endpoints": [ + { + "publicURL": "https://lon.blockstorage.api.rackspacecloud.com/v1/10001786", + "tenantId": "10001786", + "region": "LON" + } + ], + "name": "cloudBlockStorage", + "type": "volume" + } + ], + "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/labs/rackspace-cloudblockstorage-us/pom.xml b/labs/rackspace-cloudblockstorage-us/pom.xml new file mode 100644 index 0000000000..511346b565 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-us/pom.xml @@ -0,0 +1,142 @@ + + + + 4.0.0 + + org.jclouds + jclouds-project + 1.6.0-SNAPSHOT + ../../project/pom.xml + + org.jclouds.labs + rackspace-cloudblockstorage-us + jclouds Rackspace Next Generation Cloud Block Storage US provider + OpenStack Cinder implementation targeted to Rackspace Next Generation Cloud Block Storage US + bundle + + + https://identity.api.rackspacecloud.com/v2.0/ + 1 + + ${test.rackspace-us.identity} + ${test.rackspace-us.credential} + + org.jclouds.rackspace.cloudblockstorage.us*;version="${project.version}" + + org.jclouds.compute.internal;version="${project.version}", + org.jclouds.rest.internal;version="${project.version}", + org.jclouds*;version="${project.version}", + * + + + + + + org.jclouds + jclouds-core + ${project.version} + + + org.jclouds.labs + openstack-cinder + ${project.version} + + + org.jclouds.api + openstack-keystone + ${project.version} + + + org.jclouds.api + rackspace-cloudidentity + ${project.version} + + + org.jclouds + jclouds-core + ${project.version} + test-jar + test + + + org.jclouds.labs + openstack-cinder + ${project.version} + test-jar + test + + + org.jclouds.api + openstack-keystone + ${project.version} + test-jar + test + + + org.jclouds.api + rackspace-cloudidentity + ${project.version} + test-jar + test + + + ch.qos.logback + logback-classic + test + + + + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration + integration-test + + test + + + 1 + + ${test.rackspace-cloudblockstorage-us.endpoint} + ${test.rackspace-cloudblockstorage-us.api-version} + ${test.rackspace-cloudblockstorage-us.build-version} + ${test.rackspace-cloudblockstorage-us.identity} + ${test.rackspace-cloudblockstorage-us.credential} + ${test.rackspace-cloudblockstorage-us.template} + + + + + + + + + + + diff --git a/labs/rackspace-cloudblockstorage-us/src/main/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderMetadata.java b/labs/rackspace-cloudblockstorage-us/src/main/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderMetadata.java new file mode 100644 index 0000000000..09f82e24d0 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-us/src/main/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderMetadata.java @@ -0,0 +1,112 @@ +/** + * 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.cloudblockstorage.us; + +import static org.jclouds.location.reference.LocationConstants.ISO3166_CODES; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONE; +import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONES; +import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE; + +import java.net.URI; +import java.util.Properties; + +import org.jclouds.openstack.cinder.v1.CinderApiMetadata; +import org.jclouds.openstack.cinder.v1.config.CinderParserModule; +import org.jclouds.openstack.cinder.v1.config.CinderRestClientModule; +import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule; +import org.jclouds.providers.ProviderMetadata; +import org.jclouds.providers.internal.BaseProviderMetadata; +import org.jclouds.rackspace.cloudidentity.v2_0.config.CloudIdentityAuthenticationModule; +import org.jclouds.rackspace.cloudidentity.v2_0.config.CloudIdentityCredentialTypes; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + +/** + * Implementation of {@link org.jclouds.types.ProviderMetadata} for Rackspace Next Generation Cloud Block Storage. + * + * @author Everett Toews + */ +public class CloudBlockStorageUSProviderMetadata extends BaseProviderMetadata { + private static final long serialVersionUID = -290987074134012652L; + + public static Builder builder() { + return new Builder(); + } + + @Override + public Builder toBuilder() { + return builder().fromProviderMetadata(this); + } + + public CloudBlockStorageUSProviderMetadata() { + super(builder()); + } + + public CloudBlockStorageUSProviderMetadata(Builder builder) { + super(builder); + } + + public static Properties defaultProperties() { + Properties properties = new Properties(); + properties.setProperty(CREDENTIAL_TYPE, CloudIdentityCredentialTypes.API_KEY_CREDENTIALS); + properties.setProperty(PROPERTY_ZONES, "ORD,DFW"); + properties.setProperty(PROPERTY_ZONE + ".ORD." + ISO3166_CODES, "US-IL"); + properties.setProperty(PROPERTY_ZONE + ".DFW." + ISO3166_CODES, "US-TX"); + return properties; + } + + public static class Builder extends BaseProviderMetadata.Builder { + + protected Builder(){ + id("rackspace-cloudblockstorage-us") + .name("Rackspace Next Generation Cloud Block Storage US") + .apiMetadata(new CinderApiMetadata().toBuilder() + .identityName("${userName}") + .credentialName("${apiKey}") + .defaultEndpoint("https://identity.api.rackspacecloud.com/v2.0/") + .endpointName("identity service url ending in /v2.0/") + .documentation(URI.create("http://docs.rackspace.com/cbs/api/v1.0/cbs-devguide/content/overview.html")) + .defaultModules(ImmutableSet.>builder() + .add(CloudIdentityAuthenticationModule.class) + .add(ZoneModule.class) + .add(CinderParserModule.class) + .add(CinderRestClientModule.class).build()) + .build()) + .homepage(URI.create("http://www.rackspace.com/cloud/public/blockstorage/")) + .console(URI.create("https://mycloud.rackspace.com")) + .linkedServices("rackspace-cloudservers-us", "cloudfiles-us") + .iso3166Codes("US-IL", "US-TX") + .endpoint("https://identity.api.rackspacecloud.com/v2.0/") + .defaultProperties(CloudBlockStorageUSProviderMetadata.defaultProperties()); + } + + @Override + public CloudBlockStorageUSProviderMetadata build() { + return new CloudBlockStorageUSProviderMetadata(this); + } + + @Override + public Builder fromProviderMetadata(ProviderMetadata in) { + super.fromProviderMetadata(in); + return this; + } + } + +} diff --git a/labs/rackspace-cloudblockstorage-us/src/main/resources/META-INF/services/org.jclouds.providers.ProviderMetadata b/labs/rackspace-cloudblockstorage-us/src/main/resources/META-INF/services/org.jclouds.providers.ProviderMetadata new file mode 100644 index 0000000000..84a96e253c --- /dev/null +++ b/labs/rackspace-cloudblockstorage-us/src/main/resources/META-INF/services/org.jclouds.providers.ProviderMetadata @@ -0,0 +1 @@ +org.jclouds.rackspace.cloudblockstorage.us.CloudBlockStorageUSProviderMetadata diff --git a/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderMetadataExpectTest.java b/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderMetadataExpectTest.java new file mode 100644 index 0000000000..18ee66539c --- /dev/null +++ b/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderMetadataExpectTest.java @@ -0,0 +1,66 @@ +/** + * 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.cloudblockstorage.us; + +import static org.testng.Assert.assertEquals; + +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.openstack.cinder.v1.CinderApi; +import org.jclouds.openstack.cinder.v1.internal.BaseCinderApiExpectTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; + +/** + * This test ensures that the wiring in {@link CloudBlockStorageUSProviderMetadata} is correct. + * + * @author Everett Toews + */ +@Test(groups = "unit", testName = "CloudBlockStorageUSProviderMetadataExpectTest") +public class CloudBlockStorageUSProviderMetadataExpectTest extends BaseCinderApiExpectTest { + + public CloudBlockStorageUSProviderMetadataExpectTest() { + this.provider = "rackspace-cloudblockstorage-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(); + + CinderApi whenNovaRegionExists = requestSendsResponse(authenticate, authenticationResponse); + + assertEquals(whenNovaRegionExists.getConfiguredZones(), ImmutableSet.of("ORD", "DFW")); + + } + +} diff --git a/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderTest.java b/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderTest.java new file mode 100644 index 0000000000..7bbe0556ec --- /dev/null +++ b/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/CloudBlockStorageUSProviderTest.java @@ -0,0 +1,34 @@ +/** + * 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 computee 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.cloudblockstorage.us; + +import org.jclouds.openstack.cinder.v1.CinderApiMetadata; +import org.jclouds.providers.internal.BaseProviderMetadataTest; +import org.testng.annotations.Test; + +/** + * @author Everett Toews + */ +@Test(groups = "unit", testName = "CloudBlockStorageUSProviderTest") +public class CloudBlockStorageUSProviderTest extends BaseProviderMetadataTest { + + public CloudBlockStorageUSProviderTest() { + super(new CloudBlockStorageUSProviderMetadata(), new CinderApiMetadata()); + } +} diff --git a/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/features/CloudBlockStorageUSVolumeAndSnapshotApiLiveTest.java b/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/features/CloudBlockStorageUSVolumeAndSnapshotApiLiveTest.java new file mode 100644 index 0000000000..7ed0edc483 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/features/CloudBlockStorageUSVolumeAndSnapshotApiLiveTest.java @@ -0,0 +1,32 @@ +/** + * 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.cloudblockstorage.us.features; + +import org.jclouds.openstack.cinder.v1.features.VolumeAndSnapshotApiLiveTest; +import org.testng.annotations.Test; + +/** + * @author Everett Toews + */ +@Test(groups = "live", testName = "CloudBlockStorageUSVolumeAndSnapshotApiLiveTest") +public class CloudBlockStorageUSVolumeAndSnapshotApiLiveTest extends VolumeAndSnapshotApiLiveTest { + public CloudBlockStorageUSVolumeAndSnapshotApiLiveTest() { + provider = "rackspace-cloudblockstorage-us"; + } +} diff --git a/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/features/CloudBlockStorageUSVolumeTypeApiLiveTest.java b/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/features/CloudBlockStorageUSVolumeTypeApiLiveTest.java new file mode 100644 index 0000000000..5761c603d8 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-us/src/test/java/org/jclouds/rackspace/cloudblockstorage/us/features/CloudBlockStorageUSVolumeTypeApiLiveTest.java @@ -0,0 +1,32 @@ +/** + * 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.cloudblockstorage.us.features; + +import org.jclouds.openstack.cinder.v1.features.VolumeTypeApiLiveTest; +import org.testng.annotations.Test; + +/** + * @author Everett Toews + */ +@Test(groups = "live", testName = "CloudBlockStorageUSVolumeTypeApiLiveTest") +public class CloudBlockStorageUSVolumeTypeApiLiveTest extends VolumeTypeApiLiveTest { + public CloudBlockStorageUSVolumeTypeApiLiveTest() { + provider = "rackspace-cloudblockstorage-us"; + } +} diff --git a/labs/rackspace-cloudblockstorage-us/src/test/resources/access_rax_us.json b/labs/rackspace-cloudblockstorage-us/src/test/resources/access_rax_us.json new file mode 100644 index 0000000000..789ede78f4 --- /dev/null +++ b/labs/rackspace-cloudblockstorage-us/src/test/resources/access_rax_us.json @@ -0,0 +1,163 @@ +{ + "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": [ + { + "publicURL": "https://ord.blockstorage.api.rackspacecloud.com/v1/717071", + "tenantId": "717071", + "region": "ORD" + }, + { + "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