You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by jd...@apache.org on 2014/08/13 18:59:51 UTC

[12/12] git commit: Prefer Regions to Zones in OpenStack APIs

Prefer Regions to Zones in OpenStack APIs


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/744cd5d7
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/744cd5d7
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/744cd5d7

Branch: refs/heads/master
Commit: 744cd5d7ebb5c2135ce1330ca0ee5c4ae48ff2cb
Parents: 9009bb5
Author: Jeremy Daggett <je...@rackspace.com>
Authored: Sat Jul 26 10:40:02 2014 -0700
Committer: Jeremy Daggett <jd...@apache.org>
Committed: Wed Aug 13 09:58:53 2014 -0700

----------------------------------------------------------------------
 .../jclouds/openstack/cinder/v1/CinderApi.java  |  86 +++--
 .../openstack/cinder/v1/CinderApiMetadata.java  |  10 +-
 .../openstack/cinder/v1/features/QuotaApi.java  |  27 +-
 .../cinder/v1/features/SnapshotApi.java         |  34 +-
 .../openstack/cinder/v1/features/VolumeApi.java |  31 +-
 .../cinder/v1/features/VolumeTypeApi.java       |  21 +-
 .../v1/predicates/SnapshotPredicates.java       |  30 +-
 .../cinder/v1/predicates/VolumePredicates.java  |  40 +--
 .../cinder/v1/features/QuotasApiExpectTest.java |   8 +-
 .../cinder/v1/features/QuotasApiLiveTest.java   |  13 +-
 .../v1/features/SnapshotApiExpectTest.java      |  28 +-
 .../features/VolumeAndSnapshotApiLiveTest.java  |  14 +-
 .../cinder/v1/features/VolumeApiExpectTest.java |  20 +-
 .../v1/features/VolumeTypeApiExpectTest.java    |   6 +-
 .../v1/features/VolumeTypeApiLiveTest.java      |   6 +-
 .../config/KeystoneAuthenticationModule.java    |   7 +-
 .../v2_0/config/KeystoneHttpApiModule.java      |   2 +-
 .../v2_0/config/KeystoneRestClientModule.java   |   2 +-
 ...ceEqualsAnyNamespaceInExtensionsSetTest.java |  62 ++--
 .../jclouds/openstack/nova/v2_0/NovaApi.java    | 317 +++++++++++++++--
 .../openstack/nova/v2_0/NovaApiMetadata.java    |   4 +-
 .../nova/v2_0/compute/NovaComputeService.java   |  58 ++--
 .../v2_0/compute/NovaComputeServiceAdapter.java | 137 ++++----
 .../config/NovaComputeServiceContextModule.java |  68 ++--
 .../compute/extensions/NovaImageExtension.java  |  28 +-
 .../extensions/NovaSecurityGroupExtension.java  | 136 ++++----
 .../AllocateAndAddFloatingIpToNode.java         |  12 +-
 .../functions/CreateSecurityGroupIfNeeded.java  |  30 +-
 .../functions/FlavorInRegionToHardware.java     |  58 ++++
 .../functions/FlavorInZoneToHardware.java       |  58 ----
 .../compute/functions/ImageInRegionToImage.java |  68 ++++
 .../compute/functions/ImageInZoneToImage.java   |  68 ----
 ...ovaSecurityGroupInRegionToSecurityGroup.java |  73 ++++
 .../NovaSecurityGroupInZoneToSecurityGroup.java |  73 ----
 .../functions/OrphanedGroupsByRegionId.java     |  73 ++++
 .../functions/OrphanedGroupsByZoneId.java       |  73 ----
 .../RemoveFloatingIpFromNodeAndDeallocate.java  |  12 +-
 .../SecurityGroupRuleToIpPermission.java        |  34 +-
 .../functions/ServerInRegionToNodeMetadata.java | 207 +++++++++++
 .../functions/ServerInZoneToNodeMetadata.java   | 207 -----------
 .../compute/loaders/CreateUniqueKeyPair.java    |  18 +-
 .../loaders/FindSecurityGroupOrCreate.java      |  52 +--
 .../loaders/LoadFloatingIpsForInstance.java     |  14 +-
 .../compute/options/NovaTemplateOptions.java    |  18 +-
 .../predicates/AllNodesInGroupTerminated.java   |  14 +-
 ...desWithGroupEncodedIntoNameThenAddToSet.java |  30 +-
 .../nova/v2_0/config/NovaHttpApiModule.java     |   4 +-
 .../nova/v2_0/domain/HostAggregate.java         |  42 ++-
 .../domain/regionscoped/AvailabilityZone.java   |  69 ++++
 .../domain/regionscoped/FlavorInRegion.java     |  43 +++
 .../v2_0/domain/regionscoped/ImageInRegion.java |  43 +++
 .../v2_0/domain/regionscoped/RegionAndId.java   |  83 +++++
 .../v2_0/domain/regionscoped/RegionAndName.java | 110 ++++++
 .../RegionSecurityGroupNameAndPorts.java        |  59 ++++
 .../regionscoped/SecurityGroupInRegion.java     |  43 +++
 .../domain/regionscoped/ServerInRegion.java     |  43 +++
 .../v2_0/domain/regionscoped/ZoneState.java     |  57 ++++
 .../domain/zonescoped/AvailabilityZone.java     |  69 ----
 .../v2_0/domain/zonescoped/FlavorInZone.java    |  43 ---
 .../v2_0/domain/zonescoped/ImageInZone.java     |  43 ---
 .../domain/zonescoped/SecurityGroupInZone.java  |  43 ---
 .../v2_0/domain/zonescoped/ServerInZone.java    |  43 ---
 .../nova/v2_0/domain/zonescoped/ZoneAndId.java  |  83 -----
 .../v2_0/domain/zonescoped/ZoneAndName.java     | 110 ------
 .../ZoneSecurityGroupNameAndPorts.java          |  59 ----
 .../nova/v2_0/domain/zonescoped/ZoneState.java  |  57 ----
 .../v2_0/extensions/AvailabilityZoneApi.java    |   2 +-
 .../functions/internal/ParseFlavorDetails.java  |  10 +-
 .../v2_0/functions/internal/ParseFlavors.java   |   4 +-
 .../functions/internal/ParseImageDetails.java   |   4 +-
 .../v2_0/functions/internal/ParseImages.java    |  10 +-
 .../functions/internal/ParseServerDetails.java  |   4 +-
 .../v2_0/functions/internal/ParseServers.java   |  10 +-
 .../nova/v2_0/options/CreateServerOptions.java  |   6 +-
 .../FindSecurityGroupWithNameAndReturnTrue.java |  20 +-
 .../nova/v2_0/predicates/ServerPredicates.java  |  14 +-
 ...tKeyAndTenantIdAuthenticationExpectTest.java |   8 +-
 ...antNamePropertyAuthenticationExpectTest.java |   6 +-
 ...KeyAndSecretKeyAuthenticationExpectTest.java |   8 +-
 .../nova/v2_0/EndpointIdIsRandomExpectTest.java |   4 +-
 .../v2_0/PasswordAuthenticationExpectTest.java  |  10 +-
 ...dAuthenticationWithTenantNameExpectTest.java |   8 +-
 .../NovaComputeServiceAdapterExpectTest.java    |  28 +-
 .../compute/NovaComputeServiceExpectTest.java   |  12 +-
 .../NovaImageExtensionExpectTest.java           |  10 +-
 .../NovaSecurityGroupExtensionExpectTest.java   |  34 +-
 ...llocateAndAddFloatingIpToNodeExpectTest.java |   6 +-
 .../functions/FlavorInRegionToHardwareTest.java |  88 +++++
 .../functions/FlavorInZoneToHardwareTest.java   |  88 -----
 .../functions/ImageInRegionToImageTest.java     |  93 +++++
 .../functions/ImageInZoneToImageTest.java       |  93 -----
 ...ecurityGroupInRegionToSecurityGroupTest.java |  91 +++++
 ...aSecurityGroupInZoneToSecurityGroupTest.java |  91 -----
 .../NovaSecurityGroupToSecurityGroupTest.java   |  24 +-
 .../functions/OrphanedGroupsByRegionIdTest.java |  91 +++++
 .../functions/OrphanedGroupsByZoneIdTest.java   |  91 -----
 .../ServerInRegionToNodeMetadataTest.java       | 341 +++++++++++++++++++
 .../ServerInZoneToNodeMetadataTest.java         | 341 -------------------
 .../loaders/CreateUniqueKeyPairTest.java        |  12 +-
 .../loaders/FindSecurityGroupOrCreateTest.java  |  66 ++--
 .../loaders/LoadFloatingIpsForInstanceTest.java |  15 +-
 .../extensions/AdminActionsApiExpectTest.java   |  60 ++--
 .../extensions/AdminActionsApiLiveTest.java     |  18 +-
 .../AvailabilityZoneApiExpectTest.java          |   5 +-
 .../AvailabilityZonesApiLiveTest.java           |   4 +-
 .../v2_0/extensions/ConsolesApiLiveTest.java    |   8 +-
 .../v2_0/extensions/ConsolesApiMockTest.java    |   8 +-
 .../FlavorExtraSpecsApiExpectTest.java          |  16 +-
 .../extensions/FlavorExtraSpecsApiLiveTest.java |   8 +-
 .../extensions/FloatingIPApiExpectTest.java     |  24 +-
 .../v2_0/extensions/FloatingIPApiLiveTest.java  |  16 +-
 .../HostAdministrationApiExpectTest.java        |  40 +--
 .../HostAdministrationApiLiveTest.java          |   4 +-
 .../extensions/HostAggregateApiExpectTest.java  |  22 +-
 .../extensions/HostAggregateApiLiveTest.java    |   8 +-
 .../v2_0/extensions/KeyPairApiExpectTest.java   |  16 +-
 .../v2_0/extensions/KeyPairApiLiveTest.java     |  12 +-
 .../v2_0/extensions/QuotaApiExpectTest.java     |  12 +-
 .../nova/v2_0/extensions/QuotaApiLiveTest.java  |   4 +-
 .../extensions/SecurityGroupApiExpectTest.java  |  22 +-
 .../extensions/SecurityGroupApiLiveTest.java    |  12 +-
 .../ServerWithSecurityGroupsApiExpectTest.java  |   4 +-
 .../ServerWithSecurityGroupsApiLiveTest.java    |  12 +-
 .../SimpleTenantUsageApiExpectTest.java         |  12 +-
 .../SimpleTenantUsageApiLiveTest.java           |   4 +-
 .../VirtualInterfaceApiExpectTest.java          |   4 +-
 .../extensions/VirtualInterfaceApiLiveTest.java |  11 +-
 .../v2_0/extensions/VolumeApiExpectTest.java    |  64 ++--
 .../nova/v2_0/extensions/VolumeApiLiveTest.java |  14 +-
 .../VolumeAttachmentApiExpectTest.java          |  20 +-
 .../extensions/VolumeAttachmentApiLiveTest.java |  18 +-
 .../extensions/VolumeTypeApiExpectTest.java     |  32 +-
 .../v2_0/extensions/VolumeTypeApiLiveTest.java  |   6 +-
 .../v2_0/features/ExtensionApiExpectTest.java   |  10 +-
 .../v2_0/features/ExtensionApiLiveTest.java     |  12 +-
 .../nova/v2_0/features/FlavorApiExpectTest.java |  14 +-
 .../nova/v2_0/features/FlavorApiLiveTest.java   |  18 +-
 .../nova/v2_0/features/ImageApiExpectTest.java  |  32 +-
 .../nova/v2_0/features/ImageApiLiveTest.java    |  12 +-
 .../nova/v2_0/features/ServerApiExpectTest.java |  66 ++--
 .../nova/v2_0/features/ServerApiLiveTest.java   |  44 +--
 .../CreateSecurityGroupIfNeededTest.java        |  34 +-
 ...ityGroupWithNameAndReturnTrueExpectTest.java |  20 +-
 .../v2_0/functions/InternalURLLiveTest.java     |   8 +-
 .../nova/v2_0/internal/BaseNovaApiLiveTest.java |  40 +--
 .../predicates/ServerPredicatesMockTest.java    |   6 +-
 .../jclouds/openstack/trove/v1/TroveApi.java    |  80 ++++-
 .../openstack/trove/v1/TroveApiMetadata.java    |   8 +-
 .../trove/v1/features/DatabaseApi.java          |  24 +-
 .../openstack/trove/v1/features/FlavorApi.java  |  13 +-
 .../trove/v1/features/InstanceApi.java          |  26 +-
 .../openstack/trove/v1/features/UserApi.java    |  29 +-
 .../trove/v1/predicates/InstancePredicates.java |  36 +-
 .../openstack/trove/v1/utils/TroveUtils.java    |  24 +-
 .../openstack/trove/v1/domain/FlavorTest.java   |  10 +-
 .../openstack/trove/v1/domain/InstanceTest.java |   6 +-
 .../openstack/trove/v1/domain/UserTest.java     |   6 +-
 .../v1/features/DatabaseApiExpectTest.java      |  16 +-
 .../trove/v1/features/DatabaseApiLiveTest.java  |  46 +--
 .../trove/v1/features/FlavorApiExpectTest.java  |  22 +-
 .../trove/v1/features/FlavorApiLiveTest.java    |  24 +-
 .../v1/features/InstanceApiExpectTest.java      |  26 +-
 .../trove/v1/features/InstanceApiLiveTest.java  |  56 +--
 .../trove/v1/features/UserApiExpectTest.java    |  44 +--
 .../trove/v1/features/UserApiLiveTest.java      |  86 ++---
 .../rackspace/clouddns/v1/CloudDNSApi.java      |  24 +-
 .../v1/functions/RecordsToPagedIterable.java    |   2 +-
 .../v1/features/RecordApiExpectTest.java        |  24 +-
 .../clouddns/v1/features/RecordApiLiveTest.java |  36 +-
 .../v1/features/ReverseDNSApiExpectTest.java    |  12 +-
 .../v1/features/ReverseDNSApiLiveTest.java      |  20 +-
 .../v1/CloudLoadBalancersApi.java               | 156 ++++++++-
 .../v1/CloudLoadBalancersApiMetadata.java       |   6 +-
 .../v1/functions/ParseLoadBalancerUsages.java   |   6 +-
 .../v1/functions/ParseLoadBalancers.java        |  18 +-
 .../v1/functions/ParseNodes.java                |  10 +-
 ...oadBalancersDestroyLoadBalancerStrategy.java |   2 +-
 ...alancersGetLoadBalancerMetadataStrategy.java |   2 +-
 ...dLoadBalancersListLoadBalancersStrategy.java |  12 +-
 ...udLoadBalancersLoadBalanceNodesStrategy.java |   2 +-
 .../v1/predicates/LoadBalancerPredicates.java   |  36 +-
 .../v1/features/AccessRuleApiExpectTest.java    |  24 +-
 .../v1/features/AccessRuleApiLiveTest.java      |  66 ++--
 .../v1/features/ConnectionApiExpectTest.java    |  48 +--
 .../v1/features/ConnectionApiLiveTest.java      |  68 ++--
 .../features/ContentCachingApiExpectTest.java   |  24 +-
 .../v1/features/ContentCachingApiLiveTest.java  |  44 +--
 .../v1/features/ErrorPageApiExpectTest.java     |  32 +-
 .../v1/features/ErrorPageApiLiveTest.java       |  36 +-
 .../v1/features/HealthMonitorApiExpectTest.java |  30 +-
 .../v1/features/HealthMonitorApiLiveTest.java   |  40 +--
 .../v1/features/LoadBalancerApiExpectTest.java  |  18 +-
 .../v1/features/LoadBalancerApiLiveTest.java    |  82 ++---
 .../v1/features/NodeApiExpectTest.java          |  20 +-
 .../v1/features/NodeApiLiveTest.java            |  64 ++--
 .../v1/features/ReportApiExpectTest.java        |  74 ++--
 .../v1/features/ReportApiLiveTest.java          |  38 +--
 .../features/SSLTerminationApiExpectTest.java   |  20 +-
 .../v1/features/SSLTerminationApiLiveTest.java  |  40 +--
 .../SessionPersistenceApiExpectTest.java        |  26 +-
 .../features/SessionPersistenceApiLiveTest.java |  40 +--
 .../v1/features/VirtualIPApiExpectTest.java     |  18 +-
 .../v1/features/VirtualIPApiLiveTest.java       |  58 ++--
 .../BaseCloudLoadBalancersApiLiveTest.java      |   2 +-
 .../collect/internal/Arg0ToPagedIterable.java   |   4 +-
 .../collect/internal/ArgsToPagedIterable.java   |   6 +-
 .../java/org/jclouds/apis/BaseApiLiveTest.java  |  22 +-
 ...dBlockStorageProviderMetadataExpectTest.java |   6 +-
 .../compute/HPCloudComputeProviderMetadata.java |   8 +-
 .../compute/HPCloudComputeServiceAdapter.java   |  18 +-
 ...PCloudComputeProviderMetadataExpectTest.java |   8 +-
 .../uk/CloudBlockStorageUKProviderMetadata.java |  14 +-
 ...lockStorageUKProviderMetadataExpectTest.java |   8 +-
 .../us/CloudBlockStorageUSProviderMetadata.java |  22 +-
 ...lockStorageUSProviderMetadataExpectTest.java |   8 +-
 .../uk/CloudDatabasesUKProviderMetadata.java    |  12 +-
 ...udDatabasesUKProviderMetadataExpectTest.java |   8 +-
 .../us/CloudDatabasesUSProviderMetadata.java    |  20 +-
 ...udDatabasesUSProviderMetadataExpectTest.java |   8 +-
 .../CloudLoadBalancersUKProviderMetadata.java   |  14 +-
 .../CloudLoadBalancersUSProviderMetadata.java   |  22 +-
 .../uk/CloudServersUKProviderMetadata.java      |  16 +-
 ...loudServersUKProviderMetadataExpectTest.java |   8 +-
 .../us/CloudServersUSProviderMetadata.java      |  24 +-
 ...loudServersUSProviderMetadataExpectTest.java |   8 +-
 225 files changed, 4360 insertions(+), 3878 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java
