Repository: jclouds Updated Branches: refs/heads/keystonev3 963a46a35 -> 22be342db
Completed the RegionApi Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/22be342d Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/22be342d Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/22be342d Branch: refs/heads/keystonev3 Commit: 22be342db6d4ec5c1bbdfacb9686a65cf544655a Parents: 963a46a Author: Ignasi Barrera <[email protected]> Authored: Thu Jan 11 15:20:42 2018 +0100 Committer: Ignasi Barrera <[email protected]> Committed: Thu Jan 11 15:20:42 2018 +0100 ---------------------------------------------------------------------- .../openstack/keystone/v3/domain/Region.java | 10 +-- .../keystone/v3/features/ProjectApi.java | 6 +- .../keystone/v3/features/RegionApi.java | 37 +++++++++ .../openstack/keystone/v3/features/UserApi.java | 50 ++++++++++++ .../v3/features/ProjectApiLiveTest.java | 2 +- .../v3/features/ProjectApiMockTest.java | 2 +- .../keystone/v3/features/RegionApiLiveTest.java | 52 +++++++++++-- .../keystone/v3/features/RegionApiMockTest.java | 81 +++++++++++++++++++- .../src/test/resources/v3/region.json | 10 +++ 9 files changed, 231 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/22be342d/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/domain/Region.java ---------------------------------------------------------------------- diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/domain/Region.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/domain/Region.java index 0c1a189..70598fe 100644 --- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/domain/Region.java +++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/domain/Region.java @@ -25,13 +25,13 @@ import com.google.auto.value.AutoValue; public abstract class Region { public abstract String id(); - public abstract String name(); - public abstract Link link(); + public abstract String description(); + @Nullable public abstract Link link(); @Nullable public abstract String parentRegionId(); @SerializedNames({ "id", "description", "links", "parent_region_id" }) - public static Region create(String id, String name, Link link, String parentRegionId) { - return builder().id(id).name(name).link(link).parentRegionId(parentRegionId).build(); + public static Region create(String id, String description, Link link, String parentRegionId) { + return builder().id(id).description(description).link(link).parentRegionId(parentRegionId).build(); } Region() { @@ -46,7 +46,7 @@ public abstract class Region { @AutoValue.Builder public abstract static class Builder { public abstract Builder id(String id); - public abstract Builder name(String name); + public abstract Builder description(String name); public abstract Builder link(Link link); public abstract Builder parentRegionId(String parentRegionId); public abstract Region build(); http://git-wip-us.apache.org/repos/asf/jclouds/blob/22be342d/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/ProjectApi.java ---------------------------------------------------------------------- diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/ProjectApi.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/ProjectApi.java index 14e8d97..494e851 100644 --- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/ProjectApi.java +++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/ProjectApi.java @@ -33,6 +33,7 @@ import javax.ws.rs.core.MediaType; import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404; import org.jclouds.Fallbacks.FalseOnNotFoundOr404; import org.jclouds.Fallbacks.NullOnNotFoundOr404; +import org.jclouds.javax.annotation.Nullable; import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest; import org.jclouds.openstack.keystone.v3.domain.Project; import org.jclouds.openstack.v2_0.services.Identity; @@ -71,7 +72,10 @@ public interface ProjectApi { @Named("projects:create") @POST @SelectJson("project") - Project create(@WrapWith("project") Project project); + @WrapWith("project") + Project create(@PayloadParam("name") String name, @Nullable @PayloadParam("description") String description, + @PayloadParam("enabled") boolean enabled, @PayloadParam("is_domain") boolean isDomain, + @Nullable @PayloadParam("domain_id") String domainId, @Nullable @PayloadParam("parent_id") String parentId); @Named("projects:update") @PATCH http://git-wip-us.apache.org/repos/asf/jclouds/blob/22be342d/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/RegionApi.java ---------------------------------------------------------------------- diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/RegionApi.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/RegionApi.java index cc87040..c21716f 100644 --- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/RegionApi.java +++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/RegionApi.java @@ -20,18 +20,27 @@ import java.util.List; import javax.inject.Named; import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.core.MediaType; import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404; +import org.jclouds.Fallbacks.FalseOnNotFoundOr404; +import org.jclouds.Fallbacks.NullOnNotFoundOr404; +import org.jclouds.javax.annotation.Nullable; import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest; import org.jclouds.openstack.keystone.v3.domain.Region; import org.jclouds.openstack.v2_0.services.Identity; import org.jclouds.rest.annotations.Endpoint; import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.PATCH; +import org.jclouds.rest.annotations.PayloadParam; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.SelectJson; +import org.jclouds.rest.annotations.WrapWith; /** * Provides access to the Keystone Region API. @@ -47,4 +56,32 @@ public interface RegionApi { @SelectJson("regions") @Fallback(EmptyListOnNotFoundOr404.class) List<Region> list(); + + @Named("regions:get") + @GET + @Path("/{id}") + @SelectJson("region") + @Fallback(NullOnNotFoundOr404.class) + Region get(@PathParam("id") String id); + + @Named("regions:create") + @POST + @SelectJson("region") + @WrapWith("region") + Region create(@PayloadParam("id") String id, @Nullable @PayloadParam("description") String description, + @Nullable @PayloadParam("parent_region_id") String parentId); + + @Named("regions:update") + @PATCH + @Path("/{id}") + @SelectJson("region") + @WrapWith("region") + Region update(@PathParam("id") String id, @Nullable @PayloadParam("description") String description, + @Nullable @PayloadParam("parent_region_id") String parentId); + + @Named("regions:delete") + @DELETE + @Path("/{id}") + @Fallback(FalseOnNotFoundOr404.class) + boolean delete(@PathParam("id") String id); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/22be342d/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/UserApi.java ---------------------------------------------------------------------- diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/UserApi.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/UserApi.java new file mode 100644 index 0000000..1bb884d --- /dev/null +++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v3/features/UserApi.java @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.openstack.keystone.v3.features; + +import java.util.List; + +import javax.inject.Named; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.core.MediaType; + +import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404; +import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest; +import org.jclouds.openstack.keystone.v3.domain.Region; +import org.jclouds.openstack.v2_0.services.Identity; +import org.jclouds.rest.annotations.Endpoint; +import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.SelectJson; + +/** + * Provides access to the Keystone Region API. + */ +@Consumes(MediaType.APPLICATION_JSON) +@RequestFilters(AuthenticateRequest.class) +@Endpoint(Identity.class) +@Path("/regions") +public interface UserApi { + + @Named("regions:list") + @GET + @SelectJson("regions") + @Fallback(EmptyListOnNotFoundOr404.class) + List<Region> list(); +} http://git-wip-us.apache.org/repos/asf/jclouds/blob/22be342d/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiLiveTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiLiveTest.java index 2c2f20a..df0c0dd 100644 --- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiLiveTest.java +++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiLiveTest.java @@ -40,7 +40,7 @@ public class ProjectApiLiveTest extends BaseV3KeystoneApiLiveTest { @BeforeClass public void createTestProject() { - project = api().create(Project.builder().name(getClass().getSimpleName()).build()); + project = api().create(getClass().getSimpleName(), null, true, false, null, null); assertNotNull(project.id()); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/22be342d/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiMockTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiMockTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiMockTest.java index fc71a6e..b8a4542 100644 --- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiMockTest.java +++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/ProjectApiMockTest.java @@ -87,7 +87,7 @@ public class ProjectApiMockTest extends BaseV3KeystoneApiMockTest { enqueueAuthentication(server); server.enqueue(jsonResponse("/v3/project.json")); - Project project = api.getProjectApi().create(Project.builder().name("foo").build()); + Project project = api.getProjectApi().create("foo", null, true, false, null, null); assertNotNull(project); assertEquals(server.getRequestCount(), 2); http://git-wip-us.apache.org/repos/asf/jclouds/blob/22be342d/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiLiveTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiLiveTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiLiveTest.java index 3770d95..0e5bcfb 100644 --- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiLiveTest.java +++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiLiveTest.java @@ -16,22 +16,58 @@ */ package org.jclouds.openstack.keystone.v3.features; -import static org.testng.Assert.assertFalse; +import static com.google.common.collect.Iterables.any; +import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; - -import java.util.List; +import static org.testng.Assert.assertTrue; import org.jclouds.openstack.keystone.v3.domain.Region; import org.jclouds.openstack.keystone.v3.internal.BaseV3KeystoneApiLiveTest; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; -@Test(groups = "live", testName = "RegionApiLiveTest") +import com.google.common.base.Predicate; + +@Test(groups = "live", testName = "RegionApiLiveTest", singleThreaded = true) public class RegionApiLiveTest extends BaseV3KeystoneApiLiveTest { + private Region region; + + @BeforeClass + public void createTestRegion() { + region = api().create(getClass().getSimpleName(), null, null); + assertEquals(region.id(), getClass().getSimpleName()); + } + + @Test + public void testListRegions() { + assertTrue(any(api().list(), new Predicate<Region>() { + @Override + public boolean apply(Region input) { + return input.id().equals(region.id()); + } + })); + } + @Test - public void testRegions() { - List<Region> result = api.getRegionApi().list(); - assertNotNull(result); - assertFalse(result.isEmpty()); + public void testGetRegion() { + assertNotNull(api().get(region.id())); + } + + @Test + public void testUpdateRegion() { + api().update(region.id(), "Updated", null); + region = api().get(region.id()); + assertEquals(region.description(), "Updated"); + } + + @AfterClass(alwaysRun = true) + public void deleteRegion() { + assertTrue(api().delete(region.id())); + } + + private RegionApi api() { + return api.getRegionApi(); } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/22be342d/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiMockTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiMockTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiMockTest.java index f640140..2e68246 100644 --- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiMockTest.java +++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/features/RegionApiMockTest.java @@ -18,6 +18,8 @@ package org.jclouds.openstack.keystone.v3.features; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import java.util.List; @@ -35,7 +37,7 @@ public class RegionApiMockTest extends BaseV3KeystoneApiMockTest { List<Region> regions = api.getRegionApi().list(); assertFalse(regions.isEmpty()); - + assertEquals(server.getRequestCount(), 2); assertAuthentication(server); assertSent(server, "GET", "/regions"); @@ -47,10 +49,83 @@ public class RegionApiMockTest extends BaseV3KeystoneApiMockTest { List<Region> regions = api.getRegionApi().list(); assertTrue(regions.isEmpty()); - + assertEquals(server.getRequestCount(), 2); assertAuthentication(server); assertSent(server, "GET", "/regions"); } - + + public void testGetRegion() throws InterruptedException { + enqueueAuthentication(server); + server.enqueue(jsonResponse("/v3/region.json")); + + Region region = api.getRegionApi().get("RegionOne"); + assertNotNull(region); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertSent(server, "GET", "/regions/RegionOne"); + } + + public void testGetRegionReturns404() throws InterruptedException { + enqueueAuthentication(server); + server.enqueue(response404()); + + Region region = api.getRegionApi().get("RegionOne"); + assertNull(region); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertSent(server, "GET", "/regions/RegionOne"); + } + + public void testCreateRegion() throws InterruptedException { + enqueueAuthentication(server); + server.enqueue(jsonResponse("/v3/region.json")); + + Region region = api.getRegionApi().create("RegionOne", "Description", "12345"); + assertNotNull(region); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertSent(server, "POST", "/regions", + "{\"region\":{\"id\":\"RegionOne\",\"description\":\"Description\",\"parent_region_id\":\"12345\"}}"); + } + + public void testUpdateRegion() throws InterruptedException { + enqueueAuthentication(server); + server.enqueue(jsonResponse("/v3/region.json")); + + Region region = api.getRegionApi().update("RegionOne", "Updated", null); + assertNotNull(region); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertSent(server, "PATCH", "/regions/RegionOne", "{\"region\":{\"description\":\"Updated\"}}"); + } + + public void testDeleteRegion() throws InterruptedException { + enqueueAuthentication(server); + server.enqueue(response204()); + + boolean deleted = api.getRegionApi().delete("RegionOne"); + assertTrue(deleted); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertSent(server, "DELETE", "/regions/RegionOne"); + } + + public void testDeleteRegionReturns404() throws InterruptedException { + enqueueAuthentication(server); + server.enqueue(response404()); + + boolean deleted = api.getRegionApi().delete("RegionOne"); + assertFalse(deleted); + + assertEquals(server.getRequestCount(), 2); + assertAuthentication(server); + assertSent(server, "DELETE", "/regions/RegionOne"); + } + } http://git-wip-us.apache.org/repos/asf/jclouds/blob/22be342d/apis/openstack-keystone/src/test/resources/v3/region.json ---------------------------------------------------------------------- diff --git a/apis/openstack-keystone/src/test/resources/v3/region.json b/apis/openstack-keystone/src/test/resources/v3/region.json new file mode 100644 index 0000000..ee5eee8 --- /dev/null +++ b/apis/openstack-keystone/src/test/resources/v3/region.json @@ -0,0 +1,10 @@ +{ + "region": { + "parent_region_id": null, + "id": "RegionOne", + "links": { + "self": "http://localhost/identity/v3/regions/RegionApiLiveTest" + }, + "description": "Updated" + } +}
