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/keystonev3 Commit: cf0c70df2d3a697fe942c6bfbabd4e17d2b49543 Parents: 930c0fe Author: Ignasi Barrera <[email protected]> Authored: Tue Jan 9 11:59:11 2018 +0100 Committer: Ignasi Barrera <[email protected]> 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",