index 879496c..42b36da 100644
--- a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApi.java
@@ -18,65 +18,113 @@ package org.jclouds.openstack.cinder.v1;
 
 import java.io.Closeable;
 import java.util.Set;
+
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.location.Zone;
-import org.jclouds.location.functions.ZoneToEndpoint;
+import org.jclouds.location.Region;
+import org.jclouds.location.functions.RegionToEndpoint;
+import org.jclouds.openstack.cinder.v1.domain.Snapshot;
+import org.jclouds.openstack.cinder.v1.domain.Volume;
+import org.jclouds.openstack.cinder.v1.domain.VolumeType;
 import org.jclouds.openstack.cinder.v1.features.QuotaApi;
 import org.jclouds.openstack.cinder.v1.features.SnapshotApi;
 import org.jclouds.openstack.cinder.v1.features.VolumeApi;
 import org.jclouds.openstack.cinder.v1.features.VolumeTypeApi;
 import org.jclouds.openstack.v2_0.features.ExtensionApi;
+import org.jclouds.openstack.v2_0.services.Extension;
 import org.jclouds.rest.annotations.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
 
 import com.google.inject.Provides;
 
 /**
- * Provides synchronous access to Cinder.
- *
- * @see <a href="http://api.openstack.org/">API Doc</a>
+ * Provides synchronous access to OpenStack Block Storage (Cinder) v1 API.
  */
 public interface CinderApi extends Closeable {
+
+   /**
+    * @return the Region codes configured
+    */
+   @Provides
+   @Region
+   Set<String> getConfiguredRegions();
+
+   /**
+    * Provides synchronous access to {@link Extension} features.
+    */
+   @Delegate
+   ExtensionApi getExtensionApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+
+   /**
+    * Provides synchronous access to {@link Volume} features.
+    */
+   @Delegate
+   VolumeApi getVolumeApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+
+   /**
+    * Provides synchronous access to {@link VolumeType} features.
+    */
+   @Delegate
+   VolumeTypeApi getVolumeTypeApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+
+   /**
+    * Provides synchronous access to {@link Snapshot} features.
+    */
+   @Delegate
+   SnapshotApi getSnapshotApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+
+   /**
+    * Provides synchronous access to quota features.
+    */
+   @Delegate
+   QuotaApi getQuotaApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region);
+
    /**
     * @return the Zone codes configured
+    * @deprecated Please use {@link #getConfiguredRegions()} as this method will be removed in jclouds 3.0.
     */
