You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2018/01/09 10:59:33 UTC

jclouds git commit: Proper configuration for Mock and Live tests

Repository: jclouds
Updated Branches:
  refs/heads/apache-keystone3 930c0fe84 -> cf0c70df2


Proper configuration for Mock and Live tests


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

Branch: refs/heads/apache-keystone3
Commit: cf0c70df2d3a697fe942c6bfbabd4e17d2b49543
Parents: 930c0fe
Author: Ignasi Barrera <na...@apache.org>
Authored: Tue Jan 9 11:59:11 2018 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Jan 9 11:59:11 2018 +0100

----------------------------------------------------------------------
 .../catalog/config/KeystoneAdminURLModule.java  |  9 +++-
 .../keystone/v3/KeystoneApiMetadata.java        |  6 +--
 .../openstack/keystone/v3/features/AuthApi.java |  2 +-
 .../v2_0/extensions/RoleAdminApiLiveTest.java   |  2 +-
 .../extensions/ServiceAdminApiLiveTest.java     |  2 +-
 .../v2_0/extensions/TenantAdminApiLiveTest.java |  2 +-
 .../v2_0/extensions/UserAdminApiLiveTest.java   |  2 +-
 .../v3/auth/V3AuthenticationApiLiveTest.java    | 34 ++++--------
 .../v3/auth/V3AuthenticationApiMockTest.java    | 57 ++++++++++++++++----
 .../keystone/v3/features/AuthApiLiveTest.java   | 20 ++-----
 .../keystone/v3/features/AuthApiMockTest.java   | 22 ++++----
 .../v3/features/CatalogApiLiveTest.java         |  9 ----
 .../v3/features/CatalogApiMockTest.java         | 25 +++++----
 .../v3/internal/BaseV3KeystoneApiLiveTest.java  | 40 +++++++++-----
 .../v3/internal/BaseV3KeystoneApiMockTest.java  | 33 +++++++++---
 .../src/test/resources/logback.xml              |  2 +-
 .../test/resources/v3/auth-password-scoped.json | 23 ++++++++
 .../src/test/resources/v3/auth-password.json    | 18 +++++++
 .../test/resources/v3/auth-token-scoped.json    | 17 ++++++
 .../src/test/resources/v3/auth-token.json       | 12 +++++
 .../src/test/resources/v3/token.json            | 12 ++++-
 21 files changed, 235 insertions(+), 114 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/catalog/config/KeystoneAdminURLModule.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/catalog/config/KeystoneAdminURLModule.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/catalog/config/KeystoneAdminURLModule.java
