Repository: jclouds-labs-openstack
Updated Branches:
refs/heads/1.8.x 7e4bbe0ec -> c82fbd169
Adding copyFrom option to Glance
Conflicts:
openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/repo
Commit:
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/commit/c82fbd16
Tree:
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/tree/c82fbd16
Diff:
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/diff/c82fbd16
Branch: refs/heads/1.8.x
Commit: c82fbd1698b085ba4cfe5a4e3af9cc960b12cd74
Parents: 7e4bbe0
Author: Andrew Phillips <[email protected]>
Authored: Sun Oct 12 15:49:19 2014 -0400
Committer: Andrew Phillips <[email protected]>
Committed: Thu Oct 23 22:26:46 2014 -0700
----------------------------------------------------------------------
.../glance/v1_0/options/CreateImageOptions.java | 18 ++++
.../v1_0/features/ImageApiExpectTest.java | 23 ++++++
.../glance/v1_0/features/ImageApiLiveTest.java | 86 ++++++++++++++++----
3 files changed, 112 insertions(+), 15 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/c82fbd16/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/options/CreateImageOptions.java
----------------------------------------------------------------------
diff --git
a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/options/CreateImageOptions.java
b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/options/CreateImageOptions.java
index e4a70ce..dd547f7 100644
---
a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/options/CreateImageOptions.java
+++
b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/options/CreateImageOptions.java
@@ -37,6 +37,8 @@ import org.jclouds.openstack.glance.v1_0.domain.StoreType;
*/
public class CreateImageOptions extends UpdateImageOptions {
+ public static final String COPY_FROM = "x-glance-api-copy-from";
+
/**
* When present, Glance will use the supplied identifier for the image
instead of generating one. If the identifier
* already exists in that Glance node, then a 409 Conflict will be returned
by Glance. The value of the header must
@@ -47,6 +49,14 @@ public class CreateImageOptions extends UpdateImageOptions {
return this;
}
+ /**
+ * @param url the url of the image to be copied
+ */
+ public UpdateImageOptions copyFrom(String url) {
+ headers.put(COPY_FROM, url);
+ return this;
+ }
+
public static class Builder {
/**
* @see org.jclouds.openstack.glance.v1_0.options.CreateImageOptions#id
@@ -131,5 +141,13 @@ public class CreateImageOptions extends UpdateImageOptions
{
public static CreateImageOptions property(String key, String value) {
return CreateImageOptions.class.cast(new
CreateImageOptions().property(key, value));
}
+
+ /**
+ * @see
org.jclouds.openstack.glance.v1_0.options.CreateImageOptions#copyFrom(String)
+ */
+ public static CreateImageOptions copyFrom(String url) {
+ return CreateImageOptions.class.cast(new
CreateImageOptions().copyFrom(url));
+ }
+
}
}
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/c82fbd16/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java
----------------------------------------------------------------------
diff --git
a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java
b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java
index 56cdd0b..fb5119f 100644
---
a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java
+++
b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java
@@ -16,6 +16,7 @@
*/
package org.jclouds.openstack.glance.v1_0.features;
+import static
org.jclouds.openstack.glance.v1_0.options.CreateImageOptions.Builder.copyFrom;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNull;
@@ -223,6 +224,28 @@ public class ImageApiExpectTest extends
BaseGlanceExpectTest {
apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").create("test",
new StringPayload("somedata"));
}
+ public void testImageCreateCopyFrom() throws Exception {
+ HttpRequest get = HttpRequest.builder().method("POST")
+ .endpoint("https://glance.jclouds.org:9292/v1.0/images")
+ .addHeader("x-image-meta-name", "test")
+ .addHeader("Accept", MediaType.APPLICATION_JSON)
+ .addHeader("x-glance-api-copy-from",
"http://1.1.1.1/Installs/Templates/tiny/tinylinux-v2.qcow2")
+ .addHeader("X-Auth-Token", authToken)
+ .payload(payloadFromStringWithContentType("",
MediaType.APPLICATION_OCTET_STREAM)).build();
+
+ HttpResponse createResponse = HttpResponse.builder().statusCode(200)
+ .payload(payloadFromResource("/image.json")).build();
+
+ GlanceApi apiWhenExist =
requestsSendResponses(keystoneAuthWithUsernameAndPassword,
+ responseWithKeystoneAccess, versionNegotiationRequest,
versionNegotiationResponse,
+ get, createResponse);
+
+ assertEquals(apiWhenExist.getConfiguredZones(),
ImmutableSet.of("az-1.region-a.geo-1"));
+
+
assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").create("test",
new StringPayload(""),
copyFrom("http://1.1.1.1/Installs/Templates/tiny/tinylinux-v2.qcow2")),
+ new ParseImageDetailsTest().expected());
+}
+
public void testReserveWhenResponseIs2xx() throws Exception {
HttpRequest get = HttpRequest.builder().method("POST")
.endpoint("https://glance.jclouds.org:9292/v1.0/images")
http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/c82fbd16/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
----------------------------------------------------------------------
diff --git
a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
index c624224..b882220 100644
---
a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
+++
b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
@@ -18,12 +18,15 @@ package org.jclouds.openstack.glance.v1_0.features;
import static
org.jclouds.openstack.glance.v1_0.options.CreateImageOptions.Builder.containerFormat;
+import static
org.jclouds.openstack.glance.v1_0.options.CreateImageOptions.Builder.copyFrom;
import static
org.jclouds.openstack.glance.v1_0.options.CreateImageOptions.Builder.diskFormat;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
+import java.util.Random;
import java.util.Set;
+import com.google.common.collect.ImmutableList;
import org.jclouds.io.payloads.StringPayload;
import org.jclouds.openstack.glance.v1_0.domain.ContainerFormat;
import org.jclouds.openstack.glance.v1_0.domain.DiskFormat;
@@ -32,13 +35,34 @@ import
org.jclouds.openstack.glance.v1_0.domain.ImageDetails;
import org.jclouds.openstack.glance.v1_0.internal.BaseGlanceApiLiveTest;
import org.jclouds.openstack.glance.v1_0.options.ListImageOptions;
import org.jclouds.openstack.glance.v1_0.options.UpdateImageOptions;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.collect.Iterables;
-@Test(groups = "live", testName = "ImageApiLiveTest")
+@Test(groups = "live", testName = "ImageApiLiveTest", singleThreaded = true)
public class ImageApiLiveTest extends BaseGlanceApiLiveTest {
+ public static final String IMAGE_NAME_PREFIX = "jclouds-live-test-";
+
+ public static String imageName;
+ public static String updatedImageName;
+
+ @BeforeClass
+ public void init() {
+ Random random = new Random();
+ imageName = IMAGE_NAME_PREFIX + random.nextInt();
+ updatedImageName = IMAGE_NAME_PREFIX + random.nextInt();
+ }
+
+ @AfterTest
+ public void tearDown() {
+ for (String zoneId : api.getConfiguredZones()) {
+ cleanImagesByZoneAndName(zoneId, imageName, updatedImageName);
+ }
+ }
+
@Test
public void testList() throws Exception {
for (String zoneId : api.getConfiguredZones()) {
@@ -89,25 +113,25 @@ public class ImageApiLiveTest extends
BaseGlanceApiLiveTest {
StringPayload imageData = new StringPayload("This isn't really an
image!");
for (String zoneId : api.getConfiguredZones()) {
ImageApi imageApi = api.getImageApiForZone(zoneId);
- ImageDetails details = imageApi.create("jclouds-live-test",
imageData, diskFormat(DiskFormat.RAW), containerFormat(ContainerFormat.BARE));
- assertEquals(details.getName(), "jclouds-live-test");
+ ImageDetails details = imageApi.create(imageName, imageData,
diskFormat(DiskFormat.RAW), containerFormat(ContainerFormat.BARE));
+ assertEquals(details.getName(), imageName);
assertEquals(details.getSize().get().longValue(),
imageData.getRawContent().length());
- details = imageApi.update(details.getId(),
UpdateImageOptions.Builder.name("jclouds-live-test2"),
UpdateImageOptions.Builder.minDisk(10));
- assertEquals(details.getName(), "jclouds-live-test2");
+ details = imageApi.update(details.getId(),
UpdateImageOptions.Builder.name(updatedImageName),
UpdateImageOptions.Builder.minDisk(10));
+ assertEquals(details.getName(), updatedImageName);
assertEquals(details.getMinDisk(), 10);
Image fromListing = imageApi.list(
-
ListImageOptions.Builder.containerFormat(ContainerFormat.BARE).name("jclouds-live-test2").limit(2))
+
ListImageOptions.Builder.containerFormat(ContainerFormat.BARE).name(updatedImageName).limit(2))
.get(0);
assertEquals(fromListing.getId(), details.getId());
assertEquals(fromListing.getSize(), details.getSize());
-
assertEquals(Iterables.getOnlyElement(imageApi.listInDetail(ListImageOptions.Builder.name("jclouds-live-test2"))),
details);
+
assertEquals(Iterables.getOnlyElement(imageApi.listInDetail(ListImageOptions.Builder.name(updatedImageName))),
details);
assertTrue(imageApi.delete(details.getId()));
-
assertTrue(imageApi.list(ListImageOptions.Builder.name("jclouds-live-test2")).isEmpty());
+
assertTrue(imageApi.list(ListImageOptions.Builder.name(updatedImageName)).isEmpty());
}
}
@@ -116,24 +140,56 @@ public class ImageApiLiveTest extends
BaseGlanceApiLiveTest {
StringPayload imageData = new StringPayload("This isn't an image!");
for (String zoneId : api.getConfiguredZones()) {
ImageApi imageApi = api.getImageApiForZone(zoneId);
- ImageDetails details = imageApi.reserve("jclouds-live-res-test",
diskFormat(DiskFormat.RAW), containerFormat(ContainerFormat.BARE));
- assertEquals(details.getName(), "jclouds-live-res-test");
+ ImageDetails details = imageApi.reserve(imageName,
diskFormat(DiskFormat.RAW), containerFormat(ContainerFormat.BARE));
+ assertEquals(details.getName(), imageName);
- details = imageApi.upload(details.getId(), imageData,
UpdateImageOptions.Builder.name("jclouds-live-res-test2"),
UpdateImageOptions.Builder.minDisk(10));
- assertEquals(details.getName(), "jclouds-live-res-test2");
+ details = imageApi.upload(details.getId(), imageData,
UpdateImageOptions.Builder.name(updatedImageName),
UpdateImageOptions.Builder.minDisk(10));
+ assertEquals(details.getName(), updatedImageName);
assertEquals(details.getSize().get().longValue(),
imageData.getRawContent().length());
assertEquals(details.getMinDisk(), 10);
- Image fromListing =
Iterables.getOnlyElement(imageApi.list(ListImageOptions.Builder.name("jclouds-live-res-test2").limit(2).containerFormat(ContainerFormat.BARE)));
+ Image fromListing =
Iterables.getOnlyElement(imageApi.list(ListImageOptions.Builder.name(updatedImageName).limit(2).containerFormat(ContainerFormat.BARE)));
assertEquals(fromListing.getId(), details.getId());
assertEquals(fromListing.getSize(), details.getSize());
-
assertEquals(Iterables.getOnlyElement(imageApi.listInDetail(ListImageOptions.Builder.name("jclouds-live-res-test2"))),
details);
+
assertEquals(Iterables.getOnlyElement(imageApi.listInDetail(ListImageOptions.Builder.name(updatedImageName))),
details);
assertTrue(imageApi.delete(details.getId()));
-
assertTrue(imageApi.list(ListImageOptions.Builder.name("jclouds-live-res-test2")).isEmpty());
+
assertTrue(imageApi.list(ListImageOptions.Builder.name(updatedImageName)).isEmpty());
+ }
+ }
+
+ @Test
+ public void testCreateImageCopyFromLocation() {
+ StringPayload imageData = new StringPayload("");
+ for (String zoneId : api.getConfiguredZones()) {
+ ImageApi imageApi = api.getImageApiForZone(zoneId);
+ ImageDetails details = imageApi.create(imageName, imageData,
diskFormat(DiskFormat.RAW), containerFormat(ContainerFormat.BARE),
copyFrom("http://10.5.5.121/Installs/Templates/tiny/tinylinux-v2.qcow2"));
+ assertEquals(details.getName(), imageName);
+
+ Image fromListing = imageApi.get(details.getId());
+
+ assertEquals(fromListing.getId(), details.getId());
+ assertEquals(fromListing.getSize(), details.getSize());
+ assertEquals(fromListing.getContainerFormat(),
details.getContainerFormat());
+ assertEquals(fromListing.getDiskFormat(), details.getDiskFormat());
+ assertEquals(fromListing.getSize(), details.getSize());
+
+ assertTrue(imageApi.delete(details.getId()));
+
assertTrue(imageApi.list(ListImageOptions.Builder.name(imageName)).isEmpty());
}
}
+ private void cleanImagesByZoneAndName(String zoneId, String... imageNames) {
+ ImageApi imageApi = api.getImageApiForZone(zoneId);
+
+ for (String imageName : imageNames) {
+ ImmutableList<Image> images =
imageApi.list(ListImageOptions.Builder.name(imageName)).toList();
+
+ for (Image image : images) {
+ imageApi.delete(image.getId());
+ }
+ }
+ }
}