+   @Deprecated
    @Provides
-   @Zone
+   @Region
    Set<String> getConfiguredZones();
-   
+
    /**
     * Provides synchronous access to Extension features.
+    * @deprecated Please use {@link #getExtensionApi(String region)} as this method will be removed
+    *             in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
    ExtensionApi getExtensionApiForZone(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+         @EndpointParam(parser = RegionToEndpoint.class) @Nullable String zone);
 
    /**
     * Provides synchronous access to Volume features.
+    * @deprecated Please use {@link #getVolumeApi(String region)} as this method will be removed
+    *             in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
    VolumeApi getVolumeApiForZone(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+         @EndpointParam(parser = RegionToEndpoint.class) @Nullable String zone);
 
    /**
     * Provides synchronous access to VolumeType features.
+    * @deprecated Please use {@link #getVolumeTypeApi(String region)} as this method will be removed
+    *             in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
    VolumeTypeApi getVolumeTypeApiForZone(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
-   
+         @EndpointParam(parser = RegionToEndpoint.class) @Nullable String zone);
+
    /**
     * Provides synchronous access to Snapshot features.
+    * @deprecated Please use {@link #getSnapshotApi(String)} as this method will be removed
+    *             in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
    SnapshotApi getSnapshotApiForZone(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
-
-   /**
-    * Provides synchronous access to quotas features.
-    */
-   @Delegate
-   QuotaApi getQuotaApi(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+         @EndpointParam(parser = RegionToEndpoint.class) @Nullable String zone);
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApiMetadata.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApiMetadata.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApiMetadata.java
index 1b497c5..e532f37 100644
--- a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApiMetadata.java
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/CinderApiMetadata.java
@@ -27,7 +27,7 @@ import org.jclouds.openstack.cinder.v1.config.CinderParserModule;
 import org.jclouds.openstack.keystone.v2_0.config.AuthenticationApiModule;
 import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
 import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule;
-import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule;
+import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.RegionModule;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.rest.internal.BaseHttpApiMetadata;
 
