From c671888f94f89c4289b8a21a873b4e57083aa5b1 Mon Sep 17 00:00:00 2001 From: Marco Ziccardi Date: Fri, 1 Apr 2016 19:12:19 +0200 Subject: [PATCH] Fix image's delete and deprecate methods, document image's list and update tests --- .../com/google/gcloud/compute/Compute.java | 11 ++++++-- .../google/gcloud/compute/ComputeImpl.java | 11 +++++--- .../java/com/google/gcloud/compute/Image.java | 4 +-- .../com/google/gcloud/spi/ComputeRpc.java | 4 +-- .../google/gcloud/spi/DefaultComputeRpc.java | 8 +++--- .../gcloud/compute/ComputeImplTest.java | 27 +++++++++--------- .../com/google/gcloud/compute/ImageTest.java | 28 ++++++++++++++++++- 7 files changed, 64 insertions(+), 29 deletions(-) diff --git a/gcloud-java-compute/src/main/java/com/google/gcloud/compute/Compute.java b/gcloud-java-compute/src/main/java/com/google/gcloud/compute/Compute.java index b433294ecad8..300d38908a8b 100644 --- a/gcloud-java-compute/src/main/java/com/google/gcloud/compute/Compute.java +++ b/gcloud-java-compute/src/main/java/com/google/gcloud/compute/Compute.java @@ -1832,9 +1832,14 @@ public static ImageListOption fields(ImageField... fields) { Image get(ImageId imageId, ImageOption... options); /** - * Lists images in the provided project that are available to the current user. + * Lists images in the provided project that are available to the current user. This method can be + * used to list publicly-available images by providing the respective image project. Examples of + * image projects are: {@code centos-cloud}, {@code coreos-cloud}, {@code debian-cloud}, + * {@code opensuse-cloud}, {@code rhel-cloud}, {@code suse-cloud}, {@code ubuntu-os-cloud} and + * {@code windows-cloud}. Attempting to delete or deprecate a publicly-available image will fail. * * @throws ComputeException upon failure + * @see Operating Systems */ Page listImages(String project, ImageListOption... options); @@ -1850,7 +1855,7 @@ public static ImageListOption fields(ImageField... fields) { * * @return a global operation if the delete request was issued correctly, {@code null} if the * image was not found - * @throws ComputeException upon failure + * @throws ComputeException upon failure or if {@code image} is a publicly-available image */ Operation delete(ImageId image, OperationOption... options); @@ -1859,7 +1864,7 @@ public static ImageListOption fields(ImageField... fields) { * * @return a global operation if the deprecation request was issued correctly, {@code null} if the * image was not found - * @throws ComputeException upon failure + * @throws ComputeException upon failure or if {@code image} is a publicly-available image */ Operation deprecate(ImageId image, DeprecationStatus deprecationStatus, OperationOption... options); diff --git a/gcloud-java-compute/src/main/java/com/google/gcloud/compute/ComputeImpl.java b/gcloud-java-compute/src/main/java/com/google/gcloud/compute/ComputeImpl.java index dda8dbe69bc4..1f875ad337f1 100644 --- a/gcloud-java-compute/src/main/java/com/google/gcloud/compute/ComputeImpl.java +++ b/gcloud-java-compute/src/main/java/com/google/gcloud/compute/ComputeImpl.java @@ -1124,14 +1124,15 @@ public Image apply(com.google.api.services.compute.model.Image image) { } @Override - public Operation delete(final ImageId image, OperationOption... options) { + public Operation delete(ImageId image, OperationOption... options) { + final ImageId completeId = image.setProjectId(options().projectId()); final Map optionsMap = optionMap(options); try { com.google.api.services.compute.model.Operation answer = runWithRetries(new Callable() { @Override public com.google.api.services.compute.model.Operation call() { - return computeRpc.deleteImage(image.image(), optionsMap); + return computeRpc.deleteImage(completeId.project(), completeId.image(), optionsMap); } }, options().retryParams(), EXCEPTION_HANDLER); return answer == null ? null : Operation.fromPb(this, answer); @@ -1141,15 +1142,17 @@ public com.google.api.services.compute.model.Operation call() { } @Override - public Operation deprecate(final ImageId image, + public Operation deprecate(ImageId image, final DeprecationStatus deprecationStatus, OperationOption... options) { + final ImageId completeId = image.setProjectId(options().projectId()); final Map optionsMap = optionMap(options); try { com.google.api.services.compute.model.Operation answer = runWithRetries(new Callable() { @Override public com.google.api.services.compute.model.Operation call() { - return computeRpc.deprecateImage(image.image(), deprecationStatus.toPb(), optionsMap); + return computeRpc.deprecateImage(completeId.project(), completeId.image(), + deprecationStatus.toPb(), optionsMap); } }, options().retryParams(), EXCEPTION_HANDLER); return answer == null ? null : Operation.fromPb(this, answer); diff --git a/gcloud-java-compute/src/main/java/com/google/gcloud/compute/Image.java b/gcloud-java-compute/src/main/java/com/google/gcloud/compute/Image.java index e42a292f72ab..7815929f3bf3 100644 --- a/gcloud-java-compute/src/main/java/com/google/gcloud/compute/Image.java +++ b/gcloud-java-compute/src/main/java/com/google/gcloud/compute/Image.java @@ -156,7 +156,7 @@ public Image reload(ImageOption... options) { * * @return a global operation if the delete request was successfully sent, {@code null} if the * image was not found - * @throws ComputeException upon failure + * @throws ComputeException upon failure or if this image is a publicly-available image */ public Operation delete(OperationOption... options) { return compute.delete(imageId(), options); @@ -167,7 +167,7 @@ public Operation delete(OperationOption... options) { * * @return a global operation if the deprecation request was successfully sent, {@code null} if * the image was not found - * @throws ComputeException upon failure + * @throws ComputeException upon failure or if this image is a publicly-available image */ public Operation deprecate(DeprecationStatus deprecationStatus, OperationOption... options) { diff --git a/gcloud-java-compute/src/main/java/com/google/gcloud/spi/ComputeRpc.java b/gcloud-java-compute/src/main/java/com/google/gcloud/spi/ComputeRpc.java index afdf38a27961..523686283db0 100644 --- a/gcloud-java-compute/src/main/java/com/google/gcloud/spi/ComputeRpc.java +++ b/gcloud-java-compute/src/main/java/com/google/gcloud/spi/ComputeRpc.java @@ -366,7 +366,7 @@ Operation createSnapshot(String zone, String disk, String snapshot, String descr * image was not found * @throws ComputeException upon failure */ - Operation deleteImage(String image, Map options); + Operation deleteImage(String project, String image, Map options); /** * Deprecates the requested image. @@ -375,6 +375,6 @@ Operation createSnapshot(String zone, String disk, String snapshot, String descr * image was not found * @throws ComputeException upon failure */ - Operation deprecateImage(String image, DeprecationStatus deprecationStatus, + Operation deprecateImage(String project, String image, DeprecationStatus deprecationStatus, Map options); } diff --git a/gcloud-java-compute/src/main/java/com/google/gcloud/spi/DefaultComputeRpc.java b/gcloud-java-compute/src/main/java/com/google/gcloud/spi/DefaultComputeRpc.java index 31b2de22f8af..7d0b77a7a73a 100644 --- a/gcloud-java-compute/src/main/java/com/google/gcloud/spi/DefaultComputeRpc.java +++ b/gcloud-java-compute/src/main/java/com/google/gcloud/spi/DefaultComputeRpc.java @@ -609,10 +609,10 @@ public Tuple> listImages(String project, Map } @Override - public Operation deleteImage(String image, Map options) { + public Operation deleteImage(String project, String image, Map options) { try { return compute.images() - .delete(this.options.projectId(), image) + .delete(project, image) .setFields(FIELDS.getString(options)) .execute(); } catch (IOException ex) { @@ -621,11 +621,11 @@ public Operation deleteImage(String image, Map options) { } @Override - public Operation deprecateImage(String image, DeprecationStatus deprecationStatus, + public Operation deprecateImage(String project, String image, DeprecationStatus deprecationStatus, Map options) { try { return compute.images() - .deprecate(this.options.projectId(), image, deprecationStatus) + .deprecate(project, image, deprecationStatus) .setFields(FIELDS.getString(options)) .execute(); } catch (IOException ex) { diff --git a/gcloud-java-compute/src/test/java/com/google/gcloud/compute/ComputeImplTest.java b/gcloud-java-compute/src/test/java/com/google/gcloud/compute/ComputeImplTest.java index 5d66d02853e9..ec981a95e0e7 100644 --- a/gcloud-java-compute/src/test/java/com/google/gcloud/compute/ComputeImplTest.java +++ b/gcloud-java-compute/src/test/java/com/google/gcloud/compute/ComputeImplTest.java @@ -194,7 +194,7 @@ public class ComputeImplTest { private static final DiskId DISK_ID = DiskId.of("project", "zone", "disk"); private static final SnapshotId SNAPSHOT_ID = SnapshotId.of("project", "snapshot"); private static final SnapshotInfo SNAPSHOT = SnapshotInfo.of(SNAPSHOT_ID, DISK_ID); - private static final ImageId IMAGE_ID = ImageId.of("project", "snapshot"); + private static final ImageId IMAGE_ID = ImageId.of("project", "image"); private static final ImageInfo IMAGE = ImageInfo.of(IMAGE_ID, DiskImageConfiguration.of(DISK_ID)); private static final DeprecationStatus DEPRECATION_STATUS = DeprecationStatus.builder(DeprecationStatus.Status.DEPRECATED, IMAGE_ID).build(); @@ -2191,8 +2191,8 @@ public void testGetImageWithSelectedFields() { @Test public void testDeleteImage_Operation() { - EasyMock.expect(computeRpcMock.deleteImage(IMAGE_ID.image(), EMPTY_RPC_OPTIONS)) - .andReturn(globalOperation.toPb()); + EasyMock.expect(computeRpcMock.deleteImage(IMAGE_ID.project(), IMAGE_ID.image(), + EMPTY_RPC_OPTIONS)).andReturn(globalOperation.toPb()); EasyMock.replay(computeRpcMock); compute = options.service(); assertEquals(globalOperation, compute.delete(IMAGE_ID)); @@ -2201,11 +2201,11 @@ public void testDeleteImage_Operation() { @Test public void testDeleteImageWithSelectedFields_Operation() { Capture> capturedOptions = Capture.newInstance(); - EasyMock.expect(computeRpcMock.deleteImage(eq(IMAGE_ID.image()), capture(capturedOptions))) - .andReturn(globalOperation.toPb()); + EasyMock.expect(computeRpcMock.deleteImage(eq(PROJECT), eq(IMAGE_ID.image()), + capture(capturedOptions))).andReturn(globalOperation.toPb()); EasyMock.replay(computeRpcMock); compute = options.service(); - Operation operation = compute.delete(IMAGE_ID, OPERATION_OPTION_FIELDS); + Operation operation = compute.delete(ImageId.of("image"), OPERATION_OPTION_FIELDS); String selector = (String) capturedOptions.getValue().get(OPERATION_OPTION_FIELDS.rpcOption()); assertTrue(selector.contains("selfLink")); assertTrue(selector.contains("id")); @@ -2216,8 +2216,8 @@ public void testDeleteImageWithSelectedFields_Operation() { @Test public void testDeleteImage_Null() { - EasyMock.expect(computeRpcMock.deleteImage(IMAGE_ID.image(), EMPTY_RPC_OPTIONS)) - .andReturn(null); + EasyMock.expect(computeRpcMock.deleteImage(IMAGE_ID.project(), IMAGE_ID.image(), + EMPTY_RPC_OPTIONS)).andReturn(null); EasyMock.replay(computeRpcMock); compute = options.service(); assertNull(compute.delete(IMAGE_ID)); @@ -2225,7 +2225,7 @@ public void testDeleteImage_Null() { @Test public void testDeprecateImage_Operation() { - EasyMock.expect(computeRpcMock.deprecateImage(IMAGE_ID.image(), + EasyMock.expect(computeRpcMock.deprecateImage(IMAGE_ID.project(), IMAGE_ID.image(), DEPRECATION_STATUS.toPb(), EMPTY_RPC_OPTIONS)).andReturn(globalOperation.toPb()); EasyMock.replay(computeRpcMock); compute = options.service(); @@ -2235,11 +2235,12 @@ public void testDeprecateImage_Operation() { @Test public void testDeprecateImageWithSelectedFields_Operation() { Capture> capturedOptions = Capture.newInstance(); - EasyMock.expect(computeRpcMock.deprecateImage(eq(IMAGE_ID.image()), + EasyMock.expect(computeRpcMock.deprecateImage(eq(PROJECT), eq(IMAGE_ID.image()), eq(DEPRECATION_STATUS.toPb()), capture(capturedOptions))).andReturn(globalOperation.toPb()); EasyMock.replay(computeRpcMock); compute = options.service(); - Operation operation = compute.deprecate(IMAGE_ID, DEPRECATION_STATUS, OPERATION_OPTION_FIELDS); + Operation operation = + compute.deprecate(ImageId.of("image"), DEPRECATION_STATUS, OPERATION_OPTION_FIELDS); String selector = (String) capturedOptions.getValue().get(OPERATION_OPTION_FIELDS.rpcOption()); assertTrue(selector.contains("selfLink")); assertTrue(selector.contains("id")); @@ -2250,8 +2251,8 @@ public void testDeprecateImageWithSelectedFields_Operation() { @Test public void testDeprecateImage_Null() { - EasyMock.expect(computeRpcMock.deprecateImage(IMAGE_ID.image(), DEPRECATION_STATUS.toPb(), - EMPTY_RPC_OPTIONS)).andReturn(null); + EasyMock.expect(computeRpcMock.deprecateImage(IMAGE_ID.project(), IMAGE_ID.image(), + DEPRECATION_STATUS.toPb(), EMPTY_RPC_OPTIONS)).andReturn(null); EasyMock.replay(computeRpcMock); compute = options.service(); assertNull(compute.deprecate(IMAGE_ID, DEPRECATION_STATUS)); diff --git a/gcloud-java-compute/src/test/java/com/google/gcloud/compute/ImageTest.java b/gcloud-java-compute/src/test/java/com/google/gcloud/compute/ImageTest.java index b46deb9bff85..dcf7e2513e07 100644 --- a/gcloud-java-compute/src/test/java/com/google/gcloud/compute/ImageTest.java +++ b/gcloud-java-compute/src/test/java/com/google/gcloud/compute/ImageTest.java @@ -28,6 +28,7 @@ import static org.junit.Assert.assertTrue; import com.google.common.collect.ImmutableList; +import com.google.gcloud.compute.DeprecationStatus.Status; import com.google.gcloud.compute.ImageConfiguration.SourceType; import org.junit.Test; @@ -64,7 +65,7 @@ public class ImageTest { .sourceType(SOURCE_TYPE) .build(); private static final DeprecationStatus DEPRECATION_STATUS = - DeprecationStatus.of(DeprecationStatus.Status.DELETED, IMAGE_ID); + DeprecationStatus.of(Status.DELETED, IMAGE_ID); private final Compute serviceMockReturnsOptions = createStrictMock(Compute.class); private final ComputeOptions mockOptions = createMock(ComputeOptions.class); @@ -263,6 +264,31 @@ public void testReloadWithOptions() throws Exception { verify(compute); } + @Test + public void testDeprecateImage() { + initializeExpectedImage(3); + expect(compute.options()).andReturn(mockOptions); + Operation operation = new Operation.Builder(serviceMockReturnsOptions) + .operationId(GlobalOperationId.of("project", "op")) + .build(); + DeprecationStatus status = DeprecationStatus.of(Status.DEPRECATED, IMAGE_ID); + expect(compute.deprecate(IMAGE_ID, status)).andReturn(operation); + replay(compute); + initializeImage(); + assertSame(operation, image.deprecate(status)); + } + + @Test + public void testDeprecateNull() { + initializeExpectedImage(2); + expect(compute.options()).andReturn(mockOptions); + DeprecationStatus status = DeprecationStatus.of(Status.DEPRECATED, IMAGE_ID); + expect(compute.deprecate(IMAGE_ID, status)).andReturn(null); + replay(compute); + initializeImage(); + assertNull(image.deprecate(status)); + } + public void compareImage(Image expected, Image value) { assertEquals(expected, value); assertEquals(expected.compute().options(), value.compute().options());