From 1b30e222f476f27151543ed26bb2d6a825fc4a1c Mon Sep 17 00:00:00 2001 From: Andrew Bayer Date: Wed, 24 Jul 2013 12:51:28 -0700 Subject: [PATCH] JCLOUDS-192. Move GCE to API v1beta15 - no new APIs added other than Zone/GlobalOperations, which are needed for zone-scoping changes. --- google-compute-engine/pom.xml | 4 +- .../GoogleComputeEngineApi.java | 31 ++- .../GoogleComputeEngineApiMetadata.java | 32 +-- .../GoogleComputeEngineConstants.java | 8 +- .../compute/GoogleComputeEngineService.java | 44 ++-- .../GoogleComputeEngineServiceAdapter.java | 168 +++++++++---- ...ogleComputeEngineServiceContextModule.java | 149 ++++++----- .../functions/BuildInstanceMetadata.java | 11 +- .../GoogleComputeEngineImageToImage.java | 25 +- ...java => InstanceInZoneToNodeMetadata.java} | 34 +-- .../MachineTypeInZoneToHardware.java | 100 ++++++++ .../functions/MachineTypeToHardware.java | 57 ----- .../OrphanedGroupsFromDeadNodes.java | 12 +- .../compute/functions/ZoneToLocation.java | 9 +- .../GoogleComputeEngineTemplateOptions.java | 17 +- .../predicates/AllNodesInGroupTerminated.java | 13 +- ...sWithGroupEncodedIntoNameThenAddToSet.java | 48 ++-- ...faultLoginCredentialsForImageStrategy.java | 18 +- ...odeCredentialsButOverrideFromTemplate.java | 9 +- .../GoogleComputeEngineHttpApiModule.java | 60 +++-- .../GoogleComputeEngineParserModule.java | 56 ++--- .../OAuthModuleWithoutTypeAdapters.java | 19 +- .../config/UserProject.java | 3 +- .../domain/AbstractDisk.java | 122 +++++++++ .../googlecomputeengine/domain/Disk.java | 71 ++---- .../googlecomputeengine/domain/Firewall.java | 26 +- .../googlecomputeengine/domain/Image.java | 218 ++++++++++++++-- .../googlecomputeengine/domain/Instance.java | 193 +++++++++++--- .../domain/InstanceInZone.java | 55 ++++ .../domain/InstanceTemplate.java | 80 +----- .../googlecomputeengine/domain/Kernel.java | 6 +- .../googlecomputeengine/domain/ListPage.java | 17 +- .../domain/MachineType.java | 119 ++++----- .../domain/MachineTypeInZone.java | 55 ++++ .../googlecomputeengine/domain/Network.java | 12 +- .../googlecomputeengine/domain/Operation.java | 77 ++++-- .../googlecomputeengine/domain/Project.java | 19 +- .../googlecomputeengine/domain/Resource.java | 31 ++- .../domain/SlashEncodedIds.java | 86 +++++++ .../googlecomputeengine/domain/Zone.java | 23 +- .../googlecomputeengine/features/DiskApi.java | 56 +++-- .../features/FirewallApi.java | 34 +-- .../features/GlobalOperationApi.java | 235 ++++++++++++++++++ .../features/ImageApi.java | 20 +- .../features/InstanceApi.java | 214 +++++++++++++--- .../features/KernelApi.java | 16 +- .../features/MachineTypeApi.java | 43 ++-- .../features/NetworkApi.java | 29 ++- .../features/ProjectApi.java | 6 +- .../googlecomputeengine/features/ZoneApi.java | 2 +- ...perationApi.java => ZoneOperationApi.java} | 79 +++--- .../internal/BaseToPagedIterable.java | 15 +- .../internal/BaseWithZoneToPagedIterable.java | 76 ++++++ .../functions/internal/PATCH.java | 3 +- .../functions/internal/ParseDisks.java | 22 +- .../functions/internal/ParseFirewalls.java | 14 +- ...ations.java => ParseGlobalOperations.java} | 20 +- .../functions/internal/ParseImages.java | 14 +- .../functions/internal/ParseInstances.java | 22 +- .../functions/internal/ParseKernels.java | 14 +- .../functions/internal/ParseMachineTypes.java | 19 +- .../functions/internal/ParseNetworks.java | 14 +- .../internal/ParseZoneOperations.java | 68 +++++ .../functions/internal/ParseZones.java | 14 +- .../handlers/FirewallBinder.java | 13 +- .../GoogleComputeEngineErrorHandler.java | 8 +- .../handlers/InstanceBinder.java | 24 +- .../handlers/MetadataBinder.java | 11 +- .../options/AttachDiskOptions.java | 113 +++++++++ .../options/FirewallOptions.java | 9 +- .../options/ListOptions.java | 8 +- ...java => GlobalOperationDonePredicate.java} | 21 +- .../ZoneOperationDonePredicate.java | 71 ++++++ .../GoogleComputeEngineApiMetadataTest.java | 5 +- .../PageSystemExpectTest.java | 14 +- .../GoogleComputeEngineServiceExpectTest.java | 202 ++++++++------- .../GoogleComputeEngineServiceLiveTest.java | 4 +- .../GoogleComputeEngineImageToImageTest.java | 10 +- .../OrphanedGroupsFromDeadNodesTest.java | 23 +- .../features/DiskApiExpectTest.java | 51 ++-- .../features/DiskApiLiveTest.java | 15 +- .../features/FirewallApiExpectTest.java | 62 ++--- .../features/FirewallApiLiveTest.java | 33 +-- ...java => GlobalOperationApiExpectTest.java} | 66 ++--- ...t.java => GlobalOperationApiLiveTest.java} | 27 +- .../features/ImageApiExpectTest.java | 33 ++- .../features/ImageApiLiveTest.java | 19 +- .../features/InstanceApiExpectTest.java | 100 +++++--- .../features/InstanceApiLiveTest.java | 56 +++-- .../features/KernelApiExpectTest.java | 18 +- .../features/KernelApiLiveTest.java | 19 +- .../features/MachineTypeApiExpectTest.java | 36 ++- .../features/MachineTypeApiLiveTest.java | 23 +- .../features/NetworkApiExpectTest.java | 30 +-- .../features/NetworkApiLiveTest.java | 4 +- .../features/ProjectApiExpectTest.java | 36 +-- .../features/ProjectApiLiveTest.java | 19 +- .../features/ZoneApiExpectTest.java | 16 +- .../features/ZoneApiLiveTest.java | 19 +- .../features/ZoneOperationApiExpectTest.java | 196 +++++++++++++++ .../GoogleComputeEngineErrorHandlerTest.java | 18 +- .../BaseGoogleComputeEngineApiExpectTest.java | 4 +- .../BaseGoogleComputeEngineApiLiveTest.java | 50 ++-- .../BaseGoogleComputeEngineExpectTest.java | 73 +++--- .../BaseGoogleComputeEngineParseTest.java | 5 +- ...ComputeEngineServiceContextExpectTest.java | 7 +- .../parse/ParseDiskListTest.java | 18 +- .../parse/ParseDiskTest.java | 13 +- .../parse/ParseFirewallListTest.java | 16 +- .../parse/ParseFirewallTest.java | 17 +- .../parse/ParseImageListTest.java | 22 +- .../parse/ParseImageTest.java | 13 +- .../parse/ParseInstanceListTest.java | 14 +- .../parse/ParseInstanceSerialOutputTest.java | 6 +- .../parse/ParseInstanceTest.java | 24 +- .../parse/ParseKernelListTest.java | 18 +- .../parse/ParseKernelTest.java | 11 +- .../parse/ParseMachineTypeListTest.java | 39 ++- .../parse/ParseMachineTypeTest.java | 16 +- .../parse/ParseMetadataTest.java | 7 +- .../parse/ParseNetworkListTest.java | 12 +- .../parse/ParseNetworkTest.java | 11 +- .../parse/ParseOperationListTest.java | 15 +- .../parse/ParseOperationTest.java | 16 +- .../parse/ParseProjectTest.java | 14 +- .../parse/ParseQuotaTest.java | 6 +- .../parse/ParseZoneListTest.java | 18 +- .../parse/ParseZoneTest.java | 11 +- .../src/test/resources/disk_get.json | 16 +- .../src/test/resources/disk_insert.json | 2 +- .../src/test/resources/disk_list.json | 30 +-- .../src/test/resources/firewall_get.json | 52 ++-- .../src/test/resources/firewall_insert.json | 2 +- .../src/test/resources/firewall_list.json | 106 ++++---- .../src/test/resources/global_operation.json | 15 ++ .../test/resources/global_operation_list.json | 22 ++ .../src/test/resources/image_get.json | 26 +- .../src/test/resources/image_insert.json | 5 +- .../src/test/resources/image_list.json | 44 ++-- .../resources/image_list_multiple_page_1.json | 106 ++++---- .../resources/image_list_multiple_page_2.json | 98 ++++---- .../resources/image_list_single_page.json | 100 ++++---- .../resources/instance_add_access_config.json | 8 +- .../src/test/resources/instance_get.json | 101 ++++---- .../src/test/resources/instance_insert.json | 2 +- .../resources/instance_insert_simple.json | 2 +- .../src/test/resources/instance_list.json | 111 +++++---- .../instance_list_central1b_empty.json | 6 + .../test/resources/instance_serial_port.json | 4 +- .../src/test/resources/kernel.json | 12 +- .../src/test/resources/kernel_list.json | 42 ++-- .../src/test/resources/logback.xml | 41 ++- .../src/test/resources/machinetype.json | 39 +-- .../src/test/resources/machinetype_list.json | 94 ++++--- .../resources/machinetype_list_central1b.json | 43 ++++ .../machinetype_list_central1b_empty.json | 6 + .../src/test/resources/network_get.json | 16 +- .../src/test/resources/network_list.json | 30 +-- .../src/test/resources/operation.json | 10 +- .../src/test/resources/operation_error.json | 22 +- .../src/test/resources/operation_list.json | 42 ++-- .../src/test/resources/project.json | 130 +++++----- .../src/test/resources/region_operation.json | 16 ++ .../test/resources/region_operation_list.json | 23 ++ .../src/test/resources/snapshot_get.json | 11 + .../src/test/resources/zone_get.json | 30 +-- .../src/test/resources/zone_list.json | 76 +++--- .../src/test/resources/zone_list_short.json | 24 ++ .../src/test/resources/zone_operation.json | 16 ++ .../test/resources/zone_operation_error.json | 25 ++ .../test/resources/zone_operation_list.json | 23 ++ 171 files changed, 4463 insertions(+), 2260 deletions(-) rename google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/{InstanceToNodeMetadata.java => InstanceInZoneToNodeMetadata.java} (87%) create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/MachineTypeInZoneToHardware.java delete mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/MachineTypeToHardware.java create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceInZone.java create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/GlobalOperationApi.java rename google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/{OperationApi.java => ZoneOperationApi.java} (62%) create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/BaseWithZoneToPagedIterable.java rename google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/{ParseOperations.java => ParseGlobalOperations.java} (87%) create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZoneOperations.java create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/AttachDiskOptions.java rename google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/{OperationDonePredicate.java => GlobalOperationDonePredicate.java} (82%) create mode 100644 google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/ZoneOperationDonePredicate.java rename google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/{OperationApiExpectTest.java => GlobalOperationApiExpectTest.java} (65%) rename google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/{OperationApiLiveTest.java => GlobalOperationApiLiveTest.java} (90%) create mode 100644 google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneOperationApiExpectTest.java create mode 100644 google-compute-engine/src/test/resources/global_operation.json create mode 100644 google-compute-engine/src/test/resources/global_operation_list.json create mode 100644 google-compute-engine/src/test/resources/instance_list_central1b_empty.json create mode 100644 google-compute-engine/src/test/resources/machinetype_list_central1b.json create mode 100644 google-compute-engine/src/test/resources/machinetype_list_central1b_empty.json create mode 100644 google-compute-engine/src/test/resources/region_operation.json create mode 100644 google-compute-engine/src/test/resources/region_operation_list.json create mode 100644 google-compute-engine/src/test/resources/snapshot_get.json create mode 100644 google-compute-engine/src/test/resources/zone_list_short.json create mode 100644 google-compute-engine/src/test/resources/zone_operation.json create mode 100644 google-compute-engine/src/test/resources/zone_operation_error.json create mode 100644 google-compute-engine/src/test/resources/zone_operation_list.json diff --git a/google-compute-engine/pom.xml b/google-compute-engine/pom.xml index da7ea53eb..4a9cbbc3a 100644 --- a/google-compute-engine/pom.xml +++ b/google-compute-engine/pom.xml @@ -34,7 +34,8 @@ Email associated with the Google API client_id Private key (PKCS12 file) associated with the Google API client_id - v1beta13 + v1beta15 + osFamily=GCEL,osVersionMatches=1[012].[01][04],locationId=us-central1-a,minRam=2048 @@ -115,6 +116,7 @@ ${test.google-compute-engine.credential} ${test.google-compute-engine.api-version} ${test.google-compute-engine.build-version} + ${test.google-compute-engine.template} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java index 2567f0b9e..575619872 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java @@ -23,14 +23,15 @@ import org.jclouds.googlecomputeengine.features.DiskApi; import org.jclouds.googlecomputeengine.features.FirewallApi; +import org.jclouds.googlecomputeengine.features.GlobalOperationApi; import org.jclouds.googlecomputeengine.features.ImageApi; import org.jclouds.googlecomputeengine.features.InstanceApi; import org.jclouds.googlecomputeengine.features.KernelApi; import org.jclouds.googlecomputeengine.features.MachineTypeApi; import org.jclouds.googlecomputeengine.features.NetworkApi; -import org.jclouds.googlecomputeengine.features.OperationApi; import org.jclouds.googlecomputeengine.features.ProjectApi; import org.jclouds.googlecomputeengine.features.ZoneApi; +import org.jclouds.googlecomputeengine.features.ZoneOperationApi; import org.jclouds.rest.annotations.Delegate; import com.google.common.annotations.Beta; @@ -41,7 +42,7 @@ *

* * @author David Alves - * @see api doc + * @see api doc */ @Beta public interface GoogleComputeEngineApi extends Closeable { @@ -64,6 +65,15 @@ public interface GoogleComputeEngineApi extends Closeable { @Path("/projects/{project}") FirewallApi getFirewallApiForProject(@PathParam("project") String projectName); + /** + * Provides access to Global Operation features + * + * @param projectName the name of the project + */ + @Delegate + @Path("/projects/{project}") + GlobalOperationApi getGlobalOperationApiForProject(@PathParam("project") String projectName); + /** * Provides access to Image features * @@ -109,15 +119,6 @@ public interface GoogleComputeEngineApi extends Closeable { @Path("/projects/{project}") NetworkApi getNetworkApiForProject(@PathParam("project") String projectName); - /** - * Provides access to Operation features - * - * @param projectName the name of the project - */ - @Delegate - @Path("/projects/{project}") - OperationApi getOperationApiForProject(@PathParam("project") String projectName); - /** * Provides access to Project features */ @@ -133,5 +134,13 @@ public interface GoogleComputeEngineApi extends Closeable { @Path("/projects/{project}") ZoneApi getZoneApiForProject(@PathParam("project") String projectName); + /** + * Provides access to Zone Operation features + * + * @param projectName the name of the project + */ + @Delegate + @Path("/projects/{project}") + ZoneOperationApi getZoneOperationApiForProject(@PathParam("project") String projectName); } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java index c7e1f2a21..0333f6ca8 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java @@ -41,7 +41,7 @@ import com.google.inject.Module; /** - * Implementation of {@link ApiMetadata} for GoogleCompute v1beta13 API + * Implementation of {@link ApiMetadata} for GoogleCompute v1beta15 API * * @author David Alves */ @@ -77,21 +77,21 @@ public static class Builder extends BaseHttpApiMetadata.Builder>builder() - .add(GoogleComputeEngineHttpApiModule.class) - .add(GoogleComputeEngineParserModule.class) - .add(OAuthAuthenticationModule.class) - .add(OAuthModuleWithoutTypeAdapters.class) - .add(GoogleComputeEngineServiceContextModule.class) - .build()); + .name("Google Compute Engine Api") + .identityName("Email associated with the Google API client_id") + .credentialName("Private key literal associated with the Google API client_id") + .documentation(URI.create("https://developers.google.com/compute/docs")) + .version("v1beta15") + .defaultEndpoint("https://www.googleapis.com/compute/v1beta15") + .defaultProperties(GoogleComputeEngineApiMetadata.defaultProperties()) + .view(typeToken(ComputeServiceContext.class)) + .defaultModules(ImmutableSet.>builder() + .add(GoogleComputeEngineHttpApiModule.class) + .add(GoogleComputeEngineParserModule.class) + .add(OAuthAuthenticationModule.class) + .add(OAuthModuleWithoutTypeAdapters.class) + .add(GoogleComputeEngineServiceContextModule.class) + .build()); } @Override diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java index dd83ce060..1334a32a1 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineConstants.java @@ -16,11 +16,12 @@ */ package org.jclouds.googlecomputeengine; -import com.google.common.annotations.Beta; import org.jclouds.domain.Location; import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; +import com.google.common.annotations.Beta; + /** * @author David Alves */ @@ -37,6 +38,11 @@ public interface GoogleComputeEngineConstants { public static final String COMPUTE_READONLY_SCOPE = "https://www.googleapis.com/auth/compute.readonly"; + public static final String STORAGE_READONLY_SCOPE = "https://www.googleapis.com/auth/devstorage.read_only"; + + public static final String STORAGE_WRITEONLY_SCOPE = "https://www.googleapis.com/auth/devstorage.write_only"; + + /** * The total time, in msecs, to wait for an operation to complete. */ diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java index 7e4690c33..0d5b800b5 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java @@ -16,11 +16,23 @@ */ package org.jclouds.googlecomputeengine.compute; -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.util.concurrent.ListeningExecutorService; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; +import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_INTERVAL; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_TIMEOUT; +import static org.jclouds.util.Predicates2.retry; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Provider; + import org.jclouds.Constants; import org.jclouds.collect.Memoized; import org.jclouds.compute.ComputeServiceContext; @@ -53,21 +65,11 @@ import org.jclouds.http.HttpResponse; import org.jclouds.scriptbuilder.functions.InitAdminAccess; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Provider; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; - -import static com.google.common.base.Preconditions.checkNotNull; -import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; -import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; -import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_INTERVAL; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_TIMEOUT; -import static org.jclouds.util.Predicates2.retry; +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.util.concurrent.ListeningExecutorService; /** * @author David Alves @@ -115,7 +117,7 @@ protected GoogleComputeEngineService(ComputeServiceContext context, GroupNamingConvention.Factory namingConvention, GoogleComputeEngineApi api, @UserProject Supplier project, - Predicate> operationDonePredicate, + @Named("global") Predicate> operationDonePredicate, @Named(OPERATION_COMPLETE_INTERVAL) Long operationCompleteCheckInterval, @Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout) { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java index aaa6271fd..b949f134f 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java @@ -16,53 +16,62 @@ */ package org.jclouds.googlecomputeengine.compute; -import com.google.common.base.Function; -import com.google.common.base.Objects; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.util.concurrent.UncheckedTimeoutException; -import com.google.inject.Inject; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; +import static com.google.common.collect.Iterables.contains; +import static com.google.common.collect.Iterables.filter; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GOOGLE_PROJECT; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_INTERVAL; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_TIMEOUT; +import static org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig.Type; +import static org.jclouds.util.Predicates2.retry; + +import java.net.URI; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +import javax.annotation.Resource; +import javax.inject.Named; + +import org.jclouds.collect.Memoized; import org.jclouds.compute.ComputeServiceAdapter; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Template; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.domain.Location; import org.jclouds.domain.LoginCredentials; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions; import org.jclouds.googlecomputeengine.config.UserProject; import org.jclouds.googlecomputeengine.domain.Image; import org.jclouds.googlecomputeengine.domain.Instance; +import org.jclouds.googlecomputeengine.domain.InstanceInZone; import org.jclouds.googlecomputeengine.domain.InstanceTemplate; import org.jclouds.googlecomputeengine.domain.MachineType; +import org.jclouds.googlecomputeengine.domain.MachineTypeInZone; import org.jclouds.googlecomputeengine.domain.Operation; +import org.jclouds.googlecomputeengine.domain.SlashEncodedIds; import org.jclouds.googlecomputeengine.domain.Zone; import org.jclouds.http.HttpResponse; import org.jclouds.logging.Logger; -import javax.annotation.Resource; -import javax.inject.Named; -import java.net.URI; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; -import static com.google.common.collect.Iterables.contains; -import static com.google.common.collect.Iterables.filter; -import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GOOGLE_PROJECT; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_INTERVAL; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_TIMEOUT; -import static org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig.Type; -import static org.jclouds.util.Predicates2.retry; +import com.google.common.base.Function; +import com.google.common.base.Objects; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.util.concurrent.UncheckedTimeoutException; +import com.google.inject.Inject; /** * @author David Alves */ -public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter { +public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) @@ -70,6 +79,8 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< private final GoogleComputeEngineApi api; private final Supplier userProject; + private final Supplier> zones; + private final Supplier> hardwareMap; private final Function> metatadaFromTemplateOptions; private final Predicate> retryOperationDonePredicate; private final long operationCompleteCheckInterval; @@ -80,9 +91,11 @@ public GoogleComputeEngineServiceAdapter(GoogleComputeEngineApi api, @UserProject Supplier userProject, Function> metatadaFromTemplateOptions, - Predicate> operationDonePredicate, + @Named("zone") Predicate> operationDonePredicate, @Named(OPERATION_COMPLETE_INTERVAL) Long operationCompleteCheckInterval, - @Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout) { + @Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout, + @Memoized Supplier> zones, + @Memoized Supplier> hardwareMap) { this.api = checkNotNull(api, "google compute api"); this.userProject = checkNotNull(userProject, "user project name"); this.metatadaFromTemplateOptions = checkNotNull(metatadaFromTemplateOptions, @@ -93,21 +106,24 @@ public GoogleComputeEngineServiceAdapter(GoogleComputeEngineApi api, "operation completed check timeout"); this.retryOperationDonePredicate = retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, TimeUnit.MILLISECONDS); + this.zones = checkNotNull(zones, "zones"); + this.hardwareMap = checkNotNull(hardwareMap, "hardwareMap"); } @Override - public NodeAndInitialCredentials createNodeWithGroupEncodedIntoName( - final String group, final String name, Template template) { + public NodeAndInitialCredentials createNodeWithGroupEncodedIntoName( + final String group, final String name, final Template template) { checkNotNull(template, "template"); GoogleComputeEngineTemplateOptions options = GoogleComputeEngineTemplateOptions.class.cast(template.getOptions()).clone(); checkState(options.getNetwork().isPresent(), "network was not present in template options"); Hardware hardware = checkNotNull(template.getHardware(), "hardware must be set"); - URI machineType = checkNotNull(hardware.getUri(), "hardware uri must be set"); + + checkNotNull(hardware.getUri(), "hardware must have a URI"); InstanceTemplate instanceTemplate = InstanceTemplate.builder() - .forMachineType(machineType); + .forMachineType(hardware.getUri()); if (options.isEnableNat()) { instanceTemplate.addNetworkInterface(options.getNetwork().get(), Type.ONE_TO_ONE_NAT); @@ -119,12 +135,11 @@ public NodeAndInitialCredentials createNodeWithGroupEncodedIntoName( ImmutableMap.Builder metadataBuilder = metatadaFromTemplateOptions.apply(options); instanceTemplate.metadata(metadataBuilder.build()); - instanceTemplate.tags(options.getTags()); instanceTemplate.serviceAccounts(options.getServiceAccounts()); instanceTemplate.image(checkNotNull(template.getImage().getUri(), "image URI is null")); Operation operation = api.getInstanceApiForProject(userProject.get()) - .createInZone(name, instanceTemplate, template.getLocation().getId()); + .createInZone(name, template.getLocation().getId(), instanceTemplate); if (options.shouldBlockUntilRunning()) { waitOperationDone(operation); @@ -136,18 +151,52 @@ public NodeAndInitialCredentials createNodeWithGroupEncodedIntoName( retry(new Predicate>() { @Override public boolean apply(AtomicReference input) { - input.set(api.getInstanceApiForProject(userProject.get()).get(name)); + input.set(api.getInstanceApiForProject(userProject.get()).getInZone(template.getLocation().getId(), + name)); return input.get() != null; } }, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS).apply(instance); - return new NodeAndInitialCredentials(instance.get(), name, credentials); + if (options.getTags().size() > 0) { + Operation tagsOperation = api.getInstanceApiForProject(userProject.get()).setTagsInZone(template.getLocation().getId(), + name, options.getTags(), instance.get().getTags().getFingerprint()); + + waitOperationDone(tagsOperation); + + retry(new Predicate>() { + @Override + public boolean apply(AtomicReference input) { + input.set(api.getInstanceApiForProject(userProject.get()).getInZone(template.getLocation().getId(), + name)); + return input.get() != null; + } + }, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS).apply(instance); + } + + InstanceInZone instanceInZone = new InstanceInZone(instance.get(), template.getLocation().getId()); + + return new NodeAndInitialCredentials(instanceInZone, instanceInZone.slashEncode(), credentials); } @Override - public Iterable listHardwareProfiles() { - return api.getMachineTypeApiForProject(userProject.get()).list().concat(); + public Iterable listHardwareProfiles() { + ImmutableSet.Builder builder = ImmutableSet.builder(); + + for (final Location zone : zones.get().values()) { + builder.addAll(api.getMachineTypeApiForProject(userProject.get()) + .listInZone(zone.getId()) + .concat() + .transform(new Function() { + + @Override + public MachineTypeInZone apply(MachineType arg0) { + return new MachineTypeInZone(arg0, arg0.getZone()); + } + })); + } + + return builder.build(); } @Override @@ -170,34 +219,57 @@ public Iterable listLocations() { } @Override - public Instance getNode(String name) { - return api.getInstanceApiForProject(userProject.get()).get(name); + public InstanceInZone getNode(String name) { + SlashEncodedIds slashEncodedIds = SlashEncodedIds.fromSlashEncoded(name); + + Instance instance= api.getInstanceApiForProject(userProject.get()).getInZone(slashEncodedIds.getFirstId(), + slashEncodedIds.getSecondId()); + + return instance == null ? null : new InstanceInZone(instance, slashEncodedIds.getFirstId()); } @Override - public Iterable listNodes() { - return api.getInstanceApiForProject(userProject.get()).list().concat(); + public Iterable listNodes() { + return FluentIterable.from(zones.get().values()).transformAndConcat(new Function>() { + @Override + public ImmutableSet apply(final Location input) { + return api.getInstanceApiForProject(userProject.get()).listInZone(input.getId()).concat() + .transform(new Function() { + + @Override + public InstanceInZone apply(Instance arg0) { + return new InstanceInZone(arg0, input.getId()); + } + }).toSet(); + } + }).toSet(); } @Override - public Iterable listNodesByIds(final Iterable ids) { - return filter(listNodes(), new Predicate() { + public Iterable listNodesByIds(final Iterable ids) { + return filter(listNodes(), new Predicate() { @Override - public boolean apply(Instance instance) { - return contains(ids, instance.getName()); + public boolean apply(InstanceInZone instanceInZone) { + return contains(ids, instanceInZone.getInstance().getName()); } }); } @Override public void destroyNode(final String name) { - waitOperationDone(api.getInstanceApiForProject(userProject.get()).delete(name)); + SlashEncodedIds slashEncodedIds = SlashEncodedIds.fromSlashEncoded(name); + + waitOperationDone(api.getInstanceApiForProject(userProject.get()).deleteInZone(slashEncodedIds.getFirstId(), + slashEncodedIds.getSecondId())); } @Override - public void rebootNode(String name) { - throw new UnsupportedOperationException("reboot is not supported by GCE"); + public void rebootNode(final String name) { + SlashEncodedIds slashEncodedIds = SlashEncodedIds.fromSlashEncoded(name); + + waitOperationDone(api.getInstanceApiForProject(userProject.get()).resetInZone(slashEncodedIds.getFirstId(), + slashEncodedIds.getSecondId())); } @Override diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java index f3ecb6c0c..b0c04bea6 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java @@ -16,15 +16,19 @@ */ package org.jclouds.googlecomputeengine.compute.config; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; -import com.google.inject.Injector; -import com.google.inject.Provides; -import com.google.inject.TypeLiteral; +import static com.google.common.collect.Iterables.transform; +import static com.google.common.collect.Maps.uniqueIndex; +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; + +import java.net.URI; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; + +import javax.inject.Named; +import javax.inject.Singleton; + import org.jclouds.collect.Memoized; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceAdapter; @@ -40,8 +44,8 @@ import org.jclouds.googlecomputeengine.compute.GoogleComputeEngineServiceAdapter; import org.jclouds.googlecomputeengine.compute.functions.BuildInstanceMetadata; import org.jclouds.googlecomputeengine.compute.functions.GoogleComputeEngineImageToImage; -import org.jclouds.googlecomputeengine.compute.functions.InstanceToNodeMetadata; -import org.jclouds.googlecomputeengine.compute.functions.MachineTypeToHardware; +import org.jclouds.googlecomputeengine.compute.functions.InstanceInZoneToNodeMetadata; +import org.jclouds.googlecomputeengine.compute.functions.MachineTypeInZoneToHardware; import org.jclouds.googlecomputeengine.compute.functions.OrphanedGroupsFromDeadNodes; import org.jclouds.googlecomputeengine.compute.functions.ZoneToLocation; import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions; @@ -52,22 +56,27 @@ import org.jclouds.googlecomputeengine.config.UserProject; import org.jclouds.googlecomputeengine.domain.Image; import org.jclouds.googlecomputeengine.domain.Instance; -import org.jclouds.googlecomputeengine.domain.MachineType; +import org.jclouds.googlecomputeengine.domain.InstanceInZone; +import org.jclouds.googlecomputeengine.domain.MachineTypeInZone; import org.jclouds.googlecomputeengine.domain.Zone; +import org.jclouds.rest.AuthorizationException; +import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; -import javax.inject.Singleton; -import java.net.URI; -import java.util.Map; -import java.util.Set; - -import static com.google.common.collect.Iterables.transform; -import static com.google.common.collect.Maps.uniqueIndex; +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; +import com.google.common.base.Optional; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.inject.Injector; +import com.google.inject.Provides; +import com.google.inject.TypeLiteral; /** * @author David Alves */ public class GoogleComputeEngineServiceContextModule - extends ComputeServiceAdapterContextModule { + extends ComputeServiceAdapterContextModule { @Override protected void configure() { @@ -75,14 +84,14 @@ protected void configure() { bind(ComputeService.class).to(GoogleComputeEngineService.class); - bind(new TypeLiteral>() {}) + bind(new TypeLiteral>() {}) .to(GoogleComputeEngineServiceAdapter.class); - bind(new TypeLiteral>() {}) - .to(InstanceToNodeMetadata.class); + bind(new TypeLiteral>() {}) + .to(InstanceInZoneToNodeMetadata.class); - bind(new TypeLiteral>() {}) - .to(MachineTypeToHardware.class); + bind(new TypeLiteral>() {}) + .to(MachineTypeInZoneToHardware.class); bind(new TypeLiteral>() {}) .to(GoogleComputeEngineImageToImage.class); @@ -108,7 +117,7 @@ protected void configure() { bind(PrioritizeCredentialsFromTemplate.class).to(UseNodeCredentialsButOverrideFromTemplate.class); - install(new LocationsFromComputeServiceAdapterModule() {}); + install(new LocationsFromComputeServiceAdapterModule() {}); } @@ -116,56 +125,68 @@ protected void configure() { @Singleton @Memoized public Supplier> provideImagesMap( - final Supplier> images) { - return new Supplier>() { - @Override - public Map get() { - return uniqueIndex(images.get(), new Function() { - @Override - public URI apply(org.jclouds.compute.domain.Image input) { - return input.getUri(); - } - }); - } - }; + AtomicReference authException, + final Supplier> images, + @Named(PROPERTY_SESSION_INTERVAL) long seconds) { + return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, + new Supplier>() { + @Override + public Map get() { + return uniqueIndex(images.get(), new Function() { + @Override + public URI apply(org.jclouds.compute.domain.Image input) { + return input.getUri(); + } + }); + } + }, + seconds, TimeUnit.SECONDS); } @Provides @Singleton @Memoized public Supplier> provideHardwaresMap( - final Supplier> hardwares) { - return new Supplier>() { - @Override - public Map get() { - return uniqueIndex(hardwares.get(), new Function() { - @Override - public URI apply(Hardware input) { - return input.getUri(); - } - }); - } - }; + AtomicReference authException, + final Supplier> hardwares, + @Named(PROPERTY_SESSION_INTERVAL) long seconds) { + return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, + new Supplier>() { + @Override + public Map get() { + return uniqueIndex(hardwares.get(), new Function() { + @Override + public URI apply(Hardware input) { + return input.getUri(); + } + }); + } + }, + seconds, TimeUnit.SECONDS); } @Provides @Singleton @Memoized - public Supplier> provideLocations( + public Supplier> provideZones( + AtomicReference authException, final GoogleComputeEngineApi api, final Function zoneToLocation, - final @UserProject Supplier userProject) { - return new Supplier>() { - @Override - public Map get() { - return uniqueIndex(transform(api.getZoneApiForProject(userProject.get()).list().concat(), zoneToLocation), - new Function() { - @Override - public URI apply(Location input) { - return (URI) input.getMetadata().get("selfLink"); - } - }); - } - }; + final @UserProject Supplier userProject, + @Named(PROPERTY_SESSION_INTERVAL) long seconds) { + return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, + new Supplier>() { + @Override + public Map get() { + return uniqueIndex(transform(api.getZoneApiForProject(userProject.get()).list().concat(), zoneToLocation), + new Function() { + @Override + public URI apply(Location input) { + return (URI) input.getMetadata().get("selfLink"); + } + }); + } + }, + seconds, TimeUnit.SECONDS); } @Override diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/BuildInstanceMetadata.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/BuildInstanceMetadata.java index 85837a738..27564e650 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/BuildInstanceMetadata.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/BuildInstanceMetadata.java @@ -16,14 +16,15 @@ */ package org.jclouds.googlecomputeengine.compute.functions; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; -import org.jclouds.compute.options.TemplateOptions; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.lang.String.format; import javax.inject.Singleton; -import static com.google.common.base.Preconditions.checkNotNull; -import static java.lang.String.format; +import org.jclouds.compute.options.TemplateOptions; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableMap; /** * Prepares metadata from the provided TemplateOptions diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImage.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImage.java index ea5f8932d..f3528796d 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImage.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImage.java @@ -16,21 +16,22 @@ */ package org.jclouds.googlecomputeengine.compute.functions; -import com.google.common.base.Function; -import com.google.common.collect.Lists; -import org.jclouds.compute.domain.ImageBuilder; -import org.jclouds.compute.domain.OperatingSystem; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.googlecomputeengine.domain.Image; - -import java.util.List; - import static com.google.common.base.Joiner.on; import static com.google.common.collect.Iterables.getLast; import static com.google.common.collect.Iterables.limit; import static com.google.common.collect.Iterables.skip; import static org.jclouds.compute.domain.Image.Status; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GOOGLE_PROVIDER_LOCATION; + +import java.util.List; + +import org.jclouds.compute.domain.ImageBuilder; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.googlecomputeengine.domain.Image; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; /** * Transforms a google compute domain specific image to a generic Image object. @@ -48,7 +49,6 @@ public org.jclouds.compute.domain.Image apply(Image image) { .providerId(image.getId()) .description(image.getDescription().orNull()) .status(Status.AVAILABLE) - .location(GOOGLE_PROVIDER_LOCATION) .uri(image.getSelfLink()); List splits = Lists.newArrayList(image.getName().split("-")); @@ -65,6 +65,9 @@ public org.jclouds.compute.domain.Image apply(Image image) { String version = on(".").join(limit(skip(splits, 1), splits.size() - 2)); osBuilder.version(version); + if (image.getDeprecated().isPresent()) { + builder.userMetadata(ImmutableMap.of("deprecatedState", image.getDeprecated().get().getState().orNull())); + } builder.version(getLast(splits)); return builder.operatingSystem(osBuilder.build()).build(); } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java similarity index 87% rename from google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java rename to google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java index 40be835eb..b59dfcca3 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java @@ -16,9 +16,14 @@ */ package org.jclouds.googlecomputeengine.compute.functions; -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableSet; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; + import org.jclouds.collect.Memoized; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; @@ -27,20 +32,19 @@ import org.jclouds.compute.functions.GroupNamingConvention; import org.jclouds.domain.Location; import org.jclouds.googlecomputeengine.domain.Instance; +import org.jclouds.googlecomputeengine.domain.InstanceInZone; +import org.jclouds.googlecomputeengine.domain.SlashEncodedIds; -import javax.inject.Inject; -import java.net.URI; -import java.util.Map; -import java.util.Set; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableSet; /** * Transforms a google compute domain Instance into a generic NodeMetatada object. * * @author David Alves */ -public class InstanceToNodeMetadata implements Function { +public class InstanceInZoneToNodeMetadata implements Function { private final Map toPortableNodeStatus; private final GroupNamingConvention nodeNamingConvention; @@ -49,7 +53,7 @@ public class InstanceToNodeMetadata implements Function private final Supplier> locations; @Inject - public InstanceToNodeMetadata(Map toPortableNodeStatus, + public InstanceInZoneToNodeMetadata(Map toPortableNodeStatus, GroupNamingConvention.Factory namingConvention, @Memoized Supplier> images, @Memoized Supplier> hardwares, @@ -62,13 +66,15 @@ public InstanceToNodeMetadata(Map toPortab } @Override - public NodeMetadata apply(Instance input) { + public NodeMetadata apply(InstanceInZone instanceInZone) { + Instance input = instanceInZone.getInstance(); Map imagesMap = images.get(); Image image = checkNotNull(imagesMap.get(checkNotNull(input.getImage(), "image")), "no image for %s. images: %s", input.getImage(), imagesMap.values()); return new NodeMetadataBuilder() - .id(input.getName()) + .id(SlashEncodedIds.fromTwoIds(checkNotNull(locations.get().get(input.getZone()), "location for %s", input.getZone()).getId(), + input.getName()).slashEncode()) .name(input.getName()) .providerId(input.getId()) .hostname(input.getName()) @@ -78,7 +84,7 @@ public NodeMetadata apply(Instance input) { input.getMachineType().toString())) .operatingSystem(image.getOperatingSystem()) .status(toPortableNodeStatus.get(input.getStatus())) - .tags(input.getTags()) + .tags(input.getTags().getItems()) .uri(input.getSelfLink()) .userMetadata(input.getMetadata()) .group(nodeNamingConvention.groupInUniqueNameOrNull(input.getName())) diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/MachineTypeInZoneToHardware.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/MachineTypeInZoneToHardware.java new file mode 100644 index 000000000..959ad2489 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/MachineTypeInZoneToHardware.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.compute.functions; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.filter; +import static com.google.common.collect.Iterables.getOnlyElement; + +import java.net.URI; +import java.util.Map; + +import org.jclouds.collect.Memoized; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.HardwareBuilder; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.Processor; +import org.jclouds.compute.domain.Volume; +import org.jclouds.compute.domain.VolumeBuilder; +import org.jclouds.domain.Location; +import org.jclouds.googlecomputeengine.domain.MachineType; +import org.jclouds.googlecomputeengine.domain.MachineTypeInZone; +import org.jclouds.googlecomputeengine.domain.SlashEncodedIds; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Inject; + +/** + * Transforms a google compute domain specific machine type to a generic Hardware object. + * + * @author David Alves + */ +public class MachineTypeInZoneToHardware implements Function { + + private final Supplier> locations; + + @Inject + public MachineTypeInZoneToHardware(@Memoized Supplier> locations) { + this.locations = locations; + } + + @Override + public Hardware apply(final MachineTypeInZone input) { + Iterable zonesForMachineType = filter(locations.get().values(), new Predicate() { + @Override + public boolean apply(Location l) { + return l.getId().equals(input.getMachineType().getZone()); + } + }); + + Location location = checkNotNull(getOnlyElement(zonesForMachineType), + "location for %s", + input.getMachineType().getZone()); + return new HardwareBuilder() + .id(SlashEncodedIds.fromTwoIds(input.getMachineType().getZone(), input.getMachineType().getName()).slashEncode()) + .location(location) + .name(input.getMachineType().getName()) + .hypervisor("kvm") + .processor(new Processor(input.getMachineType().getGuestCpus(), 1.0)) + .providerId(input.getMachineType().getId()) + .ram(input.getMachineType().getMemoryMb()) + .uri(input.getMachineType().getSelfLink()) + .userMetadata(ImmutableMap.of("imageSpaceGb", Integer.toString(input.getMachineType().getImageSpaceGb()))) + .volumes(collectVolumes(input.getMachineType())) + .supportsImage(input.getMachineType().getImageSpaceGb() > 0 + ? Predicates.alwaysTrue() + : Predicates.alwaysFalse()) + .build(); + } + + private Iterable collectVolumes(MachineType input) { + ImmutableSet.Builder volumes = ImmutableSet.builder(); + for (MachineType.ScratchDisk disk : input.getScratchDisks()) { + volumes.add(new VolumeBuilder() + .type(Volume.Type.LOCAL) + .size(new Integer(disk.getDiskGb()).floatValue()) + .bootDevice(true) + .durable(false).build()); + } + return volumes.build(); + } +} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/MachineTypeToHardware.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/MachineTypeToHardware.java deleted file mode 100644 index 410c7eab4..000000000 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/MachineTypeToHardware.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jclouds.googlecomputeengine.compute.functions; - -import com.google.common.base.Function; -import com.google.common.collect.ImmutableSet; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.HardwareBuilder; -import org.jclouds.compute.domain.Processor; -import org.jclouds.compute.domain.Volume; -import org.jclouds.compute.domain.internal.VolumeImpl; -import org.jclouds.googlecomputeengine.domain.MachineType; - -/** - * Transforms a google compute domain specific machine type to a generic Hardware object. - * - * @author David Alves - */ -public class MachineTypeToHardware implements Function { - - @Override - public Hardware apply(MachineType input) { - return new HardwareBuilder() - .id(input.getName()) - .name(input.getName()) - .hypervisor("kvm") - .processor(new Processor(input.getGuestCpus(), 1.0)) - .providerId(input.getId()) - .ram(input.getMemoryMb()) - .uri(input.getSelfLink()) - .volumes(collectVolumes(input)) - .build(); - } - - private Iterable collectVolumes(MachineType input) { - ImmutableSet.Builder volumes = ImmutableSet.builder(); - for (MachineType.EphemeralDisk disk : input.getEphemeralDisks()) { - volumes.add(new VolumeImpl(null, Volume.Type.LOCAL, new Integer(disk.getDiskGb()).floatValue(), null, true, - false)); - } - return volumes.build(); - } -} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodes.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodes.java index 931429813..f9196978b 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodes.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodes.java @@ -16,14 +16,16 @@ */ package org.jclouds.googlecomputeengine.compute.functions; -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.Sets; -import org.jclouds.compute.domain.NodeMetadata; +import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; -import java.util.Set; + +import org.jclouds.compute.domain.NodeMetadata; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Sets; /** * @author David Alves diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/ZoneToLocation.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/ZoneToLocation.java index 56dde56fb..be2df6644 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/ZoneToLocation.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/ZoneToLocation.java @@ -16,15 +16,16 @@ */ package org.jclouds.googlecomputeengine.compute.functions; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableMap; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GOOGLE_PROVIDER_LOCATION; + import org.jclouds.domain.Location; import org.jclouds.domain.LocationBuilder; import org.jclouds.domain.LocationScope; import org.jclouds.googlecomputeengine.domain.Zone; -import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GOOGLE_PROVIDER_LOCATION; +import com.google.common.base.Function; +import com.google.common.collect.ImmutableMap; /** * Transforms a google compute domain specific zone to a generic Zone object. diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java index 9d74d3ced..b5d74ed5d 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java @@ -16,19 +16,20 @@ */ package org.jclouds.googlecomputeengine.compute.options; -import com.google.common.base.Optional; -import com.google.common.collect.Sets; -import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.domain.LoginCredentials; -import org.jclouds.googlecomputeengine.domain.Instance; -import org.jclouds.scriptbuilder.domain.Statement; +import static com.google.common.base.Optional.fromNullable; +import static org.jclouds.googlecomputeengine.domain.Instance.ServiceAccount; import java.net.URI; import java.util.Map; import java.util.Set; -import static com.google.common.base.Optional.fromNullable; -import static org.jclouds.googlecomputeengine.domain.Instance.ServiceAccount; +import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.domain.LoginCredentials; +import org.jclouds.googlecomputeengine.domain.Instance; +import org.jclouds.scriptbuilder.domain.Statement; + +import com.google.common.base.Optional; +import com.google.common.collect.Sets; /** * Instance options specific to Google Compute Engine. diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/predicates/AllNodesInGroupTerminated.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/predicates/AllNodesInGroupTerminated.java index 72d037184..a52f9b0dc 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/predicates/AllNodesInGroupTerminated.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/predicates/AllNodesInGroupTerminated.java @@ -16,12 +16,6 @@ */ package org.jclouds.googlecomputeengine.compute.predicates; -import com.google.common.base.Predicate; -import org.jclouds.compute.ComputeService; - -import javax.inject.Inject; -import javax.inject.Singleton; - import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.all; import static com.google.common.collect.Sets.filter; @@ -29,6 +23,13 @@ import static org.jclouds.compute.predicates.NodePredicates.all; import static org.jclouds.compute.predicates.NodePredicates.inGroup; +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.ComputeService; + +import com.google.common.base.Predicate; + /** * @author David Alves */ diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java index b68060794..53803131b 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java @@ -16,12 +16,21 @@ */ package org.jclouds.googlecomputeengine.compute.strategy; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multimap; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; +import static com.google.common.collect.ImmutableSet.of; +import static java.util.concurrent.TimeUnit.MILLISECONDS; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_INTERVAL; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_TIMEOUT; +import static org.jclouds.util.Predicates2.retry; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; + +import javax.inject.Inject; +import javax.inject.Named; + import org.jclouds.Constants; import org.jclouds.compute.config.CustomizationResponse; import org.jclouds.compute.domain.NodeMetadata; @@ -38,19 +47,12 @@ import org.jclouds.googlecomputeengine.domain.Operation; import org.jclouds.googlecomputeengine.options.FirewallOptions; -import javax.inject.Inject; -import javax.inject.Named; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; -import static com.google.common.collect.ImmutableSet.of; -import static java.util.concurrent.TimeUnit.MILLISECONDS; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_INTERVAL; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.OPERATION_COMPLETE_TIMEOUT; -import static org.jclouds.util.Predicates2.retry; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Multimap; +import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.ListeningExecutorService; /** * @author David Alves @@ -78,7 +80,7 @@ protected CreateNodesWithGroupEncodedIntoNameThenAddToSet( customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory, GoogleComputeEngineApi api, @UserProject Supplier userProject, - Predicate> operationDonePredicate, + @Named("global") Predicate> operationDonePredicate, @Named(OPERATION_COMPLETE_INTERVAL) Long operationCompleteCheckInterval, @Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout) { super(addNodeWithGroupStrategy, listNodesStrategy, namingConvention, userExecutor, @@ -127,7 +129,7 @@ private Network getOrCreateNetwork(GoogleComputeEngineTemplateOptions templateOp if (network != null) { return network; } else if (templateOptions.getNetwork().isPresent()) { - throw new IllegalArgumentException("requested network " + networkName + " does not exist"); + throw new IllegalArgumentException("requested network " + networkName + " does not exist"); } AtomicReference operation = new AtomicReference(api.getNetworkApiForProject(userProject @@ -135,7 +137,7 @@ private Network getOrCreateNetwork(GoogleComputeEngineTemplateOptions templateOp retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS).apply(operation); - checkState(!operation.get().getHttpError().isPresent(),"Could not create network, operation failed" + operation); + checkState(!operation.get().getHttpError().isPresent(), "Could not create network, operation failed" + operation); return checkNotNull(api.getNetworkApiForProject(userProject.get()).get(sharedResourceName), "no network with name %s was found", sharedResourceName); @@ -186,7 +188,7 @@ private void getOrCreateFirewall(GoogleComputeEngineTemplateOptions templateOpti retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS).apply(operation); - checkState(!operation.get().getHttpError().isPresent(),"Could not create firewall, operation failed" + operation); + checkState(!operation.get().getHttpError().isPresent(), "Could not create firewall, operation failed" + operation); } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/PopulateDefaultLoginCredentialsForImageStrategy.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/PopulateDefaultLoginCredentialsForImageStrategy.java index 38cfcf076..cdae3c436 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/PopulateDefaultLoginCredentialsForImageStrategy.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/PopulateDefaultLoginCredentialsForImageStrategy.java @@ -16,19 +16,21 @@ */ package org.jclouds.googlecomputeengine.compute.strategy; -import com.google.inject.Inject; -import org.jclouds.compute.domain.TemplateBuilderSpec; -import org.jclouds.domain.LoginCredentials; -import org.jclouds.ssh.internal.RsaSshKeyPairGenerator; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.config.ComputeServiceProperties.TEMPLATE; + +import java.security.NoSuchAlgorithmException; +import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Named; import javax.inject.Singleton; -import java.security.NoSuchAlgorithmException; -import java.util.Map; -import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.config.ComputeServiceProperties.TEMPLATE; +import org.jclouds.compute.domain.TemplateBuilderSpec; +import org.jclouds.domain.LoginCredentials; +import org.jclouds.ssh.internal.RsaSshKeyPairGenerator; + +import com.google.inject.Inject; /** * @author David Alves diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/UseNodeCredentialsButOverrideFromTemplate.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/UseNodeCredentialsButOverrideFromTemplate.java index dcad62cf6..d774b5525 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/UseNodeCredentialsButOverrideFromTemplate.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/UseNodeCredentialsButOverrideFromTemplate.java @@ -16,15 +16,16 @@ */ package org.jclouds.googlecomputeengine.compute.strategy; -import com.google.common.base.Function; -import com.google.inject.Inject; -import com.google.inject.Singleton; +import static com.google.common.base.Preconditions.checkNotNull; + import org.jclouds.compute.domain.Template; import org.jclouds.compute.options.RunScriptOptions; import org.jclouds.compute.strategy.PrioritizeCredentialsFromTemplate; import org.jclouds.domain.LoginCredentials; -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.Inject; +import com.google.inject.Singleton; /** * GCE needs the credentials to create the node so the node credentials already take the Image credentials into account, diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineHttpApiModule.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineHttpApiModule.java index 6c393f48a..214c9328f 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineHttpApiModule.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineHttpApiModule.java @@ -18,8 +18,11 @@ import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Suppliers.compose; +import static com.google.inject.name.Names.named; +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import java.net.URI; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import javax.inject.Named; @@ -28,8 +31,11 @@ import org.jclouds.domain.Credentials; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.Operation; +import org.jclouds.googlecomputeengine.domain.Project; +import org.jclouds.googlecomputeengine.domain.SlashEncodedIds; import org.jclouds.googlecomputeengine.handlers.GoogleComputeEngineErrorHandler; -import org.jclouds.googlecomputeengine.predicates.OperationDonePredicate; +import org.jclouds.googlecomputeengine.predicates.GlobalOperationDonePredicate; +import org.jclouds.googlecomputeengine.predicates.ZoneOperationDonePredicate; import org.jclouds.http.HttpErrorHandler; import org.jclouds.http.Uris; import org.jclouds.http.annotation.ClientError; @@ -38,8 +44,12 @@ import org.jclouds.json.config.GsonModule.DateAdapter; import org.jclouds.json.config.GsonModule.Iso8601DateAdapter; import org.jclouds.location.Provider; +import org.jclouds.location.suppliers.ImplicitLocationSupplier; +import org.jclouds.location.suppliers.implicit.FirstZone; +import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresHttpApi; import org.jclouds.rest.config.HttpApiModule; +import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -47,6 +57,7 @@ import com.google.common.base.Supplier; import com.google.common.collect.Iterables; import com.google.inject.Provides; +import com.google.inject.Scopes; import com.google.inject.TypeLiteral; /** @@ -62,7 +73,11 @@ public GoogleComputeEngineHttpApiModule() { @Override protected void configure() { bind(DateAdapter.class).to(Iso8601DateAdapter.class); - bind(new TypeLiteral>>() {}).to(OperationDonePredicate.class); + bind(new TypeLiteral>>() { + }).annotatedWith(named("global")).to(GlobalOperationDonePredicate.class); + bind(new TypeLiteral>>() { + }).annotatedWith(named("zone")).to(ZoneOperationDonePredicate.class); + bind(ImplicitLocationSupplier.class).to(FirstZone.class).in(Scopes.SINGLETON); super.configure(); } @@ -76,54 +91,61 @@ protected void bindErrorHandlers() { @Provides @Singleton @UserProject - public Supplier supplyProject(@org.jclouds.location.Provider final Supplier creds) { - return compose(new Function() { - public String apply(Credentials in) { - checkState(in.identity.indexOf("@") != 1, "identity should be in project_id@developer.gserviceaccount.com" + - " format"); - return Iterables.get(Splitter.on("@").split(in.identity), 0); - } - }, creds); + public Supplier supplyProject(@Provider final Supplier creds, + final GoogleComputeEngineApi api, + AtomicReference authException, + @Named(PROPERTY_SESSION_INTERVAL) long seconds) { + return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, + compose(new Function() { + public String apply(Credentials in) { + checkState(in.identity.indexOf("@") != 1, + "identity should be in project_id@developer.gserviceaccount.com format"); + Project project = api.getProjectApi().get(Iterables.get(Splitter.on("@").split(in.identity), 0)); + return project.getName(); + } + }, creds), seconds, TimeUnit.SECONDS); } @Provides @Singleton - @Named("machineTypes") + @Named("machineTypeToURI") public Function provideMachineTypeNameToURIFunction(final @Provider Supplier endpoint, final @UserProject Supplier userProject) { return new Function() { @Override public URI apply(String input) { - return Uris.uriBuilder(endpoint.get()).appendPath("/projects/").appendPath(userProject.get()).appendPath - ("/machineTypes/").appendPath(input).build(); + SlashEncodedIds slashEncodedIds = SlashEncodedIds.fromSlashEncoded(input); + return Uris.uriBuilder(endpoint.get()).appendPath("/projects/").appendPath(userProject.get()) + .appendPath("/zones/").appendPath(slashEncodedIds.getFirstId()) + .appendPath("/machineTypes/").appendPath(slashEncodedIds.getSecondId()).build(); } }; } @Provides @Singleton - @Named("networks") + @Named("networkToURI") public Function provideNetworkNameToURIFunction(final @Provider Supplier endpoint, final @UserProject Supplier userProject) { return new Function() { @Override public URI apply(String input) { - return Uris.uriBuilder(endpoint.get()).appendPath("/projects/").appendPath(userProject.get()).appendPath - ("/networks/").appendPath(input).build(); + return Uris.uriBuilder(endpoint.get()).appendPath("/projects/").appendPath(userProject.get()) + .appendPath("/global/networks/").appendPath(input).build(); } }; } @Provides @Singleton - @Named("zones") + @Named("zoneToURI") public Function provideZoneNameToURIFunction(final @Provider Supplier endpoint, final @UserProject Supplier userProject) { return new Function() { @Override public URI apply(String input) { - return Uris.uriBuilder(endpoint.get()).appendPath("/projects/").appendPath(userProject.get()).appendPath - ("/zones/").appendPath(input).build(); + return Uris.uriBuilder(endpoint.get()).appendPath("/projects/").appendPath(userProject.get()) + .appendPath("/zones/").appendPath(input).build(); } }; } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java index 28ac2eae9..13d1b75d9 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java @@ -16,6 +16,29 @@ */ package org.jclouds.googlecomputeengine.config; +import static org.jclouds.googlecomputeengine.domain.Firewall.Rule; + +import java.beans.ConstructorProperties; +import java.lang.reflect.Type; +import java.net.URI; +import java.util.Date; +import java.util.Map; +import java.util.Set; + +import javax.inject.Singleton; + +import org.jclouds.googlecomputeengine.domain.Firewall; +import org.jclouds.googlecomputeengine.domain.Instance; +import org.jclouds.googlecomputeengine.domain.InstanceTemplate; +import org.jclouds.googlecomputeengine.domain.Operation; +import org.jclouds.googlecomputeengine.domain.Project; +import org.jclouds.googlecomputeengine.options.FirewallOptions; +import org.jclouds.json.config.GsonModule; +import org.jclouds.oauth.v2.domain.ClaimSet; +import org.jclouds.oauth.v2.domain.Header; +import org.jclouds.oauth.v2.json.ClaimSetTypeAdapter; +import org.jclouds.oauth.v2.json.HeaderTypeAdapter; + import com.google.common.collect.ForwardingMap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Range; @@ -30,27 +53,6 @@ import com.google.gson.JsonSerializer; import com.google.inject.AbstractModule; import com.google.inject.Provides; -import org.jclouds.googlecomputeengine.domain.Firewall; -import org.jclouds.googlecomputeengine.domain.Instance; -import org.jclouds.googlecomputeengine.domain.InstanceTemplate; -import org.jclouds.googlecomputeengine.domain.Operation; -import org.jclouds.googlecomputeengine.domain.Project; -import org.jclouds.googlecomputeengine.options.FirewallOptions; -import org.jclouds.json.config.GsonModule; -import org.jclouds.oauth.v2.domain.ClaimSet; -import org.jclouds.oauth.v2.domain.Header; -import org.jclouds.oauth.v2.json.ClaimSetTypeAdapter; -import org.jclouds.oauth.v2.json.HeaderTypeAdapter; - -import javax.inject.Singleton; -import java.beans.ConstructorProperties; -import java.lang.reflect.Type; -import java.net.URI; -import java.util.Date; -import java.util.Map; -import java.util.Set; - -import static org.jclouds.googlecomputeengine.domain.Firewall.Rule; /** * @author David Alves @@ -81,7 +83,7 @@ public Map provideCustomAdapterBindings() { /** * Parser for operations that unwraps errors avoiding an extra intermediate object. * - * @see + * @see */ @Singleton private static class OperationTypeAdapter implements JsonDeserializer { @@ -107,16 +109,16 @@ private static class OperationInternal extends Operation { @ConstructorProperties({ "id", "creationTimestamp", "selfLink", "name", "description", "targetLink", "targetId", "clientOperationId", "status", "statusMessage", "user", "progress", "insertTime", "startTime", - "endTime", "httpErrorStatusCode", "httpErrorMessage", "operationType" + "endTime", "httpErrorStatusCode", "httpErrorMessage", "operationType", "region", "zone" }) private OperationInternal(String id, Date creationTimestamp, URI selfLink, String name, String description, URI targetLink, String targetId, String clientOperationId, Status status, String statusMessage, String user, int progress, Date insertTime, Date startTime, Date endTime, int httpErrorStatusCode, String httpErrorMessage, - String operationType) { + String operationType, URI region, URI zone) { super(id, creationTimestamp, selfLink, name, description, targetLink, targetId, clientOperationId, status, statusMessage, user, progress, insertTime, startTime, endTime, httpErrorStatusCode, - httpErrorMessage, operationType, null); + httpErrorMessage, operationType, null, region, zone); } } } @@ -162,9 +164,7 @@ private InstanceTemplateInternal(InstanceTemplate template) { super(template.getMachineType()); name(template.getName()); description(template.getDescription()); - zone(template.getZone()); image(template.getImage()); - tags(template.getTags()); serviceAccounts(template.getServiceAccounts()); networkInterfaces(template.getNetworkInterfaces()); } @@ -205,7 +205,7 @@ private static class InstanceInternal extends Instance { "status", "statusMessage", "zone", "networkInterfaces", "metadata", "serviceAccounts" }) private InstanceInternal(String id, Date creationTimestamp, URI selfLink, String name, String description, - Set tags, URI image, URI machineType, Status status, String statusMessage, + Tags tags, URI image, URI machineType, Status status, String statusMessage, URI zone, Set networkInterfaces, Metadata metadata, Set serviceAccounts) { super(id, creationTimestamp, selfLink, name, description, tags, image, machineType, diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/OAuthModuleWithoutTypeAdapters.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/OAuthModuleWithoutTypeAdapters.java index fa6262529..f287fff88 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/OAuthModuleWithoutTypeAdapters.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/OAuthModuleWithoutTypeAdapters.java @@ -16,9 +16,6 @@ */ package org.jclouds.googlecomputeengine.config; -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.inject.TypeLiteral; import org.jclouds.oauth.v2.config.OAuthModule; import org.jclouds.oauth.v2.domain.OAuthCredentials; import org.jclouds.oauth.v2.domain.Token; @@ -29,6 +26,10 @@ import org.jclouds.oauth.v2.functions.SignOrProduceMacForToken; import org.jclouds.rest.internal.GeneratedHttpRequest; +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.inject.TypeLiteral; + /** * Overrides OAuthModule leaving TypeAdapters bindings out. *

@@ -40,9 +41,13 @@ public class OAuthModuleWithoutTypeAdapters extends OAuthModule { @Override protected void configure() { - bind(new TypeLiteral>() {}).to(SignOrProduceMacForToken.class); - bind(new TypeLiteral>() {}).to(OAuthCredentialsSupplier.class); - bind(new TypeLiteral>() {}).to(BuildTokenRequest.class); - bind(new TypeLiteral>() {}).to(FetchToken.class); + bind(new TypeLiteral>() { + }).to(SignOrProduceMacForToken.class); + bind(new TypeLiteral>() { + }).to(OAuthCredentialsSupplier.class); + bind(new TypeLiteral>() { + }).to(BuildTokenRequest.class); + bind(new TypeLiteral>() { + }).to(FetchToken.class); } } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/UserProject.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/UserProject.java index 1fe04bcfa..226d6a1ee 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/UserProject.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/UserProject.java @@ -16,12 +16,13 @@ */ package org.jclouds.googlecomputeengine.config; -import javax.inject.Qualifier; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.inject.Qualifier; + /** * Qualifies a property as the user's project id. * diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java new file mode 100644 index 000000000..fda65ec10 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java @@ -0,0 +1,122 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Date; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; + +/** + * A persistent disk resource + * + * @author David Alves + * @see + */ +@Beta +public abstract class AbstractDisk extends Resource { + + protected final Integer sizeGb; + protected final String status; + + protected AbstractDisk(Kind kind, String id, Date creationTimestamp, URI selfLink, String name, String description, + Integer sizeGb, String status) { + super(kind, id, creationTimestamp, selfLink, name, description); + this.sizeGb = checkNotNull(sizeGb, "sizeGb of %s", name); + this.status = checkNotNull(status, "status of %s", name); + } + + /** + * @return size of the persistent disk, specified in GB. + */ + public int getSizeGb() { + return sizeGb; + } + + /** + * @return the status of disk creation. + */ + public String getStatus() { + return status; + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return super.string() + .omitNullValues() + .add("sizeGb", sizeGb) + .add("status", status); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static Builder builder() { + return new ConcreteBuilder(); + } + + public Builder toBuilder() { + return new ConcreteBuilder().fromAbstractDisk(this); + } + + public abstract static class Builder> extends Resource.Builder { + + protected Integer sizeGb; + protected String status; + + /** + * @see org.jclouds.googlecomputeengine.domain.AbstractDisk#getSizeGb() + */ + public T sizeGb(Integer sizeGb) { + this.sizeGb = sizeGb; + return self(); + } + + /** + * @see org.jclouds.googlecomputeengine.domain.AbstractDisk#getStatus() + */ + public T status(String status) { + this.status = status; + return self(); + } + + public T fromAbstractDisk(AbstractDisk in) { + return super.fromResource(in) + .sizeGb(in.getSizeGb()) + .status(in.getStatus()); + } + + } + + private static class ConcreteBuilder extends Builder { + @Override + protected ConcreteBuilder self() { + return this; + } + } + +} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Disk.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Disk.java index a34c32f65..df5e38c69 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Disk.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Disk.java @@ -16,27 +16,26 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; import java.beans.ConstructorProperties; import java.net.URI; import java.util.Date; -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; /** * A persistent disk resource * * @author David Alves - * @see + * @see */ @Beta -public final class Disk extends Resource { +public final class Disk extends AbstractDisk { - private final Integer sizeGb; private final URI zone; - private final String status; @ConstructorProperties({ "id", "creationTimestamp", "selfLink", "name", "description", "sizeGb", "zone", @@ -44,17 +43,8 @@ public final class Disk extends Resource { }) private Disk(String id, Date creationTimestamp, URI selfLink, String name, String description, Integer sizeGb, URI zone, String status) { - super(Kind.DISK, id, creationTimestamp, selfLink, name, description); - this.sizeGb = checkNotNull(sizeGb, "sizeGb of %s", name); + super(Kind.DISK, id, creationTimestamp, selfLink, name, description, sizeGb, status); this.zone = checkNotNull(zone, "zone of %s", name); - this.status = checkNotNull(status, "status of %s", name); - } - - /** - * @return size of the persistent disk, specified in GB. - */ - public int getSizeGb() { - return sizeGb; } /** @@ -65,10 +55,16 @@ public URI getZone() { } /** - * @return the status of disk creation. + * {@inheritDoc} */ - public String getStatus() { - return status; + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Disk that = Disk.class.cast(obj); + return equal(this.kind, that.kind) + && equal(this.name, that.name) + && equal(this.zone, that.zone); } /** @@ -77,9 +73,7 @@ public String getStatus() { protected Objects.ToStringHelper string() { return super.string() .omitNullValues() - .add("sizeGb", sizeGb) - .add("zone", zone) - .add("status", status); + .add("zone", zone); } /** @@ -98,19 +92,9 @@ public Builder toBuilder() { return new Builder().fromDisk(this); } - public static final class Builder extends Resource.Builder { + public static final class Builder extends AbstractDisk.Builder { - private Integer sizeGb; - private URI zone;; - private String status; - - /** - * @see Disk#getSizeGb() - */ - public Builder sizeGb(Integer sizeGb) { - this.sizeGb = sizeGb; - return this; - } + private URI zone; /** * @see Disk#getZone() @@ -120,15 +104,6 @@ public Builder zone(URI zone) { return this; } - /** - * @see Disk#getStatus() - */ - public Builder status(String status) { - this.status = status; - return this; - } - - @Override protected Builder self() { return this; @@ -136,14 +111,12 @@ protected Builder self() { public Disk build() { return new Disk(super.id, super.creationTimestamp, super.selfLink, super.name, - super.description, sizeGb, zone, status); + super.description, super.sizeGb, zone, super.status); } public Builder fromDisk(Disk in) { - return super.fromResource(in) - .sizeGb(in.getSizeGb()) - .zone(in.getZone()) - .status(in.getStatus()); + return super.fromAbstractDisk(in) + .zone(in.getZone()); } } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Firewall.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Firewall.java index 141936e75..feef148d6 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Firewall.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Firewall.java @@ -16,17 +16,6 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.RangeSet; -import com.google.common.collect.TreeRangeSet; - -import java.beans.ConstructorProperties; -import java.net.URI; -import java.util.Date; -import java.util.Set; - import static com.google.common.base.Objects.equal; import static com.google.common.base.Objects.toStringHelper; import static com.google.common.base.Preconditions.checkNotNull; @@ -34,11 +23,22 @@ import static com.google.common.collect.Range.closed; import static com.google.common.collect.Range.singleton; +import java.beans.ConstructorProperties; +import java.net.URI; +import java.util.Date; +import java.util.Set; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.RangeSet; +import com.google.common.collect.TreeRangeSet; + /** * Represents a network firewall * * @author David Alves - * @see + * @see * @see */ @Beta @@ -241,7 +241,7 @@ public Builder fromFirewall(Firewall in) { * permitted connection. * * @author David Alves - * @see + * @see */ public static final class Rule { 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 d521bbb59..048be1e7f 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 @@ -16,24 +16,24 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.base.Optional; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; import java.beans.ConstructorProperties; import java.net.URI; import java.util.Date; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Objects.toStringHelper; -import static com.google.common.base.Optional.fromNullable; -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Optional; /** * Represents a disk image to use on an instance. * * @author David Alves - * @see + * @see */ @Beta public final class Image extends Resource { @@ -41,17 +41,19 @@ public final class Image extends Resource { private final String sourceType; private final Optional preferredKernel; private final RawDisk rawDisk; + private final Optional deprecated; @ConstructorProperties({ "id", "creationTimestamp", "selfLink", "name", "description", "sourceType", "preferredKernel", - "rawDisk" + "rawDisk", "deprecated" }) protected Image(String id, Date creationTimestamp, URI selfLink, String name, String description, - String sourceType, URI preferredKernel, RawDisk rawDisk) { + String sourceType, URI preferredKernel, RawDisk rawDisk, Deprecated deprecated) { super(Kind.IMAGE, id, creationTimestamp, selfLink, name, description); this.sourceType = checkNotNull(sourceType, "sourceType of %s", name); this.preferredKernel = fromNullable(preferredKernel); - this.rawDisk = checkNotNull(rawDisk, "rawDisk of %s", name); ; + this.rawDisk = checkNotNull(rawDisk, "rawDisk of %s", name); + this.deprecated = fromNullable(deprecated); } /** @@ -75,6 +77,13 @@ public RawDisk getRawDisk() { return rawDisk; } + /** + * @return the deprecation information for this image + */ + public Optional getDeprecated() { + return deprecated; + } + /** * {@inheritDoc} */ @@ -83,7 +92,8 @@ protected Objects.ToStringHelper string() { .omitNullValues() .add("sourceType", sourceType) .add("preferredKernel", preferredKernel.orNull()) - .add("rawDisk", rawDisk); + .add("rawDisk", rawDisk) + .add("deprecated", deprecated.orNull()); } /** @@ -107,6 +117,7 @@ public static final class Builder extends Resource.Builder { private String sourceType; private URI preferredKernel; private RawDisk rawDisk; + private Deprecated deprecated; /** * @see Image#getSourceType() @@ -124,6 +135,14 @@ public Builder preferredKernel(URI preferredKernel) { return this; } + /** + * @see Image#getDeprecated() + */ + public Builder deprecated(Deprecated deprecated) { + this.deprecated = checkNotNull(deprecated, "deprecated"); + return this; + } + /** * @see Image#getRawDisk() */ @@ -139,23 +158,192 @@ protected Builder self() { public Image build() { return new Image(super.id, super.creationTimestamp, super.selfLink, super.name, - super.description, sourceType, preferredKernel, rawDisk); + super.description, sourceType, preferredKernel, rawDisk, deprecated); } public Builder fromImage(Image in) { return super.fromResource(in) .sourceType(in.getSourceType()) .preferredKernel(in.getPreferredKernel().orNull()) - .rawDisk(in.getRawDisk()); + .rawDisk(in.getRawDisk()) + .deprecated(in.getDeprecated().orNull()); + } + + } + + /** + * Deprecation information for an image + */ + public static class Deprecated { + private final Optional state; + private final Optional replacement; + private final Optional deprecated; + private final Optional obsolete; + private final Optional deleted; + + @ConstructorProperties({"state", "replacement", "deprecated", "obsolete", "deleted"}) + public Deprecated(String state, URI replacement, String deprecated, String obsolete, + String deleted) { + this.state = fromNullable(state); + this.replacement = fromNullable(replacement); + this.deprecated = fromNullable(deprecated); + this.obsolete = fromNullable(obsolete); + this.deleted = fromNullable(deleted); + } + + /** + * @return The deprecation state of this image. + */ + public Optional getState() { + return state; + } + + /** + * @return A fully-qualified URL of the suggested replacement for the deprecated image. + */ + public Optional getReplacement() { + return replacement; + } + + /** + * @return An optional RFC3339 timestamp for when the deprecation state of this resource will be changed to DEPRECATED. + */ + public Optional getDeprecated() { + return deprecated; + } + + /** + * @return An optional RFC3339 timestamp on or after which the deprecation state of this resource will be changed toOBSOLETE. + */ + public Optional getObsolete() { + return obsolete; + } + + /** + * @return An optional RFC3339 timestamp on or after which the deprecation state of this resource will be changed to DELETED. + */ + public Optional getDeleted() { + return deleted; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hashCode(state, replacement, deprecated, obsolete, deleted); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Deprecated that = Deprecated.class.cast(obj); + return equal(this.state, that.state) + && equal(this.replacement, that.replacement) + && equal(this.deprecated, that.deprecated) + && equal(this.obsolete, that.obsolete) + && equal(this.deleted, that.deleted); + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return toStringHelper(this) + .omitNullValues() + .add("state", state.orNull()) + .add("replacement", replacement.orNull()) + .add("deprecated", deprecated.orNull()) + .add("obsolete", obsolete.orNull()) + .add("deleted", deleted.orNull()); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); } + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return builder().fromDeprecated(this); + } + + public static class Builder { + private String state; + private URI replacement; + private String deprecated; + private String obsolete; + private String deleted; + + /** + * @see org.jclouds.googlecomputeengine.domain.Image.Deprecated#getState() + */ + public Builder state(String state) { + this.state = state; + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Image.Deprecated#getReplacement() + */ + public Builder replacement(URI replacement) { + this.replacement = replacement; + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Image.Deprecated#getDeprecated() + */ + public Builder deprecated(String deprecated) { + this.deprecated = deprecated; + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Image.Deprecated#getObsolete() + */ + public Builder obsolete(String obsolete) { + this.obsolete = obsolete; + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Image.Deprecated#getDeprecated() + */ + public Builder deleted(String deleted) { + this.deleted = deleted; + return this; + } + + public Deprecated build() { + return new Deprecated(state, replacement, deprecated, obsolete, deleted); + } + + public Builder fromDeprecated(Deprecated in) { + return new Builder().state(in.getState().orNull()) + .replacement(in.getReplacement().orNull()) + .deprecated(in.getDeprecated().orNull()) + .obsolete(in.getObsolete().orNull()) + .deleted(in.getDeleted().orNull()); + } + } } /** * A raw disk image, usually the base for an image. * * @author David Alves - * @see + * @see */ public static class RawDisk { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Instance.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Instance.java index 996d7ec63..ba27c2ddc 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Instance.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Instance.java @@ -16,12 +16,10 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import org.jclouds.javax.annotation.Nullable; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; import java.beans.ConstructorProperties; import java.net.URI; @@ -29,16 +27,19 @@ import java.util.Map; import java.util.Set; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Objects.toStringHelper; -import static com.google.common.base.Optional.fromNullable; -import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; /** * Represents a virtual machine. * * @author David Alves - * @see + * @see */ @Beta public class Instance extends Resource { @@ -52,7 +53,7 @@ public enum Status { TERMINATED } - protected final Set tags; + protected final Tags tags; protected final URI image; protected final URI machineType; protected final Status status; @@ -64,11 +65,11 @@ public enum Status { protected final Set serviceAccounts; protected Instance(String id, Date creationTimestamp, URI selfLink, String name, String description, - Set tags, URI image, URI machineType, Status status, String statusMessage, + Tags tags, URI image, URI machineType, Status status, String statusMessage, URI zone, Set networkInterfaces, Set disks, Map metadata, Set serviceAccounts) { super(Kind.INSTANCE, id, creationTimestamp, selfLink, name, description); - this.tags = tags == null ? ImmutableSet.of() : tags; + this.tags = checkNotNull(tags, "tags"); this.image = checkNotNull(image, "image"); this.machineType = checkNotNull(machineType, "machineType of %s", name); this.status = checkNotNull(status, "status"); @@ -84,9 +85,9 @@ protected Instance(String id, Date creationTimestamp, URI selfLink, String name, * Used to identify valid sources or targets for network firewalls. Provided by the client when the instance is * created. Each tag must be unique, must be 1-63 characters long, and comply with RFC1035. * - * @return an optional set of tags applied to this instance. + * @return an optional set of items applied to this instance. */ - public Set getTags() { + public Tags getTags() { return tags; } @@ -159,13 +160,26 @@ public Set getServiceAccounts() { return serviceAccounts; } + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Instance that = Instance.class.cast(obj); + return equal(this.kind, that.kind) + && equal(this.name, that.name) + && equal(this.zone, that.zone); + } + /** * {@inheritDoc} */ protected Objects.ToStringHelper string() { return super.string() .omitNullValues() - .add("tags", tags) + .add("items", tags) .add("image", image) .add("machineType", machineType) .add("status", status) @@ -195,7 +209,7 @@ public Builder toBuilder() { public static final class Builder extends Resource.Builder { - private ImmutableSet.Builder tags = ImmutableSet.builder(); + private Tags tags; private URI image; private URI machineType; private Status status; @@ -205,20 +219,13 @@ public static final class Builder extends Resource.Builder { private ImmutableSet.Builder disks = ImmutableSet.builder(); private ImmutableMap.Builder metadata = ImmutableMap.builder(); private ImmutableSet.Builder serviceAccounts = ImmutableSet.builder(); + private String tagsFingerprint; /** * @see Instance#getTags() */ - public Builder addTag(String tag) { - this.tags.add(tag); - return this; - } - - /** - * @see Instance#getTags() - */ - public Builder tags(Set tags) { - this.tags.addAll(tags); + public Builder tags(Tags tags) { + this.tags = tags; return this; } @@ -321,7 +328,7 @@ public Builder addServiceAccount(ServiceAccount serviceAccount) { /** * @see Instance#getServiceAccounts() */ - public Builder serviceAccoutns(Set serviceAccounts) { + public Builder serviceAccounts(Set serviceAccounts) { this.serviceAccounts.addAll(serviceAccounts); return this; } @@ -334,7 +341,7 @@ protected Builder self() { public Instance build() { return new Instance(super.id, super.creationTimestamp, super.selfLink, super.name, - super.description, tags.build(), image, machineType, status, statusMessage, zone, + super.description, tags, image, machineType, status, statusMessage, zone, networkInterfaces.build(), disks.build(), metadata.build(), serviceAccounts.build()); } @@ -349,14 +356,127 @@ public Builder fromInstance(Instance in) { .networkInterfaces(in.getNetworkInterfaces()) .disks(in.getDisks()) .metadata(in.getMetadata()) - .serviceAccoutns(in.getServiceAccounts()); + .serviceAccounts(in.getServiceAccounts()); + } + } + + /** + * Tags for an instance, with their fingerprint. + */ + public static class Tags { + private final String fingerprint; + private final Set items; + + @ConstructorProperties({"fingerprint", "items"}) + public Tags(String fingerprint, @Nullable Set items) { + this.fingerprint = checkNotNull(fingerprint); + this.items = items == null ? ImmutableSet.of() : items; + } + + /** + * Used to identify valid sources or targets for network firewalls. Provided by the client when the instance is + * created. Each tag must be unique, must be 1-63 characters long, and comply with RFC1035. + * + * @return an optional set of items applied to this instance. + */ + public Set getItems() { + return items; + } + + /** + * Gets the fingerprint for the items - needed for updating them. + * + * @return the fingerprint string for the items. + */ + public String getFingerprint() { + return fingerprint; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hashCode(fingerprint, items); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + Tags that = Tags.class.cast(obj); + return equal(this.items, that.items) + && equal(this.fingerprint, that.fingerprint); + } + + /** + * {@inheritDoc} + */ + protected Objects.ToStringHelper string() { + return toStringHelper(this) + .add("items", items) + .add("fingerprint", fingerprint); + } + + public static Builder builder() { + return new Builder(); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return string().toString(); + } + + public static final class Builder { + + private ImmutableSet.Builder items = ImmutableSet.builder(); + private String fingerprint; + + /** + * @see Tags#getItems() + */ + public Builder addItem(String item) { + this.items.add(item); + return this; + } + + /** + * @see Tags#getItems() + */ + public Builder items(Set items) { + this.items.addAll(items); + return this; + } + + /** + * @see org.jclouds.googlecomputeengine.domain.Instance.Tags#getFingerprint() + */ + public Builder fingerprint(String fingerprint) { + this.fingerprint = fingerprint; + return this; + } + + public Tags build() { + return new Tags(this.fingerprint, this.items.build()); + } + + public Builder fromTags(Tags in) { + return this.fingerprint(in.getFingerprint()) + .items(in.getItems()); + } } } /** * A disk attached to an Instance. * - * @see + * @see */ public static class AttachedDisk { @@ -419,10 +539,9 @@ public static AttachedDisk ephemeralDiskAtIndex(Integer index) { } public static class PersistentAttachedDisk extends AttachedDisk { - public enum Mode { READ_WRITE, - READ_ONLY + READ_ONLY; } @ConstructorProperties({"mode", "source", "deviceName", "index", "deleteOnTerminate"}) @@ -546,7 +665,7 @@ public Builder fromPersistentAttachedDisk(PersistentAttachedDisk in) { /** * A network interface for an Instance. * - * @see + * @see */ public static final class NetworkInterface { @@ -840,7 +959,7 @@ public Builder fromAccessConfig(AccessConfig in) { * The output of an instance's serial port; * * @author David Alves - * @see + * @see */ public static final class SerialPortOutput { @@ -948,7 +1067,7 @@ public Builder fromInstanceSerialPortOutput(SerialPortOutput in) { * A service account for which access tokens are to be made available to the instance through metadata queries. * * @author David Alves - * @see + * @see */ public static final class ServiceAccount { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceInZone.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceInZone.java new file mode 100644 index 000000000..18f8e5b3f --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceInZone.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * @author Adam Lowe + */ +public class InstanceInZone extends SlashEncodedIds { + protected final Instance instance; + + public InstanceInZone(Instance instance, String zoneId) { + super(zoneId, checkNotNull(instance, "instance").getName()); + this.instance = instance; + } + + public Instance getInstance() { + return instance; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + InstanceInZone that = InstanceInZone.class.cast(obj); + return equal(this.instance, that.instance) + && equal(this.firstId, that.firstId) + && equal(this.secondId, that.secondId); + } + + @Override + public String toString() { + return "[instance=" + instance + ", zoneId=" + firstId + "]"; + } + +} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceTemplate.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceTemplate.java index de93d7c2f..a8d52c2f7 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceTemplate.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/InstanceTemplate.java @@ -16,18 +16,18 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.base.Objects; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig.Type; import java.net.URI; import java.util.Map; import java.util.Set; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig.Type; +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; /** * Optional information for creating an instance. @@ -39,16 +39,13 @@ public class InstanceTemplate { protected String name; protected String description; protected URI machineType; - protected URI zone; protected URI image; - protected Set tags = Sets.newLinkedHashSet(); protected Set serviceAccounts = Sets.newLinkedHashSet(); protected transient Set disks = Sets.newLinkedHashSet(); protected transient Set networkInterfaces = Sets.newLinkedHashSet(); protected transient Map metadata = Maps.newLinkedHashMap(); protected transient String machineTypeName; - protected transient String zoneName; protected InstanceTemplate(URI machineType) { @@ -99,39 +96,6 @@ public InstanceTemplate machineType(String machineTypeName) { return this; } - /** - * @see org.jclouds.googlecomputeengine.domain.Instance#getZone() - */ - public InstanceTemplate zone(String zoneName) { - this.zoneName = zoneName; - return this; - } - - /** - * @see org.jclouds.googlecomputeengine.domain.Instance#getZone() - */ - public InstanceTemplate zone(URI zone) { - this.zone = zone; - return this; - } - - /** - * @see org.jclouds.googlecomputeengine.domain.Instance#getTags() - */ - public InstanceTemplate addTag(String tag) { - this.tags.add(checkNotNull(tag, "tag")); - return this; - } - - /** - * @see org.jclouds.googlecomputeengine.domain.Instance#getTags() - */ - public InstanceTemplate tags(Set tags) { - this.tags = Sets.newLinkedHashSet(); - this.tags.addAll(checkNotNull(tags, "tags")); - return this; - } - /** * @see org.jclouds.googlecomputeengine.domain.Instance#getDisks() */ @@ -161,7 +125,7 @@ public InstanceTemplate disks(Set disks) { * @see org.jclouds.googlecomputeengine.domain.Instance#getNetworkInterfaces() */ public InstanceTemplate addNetworkInterface(URI network) { - this.networkInterfaces.add(new NetworkInterface(checkNotNull(network, "network"), null,null)); + this.networkInterfaces.add(new NetworkInterface(checkNotNull(network, "network"), null, null)); return this; } @@ -280,13 +244,6 @@ public Set getServiceAccounts() { return serviceAccounts; } - /** - * @see org.jclouds.googlecomputeengine.domain.Instance#getTags() - */ - public Set getTags() { - return tags; - } - /** * @see org.jclouds.googlecomputeengine.domain.Instance#getName() */ @@ -294,20 +251,6 @@ public String getName() { return name; } - /** - * @see org.jclouds.googlecomputeengine.domain.Instance#getZone() - */ - public URI getZone() { - return zone; - } - - /** - * @see org.jclouds.googlecomputeengine.domain.Instance#getZone() - */ - public String getZoneName() { - return zoneName; - } - public static Builder builder() { return new Builder(); } @@ -332,9 +275,7 @@ public static InstanceTemplate fromInstanceTemplate(InstanceTemplate instanceTem .networkInterfaces(instanceTemplate.getNetworkInterfaces()) .name(instanceTemplate.getName()) .description(instanceTemplate.getDescription()) - .zone(instanceTemplate.getZone()) .image(instanceTemplate.getImage()) - .tags(instanceTemplate.getTags()) .disks(instanceTemplate.getDisks()) .metadata(instanceTemplate.getMetadata()) .serviceAccounts(instanceTemplate.getServiceAccounts()); @@ -431,7 +372,6 @@ public boolean equals(Object object) { if (object instanceof InstanceTemplate) { final InstanceTemplate other = InstanceTemplate.class.cast(object); return equal(description, other.description) - && equal(tags, other.tags) && equal(image, other.image) && equal(disks, other.disks) && equal(networkInterfaces, other.networkInterfaces) @@ -447,7 +387,7 @@ && equal(metadata, other.metadata) */ @Override public int hashCode() { - return Objects.hashCode(description, tags, image, disks, networkInterfaces, metadata, serviceAccounts); + return Objects.hashCode(description, image, disks, networkInterfaces, metadata, serviceAccounts); } /** @@ -457,8 +397,6 @@ protected Objects.ToStringHelper string() { Objects.ToStringHelper toString = Objects.toStringHelper("") .omitNullValues(); toString.add("description", description); - if (tags.size() > 0) - toString.add("tags", tags); if (disks.size() > 0) toString.add("disks", disks); if (metadata.size() > 0) diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Kernel.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Kernel.java index 9256a9f09..80ffce35c 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Kernel.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Kernel.java @@ -16,17 +16,17 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; - import java.beans.ConstructorProperties; import java.net.URI; import java.util.Date; +import com.google.common.annotations.Beta; + /** * Represents a kernel. * * @author David Alves - * @see + * @see */ @Beta public final class Kernel extends Resource { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java index bca57115b..98660c35d 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/ListPage.java @@ -16,19 +16,20 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.base.Objects; -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableSet; -import org.jclouds.collect.IterableWithMarker; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.googlecomputeengine.domain.Resource.Kind; import java.beans.ConstructorProperties; import java.net.URI; import java.util.Iterator; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Objects.toStringHelper; -import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.googlecomputeengine.domain.Resource.Kind; +import org.jclouds.collect.IterableWithMarker; + +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableSet; /** * The collection returned from any listFirstPage() method. diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java index d106b9b8f..fd1aa58f9 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineType.java @@ -16,26 +16,24 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Preconditions.checkNotNull; import java.beans.ConstructorProperties; import java.net.URI; import java.util.Date; import java.util.List; -import java.util.Set; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Objects.toStringHelper; -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableList; /** * Represents a machine type used to host an instance. * * @author David Alves - * @see + * @see */ @Beta public final class MachineType extends Resource { @@ -43,26 +41,26 @@ public final class MachineType extends Resource { private final Integer guestCpus; private final Integer memoryMb; private final Integer imageSpaceGb; - private final List ephemeralDisks; + private final List scratchDisks; private final Integer maximumPersistentDisks; private final Long maximumPersistentDisksSizeGb; - private final Set availableZone; + private final String zone; @ConstructorProperties({ "id", "creationTimestamp", "selfLink", "name", "description", "guestCpus", "memoryMb", - "imageSpaceGb", "ephemeralDisks", "maximumPersistentDisks", "maximumPersistentDisksSizeGb", "availableZone" + "imageSpaceGb", "scratchDisks", "maximumPersistentDisks", "maximumPersistentDisksSizeGb", "zone" }) private MachineType(String id, Date creationTimestamp, URI selfLink, String name, String description, - int guestCpus, int memoryMb, int imageSpaceGb, List ephemeralDisks, - int maximumPersistentDisks, long maximumPersistentDisksSizeGb, Set availableZone) { + int guestCpus, int memoryMb, int imageSpaceGb, List scratchDisks, + int maximumPersistentDisks, long maximumPersistentDisksSizeGb, String zone) { super(Kind.MACHINE_TYPE, id, creationTimestamp, selfLink, name, description); this.guestCpus = checkNotNull(guestCpus, "guestCpus of %s", name); this.memoryMb = checkNotNull(memoryMb, "memoryMb of %s", name); this.imageSpaceGb = checkNotNull(imageSpaceGb, "imageSpaceGb of %s", name); - this.ephemeralDisks = ephemeralDisks == null ? ImmutableList.of() : ephemeralDisks; + this.scratchDisks = scratchDisks == null ? ImmutableList.of() : scratchDisks; this.maximumPersistentDisks = checkNotNull(maximumPersistentDisks, "maximumPersistentDisks of %s", name); this.maximumPersistentDisksSizeGb = maximumPersistentDisksSizeGb; - this.availableZone = availableZone == null ? ImmutableSet.of() : availableZone; + this.zone = checkNotNull(zone, "zone of %s", name); } /** @@ -87,10 +85,10 @@ public int getImageSpaceGb() { } /** - * @return extended ephemeral disks assigned to the instance. + * @return extended scratch disks assigned to the instance. */ - public List getEphemeralDisks() { - return ephemeralDisks; + public List getScratchDisks() { + return scratchDisks; } /** @@ -110,8 +108,21 @@ public long getMaximumPersistentDisksSizeGb() { /** * @return the zones that this machine type can run in. */ - public Set getAvailableZone() { - return availableZone; + public String getZone() { + return zone; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + MachineType that = MachineType.class.cast(obj); + return equal(this.kind, that.kind) + && equal(this.name, that.name) + && equal(this.zone, that.zone); } /** @@ -122,10 +133,10 @@ protected Objects.ToStringHelper string() { .add("guestCpus", guestCpus) .add("memoryMb", memoryMb) .add("imageSpaceGb", imageSpaceGb) - .add("ephemeralDisks", ephemeralDisks) + .add("scratchDisks", scratchDisks) .add("maximumPersistentDisks", maximumPersistentDisks) .add("maximumPersistentDisksSizeGb", maximumPersistentDisksSizeGb) - .add("availableZone", availableZone); + .add("zone", zone); } /** @@ -149,10 +160,10 @@ public static final class Builder extends Resource.Builder { private Integer guestCpus; private Integer memoryMb; private Integer imageSpaceGb; - private ImmutableList.Builder ephemeralDisks = ImmutableList.builder(); + private ImmutableList.Builder scratchDisks = ImmutableList.builder(); private Integer maximumPersistentDisks; private Long maximumPersistentDisksSizeGb; - private ImmutableSet.Builder availableZone = ImmutableSet.builder(); + private String zone; /** * @see MachineType#getGuestCpus() @@ -179,18 +190,18 @@ public Builder imageSpaceGb(int imageSpaceGb) { } /** - * @see MachineType#getEphemeralDisks() + * @see MachineType#getScratchDisks() */ - public Builder addEphemeralDisk(int diskGb) { - this.ephemeralDisks.add(EphemeralDisk.builder().diskGb(diskGb).build()); + public Builder addScratchDisk(int diskGb) { + this.scratchDisks.add(ScratchDisk.builder().diskGb(diskGb).build()); return this; } /** - * @see MachineType#getEphemeralDisks() + * @see MachineType#getScratchDisks() */ - public Builder ephemeralDisks(List ephemeralDisks) { - this.ephemeralDisks.addAll(ephemeralDisks); + public Builder scratchDisks(List scratchDisks) { + this.scratchDisks.addAll(scratchDisks); return this; } @@ -211,18 +222,10 @@ public Builder maximumPersistentDisksSizeGb(long maximumPersistentDisksSizeGb) { } /** - * @see MachineType#getAvailableZone() - */ - public Builder addAvailableZone(String availableZone) { - this.availableZone.add(availableZone); - return this; - } - - /** - * @see MachineType#getAvailableZone() + * @see MachineType#getZone() */ - public Builder availableZones(Set availableZone) { - this.availableZone.addAll(availableZone); + public Builder zone(String zone) { + this.zone = zone; return this; } @@ -233,35 +236,35 @@ protected Builder self() { public MachineType build() { return new MachineType(id, creationTimestamp, selfLink, name, description, guestCpus, memoryMb, - imageSpaceGb, ephemeralDisks.build(), maximumPersistentDisks, maximumPersistentDisksSizeGb, - availableZone.build()); + imageSpaceGb, scratchDisks.build(), maximumPersistentDisks, maximumPersistentDisksSizeGb, + zone); } public Builder fromMachineType(MachineType in) { - return super.fromResource(in).memoryMb(in.getMemoryMb()).imageSpaceGb(in.getImageSpaceGb()).ephemeralDisks(in - .getEphemeralDisks()).maximumPersistentDisks(in.getMaximumPersistentDisks()) - .maximumPersistentDisksSizeGb(in.getMaximumPersistentDisksSizeGb()).availableZones(in - .getAvailableZone()); + return super.fromResource(in).memoryMb(in.getMemoryMb()).imageSpaceGb(in.getImageSpaceGb()).scratchDisks(in + .getScratchDisks()).maximumPersistentDisks(in.getMaximumPersistentDisks()) + .maximumPersistentDisksSizeGb(in.getMaximumPersistentDisksSizeGb()).zone(in + .getZone()); } } /** - * An ephemeral disk of a MachineType + * An scratch disk of a MachineType */ - public static final class EphemeralDisk { + public static final class ScratchDisk { private final int diskGb; @ConstructorProperties({ "diskGb" }) - private EphemeralDisk(int diskGb) { + private ScratchDisk(int diskGb) { this.diskGb = diskGb; } /** - * @return size of the ephemeral disk, defined in GB. + * @return size of the scratch disk, defined in GB. */ public int getDiskGb() { return diskGb; @@ -282,7 +285,7 @@ public int hashCode() { public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; - EphemeralDisk that = EphemeralDisk.class.cast(obj); + ScratchDisk that = ScratchDisk.class.cast(obj); return equal(this.diskGb, that.diskGb); } @@ -307,7 +310,7 @@ public static Builder builder() { } public Builder toBuilder() { - return builder().fromEphemeralDisk(this); + return builder().fromScratchDisk(this); } public static class Builder { @@ -315,18 +318,18 @@ public static class Builder { private int diskGb; /** - * @see org.jclouds.googlecomputeengine.domain.MachineType.EphemeralDisk#getDiskGb() + * @see org.jclouds.googlecomputeengine.domain.MachineType.ScratchDisk#getDiskGb() */ public Builder diskGb(int diskGb) { this.diskGb = diskGb; return this; } - public EphemeralDisk build() { - return new EphemeralDisk(diskGb); + public ScratchDisk build() { + return new ScratchDisk(diskGb); } - public Builder fromEphemeralDisk(EphemeralDisk in) { + public Builder fromScratchDisk(ScratchDisk in) { return new Builder().diskGb(in.getDiskGb()); } } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java new file mode 100644 index 000000000..2ba3d4951 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/MachineTypeInZone.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * @author Adam Lowe + */ +public class MachineTypeInZone extends SlashEncodedIds { + protected final MachineType machineType; + + public MachineTypeInZone(MachineType machineType, String zoneId) { + super(zoneId, checkNotNull(machineType, "machineType").getName()); + this.machineType = machineType; + } + + public MachineType getMachineType() { + return machineType; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj == null || getClass() != obj.getClass()) return false; + MachineTypeInZone that = MachineTypeInZone.class.cast(obj); + return equal(this.machineType, that.machineType) + && equal(this.firstId, that.firstId) + && equal(this.secondId, that.secondId); + } + + @Override + public String toString() { + return "[machineType=" + machineType + ", zoneId=" + firstId + "]"; + } + +} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java index c86279854..2fe913ca5 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Network.java @@ -17,22 +17,22 @@ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.base.Optional; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; import java.beans.ConstructorProperties; import java.net.URI; import java.util.Date; -import static com.google.common.base.Optional.fromNullable; -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Optional; /** * Represents a network used to enable instance communication. * * @author David Alves - * @see + * @see */ @Beta public final class Network extends Resource { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java index cf685ed68..f387aee2b 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Operation.java @@ -16,27 +16,29 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableList; -import org.jclouds.http.HttpResponse; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; import java.beans.ConstructorProperties; import java.net.URI; import java.util.Date; import java.util.List; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Objects.toStringHelper; -import static com.google.common.base.Optional.fromNullable; -import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.http.HttpResponse; +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableList; /** * Describes an operation being executed on some Resource * * @author David Alves - * @see + * @see */ @Beta public class Operation extends Resource { @@ -60,12 +62,14 @@ public static enum Status { private final Optional httpError; private final String operationType; private final List errors; + private final Optional zone; + private final Optional region; protected Operation(String id, Date creationTimestamp, URI selfLink, String name, String description, URI targetLink, String targetId, String clientOperationId, Status status, String statusMessage, String user, Integer progress, Date insertTime, Date startTime, Date endTime, Integer httpErrorStatusCode, String httpErrorMessage, String operationType, - List errors) { + @Nullable List errors, URI region, URI zone) { super(Kind.OPERATION, id, creationTimestamp, selfLink, name, description); this.targetLink = checkNotNull(targetLink, "targetLink of %s", name); this.targetId = fromNullable(targetId); @@ -85,6 +89,8 @@ protected Operation(String id, Date creationTimestamp, URI selfLink, String name : Optional.absent(); this.operationType = checkNotNull(operationType, "insertTime of %s", name); this.errors = errors == null ? ImmutableList.of() : ImmutableList.copyOf(errors); + this.region = fromNullable(region); + this.zone = fromNullable(zone); } /** @@ -94,6 +100,14 @@ public URI getTargetLink() { return targetLink; } + /** + * @return An optional identifier specified by the client when the mutation was initiated. Must be unique for all + * operation resources in the project. + */ + public Optional getClientOperationId() { + return clientOperationId; + } + /** * @return unique target id which identifies a particular incarnation of the target. */ @@ -102,11 +116,17 @@ public Optional getTargetId() { } /** - * @return An optional identifier specified by the client when the mutation was initiated. Must be unique for all - * operation resources in the project. + * @return region this operation is in, if any. */ - public Optional getClientOperationId() { - return clientOperationId; + public Optional getRegion() { + return region; + } + + /** + * @return zone this operation is in, if any. + */ + public Optional getZone() { + return zone; } /** @@ -199,7 +219,9 @@ protected Objects.ToStringHelper string() { .add("endTime", endTime.orNull()) .add("httpError", httpError.orNull()) .add("operationType", operationType) - .add("errors", errors); + .add("errors", errors) + .add("region", region.orNull()) + .add("zone", zone.orNull()); } /** @@ -234,6 +256,8 @@ public static final class Builder extends Resource.Builder { private String httpErrorMessage; private String operationType; private ImmutableList.Builder errors = ImmutableList.builder(); + private URI region; + private URI zone; /** * @see Operation#getTargetLink() @@ -243,6 +267,22 @@ public Builder targetLink(URI targetLink) { return self(); } + /** + * @see Operation#getRegion() + */ + public Builder region(URI region) { + this.region = region; + return self(); + } + + /** + * @see Operation#getZone() + */ + public Builder zone(URI zone) { + this.zone = zone; + return self(); + } + /** * @see Operation#getTargetId() */ @@ -365,7 +405,7 @@ public Operation build() { return new Operation(super.id, super.creationTimestamp, super.selfLink, super.name, super.description, targetLink, targetId, clientOperationId, status, statusMessage, user, progress, insertTime, startTime, endTime, httpErrorStatusCode, httpErrorMessage, operationType, - errors.build()); + errors.build(), region, zone); } public Builder fromOperation(Operation in) { @@ -382,7 +422,8 @@ public Builder fromOperation(Operation in) { .endTime(in.getEndTime().orNull()) .httpErrorStatusCode(in.getHttpError().isPresent() ? in.getHttpError().get().getStatusCode() : null) .httpErrorMessage(in.getHttpError().isPresent() ? in.getHttpError().get().getMessage() : null) - .operationType(in.getOperationType()).errors(in.getErrors()); + .operationType(in.getOperationType()).errors(in.getErrors()) + .zone(in.getZone().orNull()).region(in.getRegion().orNull()); } } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java index 33de1b9c4..c9614cf5e 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Project.java @@ -16,11 +16,9 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import org.jclouds.javax.annotation.Nullable; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Preconditions.checkNotNull; import java.beans.ConstructorProperties; import java.net.URI; @@ -28,9 +26,12 @@ import java.util.Map; import java.util.Set; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Objects.toStringHelper; -import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; /** * A Project resource is the root collection and settings resource for all Google Compute Engine resources. @@ -176,7 +177,7 @@ public Builder fromProject(Project in) { /** * Quotas assigned to a given project * - * @see + * @see */ public static final class Quota { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java index 19698d8e6..8abb3813f 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Resource.java @@ -16,6 +16,18 @@ */ package org.jclouds.googlecomputeengine.domain; +import static com.google.common.base.Objects.ToStringHelper; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.beans.ConstructorProperties; +import java.net.URI; +import java.util.Date; + +import org.jclouds.javax.annotation.Nullable; + import com.google.common.annotations.Beta; import com.google.common.base.CaseFormat; import com.google.common.base.Joiner; @@ -23,17 +35,6 @@ import com.google.common.base.Optional; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; -import org.jclouds.javax.annotation.Nullable; - -import java.beans.ConstructorProperties; -import java.net.URI; -import java.util.Date; - -import static com.google.common.base.Objects.ToStringHelper; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Objects.toStringHelper; -import static com.google.common.base.Optional.fromNullable; -import static com.google.common.base.Preconditions.checkNotNull; /** * Base class for Google Compute Engine resources. @@ -44,6 +45,8 @@ public class Resource { public enum Kind { + ADDRESS, + ADDRESS_LIST, DISK, DISK_LIST, FIREWALL, @@ -61,6 +64,12 @@ public enum Kind { PROJECT, NETWORK, NETWORK_LIST, + REGION, + REGION_LIST, + ROUTE, + ROUTE_LIST, + SNAPSHOT, + SNAPSHOT_LIST, ZONE, ZONE_LIST; diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java new file mode 100644 index 000000000..72c1dc5db --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/SlashEncodedIds.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.domain; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.Objects; +import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; + +/** + * @author Adam Lowe + */ +public class SlashEncodedIds { + public static SlashEncodedIds fromSlashEncoded(String id) { + Iterable parts = Splitter.on('/').split(checkNotNull(id, "id")); + checkArgument(Iterables.size(parts) == 2, "id must be in format firstId/secondId"); + return new SlashEncodedIds(Iterables.get(parts, 0), Iterables.get(parts, 1)); + } + + public static SlashEncodedIds fromTwoIds(String firstId, String secondId) { + return new SlashEncodedIds(firstId, secondId); + } + + private static String slashEncodeTwoIds(String firstId, String secondId) { + return checkNotNull(firstId, "firstId") + "/" + checkNotNull(secondId, "secondId"); + } + + public String slashEncode() { + return slashEncodeTwoIds(firstId, secondId); + } + + protected final String firstId; + protected final String secondId; + + protected SlashEncodedIds(String firstId, String secondId) { + this.firstId = checkNotNull(firstId, "firstId"); + this.secondId = checkNotNull(secondId, "secondId"); + } + + @Override + public int hashCode() { + return Objects.hashCode(firstId, secondId); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SlashEncodedIds other = (SlashEncodedIds) obj; + return Objects.equal(firstId, other.firstId) && Objects.equal(secondId, other.secondId); + } + + public String getFirstId() { + return firstId; + } + + public String getSecondId() { + return secondId; + } + + @Override + public String toString() { + return "[firstId=" + firstId + ", secondId=" + secondId + "]"; + } + +} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Zone.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Zone.java index 2d41a74b1..254b83dff 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Zone.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Zone.java @@ -16,27 +16,28 @@ */ package org.jclouds.googlecomputeengine.domain; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableSet; -import org.jclouds.javax.annotation.Nullable; +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Objects.toStringHelper; +import static com.google.common.base.Optional.fromNullable; +import static com.google.common.base.Preconditions.checkNotNull; import java.beans.ConstructorProperties; import java.net.URI; import java.util.Date; import java.util.Set; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Objects.toStringHelper; -import static com.google.common.base.Optional.fromNullable; -import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.javax.annotation.Nullable; + +import com.google.common.annotations.Beta; +import com.google.common.base.Objects; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableSet; /** * Represents a zone resource. * * @author David Alves - * @see + * @see */ @Beta public final class Zone extends Resource { @@ -181,7 +182,7 @@ public Builder fromZone(Zone in) { * Scheduled maintenance windows for the zone. When the zone is in a maintenance window, * all resources which reside in the zone will be unavailable. * - * @see + * @see */ public static final class MaintenanceWindow { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/DiskApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/DiskApi.java index faa05d1cf..f3d620ce8 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/DiskApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/DiskApi.java @@ -19,8 +19,6 @@ import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; -import java.net.URI; - import javax.inject.Named; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; @@ -57,7 +55,7 @@ * Provides access to Disks via their REST API. * * @author David Alves - * @see + * @see */ @SkipEncoding({'/', '='}) @RequestFilters(OAuthAuthenticator.class) @@ -66,25 +64,25 @@ public interface DiskApi { /** * Returns the specified persistent disk resource. * + * @param zone Name of the zone the disk is in. * @param diskName name of the persistent disk resource to return. * @return a Disk resource. */ @Named("Disks:get") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/disks/{disk}") + @Path("/zones/{zone}/disks/{disk}") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Fallback(NullOnNotFoundOr404.class) @Nullable - Disk get(@PathParam("disk") String diskName); + Disk getInZone(@PathParam("zone") String zone, @PathParam("disk") String diskName); /** * Creates a persistent disk resource in the specified project specifying the size of the disk. * - * * @param diskName the name of disk. * @param sizeGb the size of the disk - * @param zone the URi of the zone where the disk is to be created. + * @param zone the name of the zone where the disk is to be created. * @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. */ @@ -92,16 +90,17 @@ public interface DiskApi { @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/disks") + @Path("/zones/{zone}/disks") @OAuthScopes({COMPUTE_SCOPE}) @MapBinder(BindToJsonPayload.class) Operation createInZone(@PayloadParam("name") String diskName, - @PayloadParam("sizeGb") int sizeGb, - @PayloadParam("zone") URI zone); + @PayloadParam("sizeGb") int sizeGb, + @PathParam("zone") String zone); /** * Deletes the specified persistent disk resource. * + * @param zone the zone the disk is in. * @param diskName name of the persistent disk resource to delete. * @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. @@ -109,41 +108,42 @@ Operation createInZone(@PayloadParam("name") String diskName, @Named("Disks:delete") @DELETE @Consumes(MediaType.APPLICATION_JSON) - @Path("/disks/{disk}") + @Path("/zones/{zone}/disks/{disk}") @OAuthScopes(COMPUTE_SCOPE) @Fallback(NullOnNotFoundOr404.class) @Nullable - Operation delete(@PathParam("disk") String diskName); + Operation deleteInZone(@PathParam("zone") String zone, @PathParam("disk") String diskName); /** - * @see DiskApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see DiskApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("Disks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/disks") + @Path("/zones/{zone}/disks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseDisks.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listFirstPage(); + ListPage listFirstPageInZone(@PathParam("zone") String zone); /** - * @see DiskApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see DiskApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("Disks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/disks") + @Path("/zones/{zone}/disks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseDisks.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker); + ListPage listAtMarkerInZone(@PathParam("zone") String zone, @QueryParam("pageToken") @Nullable String marker); /** - * Retrieves the listPage of persistent disk resources contained within the specified project. + * Retrieves the listPage of persistent disk resources contained within the specified project and zone. * By default the listPage as a maximum size of 100, if no options are provided or ListOptions#getMaxResults() has * not been set. * + * @param zone the zone to search in * @param marker marks the beginning of the next list page * @param listOptions listing options * @return a page of the listPage @@ -153,36 +153,38 @@ Operation createInZone(@PayloadParam("name") String diskName, @Named("Disks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/disks") + @Path("/zones/{zone}/disks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseDisks.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, ListOptions options); + ListPage listAtMarkerInZone(@PathParam("zone") String zone, @QueryParam("pageToken") @Nullable String marker, ListOptions listOptions); /** - * A paged version of DiskApi#listPage() + * A paged version of DiskApi#listPageInZone(String) * + * @param zone the zone to list in * @return a Paged, Fluent Iterable that is able to fetch additional pages when required * @see PagedIterable - * @see DiskApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see DiskApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("Disks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/disks") + @Path("/zones/{zone}/disks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseDisks.class) @Transform(ParseDisks.ToPagedIterable.class) @Fallback(EmptyPagedIterableOnNotFoundOr404.class) - PagedIterable list(); + PagedIterable listInZone(@PathParam("zone") String zone); @Named("Disks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/disks") + @Path("/zones/{zone}/disks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseDisks.class) @Transform(ParseDisks.ToPagedIterable.class) @Fallback(EmptyPagedIterableOnNotFoundOr404.class) - PagedIterable list(ListOptions options); + PagedIterable listInZone(@PathParam("zone") String zone, ListOptions options); + } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/FirewallApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/FirewallApi.java index 5a7a8750a..a02b6d07e 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/FirewallApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/FirewallApi.java @@ -63,7 +63,7 @@ *

* * @author David Alves - * @see + * @see */ @SkipEncoding({'/', '='}) @RequestFilters(OAuthAuthenticator.class) @@ -77,7 +77,7 @@ public interface FirewallApi { @Named("Firewalls:get") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/firewalls/{firewall}") + @Path("/global/firewalls/{firewall}") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Fallback(NullOnNotFoundOr404.class) @Nullable @@ -86,8 +86,8 @@ public interface FirewallApi { /** * Creates a firewall resource in the specified project using the data included in the request. * - * @param name the name of the firewall to be inserted. - * @param network the network to which to add the firewall + * @param name the name of the firewall to be inserted. + * @param network the network to which to add the firewall * @param firewallOptions the options of the firewall to add * @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. @@ -96,7 +96,7 @@ public interface FirewallApi { @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/firewalls") + @Path("/global/firewalls") @OAuthScopes({COMPUTE_SCOPE}) @MapBinder(FirewallBinder.class) Operation createInNetwork(@PayloadParam("name") String name, @@ -106,8 +106,8 @@ Operation createInNetwork(@PayloadParam("name") String name, /** * Updates the specified firewall resource with the data included in the request. * - * @param firewallName the name firewall to be updated. - * @param firewallOptions the new firewall. + * @param firewallName the name firewall to be updated. + * @param firewallOptions the new firewall. * @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. */ @@ -115,7 +115,7 @@ Operation createInNetwork(@PayloadParam("name") String name, @PUT @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/firewalls/{firewall}") + @Path("/global/firewalls/{firewall}") @OAuthScopes({COMPUTE_SCOPE}) Operation update(@PathParam("firewall") String firewallName, @BinderParam(BindToJsonPayload.class) FirewallOptions firewallOptions); @@ -123,8 +123,8 @@ Operation update(@PathParam("firewall") String firewallName, /** * Updates the specified firewall resource, with patch semantics, with the data included in the request. * - * @param firewallName the name firewall to be updated. - * @param firewallOptions the new firewall. + * @param firewallName the name firewall to be updated. + * @param firewallOptions the new firewall. * @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. */ @@ -132,7 +132,7 @@ Operation update(@PathParam("firewall") String firewallName, @PATCH @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/firewalls/{firewall}") + @Path("/global/firewalls/{firewall}") @OAuthScopes({COMPUTE_SCOPE}) Operation patch(@PathParam("firewall") String firewallName, @BinderParam(BindToJsonPayload.class) FirewallOptions firewallOptions); @@ -147,7 +147,7 @@ Operation patch(@PathParam("firewall") String firewallName, @Named("Firewalls:delete") @DELETE @Consumes(MediaType.APPLICATION_JSON) - @Path("/firewalls/{firewall}") + @Path("/global/firewalls/{firewall}") @OAuthScopes(COMPUTE_SCOPE) @Fallback(NullOnNotFoundOr404.class) Operation delete(@PathParam("firewall") String firewallName); @@ -158,7 +158,7 @@ Operation patch(@PathParam("firewall") String firewallName, @Named("Firewalls:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/firewalls") + @Path("/global/firewalls") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseFirewalls.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) @@ -170,7 +170,7 @@ Operation patch(@PathParam("firewall") String firewallName, @Named("Firewalls:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/firewalls") + @Path("/global/firewalls") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseFirewalls.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) @@ -190,7 +190,7 @@ Operation patch(@PathParam("firewall") String firewallName, @Named("Firewalls:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/firewalls") + @Path("/global/firewalls") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseFirewalls.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) @@ -202,7 +202,7 @@ Operation patch(@PathParam("firewall") String firewallName, @Named("Firewalls:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/firewalls") + @Path("/global/firewalls") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseFirewalls.class) @Transform(ParseFirewalls.ToPagedIterable.class) @@ -219,7 +219,7 @@ Operation patch(@PathParam("firewall") String firewallName, @Named("Firewalls:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/firewalls") + @Path("/global/firewalls") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseFirewalls.class) @Transform(ParseFirewalls.ToPagedIterable.class) diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/GlobalOperationApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/GlobalOperationApi.java new file mode 100644 index 000000000..a4e2dbca7 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/GlobalOperationApi.java @@ -0,0 +1,235 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.features; + +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; + +import javax.inject.Named; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import org.jclouds.Fallbacks.EmptyIterableWithMarkerOnNotFoundOr404; +import org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404; +import org.jclouds.Fallbacks.NullOnNotFoundOr404; +import org.jclouds.collect.PagedIterable; +import org.jclouds.googlecomputeengine.domain.ListPage; +import org.jclouds.googlecomputeengine.domain.Operation; +import org.jclouds.googlecomputeengine.functions.internal.ParseGlobalOperations; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.oauth.v2.config.OAuthScopes; +import org.jclouds.oauth.v2.filters.OAuthAuthenticator; +import org.jclouds.rest.annotations.Fallback; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.ResponseParser; +import org.jclouds.rest.annotations.SkipEncoding; +import org.jclouds.rest.annotations.Transform; + +/** + * Provides access to Global Operations via their REST API. + * + * @author David Alves + * @see + */ +@SkipEncoding({'/', '='}) +@RequestFilters(OAuthAuthenticator.class) +public interface GlobalOperationApi { + + /** + * Retrieves the specified operation resource. + * + * @param operationName name of the operation resource to return. + * @return If successful, this method returns an Operation resource + */ + @Named("GlobalOperations:get") + @GET + @Path("/global/operations/{operation}") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @Fallback(NullOnNotFoundOr404.class) + Operation get(@PathParam("operation") String operationName); + + /** + * Deletes the specified operation resource. + * + * @param operationName name of the operation resource to delete. + */ + @Named("GlobalOperations:delete") + @DELETE + @Path("/global/operations/{operation}") + @OAuthScopes(COMPUTE_SCOPE) + @Fallback(NullOnNotFoundOr404.class) + void delete(@PathParam("operation") String operationName); + + /** + * @see org.jclouds.googlecomputeengine.features.GlobalOperationApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + */ + @Named("GlobalOperations:list") + @GET + @Path("/global/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) + ListPage listFirstPage(); + + /** + * @see org.jclouds.googlecomputeengine.features.GlobalOperationApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + */ + @Named("GlobalOperations:list") + @GET + @Path("/global/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) + ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker); + + /** + * Retrieves the listFirstPage of operation resources contained within the specified project. + * By default the listFirstPage as a maximum size of 100, if no options are provided or ListOptions#getMaxResults() + * has not been set. + * + * @param marker marks the beginning of the next list page + * @param listOptions listing options + * @return a page of the list, starting at marker + * @see org.jclouds.googlecomputeengine.options.ListOptions + * @see org.jclouds.googlecomputeengine.domain.ListPage + */ + @Named("GlobalOperations:list") + @GET + @Path("/global/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) + ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, + ListOptions listOptions); + + /** + * @see org.jclouds.googlecomputeengine.features.GlobalOperationApi#list(org.jclouds.googlecomputeengine.options.ListOptions) + */ + @Named("GlobalOperations:list") + @GET + @Path("/global/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Transform(ParseGlobalOperations.ToPagedIterable.class) + @Fallback(EmptyPagedIterableOnNotFoundOr404.class) + PagedIterable list(); + + /** + * A paged version of GlobalOperationApi#listFirstPage() + * + * @return a Paged, Fluent Iterable that is able to fetch additional pages when required + * @see org.jclouds.collect.PagedIterable + * @see org.jclouds.googlecomputeengine.features.GlobalOperationApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + */ + @Named("GlobalOperations:list") + @GET + @Path("/global/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Transform(ParseGlobalOperations.ToPagedIterable.class) + @Fallback(EmptyPagedIterableOnNotFoundOr404.class) + PagedIterable list(ListOptions listOptions); + + /** + * @see org.jclouds.googlecomputeengine.features.GlobalOperationApi#aggregatedListAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + */ + @Named("GlobalOperations:aggregatedList") + @GET + @Path("/aggregated/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) + ListPage aggregatedListFirstPage(); + + /** + * @see org.jclouds.googlecomputeengine.features.GlobalOperationApi#aggregatedListAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + */ + @Named("GlobalOperations:aggregatedList") + @GET + @Path("/aggregated/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) + ListPage aggregatedListAtMarker(@QueryParam("pageToken") @Nullable String marker); + + /** + * TODO live and expect tests for aggregatedList + * Retrieves the aggregatedListFirstPage of operation resources contained within the specified project. + * By default the aggregatedListFirstPage as a maximum size of 100, if no options are provided or ListOptions#getMaxResults() + * has not been set. + * + * @param marker marks the beginning of the next list page + * @param listOptions listing options + * @return a page of the list, starting at marker + * @see org.jclouds.googlecomputeengine.options.ListOptions + * @see org.jclouds.googlecomputeengine.domain.ListPage + */ + @Named("GlobalOperations:aggregatedList") + @GET + @Path("/aggregated/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) + ListPage aggregatedListAtMarker(@QueryParam("pageToken") @Nullable String marker, + ListOptions listOptions); + + /** + * @see org.jclouds.googlecomputeengine.features.GlobalOperationApi#aggregatedList(org.jclouds.googlecomputeengine.options.ListOptions) + */ + @Named("GlobalOperations:aggregatedList") + @GET + @Path("/aggregated/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Transform(ParseGlobalOperations.ToPagedIterable.class) + @Fallback(EmptyPagedIterableOnNotFoundOr404.class) + PagedIterable aggregatedList(); + + /** + * A paged version of GlobalOperationApi#aggregatedListFirstPage() + * + * @return a Paged, Fluent Iterable that is able to fetch additional pages when required + * @see org.jclouds.collect.PagedIterable + * @see org.jclouds.googlecomputeengine.features.GlobalOperationApi#aggregatedListAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + */ + @Named("GlobalOperations:aggregatedList") + @GET + @Path("/aggregated/operations") + @OAuthScopes(COMPUTE_READONLY_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @ResponseParser(ParseGlobalOperations.class) + @Transform(ParseGlobalOperations.ToPagedIterable.class) + @Fallback(EmptyPagedIterableOnNotFoundOr404.class) + PagedIterable aggregatedList(ListOptions listOptions); + +} 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 74faa0290..d3475e8a3 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 @@ -51,7 +51,7 @@ *

* * @author David Alves - * @see + * @see */ @SkipEncoding({'/', '='}) @RequestFilters(OAuthAuthenticator.class) @@ -65,7 +65,7 @@ public interface ImageApi { @Named("Images:get") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/images/{image}") + @Path("/global/images/{image}") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Fallback(NullOnNotFoundOr404.class) @Nullable @@ -81,7 +81,7 @@ public interface ImageApi { @Named("Images:delete") @DELETE @Consumes(MediaType.APPLICATION_JSON) - @Path("/images/{image}") + @Path("/global/images/{image}") @OAuthScopes(COMPUTE_SCOPE) @Fallback(NullOnNotFoundOr404.class) @Nullable @@ -93,7 +93,7 @@ public interface ImageApi { @Named("Images:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/images") + @Path("/global/images") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseImages.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) @@ -105,7 +105,7 @@ public interface ImageApi { @Named("Images:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/images") + @Path("/global/images") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseImages.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) @@ -116,7 +116,6 @@ public interface ImageApi { * By default the list as a maximum size of 100, if no options are provided or ListOptions#getMaxResults() has not * been set. * - * * @param marker marks the beginning of the next list page * @param listOptions listing options * @return a page of the list @@ -126,11 +125,11 @@ public interface ImageApi { @Named("Images:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/images") + @Path("/global/images") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseImages.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, ListOptions options); + ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, ListOptions listOptions); /** * A paged version of ImageApi#list() @@ -142,7 +141,7 @@ public interface ImageApi { @Named("Images:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/images") + @Path("/global/images") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseImages.class) @Transform(ParseImages.ToPagedIterable.class) @@ -159,10 +158,11 @@ public interface ImageApi { @Named("Images:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/images") + @Path("/global/images") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseImages.class) @Transform(ParseImages.ToPagedIterable.class) @Fallback(EmptyPagedIterableOnNotFoundOr404.class) PagedIterable list(ListOptions options); + } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/InstanceApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/InstanceApi.java index c78d3da2b..7fb49eb8c 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/InstanceApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/InstanceApi.java @@ -19,6 +19,9 @@ import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import java.util.Map; +import java.util.Set; + import javax.inject.Named; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; @@ -40,6 +43,8 @@ import org.jclouds.googlecomputeengine.domain.Operation; import org.jclouds.googlecomputeengine.functions.internal.ParseInstances; import org.jclouds.googlecomputeengine.handlers.InstanceBinder; +import org.jclouds.googlecomputeengine.handlers.MetadataBinder; +import org.jclouds.googlecomputeengine.options.AttachDiskOptions; import org.jclouds.googlecomputeengine.options.ListOptions; import org.jclouds.javax.annotation.Nullable; import org.jclouds.oauth.v2.config.OAuthScopes; @@ -58,7 +63,7 @@ * Provides access to Instances via their REST API. * * @author David Alves - * @see + * @see * @see InstanceApi */ @SkipEncoding({'/', '='}) @@ -68,24 +73,26 @@ public interface InstanceApi { /** * Returns the specified instance resource. * + * @param zone zone the instance is in. * @param instanceName name of the instance resource to return. * @return an Instance resource */ @Named("Instances:get") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/instances/{instance}") + @Path("/zones/{zone}/instances/{instance}") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Fallback(NullOnNotFoundOr404.class) @Nullable - Instance get(@PathParam("instance") String instanceName); + Instance getInZone(@PathParam("zone") String zone, @PathParam("instance") String instanceName); /** * Creates a instance resource in the specified project using the data included in the request. * + * * @param instanceName this name of the instance to be created - * @param template the instance template * @param zone the name of the zone where the instance will be created + * @param template the instance template * @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. */ @@ -93,16 +100,17 @@ public interface InstanceApi { @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/instances") + @Path("/zones/{zone}/instances") @OAuthScopes({COMPUTE_SCOPE}) @MapBinder(InstanceBinder.class) - Operation createInZone(@PayloadParam("name") String instanceName, - @PayloadParam("template") InstanceTemplate template, - @PayloadParam("zone") String zone); + Operation createInZone(@PayloadParam("name") String instanceName, @PathParam("zone") String zone, + @PayloadParam("template") InstanceTemplate template); + /** * Deletes the specified instance resource. * + * @param zone the instance is in. * @param instanceName name of the instance resource to delete. * @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. If the instance did not exist the result is null. @@ -110,33 +118,35 @@ Operation createInZone(@PayloadParam("name") String instanceName, @Named("Instances:delete") @DELETE @Consumes(MediaType.APPLICATION_JSON) - @Path("/instances/{instance}") + @Path("/zones/{zone}/instances/{instance}") @OAuthScopes(COMPUTE_SCOPE) @Fallback(NullOnNotFoundOr404.class) @Nullable - Operation delete(@PathParam("instance") String instanceName); + Operation deleteInZone(@PathParam("zone") String zone, @PathParam("instance") String instanceName); /** - * A paged version of InstanceApi#list() + * A paged version of InstanceApi#listInZone() * + * @param zone zone instances are in * @return a Paged, Fluent Iterable that is able to fetch additional pages when required * @see PagedIterable - * @see InstanceApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see InstanceApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("Instances:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/instances") + @Path("/zones/{zone}/instances") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseInstances.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listFirstPage(); + ListPage listFirstPageInZone(@PathParam("zone") String zone); /** * Retrieves the list of instance resources available to the specified project. * By default the list as a maximum size of 100, if no options are provided or ListOptions#getMaxResults() has not * been set. * + * @param zone zone instances are in * @param marker marks the beginning of the next list page * @param listOptions listing options * @return a page of the list @@ -146,53 +156,56 @@ Operation createInZone(@PayloadParam("name") String instanceName, @Named("Instances:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/instances") + @Path("/zones/{zone}/instances") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseInstances.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listAtMarker(@Nullable String marker); + ListPage listAtMarkerInZone(@PathParam("zone") String zone, @Nullable String marker, + ListOptions listOptions); /** - * @see InstanceApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see InstanceApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("Instances:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/instances") + @Path("/zones/{zone}/instances") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseInstances.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listAtMarker(@Nullable String marker, ListOptions options); + ListPage listAtMarkerInZone(@PathParam("zone") String zone, + @Nullable String marker); /** - * @see InstanceApi#list(org.jclouds.googlecomputeengine.options.ListOptions) + * @see InstanceApi#listInZone(String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("Instances:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/instances") + @Path("/zones/{zone}/instances") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseInstances.class) @Transform(ParseInstances.ToPagedIterable.class) @Fallback(EmptyPagedIterableOnNotFoundOr404.class) - PagedIterable list(); + PagedIterable listInZone(@PathParam("zone") String zone); /** - * @see InstanceApi#list(org.jclouds.googlecomputeengine.options.ListOptions) + * @see InstanceApi#listInZone(String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("Instances:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/instances") + @Path("/zones/{zone}/instances") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseInstances.class) @Transform(ParseInstances.ToPagedIterable.class) @Fallback(EmptyPagedIterableOnNotFoundOr404.class) - PagedIterable list(ListOptions options); + PagedIterable listInZone(@PathParam("zone") String zone, ListOptions options); /** * Adds an access config to an instance's network interface. * + * @param zone zone instance is in * @param instanceName the instance name. * @param accessConfig the AccessConfig to add. * @param networkInterfaceName network interface name. @@ -203,16 +216,18 @@ Operation createInZone(@PayloadParam("name") String instanceName, @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/instances/{instance}/addAccessConfig") + @Path("/zones/{zone}/instances/{instance}/addAccessConfig") @OAuthScopes({COMPUTE_SCOPE}) - Operation addAccessConfigToNic(@PathParam("instance") String instanceName, - @BinderParam(BindToJsonPayload.class) - Instance.NetworkInterface.AccessConfig accessConfig, - @QueryParam("network_interface") String networkInterfaceName); - + Operation addAccessConfigToNicInZone(@PathParam("zone") String zone, + @PathParam("instance") String instanceName, + @BinderParam(BindToJsonPayload.class) + Instance.NetworkInterface.AccessConfig accessConfig, + @QueryParam("network_interface") String networkInterfaceName); + /** * Deletes an access config from an instance's network interface. * + * @param zone zone instance is in * @param instanceName the instance name. * @param accessConfigName the name of the access config to delete * @param networkInterfaceName network interface name. @@ -222,22 +237,147 @@ Operation addAccessConfigToNic(@PathParam("instance") String instanceName, @Named("Instances:deleteAccessConfig") @DELETE @Consumes(MediaType.APPLICATION_JSON) - @Path("/instances/{instance}/deleteAccessConfig") + @Path("/zones/{zone}/instances/{instance}/deleteAccessConfig") @OAuthScopes(COMPUTE_SCOPE) - Operation deleteAccessConfigFromNic(@PathParam("instance") String instanceName, - @QueryParam("access_config") String accessConfigName, - @QueryParam("network_interface") String networkInterfaceName); + Operation deleteAccessConfigFromNicInZone(@PathParam("zone") String zone, + @PathParam("instance") String instanceName, + @QueryParam("access_config") String accessConfigName, + @QueryParam("network_interface") String networkInterfaceName); /** * Returns the specified instance's serial port output. * + * @param zone zone instance is in * @param instanceName the instance name. * @return if successful, this method returns a SerialPortOutput containing the instance's serial output. */ @Named("Instances:serialPort") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/instances/{instance}/serialPort") + @Path("/zones/{zone}/instances/{instance}/serialPort") @OAuthScopes(COMPUTE_READONLY_SCOPE) - Instance.SerialPortOutput getSerialPortOutput(@PathParam("instance") String instanceName); + Instance.SerialPortOutput getSerialPortOutputInZone(@PathParam("zone") String zone, + @PathParam("instance") String instanceName); + + /** + * TODO add live and expect tests for reset + * Hard-resets the instance. + * + * @param zone the zone the instance is in + * @param instanceName the instance name + * @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. If the instance did not exist the result is null. + */ + @Named("Instances:reset") + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/zones/{zone}/instances/{instance}/reset") + @OAuthScopes(COMPUTE_SCOPE) + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Operation resetInZone(@PathParam("zone") String zone, + @PathParam("instance") String instanceName); + + /** + * TODO add live and expect tests for attachDisk + * Attaches a disk to an instance + * + * @param zone The zone the instance is in. + * @param instanceName The instance name to attach to + * @param attachDiskOptions The options for attaching the disk. + * + * @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("Instances:attachDisk") + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Path("/zones/{zone}/instances/{instance}/attachDisk") + @OAuthScopes(COMPUTE_SCOPE) + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Operation attachDiskInZone(@PathParam("zone") String zone, + @PathParam("instance") String instanceName, + @BinderParam(BindToJsonPayload.class) AttachDiskOptions attachDiskOptions); + + /** + * TODO add live and expect tests for detachDisk + * Detaches an attached disk from an instance + * + * @param zone The zone the instance is in. + * @param instanceName The instance name to attach to + * @param deviceName The device name of the disk to detach. + * + * @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("Instances:detachDisk") + @POST + @Consumes(MediaType.APPLICATION_JSON) + @Path("/zones/{zone}/instances/{instance}/detachDisk") + @OAuthScopes(COMPUTE_SCOPE) + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Operation detachDiskInZone(@PathParam("zone") String zone, + @PathParam("instance") String instanceName, + @QueryParam("deviceName") String deviceName); + + /** + * TODO add live and expect tests for setMetadata + * Sets metadata for an instance using the data included in the request. + *

+ * NOTE: This *sets* metadata items on the project (vs *adding* items to metadata), + * if there are pre-existing metadata items that must be kept these must be fetched first and then re-set on the + * new Metadata, e.g. + *


+    *    Metadata.Builder current = instanceApi.getInZone("us-central1-a", "myInstance").getMetadata().toBuilder();
+    *    current.addItem("newItem","newItemValue");
+    *    instanceApi.setMetadataInZone("us-central1-a", "myInstance", current.build());
+    * 
+ * + * @param zone The zone the instance is in + * @param instanceName The name of the instance + * @param metadata the metadata to set + * @return an Operations resource. To check on the status of an operation, poll the Operations resource returned + * to you, and look for the status field. + */ + @Named("Instances:setMetadata") + @POST + @Path("/zones/{zone}/instances/{instance}/setMetadata") + @OAuthScopes(COMPUTE_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Fallback(NullOnNotFoundOr404.class) + @Nullable + Operation setMetadataInZone(@PathParam("zone") String zone, + @PathParam("instance") String instanceName, + @BinderParam(MetadataBinder.class) + Map metadata); + + /** + * Sets tags for an instance + * + * @param zone The zone the instance is in + * @param instanceName the name of the instance + * @param items A set of tags + * @param fingerprint The current fingerprint for the tags + * @return an Operations resource. To check on the status of an operation, poll the Operations resource returned + * to you, and look for the status field. + */ + @Named("Instances:setTags") + @POST + @Path("/zones/{zone}/instances/{instance}/setTags") + @OAuthScopes(COMPUTE_SCOPE) + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @Fallback(NullOnNotFoundOr404.class) + @MapBinder(BindToJsonPayload.class) + @Nullable + Operation setTagsInZone(@PathParam("zone") String zone, + @PathParam("instance") String instanceName, + @PayloadParam("items") Set items, + @PayloadParam("fingerprint") String fingerprint); + } + diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/KernelApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/KernelApi.java index a707bb507..76acf9c51 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/KernelApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/KernelApi.java @@ -47,7 +47,7 @@ * Provides access to Kernels via their REST API. * * @author David Alves - * @see + * @see */ @SkipEncoding({'/', '='}) @RequestFilters(OAuthAuthenticator.class) @@ -62,7 +62,7 @@ public interface KernelApi { */ @Named("Kernels:get") @GET - @Path("/kernels/{kernel}") + @Path("/global/kernels/{kernel}") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Fallback(NullOnNotFoundOr404.class) Kernel get(@PathParam("kernel") String kernelName); @@ -72,7 +72,7 @@ public interface KernelApi { */ @Named("Kernels:list") @GET - @Path("/kernels") + @Path("/global/kernels") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseKernels.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) @@ -83,7 +83,7 @@ public interface KernelApi { */ @Named("Kernels:list") @GET - @Path("/kernels") + @Path("/global/kernels") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseKernels.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) @@ -102,19 +102,19 @@ public interface KernelApi { */ @Named("Kernels:list") @GET - @Path("/kernels") + @Path("/global/kernels") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseKernels.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, - ListOptions listOptions); + ListOptions listOptions); /** * @see KernelApi#list(org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("Kernels:list") @GET - @Path("/kernels") + @Path("/global/kernels") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseKernels.class) @Transform(ParseKernels.ToPagedIterable.class) @@ -130,7 +130,7 @@ ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, */ @Named("Kernels:list") @GET - @Path("/kernels") + @Path("/global/kernels") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseKernels.class) @Transform(ParseKernels.ToPagedIterable.class) diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/MachineTypeApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/MachineTypeApi.java index a27e2e44b..acdd24f3f 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/MachineTypeApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/MachineTypeApi.java @@ -47,7 +47,7 @@ * Provides access to MachineTypes via their REST API. * * @author David Alves - * @see + * @see */ @SkipEncoding({'/', '='}) @RequestFilters(OAuthAuthenticator.class) @@ -57,44 +57,45 @@ public interface MachineTypeApi { /** * Returns the specified machine type resource * + * @param zone the name of the zone the machine type is in * @param machineTypeName name of the machine type resource to return. * @return If successful, this method returns a MachineType resource */ @Named("MachineTypes:get") @GET - @Path("/machineTypes/{machineType}") + @Path("/zones/{zone}/machineTypes/{machineType}") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Fallback(NullOnNotFoundOr404.class) - MachineType get(@PathParam("machineType") String machineTypeName); + MachineType getInZone(@PathParam("zone") String zone, @PathParam("machineType") String machineTypeName); /** - * @see MachineTypeApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see MachineTypeApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("MachineTypes:list") @GET - @Path("/machineTypes") + @Path("/zones/{zone}/machineTypes") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseMachineTypes.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listFirstPage(); + ListPage listFirstPageInZone(@PathParam("zone") String zone); /** - * @see MachineTypeApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see MachineTypeApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("MachineTypes:list") @GET - @Path("/machineTypes") + @Path("/zones/{zone}/machineTypes") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseMachineTypes.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker); + ListPage listAtMarkerInZone(@PathParam("zone") String zone, @QueryParam("pageToken") @Nullable String marker); /** * Retrieves the list of machine type resources available to the specified project. * By default the list as a maximum size of 100, if no options are provided or ListOptions#getMaxResults() has not * been set. * - * + * @param zone The name of the zone to list in. * @param marker marks the beginning of the next list page * @param listOptions listing options * @return a page of the list @@ -103,39 +104,41 @@ public interface MachineTypeApi { */ @Named("MachineTypes:list") @GET - @Path("/machineTypes") + @Path("/zones/{zone}/machineTypes") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseMachineTypes.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, - ListOptions listOptions); + ListPage listAtMarkerInZone(@PathParam("zone") String zone, + @QueryParam("pageToken") @Nullable String marker, + ListOptions listOptions); /** - * @see MachineTypeApi#list(org.jclouds.googlecomputeengine.options.ListOptions) + * @see MachineTypeApi#listInZone(String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("MachineTypes:list") @GET - @Path("/machineTypes") + @Path("/zones/{zone}/machineTypes") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseMachineTypes.class) @Transform(ParseMachineTypes.ToPagedIterable.class) @Fallback(EmptyPagedIterableOnNotFoundOr404.class) - PagedIterable list(); + PagedIterable listInZone(@PathParam("zone") String zone); /** - * A paged version of MachineTypeApi#list() + * A paged version of MachineTypeApi#listInZone(String) * + * @param zone the zone to list in * @return a Paged, Fluent Iterable that is able to fetch additional pages when required * @see PagedIterable - * @see MachineTypeApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see MachineTypeApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ @Named("MachineTypes:list") @GET - @Path("/machineTypes") + @Path("/zones/{zone}/machineTypes") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseMachineTypes.class) @Transform(ParseMachineTypes.ToPagedIterable.class) @Fallback(EmptyPagedIterableOnNotFoundOr404.class) - PagedIterable list(ListOptions listOptions); + PagedIterable listInZone(@PathParam("zone") String zone, ListOptions listOptions); } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/NetworkApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/NetworkApi.java index ca1578747..5a04ccd21 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/NetworkApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/NetworkApi.java @@ -55,7 +55,7 @@ * Provides access to Networks via their REST API. * * @author David Alves - * @see + * @see */ @SkipEncoding({'/', '='}) @RequestFilters(OAuthAuthenticator.class) @@ -70,7 +70,7 @@ public interface NetworkApi { @Named("Networks:get") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/networks/{network}") + @Path("/global/networks/{network}") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Fallback(NullOnNotFoundOr404.class) Network get(@PathParam("network") String networkName); @@ -87,11 +87,11 @@ public interface NetworkApi { @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/networks") + @Path("/global/networks") @OAuthScopes({COMPUTE_SCOPE}) @MapBinder(BindToJsonPayload.class) Operation createInIPv4Range(@PayloadParam("name") String networkName, - @PayloadParam("IPv4Range") String IPv4Range); + @PayloadParam("IPv4Range") String IPv4Range); /** * Creates a persistent network resource in the specified project with the specified range and specified gateway. @@ -106,12 +106,12 @@ Operation createInIPv4Range(@PayloadParam("name") String networkName, @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - @Path("/networks") + @Path("/global/networks") @OAuthScopes({COMPUTE_SCOPE}) @MapBinder(BindToJsonPayload.class) Operation createInIPv4RangeWithGateway(@PayloadParam("name") String networkName, - @PayloadParam("IPv4Range") String IPv4Range, - @PayloadParam("gatewayIPv4") String gatewayIPv4); + @PayloadParam("IPv4Range") String IPv4Range, + @PayloadParam("gatewayIPv4") String gatewayIPv4); /** * Deletes the specified persistent network resource. @@ -123,7 +123,7 @@ Operation createInIPv4RangeWithGateway(@PayloadParam("name") String networkName, @Named("Networks:delete") @DELETE @Consumes(MediaType.APPLICATION_JSON) - @Path("/networks/{network}") + @Path("/global/networks/{network}") @OAuthScopes(COMPUTE_SCOPE) @Fallback(NullOnNotFoundOr404.class) Operation delete(@PathParam("network") String networkName); @@ -134,7 +134,7 @@ Operation createInIPv4RangeWithGateway(@PayloadParam("name") String networkName, @Named("Networks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/networks") + @Path("/global/networks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseNetworks.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) @@ -146,7 +146,7 @@ Operation createInIPv4RangeWithGateway(@PayloadParam("name") String networkName, @Named("Networks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/networks") + @Path("/global/networks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseNetworks.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) @@ -157,7 +157,6 @@ Operation createInIPv4RangeWithGateway(@PayloadParam("name") String networkName, * By default the list as a maximum size of 100, if no options are provided or ListOptions#getMaxResults() has not * been set. * - * * @param marker marks the beginning of the next list page * @param listOptions listing options * @return a page of the list @@ -167,12 +166,12 @@ Operation createInIPv4RangeWithGateway(@PayloadParam("name") String networkName, @Named("Networks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/networks") + @Path("/global/networks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseNetworks.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, - ListOptions options); + ListOptions options); /** * @see NetworkApi#list(org.jclouds.googlecomputeengine.options.ListOptions) @@ -180,7 +179,7 @@ ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, @Named("Networks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/networks") + @Path("/global/networks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseNetworks.class) @Transform(ParseNetworks.ToPagedIterable.class) @@ -197,7 +196,7 @@ ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, @Named("Networks:list") @GET @Consumes(MediaType.APPLICATION_JSON) - @Path("/networks") + @Path("/global/networks") @OAuthScopes(COMPUTE_READONLY_SCOPE) @ResponseParser(ParseNetworks.class) @Transform(ParseNetworks.ToPagedIterable.class) diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ProjectApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ProjectApi.java index d33d22ddc..47df5a03a 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ProjectApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ProjectApi.java @@ -45,7 +45,7 @@ * Provides access to Projects via their REST API. * * @author David Alves - * @see + * @see */ @SkipEncoding({'/', '='}) @RequestFilters(OAuthAuthenticator.class) @@ -89,6 +89,6 @@ public interface ProjectApi { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) Operation setCommonInstanceMetadata(@PathParam("project") String projectName, - @BinderParam(MetadataBinder.class) - Map commonInstanceMetadata); + @BinderParam(MetadataBinder.class) + Map commonInstanceMetadata); } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ZoneApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ZoneApi.java index fcf961882..054284240 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ZoneApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ZoneApi.java @@ -45,7 +45,7 @@ * Provides access to Zones via their REST API. * * @author David Alves - * @see + * @see */ @SkipEncoding({'/', '='}) @RequestFilters(OAuthAuthenticator.class) diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/OperationApi.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ZoneOperationApi.java similarity index 62% rename from google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/OperationApi.java rename to google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ZoneOperationApi.java index fc8da710b..e96bd6e54 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/OperationApi.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/features/ZoneOperationApi.java @@ -34,7 +34,7 @@ import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.domain.ListPage; import org.jclouds.googlecomputeengine.domain.Operation; -import org.jclouds.googlecomputeengine.functions.internal.ParseOperations; +import org.jclouds.googlecomputeengine.functions.internal.ParseZoneOperations; import org.jclouds.googlecomputeengine.options.ListOptions; import org.jclouds.javax.annotation.Nullable; import org.jclouds.oauth.v2.config.OAuthScopes; @@ -49,111 +49,116 @@ * Provides access to Operations via their REST API. * * @author David Alves - * @see + * @see */ @SkipEncoding({'/', '='}) @RequestFilters(OAuthAuthenticator.class) -public interface OperationApi { +public interface ZoneOperationApi { /** * Retrieves the specified operation resource. * + * @param zone the zone the operation is in * @param operationName name of the operation resource to return. * @return If successful, this method returns an Operation resource */ - @Named("Operations:get") + @Named("ZoneOperations:get") @GET - @Path("/operations/{operation}") + @Path("/zones/{zone}/operations/{operation}") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Consumes(MediaType.APPLICATION_JSON) @Fallback(NullOnNotFoundOr404.class) - Operation get(@PathParam("operation") String operationName); + Operation getInZone(@PathParam("zone") String zone, @PathParam("operation") String operationName); /** * Deletes the specified operation resource. * + * @param zone the zone the operation is in * @param operationName name of the operation resource to delete. */ - @Named("Operations:delete") + @Named("ZoneOperations:delete") @DELETE - @Path("/operations/{operation}") + @Path("/zones/{zone}/operations/{operation}") @OAuthScopes(COMPUTE_SCOPE) @Fallback(NullOnNotFoundOr404.class) - void delete(@PathParam("operation") String operationName); + void deleteInZone(@PathParam("zone") String zone, @PathParam("operation") String operationName); /** - * @see OperationApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see ZoneOperationApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ - @Named("Operations:list") + @Named("ZoneOperations:list") @GET - @Path("/operations") + @Path("/zones/{zone}/operations") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Consumes(MediaType.APPLICATION_JSON) - @ResponseParser(ParseOperations.class) + @ResponseParser(ParseZoneOperations.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listFirstPage(); + ListPage listFirstPageInZone(@PathParam("zone") String zone); /** - * @see OperationApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see ZoneOperationApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ - @Named("Operations:list") + @Named("ZoneOperations:list") @GET - @Path("/operations") + @Path("/zones/{zone}/operations") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Consumes(MediaType.APPLICATION_JSON) - @ResponseParser(ParseOperations.class) + @ResponseParser(ParseZoneOperations.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker); + ListPage listAtMarkerInZone(@PathParam("zone") String zone, + @QueryParam("pageToken") @Nullable String marker); /** * Retrieves the listFirstPage of operation resources contained within the specified project. * By default the listFirstPage as a maximum size of 100, if no options are provided or ListOptions#getMaxResults() * has not been set. * + * @param zone the zone to list in * @param marker marks the beginning of the next list page * @param listOptions listing options * @return a page of the list, starting at marker * @see ListOptions * @see org.jclouds.googlecomputeengine.domain.ListPage */ - @Named("Operations:list") + @Named("ZoneOperations:list") @GET - @Path("/operations") + @Path("/zones/{zone}/operations") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Consumes(MediaType.APPLICATION_JSON) - @ResponseParser(ParseOperations.class) + @ResponseParser(ParseZoneOperations.class) @Fallback(EmptyIterableWithMarkerOnNotFoundOr404.class) - ListPage listAtMarker(@QueryParam("pageToken") @Nullable String marker, - ListOptions listOptions); + ListPage listAtMarkerInZone(@PathParam("zone") String zone, + @QueryParam("pageToken") @Nullable String marker, + ListOptions listOptions); /** - * @see OperationApi#list(org.jclouds.googlecomputeengine.options.ListOptions) + * @see ZoneOperationApi#listInZone(String, org.jclouds.googlecomputeengine.options.ListOptions) */ - @Named("Operations:list") + @Named("ZoneOperations:list") @GET - @Path("/operations") + @Path("/zones/{zone}/operations") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Consumes(MediaType.APPLICATION_JSON) - @ResponseParser(ParseOperations.class) - @Transform(ParseOperations.ToPagedIterable.class) + @ResponseParser(ParseZoneOperations.class) + @Transform(ParseZoneOperations.ToPagedIterable.class) @Fallback(EmptyPagedIterableOnNotFoundOr404.class) - PagedIterable list(); + PagedIterable listInZone(@PathParam("zone") String zone); /** - * A paged version of OperationApi#listFirstPage() + * A paged version of ZoneOperationApi#listFirstPageInZone(String) * * @return a Paged, Fluent Iterable that is able to fetch additional pages when required * @see PagedIterable - * @see OperationApi#listAtMarker(String, org.jclouds.googlecomputeengine.options.ListOptions) + * @see ZoneOperationApi#listAtMarkerInZone(String, String, org.jclouds.googlecomputeengine.options.ListOptions) */ - @Named("Operations:list") + @Named("ZoneOperations:list") @GET - @Path("/operations") + @Path("/zones/{zone}/operations") @OAuthScopes(COMPUTE_READONLY_SCOPE) @Consumes(MediaType.APPLICATION_JSON) - @ResponseParser(ParseOperations.class) - @Transform(ParseOperations.ToPagedIterable.class) + @ResponseParser(ParseZoneOperations.class) + @Transform(ParseZoneOperations.ToPagedIterable.class) @Fallback(EmptyPagedIterableOnNotFoundOr404.class) - PagedIterable list(ListOptions listOptions); + PagedIterable listInZone(@PathParam("zone") String zone, ListOptions listOptions); } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/BaseToPagedIterable.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/BaseToPagedIterable.java index 8542a3721..cc3142b08 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/BaseToPagedIterable.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/BaseToPagedIterable.java @@ -16,9 +16,9 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.annotations.Beta; -import com.google.common.base.Function; -import com.google.common.base.Optional; +import static com.google.common.base.Predicates.instanceOf; +import static com.google.common.collect.Iterables.tryFind; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.collect.PagedIterable; import org.jclouds.collect.PagedIterables; @@ -28,15 +28,16 @@ import org.jclouds.rest.InvocationContext; import org.jclouds.rest.internal.GeneratedHttpRequest; -import static com.google.common.base.Predicates.instanceOf; -import static com.google.common.collect.Iterables.tryFind; +import com.google.common.annotations.Beta; +import com.google.common.base.Function; +import com.google.common.base.Optional; /** * @author Adrian Cole */ @Beta public abstract class BaseToPagedIterable> implements - Function, PagedIterable>, InvocationContext { + Function, PagedIterable>, InvocationContext { private GeneratedHttpRequest request; @@ -50,7 +51,7 @@ public PagedIterable apply(ListPage input) { Optional listOptions = tryFind(request.getInvocation().getArgs(), instanceOf(ListOptions.class)); assert project.isPresent() : String.format("programming error, method %s should have a string param for the " - + "project", request.getCaller().get().getInvokable()); + + "project", request.getCaller().get().getInvokable()); return PagedIterables.advance( input, fetchNextPage(project.get().toString(), (ListOptions) listOptions.orNull())); diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/BaseWithZoneToPagedIterable.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/BaseWithZoneToPagedIterable.java new file mode 100644 index 000000000..0c17488a2 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/BaseWithZoneToPagedIterable.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.functions.internal; + +import static com.google.common.base.Predicates.instanceOf; +import static com.google.common.collect.Iterables.tryFind; + +import org.jclouds.collect.IterableWithMarker; +import org.jclouds.collect.PagedIterable; +import org.jclouds.collect.PagedIterables; +import org.jclouds.googlecomputeengine.domain.ListPage; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.InvocationContext; +import org.jclouds.rest.internal.GeneratedHttpRequest; + +import com.google.common.annotations.Beta; +import com.google.common.base.Function; +import com.google.common.base.Optional; + +/** + * @author Adrian Cole + * @author Andrew Bayer + */ +@Beta +public abstract class BaseWithZoneToPagedIterable> implements + Function, PagedIterable>, InvocationContext { + + private GeneratedHttpRequest request; + + @Override + public PagedIterable apply(ListPage input) { + if (input.nextMarker() == null) + return PagedIterables.of(input); + + Optional project = tryFind(request.getCaller().get().getArgs(), instanceOf(String.class)); + + Optional zone = tryFind(request.getCaller().get().getArgs(), instanceOf(String.class)); + + Optional listOptions = tryFind(request.getInvocation().getArgs(), instanceOf(ListOptions.class)); + + assert project.isPresent() : String.format("programming error, method %s should have a string param for the " + + "project", request.getCaller().get().getInvokable()); + + assert zone.isPresent() : String.format("programming error, method %s should have a string param for the " + + "zone", request.getCaller().get().getInvokable()); + + return PagedIterables.advance( + input, fetchNextPage(project.get().toString(), zone.get().toString(), (ListOptions) listOptions.orNull())); + } + + protected abstract Function> fetchNextPage(String projectName, + String zoneName, + ListOptions listOptions); + + @SuppressWarnings("unchecked") + @Override + public I setContext(HttpRequest request) { + this.request = GeneratedHttpRequest.class.cast(request); + return (I) this; + } +} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/PATCH.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/PATCH.java index 70875bff4..04d913836 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/PATCH.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/PATCH.java @@ -16,12 +16,13 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import javax.ws.rs.HttpMethod; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.ws.rs.HttpMethod; + /** * Indicates that the annotated method responds to HTTP PATCH requests * diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseDisks.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseDisks.java index 18bb6ba41..13e19463a 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseDisks.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseDisks.java @@ -16,8 +16,11 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; +import javax.inject.Singleton; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.Disk; @@ -26,10 +29,8 @@ import org.jclouds.http.functions.ParseJson; import org.jclouds.json.Json; -import javax.inject.Inject; -import javax.inject.Singleton; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; /** * @author David Alves @@ -39,10 +40,11 @@ public class ParseDisks extends ParseJson> { @Inject public ParseDisks(Json json) { - super(json, new TypeLiteral>() {}); + super(json, new TypeLiteral>() { + }); } - public static class ToPagedIterable extends BaseToPagedIterable { + public static class ToPagedIterable extends BaseWithZoneToPagedIterable { private final GoogleComputeEngineApi api; @@ -53,12 +55,14 @@ protected ToPagedIterable(GoogleComputeEngineApi api) { @Override protected Function> fetchNextPage(final String projectName, + final String zoneName, final ListOptions options) { return new Function>() { @Override public IterableWithMarker apply(Object input) { - return api.getDiskApiForProject(projectName).listAtMarker(input.toString(), options); + return api.getDiskApiForProject(projectName) + .listAtMarkerInZone(zoneName, input.toString(), options); } }; } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseFirewalls.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseFirewalls.java index 6b977e490..41181ac32 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseFirewalls.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseFirewalls.java @@ -16,8 +16,10 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.Firewall; @@ -26,9 +28,8 @@ import org.jclouds.http.functions.ParseJson; import org.jclouds.json.Json; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; /** * @author David Alves @@ -37,7 +38,8 @@ public class ParseFirewalls extends ParseJson> { @Inject public ParseFirewalls(Json json) { - super(json, new TypeLiteral>() {}); + super(json, new TypeLiteral>() { + }); } public static class ToPagedIterable extends BaseToPagedIterable { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseOperations.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseGlobalOperations.java similarity index 87% rename from google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseOperations.java rename to google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseGlobalOperations.java index 3749a2f92..bee5c2814 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseOperations.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseGlobalOperations.java @@ -16,8 +16,10 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.ListPage; @@ -26,18 +28,18 @@ import org.jclouds.http.functions.ParseJson; import org.jclouds.json.Json; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; /** * @author David Alves */ -public class ParseOperations extends ParseJson> { +public class ParseGlobalOperations extends ParseJson> { @Inject - public ParseOperations(Json json) { - super(json, new TypeLiteral>() {}); + public ParseGlobalOperations(Json json) { + super(json, new TypeLiteral>() { + }); } public static class ToPagedIterable extends BaseToPagedIterable { @@ -56,7 +58,7 @@ protected Function> fetchNextPage(final St @Override public IterableWithMarker apply(Object input) { - return api.getOperationApiForProject(projectName).listAtMarker(input.toString(), options); + return api.getGlobalOperationApiForProject(projectName).listAtMarker(input.toString(), options); } }; } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseImages.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseImages.java index 75bbb3372..df2863117 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseImages.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseImages.java @@ -16,8 +16,10 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.Image; @@ -26,9 +28,8 @@ import org.jclouds.http.functions.ParseJson; import org.jclouds.json.Json; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; /** * @author David Alves @@ -37,7 +38,8 @@ public class ParseImages extends ParseJson> { @Inject public ParseImages(Json json) { - super(json, new TypeLiteral>() {}); + super(json, new TypeLiteral>() { + }); } public static class ToPagedIterable extends BaseToPagedIterable { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseInstances.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseInstances.java index 638d9165d..b063e8094 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseInstances.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseInstances.java @@ -16,8 +16,10 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.Instance; @@ -26,9 +28,8 @@ import org.jclouds.http.functions.ParseJson; import org.jclouds.json.Json; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; /** * @author David Alves @@ -37,10 +38,11 @@ public class ParseInstances extends ParseJson> { @Inject public ParseInstances(Json json) { - super(json, new TypeLiteral>() {}); + super(json, new TypeLiteral>() { + }); } - public static class ToPagedIterable extends BaseToPagedIterable { + public static class ToPagedIterable extends BaseWithZoneToPagedIterable { private final GoogleComputeEngineApi api; @@ -50,13 +52,15 @@ protected ToPagedIterable(GoogleComputeEngineApi api) { } @Override - protected Function> fetchNextPage(final String projectName, + protected Function> fetchNextPage(final String project, + final String zone, final ListOptions options) { return new Function>() { @Override public IterableWithMarker apply(Object input) { - return api.getInstanceApiForProject(projectName).listAtMarker(input.toString(), options); + return api.getInstanceApiForProject(project) + .listAtMarkerInZone(zone, input.toString(), options); } }; } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseKernels.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseKernels.java index 9f181a4a4..121677f50 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseKernels.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseKernels.java @@ -16,8 +16,10 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.Kernel; @@ -26,9 +28,8 @@ import org.jclouds.http.functions.ParseJson; import org.jclouds.json.Json; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; /** * @author David Alves @@ -37,7 +38,8 @@ public class ParseKernels extends ParseJson> { @Inject public ParseKernels(Json json) { - super(json, new TypeLiteral>() {}); + super(json, new TypeLiteral>() { + }); } public static class ToPagedIterable extends BaseToPagedIterable { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseMachineTypes.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseMachineTypes.java index 3db15192a..e18b5c4df 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseMachineTypes.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseMachineTypes.java @@ -16,8 +16,10 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.ListPage; @@ -26,9 +28,8 @@ import org.jclouds.http.functions.ParseJson; import org.jclouds.json.Json; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; /** * @author David Alves @@ -40,7 +41,7 @@ public ParseMachineTypes(Json json) { super(json, new TypeLiteral>() {}); } - public static class ToPagedIterable extends BaseToPagedIterable { + public static class ToPagedIterable extends BaseWithZoneToPagedIterable { private final GoogleComputeEngineApi api; @@ -50,13 +51,15 @@ protected ToPagedIterable(GoogleComputeEngineApi api) { } @Override - protected Function> fetchNextPage(final String projectName, + protected Function> fetchNextPage(final String project, + final String zone, final ListOptions options) { return new Function>() { @Override public IterableWithMarker apply(Object input) { - return api.getMachineTypeApiForProject(projectName).listAtMarker(input.toString(), options); + return api.getMachineTypeApiForProject(project) + .listAtMarkerInZone(zone, input.toString(), options); } }; } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseNetworks.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseNetworks.java index 195e16268..aad984bcb 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseNetworks.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseNetworks.java @@ -16,8 +16,10 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.ListPage; @@ -26,9 +28,8 @@ import org.jclouds.http.functions.ParseJson; import org.jclouds.json.Json; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; /** * @author David Alves @@ -37,7 +38,8 @@ public class ParseNetworks extends ParseJson> { @Inject public ParseNetworks(Json json) { - super(json, new TypeLiteral>() {}); + super(json, new TypeLiteral>() { + }); } public static class ToPagedIterable extends BaseToPagedIterable { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZoneOperations.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZoneOperations.java new file mode 100644 index 000000000..11431af19 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZoneOperations.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.functions.internal; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; + +import org.jclouds.collect.IterableWithMarker; +import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.domain.ListPage; +import org.jclouds.googlecomputeengine.domain.Operation; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.jclouds.http.functions.ParseJson; +import org.jclouds.json.Json; + +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; + +/** + * @author David Alves + */ +public class ParseZoneOperations extends ParseJson> { + + @Inject + public ParseZoneOperations(Json json) { + super(json, new TypeLiteral>() { + }); + } + + public static class ToPagedIterable extends BaseWithZoneToPagedIterable { + + private final GoogleComputeEngineApi api; + + @Inject + protected ToPagedIterable(GoogleComputeEngineApi api) { + this.api = checkNotNull(api, "api"); + } + + @Override + protected Function> fetchNextPage(final String projectName, + final String zoneName, + final ListOptions options) { + return new Function>() { + + @Override + public IterableWithMarker apply(Object input) { + return api.getZoneOperationApiForProject(projectName) + .listAtMarkerInZone(zoneName, input.toString(), options); + } + }; + } + } +} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZones.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZones.java index dd640bdf8..76aa158a4 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZones.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/functions/internal/ParseZones.java @@ -16,8 +16,10 @@ */ package org.jclouds.googlecomputeengine.functions.internal; -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.inject.Inject; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.domain.ListPage; @@ -26,9 +28,8 @@ import org.jclouds.http.functions.ParseJson; import org.jclouds.json.Json; -import javax.inject.Inject; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; +import com.google.inject.TypeLiteral; /** * @author David Alves @@ -37,7 +38,8 @@ public class ParseZones extends ParseJson> { @Inject public ParseZones(Json json) { - super(json, new TypeLiteral>() {}); + super(json, new TypeLiteral>() { + }); } public static class ToPagedIterable extends BaseToPagedIterable { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/FirewallBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/FirewallBinder.java index da5310485..6c3b8b870 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/FirewallBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/FirewallBinder.java @@ -16,16 +16,17 @@ */ package org.jclouds.googlecomputeengine.handlers; -import org.jclouds.googlecomputeengine.options.FirewallOptions; -import org.jclouds.http.HttpRequest; -import org.jclouds.rest.MapBinder; -import org.jclouds.rest.binders.BindToJsonPayload; +import static com.google.common.base.Preconditions.checkNotNull; -import javax.inject.Inject; import java.net.URI; import java.util.Map; -import static com.google.common.base.Preconditions.checkNotNull; +import javax.inject.Inject; + +import org.jclouds.googlecomputeengine.options.FirewallOptions; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; +import org.jclouds.rest.binders.BindToJsonPayload; /** * @author David Alves diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandler.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandler.java index ed2dc2f94..4324c0178 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandler.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandler.java @@ -16,6 +16,10 @@ */ package org.jclouds.googlecomputeengine.handlers; +import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream; + +import javax.inject.Singleton; + import org.jclouds.http.HttpCommand; import org.jclouds.http.HttpErrorHandler; import org.jclouds.http.HttpResponse; @@ -23,10 +27,6 @@ import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ResourceNotFoundException; -import javax.inject.Singleton; - -import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream; - /** * This will parse and set an appropriate exception on the command object. * diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/InstanceBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/InstanceBinder.java index ae73d9c5b..c22196956 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/InstanceBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/InstanceBinder.java @@ -16,18 +16,20 @@ */ package org.jclouds.googlecomputeengine.handlers; -import com.google.common.base.Function; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Named; + import org.jclouds.googlecomputeengine.domain.InstanceTemplate; import org.jclouds.http.HttpRequest; import org.jclouds.rest.MapBinder; import org.jclouds.rest.binders.BindToJsonPayload; -import javax.inject.Inject; -import javax.inject.Named; -import java.net.URI; -import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Function; /** * @author David Alves @@ -38,13 +40,9 @@ public class InstanceBinder implements MapBinder { private BindToJsonPayload jsonBinder; @Inject - @Named("machineTypes") + @Named("machineTypeToURI") Function machineTypesToURI; - @Inject - @Named("zones") - Function zonesToURI; - /** * {@inheritDoc} */ @@ -52,12 +50,10 @@ public class InstanceBinder implements MapBinder { public R bindToRequest(R request, Map postParams) { InstanceTemplate template = (InstanceTemplate) checkNotNull(postParams.get("template"), "template"); template.name(checkNotNull(postParams.get("name"), "name").toString()); - template.zone(zonesToURI.apply((String) checkNotNull(postParams.get("zone"), "zone"))); if (template.getMachineTypeName() != null) { template.machineType(machineTypesToURI.apply(template.getMachineTypeName())); } - template.zone((String) null); template.machineType((String) null); return bindToRequest(request, template); } diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java index f741d08ae..02300885e 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/handlers/MetadataBinder.java @@ -16,16 +16,17 @@ */ package org.jclouds.googlecomputeengine.handlers; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Map; + +import javax.inject.Inject; + import org.jclouds.googlecomputeengine.config.GoogleComputeEngineParserModule; import org.jclouds.http.HttpRequest; import org.jclouds.rest.Binder; import org.jclouds.rest.binders.BindToJsonPayload; -import javax.inject.Inject; -import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; - /** * @author David Alves */ diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/AttachDiskOptions.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/AttachDiskOptions.java new file mode 100644 index 000000000..fd0144856 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/AttachDiskOptions.java @@ -0,0 +1,113 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.options; + +import java.net.URI; + +/** + * Options for attaching disks to instances. + * + * @author Andrew Bayer + * @see + */ +public class AttachDiskOptions { + + public enum DiskType { + SCRATCH, + PERSISTENT + } + + public enum DiskMode { + READ_WRITE, + READ_ONLY + } + + private DiskType type; + private DiskMode mode; + private URI source; + private String deviceName; + + /** + * The disk type + * + * @return the disk type. + */ + public DiskType getType() { + return type; + } + + /** + * The disk mode + * + * @return the disk mode + */ + public DiskMode getMode() { + return mode; + } + + /** + * The URI of the source disk - optional, if DiskType.SCRATCH is used. + * + * @return the URI + */ + public URI getSource() { + return source; + } + + /** + * The device name on the instance - optional. + * + * @return the device name + */ + public String getDeviceName() { + return deviceName; + } + + + /** + * @see AttachDiskOptions#getType() + */ + public AttachDiskOptions type(DiskType type) { + this.type = type; + return this; + } + + /** + * @see AttachDiskOptions#getMode() + */ + public AttachDiskOptions mode(DiskMode mode) { + this.mode = mode; + return this; + } + + /** + * @see AttachDiskOptions#getSource() + */ + public AttachDiskOptions source(URI source) { + this.source = source; + return this; + } + + /** + * @see AttachDiskOptions#getDeviceName() + */ + public AttachDiskOptions deviceName(String deviceName) { + this.deviceName = deviceName; + return this; + } + +} diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/FirewallOptions.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/FirewallOptions.java index cf1c02216..6c049e25b 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/FirewallOptions.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/FirewallOptions.java @@ -16,17 +16,18 @@ */ package org.jclouds.googlecomputeengine.options; -import com.google.common.collect.ImmutableSet; -import org.jclouds.googlecomputeengine.domain.Firewall; - import java.net.URI; import java.util.Set; +import org.jclouds.googlecomputeengine.domain.Firewall; + +import com.google.common.collect.ImmutableSet; + /** * Options to create a firewall. * - * @see Firewall * @author David Alves + * @see Firewall */ public class FirewallOptions { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java index 81330ac8f..2f79f0f1a 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java @@ -16,15 +16,15 @@ */ package org.jclouds.googlecomputeengine.options; -import org.jclouds.http.options.BaseHttpRequestOptions; - import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.http.options.BaseHttpRequestOptions; + /** * Allows to optionally specify a filter, max results and a page token for listFirstPage() REST methods. * * @author David Alves - * @see + * @see */ public class ListOptions extends BaseHttpRequestOptions { @@ -65,7 +65,7 @@ public ListOptions filter(String filter) { } /** - * Sets Maximum count of results to be returned. Maximum and default value is 100. Acceptable values are 0 to + * Sets Maximum count of results to be returned. Maximum and default value is 100. Acceptable items are 0 to * 100, inclusive. (Default: 100) */ public ListOptions maxResults(Integer maxResults) { diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/OperationDonePredicate.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/GlobalOperationDonePredicate.java similarity index 82% rename from google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/OperationDonePredicate.java rename to google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/GlobalOperationDonePredicate.java index b58fe6184..abd2b4c02 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/OperationDonePredicate.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/GlobalOperationDonePredicate.java @@ -16,29 +16,30 @@ */ package org.jclouds.googlecomputeengine.predicates; -import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.inject.Inject; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.concurrent.atomic.AtomicReference; + import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.config.UserProject; import org.jclouds.googlecomputeengine.domain.Operation; -import java.util.concurrent.atomic.AtomicReference; - -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.inject.Inject; /** - * Tests that an Operation is done, returning the completed Operation when it is. + * Tests that a Global Operation is done, returning the completed Operation when it is. * * @author David Alves */ -public class OperationDonePredicate implements Predicate> { +public class GlobalOperationDonePredicate implements Predicate> { private final GoogleComputeEngineApi api; private final Supplier project; @Inject - OperationDonePredicate(GoogleComputeEngineApi api, @UserProject Supplier project) { + GlobalOperationDonePredicate(GoogleComputeEngineApi api, @UserProject Supplier project) { this.api = api; this.project = project; } @@ -46,7 +47,7 @@ public class OperationDonePredicate implements Predicate input) { checkNotNull(input, "input"); - Operation current = api.getOperationApiForProject(project.get()).get(input.get().getName()); + Operation current = api.getGlobalOperationApiForProject(project.get()).get(input.get().getName()); switch (current.getStatus()) { case DONE: input.set(current); diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/ZoneOperationDonePredicate.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/ZoneOperationDonePredicate.java new file mode 100644 index 000000000..7224785bd --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/predicates/ZoneOperationDonePredicate.java @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.predicates; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import org.jclouds.collect.Memoized; +import org.jclouds.domain.Location; +import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.config.UserProject; +import org.jclouds.googlecomputeengine.domain.Operation; + +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.inject.Inject; + +/** + * Tests that a Zone Operation is done, returning the completed Operation when it is. + * + * @author David Alves + */ +public class ZoneOperationDonePredicate implements Predicate> { + + private final GoogleComputeEngineApi api; + private final Supplier project; + private final Supplier> zones; + + @Inject + ZoneOperationDonePredicate(GoogleComputeEngineApi api, @UserProject Supplier project, + @Memoized Supplier> zones) { + this.api = api; + this.project = project; + this.zones = zones; + } + + @Override + public boolean apply(AtomicReference input) { + checkNotNull(input, "input"); + Operation current = api.getZoneOperationApiForProject(project.get()) + .getInZone(zones.get().get(input.get().getZone().get()).getId(), + input.get().getName()); + + switch (current.getStatus()) { + case DONE: + input.set(current); + return true; + case PENDING: + case RUNNING: + default: + return false; + } + } +} diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadataTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadataTest.java index 38a79e441..44994c069 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadataTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadataTest.java @@ -16,12 +16,13 @@ */ package org.jclouds.googlecomputeengine; -import com.google.common.collect.ImmutableSet; -import com.google.common.reflect.TypeToken; import org.jclouds.View; import org.jclouds.apis.internal.BaseApiMetadataTest; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; +import com.google.common.reflect.TypeToken; + /** * Tests that GoogleComputeApiMetadata is properly registered in ServiceLoader *

diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/PageSystemExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/PageSystemExpectTest.java index a77b058b1..c9d9c7063 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/PageSystemExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/PageSystemExpectTest.java @@ -16,6 +16,9 @@ */ package org.jclouds.googlecomputeengine; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.testng.Assert.assertSame; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.domain.Image; @@ -26,9 +29,6 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; -import static org.testng.Assert.assertSame; - /** * A test specifically for the paging system. The code used is common to all list() methods so we're using Images * but it could be anything else. @@ -43,7 +43,7 @@ public void testGetSinglePage() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/images") + ".com/compute/v1beta15/projects/myproject/global/images") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -66,7 +66,7 @@ public void testGetMultiplePages() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/images?maxResults=3") + ".com/compute/v1beta15/projects/myproject/global/images?maxResults=3") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -74,7 +74,7 @@ public void testGetMultiplePages() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/images?pageToken" + + ".com/compute/v1beta15/projects/myproject/global/images?pageToken" + "=CgVJTUFHRRIbZ29vZ2xlLmNlbnRvcy02LTItdjIwMTIwNjIx&maxResults=3") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -83,7 +83,7 @@ public void testGetMultiplePages() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/images?pageToken" + + ".com/compute/v1beta15/projects/myproject/global/images?pageToken" + "=CgVJTUFHRRIbZ29vZ2xlLmdjZWwtMTAtMDQtdjIwMTIxMTA2&maxResults=3") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java index 91e37abcc..ef88eb8f7 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceExpectTest.java @@ -16,47 +16,62 @@ */ package org.jclouds.googlecomputeengine.compute; -import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import org.jclouds.compute.ComputeService; -import org.jclouds.compute.RunNodesException; -import org.jclouds.compute.domain.Template; -import org.jclouds.domain.Location; -import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions; -import org.jclouds.googlecomputeengine.domain.Instance; -import org.jclouds.googlecomputeengine.features.InstanceApiExpectTest; -import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineServiceExpectTest; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpResponse; -import org.jclouds.util.Strings2; -import org.testng.annotations.Test; - -import javax.ws.rs.core.MediaType; -import java.io.IOException; -import java.util.List; -import java.util.Properties; -import java.util.Set; - import static com.google.common.collect.Iterables.getOnlyElement; import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; import static org.jclouds.googlecomputeengine.features.FirewallApiExpectTest.GET_FIREWALL_REQUEST; +import static org.jclouds.googlecomputeengine.features.GlobalOperationApiExpectTest.GET_GLOBAL_OPERATION_REQUEST; +import static org.jclouds.googlecomputeengine.features.GlobalOperationApiExpectTest.GET_GLOBAL_OPERATION_RESPONSE; +import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_GOOGLE_IMAGES_REQUEST; +import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_GOOGLE_IMAGES_RESPONSE; import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_PROJECT_IMAGES_REQUEST; import static org.jclouds.googlecomputeengine.features.ImageApiExpectTest.LIST_PROJECT_IMAGES_RESPONSE; +import static org.jclouds.googlecomputeengine.features.InstanceApiExpectTest.LIST_CENTRAL1B_INSTANCES_REQUEST; +import static org.jclouds.googlecomputeengine.features.InstanceApiExpectTest.LIST_CENTRAL1B_INSTANCES_RESPONSE; import static org.jclouds.googlecomputeengine.features.InstanceApiExpectTest.LIST_INSTANCES_REQUEST; import static org.jclouds.googlecomputeengine.features.InstanceApiExpectTest.LIST_INSTANCES_RESPONSE; +import static org.jclouds.googlecomputeengine.features.MachineTypeApiExpectTest.LIST_CENTRAL1B_MACHINE_TYPES_REQUEST; +import static org.jclouds.googlecomputeengine.features.MachineTypeApiExpectTest.LIST_CENTRAL1B_MACHINE_TYPES_RESPONSE; import static org.jclouds.googlecomputeengine.features.MachineTypeApiExpectTest.LIST_MACHINE_TYPES_REQUEST; import static org.jclouds.googlecomputeengine.features.MachineTypeApiExpectTest.LIST_MACHINE_TYPES_RESPONSE; import static org.jclouds.googlecomputeengine.features.NetworkApiExpectTest.GET_NETWORK_REQUEST; -import static org.jclouds.googlecomputeengine.features.OperationApiExpectTest.GET_OPERATION_REQUEST; -import static org.jclouds.googlecomputeengine.features.OperationApiExpectTest.GET_OPERATION_RESPONSE; +import static org.jclouds.googlecomputeengine.features.ProjectApiExpectTest.GET_PROJECT_REQUEST; +import static org.jclouds.googlecomputeengine.features.ProjectApiExpectTest.GET_PROJECT_RESPONSE; import static org.jclouds.googlecomputeengine.features.ZoneApiExpectTest.LIST_ZONES_REQ; import static org.jclouds.googlecomputeengine.features.ZoneApiExpectTest.LIST_ZONES_RESPONSE; +import static org.jclouds.googlecomputeengine.features.ZoneApiExpectTest.LIST_ZONES_SHORT_RESPONSE; +import static org.jclouds.googlecomputeengine.features.ZoneOperationApiExpectTest.GET_ZONE_OPERATION_REQUEST; +import static org.jclouds.googlecomputeengine.features.ZoneOperationApiExpectTest.GET_ZONE_OPERATION_RESPONSE; import static org.jclouds.util.Strings2.toStringAndClose; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; +import java.io.IOException; +import java.util.List; +import java.util.Properties; +import java.util.Set; + +import javax.ws.rs.core.MediaType; + +import org.jclouds.compute.ComputeService; +import org.jclouds.compute.RunNodesException; +import org.jclouds.compute.domain.Hardware; +import org.jclouds.compute.domain.Template; +import org.jclouds.domain.Location; +import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions; +import org.jclouds.googlecomputeengine.domain.Instance; +import org.jclouds.googlecomputeengine.features.InstanceApiExpectTest; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineServiceExpectTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.util.Strings2; +import org.testng.annotations.Test; + +import com.google.common.base.Throwables; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; + /** * @author David Alves @@ -64,20 +79,11 @@ @Test(groups = "unit") public class GoogleComputeEngineServiceExpectTest extends BaseGoogleComputeEngineServiceExpectTest { - public static final HttpRequest LIST_GOOGLE_IMAGES_REQUEST = HttpRequest - .builder() - .method("GET") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/google/images") - .addHeader("Accept", "application/json") - .addHeader("Authorization", "Bearer " + TOKEN).build(); - - public static final HttpResponse LIST_GOOGLE_IMAGES_RESPONSE = HttpResponse.builder().statusCode(200) - .payload(staticPayloadFromResource("/image_list_single_page.json")).build(); private HttpRequest INSERT_NETWORK_REQUEST = HttpRequest .builder() .method("POST") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(payloadFromStringWithContentType("{\"name\":\"jclouds-test\",\"IPv4Range\":\"10.0.0.0/8\"}", @@ -87,11 +93,11 @@ public class GoogleComputeEngineServiceExpectTest extends BaseGoogleComputeEngin private HttpRequest INSERT_FIREWALL_REQUEST = HttpRequest .builder() .method("POST") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/firewalls") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/firewalls") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(payloadFromStringWithContentType("{\"name\":\"jclouds-test\",\"network\":\"https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/jclouds-test\"," + + ".com/compute/v1beta15/projects/myproject/global/networks/jclouds-test\"," + "\"sourceRanges\":[\"10.0.0.0/8\",\"0.0.0.0/0\"],\"allowed\":[{\"IPProtocol\":\"tcp\"," + "\"ports\":[\"22\"]}," + "{\"IPProtocol\":\"udp\",\"ports\":[\"22\"]}]}", @@ -104,7 +110,7 @@ public class GoogleComputeEngineServiceExpectTest extends BaseGoogleComputeEngin " \"id\": \"13024414170909937976\",\n" + " \"creationTimestamp\": \"2012-10-24T20:13:19.967\",\n" + " \"selfLink\": \"https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/jclouds-test\",\n" + + ".com/compute/v1beta15/projects/myproject/global/networks/jclouds-test\",\n" + " \"name\": \"jclouds-test\",\n" + " \"description\": \"test network\",\n" + " \"IPv4Range\": \"10.0.0.0/8\",\n" + @@ -114,6 +120,17 @@ public class GoogleComputeEngineServiceExpectTest extends BaseGoogleComputeEngin private HttpResponse SUCESSFULL_OPERATION_RESPONSE = HttpResponse.builder().statusCode(200) .payload(payloadFromResource("/operation.json")).build(); + private HttpRequest SET_TAGS_REQUEST = HttpRequest.builder() + .method("POST") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/test-1/setTags") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN) + .payload(payloadFromStringWithContentType("{\"items\":[\"aTag\"],\"fingerprint\":\"abcd\"}", + MediaType.APPLICATION_JSON)) + .build(); + + private HttpResponse SET_TAGS_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/operation.json")).build(); private HttpResponse getInstanceResponseForInstanceAndNetworkAndStatus(String instanceName, String networkName, String status) throws @@ -149,19 +166,17 @@ private HttpRequest createInstanceRequestForInstance(String instanceName, String return HttpRequest .builder() .method("POST") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/instances") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(payloadFromStringWithContentType("{\"name\":\"" + instanceName + "\"," + "\"machineType\":\"https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1\"," + - "\"zone\":\"https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/zones/us-central1-a\"," + + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1\"," + "\"image\":\"https://www.googleapis" + - ".com/compute/v1beta13/projects/google/images/gcel-12-04-v20121106\"," + - "\"tags\":[],\"serviceAccounts\":[]," + + ".com/compute/v1beta15/projects/google/global/images/gcel-12-04-v20121106\"," + + "\"serviceAccounts\":[]," + "\"networkInterfaces\":[{\"network\":\"https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/" + networkName + "\"," + + ".com/compute/v1beta15/projects/myproject/global/networks/" + networkName + "\"," + "\"accessConfigs\":[{\"type\":\"ONE_TO_ONE_NAT\"}]}]," + "\"metadata\":{\"kind\":\"compute#metadata\",\"items\":[{\"key\":\"sshKeys\"," + "\"value\":\"jclouds:" + @@ -174,7 +189,7 @@ private HttpRequest getInstanceRequestForInstance(String instanceName) { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/instances/" + instanceName) + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/" + instanceName) .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); } @@ -211,15 +226,29 @@ public void testTemplateMatch() throws Exception { ImmutableMap requestResponseMap = ImmutableMap. builder() .put(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE) + .put(GET_PROJECT_REQUEST, GET_PROJECT_RESPONSE) .put(LIST_ZONES_REQ, LIST_ZONES_RESPONSE) .put(LIST_PROJECT_IMAGES_REQUEST, LIST_PROJECT_IMAGES_RESPONSE) .put(LIST_GOOGLE_IMAGES_REQUEST, LIST_GOOGLE_IMAGES_RESPONSE) .put(LIST_MACHINE_TYPES_REQUEST, LIST_MACHINE_TYPES_RESPONSE) + .put(LIST_CENTRAL1B_MACHINE_TYPES_REQUEST, LIST_CENTRAL1B_MACHINE_TYPES_RESPONSE) .build(); ComputeService client = requestsSendResponses(requestResponseMap); Template template = client.templateBuilder().build(); - Template toMatch = client.templateBuilder().imageId(template.getImage().getId()).build(); + Hardware defaultSize = client.templateBuilder().build().getHardware(); + + Hardware smallest = client.templateBuilder().smallest().build().getHardware(); + assertEquals(defaultSize, smallest); + + Hardware fastest = client.templateBuilder().fastest().build().getHardware(); + assertNotNull(fastest); + + assertEquals(client.listHardwareProfiles().size(), 5); + + Template toMatch = client.templateBuilder() + .imageId(template.getImage().getId()) + .build(); assertEquals(toMatch.getImage(), template.getImage()); } @@ -229,26 +258,27 @@ public void testNetworksAndFirewallDeletedWhenAllGroupNodesAreTerminated() throw HttpRequest deleteNodeRequest = HttpRequest.builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/instances/test-delete-networks") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/test-delete-networks") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); HttpRequest deleteFirewallRequest = HttpRequest.builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/firewalls/jclouds-test-delete") + ".com/compute/v1beta15/projects/myproject/global/firewalls/jclouds-test-delete") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); HttpRequest deleteNetworkReqquest = HttpRequest.builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/jclouds-test-delete") + ".com/compute/v1beta15/projects/myproject/global/networks/jclouds-test-delete") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); List orderedRequests = ImmutableList.builder() .add(requestForScopes(COMPUTE_READONLY_SCOPE)) + .add(GET_PROJECT_REQUEST) .add(getInstanceRequestForInstance("test-delete-networks")) .add(LIST_PROJECT_IMAGES_REQUEST) .add(LIST_GOOGLE_IMAGES_REQUEST) @@ -256,56 +286,41 @@ public void testNetworksAndFirewallDeletedWhenAllGroupNodesAreTerminated() throw .add(LIST_MACHINE_TYPES_REQUEST) .add(requestForScopes(COMPUTE_SCOPE)) .add(deleteNodeRequest) - .add(GET_OPERATION_REQUEST) + .add(GET_ZONE_OPERATION_REQUEST) .add(getInstanceRequestForInstance("test-delete-networks")) - .add(LIST_PROJECT_IMAGES_REQUEST) - .add(LIST_GOOGLE_IMAGES_REQUEST) - .add(LIST_ZONES_REQ) - .add(LIST_MACHINE_TYPES_REQUEST) .add(LIST_INSTANCES_REQUEST) - .add(LIST_PROJECT_IMAGES_REQUEST) - .add(LIST_GOOGLE_IMAGES_REQUEST) - .add(LIST_ZONES_REQ) - .add(LIST_MACHINE_TYPES_REQUEST) .add(deleteFirewallRequest) - .add(GET_OPERATION_REQUEST) + .add(GET_GLOBAL_OPERATION_REQUEST) .add(deleteNetworkReqquest) - .add(GET_OPERATION_REQUEST) + .add(GET_GLOBAL_OPERATION_REQUEST) .build(); List orderedResponses = ImmutableList.builder() .add(TOKEN_RESPONSE) + .add(GET_PROJECT_RESPONSE) .add(getInstanceResponseForInstanceAndNetworkAndStatus("test-delete-networks", "test-network", Instance .Status.RUNNING.name())) .add(LIST_PROJECT_IMAGES_RESPONSE) .add(LIST_GOOGLE_IMAGES_RESPONSE) - .add(LIST_ZONES_RESPONSE) + .add(LIST_ZONES_SHORT_RESPONSE) .add(LIST_MACHINE_TYPES_RESPONSE) .add(TOKEN_RESPONSE) .add(SUCESSFULL_OPERATION_RESPONSE) - .add(GET_OPERATION_RESPONSE) + .add(GET_ZONE_OPERATION_RESPONSE) .add(getInstanceResponseForInstanceAndNetworkAndStatus("test-delete-networks", "test-network", Instance .Status.TERMINATED.name())) - .add(LIST_PROJECT_IMAGES_RESPONSE) - .add(LIST_GOOGLE_IMAGES_RESPONSE) - .add(LIST_ZONES_RESPONSE) - .add(LIST_MACHINE_TYPES_RESPONSE) .add(getListInstancesResponseForSingleInstanceAndNetworkAndStatus("test-delete-networks", "test-network", Instance .Status.TERMINATED.name())) - .add(LIST_PROJECT_IMAGES_RESPONSE) - .add(LIST_GOOGLE_IMAGES_RESPONSE) - .add(LIST_ZONES_RESPONSE) - .add(LIST_MACHINE_TYPES_RESPONSE) .add(SUCESSFULL_OPERATION_RESPONSE) - .add(GET_OPERATION_RESPONSE) + .add(GET_GLOBAL_OPERATION_RESPONSE) .add(SUCESSFULL_OPERATION_RESPONSE) - .add(GET_OPERATION_RESPONSE) + .add(GET_GLOBAL_OPERATION_RESPONSE) .build(); ComputeService client = orderedRequestsSendResponses(orderedRequests, orderedResponses); - client.destroyNode("test-delete-networks"); + client.destroyNode("us-central1-a/test-delete-networks"); } @@ -314,11 +329,14 @@ public void testListLocationsWhenResponseIs2xx() throws Exception { ImmutableMap requestResponseMap = ImmutableMap. builder() .put(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE) + .put(GET_PROJECT_REQUEST, GET_PROJECT_RESPONSE) .put(LIST_ZONES_REQ, LIST_ZONES_RESPONSE) .put(LIST_INSTANCES_REQUEST, LIST_INSTANCES_RESPONSE) + .put(LIST_CENTRAL1B_INSTANCES_REQUEST, LIST_CENTRAL1B_INSTANCES_RESPONSE) .put(LIST_PROJECT_IMAGES_REQUEST, LIST_PROJECT_IMAGES_RESPONSE) .put(LIST_GOOGLE_IMAGES_REQUEST, LIST_GOOGLE_IMAGES_RESPONSE) .put(LIST_MACHINE_TYPES_REQUEST, LIST_MACHINE_TYPES_RESPONSE) + .put(LIST_CENTRAL1B_MACHINE_TYPES_REQUEST, LIST_CENTRAL1B_MACHINE_TYPES_RESPONSE) .build(); ComputeService apiWhenServersExist = requestsSendResponses(requestResponseMap); @@ -331,7 +349,7 @@ public void testListLocationsWhenResponseIs2xx() throws Exception { assertNotNull(apiWhenServersExist.listNodes()); assertEquals(apiWhenServersExist.listNodes().size(), 1); - assertEquals(apiWhenServersExist.listNodes().iterator().next().getId(), "test-0"); + assertEquals(apiWhenServersExist.listNodes().iterator().next().getId(), "us-central1-a/test-0"); assertEquals(apiWhenServersExist.listNodes().iterator().next().getName(), "test-0"); } @@ -347,65 +365,65 @@ public void testCreateNodeWhenNetworkNorFirewallExistDoesNotExist() throws RunNo List orderedRequests = ImmutableList.builder() .add(requestForScopes(COMPUTE_READONLY_SCOPE)) + .add(GET_PROJECT_REQUEST) .add(LIST_ZONES_REQ) .add(LIST_PROJECT_IMAGES_REQUEST) .add(LIST_GOOGLE_IMAGES_REQUEST) + .add(LIST_ZONES_REQ) .add(LIST_MACHINE_TYPES_REQUEST) .add(GET_NETWORK_REQUEST) .add(requestForScopes(COMPUTE_SCOPE)) .add(INSERT_NETWORK_REQUEST) - .add(GET_OPERATION_REQUEST) + .add(GET_GLOBAL_OPERATION_REQUEST) .add(GET_NETWORK_REQUEST) .add(GET_FIREWALL_REQUEST) .add(INSERT_FIREWALL_REQUEST) - .add(GET_OPERATION_REQUEST) + .add(GET_GLOBAL_OPERATION_REQUEST) .add(LIST_INSTANCES_REQUEST) .add(LIST_PROJECT_IMAGES_REQUEST) .add(LIST_GOOGLE_IMAGES_REQUEST) - .add(LIST_ZONES_REQ) .add(LIST_MACHINE_TYPES_REQUEST) .add(createInstanceRequestForInstance("test-1", "jclouds-test", openSshKey)) - .add(GET_OPERATION_REQUEST) + .add(GET_ZONE_OPERATION_REQUEST) + .add(getInstanceRequestForInstance("test-1")) + .add(SET_TAGS_REQUEST) + .add(GET_ZONE_OPERATION_REQUEST) .add(getInstanceRequestForInstance("test-1")) - .add(LIST_PROJECT_IMAGES_REQUEST) - .add(LIST_GOOGLE_IMAGES_REQUEST) - .add(LIST_ZONES_REQ) - .add(LIST_MACHINE_TYPES_REQUEST) .build(); List orderedResponses = ImmutableList.builder() .add(TOKEN_RESPONSE) - .add(LIST_ZONES_RESPONSE) + .add(GET_PROJECT_RESPONSE) + .add(LIST_ZONES_SHORT_RESPONSE) .add(LIST_PROJECT_IMAGES_RESPONSE) .add(LIST_GOOGLE_IMAGES_RESPONSE) + .add(LIST_ZONES_SHORT_RESPONSE) .add(LIST_MACHINE_TYPES_RESPONSE) .add(HttpResponse.builder().statusCode(404).build()) .add(TOKEN_RESPONSE) .add(SUCESSFULL_OPERATION_RESPONSE) - .add(GET_OPERATION_RESPONSE) + .add(GET_GLOBAL_OPERATION_RESPONSE) .add(GET_NETWORK_RESPONSE) .add(HttpResponse.builder().statusCode(404).build()) .add(SUCESSFULL_OPERATION_RESPONSE) - .add(GET_OPERATION_RESPONSE) + .add(GET_GLOBAL_OPERATION_RESPONSE) .add(LIST_INSTANCES_RESPONSE) .add(LIST_PROJECT_IMAGES_RESPONSE) .add(LIST_GOOGLE_IMAGES_RESPONSE) - .add(LIST_ZONES_RESPONSE) .add(LIST_MACHINE_TYPES_RESPONSE) .add(SUCESSFULL_OPERATION_RESPONSE) - .add(GET_OPERATION_RESPONSE) + .add(GET_ZONE_OPERATION_RESPONSE) + .add(getInstanceResponse) + .add(SET_TAGS_RESPONSE) + .add(GET_ZONE_OPERATION_RESPONSE) .add(getInstanceResponse) - .add(LIST_PROJECT_IMAGES_RESPONSE) - .add(LIST_GOOGLE_IMAGES_RESPONSE) - .add(LIST_ZONES_RESPONSE) - .add(LIST_MACHINE_TYPES_RESPONSE) .build(); ComputeService computeService = orderedRequestsSendResponses(orderedRequests, orderedResponses); GoogleComputeEngineTemplateOptions options = computeService.templateOptions().as(GoogleComputeEngineTemplateOptions.class); - + options.tags(ImmutableSet.of("aTag")); getOnlyElement(computeService.createNodesInGroup("test", 1, options)); } } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java index 2b7632249..fbcd35536 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java @@ -58,7 +58,7 @@ public void testReboot() throws Exception { @Test(enabled = true, dependsOnMethods = "testReboot") public void testSuspendResume() throws Exception { } - + @Test(enabled = true, dependsOnMethods = "testSuspendResume") public void testListNodesByIds() throws Exception { super.testGetNodesWithDetails(); @@ -76,7 +76,7 @@ public void testListNodes() throws Exception { super.testListNodes(); } - @Test(enabled = true, dependsOnMethods = { "testListNodes", "testGetNodesWithDetails", "testListNodesByIds" }) + @Test(enabled = true, dependsOnMethods = {"testListNodes", "testGetNodesWithDetails", "testListNodesByIds"}) @Override public void testDestroyNodes() { super.testDestroyNodes(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImageTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImageTest.java index f8301a282..1d1104ffc 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImageTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImageTest.java @@ -16,14 +16,14 @@ */ package org.jclouds.googlecomputeengine.compute.functions; -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.googlecomputeengine.domain.Image; -import org.testng.annotations.Test; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertSame; import java.net.URI; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertSame; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.googlecomputeengine.domain.Image; +import org.testng.annotations.Test; /** * @author David Alves diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodesTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodesTest.java index be998b683..40de63ed8 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodesTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/OrphanedGroupsFromDeadNodesTest.java @@ -16,10 +16,14 @@ */ package org.jclouds.googlecomputeengine.compute.functions; -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Sets; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.replay; +import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; + +import java.util.Set; + import org.easymock.EasyMock; import org.jclouds.compute.ComputeService; import org.jclouds.compute.domain.ComputeMetadata; @@ -28,13 +32,10 @@ import org.jclouds.googlecomputeengine.compute.predicates.AllNodesInGroupTerminated; import org.testng.annotations.Test; -import java.util.Set; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; /** * @author David Alves diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiExpectTest.java index 6429275e9..484bb840e 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiExpectTest.java @@ -16,6 +16,14 @@ */ package org.jclouds.googlecomputeengine.features; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertNull; + +import javax.ws.rs.core.MediaType; + import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; import org.jclouds.googlecomputeengine.parse.ParseDiskListTest; import org.jclouds.googlecomputeengine.parse.ParseDiskTest; @@ -24,15 +32,6 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import javax.ws.rs.core.MediaType; -import java.net.URI; - -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.AssertJUnit.assertNull; - /** * @author David Alves */ @@ -43,7 +42,7 @@ public void testGetDiskResponseIs2xx() throws Exception { HttpRequest get = HttpRequest .builder() .method("GET") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/disks/testimage1") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/testimage1") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -53,7 +52,7 @@ public void testGetDiskResponseIs2xx() throws Exception { DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, get, operationResponse).getDiskApiForProject("myproject"); - assertEquals(api.get("testimage1"), + assertEquals(api.getInZone("us-central1-a", "testimage1"), new ParseDiskTest().expected()); } @@ -61,7 +60,7 @@ public void testGetDiskResponseIs4xx() throws Exception { HttpRequest get = HttpRequest .builder() .method("GET") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/disks/testimage1") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/testimage1") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -70,29 +69,27 @@ public void testGetDiskResponseIs4xx() throws Exception { DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, get, operationResponse).getDiskApiForProject("myproject"); - assertNull(api.get("testimage1")); + assertNull(api.getInZone("us-central1-a", "testimage1")); } public void testInsertDiskResponseIs2xx() { HttpRequest insert = HttpRequest .builder() .method("POST") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/disks") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(payloadFromResourceWithContentType("/disk_insert.json", MediaType.APPLICATION_JSON)) .build(); HttpResponse insertDiskResponse = HttpResponse.builder().statusCode(200) - .payload(payloadFromResource("/operation.json")).build(); + .payload(payloadFromResource("/zone_operation.json")).build(); DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), TOKEN_RESPONSE, insert, insertDiskResponse).getDiskApiForProject("myproject"); - assertEquals(api.createInZone("testimage1", 1, URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/zones/us-central1-a")) - , new ParseOperationTest().expected()); + assertEquals(api.createInZone("testimage1", 1, "us-central1-a"), new ParseOperationTest().expected()); } public void testDeleteDiskResponseIs2xx() { @@ -100,17 +97,17 @@ public void testDeleteDiskResponseIs2xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/disks/testimage1") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/testimage1") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); HttpResponse deleteResponse = HttpResponse.builder().statusCode(200) - .payload(payloadFromResource("/operation.json")).build(); + .payload(payloadFromResource("/zone_operation.json")).build(); DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), TOKEN_RESPONSE, delete, deleteResponse).getDiskApiForProject("myproject"); - assertEquals(api.delete("testimage1"), + assertEquals(api.deleteInZone("us-central1-a", "testimage1"), new ParseOperationTest().expected()); } @@ -119,7 +116,7 @@ public void testDeleteDiskResponseIs4xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/disks/testimage1") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/testimage1") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -128,7 +125,7 @@ public void testDeleteDiskResponseIs4xx() { DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), TOKEN_RESPONSE, delete, deleteResponse).getDiskApiForProject("myproject"); - assertNull(api.delete("testimage1")); + assertNull(api.deleteInZone("us-central1-a", "testimage1")); } public void testListDisksResponseIs2xx() { @@ -136,7 +133,7 @@ public void testListDisksResponseIs2xx() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/disks") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -146,7 +143,7 @@ public void testListDisksResponseIs2xx() { DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, list, operationResponse).getDiskApiForProject("myproject"); - assertEquals(api.listFirstPage().toString(), + assertEquals(api.listFirstPageInZone("us-central1-a").toString(), new ParseDiskListTest().expected().toString()); } @@ -155,7 +152,7 @@ public void testListDisksResponseIs4xx() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/disks") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -164,6 +161,6 @@ public void testListDisksResponseIs4xx() { DiskApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, list, operationResponse).getDiskApiForProject("myproject"); - assertTrue(api.list().concat().isEmpty()); + assertTrue(api.listInZone("us-central1-a").concat().isEmpty()); } } 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 2b42cd719..5c3d19909 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 @@ -19,7 +19,6 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; -import java.net.URI; import java.util.List; import org.jclouds.collect.PagedIterable; @@ -38,9 +37,8 @@ public class DiskApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { private static final String DISK_NAME = "disk-api-live-test-disk"; - private static final int TIME_WAIT = 10; + private static final int TIME_WAIT = 30; - private URI zoneUrl; private int sizeGb = 1; private DiskApi api() { @@ -50,15 +48,14 @@ private DiskApi api() { @Test(groups = "live") public void testInsertDisk() { Project project = api.getProjectApi().get(userProject.get()); - zoneUrl = getDefaultZoneUrl(project.getName()); - assertOperationDoneSucessfully(api().createInZone(DISK_NAME, sizeGb, zoneUrl), TIME_WAIT); + assertZoneOperationDoneSucessfully(api().createInZone(DISK_NAME, sizeGb, DEFAULT_ZONE_NAME), TIME_WAIT); } @Test(groups = "live", dependsOnMethods = "testInsertDisk") public void testGetDisk() { - Disk disk = api().get(DISK_NAME); + Disk disk = api().getInZone(DEFAULT_ZONE_NAME, DISK_NAME); assertNotNull(disk); assertDiskEquals(disk); } @@ -66,7 +63,7 @@ public void testGetDisk() { @Test(groups = "live", dependsOnMethods = "testGetDisk") public void testListDisk() { - PagedIterable disks = api().list(new ListOptions.Builder() + PagedIterable disks = api().listInZone(DEFAULT_ZONE_NAME, new ListOptions.Builder() .filter("name eq " + DISK_NAME)); List disksAsList = Lists.newArrayList(disks.concat()); @@ -80,13 +77,13 @@ public void testListDisk() { @Test(groups = "live", dependsOnMethods = "testListDisk") public void testDeleteDisk() { - assertOperationDoneSucessfully(api().delete(DISK_NAME), TIME_WAIT); + assertZoneOperationDoneSucessfully(api().deleteInZone(DEFAULT_ZONE_NAME, DISK_NAME), TIME_WAIT); } private void assertDiskEquals(Disk result) { assertEquals(result.getName(), DISK_NAME); assertEquals(result.getSizeGb(), sizeGb); - assertEquals(result.getZone(), zoneUrl); + assertEquals(result.getZone(), getDefaultZoneUrl(userProject.get())); } } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiExpectTest.java index 5dc6fdf83..6345c5100 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiExpectTest.java @@ -16,24 +16,6 @@ */ package org.jclouds.googlecomputeengine.features; -import com.google.common.base.Function; -import com.google.common.collect.ImmutableSet; -import org.jclouds.googlecomputeengine.domain.Firewall; -import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; -import org.jclouds.googlecomputeengine.options.FirewallOptions; -import org.jclouds.googlecomputeengine.parse.ParseFirewallListTest; -import org.jclouds.googlecomputeengine.parse.ParseFirewallTest; -import org.jclouds.googlecomputeengine.parse.ParseOperationTest; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpResponse; -import org.jclouds.io.Payload; -import org.testng.annotations.Test; - -import javax.ws.rs.core.MediaType; -import java.io.IOException; -import java.net.URI; -import java.util.Set; - import static com.google.common.base.Joiner.on; import static com.google.common.collect.Iterables.transform; import static java.lang.String.format; @@ -46,6 +28,26 @@ import static org.testng.Assert.assertTrue; import static org.testng.AssertJUnit.assertNull; +import java.io.IOException; +import java.net.URI; +import java.util.Set; + +import javax.ws.rs.core.MediaType; + +import org.jclouds.googlecomputeengine.domain.Firewall; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; +import org.jclouds.googlecomputeengine.options.FirewallOptions; +import org.jclouds.googlecomputeengine.parse.ParseFirewallListTest; +import org.jclouds.googlecomputeengine.parse.ParseFirewallTest; +import org.jclouds.googlecomputeengine.parse.ParseOperationTest; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.io.Payload; +import org.testng.annotations.Test; + +import com.google.common.base.Function; +import com.google.common.collect.ImmutableSet; + /** * @author David Alves */ @@ -56,7 +58,7 @@ public class FirewallApiExpectTest extends BaseGoogleComputeEngineApiExpectTest .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/firewalls/jclouds-test") + ".com/compute/v1beta15/projects/myproject/global/firewalls/jclouds-test") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -106,7 +108,7 @@ public void testGetFirewallResponseIs4xx() throws Exception { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/firewalls/jclouds-test") + ".com/compute/v1beta15/projects/myproject/global/firewalls/jclouds-test") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -123,7 +125,7 @@ public void testInsertFirewallResponseIs2xx() throws IOException { HttpRequest request = HttpRequest .builder() .method("POST") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/firewalls") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/firewalls") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(firewallPayloadFirewallOfName( @@ -142,7 +144,7 @@ public void testInsertFirewallResponseIs2xx() throws IOException { TOKEN_RESPONSE, request, insertFirewallResponse).getFirewallApiForProject("myproject"); assertEquals(api.createInNetwork("myfw", URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/default"), + ".com/compute/v1beta15/projects/myproject/global/networks/default"), new FirewallOptions() .addAllowedRule(Firewall.Rule.builder() .IPProtocol(IPProtocol.TCP) @@ -158,7 +160,7 @@ public void testUpdateFirewallResponseIs2xx() throws IOException { HttpRequest update = HttpRequest .builder() .method("PUT") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/firewalls/myfw") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/firewalls/myfw") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(firewallPayloadFirewallOfName( @@ -181,7 +183,7 @@ public void testUpdateFirewallResponseIs2xx() throws IOException { new FirewallOptions() .name("myfw") .network(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/default")) + ".com/compute/v1beta15/projects/myproject/global/networks/default")) .addAllowedRule(Firewall.Rule.builder() .IPProtocol(IPProtocol.TCP) .addPort(22) @@ -195,7 +197,7 @@ public void testPatchFirewallResponseIs2xx() throws IOException { HttpRequest update = HttpRequest .builder() .method("PATCH") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/firewalls/myfw") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/firewalls/myfw") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(firewallPayloadFirewallOfName( @@ -218,7 +220,7 @@ public void testPatchFirewallResponseIs2xx() throws IOException { new FirewallOptions() .name("myfw") .network(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/default")) + ".com/compute/v1beta15/projects/myproject/global/networks/default")) .addAllowedRule(Firewall.Rule.builder() .IPProtocol(IPProtocol.TCP) .addPort(22) @@ -233,7 +235,7 @@ public void testDeleteFirewallResponseIs2xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/firewalls/default-allow-internal") + ".com/compute/v1beta15/projects/myproject/global/firewalls/default-allow-internal") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -252,7 +254,7 @@ public void testDeleteFirewallResponseIs4xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/firewalls/default-allow-internal") + ".com/compute/v1beta15/projects/myproject/global/firewalls/default-allow-internal") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -269,7 +271,7 @@ public void testListFirewallsResponseIs2xx() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/firewalls") + ".com/compute/v1beta15/projects/myproject/global/firewalls") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -288,7 +290,7 @@ public void testListFirewallsResponseIs4xx() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/firewalls") + ".com/compute/v1beta15/projects/myproject/global/firewalls") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java index 72c903f6f..8c550b7c0 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java @@ -16,8 +16,13 @@ */ package org.jclouds.googlecomputeengine.features; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Lists; +import static com.google.common.collect.Iterables.getOnlyElement; +import static org.jclouds.googlecomputeengine.domain.Firewall.Rule.IPProtocol; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.List; + import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.domain.Firewall; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; @@ -25,12 +30,8 @@ import org.jclouds.googlecomputeengine.options.ListOptions; import org.testng.annotations.Test; -import java.util.List; - -import static com.google.common.collect.Iterables.getOnlyElement; -import static org.jclouds.googlecomputeengine.domain.Firewall.Rule.IPProtocol; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; /** * @author David Alves @@ -50,7 +51,7 @@ private FirewallApi api() { public void testInsertFirewall() { // need to create the network first - assertOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).createInIPv4Range + assertGlobalOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).createInIPv4Range (FIREWALL_NETWORK_NAME, IPV4_RANGE), TIME_WAIT); FirewallOptions firewall = new FirewallOptions() @@ -62,7 +63,7 @@ public void testInsertFirewall() { .addSourceTag("tag1") .addTargetTag("tag2"); - assertOperationDoneSucessfully(api().createInNetwork(FIREWALL_NAME, getNetworkUrl(userProject.get(), + assertGlobalOperationDoneSucessfully(api().createInNetwork(FIREWALL_NAME, getNetworkUrl(userProject.get(), FIREWALL_NETWORK_NAME), firewall), TIME_WAIT); } @@ -72,7 +73,7 @@ public void testUpdateFirewall() { FirewallOptions firewall = new FirewallOptions() .name(FIREWALL_NAME) - .network(getNetworkUrl(userProject.get(),FIREWALL_NETWORK_NAME)) + .network(getNetworkUrl(userProject.get(), FIREWALL_NETWORK_NAME)) .addSourceRange("10.0.0.0/8") .addSourceTag("tag1") .addTargetTag("tag2") @@ -83,7 +84,7 @@ public void testUpdateFirewall() { .build())); - assertOperationDoneSucessfully(api().update(FIREWALL_NAME, firewall), TIME_WAIT); + assertGlobalOperationDoneSucessfully(api().update(FIREWALL_NAME, firewall), TIME_WAIT); } @@ -92,7 +93,7 @@ public void testPatchFirewall() { FirewallOptions firewall = new FirewallOptions() .name(FIREWALL_NAME) - .network(getNetworkUrl(userProject.get(),FIREWALL_NETWORK_NAME)) + .network(getNetworkUrl(userProject.get(), FIREWALL_NETWORK_NAME)) .allowedRules(ImmutableSet.of( Firewall.Rule.builder() .IPProtocol(IPProtocol.TCP) @@ -106,7 +107,7 @@ public void testPatchFirewall() { .addSourceTag("tag1") .addTargetTag("tag2"); - assertOperationDoneSucessfully(api().update(FIREWALL_NAME, firewall), TIME_WAIT); + assertGlobalOperationDoneSucessfully(api().update(FIREWALL_NAME, firewall), TIME_WAIT); } @@ -149,8 +150,8 @@ public void testListFirewall() { @Test(groups = "live", dependsOnMethods = "testListFirewall") public void testDeleteFirewall() { - assertOperationDoneSucessfully(api().delete(FIREWALL_NAME), TIME_WAIT); - assertOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).delete + assertGlobalOperationDoneSucessfully(api().delete(FIREWALL_NAME), TIME_WAIT); + assertGlobalOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).delete (FIREWALL_NETWORK_NAME), TIME_WAIT); } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiExpectTest.java similarity index 65% rename from google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiExpectTest.java rename to google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiExpectTest.java index 7fefa48ad..412dc32b4 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiExpectTest.java @@ -16,6 +16,12 @@ */ package org.jclouds.googlecomputeengine.features; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; import org.jclouds.googlecomputeengine.options.ListOptions; import org.jclouds.googlecomputeengine.parse.ParseOperationListTest; @@ -24,35 +30,29 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertTrue; - /** * @author David Alves */ @Test(groups = "unit") -public class OperationApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { +public class GlobalOperationApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { private static final String OPERATIONS_URL_PREFIX = "https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/operations"; + ".com/compute/v1beta15/projects/myproject/global/operations"; - public static final HttpRequest GET_OPERATION_REQUEST = HttpRequest + public static final HttpRequest GET_GLOBAL_OPERATION_REQUEST = HttpRequest .builder() .method("GET") .endpoint(OPERATIONS_URL_PREFIX + "/operation-1354084865060-4cf88735faeb8-bbbb12cb") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); - public static final HttpResponse GET_OPERATION_RESPONSE = HttpResponse.builder().statusCode(200) - .payload(staticPayloadFromResource("/operation.json")).build(); + public static final HttpResponse GET_GLOBAL_OPERATION_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/global_operation.json")).build(); public void testGetOperationResponseIs2xx() throws Exception { - OperationApi operationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), - TOKEN_RESPONSE, GET_OPERATION_REQUEST, GET_OPERATION_RESPONSE).getOperationApiForProject("myproject"); + GlobalOperationApi operationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_GLOBAL_OPERATION_REQUEST, GET_GLOBAL_OPERATION_RESPONSE).getGlobalOperationApiForProject("myproject"); assertEquals(operationApi.get("operation-1354084865060-4cf88735faeb8-bbbb12cb"), new ParseOperationTest().expected()); @@ -62,10 +62,10 @@ public void testGetOperationResponseIs4xx() throws Exception { HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); - OperationApi operationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), - TOKEN_RESPONSE, GET_OPERATION_REQUEST, operationResponse).getOperationApiForProject("myproject"); + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_GLOBAL_OPERATION_REQUEST, operationResponse).getGlobalOperationApiForProject("myproject"); - assertNull(operationApi.get("operation-1354084865060-4cf88735faeb8-bbbb12cb")); + assertNull(globalOperationApi.get("operation-1354084865060-4cf88735faeb8-bbbb12cb")); } public void testDeleteOperationResponseIs2xx() throws Exception { @@ -77,10 +77,10 @@ public void testDeleteOperationResponseIs2xx() throws Exception { HttpResponse operationResponse = HttpResponse.builder().statusCode(204).build(); - OperationApi operationApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), - TOKEN_RESPONSE, delete, operationResponse).getOperationApiForProject("myproject"); + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, operationResponse).getGlobalOperationApiForProject("myproject"); - operationApi.delete("operation-1352178598164-4cdcc9d031510-4aa46279"); + globalOperationApi.delete("operation-1352178598164-4cdcc9d031510-4aa46279"); } public void testDeleteOperationResponseIs4xx() throws Exception { @@ -92,10 +92,10 @@ public void testDeleteOperationResponseIs4xx() throws Exception { HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); - OperationApi operationApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), - TOKEN_RESPONSE, delete, operationResponse).getOperationApiForProject("myproject"); + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, operationResponse).getGlobalOperationApiForProject("myproject"); - operationApi.delete("operation-1352178598164-4cdcc9d031510-4aa46279"); + globalOperationApi.delete("operation-1352178598164-4cdcc9d031510-4aa46279"); } public void testLisOperationWithNoOptionsResponseIs2xx() { @@ -107,12 +107,12 @@ public void testLisOperationWithNoOptionsResponseIs2xx() { .addHeader("Authorization", "Bearer " + TOKEN).build(); HttpResponse operationResponse = HttpResponse.builder().statusCode(200) - .payload(payloadFromResource("/operation_list.json")).build(); + .payload(payloadFromResource("/global_operation_list.json")).build(); - OperationApi operationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), - TOKEN_RESPONSE, get, operationResponse).getOperationApiForProject("myproject"); + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getGlobalOperationApiForProject("myproject"); - assertEquals(operationApi.listFirstPage().toString(), + assertEquals(globalOperationApi.listFirstPage().toString(), new ParseOperationListTest().expected().toString()); } @@ -130,12 +130,12 @@ public void testListOperationWithPaginationOptionsResponseIs2xx() { .addHeader("Authorization", "Bearer " + TOKEN).build(); HttpResponse operationResponse = HttpResponse.builder().statusCode(200) - .payload(payloadFromResource("/operation_list.json")).build(); + .payload(payloadFromResource("/global_operation_list.json")).build(); - OperationApi operationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), - TOKEN_RESPONSE, get, operationResponse).getOperationApiForProject("myproject"); + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getGlobalOperationApiForProject("myproject"); - assertEquals(operationApi.listAtMarker("CglPUEVSQVRJT04SOzU5MDQyMTQ4Nzg1Mi5vcGVyYXRpb24tMTM1Mj" + + assertEquals(globalOperationApi.listAtMarker("CglPUEVSQVRJT04SOzU5MDQyMTQ4Nzg1Mi5vcGVyYXRpb24tMTM1Mj" + "I0NDI1ODAzMC00Y2RkYmU2YTJkNmIwLWVkMzIyMzQz", new ListOptions.Builder().filter("status eq done").maxResults(3)).toString(), new ParseOperationListTest().expected().toString()); @@ -151,10 +151,10 @@ public void testListOperationWithPaginationOptionsResponseIs4xx() { HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); - OperationApi operationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), - TOKEN_RESPONSE, get, operationResponse).getOperationApiForProject("myproject"); + GlobalOperationApi globalOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getGlobalOperationApiForProject("myproject"); - assertTrue(operationApi.list().concat().isEmpty()); + assertTrue(globalOperationApi.list().concat().isEmpty()); } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiLiveTest.java similarity index 90% rename from google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiLiveTest.java rename to google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiLiveTest.java index 982a6ba2f..42adbe648 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/GlobalOperationApiLiveTest.java @@ -16,8 +16,13 @@ */ package org.jclouds.googlecomputeengine.features; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; +import static org.jclouds.googlecomputeengine.features.ProjectApiLiveTest.addItemToMetadata; +import static org.jclouds.googlecomputeengine.features.ProjectApiLiveTest.deleteItemFromMetadata; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.concurrent.atomic.AtomicInteger; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.domain.Operation; @@ -25,25 +30,21 @@ import org.jclouds.googlecomputeengine.options.ListOptions; import org.testng.annotations.Test; -import java.util.concurrent.atomic.AtomicInteger; - -import static org.jclouds.googlecomputeengine.features.ProjectApiLiveTest.addItemToMetadata; -import static org.jclouds.googlecomputeengine.features.ProjectApiLiveTest.deleteItemFromMetadata; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; /** * @author David Alves */ -public class OperationApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { +public class GlobalOperationApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { private static final String METADATA_ITEM_KEY = "operationLiveTestTestProp"; private static final String METADATA_ITEM_VALUE = "operationLiveTestTestValue"; private Operation addOperation; private Operation deleteOperation; - private OperationApi api() { - return api.getOperationApiForProject(userProject.get()); + private GlobalOperationApi api() { + return api.getGlobalOperationApiForProject(userProject.get()); } @@ -51,9 +52,9 @@ private OperationApi api() { public void testCreateOperations() { //create some operations by adding and deleting metadata items // this will make sure there is stuff to listFirstPage - addOperation = assertOperationDoneSucessfully(addItemToMetadata(api.getProjectApi(), + addOperation = assertGlobalOperationDoneSucessfully(addItemToMetadata(api.getProjectApi(), userProject.get(), METADATA_ITEM_KEY, METADATA_ITEM_VALUE), 20); - deleteOperation = assertOperationDoneSucessfully(deleteItemFromMetadata(api + deleteOperation = assertGlobalOperationDoneSucessfully(deleteItemFromMetadata(api .getProjectApi(), userProject.get(), METADATA_ITEM_KEY), 20); assertNotNull(addOperation); 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 fe7e41fee..d8baecf11 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 @@ -16,6 +16,12 @@ */ package org.jclouds.googlecomputeengine.features; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertNull; + import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; import org.jclouds.googlecomputeengine.parse.ParseImageListTest; import org.jclouds.googlecomputeengine.parse.ParseImageTest; @@ -24,12 +30,6 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.AssertJUnit.assertNull; - /** * @author David Alves */ @@ -40,19 +40,30 @@ public class ImageApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/images") + ".com/compute/v1beta15/projects/myproject/global/images") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); public static final HttpResponse LIST_PROJECT_IMAGES_RESPONSE = HttpResponse.builder().statusCode(200) .payload(staticPayloadFromResource("/image_list.json")).build(); + public static final HttpRequest LIST_GOOGLE_IMAGES_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/google/global/images") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse LIST_GOOGLE_IMAGES_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/image_list_single_page.json")).build(); + + public void testGetImageResponseIs2xx() throws Exception { HttpRequest get = HttpRequest .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/images/centos-6-2-v20120326") + ".com/compute/v1beta15/projects/google/global/images/centos-6-2-v20120326") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -71,7 +82,7 @@ public void testGetImageResponseIs4xx() throws Exception { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/images/centos-6-2-v20120326") + ".com/compute/v1beta15/projects/google/global/images/centos-6-2-v20120326") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -88,7 +99,7 @@ public void testDeleteImageResponseIs2xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/images/centos-6-2-v20120326") + ".com/compute/v1beta15/projects/myproject/global/images/centos-6-2-v20120326") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -107,7 +118,7 @@ public void testDeleteImageResponseIs4xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/images/centos-6-2-v20120326") + ".com/compute/v1beta15/projects/myproject/global/images/centos-6-2-v20120326") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); 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 f26b8bba2..6b074630d 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 @@ -16,8 +16,14 @@ */ package org.jclouds.googlecomputeengine.features; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; + +import java.util.Iterator; +import java.util.List; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.domain.Image; @@ -25,13 +31,8 @@ import org.jclouds.googlecomputeengine.options.ListOptions; import org.testng.annotations.Test; -import java.util.Iterator; -import java.util.List; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; /** * TODO figure out how to test insert and delete as this requires an image .tar.gz to be present in GCS diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiExpectTest.java index 05a2034aa..3cde1e8cc 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiExpectTest.java @@ -16,6 +16,19 @@ */ package org.jclouds.googlecomputeengine.features; +import static java.net.URI.create; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.jclouds.googlecomputeengine.features.ProjectApiExpectTest.GET_PROJECT_REQUEST; +import static org.jclouds.googlecomputeengine.features.ProjectApiExpectTest.GET_PROJECT_RESPONSE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertNull; + +import java.net.URI; + +import javax.ws.rs.core.MediaType; + import org.jclouds.googlecomputeengine.domain.Instance; import org.jclouds.googlecomputeengine.domain.InstanceTemplate; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; @@ -27,15 +40,7 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import javax.ws.rs.core.MediaType; -import java.net.URI; - -import static java.net.URI.create; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.AssertJUnit.assertNull; +import com.google.common.collect.ImmutableMap; /** * @author David Alves @@ -47,7 +52,7 @@ public class InstanceApiExpectTest extends BaseGoogleComputeEngineApiExpectTest .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/instances/test-1") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/test-1") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -59,15 +64,26 @@ public class InstanceApiExpectTest extends BaseGoogleComputeEngineApiExpectTest .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/instances") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); public static final HttpResponse LIST_INSTANCES_RESPONSE = HttpResponse.builder().statusCode(200) .payload(staticPayloadFromResource("/instance_list.json")).build(); + public static final HttpRequest LIST_CENTRAL1B_INSTANCES_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis" + + ".com/compute/v1beta15/projects/myproject/zones/us-central1-b/instances") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse LIST_CENTRAL1B_INSTANCES_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/instance_list_central1b_empty.json")).build(); + public static final HttpResponse CREATE_INSTANCE_RESPONSE = HttpResponse.builder().statusCode(200) - .payload(staticPayloadFromResource("/operation.json")).build(); + .payload(staticPayloadFromResource("/zone_operation.json")).build(); public void testGetInstanceResponseIs2xx() throws Exception { @@ -76,7 +92,7 @@ public void testGetInstanceResponseIs2xx() throws Exception { requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, GET_INSTANCE_REQUEST, GET_INSTANCE_RESPONSE).getInstanceApiForProject("myproject"); - assertEquals(api.get("test-1"), new ParseInstanceTest().expected()); + assertEquals(api.getInZone("us-central1-a", "test-1"), new ParseInstanceTest().expected()); } public void testGetInstanceResponseIs4xx() throws Exception { @@ -86,7 +102,7 @@ public void testGetInstanceResponseIs4xx() throws Exception { InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, GET_INSTANCE_REQUEST, operationResponse).getInstanceApiForProject("myproject"); - assertNull(api.get("test-1")); + assertNull(api.getInZone("us-central1-a", "test-1")); } public void testGetInstanceSerialPortOutput() throws Exception { @@ -94,7 +110,7 @@ public void testGetInstanceSerialPortOutput() throws Exception { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/instances/test-1/serialPort") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/test-1/serialPort") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -105,59 +121,63 @@ public void testGetInstanceSerialPortOutput() throws Exception { InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, get, operationResponse).getInstanceApiForProject("myproject"); - assertEquals(api.getSerialPortOutput("test-1"), new ParseInstanceSerialOutputTest().expected()); + assertEquals(api.getSerialPortOutputInZone("us-central1-a", "test-1"), new ParseInstanceSerialOutputTest().expected()); } public void testInsertInstanceResponseIs2xxNoOptions() { HttpRequest insert = HttpRequest .builder() .method("POST") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/instances") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(payloadFromResourceWithContentType("/instance_insert_simple.json", MediaType.APPLICATION_JSON)) .build(); - InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + InstanceApi api = requestsSendResponses(ImmutableMap.of(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_PROJECT_REQUEST, GET_PROJECT_RESPONSE, + requestForScopes(COMPUTE_SCOPE), TOKEN_RESPONSE, insert, - CREATE_INSTANCE_RESPONSE).getInstanceApiForProject("myproject"); + CREATE_INSTANCE_RESPONSE)).getInstanceApiForProject("myproject"); - InstanceTemplate options = InstanceTemplate.builder().forMachineType("n1-standard-1") + InstanceTemplate options = InstanceTemplate.builder().forMachineType("us-central1-a/n1-standard-1") + .image(URI.create("https://www.googleapis.com/compute/v1beta15/projects/google/global/images/gcel-12-04-v20121106")) .addNetworkInterface(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/default")); + ".com/compute/v1beta15/projects/myproject/global/networks/default")); - assertEquals(api.createInZone("test-1", options, "us-central1-a"), new ParseOperationTest().expected()); + assertEquals(api.createInZone("test-1", "us-central1-a", options), new ParseOperationTest().expected()); } public void testInsertInstanceResponseIs2xxAllOptions() { HttpRequest insert = HttpRequest .builder() .method("POST") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/instances") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(payloadFromResourceWithContentType("/instance_insert.json", MediaType.APPLICATION_JSON)) .build(); HttpResponse insertInstanceResponse = HttpResponse.builder().statusCode(200) - .payload(payloadFromResource("/operation.json")).build(); + .payload(payloadFromResource("/zone_operation.json")).build(); - InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), - TOKEN_RESPONSE, insert, insertInstanceResponse).getInstanceApiForProject("myproject"); + InstanceApi api = requestsSendResponses(ImmutableMap.of(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_PROJECT_REQUEST, GET_PROJECT_RESPONSE, + requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, insert, insertInstanceResponse)).getInstanceApiForProject("myproject"); - InstanceTemplate options = InstanceTemplate.builder().forMachineType("n1-standard-1") + InstanceTemplate options = InstanceTemplate.builder().forMachineType("us-central1-a/n1-standard-1") .addNetworkInterface(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/default"), Instance.NetworkInterface.AccessConfig.Type.ONE_TO_ONE_NAT) + ".com/compute/v1beta15/projects/myproject/global/networks/default"), Instance.NetworkInterface.AccessConfig.Type.ONE_TO_ONE_NAT) .description("desc") .image(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/images/gcel-12-04-v20121106")) + ".com/compute/v1beta15/projects/google/global/images/gcel-12-04-v20121106")) .addDisk(InstanceTemplate.PersistentDisk.Mode.READ_WRITE, - create("https://www.googleapis.com/compute/v1beta13/projects/myproject/disks/test")) - .addTag("aTag") + create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/test")) .addServiceAccount(Instance.ServiceAccount.builder().email("default").addScopes("myscope").build()) .addMetadata("aKey", "aValue"); - assertEquals(api.createInZone("test-0", options, "us-central1-a"), + assertEquals(api.createInZone("test-0", "us-central1-a", options), new ParseOperationTest().expected()); } @@ -166,17 +186,17 @@ public void testDeleteInstanceResponseIs2xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/instances/test-1") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/test-1") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); HttpResponse deleteResponse = HttpResponse.builder().statusCode(200) - .payload(payloadFromResource("/operation.json")).build(); + .payload(payloadFromResource("/zone_operation.json")).build(); InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), TOKEN_RESPONSE, delete, deleteResponse).getInstanceApiForProject("myproject"); - assertEquals(api.delete("test-1"), + assertEquals(api.deleteInZone("us-central1-a", "test-1"), new ParseOperationTest().expected()); } @@ -185,7 +205,7 @@ public void testDeleteInstanceResponseIs4xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/instances/test-1") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/test-1") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -194,7 +214,7 @@ public void testDeleteInstanceResponseIs4xx() { InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), TOKEN_RESPONSE, delete, deleteResponse).getInstanceApiForProject("myproject"); - assertNull(api.delete("test-1")); + assertNull(api.deleteInZone("us-central1-a", "test-1")); } public void testListInstancesResponseIs2xx() { @@ -203,7 +223,7 @@ public void testListInstancesResponseIs2xx() { requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, LIST_INSTANCES_REQUEST, LIST_INSTANCES_RESPONSE).getInstanceApiForProject("myproject"); - assertEquals(api.listFirstPage().toString(), + assertEquals(api.listFirstPageInZone("us-central1-a").toString(), new ParseInstanceListTest().expected().toString()); } @@ -212,7 +232,7 @@ public void testListInstancesResponseIs4xx() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/instances") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -221,7 +241,7 @@ public void testListInstancesResponseIs4xx() { InstanceApi api = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, list, operationResponse).getInstanceApiForProject("myproject"); - assertTrue(api.list().concat().isEmpty()); + assertTrue(api.listInZone("us-central1-a").concat().isEmpty()); } } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java index e4ea6f735..c6b25711c 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java @@ -19,17 +19,20 @@ import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; +import java.net.URI; import java.util.List; import java.util.Properties; import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.domain.Image; import org.jclouds.googlecomputeengine.domain.Instance; import org.jclouds.googlecomputeengine.domain.InstanceTemplate; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; import org.jclouds.googlecomputeengine.options.ListOptions; import org.testng.annotations.Test; +import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.inject.Module; @@ -46,19 +49,35 @@ public class InstanceApiLiveTest extends BaseGoogleComputeEngineApiLiveTest { private static final int TIME_WAIT = 600; private InstanceTemplate instance; - + @Override protected GoogleComputeEngineApi create(Properties props, Iterable modules) { GoogleComputeEngineApi api = super.create(props, modules); + URI imageUri = api.getImageApiForProject("google") + .list(new ListOptions.Builder().filter("name eq gcel.*")) + .concat() + .filter(new Predicate() { + @Override + public boolean apply(Image input) { + // filter out only images with deprecation state that isn't "DEPRECATED" + if (input.getDeprecated().isPresent() && input.getDeprecated().get().getState().isPresent()) { + return input.getDeprecated().get().getState().get().equals("DEPRECATED"); + } + return true; + } + }) + .first() + .get() + .getSelfLink(); instance = InstanceTemplate.builder() - .forMachineType(getDefaultMachineTypekUrl(userProject.get())) - .addNetworkInterface(getNetworkUrl(userProject.get(), INSTANCE_NETWORK_NAME), - Instance.NetworkInterface.AccessConfig.Type.ONE_TO_ONE_NAT) - .addMetadata("mykey", "myvalue") - .addTag("atag") - .description("a description") - .addDisk(InstanceTemplate.PersistentDisk.Mode.READ_WRITE, getDiskUrl(userProject.get(), DISK_NAME)) - .zone(getDefaultZoneUrl(userProject.get())); + .forMachineType(getDefaultMachineTypeUrl(userProject.get())) + .addNetworkInterface(getNetworkUrl(userProject.get(), INSTANCE_NETWORK_NAME), + Instance.NetworkInterface.AccessConfig.Type.ONE_TO_ONE_NAT) + .addMetadata("mykey", "myvalue") + .description("a description") + .addDisk(InstanceTemplate.PersistentDisk.Mode.READ_WRITE, getDiskUrl(userProject.get(), DISK_NAME)) + .image(imageUri); + return api; } @@ -70,20 +89,20 @@ private InstanceApi api() { public void testInsertInstance() { // need to create the network first - assertOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).createInIPv4Range + assertGlobalOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).createInIPv4Range (INSTANCE_NETWORK_NAME, IPV4_RANGE), TIME_WAIT); - assertOperationDoneSucessfully(api.getDiskApiForProject(userProject.get()).createInZone - ("instance-live-test-disk", 1, getDefaultZoneUrl(userProject.get())), TIME_WAIT); + assertZoneOperationDoneSucessfully(api.getDiskApiForProject(userProject.get()).createInZone + ("instance-live-test-disk", 10, DEFAULT_ZONE_NAME), TIME_WAIT); - assertOperationDoneSucessfully(api().createInZone(INSTANCE_NAME, instance, DEFAULT_ZONE_NAME), TIME_WAIT); + assertZoneOperationDoneSucessfully(api().createInZone(INSTANCE_NAME, DEFAULT_ZONE_NAME, instance), TIME_WAIT); } @Test(groups = "live", dependsOnMethods = "testInsertInstance") public void testGetInstance() { - Instance instance = api().get(INSTANCE_NAME); + Instance instance = api().getInZone(DEFAULT_ZONE_NAME, INSTANCE_NAME); assertNotNull(instance); assertInstanceEquals(instance, this.instance); } @@ -91,7 +110,7 @@ public void testGetInstance() { @Test(groups = "live", dependsOnMethods = "testInsertInstance") public void testListInstance() { - PagedIterable instances = api().list(new ListOptions.Builder() + PagedIterable instances = api().listInZone(DEFAULT_ZONE_NAME, new ListOptions.Builder() .filter("name eq " + INSTANCE_NAME)); List instancesAsList = Lists.newArrayList(instances.concat()); @@ -105,16 +124,15 @@ public void testListInstance() { @Test(groups = "live", dependsOnMethods = "testListInstance") public void testDeleteInstance() { - assertOperationDoneSucessfully(api().delete(INSTANCE_NAME), TIME_WAIT); - assertOperationDoneSucessfully(api.getDiskApiForProject(userProject.get()).delete(DISK_NAME), + assertZoneOperationDoneSucessfully(api().deleteInZone(DEFAULT_ZONE_NAME, INSTANCE_NAME), TIME_WAIT); + assertZoneOperationDoneSucessfully(api.getDiskApiForProject(userProject.get()).deleteInZone(DEFAULT_ZONE_NAME, DISK_NAME), TIME_WAIT); - assertOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).delete + assertGlobalOperationDoneSucessfully(api.getNetworkApiForProject(userProject.get()).delete (INSTANCE_NETWORK_NAME), TIME_WAIT); } private void assertInstanceEquals(Instance result, InstanceTemplate expected) { assertEquals(result.getName(), expected.getName()); - assertEquals(result.getTags(), expected.getTags()); assertEquals(result.getMetadata(), expected.getMetadata()); } } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/KernelApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/KernelApiExpectTest.java index 89e395898..d6f2f5c35 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/KernelApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/KernelApiExpectTest.java @@ -16,6 +16,11 @@ */ package org.jclouds.googlecomputeengine.features; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; import org.jclouds.googlecomputeengine.parse.ParseKernelListTest; import org.jclouds.googlecomputeengine.parse.ParseKernelTest; @@ -23,11 +28,6 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertTrue; - /** * @author David Alves */ @@ -39,7 +39,7 @@ public void testGetKernelResponseIs2xx() throws Exception { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/kernels/12941177846308850718") + ".com/compute/v1beta15/projects/myproject/global/kernels/12941177846308850718") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -58,7 +58,7 @@ public void testGetKernelResponseIs4xx() throws Exception { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/kernels/12941177846308850718") + ".com/compute/v1beta15/projects/myproject/global/kernels/12941177846308850718") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -75,7 +75,7 @@ public void testListKernelNoOptionsResponseIs2xx() throws Exception { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/kernels") + ".com/compute/v1beta15/projects/myproject/global/kernels") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -94,7 +94,7 @@ public void testListKernelsResponseIs4xx() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/kernels") + ".com/compute/v1beta15/projects/myproject/global/kernels") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/KernelApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/KernelApiLiveTest.java index f1476f861..8e9f97154 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/KernelApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/KernelApiLiveTest.java @@ -16,8 +16,14 @@ */ package org.jclouds.googlecomputeengine.features; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; + +import java.util.Iterator; +import java.util.List; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.domain.Kernel; @@ -25,13 +31,8 @@ import org.jclouds.googlecomputeengine.options.ListOptions; import org.testng.annotations.Test; -import java.util.Iterator; -import java.util.List; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; /** * @author David Alves diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiExpectTest.java index 3526efdb5..702f99536 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiExpectTest.java @@ -16,6 +16,11 @@ */ package org.jclouds.googlecomputeengine.features; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; import org.jclouds.googlecomputeengine.parse.ParseMachineTypeListTest; import org.jclouds.googlecomputeengine.parse.ParseMachineTypeTest; @@ -23,11 +28,6 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertTrue; - /** * @author David Alves */ @@ -37,7 +37,7 @@ public class MachineTypeApiExpectTest extends BaseGoogleComputeEngineApiExpectTe public static final HttpRequest LIST_MACHINE_TYPES_REQUEST = HttpRequest .builder() .method("GET") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -46,12 +46,24 @@ public class MachineTypeApiExpectTest extends BaseGoogleComputeEngineApiExpectTe .payload(staticPayloadFromResource("/machinetype_list.json")) .build(); + public static final HttpRequest LIST_CENTRAL1B_MACHINE_TYPES_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-b/machineTypes") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse LIST_CENTRAL1B_MACHINE_TYPES_RESPONSE = HttpResponse.builder() + .statusCode(200) + .payload(staticPayloadFromResource("/machinetype_list_central1b.json")) + .build(); + public void testGetMachineTypeResponseIs2xx() throws Exception { HttpRequest get = HttpRequest .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -61,7 +73,7 @@ public void testGetMachineTypeResponseIs2xx() throws Exception { MachineTypeApi machineTypeApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, get, operationResponse).getMachineTypeApiForProject("myproject"); - assertEquals(machineTypeApi.get("n1-standard-1"), + assertEquals(machineTypeApi.getInZone("us-central1-a", "n1-standard-1"), new ParseMachineTypeTest().expected()); } @@ -70,7 +82,7 @@ public void testGetMachineTypeResponseIs4xx() throws Exception { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -79,7 +91,7 @@ public void testGetMachineTypeResponseIs4xx() throws Exception { MachineTypeApi machineTypeApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, get, operationResponse).getMachineTypeApiForProject("myproject"); - assertNull(machineTypeApi.get("n1-standard-1")); + assertNull(machineTypeApi.getInZone("us-central1-a", "n1-standard-1")); } public void testListMachineTypeNoOptionsResponseIs2xx() throws Exception { @@ -88,7 +100,7 @@ public void testListMachineTypeNoOptionsResponseIs2xx() throws Exception { TOKEN_RESPONSE, LIST_MACHINE_TYPES_REQUEST, LIST_MACHINE_TYPES_RESPONSE).getMachineTypeApiForProject ("myproject"); - assertEquals(machineTypeApi.listFirstPage().toString(), + assertEquals(machineTypeApi.listFirstPageInZone("us-central1-a").toString(), new ParseMachineTypeListTest().expected().toString()); } @@ -99,6 +111,6 @@ public void testLisOperationWithPaginationOptionsResponseIs4xx() { MachineTypeApi machineTypeApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), TOKEN_RESPONSE, LIST_MACHINE_TYPES_REQUEST, operationResponse).getMachineTypeApiForProject("myproject"); - assertTrue(machineTypeApi.list().concat().isEmpty()); + assertTrue(machineTypeApi.listInZone("us-central1-a").concat().isEmpty()); } } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiLiveTest.java index 2a75366ec..af2b7800d 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiLiveTest.java @@ -16,8 +16,14 @@ */ package org.jclouds.googlecomputeengine.features; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; + +import java.util.Iterator; +import java.util.List; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.domain.MachineType; @@ -25,13 +31,8 @@ import org.jclouds.googlecomputeengine.options.ListOptions; import org.testng.annotations.Test; -import java.util.Iterator; -import java.util.List; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; /** * @author David Alves @@ -47,7 +48,7 @@ private MachineTypeApi api() { @Test(groups = "live") public void testListMachineType() { - PagedIterable machineTypes = api().list(new ListOptions.Builder() + PagedIterable machineTypes = api().listInZone(DEFAULT_ZONE_NAME, new ListOptions.Builder() .maxResults(1)); Iterator> pageIterator = machineTypes.iterator(); @@ -64,7 +65,7 @@ public void testListMachineType() { @Test(groups = "live", dependsOnMethods = "testListMachineType") public void testGetMachineType() { - MachineType machineType = api().get(this.machineType.getName()); + MachineType machineType = api().getInZone(DEFAULT_ZONE_NAME, this.machineType.getName()); assertNotNull(machineType); assertMachineTypeEquals(machineType, this.machineType); } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiExpectTest.java index 2b46e0a22..0198644b8 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiExpectTest.java @@ -16,6 +16,14 @@ */ package org.jclouds.googlecomputeengine.features; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; +import static org.testng.AssertJUnit.assertNull; + +import javax.ws.rs.core.MediaType; + import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; import org.jclouds.googlecomputeengine.parse.ParseNetworkListTest; import org.jclouds.googlecomputeengine.parse.ParseNetworkTest; @@ -24,14 +32,6 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import javax.ws.rs.core.MediaType; - -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.AssertJUnit.assertNull; - /** * @author David Alves */ @@ -41,7 +41,7 @@ public class NetworkApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { public static final HttpRequest GET_NETWORK_REQUEST = HttpRequest .builder() .method("GET") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/jclouds-test") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/jclouds-test") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -61,7 +61,7 @@ public void testGetNetworkResponseIs4xx() throws Exception { HttpRequest get = HttpRequest .builder() .method("GET") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/jclouds-test") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/jclouds-test") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -77,7 +77,7 @@ public void testInsertNetworkResponseIs2xx() { HttpRequest insert = HttpRequest .builder() .method("POST") - .endpoint("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks") + .endpoint("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN) .payload(payloadFromResourceWithContentType("/network_insert.json", MediaType.APPLICATION_JSON)) @@ -98,7 +98,7 @@ public void testDeleteNetworkResponseIs2xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/jclouds-test") + ".com/compute/v1beta15/projects/myproject/global/networks/jclouds-test") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -117,7 +117,7 @@ public void testDeleteNetworkResponseIs4xx() { .builder() .method("DELETE") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/jclouds-test") + ".com/compute/v1beta15/projects/myproject/global/networks/jclouds-test") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -134,7 +134,7 @@ public void testListNetworksResponseIs2xx() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks") + ".com/compute/v1beta15/projects/myproject/global/networks") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); @@ -153,7 +153,7 @@ public void testListNetworksResponseIs4xx() { .builder() .method("GET") .endpoint("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks") + ".com/compute/v1beta15/projects/myproject/global/networks") .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiLiveTest.java index b8c676c78..b826e5f22 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiLiveTest.java @@ -46,7 +46,7 @@ private NetworkApi api() { @Test(groups = "live") public void testInsertNetwork() { - assertOperationDoneSucessfully(api().createInIPv4Range(NETWORK_NAME, IPV4_RANGE), TIME_WAIT); + assertGlobalOperationDoneSucessfully(api().createInIPv4Range(NETWORK_NAME, IPV4_RANGE), TIME_WAIT); } @@ -75,7 +75,7 @@ public void testListNetwork() { @Test(groups = "live", dependsOnMethods = "testListNetwork") public void testDeleteNetwork() { - assertOperationDoneSucessfully(api().delete(NETWORK_NAME), TIME_WAIT); + assertGlobalOperationDoneSucessfully(api().delete(NETWORK_NAME), TIME_WAIT); } private void assertNetworkEquals(Network result) { diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ProjectApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ProjectApiExpectTest.java index 83c836073..ebcbdfbcc 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ProjectApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ProjectApiExpectTest.java @@ -16,6 +16,11 @@ */ package org.jclouds.googlecomputeengine.features; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; + +import javax.ws.rs.core.MediaType; + import org.jclouds.googlecomputeengine.GoogleComputeEngineConstants; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; import org.jclouds.googlecomputeengine.parse.ParseMetadataTest; @@ -25,11 +30,6 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import javax.ws.rs.core.MediaType; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; - /** * @author David Alves @@ -37,22 +37,22 @@ @Test(groups = "unit") public class ProjectApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { - public static final String PROJECTS_URL_PREFIX = "https://www.googleapis.com/compute/v1beta13/projects"; + public static final String PROJECTS_URL_PREFIX = "https://www.googleapis.com/compute/v1beta15/projects"; - public void testGetProjectResponseIs2xx() throws Exception { - HttpRequest getProjectRequest = HttpRequest - .builder() - .method("GET") - .endpoint(PROJECTS_URL_PREFIX + "/myproject") - .addHeader("Accept", "application/json") - .addHeader("Authorization", "Bearer " + TOKEN).build(); + public static final HttpRequest GET_PROJECT_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint(PROJECTS_URL_PREFIX + "/myproject") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); - HttpResponse getProjectResponse = HttpResponse.builder().statusCode(200) - .payload(payloadFromResource("/project.json")).build(); + public static final HttpResponse GET_PROJECT_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/project.json")).build(); + public void testGetProjectResponseIs2xx() throws Exception { ProjectApi api = requestsSendResponses(requestForScopes(GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE), - TOKEN_RESPONSE, getProjectRequest, - getProjectResponse).getProjectApi(); + TOKEN_RESPONSE, GET_PROJECT_REQUEST, + GET_PROJECT_RESPONSE).getProjectApi(); assertEquals(api.get("myproject"), new ParseProjectTest().expected()); } @@ -85,7 +85,7 @@ public void testSetCommonInstanceMetadata() { .build(); HttpResponse setMetadataResponse = HttpResponse.builder().statusCode(200) - .payload(payloadFromResource("/operation.json")).build(); + .payload(payloadFromResource("/global_operation.json")).build(); ProjectApi api = requestsSendResponses(requestForScopes(GoogleComputeEngineConstants.COMPUTE_SCOPE), TOKEN_RESPONSE, setMetadata, diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ProjectApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ProjectApiLiveTest.java index 7d247249d..eeaaa7f29 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ProjectApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ProjectApiLiveTest.java @@ -20,13 +20,6 @@ * @author David Alves */ -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import org.jclouds.googlecomputeengine.domain.Operation; -import org.jclouds.googlecomputeengine.domain.Project; -import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; -import org.testng.annotations.Test; - import static com.google.common.base.Predicates.equalTo; import static com.google.common.base.Predicates.not; import static org.testng.Assert.assertEquals; @@ -36,6 +29,14 @@ import static org.testng.Assert.assertSame; import static org.testng.Assert.assertTrue; +import org.jclouds.googlecomputeengine.domain.Operation; +import org.jclouds.googlecomputeengine.domain.Project; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + /** * @author David Alves */ @@ -68,7 +69,7 @@ public void testGetProjectWhenNotExists() { @Test(groups = "live", dependsOnMethods = "testGetProjectWhenExists") public void addItemToMetadata() { this.initialMetadataSize = project.getCommonInstanceMetadata().size(); - assertOperationDoneSucessfully(addItemToMetadata(projectApi(), userProject.get(), METADATA_ITEM_KEY, + assertGlobalOperationDoneSucessfully(addItemToMetadata(projectApi(), userProject.get(), METADATA_ITEM_KEY, METADATA_ITEM_VALUE), 20); this.project = projectApi().get(userProject.get()); assertNotNull(project); @@ -80,7 +81,7 @@ public void addItemToMetadata() { @Test(groups = "live", dependsOnMethods = "addItemToMetadata") public void testDeleteItemFromMetadata() { - assertOperationDoneSucessfully(deleteItemFromMetadata(projectApi(), userProject.get(), METADATA_ITEM_KEY), 20); + assertGlobalOperationDoneSucessfully(deleteItemFromMetadata(projectApi(), userProject.get(), METADATA_ITEM_KEY), 20); this.project = projectApi().get(userProject.get()); assertNotNull(project); assertFalse(project.getCommonInstanceMetadata().containsKey(METADATA_ITEM_KEY)); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiExpectTest.java index 9cd516c19..aecfcab6d 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiExpectTest.java @@ -16,6 +16,11 @@ */ package org.jclouds.googlecomputeengine.features; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; import org.jclouds.googlecomputeengine.parse.ParseZoneListTest; import org.jclouds.googlecomputeengine.parse.ParseZoneTest; @@ -23,18 +28,13 @@ import org.jclouds.http.HttpResponse; import org.testng.annotations.Test; -import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNull; -import static org.testng.Assert.assertTrue; - /** * @author David Alves */ @Test(groups = "unit") public class ZoneApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { - public static final String ZONES_URL_PREFIX = "https://www.googleapis.com/compute/v1beta13/projects/myproject/zones"; + public static final String ZONES_URL_PREFIX = "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones"; public static final HttpRequest GET_ZONE_REQ = HttpRequest .builder() @@ -50,10 +50,12 @@ public class ZoneApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { .addHeader("Accept", "application/json") .addHeader("Authorization", "Bearer " + TOKEN).build(); + public static final HttpResponse LIST_ZONES_SHORT_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/zone_list_short.json")).build(); + public static final HttpResponse LIST_ZONES_RESPONSE = HttpResponse.builder().statusCode(200) .payload(staticPayloadFromResource("/zone_list.json")).build(); - public void testGetZoneResponseIs2xx() throws Exception { diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiLiveTest.java index 73fd9ecef..612ba8d34 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiLiveTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiLiveTest.java @@ -16,8 +16,14 @@ */ package org.jclouds.googlecomputeengine.features; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; + +import java.util.Iterator; +import java.util.List; + import org.jclouds.collect.IterableWithMarker; import org.jclouds.collect.PagedIterable; import org.jclouds.googlecomputeengine.domain.Zone; @@ -25,13 +31,8 @@ import org.jclouds.googlecomputeengine.options.ListOptions; import org.testng.annotations.Test; -import java.util.Iterator; -import java.util.List; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertSame; -import static org.testng.Assert.assertTrue; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; /** * @author David Alves diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneOperationApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneOperationApiExpectTest.java new file mode 100644 index 000000000..d5d536238 --- /dev/null +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneOperationApiExpectTest.java @@ -0,0 +1,196 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jclouds.googlecomputeengine.features; + +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_READONLY_SCOPE; +import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.COMPUTE_SCOPE; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + +import java.net.URI; + +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.googlecomputeengine.domain.ListPage; +import org.jclouds.googlecomputeengine.domain.Operation; +import org.jclouds.googlecomputeengine.domain.Resource; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiExpectTest; +import org.jclouds.googlecomputeengine.options.ListOptions; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + +/** + * @author David Alves + */ +@Test(groups = "unit") +public class ZoneOperationApiExpectTest extends BaseGoogleComputeEngineApiExpectTest { + + private static final String OPERATIONS_URL_PREFIX = "https://www.googleapis" + + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations"; + + public static final HttpRequest GET_ZONE_OPERATION_REQUEST = HttpRequest + .builder() + .method("GET") + .endpoint(OPERATIONS_URL_PREFIX + "/operation-1354084865060-4cf88735faeb8-bbbb12cb") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + public static final HttpResponse GET_ZONE_OPERATION_RESPONSE = HttpResponse.builder().statusCode(200) + .payload(staticPayloadFromResource("/zone_operation.json")).build(); + + private Operation expected() { + SimpleDateFormatDateService dateService = new SimpleDateFormatDateService(); + return Operation.builder().id("13053095055850848306") + .selfLink(URI.create("https://www.googleapis" + + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations/operation-1354084865060-4cf88735faeb8" + + "-bbbb12cb")) + .name("operation-1354084865060-4cf88735faeb8-bbbb12cb") + .targetLink(URI.create("https://www.googleapis" + + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/instance-api-live-test-instance")) + .targetId("13053094017547040099") + .status(Operation.Status.DONE) + .user("user@developer.gserviceaccount.com") + .progress(100) + .insertTime(dateService.iso8601DateParse("2012-11-28T06:41:05.060")) + .startTime(dateService.iso8601DateParse("2012-11-28T06:41:05.142")) + .endTime(dateService.iso8601DateParse("2012-11-28T06:41:06.142")) + .operationType("insert") + .zone(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a")) + .build(); + } + + private ListPage expectedList() { + return ListPage.builder() + .kind(Resource.Kind.OPERATION_LIST) + .id("projects/myproject/zones/us-central1-a/operations") + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations")) + .addItem(expected()) + .build(); + } + + public void testGetOperationResponseIs2xx() throws Exception { + + ZoneOperationApi zoneOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_ZONE_OPERATION_REQUEST, GET_ZONE_OPERATION_RESPONSE).getZoneOperationApiForProject("myproject"); + + assertEquals(zoneOperationApi.getInZone("us-central1-a", "operation-1354084865060-4cf88735faeb8-bbbb12cb"), + expected()); + } + + public void testGetOperationResponseIs4xx() throws Exception { + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + ZoneOperationApi zoneOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, GET_ZONE_OPERATION_REQUEST, operationResponse).getZoneOperationApiForProject("myproject"); + + assertNull(zoneOperationApi.getInZone("us-central1-a", "operation-1354084865060-4cf88735faeb8-bbbb12cb")); + } + + public void testDeleteOperationResponseIs2xx() throws Exception { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint(OPERATIONS_URL_PREFIX + "/operation-1352178598164-4cdcc9d031510-4aa46279") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(204).build(); + + ZoneOperationApi zoneOperationApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, operationResponse).getZoneOperationApiForProject("myproject"); + + zoneOperationApi.deleteInZone("us-central1-a", "operation-1352178598164-4cdcc9d031510-4aa46279"); + } + + public void testDeleteOperationResponseIs4xx() throws Exception { + HttpRequest delete = HttpRequest + .builder() + .method("DELETE") + .endpoint(OPERATIONS_URL_PREFIX + "/operation-1352178598164-4cdcc9d031510-4aa46279") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + ZoneOperationApi zoneOperationApi = requestsSendResponses(requestForScopes(COMPUTE_SCOPE), + TOKEN_RESPONSE, delete, operationResponse).getZoneOperationApiForProject("myproject"); + + zoneOperationApi.deleteInZone("us-central1-a", "operation-1352178598164-4cdcc9d031510-4aa46279"); + } + + public void testListOperationWithNoOptionsResponseIs2xx() { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint(OPERATIONS_URL_PREFIX) + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation_list.json")).build(); + + ZoneOperationApi zoneOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getZoneOperationApiForProject("myproject"); + + assertEquals(zoneOperationApi.listFirstPageInZone("us-central1-a").toString(), + expectedList().toString()); + } + + public void testListOperationWithPaginationOptionsResponseIs2xx() { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint(OPERATIONS_URL_PREFIX + + "?pageToken=CglPUEVSQVRJT04SOzU5MDQyMTQ4Nzg1Mi5vcG" + + "VyYXRpb24tMTM1MjI0NDI1ODAzMC00Y2RkYmU2YTJkNmIwLWVkMzIyMzQz&" + + "filter=" + + "status%20eq%20done&" + + "maxResults=3") + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(200) + .payload(payloadFromResource("/zone_operation_list.json")).build(); + + ZoneOperationApi zoneOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getZoneOperationApiForProject("myproject"); + + assertEquals(zoneOperationApi.listAtMarkerInZone("us-central1-a", + "CglPUEVSQVRJT04SOzU5MDQyMTQ4Nzg1Mi5vcGVyYXRpb24tMTM1Mj" + + "I0NDI1ODAzMC00Y2RkYmU2YTJkNmIwLWVkMzIyMzQz", + new ListOptions.Builder().filter("status eq done").maxResults(3)).toString(), + expectedList().toString()); + } + + public void testListOperationWithPaginationOptionsResponseIs4xx() { + HttpRequest get = HttpRequest + .builder() + .method("GET") + .endpoint(OPERATIONS_URL_PREFIX) + .addHeader("Accept", "application/json") + .addHeader("Authorization", "Bearer " + TOKEN).build(); + + HttpResponse operationResponse = HttpResponse.builder().statusCode(404).build(); + + ZoneOperationApi zoneOperationApi = requestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE), + TOKEN_RESPONSE, get, operationResponse).getZoneOperationApiForProject("myproject"); + + assertTrue(zoneOperationApi.listInZone("us-central1-a").concat().isEmpty()); + } + + +} diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandlerTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandlerTest.java index e4f4cbbb8..ccad32175 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandlerTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/handlers/GoogleComputeEngineErrorHandlerTest.java @@ -16,20 +16,20 @@ */ package org.jclouds.googlecomputeengine.handlers; -import org.easymock.IArgumentMatcher; -import org.jclouds.http.HttpCommand; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpResponse; -import org.testng.annotations.Test; - -import java.net.URI; - import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.reportMatcher; import static org.easymock.EasyMock.verify; +import java.net.URI; + +import org.easymock.IArgumentMatcher; +import org.jclouds.http.HttpCommand; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.testng.annotations.Test; + /** * @author Adrian Cole */ @@ -40,7 +40,7 @@ public class GoogleComputeEngineErrorHandlerTest { public void test409MakesIllegalStateException() { assertCodeMakes( "POST", - URI.create("https://www.googleapis.com/compute/v1beta13"), + URI.create("https://www.googleapis.com/compute/v1beta15"), 409, "HTTP/1.1 409 Conflict", "\"{\"code\":\"InvalidState\",\"message\":\"An incompatible transition has already been queued for this" + diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiExpectTest.java index f6760fbf3..ae7be6a8a 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiExpectTest.java @@ -16,10 +16,10 @@ */ package org.jclouds.googlecomputeengine.internal; -import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; - import java.util.Properties; +import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; + /** * @author Adrian Cole */ 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 07a8fabf2..e76699b09 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 @@ -36,6 +36,7 @@ import com.google.inject.Key; import com.google.inject.Module; import com.google.inject.TypeLiteral; +import com.google.inject.name.Names; /** @@ -43,11 +44,14 @@ */ public class BaseGoogleComputeEngineApiLiveTest extends BaseApiLiveTest { - protected static final String API_URL_PREFIX = "https://www.googleapis.com/compute/v1beta13/projects/"; + protected static final String API_URL_PREFIX = "https://www.googleapis.com/compute/v1beta15/projects/"; protected static final String ZONE_API_URL_SUFFIX = "/zones/"; protected static final String DEFAULT_ZONE_NAME = "us-central1-a"; - protected static final String NETWORK_API_URL_SUFFIX = "/networks/"; + protected static final String REGION_API_URL_SUFFIX = "/region/"; + protected static final String DEFAULT_REGION_NAME = "us-central1"; + + protected static final String NETWORK_API_URL_SUFFIX = "/global/networks/"; protected static final String DEFAULT_NETWORK_NAME = "live-test-network"; protected static final String MACHINE_TYPE_API_URL_SUFFIX = "/machineTypes/"; @@ -56,7 +60,8 @@ public class BaseGoogleComputeEngineApiLiveTest extends BaseApiLiveTest userProject; - protected Predicate> operationDonePredicate; + protected Predicate> globalOperationDonePredicate; + protected Predicate> zoneOperationDonePredicate; public BaseGoogleComputeEngineApiLiveTest() { @@ -67,20 +72,33 @@ protected GoogleComputeEngineApi create(Properties props, Iterable modul Injector injector = newBuilder().modules(modules).overrides(props).buildInjector(); userProject = injector.getInstance(Key.get(new TypeLiteral>() { }, UserProject.class)); - operationDonePredicate = injector.getInstance(Key.get(new TypeLiteral>>() { - })); + globalOperationDonePredicate = injector.getInstance(Key.get(new TypeLiteral>>() { + }, Names.named("global"))); + zoneOperationDonePredicate = injector.getInstance(Key.get(new TypeLiteral>>() { + }, Names.named("zone"))); return injector.getInstance(GoogleComputeEngineApi.class); } - protected Operation assertOperationDoneSucessfully(Operation operation, long maxWaitSeconds) { - operation = waitOperationDone(operation, maxWaitSeconds); + protected Operation assertGlobalOperationDoneSucessfully(Operation operation, long maxWaitSeconds) { + operation = waitGlobalOperationDone(operation, maxWaitSeconds); + assertEquals(operation.getStatus(), Operation.Status.DONE); + assertTrue(operation.getErrors().isEmpty()); + return operation; + } + + protected Operation waitGlobalOperationDone(Operation operation, long maxWaitSeconds) { + return waitOperationDone(globalOperationDonePredicate, operation, maxWaitSeconds); + } + + protected Operation assertZoneOperationDoneSucessfully(Operation operation, long maxWaitSeconds) { + operation = waitZoneOperationDone(operation, maxWaitSeconds); assertEquals(operation.getStatus(), Operation.Status.DONE); assertTrue(operation.getErrors().isEmpty()); return operation; } - protected Operation waitOperationDone(Operation operation, long maxWaitSeconds) { - return waitOperationDone(operationDonePredicate, operation, maxWaitSeconds); + protected Operation waitZoneOperationDone(Operation operation, long maxWaitSeconds) { + return waitOperationDone(zoneOperationDonePredicate, operation, maxWaitSeconds); } protected URI getDefaultZoneUrl(String project) { @@ -99,22 +117,24 @@ protected URI getNetworkUrl(String project, String network) { return URI.create(API_URL_PREFIX + project + NETWORK_API_URL_SUFFIX + network); } - protected URI getDefaultMachineTypekUrl(String project) { - return gettMachineTypeUrl(project, DEFAULT_MACHINE_TYPE_NAME); + protected URI getDefaultMachineTypeUrl(String project) { + return getMachineTypeUrl(project, DEFAULT_MACHINE_TYPE_NAME); } - protected URI gettMachineTypeUrl(String project, String machineType) { - return URI.create(API_URL_PREFIX + project + MACHINE_TYPE_API_URL_SUFFIX + machineType); + protected URI getMachineTypeUrl(String project, String machineType) { + return URI.create(API_URL_PREFIX + project + ZONE_API_URL_SUFFIX + + DEFAULT_ZONE_NAME + MACHINE_TYPE_API_URL_SUFFIX + machineType); } protected URI getDiskUrl(String project, String diskName) { - return URI.create(API_URL_PREFIX + project + "/disks/" + diskName); + return URI.create(API_URL_PREFIX + project + ZONE_API_URL_SUFFIX + + DEFAULT_ZONE_NAME + "/disks/" + diskName); } protected static Operation waitOperationDone(Predicate> operationDonePredicate, Operation operation, long maxWaitSeconds) { AtomicReference operationReference = new AtomicReference(operation); - retry(operationDonePredicate, maxWaitSeconds, 1, SECONDS).apply(operationReference); + retry(operationDonePredicate, maxWaitSeconds, 1, SECONDS).apply(operationReference); return operationReference.get(); } } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineExpectTest.java index 7ca8ac176..bb2eec1ef 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineExpectTest.java @@ -16,25 +16,19 @@ */ package org.jclouds.googlecomputeengine.internal; -import com.google.common.base.Joiner; -import com.google.common.base.Supplier; -import com.google.common.base.Ticker; -import com.google.inject.Binder; -import com.google.inject.Module; -import com.google.inject.TypeLiteral; -import org.jclouds.collect.PagedIterable; -import org.jclouds.collect.PagedIterables; -import org.jclouds.crypto.Crypto; -import org.jclouds.googlecomputeengine.domain.ListPage; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpResponse; -import org.jclouds.io.Payload; -import org.jclouds.oauth.v2.OAuthConstants; -import org.jclouds.rest.internal.BaseRestApiExpectTest; -import org.jclouds.ssh.SshKeys; -import org.jclouds.util.Strings2; +import static com.google.common.base.Charsets.UTF_8; +import static com.google.common.base.Throwables.propagate; +import static com.google.common.io.BaseEncoding.base64Url; +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.expect; +import static org.easymock.EasyMock.expectLastCall; +import static org.easymock.EasyMock.replay; +import static org.jclouds.crypto.Pems.privateKeySpec; +import static org.jclouds.crypto.Pems.publicKeySpec; +import static org.jclouds.crypto.PemsTest.PRIVATE_KEY; +import static org.jclouds.crypto.PemsTest.PUBLIC_KEY; +import static org.jclouds.io.Payloads.newStringPayload; -import javax.ws.rs.core.MediaType; import java.io.IOException; import java.net.URI; import java.security.KeyFactory; @@ -49,18 +43,26 @@ import java.util.Properties; import java.util.concurrent.atomic.AtomicInteger; -import static com.google.common.base.Charsets.UTF_8; -import static com.google.common.base.Throwables.propagate; -import static com.google.common.io.BaseEncoding.base64Url; -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.expectLastCall; -import static org.easymock.EasyMock.replay; -import static org.jclouds.crypto.Pems.privateKeySpec; -import static org.jclouds.crypto.Pems.publicKeySpec; -import static org.jclouds.crypto.PemsTest.PRIVATE_KEY; -import static org.jclouds.crypto.PemsTest.PUBLIC_KEY; -import static org.jclouds.io.Payloads.newStringPayload; +import javax.ws.rs.core.MediaType; + +import org.jclouds.collect.PagedIterable; +import org.jclouds.collect.PagedIterables; +import org.jclouds.crypto.Crypto; +import org.jclouds.googlecomputeengine.domain.ListPage; +import org.jclouds.http.HttpRequest; +import org.jclouds.http.HttpResponse; +import org.jclouds.io.Payload; +import org.jclouds.oauth.v2.OAuthConstants; +import org.jclouds.rest.internal.BaseRestApiExpectTest; +import org.jclouds.ssh.SshKeys; +import org.jclouds.util.Strings2; + +import com.google.common.base.Joiner; +import com.google.common.base.Supplier; +import com.google.common.base.Ticker; +import com.google.inject.Binder; +import com.google.inject.Module; +import com.google.inject.TypeLiteral; /** * @author Adrian Cole @@ -151,6 +153,17 @@ protected Properties setupProperties() { return props; } + @Override + protected HttpRequestComparisonType compareHttpRequestAsType(HttpRequest input) { + HttpRequestComparisonType reqType = HttpRequestComparisonType.DEFAULT; + if (input.getPayload() != null) { + if (input.getPayload().getContentMetadata().getContentType().equals(MediaType.APPLICATION_JSON)) { + reqType = HttpRequestComparisonType.JSON; + } + } + return reqType; + } + protected HttpRequest requestForScopes(String... scopes) { String claims = String.format(CLAIMS_TEMPLATE, Joiner.on(",").join(scopes)); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineParseTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineParseTest.java index e24e27981..5dfa34c0a 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineParseTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineParseTest.java @@ -16,12 +16,13 @@ */ package org.jclouds.googlecomputeengine.internal; -import com.google.inject.Guice; -import com.google.inject.Injector; import org.jclouds.googlecomputeengine.config.GoogleComputeEngineParserModule; import org.jclouds.json.BaseItemParserTest; import org.jclouds.json.config.GsonModule; +import com.google.inject.Guice; +import com.google.inject.Injector; + /** * @author David Alves */ diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineServiceContextExpectTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineServiceContextExpectTest.java index 12caaf688..21ddff370 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineServiceContextExpectTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineServiceContextExpectTest.java @@ -16,15 +16,16 @@ */ package org.jclouds.googlecomputeengine.internal; -import com.google.common.base.Function; -import com.google.inject.Module; +import java.util.Properties; + import org.jclouds.apis.ApiMetadata; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.googlecomputeengine.GoogleComputeEngineApiMetadata; import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpResponse; -import java.util.Properties; +import com.google.common.base.Function; +import com.google.inject.Module; /** * @author David Alves diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskListTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskListTest.java index ebde5e443..7b83d8ef8 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskListTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskListTest.java @@ -16,7 +16,11 @@ */ package org.jclouds.googlecomputeengine.parse; -import com.google.common.collect.ImmutableSet; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Disk; import org.jclouds.googlecomputeengine.domain.ListPage; @@ -24,9 +28,7 @@ import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; +import com.google.common.collect.ImmutableSet; /** * @author David Alves @@ -44,17 +46,17 @@ public String resource() { public ListPage expected() { return ListPage.builder() .kind(Resource.Kind.DISK_LIST) - .id("projects/myproject/disks") - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/disks")) + .id("projects/myproject/zones/us-central1-a/disks") + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks")) .items(ImmutableSet.of(Disk.builder() .id("13050421646334304115") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-11-25T01:38:48.306")) .selfLink(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/disks/testimage1")) + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/testimage1")) .name("testimage1") .sizeGb(1) .zone(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/zones/us-central1-a")) + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a")) .status("READY") .build()) ).build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskTest.java index 31a9501f2..83cea8d18 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskTest.java @@ -16,15 +16,16 @@ */ package org.jclouds.googlecomputeengine.parse; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Disk; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; - /** * @author David Alves */ @@ -42,10 +43,10 @@ public Disk expected() { return Disk.builder() .id("13050421646334304115") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-11-25T01:38:48.306")) - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/disks/testimage1")) + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/testimage1")) .name("testimage1") .sizeGb(1) - .zone(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a")) + .zone(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a")) .status("READY") .build(); } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallListTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallListTest.java index 1f0b39e0e..a90f17bfc 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallListTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallListTest.java @@ -16,7 +16,11 @@ */ package org.jclouds.googlecomputeengine.parse; -import com.google.common.collect.ImmutableSet; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Firewall; import org.jclouds.googlecomputeengine.domain.ListPage; @@ -24,9 +28,7 @@ import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; +import com.google.common.collect.ImmutableSet; /** * @author David Alves @@ -45,18 +47,18 @@ public ListPage expected() { return ListPage.builder() .kind(Resource.Kind.FIREWALL_LIST) .id("projects/google/firewalls") - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/google/firewalls")) + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/google/global/firewalls")) .items(ImmutableSet.of( new ParseFirewallTest().expected() , Firewall.builder() .id("12862241067393040785") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-04-13T03:05:04.365")) .selfLink(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/firewalls/default-ssh")) + ".com/compute/v1beta15/projects/google/global/firewalls/default-ssh")) .name("default-ssh") .description("SSH allowed from anywhere") .network(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/networks/default")) + ".com/compute/v1beta15/projects/google/global/networks/default")) .addSourceRange("0.0.0.0/0") .addAllowed(Firewall.Rule.builder() .IPProtocol(Firewall.Rule.IPProtocol.TCP) diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallTest.java index 1b9b8e2f9..187380feb 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallTest.java @@ -16,16 +16,17 @@ */ package org.jclouds.googlecomputeengine.parse; -import org.jclouds.date.internal.SimpleDateFormatDateService; -import org.jclouds.googlecomputeengine.domain.Firewall; -import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; -import org.testng.annotations.Test; +import static org.jclouds.googlecomputeengine.domain.Firewall.Rule.IPProtocol; + +import java.net.URI; import javax.ws.rs.Consumes; import javax.ws.rs.core.MediaType; -import java.net.URI; -import static org.jclouds.googlecomputeengine.domain.Firewall.Rule.IPProtocol; +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.googlecomputeengine.domain.Firewall; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; +import org.testng.annotations.Test; /** * @author David Alves @@ -44,10 +45,10 @@ public Firewall expected() { return Firewall.builder() .id("12862241031274216284") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-04-13T03:05:02.855")) - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/firewalls/jclouds-test")) + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/firewalls/jclouds-test")) .name("jclouds-test") .description("Internal traffic from default allowed") - .network(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/jclouds-test")) + .network(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/jclouds-test")) .addSourceRange("10.0.0.0/8") .addAllowed(Firewall.Rule.builder() .IPProtocol(IPProtocol.TCP) diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageListTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageListTest.java index 245f0d206..c288079c7 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageListTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageListTest.java @@ -16,7 +16,11 @@ */ package org.jclouds.googlecomputeengine.parse; -import com.google.common.collect.ImmutableSet; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Image; import org.jclouds.googlecomputeengine.domain.ListPage; @@ -24,9 +28,7 @@ import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; +import com.google.common.collect.ImmutableSet; /** * @author David Alves @@ -44,18 +46,22 @@ public String resource() { public ListPage expected() { return ListPage.builder() .kind(Resource.Kind.IMAGE_LIST) - .id("projects/google/images") - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/google/images")) + .id("projects/google/global/images") + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/google/global/images")) .items(ImmutableSet.of(Image.builder() .id("12941197498378735318") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-07-16T22:16:13.468")) .selfLink(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/images/centos-6-2-v20120326")) + ".com/compute/v1beta15/projects/google/global/images/centos-6-2-v20120326")) .name("centos-6-2-v20120326") .description("DEPRECATED. CentOS 6.2 image; Created Mon, 26 Mar 2012 21:19:09 +0000") .sourceType("RAW") .preferredKernel(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/kernels/gce-20120326")) + ".com/compute/v1beta15/projects/google/kernels/gce-20120326")) + .deprecated(Image.Deprecated.builder() + .state("DEPRECATED") + .replacement(URI.create("https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-v20130104")) + .build()) .rawDisk( Image.RawDisk.builder() .source("") diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageTest.java index 22c0016f5..a62e59add 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageTest.java @@ -16,15 +16,16 @@ */ package org.jclouds.googlecomputeengine.parse; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Image; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; - /** * @author David Alves */ @@ -42,13 +43,13 @@ public Image expected() { return Image.builder() .id("12941197498378735318") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-07-16T22:16:13.468")) - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/google/images/centos-6-2" + + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-2" + "-v20120326")) .name("centos-6-2-v20120326") .description("DEPRECATED. CentOS 6.2 image; Created Mon, 26 Mar 2012 21:19:09 +0000") .sourceType("RAW") .preferredKernel(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/kernels/gce-20120326")) + ".com/compute/v1beta15/projects/google/kernels/gce-20120326")) .rawDisk( Image.RawDisk.builder() .source("") diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceListTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceListTest.java index 9917914fe..3bd010d5d 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceListTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceListTest.java @@ -16,15 +16,17 @@ */ package org.jclouds.googlecomputeengine.parse; -import com.google.common.collect.ImmutableSet; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.googlecomputeengine.domain.Instance; import org.jclouds.googlecomputeengine.domain.ListPage; import org.jclouds.googlecomputeengine.domain.Resource; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; +import com.google.common.collect.ImmutableSet; /** * @author David Alves @@ -41,8 +43,8 @@ public String resource() { public ListPage expected() { return ListPage.builder() .kind(Resource.Kind.INSTANCE_LIST) - .id("projects/myproject/instances") - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/instances")) + .id("projects/myproject/zones/us-central1-a/instances") + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances")) .items(ImmutableSet.of(new ParseInstanceTest().expected())) .build(); } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceSerialOutputTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceSerialOutputTest.java index f6091ba36..c64fca3e6 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceSerialOutputTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceSerialOutputTest.java @@ -16,12 +16,12 @@ */ package org.jclouds.googlecomputeengine.parse; -import org.jclouds.googlecomputeengine.domain.Instance; -import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; - import javax.ws.rs.Consumes; import javax.ws.rs.core.MediaType; +import org.jclouds.googlecomputeengine.domain.Instance; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; + /** * @author David Alves */ diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceTest.java index 1940f86d9..efff80977 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceTest.java @@ -16,14 +16,16 @@ */ package org.jclouds.googlecomputeengine.parse; -import com.google.common.collect.ImmutableMap; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Instance; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; +import com.google.common.collect.ImmutableMap; /** * @author David Alves @@ -42,21 +44,21 @@ public Instance expected() { .id("13051190678907570425") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-11-25T23:48:20.758")) .selfLink(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/instances/test-0")) + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/test-0")) .description("desc") .name("test-0") .image(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/images/gcel-12-04-v20121106")) - .machineType(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes/n1" + + ".com/compute/v1beta15/projects/google/global/images/gcel-12-04-v20121106")) + .machineType(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1" + "-standard-1")) .status(Instance.Status.RUNNING) - .zone(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a")) + .zone(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a")) .addNetworkInterface( Instance.NetworkInterface.builder() .name("nic0") .networkIP("10.240.121.115") .network(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/networks/default")) + ".com/compute/v1beta15/projects/myproject/global/networks/default")) .build() ) .addDisk( @@ -65,10 +67,10 @@ public Instance expected() { .mode(Instance.PersistentAttachedDisk.Mode.READ_WRITE) .deviceName("test") .source(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/disks/test")) + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/test")) .build() ) - .addTag("aTag") + .tags(Instance.Tags.builder().fingerprint("abcd").addItem("aTag").build()) .metadata(ImmutableMap.of("aKey", "aValue")) .addServiceAccount(Instance.ServiceAccount.builder().email("default").addScopes("myscope").build()) .build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseKernelListTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseKernelListTest.java index 67f7069b0..7f330385d 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseKernelListTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseKernelListTest.java @@ -16,7 +16,11 @@ */ package org.jclouds.googlecomputeengine.parse; -import com.google.common.collect.ImmutableSet; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Kernel; import org.jclouds.googlecomputeengine.domain.ListPage; @@ -24,9 +28,7 @@ import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; +import com.google.common.collect.ImmutableSet; /** * @author David Alves @@ -44,15 +46,15 @@ public String resource() { public ListPage expected() { return ListPage.builder() .kind(Resource.Kind.KERNEL_LIST) - .id("projects/google/kernels") - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/google/kernels")) + .id("projects/google/global/kernels") + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/google/global/kernels")) .items(ImmutableSet.of( Kernel.builder() .id("12941177846308850718") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse ("2012-07-16T21:42:16.950")) .selfLink(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/kernels/gce-20110524")) + ".com/compute/v1beta15/projects/google/global/kernels/gce-20110524")) .name("gce-20110524") .description("DEPRECATED. Created Tue, 24 May 2011 00:48:22 +0000").build(), Kernel.builder() @@ -60,7 +62,7 @@ public ListPage expected() { .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse ("2012-07-16T21:42:31.166")) .selfLink(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/google/kernels/gce-20110728")) + ".com/compute/v1beta15/projects/google/global/kernels/gce-20110728")) .name("gce-20110728") .description("DEPRECATED. Created Thu, 28 Jul 2011 16:44:38 +0000").build() )).build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseKernelTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseKernelTest.java index b857d8b08..84fdd8967 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseKernelTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseKernelTest.java @@ -16,15 +16,16 @@ */ package org.jclouds.googlecomputeengine.parse; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Kernel; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; - /** * @author David Alves */ @@ -42,7 +43,7 @@ public Kernel expected() { return Kernel.builder() .id("12941177846308850718") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-07-16T21:42:16.950")) - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20110524")) + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/google/global/kernels/gce-20110524")) .name("gce-20110524") .description("DEPRECATED. Created Tue, 24 May 2011 00:48:22 +0000") .build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeListTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeListTest.java index 980437766..e854d6b8b 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeListTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeListTest.java @@ -16,16 +16,17 @@ */ package org.jclouds.googlecomputeengine.parse; -import org.jclouds.date.internal.SimpleDateFormatDateService; -import org.jclouds.googlecomputeengine.domain.ListPage; -import org.jclouds.googlecomputeengine.domain.MachineType; -import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; +import static org.jclouds.googlecomputeengine.domain.Resource.Kind.MACHINE_TYPE_LIST; + +import java.net.URI; import javax.ws.rs.Consumes; import javax.ws.rs.core.MediaType; -import java.net.URI; -import static org.jclouds.googlecomputeengine.domain.Resource.Kind.MACHINE_TYPE_LIST; +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.googlecomputeengine.domain.ListPage; +import org.jclouds.googlecomputeengine.domain.MachineType; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; /** * @author David Alves @@ -45,12 +46,27 @@ public ListPage expected() { return ListPage.builder() .kind(MACHINE_TYPE_LIST) .id("projects/myproject/machineTypes") - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes")) + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes")) + .addItem(MachineType.builder() + .id("4618642685664990776") + .creationTimestamp(dateService.iso8601DateParse("2013-04-25T13:32:49.088-07:00")) + .selfLink(URI.create("https://www.googleapis" + + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/f1-micro")) + .zone("us-central1-a") + .name("f1-micro") + .description("1 vCPU (shared physical core) and 0.6 GB RAM") + .guestCpus(1) + .memoryMb(614) + .imageSpaceGb(0) + .maximumPersistentDisks(4) + .maximumPersistentDisksSizeGb(3072) + .build()) .addItem(MachineType.builder() .id("12907738072351752276") .creationTimestamp(dateService.iso8601DateParse("2012-06-07T20:48:14.670")) .selfLink(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1")) + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1")) + .zone("us-central1-a") .name("n1-standard-1") .description("1 vCPU, 3.75 GB RAM, and a 10 GB ephemeral root disk") .guestCpus(1) @@ -63,15 +79,16 @@ public ListPage expected() { .id("12908560709887590691") .creationTimestamp(dateService.iso8601DateParse("2012-06-07T20:51:19.936")) .selfLink(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-8-d")) + ".com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-8-d")) + .zone("us-central1-a") .name("n1-standard-8-d") .description("8 vCPUs, 30 GB RAM, a 10 GB ephemeral root disk, " + "and 2 extra 1770 GB ephemeral disks") .guestCpus(8) .memoryMb(30720) .imageSpaceGb(10) - .addEphemeralDisk(1770) - .addEphemeralDisk(1770) + .addScratchDisk(1770) + .addScratchDisk(1770) .maximumPersistentDisks(16) .maximumPersistentDisksSizeGb(1024) .build()) diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeTest.java index b53c445ab..e55cd5c3e 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeTest.java @@ -16,13 +16,14 @@ */ package org.jclouds.googlecomputeengine.parse; -import org.jclouds.date.internal.SimpleDateFormatDateService; -import org.jclouds.googlecomputeengine.domain.MachineType; -import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; +import java.net.URI; import javax.ws.rs.Consumes; import javax.ws.rs.core.MediaType; -import java.net.URI; + +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.googlecomputeengine.domain.MachineType; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; /** * @author David Alves @@ -42,15 +43,16 @@ public MachineType expected() { return MachineType.builder() .id("12907738072351752276") .creationTimestamp(dateService.iso8601DateParse("2012-06-07T20:48:14.670")) - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes/n1" + + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1" + "-standard-1")) + .zone("us-central1-a") .name("n1-standard-1") .description("1 vCPU, 3.75 GB RAM, and a 10 GB ephemeral root disk") .guestCpus(1) .memoryMb(3840) .imageSpaceGb(10) - .addEphemeralDisk(1770) - .addEphemeralDisk(1770) + .addScratchDisk(1770) + .addScratchDisk(1770) .maximumPersistentDisks(16) .maximumPersistentDisksSizeGb(128) .build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMetadataTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMetadataTest.java index 52defb736..a4483ab74 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMetadataTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMetadataTest.java @@ -16,13 +16,14 @@ */ package org.jclouds.googlecomputeengine.parse; -import com.google.common.collect.ImmutableMap; +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.googlecomputeengine.config.GoogleComputeEngineParserModule; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; +import com.google.common.collect.ImmutableMap; /** * @author David Alves diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkListTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkListTest.java index 1d2c78fca..b271e91f6 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkListTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkListTest.java @@ -16,15 +16,17 @@ */ package org.jclouds.googlecomputeengine.parse; -import com.google.common.collect.ImmutableSet; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.googlecomputeengine.domain.ListPage; import org.jclouds.googlecomputeengine.domain.Network; import org.jclouds.googlecomputeengine.domain.Resource; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; +import com.google.common.collect.ImmutableSet; /** * @author David Alves @@ -42,7 +44,7 @@ public ListPage expected() { return ListPage.builder() .kind(Resource.Kind.NETWORK_LIST) .id("projects/myproject/networks") - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks")) + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/networks")) .items(ImmutableSet.of(new ParseNetworkTest().expected())) .build(); diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkTest.java index 4a4592add..da6992a2e 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkTest.java @@ -16,13 +16,14 @@ */ package org.jclouds.googlecomputeengine.parse; -import org.jclouds.date.internal.SimpleDateFormatDateService; -import org.jclouds.googlecomputeengine.domain.Network; -import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; +import java.net.URI; import javax.ws.rs.Consumes; import javax.ws.rs.core.MediaType; -import java.net.URI; + +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.googlecomputeengine.domain.Network; +import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; /** * @author David Alves @@ -40,7 +41,7 @@ public Network expected() { return Network.builder() .id("13024414170909937976") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-10-24T20:13:19.967")) - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/jclouds-test")) + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/networks/jclouds-test")) .name("default") .description("Default network for the project") .IPv4Range("10.0.0.0/8") diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseOperationListTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseOperationListTest.java index d8e1e2605..c62b49a1a 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseOperationListTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseOperationListTest.java @@ -16,15 +16,16 @@ */ package org.jclouds.googlecomputeengine.parse; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.googlecomputeengine.domain.ListPage; import org.jclouds.googlecomputeengine.domain.Operation; import org.jclouds.googlecomputeengine.domain.Resource; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; - /** * @author David Alves */ @@ -32,7 +33,7 @@ public class ParseOperationListTest extends BaseGoogleComputeEngineParseTest expected() { return ListPage.builder() .kind(Resource.Kind.OPERATION_LIST) - .id("projects/myproject/operations") - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/operations")) + .id("projects/myproject/global/operations") + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/global/operations")) .addItem(new ParseOperationTest().expected()) .build(); } diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseOperationTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseOperationTest.java index 081303871..c3b1e90cc 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseOperationTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseOperationTest.java @@ -16,15 +16,16 @@ */ package org.jclouds.googlecomputeengine.parse; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Operation; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; - /** * @author David Alves */ @@ -33,7 +34,7 @@ public class ParseOperationTest extends BaseGoogleComputeEngineParseTest expected() { return ListPage.builder() .kind(Resource.Kind.ZONE_LIST) .id("projects/myproject/zones") - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/zones")) + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones")) .items(ImmutableSet.of( new ParseZoneTest().expected() , Zone.builder() @@ -53,9 +55,9 @@ public ListPage expected() { .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse ("2012-10-24T20:13:19.271")) .selfLink(URI.create("https://www.googleapis" + - ".com/compute/v1beta13/projects/myproject/zones/us-east1-a")) - .name("us-east1-a") - .description("us-east1-a") + ".com/compute/v1beta15/projects/myproject/zones/us-central1-b")) + .name("us-central1-b") + .description("us-central1-b") .status(Zone.Status.UP) .addMaintenanceWindow(Zone.MaintenanceWindow.builder() .name("2013-02-17-planned-outage") diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseZoneTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseZoneTest.java index 105bd016d..60a0b04a9 100644 --- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseZoneTest.java +++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseZoneTest.java @@ -16,15 +16,16 @@ */ package org.jclouds.googlecomputeengine.parse; +import java.net.URI; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.googlecomputeengine.domain.Zone; import org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest; import org.testng.annotations.Test; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import java.net.URI; - /** * @author David Alves */ @@ -42,7 +43,7 @@ public Zone expected() { return Zone.builder() .id("13020128040171887099") .creationTimestamp(new SimpleDateFormatDateService().iso8601DateParse("2012-10-19T16:42:54.131")) - .selfLink(URI.create("https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a")) + .selfLink(URI.create("https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a")) .name("us-central1-a") .description("us-central1-a") .status(Zone.Status.DOWN) diff --git a/google-compute-engine/src/test/resources/disk_get.json b/google-compute-engine/src/test/resources/disk_get.json index 5c7ce0c25..4e351cee2 100644 --- a/google-compute-engine/src/test/resources/disk_get.json +++ b/google-compute-engine/src/test/resources/disk_get.json @@ -1,10 +1,10 @@ { - "kind": "compute#disk", - "id": "13050421646334304115", - "creationTimestamp": "2012-11-25T01:38:48.306", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/disks/testimage1", - "name": "testimage1", - "sizeGb": "1", - "zone": "https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a", - "status": "READY" + "kind": "compute#disk", + "id": "13050421646334304115", + "creationTimestamp": "2012-11-25T01:38:48.306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/testimage1", + "name": "testimage1", + "sizeGb": "1", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a", + "status": "READY" } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/disk_insert.json b/google-compute-engine/src/test/resources/disk_insert.json index 82522a7ef..8699cdd81 100644 --- a/google-compute-engine/src/test/resources/disk_insert.json +++ b/google-compute-engine/src/test/resources/disk_insert.json @@ -1 +1 @@ -{"name":"testimage1","sizeGb":1,"zone":"https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a"} \ No newline at end of file +{"name":"testimage1","sizeGb":1} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/disk_list.json b/google-compute-engine/src/test/resources/disk_list.json index 8b09831d7..6836907a1 100644 --- a/google-compute-engine/src/test/resources/disk_list.json +++ b/google-compute-engine/src/test/resources/disk_list.json @@ -1,17 +1,17 @@ { - "kind": "compute#diskList", - "id": "projects/myproject/disks", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/disks", - "items": [ - { - "kind": "compute#disk", - "id": "13050421646334304115", - "creationTimestamp": "2012-11-25T01:38:48.306", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/disks/testimage1", - "name": "testimage1", - "sizeGb": "1", - "zone": "https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a", - "status": "READY" - } - ] + "kind": "compute#diskList", + "id": "projects/myproject/zones/us-central1-a/disks", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks", + "items": [ + { + "kind": "compute#disk", + "id": "13050421646334304115", + "creationTimestamp": "2012-11-25T01:38:48.306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/testimage1", + "name": "testimage1", + "sizeGb": "1", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a", + "status": "READY" + } + ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/firewall_get.json b/google-compute-engine/src/test/resources/firewall_get.json index cb981dd29..dbf4e90ac 100644 --- a/google-compute-engine/src/test/resources/firewall_get.json +++ b/google-compute-engine/src/test/resources/firewall_get.json @@ -1,30 +1,30 @@ { - "kind": "compute#firewall", - "id": "12862241031274216284", - "creationTimestamp": "2012-04-13T03:05:02.855", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/firewalls/jclouds-test", - "name": "jclouds-test", - "description": "Internal traffic from default allowed", - "network": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/jclouds-test", - "sourceRanges": [ - "10.0.0.0/8" - ], - "allowed": [ - { - "IPProtocol": "tcp", - "ports": [ - "1-65535" + "kind": "compute#firewall", + "id": "12862241031274216284", + "creationTimestamp": "2012-04-13T03:05:02.855", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/firewalls/jclouds-test", + "name": "jclouds-test", + "description": "Internal traffic from default allowed", + "network": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/jclouds-test", + "sourceRanges": [ + "10.0.0.0/8" + ], + "allowed": [ + { + "IPProtocol": "tcp", + "ports": [ + "1-65535" + ] + }, + { + "IPProtocol": "udp", + "ports": [ + "1-65535" + ] + }, + { + "IPProtocol": "icmp" + } ] - }, - { - "IPProtocol": "udp", - "ports": [ - "1-65535" - ] - }, - { - "IPProtocol": "icmp" - } - ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/firewall_insert.json b/google-compute-engine/src/test/resources/firewall_insert.json index 0f6ddfa6a..b9d0a9a41 100644 --- a/google-compute-engine/src/test/resources/firewall_insert.json +++ b/google-compute-engine/src/test/resources/firewall_insert.json @@ -1 +1 @@ -{"name":"%s","network":"https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/%s","sourceRanges":[%s],"sourceTags":[%s],"targetTags":[%s],"allowed":[{"IPProtocol":"tcp","ports":[%s]}]} \ No newline at end of file +{"name":"%s","network":"https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/%s","sourceRanges":[%s],"sourceTags":[%s],"targetTags":[%s],"allowed":[{"IPProtocol":"tcp","ports":[%s]}]} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/firewall_list.json b/google-compute-engine/src/test/resources/firewall_list.json index 3bb1b2258..6fe7da829 100644 --- a/google-compute-engine/src/test/resources/firewall_list.json +++ b/google-compute-engine/src/test/resources/firewall_list.json @@ -1,58 +1,58 @@ { - "kind": "compute#firewallList", - "id": "projects/google/firewalls", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/firewalls", - "items": [ - { + "kind": "compute#firewallList", + "id": "projects/google/firewalls", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/firewalls", + "items": [ + { - "kind": "compute#firewall", - "id": "12862241031274216284", - "creationTimestamp": "2012-04-13T03:05:02.855", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/firewalls/jclouds-test", - "name": "jclouds-test", - "description": "Internal traffic from default allowed", - "network": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/jclouds-test", - "sourceRanges": [ - "10.0.0.0/8" - ], - "allowed": [ - { - "IPProtocol": "tcp", - "ports": [ - "1-65535" - ] - }, - { - "IPProtocol": "udp", - "ports": [ - "1-65535" - ] - }, - { - "IPProtocol": "icmp" - } - ] - }, - { + "kind": "compute#firewall", + "id": "12862241031274216284", + "creationTimestamp": "2012-04-13T03:05:02.855", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/firewalls/jclouds-test", + "name": "jclouds-test", + "description": "Internal traffic from default allowed", + "network": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/jclouds-test", + "sourceRanges": [ + "10.0.0.0/8" + ], + "allowed": [ + { + "IPProtocol": "tcp", + "ports": [ + "1-65535" + ] + }, + { + "IPProtocol": "udp", + "ports": [ + "1-65535" + ] + }, + { + "IPProtocol": "icmp" + } + ] + }, + { - "kind": "compute#firewall", - "id": "12862241067393040785", - "creationTimestamp": "2012-04-13T03:05:04.365", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/firewalls/default-ssh", - "name": "default-ssh", - "description": "SSH allowed from anywhere", - "network": "https://www.googleapis.com/compute/v1beta13/projects/google/networks/default", - "sourceRanges": [ - "0.0.0.0/0" - ], - "allowed": [ - { - "IPProtocol": "tcp", - "ports": [ - "22" - ] - } + "kind": "compute#firewall", + "id": "12862241067393040785", + "creationTimestamp": "2012-04-13T03:05:04.365", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/firewalls/default-ssh", + "name": "default-ssh", + "description": "SSH allowed from anywhere", + "network": "https://www.googleapis.com/compute/v1beta15/projects/google/global/networks/default", + "sourceRanges": [ + "0.0.0.0/0" + ], + "allowed": [ + { + "IPProtocol": "tcp", + "ports": [ + "22" + ] + } + ] + } ] - } - ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/global_operation.json b/google-compute-engine/src/test/resources/global_operation.json new file mode 100644 index 000000000..c949699dd --- /dev/null +++ b/google-compute-engine/src/test/resources/global_operation.json @@ -0,0 +1,15 @@ +{ + "kind": "compute#operation", + "id": "13053095055850848306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/firewalls/jclouds-test-delete", + "targetId": "13053094017547040099", + "status": "DONE", + "user": "user@developer.gserviceaccount.com", + "progress": 100, + "insertTime": "2012-11-28T06:41:05.060", + "startTime": "2012-11-28T06:41:05.142", + "endTime": "2012-11-28T06:41:06.142", + "operationType": "insert" +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/global_operation_list.json b/google-compute-engine/src/test/resources/global_operation_list.json new file mode 100644 index 000000000..f3c6ecda2 --- /dev/null +++ b/google-compute-engine/src/test/resources/global_operation_list.json @@ -0,0 +1,22 @@ +{ + "kind": "compute#operationList", + "id": "projects/myproject/global/operations", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/operations", + "items": [ + { + "kind": "compute#operation", + "id": "13053095055850848306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/firewalls/jclouds-test-delete", + "targetId": "13053094017547040099", + "status": "DONE", + "user": "user@developer.gserviceaccount.com", + "progress": 100, + "insertTime": "2012-11-28T06:41:05.060", + "startTime": "2012-11-28T06:41:05.142", + "endTime": "2012-11-28T06:41:06.142", + "operationType": "insert" + } + ] +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/image_get.json b/google-compute-engine/src/test/resources/image_get.json index 79d358e9b..eaadc4ed8 100644 --- a/google-compute-engine/src/test/resources/image_get.json +++ b/google-compute-engine/src/test/resources/image_get.json @@ -1,14 +1,14 @@ { - "kind": "compute#image", - "id": "12941197498378735318", - "creationTimestamp": "2012-07-16T22:16:13.468", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/centos-6-2-v20120326", - "name": "centos-6-2-v20120326", - "description": "DEPRECATED. CentOS 6.2 image; Created Mon, 26 Mar 2012 21:19:09 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20120326", - "rawDisk": { - "source": "", - "containerType": "TAR" - } -} \ No newline at end of file + "kind": "compute#image", + "id": "12941197498378735318", + "creationTimestamp": "2012-07-16T22:16:13.468", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-2-v20120326", + "name": "centos-6-2-v20120326", + "description": "DEPRECATED. CentOS 6.2 image; Created Mon, 26 Mar 2012 21:19:09 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-20120326", + "rawDisk": { + "source": "", + "containerType": "TAR" + } +} diff --git a/google-compute-engine/src/test/resources/image_insert.json b/google-compute-engine/src/test/resources/image_insert.json index 787ffde56..fd030a74c 100644 --- a/google-compute-engine/src/test/resources/image_insert.json +++ b/google-compute-engine/src/test/resources/image_insert.json @@ -1 +1,4 @@ -{"sourceType":"RAW","rawDisk":{"source":"https://storage.googleapis.com/mybuket/myimage.image.tar.gz","containerType":"TAR"},"kind":"compute#image","name":"myimage"} \ No newline at end of file +{"sourceType": "RAW", "rawDisk": { + "source": "https://storage.googleapis.com/mybuket/myimage.image.tar.gz", + "containerType": "TAR" +}, "kind": "compute#image", "name": "myimage"} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/image_list.json b/google-compute-engine/src/test/resources/image_list.json index 6095b29b9..cb7653359 100644 --- a/google-compute-engine/src/test/resources/image_list.json +++ b/google-compute-engine/src/test/resources/image_list.json @@ -1,21 +1,25 @@ { - "kind": "compute#imageList", - "id": "projects/google/images", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images", - "items": [ - { - "kind": "compute#image", - "id": "12941197498378735318", - "creationTimestamp": "2012-07-16T22:16:13.468", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/centos-6-2-v20120326", - "name": "centos-6-2-v20120326", - "description": "DEPRECATED. CentOS 6.2 image; Created Mon, 26 Mar 2012 21:19:09 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20120326", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - } - ] -} \ No newline at end of file + "kind": "compute#imageList", + "id": "projects/google/global/images", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images", + "items": [ + { + "kind": "compute#image", + "id": "12941197498378735318", + "creationTimestamp": "2012-07-16T22:16:13.468", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-2-v20120326", + "name": "centos-6-2-v20120326", + "description": "DEPRECATED. CentOS 6.2 image; Created Mon, 26 Mar 2012 21:19:09 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-20120326", + "deprecated": { + "state": "DEPRECATED", + "replacement": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-v20130104" + }, + "rawDisk": { + "source": "", + "containerType": "TAR" + } + } + ] +} diff --git a/google-compute-engine/src/test/resources/image_list_multiple_page_1.json b/google-compute-engine/src/test/resources/image_list_multiple_page_1.json index afb794c1c..950613d79 100644 --- a/google-compute-engine/src/test/resources/image_list_multiple_page_1.json +++ b/google-compute-engine/src/test/resources/image_list_multiple_page_1.json @@ -1,50 +1,58 @@ { - "kind": "compute#imageList", - "id": "projects/google/images", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images", - "nextPageToken": "CgVJTUFHRRIbZ29vZ2xlLmNlbnRvcy02LTItdjIwMTIwNjIx", - "items": [ - { - "kind": "compute#image", - "id": "12941197498378735318", - "creationTimestamp": "2012-07-16T15:16:13.468-07:00", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/centos-6-2-v20120326", - "name": "centos-6-2-v20120326", - "description": "DEPRECATED. CentOS 6.2 image; Created Mon, 26 Mar 2012 21:19:09 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20120326", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - }, - { - "kind": "compute#image", - "id": "12894486577628239762", - "creationTimestamp": "2012-05-21T13:15:37.215-07:00", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/centos-6-2-v20120503", - "name": "centos-6-2-v20120503", - "description": "CentOS 6.2; Created Wed, 09 May 2012 11:55:54 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20120326", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - }, - { - "kind": "compute#image", - "id": "12917726455664967299", - "creationTimestamp": "2012-06-18T11:05:30.664-07:00", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/centos-6-2-v20120611", - "name": "centos-6-2-v20120611", - "description": "CentOS 6.2; Created Mon, 11 Jun 2012 13:15:44 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20120611", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - } - ] -} \ No newline at end of file + "kind": "compute#imageList", + "id": "projects/google/global/images", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images", + "nextPageToken": "CgVJTUFHRRIbZ29vZ2xlLmNlbnRvcy02LTItdjIwMTIwNjIx", + "items": [ + { + "kind": "compute#image", + "id": "12941197498378735318", + "creationTimestamp": "2012-07-16T15:16:13.468-07:00", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-2-v20120326", + "name": "centos-6-2-v20120326", + "description": "DEPRECATED. CentOS 6.2 image; Created Mon, 26 Mar 2012 21:19:09 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-20120326", + "deprecated": { + "state": "DELETED", + "replacement": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-v20130104" + }, + "rawDisk": { + "source": "", + "containerType": "TAR" + } + }, + { + "kind": "compute#image", + "id": "12894486577628239762", + "creationTimestamp": "2012-05-21T13:15:37.215-07:00", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-2-v20120503", + "name": "centos-6-2-v20120503", + "description": "CentOS 6.2; Created Wed, 09 May 2012 11:55:54 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-20120326", + "rawDisk": { + "source": "", + "containerType": "TAR" + } + }, + { + "kind": "compute#image", + "id": "12917726455664967299", + "creationTimestamp": "2012-06-18T11:05:30.664-07:00", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-2-v20120611", + "name": "centos-6-2-v20120611", + "description": "CentOS 6.2; Created Mon, 11 Jun 2012 13:15:44 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-20120611", + "deprecated": { + "state": "DEPRECATED", + "replacement": "https://www.googleapis.com/compute/v1beta15/projects/debian-cloud/global/images/debian-7-wheezy-20130509" + }, + "rawDisk": { + "source": "", + "containerType": "TAR" + } + } + ] +} diff --git a/google-compute-engine/src/test/resources/image_list_multiple_page_2.json b/google-compute-engine/src/test/resources/image_list_multiple_page_2.json index 71529d5ed..e48986860 100644 --- a/google-compute-engine/src/test/resources/image_list_multiple_page_2.json +++ b/google-compute-engine/src/test/resources/image_list_multiple_page_2.json @@ -1,50 +1,50 @@ { - "kind": "compute#imageList", - "id": "projects/google/images", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images", - "nextPageToken": "CgVJTUFHRRIbZ29vZ2xlLmdjZWwtMTAtMDQtdjIwMTIxMTA2", - "items": [ - { - "kind": "compute#image", - "id": "12920641029336858796", - "creationTimestamp": "2012-06-21T22:59:56.392-07:00", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/centos-6-2-v20120621", - "name": "centos-6-2-v20120621", - "description": "CentOS 6.2; Created Thu, 21 Jun 2012 14:22:21 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20120621", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - }, - { - "kind": "compute#image", - "id": "12994279803511049620", - "creationTimestamp": "2012-09-18T08:52:47.584-07:00", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/centos-6-v20120912", - "name": "centos-6-v20120912", - "description": "CentOS 6; Created Wed, 12 Sep 2012 00:00:00 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-v20120912", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - }, - { - "kind": "compute#image", - "id": "13037720516378381209", - "creationTimestamp": "2012-11-09T11:40:41.079-08:00", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/centos-6-v20121106", - "name": "centos-6-v20121106", - "description": "SCSI-enabled CentOS 6; Created Tue, 06 Nov 2012 00:00:00 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-v20121106", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - } - ] -} \ No newline at end of file + "kind": "compute#imageList", + "id": "projects/google/global/images", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images", + "nextPageToken": "CgVJTUFHRRIbZ29vZ2xlLmdjZWwtMTAtMDQtdjIwMTIxMTA2", + "items": [ + { + "kind": "compute#image", + "id": "12920641029336858796", + "creationTimestamp": "2012-06-21T22:59:56.392-07:00", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-2-v20120621", + "name": "centos-6-2-v20120621", + "description": "CentOS 6.2; Created Thu, 21 Jun 2012 14:22:21 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-20120621", + "rawDisk": { + "source": "", + "containerType": "TAR" + } + }, + { + "kind": "compute#image", + "id": "12994279803511049620", + "creationTimestamp": "2012-09-18T08:52:47.584-07:00", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-v20120912", + "name": "centos-6-v20120912", + "description": "CentOS 6; Created Wed, 12 Sep 2012 00:00:00 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-v20120912", + "rawDisk": { + "source": "", + "containerType": "TAR" + } + }, + { + "kind": "compute#image", + "id": "13037720516378381209", + "creationTimestamp": "2012-11-09T11:40:41.079-08:00", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/centos-6-v20121106", + "name": "centos-6-v20121106", + "description": "SCSI-enabled CentOS 6; Created Tue, 06 Nov 2012 00:00:00 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-v20121106", + "rawDisk": { + "source": "", + "containerType": "TAR" + } + } + ] +} diff --git a/google-compute-engine/src/test/resources/image_list_single_page.json b/google-compute-engine/src/test/resources/image_list_single_page.json index b28f9a608..ab11b0d54 100644 --- a/google-compute-engine/src/test/resources/image_list_single_page.json +++ b/google-compute-engine/src/test/resources/image_list_single_page.json @@ -1,49 +1,53 @@ { - "kind": "compute#imageList", - "id": "projects/google/images", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images", - "items": [ - { - "kind": "compute#image", - "id": "13037722963789596520", - "creationTimestamp": "2012-11-09T11:43:28.749-08:00", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/gcel-10-04-v20121106", - "name": "gcel-10-04-v20121106", - "description": "SCSI-enabled GCEL 10.04 LTS; Created Tue, 06 Nov 2012 00:00:00 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-v20121106", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - }, - { - "kind": "compute#image", - "id": "13037721421359523565", - "creationTimestamp": "2012-11-09T11:40:51.994-08:00", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/gcel-12-04-v20121106", - "name": "gcel-12-04-v20121106", - "description": "SCSI-enabled GCEL 12.04 LTS; Created Tue, 06 Nov 2012 00:00:00 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-v20121106", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - }, - { - "kind": "compute#image", - "id": "12941198995845323366", - "creationTimestamp": "2012-07-16T15:18:50.405-07:00", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/images/ubuntu-10-04-v20110728", - "name": "ubuntu-10-04-v20110728", - "description": "DEPRECATED. GCEL 10.04 LTS; Created Thu, 28 Jul 2011 16:45:51 +0000", - "sourceType": "RAW", - "preferredKernel": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20110728", - "rawDisk": { - "source": "", - "containerType": "TAR" - } - } - ] -} \ No newline at end of file + "kind": "compute#imageList", + "id": "projects/google/global/images", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images", + "items": [ + { + "kind": "compute#image", + "id": "13037722963789596520", + "creationTimestamp": "2012-11-09T11:43:28.749-08:00", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/gcel-10-04-v20121106", + "name": "gcel-10-04-v20121106", + "description": "SCSI-enabled GCEL 10.04 LTS; Created Tue, 06 Nov 2012 00:00:00 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-v20121106", + "rawDisk": { + "source": "", + "containerType": "TAR" + } + }, + { + "kind": "compute#image", + "id": "13037721421359523565", + "creationTimestamp": "2012-11-09T11:40:51.994-08:00", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/gcel-12-04-v20121106", + "name": "gcel-12-04-v20121106", + "description": "SCSI-enabled GCEL 12.04 LTS; Created Tue, 06 Nov 2012 00:00:00 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-v20121106", + "rawDisk": { + "source": "", + "containerType": "TAR" + } + }, + { + "kind": "compute#image", + "id": "12941198995845323366", + "creationTimestamp": "2012-07-16T15:18:50.405-07:00", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/ubuntu-10-04-v20110728", + "name": "ubuntu-10-04-v20110728", + "description": "DEPRECATED. GCEL 10.04 LTS; Created Thu, 28 Jul 2011 16:45:51 +0000", + "sourceType": "RAW", + "preferredKernel": "https://www.googleapis.com/compute/v1beta15/projects/google/kernels/gce-20110728", + "deprecated": { + "state": "DELETED", + "replacement": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/gcel-10-04-v20130104" + }, + "rawDisk": { + "source": "", + "containerType": "TAR" + } + } + ] +} diff --git a/google-compute-engine/src/test/resources/instance_add_access_config.json b/google-compute-engine/src/test/resources/instance_add_access_config.json index 7530a7e76..8edaf8a50 100644 --- a/google-compute-engine/src/test/resources/instance_add_access_config.json +++ b/google-compute-engine/src/test/resources/instance_add_access_config.json @@ -1,11 +1,11 @@ -POST https://www.googleapis.com/compute/v1beta13/projects/jclouds-gce/instances/test-instance/addAccessConfig?network_interface=nic0&key={YOUR_API_KEY} +POST https://www.googleapis.com/compute/v1beta15/projects/jclouds-gce/zones/us-central1-a/instances/test-instance/addAccessConfig?network_interface=nic0&key={YOUR_API_KEY} Content-Type: application/json Authorization: Bearer ya29.AHES6ZRyNKVHwnMPUvZitAuA8mR8b0lcWh1bMI5UQ5bgsJ4j X-JavaScript-User-Agent: Google APIs Explorer { - "name": "config1", - "natIP": "10.0.1.1", - "type": "ONE_TO_ONE_NAT" +"name": "config1", +"natIP": "10.0.1.1", +"type": "ONE_TO_ONE_NAT" } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/instance_get.json b/google-compute-engine/src/test/resources/instance_get.json index 19ca0c33d..3111f93d6 100644 --- a/google-compute-engine/src/test/resources/instance_get.json +++ b/google-compute-engine/src/test/resources/instance_get.json @@ -1,50 +1,53 @@ { - "kind": "compute#instance", - "id": "13051190678907570425", - "description": "desc", - "creationTimestamp": "2012-11-25T23:48:20.758", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/instances/test-0", - "name": "test-0", - "image": "https://www.googleapis.com/compute/v1beta13/projects/google/images/gcel-12-04-v20121106", - "machineType": "https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1", - "status": "RUNNING", - "zone": "https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a", - "networkInterfaces": [ - { - "kind": "compute#instanceNetworkInterface", - "name": "nic0", - "networkIP": "10.240.121.115", - "network": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/default" - } - ], - "disks": [ - { - "kind": "compute#instanceDisk", - "type": "PERSISTENT", - "mode": "READ_WRITE", - "deviceName": "test", - "source": "https://www.googleapis.com/compute/v1beta13/projects/myproject/disks/test", - "index": 0 - } - ], - "serviceAccounts": [ - { - "kind": "compute#serviceAccount", - "email": "default", - "scopes": [ - "myscope" - ] - } - ], - "metadata": { - "items": [ - { - "key": "aKey", - "value": "aValue" - } - ] - }, - "tags": [ - "aTag" - ] -} \ No newline at end of file + "kind": "compute#instance", + "id": "13051190678907570425", + "description": "desc", + "creationTimestamp": "2012-11-25T23:48:20.758", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/test-0", + "name": "test-0", + "image": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/gcel-12-04-v20121106", + "machineType": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1", + "status": "RUNNING", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a", + "networkInterfaces": [ + { + "kind": "compute#instanceNetworkInterface", + "name": "nic0", + "networkIP": "10.240.121.115", + "network": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/default" + } + ], + "disks": [ + { + "kind": "compute#instanceDisk", + "type": "PERSISTENT", + "mode": "READ_WRITE", + "deviceName": "test", + "source": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/test", + "index": 0 + } + ], + "serviceAccounts": [ + { + "kind": "compute#serviceAccount", + "email": "default", + "scopes": [ + "myscope" + ] + } + ], + "metadata": { + "items": [ + { + "key": "aKey", + "value": "aValue" + } + ] + }, + "tags": { + "items": [ + "aTag" + ], + "fingerprint": "abcd" + } +} diff --git a/google-compute-engine/src/test/resources/instance_insert.json b/google-compute-engine/src/test/resources/instance_insert.json index 6ec1efb5c..f62608261 100644 --- a/google-compute-engine/src/test/resources/instance_insert.json +++ b/google-compute-engine/src/test/resources/instance_insert.json @@ -1 +1 @@ -{"name":"test-0","description":"desc","machineType":"https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1","zone":"https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a","image":"https://www.googleapis.com/compute/v1beta13/projects/google/images/gcel-12-04-v20121106","tags":["aTag"],"serviceAccounts":[{"email":"default","scopes":["myscope"]}],"networkInterfaces":[{"network":"https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/default","accessConfigs":[{"type":"ONE_TO_ONE_NAT"}]}],"disks":[{"mode":"READ_WRITE","source":"https://www.googleapis.com/compute/v1beta13/projects/myproject/disks/test","type":"PERSISTENT"}],"metadata":{"kind":"compute#metadata","items":[{"key":"aKey","value":"aValue"}]}} \ No newline at end of file +{"name":"test-0","description":"desc","machineType":"https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1","image":"https://www.googleapis.com/compute/v1beta15/projects/google/global/images/gcel-12-04-v20121106","serviceAccounts":[{"email":"default","scopes":["myscope"]}],"networkInterfaces":[{"network":"https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/default","accessConfigs":[{"type":"ONE_TO_ONE_NAT"}]}],"disks":[{"mode":"READ_WRITE","source":"https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/test","type":"PERSISTENT"}],"metadata":{"kind":"compute#metadata","items":[{"key":"aKey","value":"aValue"}]}} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/instance_insert_simple.json b/google-compute-engine/src/test/resources/instance_insert_simple.json index 78b3e05f3..83b2b7ae1 100644 --- a/google-compute-engine/src/test/resources/instance_insert_simple.json +++ b/google-compute-engine/src/test/resources/instance_insert_simple.json @@ -1 +1 @@ -{"name":"test-1","machineType":"https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1","zone":"https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a","tags":[],"serviceAccounts":[],"networkInterfaces":[{"network":"https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/default","accessConfigs":[]}]} \ No newline at end of file +{"name":"test-1","machineType":"https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1","image":"https://www.googleapis.com/compute/v1beta15/projects/google/global/images/gcel-12-04-v20121106","serviceAccounts":[],"networkInterfaces":[{"network":"https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/default","accessConfigs":[]}]} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/instance_list.json b/google-compute-engine/src/test/resources/instance_list.json index fb3db8bd8..2df42a5d9 100644 --- a/google-compute-engine/src/test/resources/instance_list.json +++ b/google-compute-engine/src/test/resources/instance_list.json @@ -1,57 +1,60 @@ { - "kind": "compute#instanceList", - "id": "projects/myproject/instances", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/instances", - "items": [ -{ - "kind": "compute#instance", - "id": "13051190678907570425", - "description": "desc", - "creationTimestamp": "2012-11-25T23:48:20.758", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/instances/test-0", - "name": "test-0", - "image": "https://www.googleapis.com/compute/v1beta13/projects/google/images/gcel-12-04-v20121106", - "machineType": "https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1", - "status": "RUNNING", - "zone": "https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a", - "networkInterfaces": [ - { - "kind": "compute#instanceNetworkInterface", - "name": "nic0", - "networkIP": "10.240.121.115", - "network": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/default" - } - ], - "disks": [ - { - "kind": "compute#instanceDisk", - "type": "PERSISTENT", - "mode": "READ_WRITE", - "deviceName": "test", - "source": "https://www.googleapis.com/compute/v1beta13/projects/myproject/disks/test", - "index": 0 - } - ], - "serviceAccounts": [ - { - "kind": "compute#serviceAccount", - "email": "default", - "scopes": [ - "myscope" - ] - } - ], - "metadata": { + "kind": "compute#instanceList", + "id": "projects/myproject/zones/us-central1-a/instances", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances", "items": [ - { - "key": "aKey", - "value": "aValue" - } + { + "kind": "compute#instance", + "id": "13051190678907570425", + "description": "desc", + "creationTimestamp": "2012-11-25T23:48:20.758", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/test-0", + "name": "test-0", + "image": "https://www.googleapis.com/compute/v1beta15/projects/google/global/images/gcel-12-04-v20121106", + "machineType": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1", + "status": "RUNNING", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a", + "networkInterfaces": [ + { + "kind": "compute#instanceNetworkInterface", + "name": "nic0", + "networkIP": "10.240.121.115", + "network": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/networks/default" + } + ], + "disks": [ + { + "kind": "compute#instanceDisk", + "type": "PERSISTENT", + "mode": "READ_WRITE", + "deviceName": "test", + "source": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/test", + "index": 0 + } + ], + "serviceAccounts": [ + { + "kind": "compute#serviceAccount", + "email": "default", + "scopes": [ + "myscope" + ] + } + ], + "metadata": { + "items": [ + { + "key": "aKey", + "value": "aValue" + } + ] + }, + "tags": { + "items": [ + "aTag" + ], + "fingerprint": "abcd" + } + } ] - }, - "tags": [ - "aTag" - ] - } - ] -} \ No newline at end of file +} diff --git a/google-compute-engine/src/test/resources/instance_list_central1b_empty.json b/google-compute-engine/src/test/resources/instance_list_central1b_empty.json new file mode 100644 index 000000000..dcdc60915 --- /dev/null +++ b/google-compute-engine/src/test/resources/instance_list_central1b_empty.json @@ -0,0 +1,6 @@ +{ + "kind": "compute#instanceList", + "id": "projects/myproject/zones/us-central1-b/instances", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-b/instances", + "items": [ ] +} diff --git a/google-compute-engine/src/test/resources/instance_serial_port.json b/google-compute-engine/src/test/resources/instance_serial_port.json index 5813ce979..03280cca8 100644 --- a/google-compute-engine/src/test/resources/instance_serial_port.json +++ b/google-compute-engine/src/test/resources/instance_serial_port.json @@ -1,4 +1,4 @@ { - "kind": "compute#serialPortOutput", - "contents": "console output" + "kind": "compute#serialPortOutput", + "contents": "console output" } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/kernel.json b/google-compute-engine/src/test/resources/kernel.json index a30b7a7e0..e304e088c 100644 --- a/google-compute-engine/src/test/resources/kernel.json +++ b/google-compute-engine/src/test/resources/kernel.json @@ -1,8 +1,8 @@ { - "kind": "compute#kernel", - "id": "12941177846308850718", - "creationTimestamp": "2012-07-16T21:42:16.950", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20110524", - "name": "gce-20110524", - "description": "DEPRECATED. Created Tue, 24 May 2011 00:48:22 +0000" + "kind": "compute#kernel", + "id": "12941177846308850718", + "creationTimestamp": "2012-07-16T21:42:16.950", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/kernels/gce-20110524", + "name": "gce-20110524", + "description": "DEPRECATED. Created Tue, 24 May 2011 00:48:22 +0000" } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/kernel_list.json b/google-compute-engine/src/test/resources/kernel_list.json index 7c5ce61ba..3fb0aa759 100644 --- a/google-compute-engine/src/test/resources/kernel_list.json +++ b/google-compute-engine/src/test/resources/kernel_list.json @@ -1,23 +1,23 @@ { - "kind": "compute#kernelList", - "id": "projects/google/kernels", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels", - "items": [ - { - "kind": "compute#kernel", - "id": "12941177846308850718", - "creationTimestamp": "2012-07-16T21:42:16.950", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20110524", - "name": "gce-20110524", - "description": "DEPRECATED. Created Tue, 24 May 2011 00:48:22 +0000" - }, - { - "kind": "compute#kernel", - "id": "12941177983348179280", - "creationTimestamp": "2012-07-16T21:42:31.166", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/google/kernels/gce-20110728", - "name": "gce-20110728", - "description": "DEPRECATED. Created Thu, 28 Jul 2011 16:44:38 +0000" - } - ] + "kind": "compute#kernelList", + "id": "projects/google/global/kernels", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/kernels", + "items": [ + { + "kind": "compute#kernel", + "id": "12941177846308850718", + "creationTimestamp": "2012-07-16T21:42:16.950", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/kernels/gce-20110524", + "name": "gce-20110524", + "description": "DEPRECATED. Created Tue, 24 May 2011 00:48:22 +0000" + }, + { + "kind": "compute#kernel", + "id": "12941177983348179280", + "creationTimestamp": "2012-07-16T21:42:31.166", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/google/global/kernels/gce-20110728", + "name": "gce-20110728", + "description": "DEPRECATED. Created Thu, 28 Jul 2011 16:44:38 +0000" + } + ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/logback.xml b/google-compute-engine/src/test/resources/logback.xml index dd4223c0d..771038c73 100644 --- a/google-compute-engine/src/test/resources/logback.xml +++ b/google-compute-engine/src/test/resources/logback.xml @@ -16,23 +16,50 @@ + + target/test-data/jclouds-compute.log + + + %d %-5p [%c] [%thread] %m%n + + + + + target/test-data/jclouds-ssh.log + + + %d %-5p [%c] [%thread] %m%n + + + - + - - + + - - + + - - + + + + + + + + + + + + + diff --git a/google-compute-engine/src/test/resources/machinetype.json b/google-compute-engine/src/test/resources/machinetype.json index 6f225723a..5aa902a6d 100644 --- a/google-compute-engine/src/test/resources/machinetype.json +++ b/google-compute-engine/src/test/resources/machinetype.json @@ -1,21 +1,22 @@ { - "kind": "compute#machineType", - "id": "12907738072351752276", - "creationTimestamp": "2012-06-07T20:48:14.670", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1", - "name": "n1-standard-1", - "description": "1 vCPU, 3.75 GB RAM, and a 10 GB ephemeral root disk", - "guestCpus": 1, - "memoryMb": 3840, - "imageSpaceGb": 10, - "ephemeralDisks": [ - { - "diskGb": 1770 - }, - { - "diskGb": 1770 - } - ], - "maximumPersistentDisks": 16, - "maximumPersistentDisksSizeGb": "128" + "kind": "compute#machineType", + "id": "12907738072351752276", + "creationTimestamp": "2012-06-07T20:48:14.670", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1", + "name": "n1-standard-1", + "description": "1 vCPU, 3.75 GB RAM, and a 10 GB ephemeral root disk", + "guestCpus": 1, + "memoryMb": 3840, + "imageSpaceGb": 10, + "scratchDisks": [ + { + "diskGb": 1770 + }, + { + "diskGb": 1770 + } + ], + "maximumPersistentDisks": 16, + "maximumPersistentDisksSizeGb": "128", + "zone": "us-central1-a" } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/machinetype_list.json b/google-compute-engine/src/test/resources/machinetype_list.json index 14e7318ac..0506a0e68 100644 --- a/google-compute-engine/src/test/resources/machinetype_list.json +++ b/google-compute-engine/src/test/resources/machinetype_list.json @@ -1,41 +1,57 @@ { - "kind": "compute#machineTypeList", - "id": "projects/myproject/machineTypes", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes", - "items": [ - { - "kind": "compute#machineType", - "id": "12907738072351752276", - "creationTimestamp": "2012-06-07T20:48:14.670", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-1", - "name": "n1-standard-1", - "description": "1 vCPU, 3.75 GB RAM, and a 10 GB ephemeral root disk", - "guestCpus": 1, - "memoryMb": 3840, - "imageSpaceGb": 10, - "maximumPersistentDisks": 16, - "maximumPersistentDisksSizeGb": "128" - }, - { - "kind": "compute#machineType", - "id": "12908560709887590691", - "creationTimestamp": "2012-06-07T20:51:19.936", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/machineTypes/n1-standard-8-d", - "name": "n1-standard-8-d", - "description": "8 vCPUs, 30 GB RAM, a 10 GB ephemeral root disk, and 2 extra 1770 GB ephemeral disks", - "guestCpus": 8, - "memoryMb": 30720, - "imageSpaceGb": 10, - "ephemeralDisks": [ - { - "diskGb": 1770 - }, - { - "diskGb": 1770 - } - ], - "maximumPersistentDisks": 16, - "maximumPersistentDisksSizeGb": "1024" - } - ] + "kind": "compute#machineTypeList", + "id": "projects/myproject/machineTypes", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes", + "items": [ + { + "kind": "compute#machineType", + "id": "4618642685664990776", + "creationTimestamp": "2013-04-25T13:32:49.088-07:00", + "name": "f1-micro", + "description": "1 vCPU (shared physical core) and 0.6 GB RAM", + "guestCpus": 1, + "memoryMb": 614, + "imageSpaceGb": 0, + "maximumPersistentDisks": 4, + "maximumPersistentDisksSizeGb": "3072", + "zone": "us-central1-a", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/f1-micro" + }, + { + "kind": "compute#machineType", + "id": "12907738072351752276", + "creationTimestamp": "2012-06-07T20:48:14.670", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-1", + "name": "n1-standard-1", + "description": "1 vCPU, 3.75 GB RAM, and a 10 GB ephemeral root disk", + "guestCpus": 1, + "memoryMb": 3840, + "imageSpaceGb": 10, + "maximumPersistentDisks": 16, + "maximumPersistentDisksSizeGb": "128", + "zone": "us-central1-a" + }, + { + "kind": "compute#machineType", + "id": "12908560709887590691", + "creationTimestamp": "2012-06-07T20:51:19.936", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/machineTypes/n1-standard-8-d", + "name": "n1-standard-8-d", + "description": "8 vCPUs, 30 GB RAM, a 10 GB ephemeral root disk, and 2 extra 1770 GB ephemeral disks", + "guestCpus": 8, + "memoryMb": 30720, + "imageSpaceGb": 10, + "scratchDisks": [ + { + "diskGb": 1770 + }, + { + "diskGb": 1770 + } + ], + "maximumPersistentDisks": 16, + "maximumPersistentDisksSizeGb": "1024", + "zone": "us-central1-a" + } + ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/machinetype_list_central1b.json b/google-compute-engine/src/test/resources/machinetype_list_central1b.json new file mode 100644 index 000000000..cba2adfc3 --- /dev/null +++ b/google-compute-engine/src/test/resources/machinetype_list_central1b.json @@ -0,0 +1,43 @@ +{ + "kind": "compute#machineTypeList", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/abayer-jclouds-test1/zones/us-central1-b/machineTypes", + "id": "projects/abayer-jclouds-test1/zones/us-central1-b/machineTypes", + "items": [ + { + "kind": "compute#machineType", + "id": "12907738072351752276", + "creationTimestamp": "2012-06-07T20:48:14.670", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-b/machineTypes/n1-standard-0", + "name": "n1-standard-0", + "description": "1 vCPU, 3.75 GB RAM, and a 10 GB ephemeral root disk", + "guestCpus": 1, + "memoryMb": 3840, + "imageSpaceGb": 10, + "maximumPersistentDisks": 16, + "maximumPersistentDisksSizeGb": "128", + "zone": "us-central1-b" + }, + { + "kind": "compute#machineType", + "id": "12908560709887590691", + "creationTimestamp": "2012-06-07T20:51:19.936", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-b/machineTypes/n1-standard-8-d", + "name": "n1-standard-8-d", + "description": "8 vCPUs, 30 GB RAM, a 10 GB ephemeral root disk, and 2 extra 1770 GB ephemeral disks", + "guestCpus": 8, + "memoryMb": 30720, + "imageSpaceGb": 10, + "scratchDisks": [ + { + "diskGb": 1770 + }, + { + "diskGb": 1770 + } + ], + "maximumPersistentDisks": 16, + "maximumPersistentDisksSizeGb": "1024", + "zone": "us-central1-b" + } + ] +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/machinetype_list_central1b_empty.json b/google-compute-engine/src/test/resources/machinetype_list_central1b_empty.json new file mode 100644 index 000000000..793c9ebfa --- /dev/null +++ b/google-compute-engine/src/test/resources/machinetype_list_central1b_empty.json @@ -0,0 +1,6 @@ +{ + "kind": "compute#machineTypeList", + "id": "projects/myproject/zones/us-central1-b/machineTypes", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-b/machineTypes", + "items": [] +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/network_get.json b/google-compute-engine/src/test/resources/network_get.json index 1a6a4b1ab..87f9e5620 100644 --- a/google-compute-engine/src/test/resources/network_get.json +++ b/google-compute-engine/src/test/resources/network_get.json @@ -1,10 +1,10 @@ { - "kind": "compute#network", - "id": "13024414170909937976", - "creationTimestamp": "2012-10-24T20:13:19.967", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/jclouds-test", - "name": "default", - "description": "Default network for the project", - "IPv4Range": "10.0.0.0/8", - "gatewayIPv4": "10.0.0.1" + "kind": "compute#network", + "id": "13024414170909937976", + "creationTimestamp": "2012-10-24T20:13:19.967", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/networks/jclouds-test", + "name": "default", + "description": "Default network for the project", + "IPv4Range": "10.0.0.0/8", + "gatewayIPv4": "10.0.0.1" } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/network_list.json b/google-compute-engine/src/test/resources/network_list.json index 99ccc49b7..1cb72a1be 100644 --- a/google-compute-engine/src/test/resources/network_list.json +++ b/google-compute-engine/src/test/resources/network_list.json @@ -1,18 +1,18 @@ { - "kind": "compute#networkList", - "id": "projects/myproject/networks", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks", - "items": [ - { + "kind": "compute#networkList", + "id": "projects/myproject/networks", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/networks", + "items": [ + { - "kind": "compute#network", - "id": "13024414170909937976", - "creationTimestamp": "2012-10-24T20:13:19.967", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/networks/jclouds-test", - "name": "default", - "description": "Default network for the project", - "IPv4Range": "10.0.0.0/8", - "gatewayIPv4": "10.0.0.1" - } - ] + "kind": "compute#network", + "id": "13024414170909937976", + "creationTimestamp": "2012-10-24T20:13:19.967", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/networks/jclouds-test", + "name": "default", + "description": "Default network for the project", + "IPv4Range": "10.0.0.0/8", + "gatewayIPv4": "10.0.0.1" + } + ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/operation.json b/google-compute-engine/src/test/resources/operation.json index 68b16fbab..e173bac5b 100644 --- a/google-compute-engine/src/test/resources/operation.json +++ b/google-compute-engine/src/test/resources/operation.json @@ -1,9 +1,9 @@ { "kind": "compute#operation", "id": "13053095055850848306", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", - "targetLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/instances/instance-api-live-test-instance", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/instance-api-live-test-instance", "targetId": "13053094017547040099", "status": "DONE", "user": "user@developer.gserviceaccount.com", @@ -11,5 +11,7 @@ "insertTime": "2012-11-28T06:41:05.060", "startTime": "2012-11-28T06:41:05.142", "endTime": "2012-11-28T06:41:06.142", - "operationType": "insert" - } \ No newline at end of file + "operationType": "insert", + "region": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a" +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/operation_error.json b/google-compute-engine/src/test/resources/operation_error.json index f7f8e234f..b18ffbae2 100644 --- a/google-compute-engine/src/test/resources/operation_error.json +++ b/google-compute-engine/src/test/resources/operation_error.json @@ -1,9 +1,9 @@ { "kind": "compute#operation", "id": "13053095055850848306", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", - "targetLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/instances/instance-api-live-test-instance", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/instance-api-live-test-instance", "targetId": "13053094017547040099", "status": "DONE", "user": "user@developer.gserviceaccount.com", @@ -13,12 +13,14 @@ "httpErrorStatusCode": 400, "httpErrorMessage": "BAD REQUEST", "error": { - "errors": [ - { - "code": "RESOURCE_ALREADY_EXISTS", - "message": "The resource 'projects/myproject/instances/instance-api-live-test-instance' already exists" - } - ] + "errors": [ + { + "code": "RESOURCE_ALREADY_EXISTS", + "message": "The resource 'projects/myproject/zones/us-central1-a/instances/instance-api-live-test-instance' already exists" + } + ] }, - "operationType": "insert" - } \ No newline at end of file + "operationType": "insert", + "region": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a" +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/operation_list.json b/google-compute-engine/src/test/resources/operation_list.json index 8bc311133..75850991e 100644 --- a/google-compute-engine/src/test/resources/operation_list.json +++ b/google-compute-engine/src/test/resources/operation_list.json @@ -1,22 +1,24 @@ { - "kind": "compute#operationList", - "id": "projects/myproject/operations", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/operations", - "items": [ - { - "kind": "compute#operation", - "id": "13053095055850848306", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", - "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", - "targetLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/instances/instance-api-live-test-instance", - "targetId": "13053094017547040099", - "status": "DONE", - "user": "user@developer.gserviceaccount.com", - "progress": 100, - "insertTime": "2012-11-28T06:41:05.060", - "startTime": "2012-11-28T06:41:05.142", - "endTime": "2012-11-28T06:41:06.142", - "operationType": "insert" - } - ] + "kind": "compute#operationList", + "id": "projects/myproject/operations", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/operations", + "items": [ + { + "kind": "compute#operation", + "id": "13053095055850848306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/instance-api-live-test-instance", + "targetId": "13053094017547040099", + "status": "DONE", + "user": "user@developer.gserviceaccount.com", + "progress": 100, + "insertTime": "2012-11-28T06:41:05.060", + "startTime": "2012-11-28T06:41:05.142", + "endTime": "2012-11-28T06:41:06.142", + "operationType": "insert", + "region": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a" + } + ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/project.json b/google-compute-engine/src/test/resources/project.json index 6129ac476..50f6705a1 100644 --- a/google-compute-engine/src/test/resources/project.json +++ b/google-compute-engine/src/test/resources/project.json @@ -1,68 +1,68 @@ { - "kind": "compute#project", - "id": "13024414184846275913", - "creationTimestamp": "2012-10-24T20:13:16.252", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject", - "name": "myproject", - "description": "", - "commonInstanceMetadata": { - "kind": "compute#metadata", - "items": [ - { - "key": "propA", - "value": "valueA" + "kind": "compute#project", + "id": "13024414184846275913", + "creationTimestamp": "2012-10-24T20:13:16.252", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject", + "name": "myproject", + "description": "", + "commonInstanceMetadata": { + "kind": "compute#metadata", + "items": [ + { + "key": "propA", + "value": "valueA" + }, + { + "key": "propB", + "value": "valueB" + } + ] }, - { - "key": "propB", - "value": "valueB" - } - ] - }, - "quotas": [ - { - "metric": "INSTANCES", - "usage": 0, - "limit": 8 - }, - { - "metric": "CPUS", - "usage": 0, - "limit": 8 - }, - { - "metric": "EPHEMERAL_ADDRESSES", - "usage": 0, - "limit": 8 - }, - { - "metric": "DISKS", - "usage": 0, - "limit": 8 - }, - { - "metric": "DISKS_TOTAL_GB", - "usage": 0, - "limit": 100 - }, - { - "metric": "SNAPSHOTS", - "usage": 0, - "limit": 1000 - }, - { - "metric": "NETWORKS", - "usage": 1, - "limit": 5 - }, - { - "metric": "FIREWALLS", - "usage": 2, - "limit": 100 - }, - { - "metric": "IMAGES", - "usage": 0, - "limit": 100 - } - ] + "quotas": [ + { + "metric": "INSTANCES", + "usage": 0, + "limit": 8 + }, + { + "metric": "CPUS", + "usage": 0, + "limit": 8 + }, + { + "metric": "EPHEMERAL_ADDRESSES", + "usage": 0, + "limit": 8 + }, + { + "metric": "DISKS", + "usage": 0, + "limit": 8 + }, + { + "metric": "DISKS_TOTAL_GB", + "usage": 0, + "limit": 100 + }, + { + "metric": "SNAPSHOTS", + "usage": 0, + "limit": 1000 + }, + { + "metric": "NETWORKS", + "usage": 1, + "limit": 5 + }, + { + "metric": "FIREWALLS", + "usage": 2, + "limit": 100 + }, + { + "metric": "IMAGES", + "usage": 0, + "limit": 100 + } + ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/region_operation.json b/google-compute-engine/src/test/resources/region_operation.json new file mode 100644 index 000000000..738e1761c --- /dev/null +++ b/google-compute-engine/src/test/resources/region_operation.json @@ -0,0 +1,16 @@ +{ + "kind": "compute#operation", + "id": "13053095055850848306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1/addresses/test-address", + "targetId": "13053094017547040099", + "status": "DONE", + "user": "user@developer.gserviceaccount.com", + "progress": 100, + "insertTime": "2012-11-28T06:41:05.060", + "startTime": "2012-11-28T06:41:05.142", + "endTime": "2012-11-28T06:41:06.142", + "operationType": "insert", + "region": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1" +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/region_operation_list.json b/google-compute-engine/src/test/resources/region_operation_list.json new file mode 100644 index 000000000..047d12ff6 --- /dev/null +++ b/google-compute-engine/src/test/resources/region_operation_list.json @@ -0,0 +1,23 @@ +{ + "kind": "compute#operationList", + "id": "projects/myproject/regions/us-central1/operations", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1/operations", + "items": [ + { + "kind": "compute#operation", + "id": "13053095055850848306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1/addresses/test-address", + "targetId": "13053094017547040099", + "status": "DONE", + "user": "user@developer.gserviceaccount.com", + "progress": 100, + "insertTime": "2012-11-28T06:41:05.060", + "startTime": "2012-11-28T06:41:05.142", + "endTime": "2012-11-28T06:41:06.142", + "operationType": "insert", + "region": "https://www.googleapis.com/compute/v1beta15/projects/myproject/regions/us-central1" + } + ] +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/snapshot_get.json b/google-compute-engine/src/test/resources/snapshot_get.json new file mode 100644 index 000000000..04ff50d60 --- /dev/null +++ b/google-compute-engine/src/test/resources/snapshot_get.json @@ -0,0 +1,11 @@ +{ + "kind": "compute#snapshot", + "id": "13050421646334304999", + "creationTimestamp": "2012-11-25T01:38:48.306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/global/snapshots/testsnap1", + "name": "testsnap1", + "sizeGb": "1", + "status": "READY", + "sourceDisk": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/disks/testimage1", + "sourceDiskId": "13050421646334304115" +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/zone_get.json b/google-compute-engine/src/test/resources/zone_get.json index cf3dc0915..c64aeee78 100644 --- a/google-compute-engine/src/test/resources/zone_get.json +++ b/google-compute-engine/src/test/resources/zone_get.json @@ -1,17 +1,17 @@ { - "kind": "compute#zone", - "id": "13020128040171887099", - "creationTimestamp": "2012-10-19T16:42:54.131", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a", - "name": "us-central1-a", - "description": "us-central1-a", - "status": "DOWN", - "maintenanceWindows": [ - { - "name": "2012-11-10-planned-outage", - "description": "maintenance zone", - "beginTime": "2012-11-10T20:00:00.000", - "endTime": "2012-12-02T20:00:00.000" - } - ] + "kind": "compute#zone", + "id": "13020128040171887099", + "creationTimestamp": "2012-10-19T16:42:54.131", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a", + "name": "us-central1-a", + "description": "us-central1-a", + "status": "DOWN", + "maintenanceWindows": [ + { + "name": "2012-11-10-planned-outage", + "description": "maintenance zone", + "beginTime": "2012-11-10T20:00:00.000", + "endTime": "2012-12-02T20:00:00.000" + } + ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/zone_list.json b/google-compute-engine/src/test/resources/zone_list.json index 8d11f0d9b..fb1a6df7d 100644 --- a/google-compute-engine/src/test/resources/zone_list.json +++ b/google-compute-engine/src/test/resources/zone_list.json @@ -1,41 +1,41 @@ { - "kind": "compute#zoneList", - "id": "projects/myproject/zones", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/zones", - "items": [ - { - "kind": "compute#zone", - "id": "13020128040171887099", - "creationTimestamp": "2012-10-19T16:42:54.131", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-central1-a", - "name": "us-central1-a", - "description": "us-central1-a", - "status": "DOWN", - "maintenanceWindows": [ - { - "name": "2012-11-10-planned-outage", - "description": "maintenance zone", - "beginTime": "2012-11-10T20:00:00.000", - "endTime": "2012-12-02T20:00:00.000" - } + "kind": "compute#zoneList", + "id": "projects/myproject/zones", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones", + "items": [ + { + "kind": "compute#zone", + "id": "13020128040171887099", + "creationTimestamp": "2012-10-19T16:42:54.131", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a", + "name": "us-central1-a", + "description": "us-central1-a", + "status": "DOWN", + "maintenanceWindows": [ + { + "name": "2012-11-10-planned-outage", + "description": "maintenance zone", + "beginTime": "2012-11-10T20:00:00.000", + "endTime": "2012-12-02T20:00:00.000" + } + ] + }, + { + "kind": "compute#zone", + "id": "13024414164050619686", + "creationTimestamp": "2012-10-24T20:13:19.271", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-b", + "name": "us-central1-b", + "description": "us-central1-b", + "status": "UP", + "maintenanceWindows": [ + { + "name": "2013-02-17-planned-outage", + "description": "maintenance zone", + "beginTime": "2013-02-17T08:00:00.000", + "endTime": "2013-03-03T08:00:00.000" + } + ] + } ] - }, - { - "kind": "compute#zone", - "id": "13024414164050619686", - "creationTimestamp": "2012-10-24T20:13:19.271", - "selfLink": "https://www.googleapis.com/compute/v1beta13/projects/myproject/zones/us-east1-a", - "name": "us-east1-a", - "description": "us-east1-a", - "status": "UP", - "maintenanceWindows": [ - { - "name": "2013-02-17-planned-outage", - "description": "maintenance zone", - "beginTime": "2013-02-17T08:00:00.000", - "endTime": "2013-03-03T08:00:00.000" - } - ] - } - ] } \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/zone_list_short.json b/google-compute-engine/src/test/resources/zone_list_short.json new file mode 100644 index 000000000..5512aa0a8 --- /dev/null +++ b/google-compute-engine/src/test/resources/zone_list_short.json @@ -0,0 +1,24 @@ +{ + "kind": "compute#zoneList", + "id": "projects/myproject/zones", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones", + "items": [ + { + "kind": "compute#zone", + "id": "13020128040171887099", + "creationTimestamp": "2012-10-19T16:42:54.131", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a", + "name": "us-central1-a", + "description": "us-central1-a", + "status": "DOWN", + "maintenanceWindows": [ + { + "name": "2012-11-10-planned-outage", + "description": "maintenance zone", + "beginTime": "2012-11-10T20:00:00.000", + "endTime": "2012-12-02T20:00:00.000" + } + ] + } + ] +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/zone_operation.json b/google-compute-engine/src/test/resources/zone_operation.json new file mode 100644 index 000000000..ab93cb9c3 --- /dev/null +++ b/google-compute-engine/src/test/resources/zone_operation.json @@ -0,0 +1,16 @@ +{ + "kind": "compute#operation", + "id": "13053095055850848306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/instance-api-live-test-instance", + "targetId": "13053094017547040099", + "status": "DONE", + "user": "user@developer.gserviceaccount.com", + "progress": 100, + "insertTime": "2012-11-28T06:41:05.060", + "startTime": "2012-11-28T06:41:05.142", + "endTime": "2012-11-28T06:41:06.142", + "operationType": "insert", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a" +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/zone_operation_error.json b/google-compute-engine/src/test/resources/zone_operation_error.json new file mode 100644 index 000000000..10b547707 --- /dev/null +++ b/google-compute-engine/src/test/resources/zone_operation_error.json @@ -0,0 +1,25 @@ +{ + "kind": "compute#operation", + "id": "13053095055850848306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/instance-api-live-test-instance", + "targetId": "13053094017547040099", + "status": "DONE", + "user": "user@developer.gserviceaccount.com", + "progress": 100, + "insertTime": "2012-11-28T06:41:05.060", + "startTime": "2012-11-28T06:41:05.142", + "httpErrorStatusCode": 400, + "httpErrorMessage": "BAD REQUEST", + "error": { + "errors": [ + { + "code": "RESOURCE_ALREADY_EXISTS", + "message": "The resource 'projects/myproject/zones/us-central1-a/instances/instance-api-live-test-instance' already exists" + } + ] + }, + "operationType": "insert", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a" +} \ No newline at end of file diff --git a/google-compute-engine/src/test/resources/zone_operation_list.json b/google-compute-engine/src/test/resources/zone_operation_list.json new file mode 100644 index 000000000..7a3137a1d --- /dev/null +++ b/google-compute-engine/src/test/resources/zone_operation_list.json @@ -0,0 +1,23 @@ +{ + "kind": "compute#operationList", + "id": "projects/myproject/zones/us-central1-a/operations", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations", + "items": [ + { + "kind": "compute#operation", + "id": "13053095055850848306", + "selfLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/operations/operation-1354084865060-4cf88735faeb8-bbbb12cb", + "name": "operation-1354084865060-4cf88735faeb8-bbbb12cb", + "targetLink": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a/instances/instance-api-live-test-instance", + "targetId": "13053094017547040099", + "status": "DONE", + "user": "user@developer.gserviceaccount.com", + "progress": 100, + "insertTime": "2012-11-28T06:41:05.060", + "startTime": "2012-11-28T06:41:05.142", + "endTime": "2012-11-28T06:41:06.142", + "operationType": "insert", + "zone": "https://www.googleapis.com/compute/v1beta15/projects/myproject/zones/us-central1-a" + } + ] +} \ No newline at end of file