Repository: jclouds-labs Updated Branches: refs/heads/master 89ed53824 -> eaeea5c31
Adding the Dimension Data Tag API interface. Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/eaeea5c3 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/eaeea5c3 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/eaeea5c3 Branch: refs/heads/master Commit: eaeea5c31ddd886c972d9b9aaee66b9be31889e8 Parents: 89ed538 Author: Trevor Flanagan <[email protected]> Authored: Fri Dec 8 11:22:00 2017 +0000 Committer: Ignasi Barrera <[email protected]> Committed: Fri Dec 8 14:51:53 2017 +0100 ---------------------------------------------------------------------- dimensiondata/pom.xml | 2 +- .../DimensionDataCloudControlApi.java | 4 + .../dimensiondata/cloudcontrol/domain/Tag.java | 1 + .../cloudcontrol/features/TagApi.java | 210 +++++++++++++++++++ .../cloudcontrol/features/TagApiLiveTest.java | 137 ++++++++++++ .../cloudcontrol/features/TagApiMockTest.java | 188 +++++++++++++++++ ...aseDimensionDataCloudControlApiLiveTest.java | 1 + .../test/resources/createTagKeyResponse.json | 14 ++ dimensiondata/src/test/resources/tagkey.json | 7 + .../src/test/resources/tagkeys-page1.json | 70 +++++++ .../src/test/resources/tagkeys-page2.json | 70 +++++++ dimensiondata/src/test/resources/tagkeys.json | 70 +++++++ .../src/test/resources/tags-page1.json | 48 +++++ .../src/test/resources/tags-page2.json | 48 +++++ dimensiondata/src/test/resources/tags.json | 48 +++++ 15 files changed, 917 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/pom.xml ---------------------------------------------------------------------- diff --git a/dimensiondata/pom.xml b/dimensiondata/pom.xml index fcd0b5c..76b878e 100644 --- a/dimensiondata/pom.xml +++ b/dimensiondata/pom.xml @@ -145,7 +145,7 @@ <test.dimensiondata-cloudcontrol.credential> ${test.dimensiondata-cloudcontrol.credential} </test.dimensiondata-cloudcontrol.credential> - <jclouds.zones>EU6</jclouds.zones> + <jclouds.zones>NA9</jclouds.zones> </systemPropertyVariables> </configuration> </execution> http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlApi.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlApi.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlApi.java index ef75536..ce8c1a6 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlApi.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/DimensionDataCloudControlApi.java @@ -21,6 +21,7 @@ import org.jclouds.dimensiondata.cloudcontrol.features.InfrastructureApi; import org.jclouds.dimensiondata.cloudcontrol.features.NetworkApi; import org.jclouds.dimensiondata.cloudcontrol.features.ServerApi; import org.jclouds.dimensiondata.cloudcontrol.features.ServerImageApi; +import org.jclouds.dimensiondata.cloudcontrol.features.TagApi; import org.jclouds.rest.annotations.Delegate; import java.io.Closeable; @@ -41,4 +42,7 @@ public interface DimensionDataCloudControlApi extends Closeable { @Delegate ServerApi getServerApi(); + + @Delegate + TagApi getTagApi(); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Tag.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Tag.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Tag.java index 741db87..cc8054b 100644 --- a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Tag.java +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/domain/Tag.java @@ -30,6 +30,7 @@ public abstract class Tag { public abstract String assetId(); + @Nullable public abstract String datacenterId(); public abstract String tagKeyId(); http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApi.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApi.java b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApi.java new file mode 100644 index 0000000..9b717ec --- /dev/null +++ b/dimensiondata/src/main/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApi.java @@ -0,0 +1,210 @@ +/* + * 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.dimensiondata.cloudcontrol.features; + +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.inject.TypeLiteral; +import org.jclouds.Fallbacks; +import org.jclouds.collect.IterableWithMarker; +import org.jclouds.collect.PagedIterable; +import org.jclouds.collect.internal.Arg0ToPagedIterable; +import org.jclouds.dimensiondata.cloudcontrol.DimensionDataCloudControlApi; +import org.jclouds.dimensiondata.cloudcontrol.domain.PaginatedCollection; +import org.jclouds.dimensiondata.cloudcontrol.domain.Tag; +import org.jclouds.dimensiondata.cloudcontrol.domain.TagInfo; +import org.jclouds.dimensiondata.cloudcontrol.domain.TagKey; +import org.jclouds.dimensiondata.cloudcontrol.domain.TagKeys; +import org.jclouds.dimensiondata.cloudcontrol.domain.Tags; +import org.jclouds.dimensiondata.cloudcontrol.filters.OrganisationIdFilter; +import org.jclouds.dimensiondata.cloudcontrol.options.PaginationOptions; +import org.jclouds.dimensiondata.cloudcontrol.utils.ParseResponse; +import org.jclouds.http.filters.BasicAuthentication; +import org.jclouds.http.functions.ParseJson; +import org.jclouds.json.Json; +import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.MapBinder; +import org.jclouds.rest.annotations.PayloadParam; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.ResponseParser; +import org.jclouds.rest.annotations.Transform; +import org.jclouds.rest.binders.BindToJsonPayload; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import java.util.List; + +@RequestFilters({ BasicAuthentication.class, OrganisationIdFilter.class }) +@Consumes(MediaType.APPLICATION_JSON) +@Path("/{jclouds.api-version}/tag") +public interface TagApi { + + @Named("tag:createTagKey") + @POST + @Path("/createTagKey") + @Produces(MediaType.APPLICATION_JSON) + @MapBinder(BindToJsonPayload.class) + @ResponseParser(TagKeyId.class) + String createTagKey(@PayloadParam("name") String name, @PayloadParam("description") String description, + @PayloadParam("valueRequired") boolean valueRequired, + @PayloadParam("displayOnReport") boolean displayOnReport); + + @Named("tag:applyTags") + @POST + @Path("/applyTags") + @MapBinder(BindToJsonPayload.class) + void applyTags(@PayloadParam("assetId") String assetId, @PayloadParam("assetType") String assetType, + @PayloadParam("tagById") List<TagInfo> tagById); + + @Named("tag:removeTags") + @POST + @Path("/removeTags") + @MapBinder(BindToJsonPayload.class) + void removeTags(@PayloadParam("assetId") String assetId, @PayloadParam("assetType") String assetType, + @PayloadParam("tagKeyId") List<String> tagKeyName); + + @Named("tag:tagKey") + @GET + @Path("/tagKey") + @Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class) + @ResponseParser(ParseTagKeys.class) + PaginatedCollection<TagKey> listTagKeys(PaginationOptions options); + + @Named("tag:tagKey") + @GET + @Path("/tagKey") + @Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class) + @ResponseParser(ParseTagKeys.class) + @Transform(ParseTagKeys.ToPagedIterable.class) + PagedIterable<TagKey> listTagKeys(); + + @Named("tag:tagKeyById") + @GET + @Path("/tagKey/{tagKeyId}") + @Fallback(Fallbacks.NullOnNotFoundOr404.class) + TagKey tagKeyById(@PathParam("tagKeyId") String tagKeyId); + + @Named("tag:editTagKey") + @POST + @Path("/editTagKey") + @Produces(MediaType.APPLICATION_JSON) + @MapBinder(BindToJsonPayload.class) + void editTagKey(@PayloadParam("name") String name, @PayloadParam("id") String id, + @PayloadParam("description") String description, @PayloadParam("valueRequired") Boolean valueRequired, + @PayloadParam("displayOnReport") Boolean displayOnReport); + + @Named("tag:deleteTagKey") + @POST + @Path("/deleteTagKey") + @Produces(MediaType.APPLICATION_JSON) + @MapBinder(BindToJsonPayload.class) + @Fallback(Fallbacks.VoidOnNotFoundOr404.class) + void deleteTagKey(@PayloadParam("id") String id); + + @Named("tag:tags") + @GET + @Path("/tag") + @Fallback(Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404.class) + @ResponseParser(ParseTags.class) + PaginatedCollection<Tag> listTags(PaginationOptions options); + + @Named("tag:tags") + @GET + @Path("/tag") + @Fallback(Fallbacks.EmptyPagedIterableOnNotFoundOr404.class) + @ResponseParser(ParseTags.class) + @Transform(ParseTags.ToPagedIterable.class) + PagedIterable<Tag> listTags(); + + @Singleton + final class ParseTagKeys extends ParseJson<TagKeys> { + + @Inject + ParseTagKeys(final Json json, final TypeLiteral<TagKeys> type) { + super(json, type); + } + + private static class ToPagedIterable extends Arg0ToPagedIterable<TagKey, ToPagedIterable> { + + private final DimensionDataCloudControlApi api; + + @Inject + ToPagedIterable(final DimensionDataCloudControlApi api) { + this.api = api; + } + + @Override + protected Function<Object, IterableWithMarker<TagKey>> markerToNextForArg0(Optional<Object> arg0) { + return new Function<Object, IterableWithMarker<TagKey>>() { + @Override + public IterableWithMarker<TagKey> apply(Object input) { + PaginationOptions paginationOptions = PaginationOptions.class.cast(input); + return api.getTagApi().listTagKeys(paginationOptions); + } + }; + } + } + } + + @Singleton + final class ParseTags extends ParseJson<Tags> { + + @Inject + ParseTags(final Json json, final TypeLiteral<Tags> type) { + super(json, type); + } + + private static class ToPagedIterable extends Arg0ToPagedIterable<Tag, ToPagedIterable> { + + private final DimensionDataCloudControlApi api; + + @Inject + ToPagedIterable(final DimensionDataCloudControlApi api) { + this.api = api; + } + + @Override + protected Function<Object, IterableWithMarker<Tag>> markerToNextForArg0(Optional<Object> optional) { + return new Function<Object, IterableWithMarker<Tag>>() { + @Override + public IterableWithMarker<Tag> apply(Object input) { + PaginationOptions paginationOptions = PaginationOptions.class.cast(input); + return api.getTagApi().listTags(paginationOptions); + } + }; + } + } + } + + @Singleton + final class TagKeyId extends ParseResponse { + + @Inject + TagKeyId(final Json json) { + super(json, "tagKeyId"); + } + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApiLiveTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApiLiveTest.java new file mode 100644 index 0000000..e8c5052 --- /dev/null +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApiLiveTest.java @@ -0,0 +1,137 @@ +/* + * 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.dimensiondata.cloudcontrol.features; + +import com.google.common.base.Predicate; +import com.google.common.collect.FluentIterable; +import org.jclouds.collect.PagedIterable; +import org.jclouds.dimensiondata.cloudcontrol.domain.Tag; +import org.jclouds.dimensiondata.cloudcontrol.domain.TagInfo; +import org.jclouds.dimensiondata.cloudcontrol.domain.TagKey; +import org.jclouds.dimensiondata.cloudcontrol.internal.BaseDimensionDataCloudControlApiLiveTest; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.util.Collections; + +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertEquals; + +@Test(groups = "live", testName = "TagApiLiveTest", singleThreaded = true) +public class TagApiLiveTest extends BaseDimensionDataCloudControlApiLiveTest { + + private String tagKeyId; + private String tagKeyName; + private String assetType = "SERVER"; + + @BeforeClass + public void setup() { + super.setup(); + createTagKeyIfNotExist(); + applyTagToAsset(); + } + + private void applyTagToAsset() { + if (tagKeyId != null) { + api().applyTags(SERVER_ID, assetType, Collections.singletonList(TagInfo.create(tagKeyId, "jcloudsValue"))); + } + } + + private String createTagKey() { + tagKeyName = "jcloudsTagKeyName" + System.currentTimeMillis(); + tagKeyId = api().createTagKey(tagKeyName, "jcloudsTagKeyDescription", Boolean.TRUE, Boolean.FALSE); + assertNotNull(tagKeyId); + assertTagKeyExistsAndIsValid(tagKeyId, tagKeyName, "jcloudsTagKeyDescription", Boolean.TRUE, Boolean.FALSE); + return tagKeyId; + } + + @Test + public void testEditTagKey() { + tagKeyName = "jcloudsTagKeyName" + System.currentTimeMillis(); + api().editTagKey(tagKeyName, tagKeyId, "newDescription", Boolean.FALSE, Boolean.FALSE); + assertTagKeyExistsAndIsValid(tagKeyId, tagKeyName, "newDescription", Boolean.FALSE, Boolean.FALSE); + } + + @Test + public void testListTagKeys() { + PagedIterable<TagKey> response = api().listTagKeys(); + // assert that the created tag is present in the list of tag keys. + assertTrue(FluentIterable.from(response.concat().toList()).anyMatch(new Predicate<TagKey>() { + @Override + public boolean apply(TagKey input) { + return input.id().equals(tagKeyId); + } + })); + } + + private void createTagKeyIfNotExist() { + if (tagKeyId == null) { + createTagKey(); + } + } + + @Test + public void testApplyTags() { + api().applyTags(SERVER_ID, assetType, Collections.singletonList(TagInfo.create(tagKeyId, "jcloudsValue"))); + } + + @Test + public void testListTags() { + PagedIterable<Tag> response = api().listTags(); + assertTrue(FluentIterable.from(response.concat().toList()).anyMatch(new Predicate<Tag>() { + @Override + public boolean apply(Tag input) { + return input.tagKeyId().equals(tagKeyId); + } + }), String.format("Couldn't find tagKeyId %s in listTags response", tagKeyId)); + } + + @Test(dependsOnMethods = { "testListTags", "testListTagKeys" }) + public void testRemoveTags() { + api().removeTags(SERVER_ID, assetType, Collections.singletonList(tagKeyId)); + assertFalse(FluentIterable.from(api().listTags().concat().toList()).anyMatch(new Predicate<Tag>() { + @Override + public boolean apply(Tag input) { + return input.tagKeyId().equals(tagKeyId); + } + })); + } + + private void assertTagKeyExistsAndIsValid(String tagKeyId, String tagKeyName, String description, + boolean valueRequired, boolean displayOnReport) { + TagKey tagKey = api().tagKeyById(tagKeyId); + assertNotNull(tagKey); + assertEquals(tagKey.name(), tagKeyName); + assertEquals(tagKey.description(), description); + assertEquals(tagKey.valueRequired(), valueRequired); + assertEquals(tagKey.displayOnReport(), displayOnReport); + } + + @AfterClass(alwaysRun = true) + public void cleanup() { + if (tagKeyId != null && !tagKeyId.isEmpty()) { + api().deleteTagKey(tagKeyId); + } + } + + private TagApi api() { + return api.getTagApi(); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApiMockTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApiMockTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApiMockTest.java new file mode 100644 index 0000000..9a0d8c8 --- /dev/null +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/features/TagApiMockTest.java @@ -0,0 +1,188 @@ +/* + * 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.dimensiondata.cloudcontrol.features; + +import com.google.common.collect.ImmutableList; +import com.squareup.okhttp.mockwebserver.RecordedRequest; +import org.jclouds.dimensiondata.cloudcontrol.domain.Tag; +import org.jclouds.dimensiondata.cloudcontrol.domain.TagInfo; +import org.jclouds.dimensiondata.cloudcontrol.domain.TagKey; +import org.jclouds.dimensiondata.cloudcontrol.internal.BaseAccountAwareCloudControlMockTest; +import org.jclouds.http.Uris; +import org.testng.annotations.Test; + +import java.util.Collections; + +import static javax.ws.rs.HttpMethod.GET; +import static javax.ws.rs.HttpMethod.POST; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertEquals; + +@Test(groups = "unit", testName = "TagApiMockTest", singleThreaded = true) +public class TagApiMockTest extends BaseAccountAwareCloudControlMockTest { + + @Test + public void testCreateTagKey() throws Exception { + server.enqueue(jsonResponse("/createTagKeyResponse.json")); + final String tagKeyId = api.getTagApi() + .createTagKey("myTagKey", "myTagKeyDescription", Boolean.TRUE, Boolean.FALSE); + assertEquals("c452ceac-8627-423f-a8d2-5bb4a03c01d3", tagKeyId); + RecordedRequest recordedRequest = assertSent(POST, + "/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/createTagKey"); + assertBodyContains(recordedRequest, + "{\"name\":\"myTagKey\",\"description\":\"myTagKeyDescription\",\"valueRequired\":true,\"displayOnReport\":false}"); + } + + @Test + public void testEditTagKey() throws Exception { + server.enqueue(response200()); + api.getTagApi().editTagKey("myTagKey", "myTagKeyId", "myTagKeyDescription", Boolean.TRUE, Boolean.FALSE); + RecordedRequest recordedRequest = assertSent(POST, + "/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/editTagKey"); + assertBodyContains(recordedRequest, + "{\"name\":\"myTagKey\",\"id\":\"myTagKeyId\",\"description\":\"myTagKeyDescription\",\"valueRequired\":true,\"displayOnReport\":false}"); + } + + @Test + public void testRemoveTags() throws Exception { + server.enqueue(response200()); + api.getTagApi().removeTags("b8201405-bf9c-4896-b9cb-97fce95553a1", "SERVER", + Collections.singletonList("f357d63e-5a00-44ab-8c2f-ccd2923f5849")); + RecordedRequest recordedRequest = assertSent(POST, + "/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/removeTags"); + assertBodyContains(recordedRequest, + "{\"assetId\":\"b8201405-bf9c-4896-b9cb-97fce95553a1\",\"assetType\":\"SERVER\",\"tagKeyId\":[\"f357d63e-5a00-44ab-8c2f-ccd2923f5849\"]}"); + } + + @Test + public void testApplyTags() throws Exception { + server.enqueue(response200()); + TagInfo tagInfo = TagInfo.builder().tagKeyId("f357d63e-5a00-44ab-8c2f-ccd2923f5849").value("jcloudsValue") + .build(); + api.getTagApi().applyTags("b8201405-bf9c-4896-b9cb-97fce95553a1", "SERVER", Collections.singletonList(tagInfo)); + RecordedRequest recordedRequest = assertSent(POST, + "/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/applyTags"); + assertBodyContains(recordedRequest, + "{\"assetId\":\"b8201405-bf9c-4896-b9cb-97fce95553a1\",\"assetType\":\"SERVER\",\"tagById\":[{\"tagKeyId\":\"f357d63e-5a00-44ab-8c2f-ccd2923f5849\",\"value\":\"jcloudsValue\"}]}"); + } + + @Test + public void testListTags() throws Exception { + server.enqueue(jsonResponse("/tags.json")); + ImmutableList<Tag> tags = api.getTagApi().listTags().concat().toList(); + assertNotNull(tags); + assertEquals(4, tags.size()); + + assertSent(GET, expectedListTagsUriBuilder().toString()); + } + + @Test + public void testListTagsWithPagination() throws Exception { + server.enqueue(jsonResponse("/tags-page1.json")); + server.enqueue(jsonResponse("/tags-page2.json")); + ImmutableList<Tag> tags = api.getTagApi().listTags().concat().toList(); + consumeIterableAndAssertAdditionalPagesRequested(tags, 8, 0); + + assertSent(GET, expectedListTagsUriBuilder().toString()); + assertSent(GET, addPageNumberToUriBuilder(expectedListTagsUriBuilder(), 2).toString()); + } + + @Test + public void testListTags_404() throws Exception { + server.enqueue(response404()); + final ImmutableList<Tag> emptyList = api.getTagApi().listTags().concat().toList(); + assertSent(GET, expectedListTagsUriBuilder().toString()); + assertTrue(emptyList.isEmpty()); + } + + @Test + public void testListTagKeys() throws Exception { + server.enqueue(jsonResponse("/tagkeys.json")); + ImmutableList<TagKey> tagKeys = api.getTagApi().listTagKeys().concat().toList(); + assertNotNull(tagKeys); + assertEquals(9, tagKeys.size()); + assertSent(GET, expectedListTagKeysUriBuilder().toString()); + } + + @Test + public void testListTagKeysWithPagination() throws Exception { + server.enqueue(jsonResponse("/tagkeys-page1.json")); + server.enqueue(jsonResponse("/tagkeys-page2.json")); + ImmutableList<TagKey> tagKeys = api.getTagApi().listTagKeys().concat().toList(); + consumeIterableAndAssertAdditionalPagesRequested(tagKeys, 18, 0); + + assertSent(GET, expectedListTagKeysUriBuilder().toString()); + assertSent(GET, addPageNumberToUriBuilder(expectedListTagKeysUriBuilder(), 2).toString()); + } + + private Uris.UriBuilder expectedListTagKeysUriBuilder() { + Uris.UriBuilder uriBuilder = Uris + .uriBuilder("/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/tagKey"); + return uriBuilder; + } + + private Uris.UriBuilder expectedListTagsUriBuilder() { + Uris.UriBuilder uriBuilder = Uris + .uriBuilder("/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/tag"); + return uriBuilder; + } + + @Test + public void testListTagKeys_404() throws Exception { + server.enqueue(response404()); + ImmutableList<TagKey> tagKeys = api.getTagApi().listTagKeys().concat().toList(); + assertNotNull(tagKeys); + assertTrue(tagKeys.isEmpty()); + + assertSent(GET, "/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/tagKey"); + } + + @Test + public void testDeleteTagKey() throws Exception { + server.enqueue(response200()); + api.getTagApi().deleteTagKey("tagKeyId"); + RecordedRequest recordedRequest = assertSent(POST, + "/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/deleteTagKey"); + assertBodyContains(recordedRequest, "{\"id\":\"tagKeyId\"}"); + } + + @Test + public void testDeleteTagKey_404() throws Exception { + server.enqueue(response404()); + api.getTagApi().deleteTagKey("tagKeyId"); + assertSent(POST, "/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/deleteTagKey"); + } + + @Test + public void testTagKeyById() throws Exception { + server.enqueue(jsonResponse("/tagkey.json")); + TagKey tagKey = api.getTagApi().tagKeyById("tagKeyId"); + assertSent(GET, "/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/tagKey/tagKeyId"); + assertNotNull(tagKey); + } + + @Test + public void testTagKeyById_404() throws Exception { + server.enqueue(response404()); + final TagKey tagKey = api.getTagApi().tagKeyById("tagKeyId"); + assertSent(GET, "/caas/" + VERSION + "/6ac1e746-b1ea-4da5-a24e-caf1a978789d/tag/tagKey/tagKeyId"); + assertNull(tagKey); + } +} + http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java index ab5cfff..06ccb65 100644 --- a/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java +++ b/dimensiondata/src/test/java/org/jclouds/dimensiondata/cloudcontrol/internal/BaseDimensionDataCloudControlApiLiveTest.java @@ -32,6 +32,7 @@ public class BaseDimensionDataCloudControlApiLiveTest extends BaseApiLiveTest<Di protected static final String VLAN_ID = System.getProperty("vlanId", "6b25b02e-d3a2-4e69-8ca7-9bab605deebd"); protected static final String IMAGE_ID = System.getProperty("imageId", "4c02126c-32fc-4b4c-9466-9824c1b5aa0f"); protected static final String DATACENTER = System.getProperty("datacenter", "NW20-EPC-LAB04"); + protected static final String SERVER_ID = System.getProperty("serverId", "b1c537bb-018c-49ba-beef-e0600e948149"); public BaseDimensionDataCloudControlApiLiveTest() { provider = "dimensiondata-cloudcontrol"; http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/resources/createTagKeyResponse.json ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/resources/createTagKeyResponse.json b/dimensiondata/src/test/resources/createTagKeyResponse.json new file mode 100644 index 0000000..6582982 --- /dev/null +++ b/dimensiondata/src/test/resources/createTagKeyResponse.json @@ -0,0 +1,14 @@ +{ + "operation": "CREATE_TAG_KEY", + "responseCode": "OK", + "message": "Tag Key 'Department' has been created.", + "info": [ + { + "name": "tagKeyId", + "value": "c452ceac-8627-423f-a8d2-5bb4a03c01d3" + } + ], + "warning": [], + "error": [], + "requestId": "devlab1/2016-02-18T10:22:58.423-05:00/a9402625-ca41-4f79-8383-e64981e5b574" +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/resources/tagkey.json ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/resources/tagkey.json b/dimensiondata/src/test/resources/tagkey.json new file mode 100644 index 0000000..8e62c96 --- /dev/null +++ b/dimensiondata/src/test/resources/tagkey.json @@ -0,0 +1,7 @@ +{ + "name": "jcloudsTagKeyName", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "f3e5cf41-92e9-444e-9696-95a487b38259" +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/resources/tagkeys-page1.json ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/resources/tagkeys-page1.json b/dimensiondata/src/test/resources/tagkeys-page1.json new file mode 100644 index 0000000..2271bbf --- /dev/null +++ b/dimensiondata/src/test/resources/tagkeys-page1.json @@ -0,0 +1,70 @@ +{ + "tagKey": [ + { + "name": "jcloudsTagKeyName", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "f3e5cf41-92e9-444e-9696-95a487b38259" + }, + { + "name": "jcloudsTagKeyName1481197378077", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "5e15b5ca-77dd-4c9b-9878-67efbaa081f2" + }, + { + "name": "jcloudsTagKeyName1481198980963", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "496d12da-5811-4fdb-9732-ca9d13c39a75" + }, + { + "name": "jcloudsTagKeyName1481200035419", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "9e22629c-7cd0-4d6b-a437-6559dfadc31b" + }, + { + "name": "TestC1", + "valueRequired": false, + "displayOnReport": false, + "id": "d64281a6-1198-4e18-8f8f-27346a846931" + }, + { + "name": "testIrene44", + "description": "", + "valueRequired": false, + "displayOnReport": false, + "id": "d1196e0e-79a4-42e4-acbf-b90be82940d4" + }, + { + "name": "testMilan2", + "description": "", + "valueRequired": false, + "displayOnReport": false, + "id": "82e799f0-6297-4ec0-804d-3cdbca3e12d5" + }, + { + "name": "testMilan3", + "description": "", + "valueRequired": false, + "displayOnReport": false, + "id": "e96dd00f-8c3a-4a96-b04d-393fb905b1f8" + }, + { + "name": "testMilan4", + "description": "", + "valueRequired": true, + "displayOnReport": false, + "id": "4e5dc255-4e9f-4eb7-9901-9baae742b8d8" + } + ], + "pageNumber": 1, + "pageCount": 9, + "totalCount": 18, + "pageSize": 9 +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/resources/tagkeys-page2.json ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/resources/tagkeys-page2.json b/dimensiondata/src/test/resources/tagkeys-page2.json new file mode 100644 index 0000000..6d467d3 --- /dev/null +++ b/dimensiondata/src/test/resources/tagkeys-page2.json @@ -0,0 +1,70 @@ +{ + "tagKey": [ + { + "name": "jcloudsTagKeyName", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "f3e5cf41-92e9-444e-9696-95a487b38259" + }, + { + "name": "jcloudsTagKeyName1481197378077", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "5e15b5ca-77dd-4c9b-9878-67efbaa081f2" + }, + { + "name": "jcloudsTagKeyName1481198980963", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "496d12da-5811-4fdb-9732-ca9d13c39a75" + }, + { + "name": "jcloudsTagKeyName1481200035419", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "9e22629c-7cd0-4d6b-a437-6559dfadc31b" + }, + { + "name": "TestC1", + "valueRequired": false, + "displayOnReport": false, + "id": "d64281a6-1198-4e18-8f8f-27346a846931" + }, + { + "name": "testIrene44", + "description": "", + "valueRequired": false, + "displayOnReport": false, + "id": "d1196e0e-79a4-42e4-acbf-b90be82940d4" + }, + { + "name": "testMilan2", + "description": "", + "valueRequired": false, + "displayOnReport": false, + "id": "82e799f0-6297-4ec0-804d-3cdbca3e12d5" + }, + { + "name": "testMilan3", + "description": "", + "valueRequired": false, + "displayOnReport": false, + "id": "e96dd00f-8c3a-4a96-b04d-393fb905b1f8" + }, + { + "name": "testMilan4", + "description": "", + "valueRequired": true, + "displayOnReport": false, + "id": "4e5dc255-4e9f-4eb7-9901-9baae742b8d8" + } + ], + "pageNumber": 2, + "pageCount": 9, + "totalCount": 18, + "pageSize": 9 +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/resources/tagkeys.json ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/resources/tagkeys.json b/dimensiondata/src/test/resources/tagkeys.json new file mode 100644 index 0000000..632b72b --- /dev/null +++ b/dimensiondata/src/test/resources/tagkeys.json @@ -0,0 +1,70 @@ +{ + "tagKey": [ + { + "name": "jcloudsTagKeyName", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "f3e5cf41-92e9-444e-9696-95a487b38259" + }, + { + "name": "jcloudsTagKeyName1481197378077", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "5e15b5ca-77dd-4c9b-9878-67efbaa081f2" + }, + { + "name": "jcloudsTagKeyName1481198980963", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "496d12da-5811-4fdb-9732-ca9d13c39a75" + }, + { + "name": "jcloudsTagKeyName1481200035419", + "description": "jcloudsTagKeyDescription", + "valueRequired": true, + "displayOnReport": false, + "id": "9e22629c-7cd0-4d6b-a437-6559dfadc31b" + }, + { + "name": "TestC1", + "valueRequired": false, + "displayOnReport": false, + "id": "d64281a6-1198-4e18-8f8f-27346a846931" + }, + { + "name": "testIrene44", + "description": "", + "valueRequired": false, + "displayOnReport": false, + "id": "d1196e0e-79a4-42e4-acbf-b90be82940d4" + }, + { + "name": "testMilan2", + "description": "", + "valueRequired": false, + "displayOnReport": false, + "id": "82e799f0-6297-4ec0-804d-3cdbca3e12d5" + }, + { + "name": "testMilan3", + "description": "", + "valueRequired": false, + "displayOnReport": false, + "id": "e96dd00f-8c3a-4a96-b04d-393fb905b1f8" + }, + { + "name": "testMilan4", + "description": "", + "valueRequired": true, + "displayOnReport": false, + "id": "4e5dc255-4e9f-4eb7-9901-9baae742b8d8" + } + ], + "pageNumber": 1, + "pageCount": 1, + "totalCount": 9, + "pageSize": 100 +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/resources/tags-page1.json ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/resources/tags-page1.json b/dimensiondata/src/test/resources/tags-page1.json new file mode 100644 index 0000000..fcfd706 --- /dev/null +++ b/dimensiondata/src/test/resources/tags-page1.json @@ -0,0 +1,48 @@ +{ + "tag": [ + { + "assetType": "SERVER", + "assetId": "0542b218-6ff0-4170-93f0-666da5666cb7", + "datacenterId": "DEV_LAB1_N2_VMWARE_1", + "tagKeyId": "dfccc753-1b70-4533-86be-d893ca92e452", + "tagKeyName": "Owner", + "value": "Goran", + "displayOnReport": true, + "valueRequired": true + }, + { + "assetType": "SERVER", + "assetId": "0809679b-0f10-478f-bd5b-c76f2d3c2238", + "datacenterId": "DEV_LAB1_N2_VMWARE_1", + "tagKeyId": "1b424566-2857-48cf-b04d-df69a3c9b8d4", + "tagKeyName": "Location", + "value": "HR", + "displayOnReport": true, + "valueRequired": true + }, + { + "assetType": "NETWORK_DOMAIN", + "assetId": "232ce50a-7e18-47cd-8b40-61e34a7f43b6", + "assetName": "ab_non_vcmp_nd_1", + "datacenterId": "DEVLAB1_N2P_VMWARE_2", + "tagKeyId": "4f9cbcc8-a1b3-4621-ac5a-5ce8d4723e23", + "tagKeyName": "JohnTestingError", + "value": "", + "displayOnReport": false, + "valueRequired": true + }, + { + "assetType": "ACCOUNT", + "assetId": "taggy", + "assetName": "taggy", + "tagKeyId": "cf2808c0-d337-4e30-a139-5d0322ab0372", + "tagKeyName": "Needs Cleaning", + "displayOnReport": true, + "valueRequired": false + } + ], + "pageNumber": 1, + "pageCount": 4, + "totalCount": 8, + "pageSize": 4 +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/resources/tags-page2.json ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/resources/tags-page2.json b/dimensiondata/src/test/resources/tags-page2.json new file mode 100644 index 0000000..80007ff --- /dev/null +++ b/dimensiondata/src/test/resources/tags-page2.json @@ -0,0 +1,48 @@ +{ + "tag": [ + { + "assetType": "SERVER", + "assetId": "0542b218-6ff0-4170-93f0-666da5666cb7", + "datacenterId": "DEV_LAB1_N2_VMWARE_1", + "tagKeyId": "dfccc753-1b70-4533-86be-d893ca92e452", + "tagKeyName": "Owner", + "value": "Goran", + "displayOnReport": true, + "valueRequired": true + }, + { + "assetType": "SERVER", + "assetId": "0809679b-0f10-478f-bd5b-c76f2d3c2238", + "datacenterId": "DEV_LAB1_N2_VMWARE_1", + "tagKeyId": "1b424566-2857-48cf-b04d-df69a3c9b8d4", + "tagKeyName": "Location", + "value": "HR", + "displayOnReport": true, + "valueRequired": true + }, + { + "assetType": "NETWORK_DOMAIN", + "assetId": "232ce50a-7e18-47cd-8b40-61e34a7f43b6", + "assetName": "ab_non_vcmp_nd_1", + "datacenterId": "DEVLAB1_N2P_VMWARE_2", + "tagKeyId": "4f9cbcc8-a1b3-4621-ac5a-5ce8d4723e23", + "tagKeyName": "JohnTestingError", + "value": "", + "displayOnReport": false, + "valueRequired": true + }, + { + "assetType": "ACCOUNT", + "assetId": "taggy", + "assetName": "taggy", + "tagKeyId": "cf2808c0-d337-4e30-a139-5d0322ab0372", + "tagKeyName": "Needs Cleaning", + "displayOnReport": true, + "valueRequired": false + } + ], + "pageNumber": 2, + "pageCount": 4, + "totalCount": 8, + "pageSize": 4 +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/eaeea5c3/dimensiondata/src/test/resources/tags.json ---------------------------------------------------------------------- diff --git a/dimensiondata/src/test/resources/tags.json b/dimensiondata/src/test/resources/tags.json new file mode 100644 index 0000000..a54ed3c --- /dev/null +++ b/dimensiondata/src/test/resources/tags.json @@ -0,0 +1,48 @@ +{ + "tag": [ + { + "assetType": "SERVER", + "assetId": "0542b218-6ff0-4170-93f0-666da5666cb7", + "datacenterId": "DEV_LAB1_N2_VMWARE_1", + "tagKeyId": "dfccc753-1b70-4533-86be-d893ca92e452", + "tagKeyName": "Owner", + "value": "Goran", + "displayOnReport": true, + "valueRequired": true + }, + { + "assetType": "SERVER", + "assetId": "0809679b-0f10-478f-bd5b-c76f2d3c2238", + "datacenterId": "DEV_LAB1_N2_VMWARE_1", + "tagKeyId": "1b424566-2857-48cf-b04d-df69a3c9b8d4", + "tagKeyName": "Location", + "value": "HR", + "displayOnReport": true, + "valueRequired": true + }, + { + "assetType": "NETWORK_DOMAIN", + "assetId": "232ce50a-7e18-47cd-8b40-61e34a7f43b6", + "assetName": "ab_non_vcmp_nd_1", + "datacenterId": "DEVLAB1_N2P_VMWARE_2", + "tagKeyId": "4f9cbcc8-a1b3-4621-ac5a-5ce8d4723e23", + "tagKeyName": "JohnTestingError", + "value": "", + "displayOnReport": false, + "valueRequired": true + }, + { + "assetType": "ACCOUNT", + "assetId": "taggy", + "assetName": "taggy", + "tagKeyId": "cf2808c0-d337-4e30-a139-5d0322ab0372", + "tagKeyName": "Needs Cleaning", + "displayOnReport": true, + "valueRequired": false + } + ], + "pageNumber": 1, + "pageCount": 1, + "totalCount": 4, + "pageSize": 100 +} \ No newline at end of file
