JCLOUDS-750 Convert GoogleComputeEngine to AutoValue + general cleanup.
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/commit/b41b0d04 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/tree/b41b0d04 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/diff/b41b0d04 Branch: refs/heads/master Commit: b41b0d047ce6711f14cd56abec05074a68a314cf Parents: 521a0c0 Author: Adrian Cole <[email protected]> Authored: Mon Nov 3 10:07:23 2014 -0800 Committer: Adrian Cole <[email protected]> Committed: Mon Nov 3 15:20:20 2014 -0800 ---------------------------------------------------------------------- google-compute-engine/pom.xml | 5 + .../GoogleComputeEngineApi.java | 10 +- .../GoogleComputeEngineApiMetadata.java | 3 + .../GoogleComputeEngineFallbacks.java | 30 + .../binders/ForwardingRuleCreationBinder.java | 4 +- .../binders/HttpHealthCheckCreationBinder.java | 17 +- .../binders/InstanceBinder.java | 10 +- .../binders/MetadataBinder.java | 10 +- .../TargetPoolChangeHealthChecksBinder.java | 6 +- .../TargetPoolChangeInstancesBinder.java | 6 +- .../binders/TargetPoolCreationBinder.java | 6 +- .../TargetPoolMapofListofMapGenericBinder.java | 65 + .../TargetPoolMapofSetofMapGenericBinder.java | 64 - .../compute/GoogleComputeEngineService.java | 25 +- .../GoogleComputeEngineServiceAdapter.java | 97 +- ...GoogleComputeEngineServiceContextModule.java | 14 +- .../compute/domain/InstanceInZone.java | 54 + .../compute/domain/MachineTypeInZone.java | 54 + .../compute/domain/NetworkAndAddressRange.java | 41 + .../compute/domain/SlashEncodedIds.java | 83 ++ ...ogleComputeEngineSecurityGroupExtension.java | 122 +- .../functions/CreateNetworkIfNeeded.java | 97 ++ .../compute/functions/FindNetworkOrCreate.java | 50 + .../functions/FirewallTagNamingConvention.java | 5 +- .../functions/FirewallToIpPermission.java | 66 +- .../GoogleComputeEngineImageToImage.java | 32 +- .../functions/InstanceInZoneToNodeMetadata.java | 80 +- .../functions/MachineTypeInZoneToHardware.java | 26 +- .../functions/NetworkToSecurityGroup.java | 10 +- .../compute/functions/RegionToLocation.java | 6 +- .../compute/functions/ZoneToLocation.java | 6 +- .../compute/loaders/FindNetworkOrCreate.java | 62 - .../GoogleComputeEngineTemplateOptions.java | 27 +- ...desWithGroupEncodedIntoNameThenAddToSet.java | 53 +- .../GoogleComputeEngineHttpApiModule.java | 4 +- .../config/GoogleComputeEngineParserModule.java | 329 ++--- .../domain/AbstractDisk.java | 120 -- .../googlecomputeengine/domain/Address.java | 164 +-- .../googlecomputeengine/domain/Deprecated.java | 179 +-- .../googlecomputeengine/domain/Disk.java | 128 +- .../googlecomputeengine/domain/DiskType.java | 150 +-- .../googlecomputeengine/domain/Firewall.java | 366 +----- .../domain/ForwardingRule.java | 195 +-- .../domain/HttpHealthCheck.java | 237 +--- .../googlecomputeengine/domain/Image.java | 268 +--- .../googlecomputeengine/domain/Instance.java | 1176 ++---------------- .../domain/InstanceInZone.java | 52 - .../domain/InstanceTemplate.java | 442 ------- .../googlecomputeengine/domain/ListPage.java | 115 +- .../googlecomputeengine/domain/MachineType.java | 333 +---- .../domain/MachineTypeInZone.java | 52 - .../googlecomputeengine/domain/Metadata.java | 118 +- .../googlecomputeengine/domain/Network.java | 114 +- .../googlecomputeengine/domain/Operation.java | 552 +------- .../googlecomputeengine/domain/Project.java | 148 +-- .../googlecomputeengine/domain/Quota.java | 132 +- .../googlecomputeengine/domain/Region.java | 151 +-- .../googlecomputeengine/domain/Resource.java | 287 ----- .../googlecomputeengine/domain/Route.java | 429 +------ .../domain/SlashEncodedIds.java | 83 -- .../googlecomputeengine/domain/Snapshot.java | 125 +- .../googlecomputeengine/domain/Tags.java | 43 + .../googlecomputeengine/domain/TargetPool.java | 205 +-- .../googlecomputeengine/domain/Zone.java | 317 +---- .../domain/internal/NetworkAndAddressRange.java | 91 -- .../domain/templates/InstanceTemplate.java | 269 ++++ .../features/AddressApi.java | 9 +- .../googlecomputeengine/features/DiskApi.java | 10 +- .../features/DiskTypeApi.java | 8 +- .../features/FirewallApi.java | 10 +- .../features/ForwardingRuleApi.java | 37 +- .../features/GlobalOperationApi.java | 8 +- .../features/HttpHealthCheckApi.java | 42 +- .../googlecomputeengine/features/ImageApi.java | 8 +- .../features/InstanceApi.java | 19 +- .../features/MachineTypeApi.java | 8 +- .../features/NetworkApi.java | 8 +- .../features/ProjectApi.java | 2 +- .../googlecomputeengine/features/RegionApi.java | 8 +- .../features/RegionOperationApi.java | 8 +- .../googlecomputeengine/features/RouteApi.java | 10 +- .../features/SnapshotApi.java | 8 +- .../features/TargetPoolApi.java | 61 +- .../googlecomputeengine/features/ZoneApi.java | 8 +- .../features/ZoneOperationApi.java | 8 +- .../functions/CreateNetworkIfNeeded.java | 100 -- .../functions/internal/BaseToPagedIterable.java | 15 +- .../internal/BaseWithRegionToPagedIterable.java | 12 +- .../internal/BaseWithZoneToPagedIterable.java | 12 +- .../functions/internal/ParseAddresses.java | 29 +- .../functions/internal/ParseDiskTypes.java | 32 +- .../functions/internal/ParseDisks.java | 29 +- .../functions/internal/ParseFirewalls.java | 27 +- .../internal/ParseForwardingRules.java | 36 +- .../internal/ParseGlobalOperations.java | 25 +- .../internal/ParseHttpHealthChecks.java | 33 +- .../functions/internal/ParseImages.java | 27 +- .../functions/internal/ParseInstances.java | 29 +- .../functions/internal/ParseMachineTypes.java | 30 +- .../functions/internal/ParseNetworks.java | 27 +- .../internal/ParseRegionOperations.java | 28 +- .../functions/internal/ParseRegions.java | 27 +- .../functions/internal/ParseRoutes.java | 24 +- .../functions/internal/ParseSnapshots.java | 30 +- .../functions/internal/ParseTargetPools.java | 29 +- .../functions/internal/ParseZoneOperations.java | 27 +- .../functions/internal/ParseZones.java | 24 +- .../internal/NullSafeCopies.java | 39 + .../options/FirewallOptions.java | 74 +- .../options/ForwardingRuleCreationOptions.java | 8 +- .../options/HttpHealthCheckCreationOptions.java | 35 +- .../options/RouteOptions.java | 18 +- .../options/TargetPoolCreationOptions.java | 16 +- .../GlobalOperationDonePredicate.java | 15 +- .../predicates/InstancePredicates.java | 4 +- .../predicates/NetworkFirewallPredicates.java | 110 +- .../RegionOperationDonePredicate.java | 17 +- .../predicates/ZoneOperationDonePredicate.java | 20 +- .../services/org.jclouds.apis.ApiMetadata | 18 - .../GoogleComputeEngineApiMetadataTest.java | 6 +- .../ForwardingRuleCreationBinderTest.java | 4 +- .../TargetPoolAddInstanceBinderTest.java | 15 +- .../binders/TargetPoolCreationBinderTest.java | 8 +- .../GoogleComputeEngineServiceExpectTest.java | 63 +- .../GoogleComputeEngineServiceLiveTest.java | 5 +- .../functions/CreateNetworkIfNeededTest.java | 148 +++ .../functions/FindNetworkOrCreateTest.java | 149 +++ .../functions/FirewallToIpPermissionTest.java | 50 +- .../GoogleComputeEngineImageToImageTest.java | 38 +- .../InstanceInZoneToNodeMetadataTest.java | 58 +- .../functions/NetworkToSecurityGroupTest.java | 22 +- .../loaders/FindNetworkOrCreateTest.java | 141 --- .../features/AddressApiExpectTest.java | 26 +- .../features/AddressApiLiveTest.java | 2 +- .../features/DiskApiExpectTest.java | 48 +- .../features/DiskApiLiveTest.java | 14 +- .../features/DiskTypeApiExpectTest.java | 12 +- .../features/DiskTypeApiLiveTest.java | 16 +- .../features/FirewallApiExpectTest.java | 88 +- .../features/FirewallApiLiveTest.java | 51 +- .../features/ForwardingRuleApiExpectTest.java | 59 +- .../features/ForwardingRuleApiLiveTest.java | 36 +- .../features/GlobalOperationApiExpectTest.java | 17 +- .../features/GlobalOperationApiLiveTest.java | 8 +- .../features/HttpHealthCheckApiExpectTest.java | 90 +- .../features/HttpHealthCheckApiLiveTest.java | 65 +- .../features/ImageApiExpectTest.java | 33 +- .../features/ImageApiLiveTest.java | 16 +- .../features/InstanceApiExpectTest.java | 110 +- .../features/InstanceApiLiveTest.java | 51 +- .../features/MachineTypeApiExpectTest.java | 12 +- .../features/MachineTypeApiLiveTest.java | 7 +- .../features/NetworkApiExpectTest.java | 20 +- .../features/NetworkApiLiveTest.java | 5 +- .../features/ProjectApiExpectTest.java | 10 +- .../features/ProjectApiLiveTest.java | 29 +- .../features/RegionApiExpectTest.java | 4 +- .../features/RegionApiLiveTest.java | 9 +- .../features/RegionOperationApiExpectTest.java | 47 +- .../features/RegionOperationApiLiveTest.java | 8 +- .../features/RouteApiExpectTest.java | 31 +- .../features/RouteApiLiveTest.java | 7 +- .../features/SnapshotApiExpectTest.java | 4 +- .../features/SnapshotApiLiveTest.java | 10 +- .../features/TargetPoolApiExpectTest.java | 72 +- .../features/TargetPoolApiLiveTest.java | 93 +- .../features/ZoneApiExpectTest.java | 4 +- .../features/ZoneApiLiveTest.java | 7 +- .../features/ZoneOperationApiExpectTest.java | 52 +- .../features/ZoneOperationApiLiveTest.java | 8 +- .../functions/CreateNetworkIfNeededTest.java | 132 -- .../BaseGoogleComputeEngineApiLiveTest.java | 22 +- .../BaseGoogleComputeEngineExpectTest.java | 29 +- .../BaseGoogleComputeEngineParseTest.java | 8 + ...leComputeEngineServiceContextExpectTest.java | 12 +- .../parse/ParseAddressListTest.java | 42 +- .../parse/ParseAddressTest.java | 29 +- .../parse/ParseDiskListTest.java | 31 +- .../parse/ParseDiskTest.java | 29 +- .../parse/ParseDiskTypeListTest.java | 51 +- .../parse/ParseDiskTypeTest.java | 30 +- .../parse/ParseFirewallListTest.java | 48 +- .../parse/ParseFirewallTest.java | 45 +- .../parse/ParseForwardingRuleListTest.java | 38 +- .../parse/ParseForwardingRuleTest.java | 40 +- .../parse/ParseGlobalOperationListTest.java | 46 + .../parse/ParseGlobalOperationTest.java | 62 + .../parse/ParseHttpHealthCheckListTest.java | 83 +- .../parse/ParseHttpHealthCheckTest.java | 34 +- .../parse/ParseImageListTest.java | 38 +- .../parse/ParseImageTest.java | 39 +- .../parse/ParseInstanceListTest.java | 20 +- .../parse/ParseInstanceSerialOutputTest.java | 17 +- .../parse/ParseInstanceTest.java | 84 +- .../parse/ParseMachineTypeListTest.java | 101 +- .../parse/ParseMachineTypeTest.java | 42 +- .../parse/ParseMetadataTest.java | 15 +- .../parse/ParseNetworkListTest.java | 20 +- .../parse/ParseNetworkTest.java | 26 +- .../parse/ParseOperationListTest.java | 42 - .../parse/ParseOperationTest.java | 50 +- .../parse/ParseProjectTest.java | 52 +- .../parse/ParseQuotaTest.java | 10 +- .../parse/ParseRegionListTest.java | 61 +- .../parse/ParseRegionOperationTest.java | 54 +- .../parse/ParseRegionTest.java | 51 +- .../parse/ParseRouteListTest.java | 43 +- .../parse/ParseRouteTest.java | 39 +- .../parse/ParseSnapshotListTest.java | 47 +- .../parse/ParseSnapshotTest.java | 30 +- .../parse/ParseTargetPoolListTest.java | 33 +- .../parse/ParseTargetPoolTest.java | 36 +- .../parse/ParseZoneListTest.java | 55 +- .../parse/ParseZoneOperationTest.java | 62 + .../parse/ParseZoneTest.java | 40 +- .../NetworkFirewallPredicatesTest.java | 117 +- .../src/test/resources/disk_list.json | 3 +- .../src/test/resources/image_get.json | 4 + .../src/test/resources/instance_get.json | 3 +- .../src/test/resources/instance_insert.json | 2 +- .../test/resources/instance_insert_simple.json | 2 +- .../src/test/resources/instance_list.json | 3 +- 222 files changed, 4326 insertions(+), 9540 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/pom.xml ---------------------------------------------------------------------- diff --git a/google-compute-engine/pom.xml b/google-compute-engine/pom.xml index a41f5e7..31c7de3 100644 --- a/google-compute-engine/pom.xml +++ b/google-compute-engine/pom.xml @@ -67,6 +67,11 @@ <version>${jclouds.version}</version> </dependency> <dependency> + <groupId>com.google.auto.value</groupId> + <artifactId>auto-value</artifactId> + <scope>provided</scope> + </dependency> + <dependency> <groupId>org.apache.jclouds</groupId> <artifactId>jclouds-compute</artifactId> <version>${jclouds.version}</version> http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApi.java ---------------------------------------------------------------------- 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 5ba978b..56b7c04 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 @@ -16,7 +16,11 @@ */ package org.jclouds.googlecomputeengine; -import com.google.common.annotations.Beta; +import java.io.Closeable; + +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + import org.jclouds.googlecomputeengine.features.AddressApi; import org.jclouds.googlecomputeengine.features.DiskApi; import org.jclouds.googlecomputeengine.features.DiskTypeApi; @@ -38,9 +42,7 @@ import org.jclouds.googlecomputeengine.features.ZoneApi; import org.jclouds.googlecomputeengine.features.ZoneOperationApi; import org.jclouds.rest.annotations.Delegate; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import java.io.Closeable; +import com.google.common.annotations.Beta; /** http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineApiMetadata.java ---------------------------------------------------------------------- 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 b63a69f..0b7bed7 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 @@ -28,6 +28,7 @@ import static org.jclouds.reflect.Reflection2.typeToken; import java.net.URI; import java.util.Properties; +import org.jclouds.apis.ApiMetadata; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.googlecomputeengine.compute.config.GoogleComputeEngineServiceContextModule; import org.jclouds.googlecomputeengine.config.GoogleComputeEngineHttpApiModule; @@ -36,9 +37,11 @@ import org.jclouds.oauth.v2.config.OAuthAuthenticationModule; import org.jclouds.oauth.v2.config.OAuthModule; import org.jclouds.rest.internal.BaseHttpApiMetadata; +import com.google.auto.service.AutoService; import com.google.common.collect.ImmutableSet; import com.google.inject.Module; +@AutoService(ApiMetadata.class) public class GoogleComputeEngineApiMetadata extends BaseHttpApiMetadata<GoogleComputeEngineApi> { @Override http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineFallbacks.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineFallbacks.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineFallbacks.java new file mode 100644 index 0000000..8024bd6 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/GoogleComputeEngineFallbacks.java @@ -0,0 +1,30 @@ +/* + * 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; + +import static org.jclouds.Fallbacks.valOnNotFoundOr404; + +import org.jclouds.Fallback; +import org.jclouds.googlecomputeengine.domain.ListPage; + +public final class GoogleComputeEngineFallbacks { + public static final class EmptyListPageOnNotFoundOr404 implements Fallback<Object> { + public ListPage<Object> createOrPropagate(Throwable t) throws Exception { + return valOnNotFoundOr404(ListPage.create(null, null, null), t); + } + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java index f8d2daa..0b1f006 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/ForwardingRuleCreationBinder.java @@ -21,7 +21,7 @@ import java.util.Map; import javax.inject.Inject; -import org.jclouds.googlecomputeengine.domain.ForwardingRule.IPProtocolOption; +import org.jclouds.googlecomputeengine.domain.ForwardingRule; import org.jclouds.googlecomputeengine.options.ForwardingRuleCreationOptions; import org.jclouds.http.HttpRequest; import org.jclouds.json.Json; @@ -55,7 +55,7 @@ public class ForwardingRuleCreationBinder extends BindToJsonPayload { @SuppressWarnings("unused") private String IPAddress; @SuppressWarnings("unused") - private IPProtocolOption IPProtocol; + private ForwardingRule.IPProtocol IPProtocol; @SuppressWarnings("unused") private String portRange; @SuppressWarnings("unused") http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java index 3da57cd..7b23a33 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/HttpHealthCheckCreationBinder.java @@ -65,15 +65,14 @@ public class HttpHealthCheckCreationBinder extends BindToJsonPayload { private HttpHealthCheckBinderHelper(String name, HttpHealthCheckCreationOptions httpHealthCheckCreationOptions){ this.name = name; - this.host = httpHealthCheckCreationOptions.getHost(); - this.requestPath = httpHealthCheckCreationOptions.getHost(); - this.port = httpHealthCheckCreationOptions.getPort(); - this.checkIntervalSec = httpHealthCheckCreationOptions.getCheckIntervalSec(); - this.timeoutSec = httpHealthCheckCreationOptions.getTimeoutSec(); - this.unhealthyThreshold = httpHealthCheckCreationOptions.getUnhealthyThreshold(); - this.healthyThreshold = httpHealthCheckCreationOptions.getHealthyThreshold(); - this.description = httpHealthCheckCreationOptions.getDescription(); + this.host = httpHealthCheckCreationOptions.host(); + this.requestPath = httpHealthCheckCreationOptions.requestPath(); + this.port = httpHealthCheckCreationOptions.port(); + this.checkIntervalSec = httpHealthCheckCreationOptions.checkIntervalSec(); + this.timeoutSec = httpHealthCheckCreationOptions.timeoutSec(); + this.unhealthyThreshold = httpHealthCheckCreationOptions.unhealthyThreshold(); + this.healthyThreshold = httpHealthCheckCreationOptions.healthyThreshold(); + this.description = httpHealthCheckCreationOptions.description(); } } - } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java index 91c9021..aae9d38 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/InstanceBinder.java @@ -22,14 +22,14 @@ import java.util.Map; import javax.inject.Inject; import javax.inject.Named; -import org.jclouds.googlecomputeengine.domain.InstanceTemplate; +import org.jclouds.googlecomputeengine.domain.templates.InstanceTemplate; import org.jclouds.http.HttpRequest; import org.jclouds.rest.MapBinder; import org.jclouds.rest.binders.BindToJsonPayload; import com.google.common.base.Function; -public class InstanceBinder implements MapBinder { +public final class InstanceBinder implements MapBinder { private final BindToJsonPayload jsonBinder; private final Function<String, URI> machineTypesToURI; @@ -44,10 +44,10 @@ public class InstanceBinder implements MapBinder { InstanceTemplate template = (InstanceTemplate) postParams.get("template"); template.name(postParams.get("name").toString()); - if (template.getMachineTypeName() != null) { - template.machineType(machineTypesToURI.apply(template.getMachineTypeName())); + if (template.machineTypeName() != null) { + template.machineType(machineTypesToURI.apply(template.machineTypeName())); + template.machineTypeName(null); } - template.machineType((String) null); return bindToRequest(request, template); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java index 33886a6..7a3ca5a 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/MetadataBinder.java @@ -25,19 +25,17 @@ import org.jclouds.http.HttpRequest; import org.jclouds.rest.MapBinder; import org.jclouds.rest.binders.BindToJsonPayload; -public class MetadataBinder implements MapBinder { +public final class MetadataBinder implements MapBinder { private final BindToJsonPayload jsonBinder; - @Inject MetadataBinder(BindToJsonPayload jsonBinder){ + @Inject MetadataBinder(BindToJsonPayload jsonBinder) { this.jsonBinder = jsonBinder; } @Override public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) { - Metadata metadata = Metadata.builder() - .fingerprint(postParams.get("fingerprint").toString()) - .items((Map<String, String>) postParams.get("items")) - .build(); + Metadata metadata = Metadata + .create(postParams.get("fingerprint").toString(), (Map<String, String>) postParams.get("items")); return bindToRequest(request, metadata); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java index 0eee860..7834803 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeHealthChecksBinder.java @@ -23,11 +23,11 @@ import org.jclouds.json.Json; /** * Binder used for adding and deleting healthChecks from a target pool. */ -public class TargetPoolChangeHealthChecksBinder extends TargetPoolMapofSetofMapGenericBinder { +public final class TargetPoolChangeHealthChecksBinder extends TargetPoolMapofListofMapGenericBinder { @Inject TargetPoolChangeHealthChecksBinder(Json jsonBinder) { super(jsonBinder); - super.SetOuterString("healthChecks"); - super.SetInnerString("healthCheck"); + super.outerString("healthChecks"); + super.innerString("healthCheck"); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java index 5551172..603654a 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolChangeInstancesBinder.java @@ -23,11 +23,11 @@ import org.jclouds.json.Json; /** * Binder used for adding and deleting instances from a target pool. */ -public class TargetPoolChangeInstancesBinder extends TargetPoolMapofSetofMapGenericBinder { +public final class TargetPoolChangeInstancesBinder extends TargetPoolMapofListofMapGenericBinder { @Inject TargetPoolChangeInstancesBinder(Json jsonBinder) { super(jsonBinder); - super.SetOuterString("instances"); - super.SetInnerString("instance"); + super.outerString("instances"); + super.innerString("instance"); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java index 67c4832..1d52859 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolCreationBinder.java @@ -17,8 +17,8 @@ package org.jclouds.googlecomputeengine.binders; import java.net.URI; +import java.util.List; import java.util.Map; -import java.util.Set; import javax.inject.Inject; @@ -50,9 +50,9 @@ public class TargetPoolCreationBinder extends BindToJsonPayload { @SuppressWarnings("unused") private String name; @SuppressWarnings("unused") - private Set<URI> healthChecks; + private List<URI> healthChecks; @SuppressWarnings("unused") - private Set<URI> instances; + private List<URI> instances; @SuppressWarnings("unused") private SessionAffinityValue sessionAffinity; @SuppressWarnings("unused") http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofListofMapGenericBinder.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofListofMapGenericBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofListofMapGenericBinder.java new file mode 100644 index 0000000..007b06f --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofListofMapGenericBinder.java @@ -0,0 +1,65 @@ +/* + * 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.binders; + +import java.net.URI; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; + +import org.jclouds.http.HttpRequest; +import org.jclouds.json.Json; +import org.jclouds.rest.binders.BindToJsonPayload; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; + +class TargetPoolMapofListofMapGenericBinder extends BindToJsonPayload { + + @Inject TargetPoolMapofListofMapGenericBinder(Json jsonBinder) { + super(jsonBinder); + } + + private String outterString; + private String innerString; + + public void outerString(String outterString) { + this.outterString = outterString; + } + + public void innerString(String innerString) { + this.innerString = innerString; + } + + /** + * For the addInstance request the request body is in an atypical form. + * + * @see <a href="https://cloud.google.com/compute/docs/reference/latest/targetPools/addInstance"/> + */ + @Override public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) { + List<URI> instances = (List<URI>) postParams.get(outterString); + Map<String, List<Map<String, URI>>> finalInstances = Maps.newLinkedHashMap(); + List<Map<String, URI>> innerInstances = Lists.newArrayList(); + for (URI instance : instances) { + innerInstances.add(ImmutableMap.of(innerString, instance)); + } + finalInstances.put(outterString, innerInstances); + return super.bindToRequest(request, finalInstances); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofSetofMapGenericBinder.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofSetofMapGenericBinder.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofSetofMapGenericBinder.java deleted file mode 100644 index a87891e..0000000 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/binders/TargetPoolMapofSetofMapGenericBinder.java +++ /dev/null @@ -1,64 +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.binders; - -import java.net.URI; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.inject.Inject; - -import org.jclouds.http.HttpRequest; -import org.jclouds.json.Json; -import org.jclouds.rest.binders.BindToJsonPayload; - -import com.google.common.collect.ImmutableMap; - - -public class TargetPoolMapofSetofMapGenericBinder extends BindToJsonPayload { - - @Inject TargetPoolMapofSetofMapGenericBinder(Json jsonBinder) { - super(jsonBinder); - } - private String outterString; - private String innerString; - - public void SetOuterString(String outterString){ - this.outterString = outterString; - } - - public void SetInnerString(String innerString){ - this.innerString = innerString; - } - - /** - * For the addInstance request the request body is in an atypical form. - * @see <a href="https://cloud.google.com/compute/docs/reference/latest/targetPools/addInstance"/> - */ - @Override public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) { - Set<URI> instances = (Set<URI>) postParams.get(outterString); - Map<String, Set<Map<String, URI>>> finalInstances = new HashMap<String, Set<Map<String, URI>>>(); - Set<Map<String, URI>> innerInstances = new HashSet<Map<String, URI>>(); - for (URI instance : instances){ - innerInstances.add(ImmutableMap.of(innerString, instance)); - } - finalInstances.put(outterString, innerInstances); - return super.bindToRequest(request, finalInstances); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineService.java ---------------------------------------------------------------------- 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 da9bbb1..d6418ea 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 @@ -66,7 +66,6 @@ import org.jclouds.googlecomputeengine.domain.Firewall; import org.jclouds.googlecomputeengine.domain.Network; import org.jclouds.googlecomputeengine.domain.Operation; import org.jclouds.googlecomputeengine.features.FirewallApi; -import org.jclouds.http.HttpResponse; import org.jclouds.scriptbuilder.functions.InitAdminAccess; import com.google.common.base.Function; @@ -157,35 +156,35 @@ public class GoogleComputeEngineService extends BaseComputeService { Predicate<Firewall> firewallBelongsToNetwork = new Predicate<Firewall>() { @Override public boolean apply(Firewall input) { - return input != null && input.getNetwork().equals(network.getSelfLink()); + return input != null && input.network().equals(network.selfLink()); } }; Set<AtomicReference<Operation>> operations = Sets.newLinkedHashSet(); for (Firewall firewall : firewallApi.list().concat().filter(firewallBelongsToNetwork)) { - operations.add(new AtomicReference<Operation>(firewallApi.delete(firewall.getName()))); + operations.add(new AtomicReference<Operation>(firewallApi.delete(firewall.name()))); } for (AtomicReference<Operation> operation : operations) { retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS).apply(operation); - if (operation.get().getHttpError().isPresent()) { - HttpResponse response = operation.get().getHttpError().get(); + if (operation.get().httpErrorStatusCode() != null) { logger.warn("delete orphaned firewall %s failed. Http Error Code: %d HttpError: %s", - operation.get().getTargetId(), response.getStatusCode(), response.getMessage()); + operation.get().targetId(), operation.get().httpErrorStatusCode(), + operation.get().httpErrorMessage()); } } - AtomicReference<Operation> operation = Atomics.newReference(api.getNetworkApi(project.get()).delete(resourceName)); + AtomicReference<Operation> operation = Atomics + .newReference(api.getNetworkApi(project.get()).delete(resourceName)); - retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, - MILLISECONDS).apply(operation); + retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS) + .apply(operation); - if (operation.get().getHttpError().isPresent()) { - HttpResponse response = operation.get().getHttpError().get(); - logger.warn("delete orphaned network failed. Http Error Code: " + response.getStatusCode() + - " HttpError: " + response.getMessage()); + if (operation.get().httpErrorStatusCode() != null) { + logger.warn("delete orphaned network failed. Http Error Code: " + operation.get().httpErrorStatusCode() + + " HttpError: " + operation.get().httpErrorMessage()); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java ---------------------------------------------------------------------- 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 58aa2f4..f306d2d 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 @@ -40,7 +40,6 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; -import javax.annotation.Resource; import javax.inject.Named; import org.jclouds.collect.Memoized; @@ -48,10 +47,12 @@ 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.domain.InstanceInZone; +import org.jclouds.googlecomputeengine.compute.domain.MachineTypeInZone; +import org.jclouds.googlecomputeengine.compute.domain.SlashEncodedIds; import org.jclouds.googlecomputeengine.compute.functions.FirewallTagNamingConvention; import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions; import org.jclouds.googlecomputeengine.config.UserProject; @@ -59,24 +60,17 @@ import org.jclouds.googlecomputeengine.domain.Disk; import org.jclouds.googlecomputeengine.domain.Image; import org.jclouds.googlecomputeengine.domain.Instance; import org.jclouds.googlecomputeengine.domain.Instance.AttachedDisk; -import org.jclouds.googlecomputeengine.domain.Instance.PersistentAttachedDisk; -import org.jclouds.googlecomputeengine.domain.InstanceInZone; -import org.jclouds.googlecomputeengine.domain.InstanceTemplate; -import org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk; -import org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk.Mode; +import org.jclouds.googlecomputeengine.domain.Instance.AttachedDisk.Mode; 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.googlecomputeengine.domain.templates.InstanceTemplate; +import org.jclouds.googlecomputeengine.domain.templates.InstanceTemplate.PersistentDisk; import org.jclouds.googlecomputeengine.features.InstanceApi; import org.jclouds.googlecomputeengine.options.DiskCreationOptions; -import org.jclouds.http.HttpResponse; -import org.jclouds.logging.Logger; import com.google.common.base.Function; import com.google.common.base.Objects; -import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.collect.FluentIterable; @@ -88,11 +82,7 @@ import com.google.common.util.concurrent.Atomics; import com.google.common.util.concurrent.UncheckedTimeoutException; import com.google.inject.Inject; -public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<InstanceInZone, MachineTypeInZone, Image, Zone> { - - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; +public final class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter<InstanceInZone, MachineTypeInZone, Image, Zone> { private final GoogleComputeEngineApi api; private final Supplier<String> userProject; @@ -103,8 +93,7 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< private final long operationCompleteCheckTimeout; private final FirewallTagNamingConvention.Factory firewallTagNamingConvention; - @Inject - public GoogleComputeEngineServiceAdapter(GoogleComputeEngineApi api, + @Inject GoogleComputeEngineServiceAdapter(GoogleComputeEngineApi api, @UserProject Supplier<String> userProject, Function<TemplateOptions, ImmutableMap.Builder<String, String>> metatadaFromTemplateOptions, @@ -113,18 +102,15 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< @Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout, @Memoized Supplier<Map<URI, ? extends Location>> zones, FirewallTagNamingConvention.Factory firewallTagNamingConvention) { - this.api = checkNotNull(api, "google compute api"); - this.userProject = checkNotNull(userProject, "user project name"); - this.metatadaFromTemplateOptions = checkNotNull(metatadaFromTemplateOptions, - "metadata from template options function"); - this.operationCompleteCheckInterval = checkNotNull(operationCompleteCheckInterval, - "operation completed check interval"); - this.operationCompleteCheckTimeout = checkNotNull(operationCompleteCheckTimeout, - "operation completed check timeout"); + this.api = api; + this.userProject = userProject; + this.metatadaFromTemplateOptions = metatadaFromTemplateOptions; + this.operationCompleteCheckInterval = operationCompleteCheckInterval; + this.operationCompleteCheckTimeout = operationCompleteCheckTimeout; this.retryOperationDonePredicate = retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, TimeUnit.MILLISECONDS); - this.zones = checkNotNull(zones, "zones"); - this.firewallTagNamingConvention = checkNotNull(firewallTagNamingConvention, "firewallTagNamingConvention"); + this.zones = zones; + this.firewallTagNamingConvention = firewallTagNamingConvention; } @Override @@ -147,7 +133,7 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< Disk bootDisk = createBootDisk(template, name); disks.add(new PersistentDisk(Mode.READ_WRITE, - bootDisk.getSelfLink(), + bootDisk.selfLink(), null, true, true)); @@ -155,8 +141,7 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< disks.addAll(options.getDisks()); - InstanceTemplate instanceTemplate = InstanceTemplate.builder() - .forMachineType(hardware.getUri()); + InstanceTemplate instanceTemplate = new InstanceTemplate().machineType(hardware.getUri()); if (options.isEnableNat()) { instanceTemplate.addNetworkInterface(options.getNetwork().get(), Type.ONE_TO_ONE_NAT); @@ -199,8 +184,8 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< }, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS).apply(instance); if (!options.getTags().isEmpty()) { - Operation tagsOperation = instanceApi.setTagsInZone(zone, - name, options.getTags(), instance.get().getTags().getFingerprint()); + Operation tagsOperation = instanceApi + .setTagsInZone(zone, name, options.getTags(), instance.get().tags().fingerprint()); waitOperationDone(tagsOperation); @@ -225,7 +210,7 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< } }) .toSet(); - instanceApi.setTagsInZone(zone, instance.get().getName(), tags, instance.get().getTags().getFingerprint()); + instanceApi.setTagsInZone(zone, instance.get().name(), tags, instance.get().tags().fingerprint()); InstanceInZone instanceInZone = new InstanceInZone(instance.get(), zone); @@ -265,14 +250,14 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< .filter(new Predicate<MachineType>() { @Override public boolean apply(MachineType input) { - return !input.getDeprecated().isPresent(); + return input.deprecated() == null; } }) .transform(new Function<MachineType, MachineTypeInZone>() { @Override public MachineTypeInZone apply(MachineType arg0) { - return new MachineTypeInZone(arg0, arg0.getZone()); + return new MachineTypeInZone(arg0, arg0.zone()); } })); } @@ -336,7 +321,7 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< @Override public boolean apply(InstanceInZone instanceInZone) { - return contains(ids, instanceInZone.getInstance().getName()); + return contains(ids, instanceInZone.getInstance().name()); } }); } @@ -345,32 +330,23 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< public void destroyNode(final String name) { SlashEncodedIds slashEncodedIds = SlashEncodedIds.fromSlashEncoded(name); String diskName = null; - try { - Instance instance = api.getInstanceApi(userProject.get()).getInZone(slashEncodedIds.getFirstId(), - slashEncodedIds.getSecondId()); - if (instance.getMetadata().getItems().get(GCE_DELETE_BOOT_DISK_METADATA_KEY).equals("true")) { - Optional<AttachedDisk> disk = tryFind(instance.getDisks(), new Predicate<AttachedDisk>() { - @Override - public boolean apply(AttachedDisk input) { - return PersistentAttachedDisk.class.isInstance(input) && - PersistentAttachedDisk.class.cast(input).isBoot(); - } - }); - if (disk.isPresent()) { - diskName = PersistentAttachedDisk.class.cast(disk.get()).getSourceDiskName(); + Instance instance = api.getInstanceApi(userProject.get()).getInZone(slashEncodedIds.getFirstId(), + slashEncodedIds.getSecondId()); + if (instance != null && + "true".equals(instance.metadata().items().get(GCE_DELETE_BOOT_DISK_METADATA_KEY))) { + for (AttachedDisk input : instance.disks()) { + if (input.type() == AttachedDisk.Type.PERSISTENT && input.boot()){ + String source = input.source().toASCIIString(); + diskName = source.substring(source.lastIndexOf('/') + 1); } } - } catch (Exception e) { - // TODO: what exception actually gets thrown here if the instance doesn't really exist? } waitOperationDone(api.getInstanceApi(userProject.get()).deleteInZone(slashEncodedIds.getFirstId(), slashEncodedIds.getSecondId())); if (diskName != null) { - waitOperationDone(api.getDiskApi(userProject.get()).deleteInZone(slashEncodedIds.getFirstId(), - diskName)); + waitOperationDone(api.getDiskApi(userProject.get()).deleteInZone(slashEncodedIds.getFirstId(), diskName)); } - } @Override @@ -433,11 +409,10 @@ public class GoogleComputeEngineServiceAdapter implements ComputeServiceAdapter< } // check if the operation failed - if (operationRef.get().getHttpError().isPresent()) { - HttpResponse response = operationRef.get().getHttpError().get(); - throw new IllegalStateException("operation failed. Http Error Code: " + response.getStatusCode() + - " HttpError: " + response.getMessage()); + if (operationRef.get().httpErrorStatusCode() != null) { + throw new IllegalStateException( + "operation failed. Http Error Code: " + operationRef.get().httpErrorStatusCode() + + " HttpError: " + operationRef.get().httpErrorMessage()); } } - } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java ---------------------------------------------------------------------- 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 c542b9a..99f27e1 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 @@ -29,7 +29,6 @@ import java.util.concurrent.atomic.AtomicReference; import javax.inject.Named; import javax.inject.Singleton; -import com.google.inject.Scopes; import org.jclouds.collect.Memoized; import org.jclouds.compute.ComputeService; import org.jclouds.compute.ComputeServiceAdapter; @@ -45,8 +44,13 @@ import org.jclouds.domain.Location; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; import org.jclouds.googlecomputeengine.compute.GoogleComputeEngineService; import org.jclouds.googlecomputeengine.compute.GoogleComputeEngineServiceAdapter; +import org.jclouds.googlecomputeengine.compute.domain.InstanceInZone; +import org.jclouds.googlecomputeengine.compute.domain.MachineTypeInZone; +import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange; import org.jclouds.googlecomputeengine.compute.extensions.GoogleComputeEngineSecurityGroupExtension; import org.jclouds.googlecomputeengine.compute.functions.BuildInstanceMetadata; +import org.jclouds.googlecomputeengine.compute.functions.CreateNetworkIfNeeded; +import org.jclouds.googlecomputeengine.compute.functions.FindNetworkOrCreate; import org.jclouds.googlecomputeengine.compute.functions.FirewallTagNamingConvention; import org.jclouds.googlecomputeengine.compute.functions.FirewallToIpPermission; import org.jclouds.googlecomputeengine.compute.functions.GoogleComputeEngineImageToImage; @@ -56,7 +60,6 @@ import org.jclouds.googlecomputeengine.compute.functions.NetworkToSecurityGroup; import org.jclouds.googlecomputeengine.compute.functions.OrphanedGroupsFromDeadNodes; import org.jclouds.googlecomputeengine.compute.functions.RegionToLocation; import org.jclouds.googlecomputeengine.compute.functions.ZoneToLocation; -import org.jclouds.googlecomputeengine.compute.loaders.FindNetworkOrCreate; import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions; import org.jclouds.googlecomputeengine.compute.predicates.AllNodesInGroupTerminated; import org.jclouds.googlecomputeengine.compute.strategy.CreateNodesWithGroupEncodedIntoNameThenAddToSet; @@ -66,13 +69,9 @@ import org.jclouds.googlecomputeengine.config.UserProject; import org.jclouds.googlecomputeengine.domain.Firewall; import org.jclouds.googlecomputeengine.domain.Image; import org.jclouds.googlecomputeengine.domain.Instance; -import org.jclouds.googlecomputeengine.domain.InstanceInZone; -import org.jclouds.googlecomputeengine.domain.MachineTypeInZone; import org.jclouds.googlecomputeengine.domain.Network; import org.jclouds.googlecomputeengine.domain.Region; import org.jclouds.googlecomputeengine.domain.Zone; -import org.jclouds.googlecomputeengine.domain.internal.NetworkAndAddressRange; -import org.jclouds.googlecomputeengine.functions.CreateNetworkIfNeeded; import org.jclouds.net.domain.IpPermission; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; @@ -88,6 +87,7 @@ import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableMap; import com.google.inject.Injector; import com.google.inject.Provides; +import com.google.inject.Scopes; import com.google.inject.TypeLiteral; public class GoogleComputeEngineServiceContextModule @@ -240,7 +240,7 @@ public class GoogleComputeEngineServiceContextModule new Function<Region, URI>() { @Override public URI apply(Region input) { - return input.getSelfLink(); + return input.selfLink(); } }); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/InstanceInZone.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/InstanceInZone.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/InstanceInZone.java new file mode 100644 index 0000000..b9cdb8f --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/InstanceInZone.java @@ -0,0 +1,54 @@ +/* + * 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.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.googlecomputeengine.domain.Instance; + +public class InstanceInZone extends SlashEncodedIds { + protected final Instance instance; + + public InstanceInZone(Instance instance, String zoneId) { + super(zoneId, checkNotNull(instance, "instance").name()); + 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 + "]"; + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/MachineTypeInZone.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/MachineTypeInZone.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/MachineTypeInZone.java new file mode 100644 index 0000000..25d491a --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/MachineTypeInZone.java @@ -0,0 +1,54 @@ +/* + * 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.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.googlecomputeengine.domain.MachineType; + +public class MachineTypeInZone extends SlashEncodedIds { + protected final MachineType machineType; + + public MachineTypeInZone(MachineType machineType, String zoneId) { + super(zoneId, checkNotNull(machineType, "machineType").name()); + this.machineType = machineType; + } + + public MachineType machineType() { + 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 + "]"; + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/NetworkAndAddressRange.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/NetworkAndAddressRange.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/NetworkAndAddressRange.java new file mode 100644 index 0000000..d70cc98 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/NetworkAndAddressRange.java @@ -0,0 +1,41 @@ +/* + * 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.domain; + +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; + +import com.google.auto.value.AutoValue; + +/** Container for network, IPv4 range and optional gateway, for creation caching */ +@AutoValue +public abstract class NetworkAndAddressRange { + + public abstract String name(); + + public abstract String rangeIPv4(); + + @Nullable public abstract String gateway(); + + @SerializedNames({ "name", "ipV4Range", "gateway" }) + public static NetworkAndAddressRange create(String name, String rangeIPv4, @Nullable String gateway) { + return new AutoValue_NetworkAndAddressRange(name, rangeIPv4, gateway); + } + + NetworkAndAddressRange() { + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/SlashEncodedIds.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/SlashEncodedIds.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/SlashEncodedIds.java new file mode 100644 index 0000000..ceb5fa4 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/SlashEncodedIds.java @@ -0,0 +1,83 @@ +/* + * 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.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; + +public class SlashEncodedIds { + public static SlashEncodedIds fromSlashEncoded(String id) { + Iterable<String> 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 + "]"; + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java index 2adb7c7..3d46764 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtension.java @@ -26,6 +26,8 @@ import static org.jclouds.googlecomputeengine.predicates.NetworkFirewallPredicat import static org.jclouds.googlecomputeengine.predicates.NetworkFirewallPredicates.providesIpPermission; import static org.jclouds.util.Predicates2.retry; +import java.util.Collection; +import java.util.List; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; @@ -37,14 +39,14 @@ import org.jclouds.compute.extensions.SecurityGroupExtension; import org.jclouds.compute.functions.GroupNamingConvention; import org.jclouds.domain.Location; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange; +import org.jclouds.googlecomputeengine.compute.domain.SlashEncodedIds; import org.jclouds.googlecomputeengine.config.UserProject; import org.jclouds.googlecomputeengine.domain.Firewall; import org.jclouds.googlecomputeengine.domain.Instance; import org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface; import org.jclouds.googlecomputeengine.domain.Network; import org.jclouds.googlecomputeengine.domain.Operation; -import org.jclouds.googlecomputeengine.domain.SlashEncodedIds; -import org.jclouds.googlecomputeengine.domain.internal.NetworkAndAddressRange; import org.jclouds.googlecomputeengine.options.FirewallOptions; import org.jclouds.googlecomputeengine.options.ListOptions; import org.jclouds.googlecomputeengine.options.ListOptions.Builder; @@ -59,11 +61,13 @@ import com.google.common.cache.LoadingCache; import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.util.concurrent.Atomics; /** - * An extension to compute service to allow for the manipulation of {@link org.jclouds.compute.domain.SecurityGroup}s. Implementation + * An extension to compute service to allow for the manipulation of {@link org.jclouds.compute.domain.SecurityGroup}s. + * Implementation * is optional by providers. */ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupExtension { @@ -79,22 +83,20 @@ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupE @Inject public GoogleComputeEngineSecurityGroupExtension(GoogleComputeEngineApi api, - @UserProject Supplier<String> userProject, - GroupNamingConvention.Factory namingConvention, - LoadingCache<NetworkAndAddressRange, Network> networkCreator, - Function<Network, SecurityGroup> groupConverter, - @Named("global") Predicate<AtomicReference<Operation>> operationDonePredicate, - @Named(OPERATION_COMPLETE_INTERVAL) Long operationCompleteCheckInterval, - @Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout) { + @UserProject Supplier<String> userProject, GroupNamingConvention.Factory namingConvention, + LoadingCache<NetworkAndAddressRange, Network> networkCreator, Function<Network, SecurityGroup> groupConverter, + @Named("global") Predicate<AtomicReference<Operation>> operationDonePredicate, + @Named(OPERATION_COMPLETE_INTERVAL) Long operationCompleteCheckInterval, + @Named(OPERATION_COMPLETE_TIMEOUT) Long operationCompleteCheckTimeout) { this.api = checkNotNull(api, "api"); this.userProject = checkNotNull(userProject, "userProject"); this.namingConvention = checkNotNull(namingConvention, "namingConvention"); this.networkCreator = checkNotNull(networkCreator, "networkCreator"); this.groupConverter = checkNotNull(groupConverter, "groupConverter"); this.operationCompleteCheckInterval = checkNotNull(operationCompleteCheckInterval, - "operation completed check interval"); + "operation completed check interval"); this.operationCompleteCheckTimeout = checkNotNull(operationCompleteCheckTimeout, - "operation completed check timeout"); + "operation completed check timeout"); this.operationDonePredicate = checkNotNull(operationDonePredicate, "operationDonePredicate"); } @@ -112,8 +114,8 @@ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupE public Set<SecurityGroup> listSecurityGroupsForNode(String id) { SlashEncodedIds slashEncodedIds = SlashEncodedIds.fromSlashEncoded(id); - Instance instance = api.getInstanceApi(userProject.get()).getInZone(slashEncodedIds.getFirstId(), - slashEncodedIds.getSecondId()); + Instance instance = api.getInstanceApi(userProject.get()) + .getInZone(slashEncodedIds.getFirstId(), slashEncodedIds.getSecondId()); if (instance == null) { return ImmutableSet.of(); @@ -121,12 +123,11 @@ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupE ImmutableSet.Builder builder = ImmutableSet.builder(); - - for (NetworkInterface nwInterface : instance.getNetworkInterfaces()) { - String networkUrl = nwInterface.getNetwork().getPath(); + for (NetworkInterface nwInterface : instance.networkInterfaces()) { + String networkUrl = nwInterface.network().getPath(); Network nw = api.getNetworkApi(userProject.get()).get(networkUrl.substring(networkUrl.lastIndexOf('/') + 1)); - SecurityGroup grp = groupForTagsInNetwork(nw, instance.getTags().getItems()); + SecurityGroup grp = groupForTagsInNetwork(nw, instance.tags().items()); if (grp != null) { builder.add(grp); } @@ -155,7 +156,7 @@ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupE public SecurityGroup createSecurityGroup(String name) { checkNotNull(name, "name"); - NetworkAndAddressRange nAr = new NetworkAndAddressRange(name, DEFAULT_INTERNAL_NETWORK_RANGE, null); + NetworkAndAddressRange nAr = NetworkAndAddressRange.create(name, DEFAULT_INTERNAL_NETWORK_RANGE, null); Network nw = networkCreator.apply(nAr); @@ -174,22 +175,23 @@ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupE FluentIterable<Firewall> fws = api.getFirewallApi(userProject.get()).list(options).concat(); for (Firewall fw : fws) { - AtomicReference<Operation> operation = Atomics.newReference(api.getFirewallApi(userProject.get()) - .delete(fw.getName())); + AtomicReference<Operation> operation = Atomics + .newReference(api.getFirewallApi(userProject.get()).delete(fw.name())); - retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, - MILLISECONDS).apply(operation); + retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS) + .apply(operation); - checkState(!operation.get().getHttpError().isPresent(), "Could not delete firewall, operation failed" + operation); + checkState(operation.get().httpErrorStatusCode() == null, + "Could not delete firewall, operation failed" + operation); } - AtomicReference<Operation> operation = Atomics.newReference( - api.getNetworkApi(userProject.get()).delete(id)); + AtomicReference<Operation> operation = Atomics.newReference(api.getNetworkApi(userProject.get()).delete(id)); - retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, - MILLISECONDS).apply(operation); + retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS) + .apply(operation); - checkState(!operation.get().getHttpError().isPresent(), "Could not insert network, operation failed" + operation); + checkState(operation.get().httpErrorStatusCode() == null, + "Could not insert network, operation failed" + operation); return true; } @@ -218,35 +220,32 @@ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupE if (!ipPermission.getCidrBlocks().isEmpty()) { fwOptions.sourceRanges(ipPermission.getCidrBlocks()); } - Firewall.Rule.Builder ruleBuilder = Firewall.Rule.builder(); - ruleBuilder.IpProtocol(ipPermission.getIpProtocol()); + List<String> ports = Lists.newArrayList(); if (ipPermission.getFromPort() > 0) { if (ipPermission.getFromPort() == ipPermission.getToPort()) { - ruleBuilder.addPort(ipPermission.getToPort()); + ports.add(String.valueOf(ipPermission.getToPort())); } else { - ruleBuilder.addPortRange(ipPermission.getFromPort(), ipPermission.getToPort()); + ports.add(ipPermission.getFromPort() + "-" + ipPermission.getToPort()); } } - fwOptions.addAllowedRule(ruleBuilder.build()); + fwOptions.addAllowedRule(Firewall.Rule.create(ipPermission.getIpProtocol().value().toLowerCase(), ports)); - AtomicReference<Operation> operation = Atomics.newReference(api.getFirewallApi(userProject - .get()).createInNetwork( - uniqueFwName, - group.getUri(), - fwOptions)); + AtomicReference<Operation> operation = Atomics.newReference( + api.getFirewallApi(userProject.get()).createInNetwork(uniqueFwName, group.getUri(), fwOptions)); - retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, - MILLISECONDS).apply(operation); + retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS) + .apply(operation); - checkState(!operation.get().getHttpError().isPresent(), "Could not insert firewall, operation failed" + operation); + checkState(operation.get().httpErrorStatusCode() == null, + "Could not insert firewall, operation failed" + operation); return getSecurityGroupById(group.getId()); } @Override public SecurityGroup addIpPermission(IpProtocol protocol, int fromPort, int toPort, - Multimap<String, String> tenantIdGroupNamePairs, Iterable<String> cidrBlocks, - Iterable<String> groupIds, SecurityGroup group) { + Multimap<String, String> tenantIdGroupNamePairs, Iterable<String> cidrBlocks, Iterable<String> groupIds, + SecurityGroup group) { IpPermission.Builder permBuilder = IpPermission.builder(); permBuilder.ipProtocol(protocol); @@ -272,13 +271,14 @@ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupE for (Firewall fw : fws) { if (equalsIpPermission(ipPermission).apply(fw)) { - AtomicReference<Operation> operation = Atomics.newReference(api.getFirewallApi(userProject.get()) - .delete(fw.getName())); + AtomicReference<Operation> operation = Atomics + .newReference(api.getFirewallApi(userProject.get()).delete(fw.name())); - retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, - MILLISECONDS).apply(operation); + retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS) + .apply(operation); - checkState(!operation.get().getHttpError().isPresent(), "Could not delete firewall, operation failed" + operation); + checkState(operation.get().httpErrorStatusCode() == null, + "Could not delete firewall, operation failed" + operation); } } @@ -287,8 +287,8 @@ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupE @Override public SecurityGroup removeIpPermission(IpProtocol protocol, int fromPort, int toPort, - Multimap<String, String> tenantIdGroupNamePairs, Iterable<String> cidrBlocks, - Iterable<String> groupIds, SecurityGroup group) { + Multimap<String, String> tenantIdGroupNamePairs, Iterable<String> cidrBlocks, Iterable<String> groupIds, + SecurityGroup group) { IpPermission.Builder permBuilder = IpPermission.builder(); permBuilder.ipProtocol(protocol); @@ -326,17 +326,15 @@ public class GoogleComputeEngineSecurityGroupExtension implements SecurityGroupE return false; } - private SecurityGroup groupForTagsInNetwork(Network nw, final Set <String> tags) { - ListOptions opts = new Builder().filter("network eq .*/" + nw.getName()); - Set<Firewall> fws = api.getFirewallApi(userProject.get()).list(opts).concat() - .filter(new Predicate<Firewall>() { - @Override - public boolean apply(final Firewall input) { - // If any of the targetTags on the firewall apply or the firewall has no target tags... - return Iterables.any(input.getTargetTags(), Predicates.in(tags)) - || Predicates.equalTo(0).apply(input.getTargetTags().size()); - } - }).toSet(); + private SecurityGroup groupForTagsInNetwork(Network nw, final Collection<String> tags) { + ListOptions opts = new Builder().filter("network eq .*/" + nw.name()); + List<Firewall> fws = api.getFirewallApi(userProject.get()).list(opts).concat().filter(new Predicate<Firewall>() { + @Override public boolean apply(final Firewall input) { + // If any of the targetTags on the firewall apply or the firewall has no target tags... + return Iterables.any(input.targetTags(), Predicates.in(tags)) || Predicates.equalTo(0) + .apply(input.targetTags().size()); + } + }).toList(); if (fws.isEmpty()) { return null;