index 6f357c0..391f14d 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/catalog/config/KeystoneAdminURLModule.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/catalog/config/KeystoneAdminURLModule.java
@@ -53,8 +53,13 @@ public class KeystoneAdminURLModule extends AbstractModule {
    @Identity
    protected final Supplier<URI> provideIdentityAdminUrl(final RegionIdToAdminURISupplier.Factory factory,
             @ApiVersion final String version, @Provider final Supplier<URI> providerURI) {
-      Supplier<URI> identityServiceForVersion = getLastValueInMap(factory.createForApiTypeAndVersion(
-               ServiceType.IDENTITY, version));
+      // There is a convention to use service types such as "identityv3" for specific endpoints. let's look first for
+      // those endpoints, and fallback to the default "identity" one or the project URL.
+      Supplier<URI> identityServiceForSpecificVersionInType = getLastValueInMap(factory.createForApiTypeAndVersion(
+            ServiceType.IDENTITY + "v" + version, version));
+      Supplier<URI> identityServiceForVersion = Suppliers2.onThrowable(identityServiceForSpecificVersionInType,
+            NoSuchElementException.class,
+            getLastValueInMap(factory.createForApiTypeAndVersion(ServiceType.IDENTITY, version)));
       Supplier<URI> whenIdentityServiceIsntListedFallbackToProviderURI = Suppliers2.onThrowable(
                identityServiceForVersion, NoSuchElementException.class, providerURI);
       Supplier<URI> whenIdentityServiceHasNoAdminURLFallbackToProviderURI = Suppliers2.or(

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/KeystoneApiMetadata.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/KeystoneApiMetadata.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/KeystoneApiMetadata.java
index 37da75a..dc360d9 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/KeystoneApiMetadata.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/KeystoneApiMetadata.java
@@ -67,12 +67,12 @@ public class KeystoneApiMetadata extends BaseHttpApiMetadata<KeystoneApi> {
       protected Builder() {
           id("openstack-keystone-3")
          .name("OpenStack Keystone 3.x API")
-         .identityName("${tenantName}:${userName} or ${userName}, if your keystone supports a default tenant")
+         .identityName("${projectName}:${userName} or ${userName}, if your keystone supports a default project")
          .credentialName("${password}")
-         .endpointName("Keystone base url ending in /v${jclouds.api-version}/")
+         .endpointName("Keystone V3 base URL")
          .documentation(URI.create("http://api.openstack.org/"))
          .version("3")
-         .defaultEndpoint("http://localhost:5000/v${jclouds.api-version}/")
+         .defaultEndpoint("http://localhost/identity/v3")
          .defaultProperties(KeystoneApiMetadata.defaultProperties())
          .defaultModules(ImmutableSet.<Class<? extends Module>>builder()
                                      .add(AuthenticationModule.class)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/AuthApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/AuthApi.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/AuthApi.java
index c9896f7..50fe55c 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/AuthApi.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/AuthApi.java
@@ -76,7 +76,7 @@ public interface AuthApi {
    @Named("token:check")
    @HEAD
    @Path("/tokens")
-   @Headers( keys = "X-Subject-Token", values = "{token}")
+   @Headers(keys = "X-Subject-Token", values = "{token}")
    @Fallback(FalseOnNotFoundOr404.class)
    boolean isValid(@PathParam("token") String token);
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/RoleAdminApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/RoleAdminApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/RoleAdminApiLiveTest.java
index accdf9b..01b7f8d 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/RoleAdminApiLiveTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/RoleAdminApiLiveTest.java
@@ -59,7 +59,7 @@ public class RoleAdminApiLiveTest extends BaseKeystoneApiLiveTest {
    protected void tearDown() {
       if (testRole != null) {
          final String roleId = testRole.getId();
-         boolean success = roleAdminOption.get().delete(roleId);
+         assertTrue(roleAdminOption.get().delete(roleId));
          assertTrue(retry(new Predicate<RoleAdminApi>() {
             public boolean apply(RoleAdminApi roleApi) {
                return roleApi.get(roleId) == null;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/ServiceAdminApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/ServiceAdminApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/ServiceAdminApiLiveTest.java
index e999816..a83bed1 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/ServiceAdminApiLiveTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/ServiceAdminApiLiveTest.java
@@ -59,7 +59,7 @@ public class ServiceAdminApiLiveTest extends BaseKeystoneApiLiveTest {
    protected void tearDown() {
       if (testService != null) {
          final String serviceId = testService.getId();
-         boolean success = serviceAdminOption.get().delete(serviceId);
+         assertTrue(serviceAdminOption.get().delete(serviceId));
          assertTrue(retry(new Predicate<ServiceAdminApi>() {
             public boolean apply(ServiceAdminApi serviceApi) {
                return serviceApi.get(serviceId) == null;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/TenantAdminApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/TenantAdminApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/TenantAdminApiLiveTest.java
index b679579..cc7f8eb 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/TenantAdminApiLiveTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/TenantAdminApiLiveTest.java
@@ -61,7 +61,7 @@ public class TenantAdminApiLiveTest extends BaseKeystoneApiLiveTest {
    protected void tearDown() {
       if (testTenant != null) {
          final String tenantId = testTenant.getId();
-         boolean success = tenantAdminOption.get().delete(tenantId);
+         assertTrue(tenantAdminOption.get().delete(tenantId));
          assertTrue(retry(new Predicate<TenantApi>() {
             public boolean apply(TenantApi tenantApi) {
                return tenantApi.get(tenantId) == null;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/UserAdminApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/UserAdminApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/UserAdminApiLiveTest.java
index 152cc92..3859bdf 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/UserAdminApiLiveTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v2_0/extensions/UserAdminApiLiveTest.java
@@ -60,7 +60,7 @@ public class UserAdminApiLiveTest extends BaseKeystoneApiLiveTest {
    protected void tearDown() {
       if (testUser != null) {
          final String userId = testUser.getId();
-         boolean success = userAdminOption.get().delete(userId);
+         assertTrue(userAdminOption.get().delete(userId));
          assertTrue(retry(new Predicate<UserApi>() {
             public boolean apply(UserApi userApi) {
                return userApi.get(userId) == null;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiLiveTest.java
index d8a137e..605134d 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiLiveTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiLiveTest.java
@@ -18,52 +18,40 @@ package org.jclouds.openstack.keystone.v3.auth;
 
 import static org.testng.Assert.assertNotNull;
 
-import org.jclouds.openstack.keystone.auth.AuthenticationApi;
+import java.util.Properties;
+
 import org.jclouds.openstack.keystone.auth.domain.PasswordCredentials;
 import org.jclouds.openstack.keystone.auth.domain.TenantAndCredentials;
 import org.jclouds.openstack.keystone.auth.domain.TokenCredentials;
-import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
-import org.jclouds.openstack.keystone.v3.KeystoneApi;
 import org.jclouds.openstack.keystone.v3.internal.BaseV3KeystoneApiLiveTest;
-import org.jclouds.rest.ApiContext;
-import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Splitter;
 import com.google.common.collect.Iterables;
-import com.google.common.reflect.TypeToken;
 
 @Test(groups = "live", testName = "V3AuthenticationApiLiveTest")
 public class V3AuthenticationApiLiveTest extends BaseV3KeystoneApiLiveTest {
 
    private String tenant;
    private String user;
-   private ApiContext<KeystoneApi> context;
 
-   @BeforeClass
-   public void parseCredentials() {
+   @Override
+   protected Properties setupProperties() {
+      Properties properties = super.setupProperties();
       tenant = Iterables.get(Splitter.on(":").split(identity), 0);
       user = Iterables.get(Splitter.on(":").split(identity), 1);
-      context = newBuilder().modules(setupModules()).overrides(setupProperties())
-            .build(new TypeToken<ApiContext<KeystoneApi>>() {
-               private static final long serialVersionUID = 1L;
-            });
-
-      grabToken(context.utils().injector().getInstance(AuthenticateRequest.class));
+      return properties;
    }
 
    public void testAuthenticatePassword() {
-      assertNotNull(api().authenticatePassword(TenantAndCredentials.<PasswordCredentials> builder().tenantName(tenant)
-            .credentials(PasswordCredentials.builder().username(user).password(credential).build()).build()));
+      assertNotNull(authenticationApi.authenticatePassword(TenantAndCredentials.<PasswordCredentials> builder()
+            .tenantName(tenant).credentials(PasswordCredentials.builder().username(user).password(credential).build())
+            .build()));
    }
 
    public void testAuthenticateToken() {
-      assertNotNull(api().authenticateToken(TenantAndCredentials.<TokenCredentials> builder().tenantName(tenant)
-            .credentials(TokenCredentials.builder().id(token).build()).build()));
-   }
-
-   protected AuthenticationApi api() {
-      return context.utils().injector().getInstance(AuthenticationApi.class);
+      assertNotNull(authenticationApi.authenticateToken(TenantAndCredentials.<TokenCredentials> builder()
+            .tenantName(tenant).credentials(TokenCredentials.builder().id(token.get()).build()).build()));
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiMockTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiMockTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiMockTest.java
index 4f7f2cd..c355e28 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiMockTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/auth/V3AuthenticationApiMockTest.java
@@ -17,7 +17,6 @@
 package org.jclouds.openstack.keystone.v3.auth;
 
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
 import org.jclouds.openstack.keystone.auth.domain.AuthInfo;
@@ -28,35 +27,73 @@ import org.jclouds.openstack.keystone.v3.domain.Token;
 import org.jclouds.openstack.keystone.v3.internal.BaseV3KeystoneApiMockTest;
 import org.testng.annotations.Test;
 
-import com.google.common.reflect.TypeToken;
-
-import java.util.Map;
-
-@Test(groups = "unit", testName = "TokenApiMockTest", singleThreaded = true)
+@Test(groups = "unit", testName = "V3AuthenticationApiMockTest", singleThreaded = true)
 public class V3AuthenticationApiMockTest extends BaseV3KeystoneApiMockTest {
 
    public void testAuthenticatePassword() throws InterruptedException {
       server.enqueue(jsonResponse("/v3/token.json"));
 
-      AuthInfo authInfo = authenticationApi.authenticatePassword(TenantAndCredentials.<PasswordCredentials>builder().credentials(PasswordCredentials.builder().username("user").password("pwd").build()).build());
+      TenantAndCredentials<PasswordCredentials> credentials = TenantAndCredentials.<PasswordCredentials> builder()
+            .tenantName("project")
+            .credentials(PasswordCredentials.builder().username("identity").password("credential").build()).build();
+      
+      AuthInfo authInfo = authenticationApi.authenticatePassword(credentials);
+
+      assertTrue(authInfo instanceof Token);
+      assertEquals(authInfo, tokenFromResource("/v3/token.json"));
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "POST", "/auth/tokens", stringFromResource("/v3/auth-password.json"));
+   }
+   
+   public void testAuthenticatePasswordScoped() throws InterruptedException {
+      server.enqueue(jsonResponse("/v3/token.json"));
+
+      TenantAndCredentials<PasswordCredentials> credentials = TenantAndCredentials.<PasswordCredentials> builder()
+            .tenantName("project")
+            .scope("project:1234567890")
+            .credentials(PasswordCredentials.builder().username("identity").password("credential").build()).build();
+      
+      AuthInfo authInfo = authenticationApi.authenticatePassword(credentials);
 
       assertTrue(authInfo instanceof Token);
       assertEquals(authInfo, tokenFromResource("/v3/token.json"));
 
       assertEquals(server.getRequestCount(), 1);
-      assertSent(server, "POST", "/auth/tokens");
+      assertSent(server, "POST", "/auth/tokens", stringFromResource("/v3/auth-password-scoped.json"));
    }
 
    public void testAuthenticateToken() throws InterruptedException {
       server.enqueue(jsonResponse("/v3/token.json"));
 
-      AuthInfo authInfo = authenticationApi.authenticateToken(TenantAndCredentials.<TokenCredentials>builder().credentials(TokenCredentials.builder().id("token").build()).build());
+      TenantAndCredentials<TokenCredentials> credentials = TenantAndCredentials.<TokenCredentials> builder()
+            .tenantName("project")
+            .credentials(TokenCredentials.builder().id("token").build()).build();
+      
+      AuthInfo authInfo = authenticationApi.authenticateToken(credentials);
+
+      assertTrue(authInfo instanceof Token);
+      assertEquals(authInfo, tokenFromResource("/v3/token.json"));
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "POST", "/auth/tokens", stringFromResource("/v3/auth-token.json"));
+   }
+   
+   public void testAuthenticateTokenScoped() throws InterruptedException {
+      server.enqueue(jsonResponse("/v3/token.json"));
+
+      TenantAndCredentials<TokenCredentials> credentials = TenantAndCredentials.<TokenCredentials> builder()
+            .tenantName("project")
+            .scope("domain:mydomain")
+            .credentials(TokenCredentials.builder().id("token").build()).build();
+      
+      AuthInfo authInfo = authenticationApi.authenticateToken(credentials);
 
       assertTrue(authInfo instanceof Token);
       assertEquals(authInfo, tokenFromResource("/v3/token.json"));
 
       assertEquals(server.getRequestCount(), 1);
-      assertSent(server, "POST", "/auth/tokens");
+      assertSent(server, "POST", "/auth/tokens", stringFromResource("/v3/auth-token-scoped.json"));
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiLiveTest.java
index 325c0ae..2cfef51 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiLiveTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiLiveTest.java
@@ -19,32 +19,18 @@ package org.jclouds.openstack.keystone.v3.features;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.Properties;
-
-import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
-import org.jclouds.openstack.keystone.v3.KeystoneApi;
 import org.jclouds.openstack.keystone.v3.internal.BaseV3KeystoneApiLiveTest;
 import org.testng.annotations.Test;
 
-import com.google.inject.Injector;
-import com.google.inject.Module;
-
-@Test(groups = "live", testName = "TokenApiLiveTest")
+@Test(groups = "live", testName = "AuthApiLiveTest")
 public class AuthApiLiveTest extends BaseV3KeystoneApiLiveTest {
 
-   @Override
-   protected KeystoneApi create(Properties props, Iterable<Module> modules) {
-      Injector injector = newBuilder().modules(modules).overrides(props).buildInjector();
-      grabToken(injector.getInstance(AuthenticateRequest.class));
-      return injector.getInstance(KeystoneApi.class);
-   }
-
    public void testIsTokenValid() {
-      assertTrue(api().isValid(token));
+      assertTrue(api().isValid(token.get()));
    }
 
    public void testGetToken() {
-      assertNotNull(api().get(token));
+      assertNotNull(api().get(token.get()));
    }
 
    private AuthApi api() {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiMockTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiMockTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiMockTest.java
index 216df80..87ca0b3 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiMockTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/AuthApiMockTest.java
@@ -23,32 +23,36 @@ import org.jclouds.openstack.keystone.v3.domain.Token;
 import org.jclouds.openstack.keystone.v3.internal.BaseV3KeystoneApiMockTest;
 import org.testng.annotations.Test;
 
-import com.google.common.reflect.TypeToken;
+import com.squareup.okhttp.mockwebserver.RecordedRequest;
 
 @Test(groups = "unit", testName = "AuthApiMockTest", singleThreaded = true)
 public class AuthApiMockTest extends BaseV3KeystoneApiMockTest {
 
    public void testGetToken() throws InterruptedException {
-      server.enqueue(jsonResponse("/v3/token.json").addHeader("X-Subject-Token", "bf583aefb74e45108346b4c1c8527a10"));
+      enqueueAuthentication(server);
+      server.enqueue(jsonResponse("/v3/token.json"));
 
-      Token token = api.getAuthApi().get("bf583aefb74e45108346b4c1c8527a10");
+      Token token = api.getAuthApi().get(authToken);
 
       assertEquals(token, tokenFromResource("/v3/token.json"));
 
-      assertEquals(server.getRequestCount(), 1);
-      assertSent(server, "GET", "/token/bf583aefb74e45108346b4c1c8527a10");
+      assertEquals(server.getRequestCount(), 2);
+      assertAuthentication(server);
+      RecordedRequest request = assertSent(server, "GET", "/auth/tokens");
+      assertEquals(request.getHeader("X-Subject-Token"), authToken);
    }
 
    public void testGetTokenReturns404() throws InterruptedException {
+      enqueueAuthentication(server);
       server.enqueue(response404());
 
-      Token token = api.getAuthApi().get("bf583aefb74e45108346b4c1c8527a10");
-
+      Token token = api.getAuthApi().get("foo");
       assertNull(token);
 
       assertEquals(server.getRequestCount(), 2);
-      assertSent(server, "POST", "/auth/tokens");
-      assertSent(server, "GET", "/token/bf583aefb74e45108346b4c1c8527a10");
+      assertAuthentication(server);
+      RecordedRequest request = assertSent(server, "GET", "/auth/tokens");
+      assertEquals(request.getHeader("X-Subject-Token"), "foo");
    }
    
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiLiveTest.java
index 3a74a75..63cd98c 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiLiveTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiLiveTest.java
@@ -18,22 +18,13 @@ package org.jclouds.openstack.keystone.v3.features;
 
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
 
 import java.util.List;
-import java.util.Properties;
-import java.util.Set;
 
-import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
-import org.jclouds.openstack.keystone.v2_0.domain.Tenant;
-import org.jclouds.openstack.keystone.v3.KeystoneApi;
 import org.jclouds.openstack.keystone.v3.domain.Endpoint;
 import org.jclouds.openstack.keystone.v3.internal.BaseV3KeystoneApiLiveTest;
 import org.testng.annotations.Test;
 
-import com.google.inject.Injector;
-import com.google.inject.Module;
-
 @Test(groups = "live", testName = "CatalogApiLiveTest")
 public class CatalogApiLiveTest extends BaseV3KeystoneApiLiveTest {
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiMockTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiMockTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiMockTest.java
index 9e43f1f..a8d8bf4 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiMockTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/CatalogApiMockTest.java
@@ -18,39 +18,38 @@ package org.jclouds.openstack.keystone.v3.features;
 
 import static com.google.common.collect.Iterables.size;
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
+
+import java.util.List;
 
 import org.jclouds.openstack.keystone.v3.domain.Endpoint;
-import org.jclouds.openstack.keystone.v3.domain.Token;
 import org.jclouds.openstack.keystone.v3.internal.BaseV3KeystoneApiMockTest;
 import org.testng.annotations.Test;
 
-import java.util.List;
-
 @Test(groups = "unit", testName = "CatalogApiMockTest", singleThreaded = true)
 public class CatalogApiMockTest extends BaseV3KeystoneApiMockTest {
 
    public void testListEndpoints() throws InterruptedException {
+      enqueueAuthentication(server);
       server.enqueue(jsonResponse("/v3/endpoints.json"));
 
       List<Endpoint> endpoints = api.getCatalogApi().endpoints();
-
       assertEquals(size(endpoints), 8);
+      
       assertEquals(server.getRequestCount(), 2);
-
+      assertAuthentication(server);
       assertSent(server, "GET", "/endpoints");
    }
 
-   public void testGetTokenReturns404() throws InterruptedException {
+   public void testListEndpointsReturns404() throws InterruptedException {
+      enqueueAuthentication(server);
       server.enqueue(response404());
 
-      Token token = api.getAuthApi().get("bf583aefb74e45108346b4c1c8527a10");
-
-      assertNull(token);
-
+      List<Endpoint> endpoints = api.getCatalogApi().endpoints();
+      assertEquals(endpoints.size(), 0);
+      
       assertEquals(server.getRequestCount(), 2);
-      assertSent(server, "POST", "/auth/tokens");
-      assertSent(server, "GET", "/token/bf583aefb74e45108346b4c1c8527a10");
+      assertAuthentication(server);
+      assertSent(server, "GET", "/endpoints");
    }
    
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiLiveTest.java
index f3a718a..d73c3cf 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiLiveTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiLiveTest.java
@@ -16,37 +16,49 @@
  */
 package org.jclouds.openstack.keystone.v3.internal;
 
+import static org.jclouds.openstack.keystone.config.KeystoneProperties.CREDENTIAL_TYPE;
+import static org.jclouds.openstack.keystone.config.KeystoneProperties.SERVICE_TYPE;
+
 import java.util.Properties;
 
-import com.google.common.collect.Iterables;
 import org.jclouds.apis.BaseApiLiveTest;
-import org.jclouds.http.HttpRequest;
-import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
-import org.jclouds.openstack.keystone.config.KeystoneProperties;
+import org.jclouds.openstack.keystone.auth.AuthenticationApi;
+import org.jclouds.openstack.keystone.auth.config.Authentication;
 import org.jclouds.openstack.keystone.v3.KeystoneApi;
+import org.jclouds.rest.ApiContext;
 
-import static org.jclouds.openstack.keystone.config.KeystoneProperties.SERVICE_TYPE;
+import com.google.common.base.Supplier;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
 
 public class BaseV3KeystoneApiLiveTest extends BaseApiLiveTest<KeystoneApi> {
 
-   protected String token;
+   protected Supplier<String> token;
+   protected AuthenticationApi authenticationApi;
 
    public BaseV3KeystoneApiLiveTest() {
       provider = "openstack-keystone-3";
    }
 
    @Override
+   protected KeystoneApi create(Properties props, Iterable<Module> modules) {
+      ApiContext<KeystoneApi> ctx = newBuilder().modules(modules).overrides(props).build();
+      authenticationApi = ctx.utils().injector().getInstance(AuthenticationApi.class);
+      token = ctx.utils().injector().getInstance(Key.get(new TypeLiteral<Supplier<String>>() {
+      }, Authentication.class));
+      return ctx.getApi();
+   }
+
+   @Override
    protected Properties setupProperties() {
       Properties props = super.setupProperties();
-      setIfTestSystemPropertyPresent(props, KeystoneProperties.CREDENTIAL_TYPE);
-      props.setProperty(SERVICE_TYPE, "identityv3");
+      setIfTestSystemPropertyPresent(props, CREDENTIAL_TYPE);
+      String customServiceType = setIfTestSystemPropertyPresent(props, SERVICE_TYPE);
+      if (customServiceType == null) {
+         props.setProperty(SERVICE_TYPE, "identityv3");
+      }
       return props;
    }
 
-   // Get the token currently in use
-   protected void grabToken(AuthenticateRequest ar) {
-      HttpRequest test = ar.filter(HttpRequest.builder().method("GET").endpoint(endpoint).build());
-      token = Iterables.getOnlyElement(test.getHeaders().get("X-Auth-Token"));
-   }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiMockTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiMockTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiMockTest.java
index 599a0e8..60fdb41 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiMockTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiMockTest.java
@@ -25,12 +25,14 @@ import java.io.IOException;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+import java.util.UUID;
 
 import org.jclouds.ContextBuilder;
 import org.jclouds.concurrent.config.ExecutorServiceModule;
 import org.jclouds.json.Json;
+import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
 import org.jclouds.openstack.keystone.auth.AuthenticationApi;
-import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.config.KeystoneProperties;
 import org.jclouds.openstack.keystone.v3.KeystoneApi;
 import org.jclouds.openstack.keystone.v3.KeystoneApiMetadata;
 import org.jclouds.openstack.keystone.v3.domain.Token;
@@ -53,11 +55,10 @@ public class BaseV3KeystoneApiMockTest {
    
    private static final String DEFAULT_ENDPOINT = new KeystoneApiMetadata().getDefaultEndpoint().orNull();
    
-   private final Set<Module> modules = ImmutableSet.<Module> of(new ExecutorServiceModule(newDirectExecutorService()));
-   
    protected MockWebServer server;
    protected KeystoneApi api;
    protected AuthenticationApi authenticationApi;
+   protected String authToken;
    private Json json;
    
    // So that we can ignore formatting.
@@ -67,10 +68,11 @@ public class BaseV3KeystoneApiMockTest {
    public void start() throws IOException {
       server = new MockWebServer();
       server.play();
+      
       ApiContext<KeystoneApi> ctx = ContextBuilder.newBuilder("openstack-keystone-3")
-              .credentials("identity", "credential")
+              .credentials("project:identity", "credential")
               .endpoint(url(""))
-              .modules(modules)
+              .modules(modules())
               .overrides(overrides())
               .build();
       json = ctx.utils().injector().getInstance(Json.class);
@@ -85,12 +87,27 @@ public class BaseV3KeystoneApiMockTest {
    }
    
    protected Properties overrides() {
-      return new Properties();
+      Properties overrides = new Properties();
+      overrides.setProperty(KeystoneProperties.SCOPE, "project:1234567890");
+      overrides.setProperty(KeystoneProperties.SERVICE_TYPE, "identityv3");
+      return overrides;
+   }
+   
+   protected Set<Module> modules() {
+      ImmutableSet.Builder<Module> modules = ImmutableSet.builder();
+      modules.add(new ExecutorServiceModule(newDirectExecutorService()));
+      modules.add(new SLF4JLoggingModule());
+      return modules.build();
    }
 
    protected String url(String path) {
       return server.getUrl(path).toString();
    }
+   
+   protected void enqueueAuthentication(MockWebServer server) {
+      authToken = UUID.randomUUID().toString();
+      server.enqueue(jsonResponse("/v3/token.json").addHeader("X-Subject-Token", authToken));
+   }
 
    protected MockResponse jsonResponse(String resource) {
       return new MockResponse().addHeader("Content-Type", "application/json").setBody(stringFromResource(resource));
@@ -126,6 +143,10 @@ public class BaseV3KeystoneApiMockTest {
       String text = stringFromResource(resourceName);
       return json.fromJson(text, type);
    }
+   
+   protected void assertAuthentication(MockWebServer server) throws InterruptedException {
+      assertSent(server, "POST", "/auth/tokens", stringFromResource("/v3/auth-password-scoped.json"));
+   }
 
    protected RecordedRequest assertSent(MockWebServer server, String method, String path) throws InterruptedException {
       RecordedRequest request = server.takeRequest();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/logback.xml b/apis/openstack-keystone/src/test/resources/logback.xml
index 4cf5016..5c37355 100644
--- a/apis/openstack-keystone/src/test/resources/logback.xml
+++ b/apis/openstack-keystone/src/test/resources/logback.xml
@@ -13,7 +13,7 @@
         </encoder>
     </appender>
     <appender name="COMPUTEFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/jclouds-compute.log</file>
+        <file>target/test-data/jclouds-compute.log</file>
         <encoder>
             <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
         </encoder>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/resources/v3/auth-password-scoped.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/auth-password-scoped.json b/apis/openstack-keystone/src/test/resources/v3/auth-password-scoped.json
new file mode 100644
index 0000000..48bfc9d
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/auth-password-scoped.json
@@ -0,0 +1,23 @@
+{
+    "auth": {
+        "identity": {
+            "methods": [
+                "password"
+            ],
+            "password": {
+                "user": {
+                    "name": "identity",
+                    "domain": {
+                        "name": "project"
+                    },
+                    "password": "credential"
+                }
+            }
+        },
+        "scope": {
+            "project": {
+                "id": "1234567890"
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/resources/v3/auth-password.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/auth-password.json b/apis/openstack-keystone/src/test/resources/v3/auth-password.json
new file mode 100644
index 0000000..6cb05a3
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/auth-password.json
@@ -0,0 +1,18 @@
+{
+    "auth": {
+        "identity": {
+            "methods": [
+                "password"
+            ],
+            "password": {
+                "user": {
+                    "name": "identity",
+                    "domain": {
+                        "name": "project"
+                    },
+                    "password": "credential"
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/resources/v3/auth-token-scoped.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/auth-token-scoped.json b/apis/openstack-keystone/src/test/resources/v3/auth-token-scoped.json
new file mode 100644
index 0000000..a1938a7
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/auth-token-scoped.json
@@ -0,0 +1,17 @@
+{
+    "auth": {
+        "identity": {
+            "methods": [
+                "token"
+            ],
+            "token": {
+                "id": "token"
+            }
+        },
+        "scope": {
+            "domain": {
+                "name": "mydomain"
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/resources/v3/auth-token.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/auth-token.json b/apis/openstack-keystone/src/test/resources/v3/auth-token.json
new file mode 100644
index 0000000..36096a2
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/auth-token.json
@@ -0,0 +1,12 @@
+{
+    "auth": {
+        "identity": {
+            "methods": [
+                "token"
+            ],
+            "token": {
+                "id": "token"
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cf0c70df/apis/openstack-keystone/src/test/resources/v3/token.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/token.json b/apis/openstack-keystone/src/test/resources/v3/token.json
index 20734d5..b7fa677 100644
--- a/apis/openstack-keystone/src/test/resources/v3/token.json
+++ b/apis/openstack-keystone/src/test/resources/v3/token.json
@@ -298,7 +298,7 @@
         "endpoints": [
           {
             "region_id": "uk-1",
-            "url": "http://localhost/v3",
+            "url": "http://localhost/identity/v3",
             "region": "uk-1",
             "interface": "admin",
             "id": "db15a7126d4a4f1f81903bb4d56be32b",
@@ -382,11 +382,19 @@
         "endpoints": [
           {
             "region_id": "uk-1",
-            "url": "https://identity.myprovider.com/v3",
+            "url": "http://localhost/identity/v3",
             "region": "uk-1",
             "interface": "public",
             "id": "27dc2bba1c5d4a14b68657fc8fdd4e3e",
             "name": "identityv3"
+          },
+          {
+            "region_id": "uk-1",
+            "url": "http://localhost/identity/v3",
+            "region": "uk-1",
+            "interface": "admin",
+            "id": "27dc2bba1c5d4a14b68657fc8fdd4e3e",
+            "name": "identityv3"
           }
         ],
         "type": "identityv3",