@@ -35,10 +35,10 @@ import com.google.common.collect.ImmutableSet;
 import com.google.inject.Module;
 
 /**
- * Implementation of {@link ApiMetadata} for Cinder v1 API
+ * Implementation of {@link org.jclouds.apis.ApiMetadata} for Cinder v1 API
  */
 public class CinderApiMetadata extends BaseHttpApiMetadata<CinderApi> {
-   
+
    @Override
    public Builder toBuilder() {
       return new Builder().fromApiMetadata(this);
@@ -74,12 +74,12 @@ public class CinderApiMetadata extends BaseHttpApiMetadata<CinderApi> {
          .defaultModules(ImmutableSet.<Class<? extends Module>>builder()
                                      .add(AuthenticationApiModule.class)
                                      .add(KeystoneAuthenticationModule.class)
-                                     .add(ZoneModule.class)
+                                     .add(RegionModule.class)
                                      .add(CinderParserModule.class)
                                      .add(CinderHttpApiModule.class)
                                      .build());
       }
-      
+
       @Override
       public CinderApiMetadata build() {
          return new CinderApiMetadata(this);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/QuotaApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/QuotaApi.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/QuotaApi.java
index 3ac8dd2..e8c39f9 100644
--- a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/QuotaApi.java
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/QuotaApi.java
@@ -16,7 +16,15 @@
  */
 package org.jclouds.openstack.cinder.v1.features;
 
-import org.jclouds.Fallbacks;
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.openstack.cinder.v1.domain.VolumeQuota;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.rest.annotations.Fallback;
@@ -24,29 +32,22 @@ import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.annotations.SelectJson;
 import org.jclouds.rest.annotations.SkipEncoding;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.core.MediaType;
-
 /**
- * Provides asynchronous access to Quota via their REST API.
+ * Provides access to the Quota API.
  *
- * @see QuotaApi
- * @see <a href="http://api.openstack.org/">API Doc</a>
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
 @Path("/os-quota-sets")
 public interface QuotaApi {
 
-
+   @Named("quota:get")
    @GET
    @SelectJson("quota_set")
-   @Consumes(MediaType.APPLICATION_JSON)
    @Path("/{tenant_id}")
-   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
    VolumeQuota getByTenant(@PathParam("tenant_id") String tenantId);
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/SnapshotApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/SnapshotApi.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/SnapshotApi.java
index f7f7c97..14807f3 100644
--- a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/SnapshotApi.java
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/SnapshotApi.java
@@ -29,6 +29,7 @@ import javax.ws.rs.core.MediaType;
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.openstack.cinder.v1.domain.Snapshot;
 import org.jclouds.openstack.cinder.v1.options.CreateSnapshotOptions;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
@@ -42,12 +43,13 @@ import org.jclouds.rest.annotations.SkipEncoding;
 import com.google.common.collect.FluentIterable;
 
 /**
- * Provides synchronous access to Volume Snapshots via their REST API.
- * 
- * @see <a href="http://api.openstack.org/">API Doc</a>
+ * Provides synchronous access to Volume Snapshots API.
+ *
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/snapshots")
 public interface SnapshotApi {
    /**
     * Returns a summary list of Snapshots.
@@ -56,10 +58,8 @@ public interface SnapshotApi {
     */
    @Named("snapshot:list")
    @GET
-   @Path("/snapshots")
    @SelectJson("snapshots")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Fallback(EmptyFluentIterableOnNotFoundOr404.class)	
+   @Fallback(EmptyFluentIterableOnNotFoundOr404.class)
    FluentIterable<? extends Snapshot> list();
 
    /**
@@ -69,10 +69,9 @@ public interface SnapshotApi {
     */
    @Named("snapshot:list")
    @GET
-   @Path("/snapshots/detail")
+   @Path("/detail")
    @SelectJson("snapshots")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Fallback(EmptyFluentIterableOnNotFoundOr404.class)   
+   @Fallback(EmptyFluentIterableOnNotFoundOr404.class)
    FluentIterable<? extends Snapshot> listInDetail();
 
    /**
@@ -83,26 +82,24 @@ public interface SnapshotApi {
     */
    @Named("snapshot:get")
    @GET
-   @Path("/snapshots/{id}")
+   @Path("/{id}")
    @SelectJson("snapshot")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Fallback(NullOnNotFoundOr404.class)   
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
    Snapshot get(@PathParam("id") String snapshotId);
 
    /**
     * Creates a new Snapshot. The Volume status must be Available.
-    * 
+    *
     * @param volumeId The Volume Id from which to create the Snapshot
     * @param options See CreateSnapshotOptions
     * @return The new Snapshot
     */
    @Named("snapshot:create")
    @POST
-   @Path("/snapshots")
    @SelectJson("snapshot")
-   @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
-   @MapBinder(CreateSnapshotOptions.class)   
+   @MapBinder(CreateSnapshotOptions.class)
    Snapshot create(@PayloadParam("volume_id") String volumeId, CreateSnapshotOptions... options);
 
    /**
@@ -113,8 +110,7 @@ public interface SnapshotApi {
     */
    @Named("snapshot:delete")
    @DELETE
-   @Path("/snapshots/{id}")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Fallback(FalseOnNotFoundOr404.class)   
+   @Path("/{id}")
+   @Fallback(FalseOnNotFoundOr404.class)
    boolean delete(@PathParam("id") String snapshotId);
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeApi.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeApi.java
index 439422c..68000a7 100644
--- a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeApi.java
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeApi.java
@@ -29,6 +29,7 @@ import javax.ws.rs.core.MediaType;
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.openstack.cinder.v1.domain.Volume;
 import org.jclouds.openstack.cinder.v1.options.CreateVolumeOptions;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
@@ -42,16 +43,16 @@ import org.jclouds.rest.annotations.SkipEncoding;
 import com.google.common.collect.FluentIterable;
 
 /**
- * Provides synchronous access to Volumes.
- * 
+ * Provides synchronous access to the Volume API.
+ *
  * This API strictly handles creating and managing Volumes. To attach a Volume to a Server you need to use the
  * @see VolumeAttachmentApi
- * 
- * @see VolumeAsyncApi
- * @see <a href="http://api.openstack.org/">API Doc</a>
+ *
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/volumes")
 public interface VolumeApi {
    /**
     * Returns a summary list of Volumes.
@@ -60,9 +61,7 @@ public interface VolumeApi {
     */
    @Named("volume:list")
    @GET
-   @Path("/volumes")
    @SelectJson("volumes")
-   @Consumes(MediaType.APPLICATION_JSON)
    @Fallback(EmptyFluentIterableOnNotFoundOr404.class)
    FluentIterable<? extends Volume> list();
 
@@ -73,10 +72,9 @@ public interface VolumeApi {
     */
    @Named("volume:list")
    @GET
-   @Path("/volumes/detail")
+   @Path("/detail")
    @SelectJson("volumes")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Fallback(EmptyFluentIterableOnNotFoundOr404.class)   
+   @Fallback(EmptyFluentIterableOnNotFoundOr404.class)
    FluentIterable<? extends Volume> listInDetail();
 
    /**
@@ -87,24 +85,22 @@ public interface VolumeApi {
     */
    @Named("volume:get")
    @GET
-   @Path("/volumes/{id}")
+   @Path("/{id}")
    @SelectJson("volume")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Fallback(NullOnNotFoundOr404.class)   
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
    Volume get(@PathParam("id") String volumeId);
 
    /**
     * Creates a new Volume
-    * 
+    *
     * @param volumeId Id of the Volume
     * @param options See CreateVolumeOptions
     * @return The new Volume
     */
    @Named("volume:create")
    @POST
-   @Path("/volumes")
    @SelectJson("volume")
-   @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    @MapBinder(CreateVolumeOptions.class)
    Volume create(@PayloadParam("size") int sizeGB, CreateVolumeOptions... options);
@@ -117,8 +113,7 @@ public interface VolumeApi {
     */
    @Named("volume:delete")
    @DELETE
-   @Path("/volumes/{id}")
-   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/{id}")
    @Fallback(FalseOnNotFoundOr404.class)
    boolean delete(@PathParam("id") String volumeId);
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApi.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApi.java
index 8eb3883..9c5072e 100644
--- a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApi.java
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApi.java
@@ -25,6 +25,7 @@ import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.openstack.cinder.v1.domain.VolumeType;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.rest.annotations.Fallback;
@@ -35,24 +36,22 @@ import org.jclouds.rest.annotations.SkipEncoding;
 import com.google.common.collect.FluentIterable;
 
 /**
- * Provides synchronous access to Volumes via their REST API.
- * 
- * @see VolumeAsyncApi
- * @see <a href="http://api.openstack.org/">API Doc</a>
+ * Provides synchronous access to the OpenStack Block Storage (Cinder) v1 Volume Types API.
+ *
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/types")
 public interface VolumeTypeApi {
    /**
     * Returns a summary list of VolumeTypes.
     *
     * @return The list of VolumeTypes
     */
-   @Named("volumetype:list")
+   @Named("volumeType:list")
    @GET
-   @Path("/types")
    @SelectJson("volume_types")
-   @Consumes(MediaType.APPLICATION_JSON)
    @Fallback(EmptyFluentIterableOnNotFoundOr404.class)
    FluentIterable<? extends VolumeType> list();
 
@@ -62,11 +61,11 @@ public interface VolumeTypeApi {
     * @param volumeTypeId Id of the VolumeType
     * @return Details of a specific VolumeType
     */
-   @Named("volumetype:get")
+   @Named("volumeType:get")
    @GET
-   @Path("/types/{id}")
+   @Path("/{id}")
    @SelectJson("volume_type")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Fallback(NullOnNotFoundOr404.class)   
+   @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
    VolumeType get(@PathParam("id") String volumeTypeId);
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/SnapshotPredicates.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/SnapshotPredicates.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/SnapshotPredicates.java
index a79fe79..a441957 100644
--- a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/SnapshotPredicates.java
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/SnapshotPredicates.java
@@ -37,21 +37,21 @@ import com.google.common.base.Predicate;
  * Snapshot snapshot = snapshotApi.create(volumeId);
  * RetryablePredicate<String> awaitAvailable = RetryablePredicate.create(
  *    SnapshotPredicates.available(snapshotApi), 600, 10, 10, TimeUnit.SECONDS);
- * 
+ *
  * if (!awaitAvailable.apply(snapshot.getId())) {
- *    throw new TimeoutException("Timeout on snapshot: " + snapshot); 
- * }    
+ *    throw new TimeoutException("Timeout on snapshot: " + snapshot);
+ * }
  * }
  * </pre>
- * 
+ *
  * You can also use the static convenience methods as so.
- * 
+ *
  * <pre>
  * {@code
  * Snapshot snapshot = snapshotApi.create(volumeId);
- * 
+ *
  * if (!SnapshotPredicates.awaitAvailable(snapshotApi).apply(snapshot.getId())) {
- *    throw new TimeoutException("Timeout on snapshot: " + snapshot);     
+ *    throw new TimeoutException("Timeout on snapshot: " + snapshot);
  * }
  * }
  * </pre>
@@ -59,20 +59,20 @@ import com.google.common.base.Predicate;
 public class SnapshotPredicates {
    /**
     * Wait until a Snapshot is Available.
-    * 
-    * @param snapshotApi The SnapshotApi in the zone where your Snapshot resides.
+    *
+    * @param snapshotApi The SnapshotApi in the region where your Snapshot resides.
     * @return RetryablePredicate That will check the status every 5 seconds for a maxiumum of 20 minutes.
     */
    public static Predicate<Snapshot> awaitAvailable(SnapshotApi snapshotApi) {
       StatusUpdatedPredicate statusPredicate = new StatusUpdatedPredicate(snapshotApi, Volume.Status.AVAILABLE);
       return retry(statusPredicate, 1200, 5, 5, SECONDS);
    }
-   
+
    /**
     * Wait until a Snapshot no longer exists.
-    * 
-    * @param snapshotApi The SnapshotApi in the zone where your Snapshot resides.
-    * @return RetryablePredicate That will check the whether the Snapshot exists 
+    *
+    * @param snapshotApi The SnapshotApi in the region where your Snapshot resides.
+    * @return RetryablePredicate That will check the whether the Snapshot exists
     * every 5 seconds for a maxiumum of 20 minutes.
     */
    public static Predicate<Snapshot> awaitDeleted(SnapshotApi snapshotApi) {
@@ -85,7 +85,7 @@ public class SnapshotPredicates {
    StatusUpdatedPredicate statusPredicate = new StatusUpdatedPredicate(snapshotApi, status);
       return retry(statusPredicate, maxWaitInSec, periodInSec, periodInSec, SECONDS);
    }
-   
+
    private static class StatusUpdatedPredicate implements Predicate<Snapshot> {
       private SnapshotApi snapshotApi;
       private Status status;
@@ -108,7 +108,7 @@ public class SnapshotPredicates {
          else {
             Snapshot snapshotUpdated = snapshotApi.get(snapshot.getId());
             checkNotNull(snapshotUpdated, "Snapshot %s not found.", snapshot.getId());
-            
+
             return status.equals(snapshotUpdated.getStatus());
          }
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/VolumePredicates.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/VolumePredicates.java b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/VolumePredicates.java
index cc3f2c2..6e26425 100644
--- a/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/VolumePredicates.java
+++ b/apis/openstack-cinder/src/main/java/org/jclouds/openstack/cinder/v1/predicates/VolumePredicates.java
@@ -34,24 +34,24 @@ import com.google.common.base.Predicate;
  * <pre>
  * {@code
  * Volume volume = volumeApi.create(100);
- * 
+ *
  * RetryablePredicate<String> awaitAvailable = RetryablePredicate.create(
  *    VolumePredicates.available(volumeApi), 600, 10, 10, TimeUnit.SECONDS);
- * 
+ *
  * if (!awaitAvailable.apply(volume.getId())) {
- *    throw new TimeoutException("Timeout on volume: " + volume); 
- * }    
+ *    throw new TimeoutException("Timeout on volume: " + volume);
+ * }
  * }
  * </pre>
- * 
+ *
  * You can also use the static convenience methods as so.
- * 
+ *
  * <pre>
  * {@code
  * Volume volume = volumeApi.create(100);
- * 
+ *
  * if (!VolumePredicates.awaitAvailable(volumeApi).apply(volume.getId())) {
- *    throw new TimeoutException("Timeout on volume: " + volume);     
+ *    throw new TimeoutException("Timeout on volume: " + volume);
  * }
  * }
  * </pre>
@@ -59,19 +59,19 @@ import com.google.common.base.Predicate;
 public class VolumePredicates {
    /**
     * Wait until a Volume is Available.
-    * 
-    * @param volumeApi The VolumeApi in the zone where your Volume resides.
+    *
+    * @param volumeApi The VolumeApi in the region where your Volume resides.
     * @return RetryablePredicate That will check the status every 5 seconds for a maxiumum of 10 minutes.
     */
    public static Predicate<Volume> awaitAvailable(VolumeApi volumeApi) {
       StatusUpdatedPredicate statusPredicate = new StatusUpdatedPredicate(volumeApi, Volume.Status.AVAILABLE);
       return retry(statusPredicate, 600, 5, 5, SECONDS);
    }
-   
+
    /**
     * Wait until a Volume is In Use.
-    * 
-    * @param volumeApi The VolumeApi in the zone where your Volume resides.
+    *
+    * @param volumeApi The VolumeApi in the region where your Volume resides.
     * @return RetryablePredicate That will check the status every 5 seconds for a maxiumum of 10 minutes.
     */
    public static Predicate<Volume> awaitInUse(VolumeApi volumeApi) {
@@ -81,22 +81,22 @@ public class VolumePredicates {
 
    /**
     * Wait until a Volume no longer exists.
-    * 
-    * @param volumeApi The VolumeApi in the zone where your Volume resides.
-    * @return RetryablePredicate That will check the whether the Volume exists 
+    *
+    * @param volumeApi The VolumeApi in the region where your Volume resides.
+    * @return RetryablePredicate That will check the whether the Volume exists
     * every 5 seconds for a maxiumum of 10 minutes.
     */
    public static Predicate<Volume> awaitDeleted(VolumeApi volumeApi) {
       DeletedPredicate deletedPredicate = new DeletedPredicate(volumeApi);
       return retry(deletedPredicate, 600, 5, 5, SECONDS);
    }
-   
+
    public static Predicate<Volume> awaitStatus(
          VolumeApi volumeApi, Volume.Status status, long maxWaitInSec, long periodInSec) {
       StatusUpdatedPredicate statusPredicate = new StatusUpdatedPredicate(volumeApi, status);
       return retry(statusPredicate, maxWaitInSec, periodInSec, periodInSec, SECONDS);
    }
-   
+
    private static class StatusUpdatedPredicate implements Predicate<Volume> {
       private VolumeApi volumeApi;
       private Status status;
@@ -112,14 +112,14 @@ public class VolumePredicates {
       @Override
       public boolean apply(Volume volume) {
          checkNotNull(volume, "volume must be defined");
-         
+
          if (status.equals(volume.getStatus())) {
             return true;
          }
          else {
             Volume volumeUpdated = volumeApi.get(volume.getId());
             checkNotNull(volumeUpdated, "Volume %s not found.", volume.getId());
-            
+
             return status.equals(volumeUpdated.getStatus());
          }
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiExpectTest.java b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiExpectTest.java
index 74ac6b9..e5dc3f9 100644
--- a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiExpectTest.java
+++ b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiExpectTest.java
@@ -16,15 +16,15 @@
  */
 package org.jclouds.openstack.cinder.v1.features;
 
+import static org.testng.Assert.assertEquals;
+
+import java.net.URI;
+
 import org.jclouds.http.HttpResponse;
 import org.jclouds.openstack.cinder.v1.domain.VolumeQuota;
 import org.jclouds.openstack.cinder.v1.internal.BaseCinderApiExpectTest;
 import org.testng.annotations.Test;
 
-import java.net.URI;
-
-import static org.testng.Assert.assertEquals;
-
 @Test(groups = "unit", testName = "QuotaApiExpectTest")
 public class QuotasApiExpectTest extends BaseCinderApiExpectTest {
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiLiveTest.java b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiLiveTest.java
index 9fea6cb..91ab647 100644
--- a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiLiveTest.java
+++ b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/QuotasApiLiveTest.java
@@ -16,15 +16,16 @@
  */
 package org.jclouds.openstack.cinder.v1.features;
 
-import com.google.common.collect.Iterables;
+import static org.testng.Assert.assertTrue;
+
+import java.util.concurrent.ExecutionException;
+
 import org.jclouds.openstack.cinder.v1.domain.VolumeQuota;
 import org.jclouds.openstack.cinder.v1.internal.BaseCinderApiLiveTest;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import java.util.concurrent.ExecutionException;
-
-import static org.testng.Assert.assertTrue;
+import com.google.common.collect.Iterables;
 
 @Test(groups = "live", testName = "QuotasApiLiveTest", singleThreaded = true)
 public class QuotasApiLiveTest extends BaseCinderApiLiveTest {
@@ -39,8 +40,8 @@ public class QuotasApiLiveTest extends BaseCinderApiLiveTest {
    @BeforeClass(groups = {"integration", "live"})
    public void setupContext() {
       super.setup();
-      String zone = Iterables.getFirst(api.getConfiguredZones(), "nova");
-      quotaApi = api.getQuotaApi(zone);
+      String region = Iterables.getFirst(api.getConfiguredRegions(), "nova");
+      quotaApi = api.getQuotaApi(region);
    }
 
    public void testGetStorageQuotas() throws ExecutionException, InterruptedException {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/SnapshotApiExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/SnapshotApiExpectTest.java b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/SnapshotApiExpectTest.java
index 9ab2e33..cda5ce8 100644
--- a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/SnapshotApiExpectTest.java
+++ b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/SnapshotApiExpectTest.java
@@ -56,7 +56,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/snapshot_list_simple.json")).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       Set<? extends Snapshot> snapshots = api.list().toSet();
       assertEquals(snapshots, ImmutableSet.of(testSnapshot()));
@@ -69,7 +69,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       Set<? extends Snapshot> snapshots = api.list().toSet();
       assertTrue(snapshots.isEmpty());
@@ -82,7 +82,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/snapshot_list_details.json")).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       Set<? extends Snapshot> snapshots = api.listInDetail().toSet();
       assertEquals(snapshots, ImmutableSet.of(testSnapshot()));
@@ -104,7 +104,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       Set<? extends Snapshot> snapshots = api.listInDetail().toSet();
       assertTrue(snapshots.isEmpty());
@@ -117,7 +117,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/snapshot_get.json")).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       Snapshot snapshot = api.get("67d03df1-ce5d-4ba7-adbe-492ceb80170b");
       assertEquals(snapshot, testSnapshot());
@@ -130,7 +130,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       assertNull(api.get("67d03df1-ce5d-4ba7-adbe-492ceb80170b"));
    }
@@ -145,7 +145,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
                   .payload(payloadFromResourceWithContentType("/snapshot_create.json", MediaType.APPLICATION_JSON))
                   .build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/snapshot_create_response.json")).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       CreateSnapshotOptions options = CreateSnapshotOptions.Builder
             .name("jclouds-test-snapshot")
@@ -167,7 +167,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
                   .payload(payloadFromResourceWithContentType("/snapshot_create.json", MediaType.APPLICATION_JSON))
                   .build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       CreateSnapshotOptions options = CreateSnapshotOptions.Builder
             .name("jclouds-test-snapshot")
@@ -193,7 +193,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
                         .wrap("{\"badRequest\": {\"message\": \"Invalid volume: must be available\", \"code\": 400}}"
                               .getBytes())))
                   .build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       CreateSnapshotOptions options = CreateSnapshotOptions.Builder
             .name("jclouds-test-snapshot")
@@ -214,7 +214,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
                   .payload(payloadFromResourceWithContentType("/snapshot_create.json", MediaType.APPLICATION_JSON))
                   .build(),
             HttpResponse.builder().statusCode(401).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       CreateSnapshotOptions options = CreateSnapshotOptions.Builder
             .name("jclouds-test-snapshot")
@@ -231,7 +231,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).method("DELETE").build(),
             HttpResponse.builder().statusCode(200).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       assertTrue(api.delete("67d03df1-ce5d-4ba7-adbe-492ceb80170b"));
    }
@@ -244,7 +244,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).method("DELETE").build(),
             HttpResponse.builder().statusCode(401).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       api.delete("67d03df1-ce5d-4ba7-adbe-492ceb80170b");
    }
@@ -256,7 +256,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).method("DELETE").build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       assertFalse(api.delete("67d03df1-ce5d-4ba7-adbe-492ceb80170b"));
    }
@@ -274,7 +274,7 @@ public class SnapshotApiExpectTest extends BaseCinderApiExpectTest {
                         .wrap("{\"badRequest\": {\"message\": \"Invalid volume: Volume Snapshot status must be available or error\", \"code\": 400}}"
                               .getBytes())))
                   .build()
-      ).getSnapshotApiForZone("RegionOne");
+      ).getSnapshotApi("RegionOne");
 
       api.delete("67d03df1-ce5d-4ba7-adbe-492ceb80170b");
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java
index 050253b..8e2dbe0 100644
--- a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java
+++ b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeAndSnapshotApiLiveTest.java
@@ -42,12 +42,12 @@ import com.google.common.collect.Iterables;
 @Test(groups = "live", testName = "VolumeApiLiveTest", singleThreaded = true)
 public class VolumeAndSnapshotApiLiveTest extends BaseCinderApiLiveTest {
    private static final String name = System.getProperty("user.name").replace('.', '-').toLowerCase();
-   
-   private String zone;
+
+   private String region;
 
    private VolumeApi volumeApi;
    private SnapshotApi snapshotApi;
-   
+
    private Volume testVolume;
    private Snapshot testSnapshot;
 
@@ -55,9 +55,9 @@ public class VolumeAndSnapshotApiLiveTest extends BaseCinderApiLiveTest {
    @Override
    public void setup() {
       super.setup();
-      zone = Iterables.getLast(api.getConfiguredZones(), "nova");
-      volumeApi = api.getVolumeApiForZone(zone);
-      snapshotApi = api.getSnapshotApiForZone(zone);
+      region = Iterables.getLast(api.getConfiguredRegions(), "nova");
+      volumeApi = api.getVolumeApi(region);
+      snapshotApi = api.getSnapshotApi(region);
    }
 
    @AfterClass(groups = { "integration", "live" })
@@ -81,7 +81,7 @@ public class VolumeAndSnapshotApiLiveTest extends BaseCinderApiLiveTest {
             .name(name)
             .description("description of test volume");
       testVolume = volumeApi.create(100, options);
-      
+
       assertTrue(VolumePredicates.awaitAvailable(volumeApi).apply(testVolume));
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeApiExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeApiExpectTest.java b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeApiExpectTest.java
index 336d09b..0372dd5 100644
--- a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeApiExpectTest.java
+++ b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeApiExpectTest.java
@@ -53,7 +53,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess, 
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_list_simple.json")).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       Set<? extends Volume> volumes = api.list().toSet();
       assertEquals(volumes, ImmutableSet.of(testVolume()));
@@ -66,7 +66,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess, 
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       Set<? extends Volume> volumes = api.list().toSet();
       assertTrue(volumes.isEmpty());
@@ -79,7 +79,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_list_details.json")).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       Set<? extends Volume> volumes = api.listInDetail().toSet();
       assertEquals(volumes, ImmutableSet.of(testVolume()));
@@ -92,7 +92,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       Set<? extends Volume> volumes = api.listInDetail().toSet();
       assertTrue(volumes.isEmpty());
@@ -108,7 +108,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
                   .payload(payloadFromResourceWithContentType("/volume_create.json", MediaType.APPLICATION_JSON))
                   .build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_create_response.json")).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       CreateVolumeOptions options = CreateVolumeOptions.Builder
             .name("jclouds-test-volume")
@@ -129,7 +129,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
                   .payload(payloadFromResourceWithContentType("/volume_create.json", MediaType.APPLICATION_JSON))
                .build(),
             HttpResponse.builder().statusCode(404).payload(payloadFromResource("/volume_create_response.json")).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       CreateVolumeOptions options = CreateVolumeOptions.Builder
             .name("jclouds-test-volume")
@@ -144,7 +144,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_get.json")).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       Volume volume = api.get("60761c60-0f56-4499-b522-ff13e120af10");
       assertEquals(volume, testVolume());
@@ -163,7 +163,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       assertNull(api.get("60761c60-0f56-4499-b522-ff13e120af10"));
    }
@@ -175,7 +175,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).method("DELETE").build(),
             HttpResponse.builder().statusCode(202).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       assertTrue(api.delete("60761c60-0f56-4499-b522-ff13e120af10"));
    }
@@ -187,7 +187,7 @@ public class VolumeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).method("DELETE").build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getVolumeApiForZone("RegionOne");
+      ).getVolumeApi("RegionOne");
 
       assertFalse(api.delete("60761c60-0f56-4499-b522-ff13e120af10"));
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiExpectTest.java b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiExpectTest.java
index 29c4713..d8c8b92 100644
--- a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiExpectTest.java
+++ b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiExpectTest.java
@@ -46,7 +46,7 @@ public class VolumeTypeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_type_list_simple.json")).build()
-      ).getVolumeTypeApiForZone("RegionOne");
+      ).getVolumeTypeApi("RegionOne");
 
       Set<? extends VolumeType> types = api.list().toSet();
       assertEquals(types, ImmutableSet.of(testVolumeType()));
@@ -59,7 +59,7 @@ public class VolumeTypeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/volume_type_get.json")).build()
-      ).getVolumeTypeApiForZone("RegionOne");
+      ).getVolumeTypeApi("RegionOne");
 
       VolumeType type = api.get("1");
       assertEquals(type, testVolumeType());
