You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by an...@apache.org on 2014/10/03 16:27:45 UTC
[29/50] [abbrv] git commit: Removed deprecated methods from the
VolumeApi and updated related tests
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/fix-jclouds-538
Commit: 2db654fbe3e32c3799cf2cb8999cd422878d3928
Parents: 1223772
Author: Jeremy Daggett <je...@rackspace.com>
Authored: Mon Jul 21 08:43:15 2014 -0700
Committer: Jeremy Daggett <jd...@apache.org>
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"
}
]
}