Repository: jclouds-labs-google Updated Branches: refs/heads/master c33b64c61 -> e81df9f75
JCLOUDS-649: Added image creation from pd and made Image rawDisk Optional<T> Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/commit/e81df9f7 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/tree/e81df9f7 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/diff/e81df9f7 Branch: refs/heads/master Commit: e81df9f7572fd193d65a6d5709eb1a791381a04d Parents: c33b64c Author: Daniel Broudy <[email protected]> Authored: Wed Oct 15 10:33:27 2014 -0700 Committer: Daniel Broudy <[email protected]> Committed: Thu Oct 16 10:21:08 2014 -0700 ---------------------------------------------------------------------- .../googlecomputeengine/domain/Image.java | 10 ++--- .../googlecomputeengine/features/ImageApi.java | 22 ++++++++++ .../features/DiskApiLiveTest.java | 2 - .../features/ImageApiExpectTest.java | 44 +++++++++++++++++++ .../features/ImageApiLiveTest.java | 46 ++++++++++++++++++++ .../BaseGoogleComputeEngineApiLiveTest.java | 6 +++ .../test/resources/image_insert_from_pd.json | 1 + 7 files changed, 124 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/e81df9f7/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java index 777b3e7..84c6975 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Image.java @@ -39,7 +39,7 @@ import com.google.common.base.Optional; public final class Image extends Resource { private final String sourceType; - private final RawDisk rawDisk; + private final Optional<RawDisk> rawDisk; private final Optional<Deprecated> deprecated; @ConstructorProperties({ @@ -50,7 +50,7 @@ public final class Image extends Resource { String sourceType, RawDisk rawDisk, Deprecated deprecated) { super(Kind.IMAGE, id, creationTimestamp, selfLink, name, description); this.sourceType = checkNotNull(sourceType, "sourceType of %s", name); - this.rawDisk = checkNotNull(rawDisk, "rawDisk of %s", name); + this.rawDisk = fromNullable(rawDisk); this.deprecated = fromNullable(deprecated); } @@ -64,7 +64,7 @@ public final class Image extends Resource { /** * @return the raw disk image parameters. */ - public RawDisk getRawDisk() { + public Optional<RawDisk> getRawDisk() { return rawDisk; } @@ -146,7 +146,7 @@ public final class Image extends Resource { public Builder fromImage(Image in) { return super.fromResource(in) .sourceType(in.getSourceType()) - .rawDisk(in.getRawDisk()) + .rawDisk(in.getRawDisk().orNull()) .deprecated(in.getDeprecated().orNull()); } @@ -188,7 +188,7 @@ public final class Image extends Resource { } /** - * @return an optional SHA1 checksum of the disk image before unpackaging; provided by the client when the disk + * @return an optional SHA1 checksum of the disk image before unpacking; provided by the client when the disk * image is created. */ public Optional<String> getSha1Checksum() { http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/e81df9f7/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java index d5755f2..f52d5cd 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ImageApi.java @@ -23,8 +23,10 @@ import javax.inject.Named; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; @@ -41,10 +43,13 @@ import org.jclouds.javax.annotation.Nullable; import org.jclouds.oauth.v2.config.OAuthScopes; import org.jclouds.oauth.v2.filters.OAuthAuthenticationFilter; 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.SkipEncoding; import org.jclouds.rest.annotations.Transform; +import org.jclouds.rest.binders.BindToJsonPayload; /** * Provides access to Images via their REST API. @@ -164,4 +169,21 @@ public interface ImageApi { @Fallback(EmptyPagedIterableOnNotFoundOr404.class) PagedIterable<Image> list(ListOptions options); + /** + * Creates an image resource in the specified project from the provided persistent disk. + * + * @param imageName the name of the created image + * @param sourceDisk fully qualified URL for the persistent disk to create the image from + * @return an Operation resource. To check on the status of an operation, poll the Operations resource returned to + * you, and look for the status field. + */ + @Named("Images:insert") + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/global/images") + @OAuthScopes(COMPUTE_SCOPE) + @MapBinder(BindToJsonPayload.class) + Operation createImageFromPD(@PayloadParam("name") String imageName, @PayloadParam("sourceDisk") String sourceDisk); + } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/e81df9f7/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java index bd26621..a1e197c 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java @@ -23,7 +23,6 @@ import java.util.List; import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.domain.Disk; -import org.jclouds.googlecomputeengine.domain.Project; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; import org.jclouds.googlecomputeengine.options.ListOptions; import org.testng.annotations.Test; @@ -43,7 +42,6 @@ public class DiskApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { @Test(groups = "live") public void testInsertDisk() { - Project project = api.getProjectApi().get(userProject.get()); assertZoneOperationDoneSucessfully(api().createInZone(DISK_NAME, sizeGb, DEFAULT_ZONE_NAME), TIME_WAIT); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/e81df9f7/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiExpectTest.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiExpectTest.java index 1deb178..0665e1b 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiExpectTest.java @@ -28,6 +28,7 @@ import org.jclouds.googlecomputeengine.parse.ParseImageTest; import org.jclouds.googlecomputeengine.parse.ParseOperationTest; import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpResponse; +import org.jclouds.rest.ResourceNotFoundException; import org.testng.annotations.Test; @Test(groups = "unit") @@ -156,4 +157,47 @@ public class ImageApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { assertTrue(imageApi.list().concat().isEmpty()); } + + public void testCreateImageFromPdResponseIs2xx(){ + HttpRequest createImage = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/images") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResource("/image_insert_from_pd.json")) + .build(); + + HttpResponse createImageResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/operation.json")).build(); + + ImageApi imageApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, createImage, createImageResponse).getImageApiForProject("myproject"); + + assertEquals(imageApi.createImageFromPD("my-image", "https://www.googleapis.com/" + + "compute/v1/projects/myproject/zones/us-central1-a/disks/mydisk"), + new ParseOperationTest().expected()); + } + + @Test(expectedExceptions = ResourceNotFoundException.class) + public void testCreateImageFromPdResponseIs4xx() { + HttpRequest createImage = HttpRequest + .builder() + .method("POST") + .endpoint("https://www.googleapis" + + ".com/compute/v1/projects/myproject/global/images") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromResource("/image_insert_from_pd.json")) + .build(); + + HttpResponse createImageResponse = HttpResponse.builder().statusCode(404).build(); + + ImageApi imageApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, createImage, createImageResponse).getImageApiForProject("myproject"); + + imageApi.createImageFromPD("my-image", "https://www.googleapis.com/" + + "compute/v1/projects/myproject/zones/us-central1-a/disks/mydisk"); + } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/e81df9f7/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java index a4922b4..9c9ca55 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java @@ -21,11 +21,13 @@ import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; +import java.net.URI; import java.util.Iterator; import java.util.List; import org.jclouds.collect.IterableWithMarker; import org.jclouds.collect.PagedIterable; +import org.jclouds.googlecomputeengine.domain.Disk; import org.jclouds.googlecomputeengine.domain.Image; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; import org.jclouds.googlecomputeengine.options.ListOptions; @@ -36,12 +38,26 @@ import com.google.common.collect.Lists; public class ImageApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { + public static final String DISK_NAME = "image-api-live-test-disk"; + public static final int TIME_WAIT = 300; + public static final int sizeGb = 10; + public static final String IMAGE_NAME = "image-api-live-test-image"; + private Image image; + private URI diskURI; private ImageApi api() { return api.getImageApiForProject("centos-cloud"); } + private ImageApi imageApi(){ + return api.getImageApiForProject(userProject.get()); + } + + private DiskApi diskApi() { + return api.getDiskApiForProject(userProject.get()); + } + @Test(groups = "live") public void testListImage() { @@ -70,5 +86,35 @@ public class ImageApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { assertEquals(result.getName(), expected.getName()); } + @Test(groups = "live") + public void testInsertDisk() { + assertZoneOperationDoneSucessfully(diskApi().createInZone(DISK_NAME, sizeGb, DEFAULT_ZONE_NAME), TIME_WAIT); + Disk disk = diskApi().getInZone(DEFAULT_ZONE_NAME, DISK_NAME); + diskURI = disk.getSelfLink(); + } + + @Test(groups = "live", dependsOnMethods = "testInsertDisk") + public void testCreateImageFromPD(){ + assertGlobalOperationDoneSucessfully(imageApi().createImageFromPD(IMAGE_NAME, diskURI.toString()), TIME_WAIT); + } + + @Test(groups = "live", dependsOnMethods = "testCreateImageFromPD") + public void testGetCreatedImage(){ + Image image = imageApi().get(IMAGE_NAME); + assertImageEquals(image); + } + + @Test(groups = "live", dependsOnMethods = "testGetCreatedImage") + public void testCleanup(){ + assertGlobalOperationDoneSucessfully(imageApi().delete(IMAGE_NAME), TIME_WAIT); + assertZoneOperationDoneSucessfully(diskApi().deleteInZone(DEFAULT_ZONE_NAME, DISK_NAME), TIME_WAIT); + } + + private void assertImageEquals(Image result) { + assertEquals(result.getName(), IMAGE_NAME); + assertEquals(result.getSourceType(), "RAW"); + assertEquals(result.getSelfLink(), getImageUrl(userProject.get(), IMAGE_NAME) ); + } + } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/e81df9f7/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java index 2c018eb..836e6d0 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java @@ -58,6 +58,8 @@ public class BaseGoogleComputeEngineApiLiveTest extends BaseApiLiveTest<GoogleCo protected static final String GATEWAY_API_URL_SUFFIX = "/global/gateways/"; protected static final String DEFAULT_GATEWAY_NAME = "default-internet-gateway"; + protected static final String IMAGE_API_URL_SUFFIX = "/global/images/"; + protected static final String GOOGLE_PROJECT = "google"; protected Supplier<String> userProject; @@ -136,6 +138,10 @@ public class BaseGoogleComputeEngineApiLiveTest extends BaseApiLiveTest<GoogleCo return URI.create(API_URL_PREFIX + project + GATEWAY_API_URL_SUFFIX + gateway); } + protected URI getImageUrl(String project, String image){ + return URI.create(API_URL_PREFIX + project + IMAGE_API_URL_SUFFIX + image); + } + protected URI getDefaultMachineTypeUrl(String project) { return getMachineTypeUrl(project, DEFAULT_MACHINE_TYPE_NAME); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/e81df9f7/google-compute-engine/src/test/resources/image_insert_from_pd.json ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/test/resources/image_insert_from_pd.json b/google-compute-engine/src/test/resources/image_insert_from_pd.json new file mode 100644 index 0000000..0fa2a01 --- /dev/null +++ b/google-compute-engine/src/test/resources/image_insert_from_pd.json @@ -0,0 +1 @@ +{"name":"my-image","sourceDisk":"https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/disks/mydisk"} \ No newline at end of file