@@ -72,7 +72,7 @@ public class VolumeTypeApiExpectTest extends BaseCinderApiExpectTest {
             responseWithKeystoneAccess,
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(404).build()
-      ).getVolumeTypeApiForZone("RegionOne");
+      ).getVolumeTypeApi("RegionOne");
 
       assertNull(api.get("X"));
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiLiveTest.java b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiLiveTest.java
index 6eb1e48..bbb18fc 100644
--- a/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiLiveTest.java
+++ b/apis/openstack-cinder/src/test/java/org/jclouds/openstack/cinder/v1/features/VolumeTypeApiLiveTest.java
@@ -34,14 +34,14 @@ import com.google.common.collect.Iterables;
 @Test(groups = "live", testName = "VolumeTypeApiLiveTest", singleThreaded = true)
 public class VolumeTypeApiLiveTest extends BaseCinderApiLiveTest {
    private VolumeTypeApi volumeTypeApi;
-   private String zone;
+   private String region;
 
    @BeforeGroups(groups = {"integration", "live"})
    @Override
    public void setup() {
       super.setup();
-      zone = Iterables.getLast(api.getConfiguredZones(), "nova");
-      volumeTypeApi = api.getVolumeTypeApiForZone(zone);
+      region = Iterables.getLast(api.getConfiguredRegions(), "nova");
+      volumeTypeApi = api.getVolumeTypeApi(region);
    }
 
    @AfterClass(groups = { "integration", "live" })

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneAuthenticationModule.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneAuthenticationModule.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneAuthenticationModule.java
index 70479c7..eaff908 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneAuthenticationModule.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneAuthenticationModule.java
@@ -80,7 +80,7 @@ public class KeystoneAuthenticationModule extends AbstractModule {
     * <li>add the above annotation to any {@link AsyncApi} classes by placing it on the type. ex.
     * {@code @Endpoint(CloudDNS.class)}</li>
     * <li>add the following to your {@link org.jclouds.rest.config.RestClientModule}</li>
-    * 
+    *
     * <pre>
     * bind(new TypeLiteral&lt;Supplier&lt;URI&gt;&gt;() {
     * }).annotatedWith(CloudDNS.class).to(new TypeLiteral&lt;Supplier&lt;URI&gt;&gt;() {
@@ -148,6 +148,11 @@ public class KeystoneAuthenticationModule extends AbstractModule {
 
    }
 
+   /**
+    * @deprecated All OpenStack APIs rely on regions in jclouds 2.0 and this module will be removed
+    *             in jclouds 3.0.
+    */
+   @Deprecated
    public static class ZoneModule extends AbstractModule {
       @Override
       protected void configure() {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java
index 62fde44..691d044 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java
@@ -106,7 +106,7 @@ public class KeystoneHttpApiModule extends HttpApiModule<KeystoneApi> {
 
    @Provides
    @Singleton
-   public LoadingCache<String, Set<? extends Extension>> provideExtensionsByZone(final javax.inject.Provider<KeystoneApi> keystoneApi) {
+   public LoadingCache<String, Set<? extends Extension>> provideExtensionsByRegion(final javax.inject.Provider<KeystoneApi> keystoneApi) {
       return CacheBuilder.newBuilder().expireAfterWrite(23, TimeUnit.HOURS)
             .build(CacheLoader.from(Suppliers.memoize(new Supplier<Set<? extends Extension>>() {
                @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneRestClientModule.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneRestClientModule.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneRestClientModule.java
index fe85de2..4824edf 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneRestClientModule.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneRestClientModule.java
@@ -148,7 +148,7 @@ public class KeystoneRestClientModule<S extends KeystoneApi, A extends KeystoneA
 
    @Provides
    @Singleton
-   public LoadingCache<String, Set<? extends Extension>> provideExtensionsByZone(final javax.inject.Provider<KeystoneApi> keystoneApi) {
+   public LoadingCache<String, Set<? extends Extension>> provideExtensionsByRegion(final javax.inject.Provider<KeystoneApi> keystoneApi) {
       return CacheBuilder.newBuilder().expireAfterWrite(23, TimeUnit.HOURS)
             .build(CacheLoader.from(Suppliers.memoize(new Supplier<Set<? extends Extension>>() {
                @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/744cd5d7/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java
index 08160bb..624a0bd 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java
@@ -54,7 +54,7 @@ public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensio
             "Keypair Support").build();
 
    @org.jclouds.openstack.v2_0.services.Extension(of = ServiceType.COMPUTE, namespace = "http://docs.openstack.org/ext/keypairs/api/v1.1")
-   interface KeyPairAsyncApi {
+   interface KeyPairApi {
 
    }
 
@@ -64,50 +64,50 @@ public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensio
             "Floating IPs support").build();
 
    @org.jclouds.openstack.v2_0.services.Extension(of = ServiceType.COMPUTE, namespace = "http://docs.openstack.org/ext/floating_ips/api/v1.1")
-   interface FloatingIPAsyncApi {
+   interface FloatingIPApi {
 
    }
 
-   interface NovaAsyncApi {
+   interface NovaApi {
 
       @Delegate
-      Optional<FloatingIPAsyncApi> getFloatingIPExtensionForZone(String zone);
+      Optional<FloatingIPApi> getFloatingIPExtensionApi(String region);
 
       @Delegate
-      Optional<KeyPairAsyncApi> getKeyPairExtensionForZone(String zone);
+      Optional<KeyPairApi> getKeyPairExtensionApi(String region);
 
    }
 
    InvocationSuccess getFloatingIPExtension(List<Object> args) throws SecurityException, NoSuchMethodException {
       return InvocationSuccess.create(
-            Invocation.create(method(NovaAsyncApi.class, "getFloatingIPExtensionForZone", String.class), args), "foo");
+            Invocation.create(method(NovaApi.class, "getFloatingIPExtensionApi", String.class), args), "foo");
    }
 
    InvocationSuccess getKeyPairExtension(List<Object> args) throws SecurityException, NoSuchMethodException {
       return InvocationSuccess.create(
-            Invocation.create(method(NovaAsyncApi.class, "getKeyPairExtensionForZone", String.class), args), "foo");
+            Invocation.create(method(NovaApi.class, "getKeyPairExtensionApi", String.class), args), "foo");
    }
 
    public void testPresentWhenExtensionsIncludeNamespaceFromAnnotationAbsentWhenNot() throws SecurityException, NoSuchMethodException {
 
-      assertEquals(whenExtensionsInZoneInclude("zone", keypairs, floatingIps).apply(getFloatingIPExtension(ImmutableList.<Object> of("zone"))), Optional.of("foo"));
-      assertEquals(whenExtensionsInZoneInclude("zone", keypairs, floatingIps).apply(getKeyPairExtension(ImmutableList.<Object> of("zone"))), Optional.of("foo"));
-      assertEquals(whenExtensionsInZoneInclude("zone", keypairs).apply(getFloatingIPExtension(ImmutableList.<Object> of("zone"))), Optional.absent());
-      assertEquals(whenExtensionsInZoneInclude("zone", floatingIps).apply(getKeyPairExtension(ImmutableList.<Object> of("zone"))), Optional.absent());
+      assertEquals(whenExtensionsInRegionInclude("region", keypairs, floatingIps).apply(getFloatingIPExtension(ImmutableList.<Object> of("region"))), Optional.of("foo"));
+      assertEquals(whenExtensionsInRegionInclude("region", keypairs, floatingIps).apply(getKeyPairExtension(ImmutableList.<Object> of("region"))), Optional.of("foo"));
+      assertEquals(whenExtensionsInRegionInclude("region", keypairs).apply(getFloatingIPExtension(ImmutableList.<Object> of("region"))), Optional.absent());
+      assertEquals(whenExtensionsInRegionInclude("region", floatingIps).apply(getKeyPairExtension(ImmutableList.<Object> of("region"))), Optional.absent());
    }
-   
-   public void testZoneWithoutExtensionsReturnsAbsent() throws SecurityException, NoSuchMethodException {
-      assertEquals(whenExtensionsInZoneInclude("zone", floatingIps).apply(
-               getFloatingIPExtension(ImmutableList.<Object> of("differentzone"))), Optional.absent());
-      assertEquals(whenExtensionsInZoneInclude("zone", keypairs).apply(
-               getKeyPairExtension(ImmutableList.<Object> of("differentzone"))), Optional.absent());
+
+   public void testRegionWithoutExtensionsReturnsAbsent() throws SecurityException, NoSuchMethodException {
+      assertEquals(whenExtensionsInRegionInclude("region", floatingIps).apply(
+               getFloatingIPExtension(ImmutableList.<Object> of("differentregion"))), Optional.absent());
+      assertEquals(whenExtensionsInRegionInclude("region", keypairs).apply(
+               getKeyPairExtension(ImmutableList.<Object> of("differentregion"))), Optional.absent());
    }
 
    /**
     * It is possible that the /extensions call returned the correct extension, but that the
     * namespaces were different, for whatever reason. One way to address this is to have a multimap
     * of the authoritative namespace to alternate onces, which could be wired up with guice
-    * 
+    *
     */
    public void testPresentWhenAliasForExtensionMapsToNamespace() throws SecurityException, NoSuchMethodException {
       Extension keypairsWithDifferentNamespace = keypairs.toBuilder().namespace(
@@ -116,22 +116,22 @@ public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensio
       Multimap<URI, URI> aliases = ImmutableMultimap.of(keypairs.getNamespace(), keypairsWithDifferentNamespace
                .getNamespace());
 
-      assertEquals(whenExtensionsAndAliasesInZoneInclude("zone", ImmutableSet.of(keypairsWithDifferentNamespace), aliases).apply(
-              getKeyPairExtension(ImmutableList.<Object> of("zone"))), Optional.of("foo"));
-      assertEquals(whenExtensionsAndAliasesInZoneInclude("zone", ImmutableSet.of(keypairsWithDifferentNamespace), aliases).apply(
-              getFloatingIPExtension(ImmutableList.<Object> of("zone"))), Optional.absent());
+      assertEquals(whenExtensionsAndAliasesInRegionInclude("region", ImmutableSet.of(keypairsWithDifferentNamespace), aliases).apply(
+              getKeyPairExtension(ImmutableList.<Object> of("region"))), Optional.of("foo"));
+      assertEquals(whenExtensionsAndAliasesInRegionInclude("region", ImmutableSet.of(keypairsWithDifferentNamespace), aliases).apply(
+              getFloatingIPExtension(ImmutableList.<Object> of("region"))), Optional.absent());
 
    }
 
-   private PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet whenExtensionsInZoneInclude(
-            String zone, Extension... extensions) {
-      return whenExtensionsAndAliasesInZoneInclude(zone, ImmutableSet.copyOf(extensions), ImmutableMultimap.<URI, URI> of());
+   private PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet whenExtensionsInRegionInclude(
+            String region, Extension... extensions) {
+      return whenExtensionsAndAliasesInRegionInclude(region, ImmutableSet.copyOf(extensions), ImmutableMultimap.<URI, URI> of());
    }
 
-   private PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet whenExtensionsAndAliasesInZoneInclude(
-            String zone, final Set<Extension> extensions, final Multimap<URI, URI> aliases) {
-      final LoadingCache<String, Set<? extends Extension>> extensionsForZone = CacheBuilder.newBuilder().build(
-               CacheLoader.from(Functions.forMap(ImmutableMap.<String, Set<? extends Extension>>of(zone, extensions, "differentzone",
+   private PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet whenExtensionsAndAliasesInRegionInclude(
+            String region, final Set<Extension> extensions, final Multimap<URI, URI> aliases) {
+      final LoadingCache<String, Set<? extends Extension>> extensionsForRegion = CacheBuilder.newBuilder().build(
+               CacheLoader.from(Functions.forMap(ImmutableMap.<String, Set<? extends Extension>>of(region, extensions, "differentregion",
                         ImmutableSet.<Extension> of()))));
 
       PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet fn = Guice.createInjector(
@@ -142,7 +142,7 @@ public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensio
 
                   @Provides
                   LoadingCache<String, Set<? extends Extension>> getExtensions() {
-                     return extensionsForZone;
+                     return extensionsForRegion;
                   }
 
                   @Provides
@@ -150,7 +150,7 @@ public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensio
                      return aliases;
                   }
                }).getInstance(PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.class);
-      
+
       return fn;
    }
 }