Repository: jclouds Updated Branches: refs/heads/master 122377285 -> 2db654fbe
Removed deprecated methods from the VolumeApi and updated related tests Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/2db654fb Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/2db654fb Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/2db654fb Branch: refs/heads/master Commit: 2db654fbe3e32c3799cf2cb8999cd422878d3928 Parents: 1223772 Author: Jeremy Daggett <[email protected]> Authored: Mon Jul 21 08:43:15 2014 -0700 Committer: Jeremy Daggett <[email protected]> Committed: Fri Sep 19 16:38:59 2014 -0700 ---------------------------------------------------------------------- .../nova/v2_0/config/NovaHttpApiModule.java | 3 +- .../v2_0/extensions/ExtensionNamespaces.java | 5 + .../nova/v2_0/extensions/VolumeApi.java | 67 ------------ .../v2_0/extensions/VolumeAttachmentApi.java | 10 +- .../v2_0/extensions/VolumeApiExpectTest.java | 109 ------------------- .../nova/v2_0/extensions/VolumeApiLiveTest.java | 66 ----------- .../src/test/resources/extension_list_full.json | 8 ++ 7 files changed, 20 insertions(+), 248 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/2db654fb/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java index 0956c48..f2a410f 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java @@ -48,7 +48,6 @@ import com.google.inject.Provides; * */ @ConfiguresRestClient - public class NovaHttpApiModule extends HttpApiModule<NovaApi> { public NovaHttpApiModule() { @@ -92,6 +91,8 @@ public class NovaHttpApiModule extends HttpApiModule<NovaApi> { URI.create("http://docs.openstack.org/compute/ext/volume_types/api/v1.1")) .put(URI.create(ExtensionNamespaces.AVAILABILITY_ZONE), URI.create("http://docs.openstack.org/compute/ext/availabilityzone/api/v1.1")) + .put(URI.create(ExtensionNamespaces.VOLUME_ATTACHMENTS), + URI.create("http://docs.openstack.org/compute/ext/os-volume-attachment-update/api/v2")) .build(); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/2db654fb/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ExtensionNamespaces.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ExtensionNamespaces.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ExtensionNamespaces.java index 1a98e7c..a81decb 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ExtensionNamespaces.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ExtensionNamespaces.java @@ -31,6 +31,11 @@ public final class ExtensionNamespaces { */ public static final String VOLUMES = "http://docs.openstack.org/ext/volumes/api/v1.1"; /** + * Volume attachment support + */ + public static final String VOLUME_ATTACHMENTS = "http://docs.openstack.org/compute/ext/os-volume-attachment-update/api/v2"; + + /** * Volume types support */ public static final String VOLUME_TYPES = "http://docs.openstack.org/ext/volume_types/api/v1.1"; http://git-wip-us.apache.org/repos/asf/jclouds/blob/2db654fb/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java index 485fb09..4e80d5b 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java @@ -32,7 +32,6 @@ import org.jclouds.Fallbacks.NullOnNotFoundOr404; import org.jclouds.javax.annotation.Nullable; import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest; import org.jclouds.openstack.nova.v2_0.domain.Volume; -import org.jclouds.openstack.nova.v2_0.domain.VolumeAttachment; import org.jclouds.openstack.nova.v2_0.domain.VolumeSnapshot; import org.jclouds.openstack.nova.v2_0.options.CreateVolumeOptions; import org.jclouds.openstack.nova.v2_0.options.CreateVolumeSnapshotOptions; @@ -43,7 +42,6 @@ import org.jclouds.rest.annotations.MapBinder; import org.jclouds.rest.annotations.PayloadParam; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.SelectJson; -import org.jclouds.rest.annotations.WrapWith; import com.google.common.annotations.Beta; import com.google.common.collect.FluentIterable; @@ -118,71 +116,6 @@ public interface VolumeApi { @Fallback(FalseOnNotFoundOr404.class) boolean delete(@PathParam("volumeId") String volumeId); - /** - * List volume attachments for a given instance. - * - * @return all Floating IPs - * @deprecated To be removed in jclouds 1.7 - * @see VolumeAttachmentApi#listAttachmentsOnServer(String) - */ - @Deprecated - @Named("volume:listAttachments") - @GET - @Path("/servers/{id}/os-volume_attachments") - @SelectJson("volumeAttachments") - @Consumes(MediaType.APPLICATION_JSON) - @Fallback(EmptyFluentIterableOnNotFoundOr404.class) - FluentIterable<VolumeAttachment> listAttachmentsOnServer(@PathParam("id") String serverId); - - /** - * Get a specific attached volume. - * - * @return data about the given volume attachment. - * @deprecated To be removed in jclouds 1.7 - * @see VolumeAttachmentApi#getAttachmentForVolumeOnServer(String, String) - */ - @Deprecated - @Named("volume:getAttachments") - @GET - @Path("/servers/{serverId}/os-volume_attachments/{id}") - @SelectJson("volumeAttachment") - @Consumes(MediaType.APPLICATION_JSON) - @Fallback(NullOnNotFoundOr404.class) - @Nullable - VolumeAttachment getAttachmentForVolumeOnServer(@PathParam("id") String volumeId, - @PathParam("serverId") String serverId); - - /** - * Attach a volume to an instance - * - * @return data about the new volume attachment - * @deprecated To be removed in jclouds 1.7 - * @see VolumeAttachmentApi#attachVolumeToServerAsDevice(String, String, String) - */ - @Deprecated - @Named("volume:attach") - @POST - @Path("/servers/{serverId}/os-volume_attachments") - @SelectJson("volumeAttachment") - @Produces(MediaType.APPLICATION_JSON) - @WrapWith("volumeAttachment") - VolumeAttachment attachVolumeToServerAsDevice(@PayloadParam("volumeId") String volumeId, - @PathParam("serverId") String serverId, @PayloadParam("device") String device); - - /** - * Detach a Volume from an instance. - * - * @return true if successful - * @deprecated To be removed in jclouds 1.7 - * @see VolumeAttachmentApi#detachVolumeFromServer(String, String) - */ - @Deprecated - @Named("volume:detach") - @DELETE - @Path("/servers/{serverId}/os-volume_attachments/{id}") - @Fallback(FalseOnNotFoundOr404.class) - Boolean detachVolumeFromServer(@PathParam("id") String volumeId, - @PathParam("serverId") String serverId); /** * Returns a summary list of snapshots. http://git-wip-us.apache.org/repos/asf/jclouds/blob/2db654fb/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java index c280fa9..bc24036 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java @@ -59,13 +59,13 @@ import com.google.common.collect.FluentIterable; * */ @Beta -@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.VOLUMES) +@Extension(of = ServiceType.COMPUTE, namespace = ExtensionNamespaces.VOLUME_ATTACHMENTS) @RequestFilters(AuthenticateRequest.class) @Consumes(MediaType.APPLICATION_JSON) @Path("/servers") public interface VolumeAttachmentApi { /** - * List Volume Attachments for a given Server. + * Lists Volume Attachments for a given Server. * * @param serverId The ID of the Server * @return All VolumeAttachments for the Server @@ -78,7 +78,7 @@ public interface VolumeAttachmentApi { FluentIterable<VolumeAttachment> listAttachmentsOnServer(@PathParam("serverId") String serverId); /** - * Get a specific Volume Attachment for a Volume and Server. + * Gets a specific Volume Attachment for a Volume and Server. * * @param volumeId The ID of the Volume * @param serverId The ID of the Server @@ -94,7 +94,7 @@ public interface VolumeAttachmentApi { @PathParam("serverId") String serverId); /** - * Attach a Volume to a Server. + * Attaches a Volume to a Server. * * Note: If you are using KVM as your hypervisor then the actual device name in the Server will be different than * the one specified. When the Server sees a new device, it picks the next available name (which in most cases is @@ -115,7 +115,7 @@ public interface VolumeAttachmentApi { @PathParam("serverId") String serverId, @PayloadParam("device") String device); /** - * Detach a Volume from a server. + * Detaches a Volume from a server. * * Note: Make sure you've unmounted the volume first. Failure to do so could result in failure or data loss. * http://git-wip-us.apache.org/repos/asf/jclouds/blob/2db654fb/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiExpectTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiExpectTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiExpectTest.java index 520ead2..fde97ee 100644 --- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiExpectTest.java +++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiExpectTest.java @@ -190,115 +190,6 @@ public class VolumeApiExpectTest extends BaseNovaApiExpectTest { assertFalse(api.delete("1")); } - public void testListAttachments() { - URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/servers/instance-1/os-volume_attachments"); - VolumeApi api = requestsSendResponses( - keystoneAuthWithUsernameAndPasswordAndTenantName, - responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, - authenticatedGET().endpoint(endpoint).build(), - HttpResponse.builder().statusCode(200).payload(payloadFromResource("/attachment_list.json")).build() - ).getVolumeApi("az-1.region-a.geo-1").get(); - - Set<? extends VolumeAttachment> attachments = api.listAttachmentsOnServer("instance-1").toSet(); - assertEquals(attachments, ImmutableSet.of(testAttachment())); - // double-check individual fields - VolumeAttachment attachment = Iterables.getOnlyElement(attachments); - assertEquals(attachment.getDevice(), "/dev/vdc"); - assertEquals(attachment.getServerId(), "b4785058-cb80-491b-baa3-e4ee6546450e"); - assertEquals(attachment.getId(), "1"); - assertEquals(attachment.getVolumeId(), "1"); - } - - @Test(expectedExceptions = AuthorizationException.class) - public void testListAttachmentsFail() { - URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/servers/instance-2/os-volume_attachments"); - VolumeApi api = requestsSendResponses( - keystoneAuthWithUsernameAndPasswordAndTenantName, - responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, - authenticatedGET().endpoint(endpoint).build(), - HttpResponse.builder().statusCode(401).build() - ).getVolumeApi("az-1.region-a.geo-1").get(); - - api.listAttachmentsOnServer("instance-2"); - } - - public void testGetAttachment() { - URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/servers/instance-1/os-volume_attachments/1"); - VolumeApi api = requestsSendResponses( - keystoneAuthWithUsernameAndPasswordAndTenantName, - responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, - authenticatedGET().endpoint(endpoint).build(), - HttpResponse.builder().statusCode(200).payload(payloadFromResource("/attachment_details.json")).build() - ).getVolumeApi("az-1.region-a.geo-1").get(); - - VolumeAttachment attachment = api.getAttachmentForVolumeOnServer("1", "instance-1"); - assertEquals(attachment, testAttachment()); - } - - public void testGetAttachmentFail() { - URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/servers/instance-1/os-volume_attachments/1"); - VolumeApi api = requestsSendResponses( - keystoneAuthWithUsernameAndPasswordAndTenantName, - responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, - authenticatedGET().endpoint(endpoint).build(), - HttpResponse.builder().statusCode(404).build() - ).getVolumeApi("az-1.region-a.geo-1").get(); - - assertNull(api.getAttachmentForVolumeOnServer("1", "instance-1")); - } - - public void testAttachVolume() { - URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/servers/instance-1/os-volume_attachments"); - VolumeApi api = requestsSendResponses( - keystoneAuthWithUsernameAndPasswordAndTenantName, - responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, - authenticatedGET().endpoint(endpoint).method("POST") - .payload(payloadFromStringWithContentType("{\"volumeAttachment\":{\"volumeId\":\"1\",\"device\":\"/dev/vdc\"}}", MediaType.APPLICATION_JSON)).endpoint(endpoint).build(), - HttpResponse.builder().statusCode(200).payload(payloadFromResource("/attachment_details.json")).build() - ).getVolumeApi("az-1.region-a.geo-1").get(); - - VolumeAttachment result = api.attachVolumeToServerAsDevice("1", "instance-1", "/dev/vdc"); - assertEquals(result, testAttachment()); - } - - @Test(expectedExceptions = ResourceNotFoundException.class) - public void testAttachVolumeFail() { - URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/servers/instance-1/os-volume_attachments"); - VolumeApi api = requestsSendResponses( - keystoneAuthWithUsernameAndPasswordAndTenantName, - responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, - authenticatedGET().endpoint(endpoint).method("POST") - .payload(payloadFromStringWithContentType("{\"volumeAttachment\":{\"volumeId\":\"1\",\"device\":\"/dev/vdc\"}}", MediaType.APPLICATION_JSON)).endpoint(endpoint).build(), - HttpResponse.builder().statusCode(404).build() - ).getVolumeApi("az-1.region-a.geo-1").get(); - - api.attachVolumeToServerAsDevice("1", "instance-1", "/dev/vdc"); - } - - public void testDetachVolume() { - URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/servers/instance-1/os-volume_attachments/1"); - VolumeApi api = requestsSendResponses( - keystoneAuthWithUsernameAndPasswordAndTenantName, - responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, - authenticatedGET().endpoint(endpoint).method("DELETE").build(), - HttpResponse.builder().statusCode(200).payload(payloadFromResource("/attachment_details.json")).build() - ).getVolumeApi("az-1.region-a.geo-1").get(); - - assertTrue(api.detachVolumeFromServer("1", "instance-1")); - } - - public void testDetachVolumeFail() { - URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/servers/instance-1/os-volume_attachments/1"); - VolumeApi api = requestsSendResponses( - keystoneAuthWithUsernameAndPasswordAndTenantName, - responseWithKeystoneAccess, extensionsOfNovaRequest, extensionsOfNovaResponse, - authenticatedGET().endpoint(endpoint).method("DELETE").build(), - HttpResponse.builder().statusCode(404).build() - ).getVolumeApi("az-1.region-a.geo-1").get(); - - assertFalse(api.detachVolumeFromServer("1", "instance-1")); - } - public void testListSnapshots() { URI endpoint = URI.create("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v2/3456/os-snapshots"); VolumeApi api = requestsSendResponses( http://git-wip-us.apache.org/repos/asf/jclouds/blob/2db654fb/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiLiveTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiLiveTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiLiveTest.java index d1d701d..2e4d780 100644 --- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiLiveTest.java +++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApiLiveTest.java @@ -24,10 +24,8 @@ import static org.testng.Assert.assertTrue; import java.util.Set; import org.jclouds.openstack.nova.v2_0.domain.Volume; -import org.jclouds.openstack.nova.v2_0.domain.VolumeAttachment; import org.jclouds.openstack.nova.v2_0.domain.VolumeSnapshot; import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest; -import org.jclouds.openstack.nova.v2_0.options.CreateServerOptions; import org.jclouds.openstack.nova.v2_0.options.CreateVolumeOptions; import org.jclouds.openstack.nova.v2_0.options.CreateVolumeSnapshotOptions; import org.testng.annotations.AfterClass; @@ -215,68 +213,4 @@ public class VolumeApiLiveTest extends BaseNovaApiLiveTest { assertEquals(a.getVolumeId(), b.getVolumeId()); } - @Test(dependsOnMethods = "testCreateVolume") - public void testAttachments() { - if (volumeOption.isPresent()) { - String server_id = null; - try { - CreateServerOptions createServerOptions = CreateServerOptions.Builder.availabilityZone(availabilityZone); - final String serverId = server_id = createServerInRegion(region, createServerOptions).getId(); - - Set<? extends VolumeAttachment> attachments = volumeOption.get().listAttachmentsOnServer(serverId).toSet(); - assertNotNull(attachments); - final int before = attachments.size(); - - VolumeAttachment testAttachment = volumeOption.get().attachVolumeToServerAsDevice(testVolume.getId(), - serverId, "/dev/vdf"); - assertNotNull(testAttachment.getId()); - assertEquals(testAttachment.getVolumeId(), testVolume.getId()); - - assertTrue(retry(new Predicate<VolumeApi>() { - public boolean apply(VolumeApi volumeApi) { - return volumeOption.get().listAttachmentsOnServer(serverId).size() > before; - } - }, 60 * 1000L).apply(volumeOption.get())); - - attachments = volumeOption.get().listAttachmentsOnServer(serverId).toSet(); - assertNotNull(attachments); - assertEquals(attachments.size(), before + 1); - - assertTrue(retry(new Predicate<VolumeApi>() { - public boolean apply(VolumeApi volumeApi) { - return volumeApi.get(testVolume.getId()).getStatus() == Volume.Status.IN_USE; - } - }, 30 * 1000L).apply(volumeOption.get()), "Volume status did not show in-use after 30 seconds"); - - boolean foundIt = false; - for (VolumeAttachment att : attachments) { - VolumeAttachment details = volumeOption.get() - .getAttachmentForVolumeOnServer(att.getVolumeId(), serverId); - assertNotNull(details); - assertNotNull(details.getId()); - assertNotNull(details.getServerId()); - assertNotNull(details.getVolumeId()); - if (Objects.equal(details.getVolumeId(), testVolume.getId())) { - foundIt = true; - assertEquals(details.getDevice(), "/dev/vdf"); - assertEquals(details.getServerId(), serverId); - } - } - - assertTrue(foundIt, "Failed to find the attachment we created in listAttachments() response"); - - volumeOption.get().detachVolumeFromServer(testVolume.getId(), serverId); - assertTrue(retry(new Predicate<VolumeApi>() { - public boolean apply(VolumeApi volumeApi) { - return volumeOption.get().listAttachmentsOnServer(serverId).size() == before; - } - }, 60 * 1000L).apply(volumeOption.get())); - - } finally { - if (server_id != null) - api.getServerApi(region).delete(server_id); - } - - } - } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/2db654fb/apis/openstack-nova/src/test/resources/extension_list_full.json ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/resources/extension_list_full.json b/apis/openstack-nova/src/test/resources/extension_list_full.json index c54a010..123592b 100644 --- a/apis/openstack-nova/src/test/resources/extension_list_full.json +++ b/apis/openstack-nova/src/test/resources/extension_list_full.json @@ -279,6 +279,14 @@ "namespace": "http://docs.openstack.org/compute/ext/availabilityzone/api/v1.1", "alias": "os-availability-zone", "description": "1. Add availability_zone to the Create Server v1.1 API.\n 2. Add availability zones describing.\n " + }, + { + "alias": "os-volume-attachment-update", + "description": "Support for updating a volume attachment.", + "links": [], + "name": "VolumeAttachmentUpdate", + "namespace": "http://docs.openstack.org/compute/ext/os-volume-attachment-update/api/v2", + "updated": "2013-06-20T00:00:00Z" } ] }
