http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/CreateNetworkIfNeeded.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/CreateNetworkIfNeeded.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/CreateNetworkIfNeeded.java new file mode 100644 index 0000000..b797b95 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/CreateNetworkIfNeeded.java @@ -0,0 +1,97 @@ +/* + * 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.base.Preconditions.checkState; +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.concurrent.atomic.AtomicReference; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; + +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange; +import org.jclouds.googlecomputeengine.config.UserProject; +import org.jclouds.googlecomputeengine.domain.Network; +import org.jclouds.googlecomputeengine.domain.Operation; +import org.jclouds.logging.Logger; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.common.util.concurrent.Atomics; + +public class CreateNetworkIfNeeded implements Function<NetworkAndAddressRange, Network> { + @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) + private Logger logger = Logger.NULL; + + private final GoogleComputeEngineApi api; + private final Supplier<String> userProject; + private final Predicate<AtomicReference<Operation>> operationDonePredicate; + private final long operationCompleteCheckInterval; + private final long operationCompleteCheckTimeout; + + @Inject CreateNetworkIfNeeded(GoogleComputeEngineApi api, @UserProject Supplier<String> userProject, + @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.operationCompleteCheckInterval = checkNotNull(operationCompleteCheckInterval, + "operation completed check interval"); + this.operationCompleteCheckTimeout = checkNotNull(operationCompleteCheckTimeout, + "operation completed check timeout"); + this.operationDonePredicate = checkNotNull(operationDonePredicate, "operationDonePredicate"); + } + + @Override + public Network apply(NetworkAndAddressRange input) { + checkNotNull(input, "input"); + + Network nw = api.getNetworkApi(userProject.get()).get(input.name()); + if (nw != null) { + return nw; + } + + if (input.gateway() != null) { + AtomicReference<Operation> operation = Atomics.newReference(api.getNetworkApi(userProject.get()) + .createInIPv4RangeWithGateway(input.name(), input.rangeIPv4(), input.gateway())); + retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS) + .apply(operation); + + checkState(operation.get().httpErrorStatusCode() == null, + "Could not insert network, operation failed" + operation); + } else { + AtomicReference<Operation> operation = Atomics + .newReference(api.getNetworkApi(userProject.get()).createInIPv4Range(input.name(), input.rangeIPv4())); + retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS) + .apply(operation); + + checkState(operation.get().httpErrorStatusCode() == null, + "Could not insert network, operation failed" + operation); + } + return checkNotNull(api.getNetworkApi(userProject.get()).get(input.name()), "no network with name %s was found", + input.name()); + } +}
http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FindNetworkOrCreate.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FindNetworkOrCreate.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FindNetworkOrCreate.java new file mode 100644 index 0000000..2f4c7a4 --- /dev/null +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FindNetworkOrCreate.java @@ -0,0 +1,50 @@ +/* + * 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 javax.inject.Inject; + +import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange; +import org.jclouds.googlecomputeengine.config.UserProject; +import org.jclouds.googlecomputeengine.domain.Network; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.cache.CacheLoader; + +public final class FindNetworkOrCreate extends CacheLoader<NetworkAndAddressRange, Network> { + private final GoogleComputeEngineApi api; + private final Function<NetworkAndAddressRange, Network> networkCreator; + private final Supplier<String> userProject; + + @Inject FindNetworkOrCreate(GoogleComputeEngineApi api, Function<NetworkAndAddressRange, Network> networkCreator, + @UserProject Supplier<String> userProject) { + this.api = api; + this.networkCreator = networkCreator; + this.userProject = userProject; + } + + @Override public Network load(NetworkAndAddressRange in) { + Network network = api.getNetworkApi(userProject.get()).get(in.name()); + if (network != null) { + return network; + } else { + return networkCreator.apply(in); + } + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallTagNamingConvention.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallTagNamingConvention.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallTagNamingConvention.java index 1d2508b..51e331b 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallTagNamingConvention.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallTagNamingConvention.java @@ -16,10 +16,11 @@ */ package org.jclouds.googlecomputeengine.compute.functions; -import com.google.common.base.Predicate; +import javax.inject.Inject; + import org.jclouds.compute.functions.GroupNamingConvention; -import javax.inject.Inject; +import com.google.common.base.Predicate; /** * The convention for naming instance tags that firewall rules recognise. http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallToIpPermission.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallToIpPermission.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallToIpPermission.java index ea069e0..4f58402 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallToIpPermission.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FirewallToIpPermission.java @@ -16,69 +16,49 @@ */ package org.jclouds.googlecomputeengine.compute.functions; -import javax.annotation.Resource; -import javax.inject.Named; +import java.util.List; -import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.googlecomputeengine.domain.Firewall; import org.jclouds.googlecomputeengine.domain.Firewall.Rule; -import org.jclouds.logging.Logger; import org.jclouds.net.domain.IpPermission; import org.jclouds.net.domain.IpProtocol; import com.google.common.base.Function; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Range; +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableList; -/** - * A function for transforming a GCE-specific Firewall into a generic - * IpPermission object. - */ -public class FirewallToIpPermission implements Function<Firewall, Iterable<IpPermission>> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - public FirewallToIpPermission() { - } - - - @Override - public Iterable<IpPermission> apply(Firewall fw) { - ImmutableSet.Builder setBuilder = ImmutableSet.builder(); +public final class FirewallToIpPermission implements Function<Firewall, Iterable<IpPermission>> { + @Override public Iterable<IpPermission> apply(Firewall fw) { + ImmutableList.Builder<IpPermission> rules = ImmutableList.builder(); - for (Rule rule : fw.getAllowed()) { - if (!rule.getPorts().isEmpty()) { - for (Range<Integer> r : rule.getPorts().asRanges()) { - IpPermission.Builder builder = populateBuilder(fw, rule.getIpProtocol()); - builder.fromPort(r.lowerEndpoint()); - builder.toPort(r.upperEndpoint()); - setBuilder.add(builder.build()); + for (Rule rule : fw.allowed()) { + if (rule.ports() != null && !rule.ports().isEmpty()) { + for (String r : rule.ports()) { + IpPermission.Builder builder = populateBuilder(fw, rule.ipProtocol()); + List<String> range = Splitter.on('-').splitToList(r); + int from = Integer.valueOf(range.get(0)); + builder.fromPort(from); + builder.toPort(range.size() == 2 ? Integer.valueOf(range.get(1)) : from); + rules.add(builder.build()); } } else { - setBuilder.add(populateBuilder(fw, rule.getIpProtocol()).build()); + rules.add(populateBuilder(fw, rule.ipProtocol()).build()); } } - return setBuilder.build(); + return rules.build(); } - /** - * Convenience method for populating common parts of the IpPermission. - * @param fw - * @param protocol - * @return a pre-populated builder. - */ - private IpPermission.Builder populateBuilder(Firewall fw, IpProtocol protocol) { + private static IpPermission.Builder populateBuilder(Firewall fw, String protocol) { IpPermission.Builder builder = IpPermission.builder(); - builder.ipProtocol(protocol); + builder.ipProtocol(IpProtocol.fromValue(protocol.toUpperCase())); - if (!fw.getSourceRanges().isEmpty()) { - builder.cidrBlocks(fw.getSourceRanges()); + if (!fw.sourceRanges().isEmpty()) { + builder.cidrBlocks(fw.sourceRanges()); } - if (!fw.getSourceTags().isEmpty()) { - builder.groupIds(fw.getSourceTags()); + if (!fw.sourceTags().isEmpty()) { + builder.groupIds(fw.sourceTags()); } return builder; http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/GoogleComputeEngineImageToImage.java ---------------------------------------------------------------------- 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 b783fc9..41b34bc 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 @@ -33,23 +33,17 @@ 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. - */ -public class GoogleComputeEngineImageToImage implements Function<Image, org.jclouds.compute.domain.Image> { - - - @Override - public org.jclouds.compute.domain.Image apply(Image image) { +public final class GoogleComputeEngineImageToImage implements Function<Image, org.jclouds.compute.domain.Image> { + @Override public org.jclouds.compute.domain.Image apply(Image image) { ImageBuilder builder = new ImageBuilder() - .id(image.getName()) - .name(image.getName()) - .providerId(image.getId()) - .description(image.getDescription().orNull()) + .id(image.name()) + .name(image.name()) + .providerId(image.id()) + .description(image.description()) .status(Status.AVAILABLE) - .uri(image.getSelfLink()); + .uri(image.selfLink()); - List<String> splits = Lists.newArrayList(image.getName().split("-")); + List<String> splits = Lists.newArrayList(image.name().split("-")); OperatingSystem.Builder osBuilder = defaultOperatingSystem(image); if (splits == null || splits.size() == 0 || splits.size() < 3) { return builder.operatingSystem(osBuilder.build()).build(); @@ -63,18 +57,14 @@ public class GoogleComputeEngineImageToImage implements Function<Image, org.jclo 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())); + if (image.deprecated() != null) { + builder.userMetadata(ImmutableMap.of("deprecatedState", image.deprecated().state())); } builder.version(getLast(splits)); return builder.operatingSystem(osBuilder.build()).build(); } private OperatingSystem.Builder defaultOperatingSystem(Image image) { - return OperatingSystem.builder() - .family(OsFamily.LINUX) - .is64Bit(true) - .description(image.getName()); + return OperatingSystem.builder().family(OsFamily.LINUX).is64Bit(true).description(image.name()); } - } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java index c1ddea1..11897a0 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceInZoneToNodeMetadata.java @@ -21,8 +21,8 @@ import static org.jclouds.compute.util.ComputeServiceUtils.groupFromMapOrName; import static org.jclouds.googlecomputeengine.GoogleComputeEngineConstants.GCE_IMAGE_METADATA_KEY; import java.net.URI; +import java.util.List; import java.util.Map; -import java.util.Set; import javax.inject.Inject; @@ -33,22 +33,20 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.functions.GroupNamingConvention; import org.jclouds.domain.Location; -import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; -import org.jclouds.googlecomputeengine.config.UserProject; +import org.jclouds.googlecomputeengine.compute.domain.InstanceInZone; +import org.jclouds.googlecomputeengine.compute.domain.SlashEncodedIds; import org.jclouds.googlecomputeengine.domain.Instance; -import org.jclouds.googlecomputeengine.domain.InstanceInZone; -import org.jclouds.googlecomputeengine.domain.SlashEncodedIds; import com.google.common.base.Function; import com.google.common.base.Predicates; import com.google.common.base.Supplier; import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableList; /** * Transforms a google compute domain Instance into a generic NodeMetatada object. */ -public class InstanceInZoneToNodeMetadata implements Function<InstanceInZone, NodeMetadata> { +public final class InstanceInZoneToNodeMetadata implements Function<InstanceInZone, NodeMetadata> { private final Map<Instance.Status, NodeMetadata.Status> toPortableNodeStatus; private final GroupNamingConvention nodeNamingConvention; @@ -56,60 +54,52 @@ public class InstanceInZoneToNodeMetadata implements Function<InstanceInZone, No private final Supplier<Map<URI, ? extends Hardware>> hardwares; private final Supplier<Map<URI, ? extends Location>> locations; private final FirewallTagNamingConvention.Factory firewallTagNamingConvention; - private final GoogleComputeEngineApi api; - private final Supplier<String> userProject; - @Inject - public InstanceInZoneToNodeMetadata(Map<Instance.Status, NodeMetadata.Status> toPortableNodeStatus, + @Inject InstanceInZoneToNodeMetadata(Map<Instance.Status, NodeMetadata.Status> toPortableNodeStatus, GroupNamingConvention.Factory namingConvention, @Memoized Supplier<Map<URI, ? extends Image>> images, @Memoized Supplier<Map<URI, ? extends Hardware>> hardwares, @Memoized Supplier<Map<URI, ? extends Location>> locations, - FirewallTagNamingConvention.Factory firewallTagNamingConvention, - GoogleComputeEngineApi api, - @UserProject Supplier<String> userProject) { + FirewallTagNamingConvention.Factory firewallTagNamingConvention) { this.toPortableNodeStatus = toPortableNodeStatus; this.nodeNamingConvention = namingConvention.createWithoutPrefix(); this.images = images; this.hardwares = hardwares; this.locations = locations; this.firewallTagNamingConvention = checkNotNull(firewallTagNamingConvention, "firewallTagNamingConvention"); - this.api = checkNotNull(api, "api"); - this.userProject = checkNotNull(userProject, "userProject"); } - @Override - public NodeMetadata apply(InstanceInZone instanceInZone) { + @Override public NodeMetadata apply(InstanceInZone instanceInZone) { Instance input = instanceInZone.getInstance(); - String group = groupFromMapOrName(input.getMetadata().getItems(), - input.getName(), nodeNamingConvention); - FluentIterable<String> tags = FluentIterable.from(input.getTags().getItems()); + String group = groupFromMapOrName(input.metadata().items(), + input.name(), nodeNamingConvention); + FluentIterable<String> tags = FluentIterable.from(input.tags().items()); if (group != null) { tags = tags.filter(Predicates.not(firewallTagNamingConvention.get(group).isFirewallTag())); } NodeMetadataBuilder builder = new NodeMetadataBuilder(); - builder.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()) - .location(checkNotNull(locations.get().get(input.getZone()), "location for %s", input.getZone())) - .hardware(hardwares.get().get(input.getMachineType())) - .status(toPortableNodeStatus.get(input.getStatus())) + builder.id(SlashEncodedIds.fromTwoIds(checkNotNull(locations.get().get(input.zone()), + "location for %s", input.zone()) + .getId(), input.name()).slashEncode()) + .name(input.name()) + .providerId(input.id()) + .hostname(input.name()) + .location(checkNotNull(locations.get().get(input.zone()), "location for %s", input.zone())) + .hardware(hardwares.get().get(input.machineType())) + .status(toPortableNodeStatus.get(input.status())) .tags(tags) - .uri(input.getSelfLink()) - .userMetadata(input.getMetadata().getItems()) + .uri(input.selfLink()) + .userMetadata(input.metadata().items()) .group(group) .privateAddresses(collectPrivateAddresses(input)) .publicAddresses(collectPublicAddresses(input)); - if (input.getMetadata().getItems().containsKey(GCE_IMAGE_METADATA_KEY)) { + if (input.metadata().items().containsKey(GCE_IMAGE_METADATA_KEY)) { try { - URI imageUri = URI.create(input.getMetadata().getItems() + URI imageUri = URI.create(input.metadata().items() .get(GCE_IMAGE_METADATA_KEY)); Map<URI, ? extends Image> imagesMap = images.get(); @@ -126,22 +116,22 @@ public class InstanceInZoneToNodeMetadata implements Function<InstanceInZone, No return builder.build(); } - private Set<String> collectPrivateAddresses(Instance input) { - ImmutableSet.Builder<String> privateAddressesBuilder = ImmutableSet.builder(); - for (Instance.NetworkInterface networkInterface : input.getNetworkInterfaces()) { - if (networkInterface.getNetworkIP().isPresent()) { - privateAddressesBuilder.add(networkInterface.getNetworkIP().get()); + private List<String> collectPrivateAddresses(Instance input) { + ImmutableList.Builder<String> privateAddressesBuilder = ImmutableList.builder(); + for (Instance.NetworkInterface networkInterface : input.networkInterfaces()) { + if (networkInterface.networkIP() != null) { + privateAddressesBuilder.add(networkInterface.networkIP()); } } return privateAddressesBuilder.build(); } - private Set<String> collectPublicAddresses(Instance input) { - ImmutableSet.Builder<String> publicAddressesBuilder = ImmutableSet.builder(); - for (Instance.NetworkInterface networkInterface : input.getNetworkInterfaces()) { - for (Instance.NetworkInterface.AccessConfig accessConfig : networkInterface.getAccessConfigs()) { - if (accessConfig.getNatIP().isPresent()) { - publicAddressesBuilder.add(accessConfig.getNatIP().get()); + private List<String> collectPublicAddresses(Instance input) { + ImmutableList.Builder<String> publicAddressesBuilder = ImmutableList.builder(); + for (Instance.NetworkInterface networkInterface : input.networkInterfaces()) { + for (Instance.NetworkInterface.AccessConfig accessConfig : networkInterface.accessConfigs()) { + if (accessConfig.natIP() != null) { + publicAddressesBuilder.add(accessConfig.natIP()); } } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/MachineTypeInZoneToHardware.java ---------------------------------------------------------------------- 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 index 08ba6d5..b17fb23 100644 --- 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 @@ -31,9 +31,9 @@ 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.compute.domain.MachineTypeInZone; +import org.jclouds.googlecomputeengine.compute.domain.SlashEncodedIds; 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; @@ -59,34 +59,34 @@ public class MachineTypeInZoneToHardware implements Function<MachineTypeInZone, Iterable<? extends Location> zonesForMachineType = filter(locations.get().values(), new Predicate<Location>() { @Override public boolean apply(Location l) { - return l.getId().equals(input.getMachineType().getZone()); + return l.getId().equals(input.machineType().zone()); } }); Location location = checkNotNull(getOnlyElement(zonesForMachineType), "location for %s", - input.getMachineType().getZone()); + input.machineType().zone()); return new HardwareBuilder() - .id(SlashEncodedIds.fromTwoIds(input.getMachineType().getZone(), input.getMachineType().getName()).slashEncode()) + .id(SlashEncodedIds.fromTwoIds(input.machineType().zone(), input.machineType().name()).slashEncode()) .location(location) - .name(input.getMachineType().getName()) + .name(input.machineType().name()) .hypervisor("kvm") - .processor(new Processor(input.getMachineType().getGuestCpus(), 1.0)) - .providerId(input.getMachineType().getId()) - .ram(input.getMachineType().getMemoryMb()) - .uri(input.getMachineType().getSelfLink()) - .volumes(collectVolumes(input.getMachineType())) + .processor(new Processor(input.machineType().guestCpus(), 1.0)) + .providerId(input.machineType().id()) + .ram(input.machineType().memoryMb()) + .uri(input.machineType().selfLink()) + .volumes(collectVolumes(input.machineType())) .supportsImage(Predicates.<Image>alwaysTrue()) .build(); } private Iterable<Volume> collectVolumes(MachineType input) { ImmutableSet.Builder<Volume> volumes = ImmutableSet.builder(); - for (MachineType.ScratchDisk disk : input.getScratchDisks()) { + for (MachineType.ScratchDisk disk : input.scratchDisks()) { volumes.add(new VolumeBuilder() .type(Volume.Type.LOCAL) - .size(Integer.valueOf(disk.getDiskGb()).floatValue()) + .size(Float.valueOf(disk.diskGb())) .bootDevice(true) .durable(false).build()); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroup.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroup.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroup.java index 790f233..8747b44 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroup.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroup.java @@ -61,14 +61,14 @@ public class NetworkToSecurityGroup implements Function<Network, SecurityGroup> public SecurityGroup apply(Network network) { SecurityGroupBuilder builder = new SecurityGroupBuilder(); - builder.id(network.getName()); - builder.providerId(network.getId()); - builder.name(network.getName()); - builder.uri(network.getSelfLink()); + builder.id(network.name()); + builder.providerId(network.id()); + builder.name(network.name()); + builder.uri(network.selfLink()); ImmutableSet.Builder permBuilder = ImmutableSet.builder(); - ListOptions options = new ListOptions.Builder().filter("network eq .*/" + network.getName()); + ListOptions options = new ListOptions.Builder().filter("network eq .*/" + network.name()); for (Firewall fw : api.getFirewallApi(project.get()).list(options).concat()) { permBuilder.addAll(firewallToPerms.apply(fw)); http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/RegionToLocation.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/RegionToLocation.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/RegionToLocation.java index 2f880de..bd2613f 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/RegionToLocation.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/RegionToLocation.java @@ -35,9 +35,9 @@ public class RegionToLocation implements Function<Region, Location> { @Override public Location apply(Region input) { return new LocationBuilder() - .description(input.getDescription().orNull()) - .metadata(ImmutableMap.of("selfLink", (Object) checkNotNull(input.getSelfLink(), "region URI"))) - .id(input.getName()) + .description(input.description()) + .metadata(ImmutableMap.of("selfLink", (Object) checkNotNull(input.selfLink(), "region URI"))) + .id(input.name()) .scope(LocationScope.REGION) .parent(GOOGLE_PROVIDER_LOCATION) .build(); http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/ZoneToLocation.java ---------------------------------------------------------------------- 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 0dc1c78..b4455b9 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 @@ -35,9 +35,9 @@ public class ZoneToLocation implements Function<Zone, Location> { @Override public Location apply(Zone input) { return new LocationBuilder() - .description(input.getDescription().orNull()) - .metadata(ImmutableMap.of("selfLink", (Object) checkNotNull(input.getSelfLink(), "zone URI"))) - .id(input.getName()) + .description(input.description()) + .metadata(ImmutableMap.of("selfLink", (Object) checkNotNull(input.selfLink(), "zone URI"))) + .id(input.name()) .scope(LocationScope.ZONE) .parent(GOOGLE_PROVIDER_LOCATION) .build(); http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/loaders/FindNetworkOrCreate.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/loaders/FindNetworkOrCreate.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/loaders/FindNetworkOrCreate.java deleted file mode 100644 index a849178..0000000 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/loaders/FindNetworkOrCreate.java +++ /dev/null @@ -1,62 +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.loaders; - -import static com.google.common.base.Preconditions.checkNotNull; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; - -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; -import org.jclouds.googlecomputeengine.config.UserProject; -import org.jclouds.googlecomputeengine.domain.Network; -import org.jclouds.googlecomputeengine.domain.internal.NetworkAndAddressRange; -import org.jclouds.logging.Logger; - -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.cache.CacheLoader; - -public class FindNetworkOrCreate extends CacheLoader<NetworkAndAddressRange, Network> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - protected final GoogleComputeEngineApi api; - protected final Function<NetworkAndAddressRange, Network> networkCreator; - protected final Supplier<String> userProject; - - @Inject - public FindNetworkOrCreate(GoogleComputeEngineApi api, - Function<NetworkAndAddressRange, Network> networkCreator, - @UserProject Supplier<String> userProject) { - this.api = checkNotNull(api, "api"); - this.networkCreator = checkNotNull(networkCreator, "networkCreator"); - this.userProject = checkNotNull(userProject, "userProject"); - } - - @Override - public Network load(NetworkAndAddressRange in) { - Network network = api.getNetworkApi(userProject.get()).get(in.getName()); - if (network != null) { - return network; - } else { - return networkCreator.apply(in); - } - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java ---------------------------------------------------------------------- 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 c6aad00..9bb670f 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 @@ -20,18 +20,18 @@ import static com.google.common.base.Optional.fromNullable; import static org.jclouds.googlecomputeengine.domain.Instance.ServiceAccount; import java.net.URI; +import java.util.List; import java.util.Map; -import java.util.Set; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.LoginCredentials; import org.jclouds.googlecomputeengine.domain.Instance; -import org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk; +import org.jclouds.googlecomputeengine.domain.templates.InstanceTemplate.PersistentDisk; import org.jclouds.scriptbuilder.domain.Statement; import com.google.common.base.Optional; import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; +import com.google.common.collect.Lists; /** * Instance options specific to Google Compute Engine. @@ -39,10 +39,9 @@ import com.google.common.collect.Sets; public class GoogleComputeEngineTemplateOptions extends TemplateOptions { private Optional<URI> network = Optional.absent(); - private Optional<String> networkName = Optional.absent(); - private Set<Instance.ServiceAccount> serviceAccounts = Sets.newLinkedHashSet(); + private List<Instance.ServiceAccount> serviceAccounts = Lists.newArrayList(); private boolean enableNat = true; - private Set<PersistentDisk> disks = Sets.newLinkedHashSet(); + private List<PersistentDisk> disks = Lists.newArrayList(); private Optional<Long> bootDiskSize = Optional.absent(); private boolean keepBootDisk = false; @@ -96,14 +95,14 @@ public class GoogleComputeEngineTemplateOptions extends TemplateOptions { * @see #getServiceAccounts() * @see ServiceAccount */ - public GoogleComputeEngineTemplateOptions serviceAccounts(Set<ServiceAccount> serviceAccounts) { - this.serviceAccounts = Sets.newLinkedHashSet(serviceAccounts); + public GoogleComputeEngineTemplateOptions serviceAccounts(List<ServiceAccount> serviceAccounts) { + this.serviceAccounts = Lists.newArrayList(serviceAccounts); return this; } /** * @see #getDisks() - * @see org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk + * @see org.jclouds.googlecomputeengine.domain.templates.InstanceTemplate.PersistentDisk */ public GoogleComputeEngineTemplateOptions addDisk(PersistentDisk disk) { this.disks.add(disk); @@ -112,10 +111,10 @@ public class GoogleComputeEngineTemplateOptions extends TemplateOptions { /** * @see #getDisks() - * @see org.jclouds.googlecomputeengine.domain.InstanceTemplate.PersistentDisk + * @see org.jclouds.googlecomputeengine.domain.templates.InstanceTemplate.PersistentDisk */ - public GoogleComputeEngineTemplateOptions disks(Set<PersistentDisk> disks) { - this.disks = Sets.newLinkedHashSet(disks); + public GoogleComputeEngineTemplateOptions disks(List<PersistentDisk> disks) { + this.disks = Lists.newArrayList(disks); return this; } @@ -330,14 +329,14 @@ public class GoogleComputeEngineTemplateOptions extends TemplateOptions { /** * @return the ServiceAccounts to enable in the instances. */ - public Set<Instance.ServiceAccount> getServiceAccounts() { + public List<Instance.ServiceAccount> getServiceAccounts() { return serviceAccounts; } /** * @return the PersistentDisks for this instance. */ - public Set<PersistentDisk> getDisks() { + public List<PersistentDisk> getDisks() { return disks; } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java ---------------------------------------------------------------------- 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 622bc84..b2ba892 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,14 +16,14 @@ */ package org.jclouds.googlecomputeengine.compute.strategy; -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 com.google.common.collect.ImmutableList.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.List; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; @@ -41,22 +41,23 @@ import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName; import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap; import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange; import org.jclouds.googlecomputeengine.compute.functions.FirewallTagNamingConvention; import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions; import org.jclouds.googlecomputeengine.config.UserProject; import org.jclouds.googlecomputeengine.domain.Firewall; +import org.jclouds.googlecomputeengine.domain.Firewall.Rule; import org.jclouds.googlecomputeengine.domain.Network; import org.jclouds.googlecomputeengine.domain.Operation; -import org.jclouds.googlecomputeengine.domain.internal.NetworkAndAddressRange; import org.jclouds.googlecomputeengine.features.FirewallApi; import org.jclouds.googlecomputeengine.options.FirewallOptions; import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.common.cache.LoadingCache; -import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import com.google.common.util.concurrent.Atomics; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; @@ -75,8 +76,7 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends private final long operationCompleteCheckTimeout; private final FirewallTagNamingConvention.Factory firewallTagNamingConvention; - @Inject - protected CreateNodesWithGroupEncodedIntoNameThenAddToSet( + @Inject CreateNodesWithGroupEncodedIntoNameThenAddToSet( CreateNodeWithGroupEncodedIntoName addNodeWithGroupStrategy, ListNodesStrategy listNodesStrategy, GroupNamingConvention.Factory namingConvention, @@ -93,19 +93,16 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends FirewallTagNamingConvention.Factory firewallTagNamingConvention) { super(addNodeWithGroupStrategy, listNodesStrategy, namingConvention, userExecutor, customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory); - - this.api = checkNotNull(api, "google compute api"); - this.userProject = checkNotNull(userProject, "user project name"); - this.operationCompleteCheckInterval = checkNotNull(operationCompleteCheckInterval, - "operation completed check interval"); - this.operationCompleteCheckTimeout = checkNotNull(operationCompleteCheckTimeout, - "operation completed check timeout"); - this.operationDonePredicate = checkNotNull(operationDonePredicate, "operationDonePredicate"); - this.networkMap = checkNotNull(networkMap, "networkMap"); - this.firewallTagNamingConvention = checkNotNull(firewallTagNamingConvention, "firewallTagNamingConvention"); + this.api = api; + this.userProject = userProject; + this.operationCompleteCheckInterval = operationCompleteCheckInterval; + this.operationCompleteCheckTimeout = operationCompleteCheckTimeout; + this.operationDonePredicate = operationDonePredicate; + this.networkMap = networkMap; + this.firewallTagNamingConvention = firewallTagNamingConvention; } - @Override + @Override // TODO: why synchronized? public synchronized Map<?, ListenableFuture<Void>> execute(String group, int count, Template template, Set<NodeMetadata> goodNodes, @@ -121,7 +118,7 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends // get or insert the network and insert a firewall with the users configuration Network network = getOrCreateNetwork(templateOptions, sharedResourceName); getOrCreateFirewalls(templateOptions, network, firewallTagNamingConvention.get(group)); - templateOptions.network(network.getSelfLink()); + templateOptions.network(network.selfLink()); templateOptions.userMetadata(ComputeServiceConstants.NODE_GROUP_KEY, group); return super.execute(group, count, mutableTemplate, goodNodes, badNodes, customizationResponses); @@ -134,7 +131,7 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends String networkName = templateOptions.getNetworkName().or(sharedResourceName); - return networkMap.apply(new NetworkAndAddressRange(networkName, DEFAULT_INTERNAL_NETWORK_RANGE, null)); + return networkMap.apply(NetworkAndAddressRange.create(networkName, DEFAULT_INTERNAL_NETWORK_RANGE, null)); } /** @@ -150,24 +147,24 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends String projectName = userProject.get(); FirewallApi firewallApi = api.getFirewallApi(projectName); - Set<AtomicReference<Operation>> operations = Sets.newLinkedHashSet(); - + List<AtomicReference<Operation>> operations = Lists.newArrayList(); for (Integer port : templateOptions.getInboundPorts()) { String name = naming.name(port); Firewall firewall = firewallApi.get(name); if (firewall == null) { - ImmutableSet<Firewall.Rule> rules = ImmutableSet.of(Firewall.Rule.permitTcpRule(port), Firewall.Rule.permitUdpRule(port)); + List<String> ports = ImmutableList.of(String.valueOf(port)); + List<Rule> rules = ImmutableList.of(Rule.create("tcp", ports), Rule.create("udp", ports)); FirewallOptions firewallOptions = new FirewallOptions() .name(name) - .network(network.getSelfLink()) + .network(network.selfLink()) .allowedRules(rules) .sourceTags(templateOptions.getTags()) .sourceRanges(of(DEFAULT_INTERNAL_NETWORK_RANGE, EXTERIOR_RANGE)) - .targetTags(ImmutableSet.of(name)); + .targetTags(ImmutableList.of(name)); AtomicReference<Operation> operation = Atomics.newReference(firewallApi.createInNetwork( - firewallOptions.getName(), - network.getSelfLink(), + firewallOptions.name(), + network.selfLink(), firewallOptions)); operations.add(operation); } @@ -176,7 +173,7 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends for (AtomicReference<Operation> operation : operations) { retry(operationDonePredicate, operationCompleteCheckTimeout, operationCompleteCheckInterval, MILLISECONDS).apply(operation); - checkState(!operation.get().getHttpError().isPresent(), + checkState(operation.get().httpErrorStatusCode() == null, "Could not insert firewall, operation failed" + operation); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineHttpApiModule.java ---------------------------------------------------------------------- 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 2a1b3f2..d63f175 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 @@ -29,9 +29,9 @@ import javax.inject.Singleton; import org.jclouds.domain.Credentials; import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; +import org.jclouds.googlecomputeengine.compute.domain.SlashEncodedIds; 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.GlobalOperationDonePredicate; import org.jclouds.googlecomputeengine.predicates.RegionOperationDonePredicate; @@ -112,7 +112,7 @@ public class GoogleComputeEngineHttpApiModule extends HttpApiModule<GoogleComput } } Project project = api.getProjectApi().get(projectName); - return project.getName(); + return project.name(); } }, creds), seconds, TimeUnit.SECONDS); } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/config/GoogleComputeEngineParserModule.java ---------------------------------------------------------------------- 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 e42cbc7..c0a7883 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 @@ -18,42 +18,38 @@ package org.jclouds.googlecomputeengine.config; import static org.jclouds.googlecomputeengine.domain.Firewall.Rule; -import java.beans.ConstructorProperties; +import java.io.IOException; 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.Metadata; -import org.jclouds.googlecomputeengine.domain.Operation; -import org.jclouds.googlecomputeengine.domain.Project; -import org.jclouds.googlecomputeengine.domain.Quota; +import org.jclouds.googlecomputeengine.domain.templates.InstanceTemplate; import org.jclouds.googlecomputeengine.options.FirewallOptions; import org.jclouds.googlecomputeengine.options.RouteOptions; import org.jclouds.json.config.GsonModule; -import org.jclouds.net.domain.IpProtocol; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Range; +import com.google.common.collect.ImmutableSet; +import com.google.gson.Gson; import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; import com.google.inject.AbstractModule; import com.google.inject.Provides; -public class GoogleComputeEngineParserModule extends AbstractModule { +public final class GoogleComputeEngineParserModule extends AbstractModule { @Override protected void configure() { bind(GsonModule.DateAdapter.class).to(GsonModule.Iso8601DateAdapter.class); @@ -61,89 +57,37 @@ public class GoogleComputeEngineParserModule extends AbstractModule { @Provides @Singleton public Map<Type, Object> typeAdapters() { return new ImmutableMap.Builder<Type, Object>() - .put(Metadata.class, new MetadataTypeAdapter()) - .put(Operation.class, new OperationTypeAdapter()) - .put(Project.class, new ProjectTypeAdapter()) - .put(Instance.class, new InstanceTypeAdapter()) - .put(InstanceTemplate.class, new InstanceTemplateTypeAdapter()) - .put(FirewallOptions.class, new FirewallOptionsTypeAdapter()) - .put(RouteOptions.class, new RouteOptionsTypeAdapter()) - .put(Rule.class, new RuleTypeAdapter()) - .build(); + .put(InstanceTemplate.class, new InstanceTemplateTypeAdapter()) + .put(FirewallOptions.class, new FirewallOptionsTypeAdapter()) + .put(RouteOptions.class, new RouteOptionsTypeAdapter()).build(); } - /** - * Parser for operations that unwraps errors avoiding an extra intermediate object. - * - * @see <a href="https://developers.google.com/compute/docs/reference/v1/operations"/> - */ - private static class OperationTypeAdapter implements JsonDeserializer<Operation> { - - @Override - public Operation deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws - JsonParseException { - Operation.Builder operationBuilder = ((Operation) context.deserialize(json, - OperationInternal.class)).toBuilder(); - JsonObject error = json.getAsJsonObject().getAsJsonObject("error"); - if (error != null) { - JsonArray array = error.getAsJsonArray("errors"); - if (array != null) { - for (JsonElement element : array) { - operationBuilder.addError((Operation.Error) context.deserialize(element, Operation.Error.class)); - } - } - } - return operationBuilder.build(); - } - - 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", "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, URI region, URI zone) { - super(id, creationTimestamp, selfLink, name, description, targetLink, targetId, clientOperationId, - status, statusMessage, user, progress, insertTime, startTime, endTime, httpErrorStatusCode, - httpErrorMessage, operationType, null, region, zone); - } - } + // TODO: change jclouds core to use collaborative set bindings + @Provides @Singleton public Set<TypeAdapterFactory> typeAdapterFactories() { + return ImmutableSet.<TypeAdapterFactory>of(new MetadataTypeAdapter()); } private static class InstanceTemplateTypeAdapter implements JsonSerializer<InstanceTemplate> { - @Override - public JsonElement serialize(InstanceTemplate src, Type typeOfSrc, JsonSerializationContext context) { + @Override public JsonElement serialize(InstanceTemplate src, Type typeOfSrc, JsonSerializationContext context) { InstanceTemplateInternal template = new InstanceTemplateInternal(src); JsonObject instance = (JsonObject) context.serialize(template, InstanceTemplateInternal.class); // deal with network JsonArray networkInterfaces = new JsonArray(); - for (InstanceTemplate.NetworkInterface networkInterface : template.getNetworkInterfaces()){ + for (InstanceTemplate.NetworkInterface networkInterface : template.networkInterfaces()) { networkInterfaces.add(context.serialize(networkInterface, InstanceTemplate.NetworkInterface.class)); } instance.add("networkInterfaces", networkInterfaces); // deal with persistent disks - if (src.getDisks() != null && !src.getDisks().isEmpty()) { - JsonArray disks = new JsonArray(); - for (InstanceTemplate.PersistentDisk persistentDisk : src.getDisks()) { - JsonObject disk = (JsonObject) context.serialize(persistentDisk, InstanceTemplate.PersistentDisk.class); - disk.addProperty("type", "PERSISTENT"); - disks.add(disk); - } - instance.add("disks", disks); + if (!src.disks().isEmpty()) { + instance.add("disks", context.serialize(src.disks())); } // deal with metadata - if (src.getMetadata() != null && !src.getMetadata().isEmpty()) { - Metadata metadata = Metadata.builder() - .items(src.getMetadata()) - .build(); + if (!src.metadata().isEmpty()) { + Metadata metadata = Metadata.create(null, src.metadata()); JsonObject metadataJson = (JsonObject) context.serialize(metadata); instance.add("metadata", metadataJson); return instance; @@ -154,142 +98,95 @@ public class GoogleComputeEngineParserModule extends AbstractModule { private static class InstanceTemplateInternal extends InstanceTemplate { private InstanceTemplateInternal(InstanceTemplate template) { - super(template.getMachineType()); - name(template.getName()); - description(template.getDescription()); - image(template.getImage()); - serviceAccounts(template.getServiceAccounts()); - networkInterfaces(template.getNetworkInterfaces()); + machineType(template.machineType()); + name(template.name()); + description(template.description()); + image(template.image()); + serviceAccounts(template.serviceAccounts()); + networkInterfaces(template.networkInterfaces()); } } } - private static class InstanceTypeAdapter implements JsonDeserializer<Instance> { + private static class MetadataTypeAdapter extends SubtypeAdapterFactory<Metadata> { - @Override - public Instance deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws - JsonParseException { - Instance.Builder instanceBuilder = ((Instance) context.deserialize(json, - InstanceInternal.class)).toBuilder(); - JsonObject object = (JsonObject) json; - if (object.get("disks") != null) { - JsonArray disks = (JsonArray) object.get("disks"); - for (JsonElement element : disks) { - JsonObject disk = (JsonObject) element; - if (disk.get("type").getAsString().equals("PERSISTENT")) { - instanceBuilder.addDisk((Instance.PersistentAttachedDisk) context.deserialize(disk, - Instance.PersistentAttachedDisk.class)); - } else { - instanceBuilder.addDisk((Instance.AttachedDisk) context.deserialize(disk, - Instance.AttachedDisk.class)); - } - } - - } - - return Instance.builder().fromInstance(instanceBuilder.build()).build(); + private MetadataTypeAdapter() { + super(Metadata.class); } - - private static class InstanceInternal extends Instance { - @ConstructorProperties({ - "id", "creationTimestamp", "selfLink", "name", "description", "tags", "machineType", - "status", "statusMessage", "zone", "networkInterfaces", "metadata", "serviceAccounts" - }) - private InstanceInternal(String id, Date creationTimestamp, URI selfLink, String name, String description, - Tags tags, URI machineType, Status status, String statusMessage, - URI zone, Set<NetworkInterface> networkInterfaces, Metadata metadata, - Set<ServiceAccount> serviceAccounts) { - super(id, creationTimestamp, selfLink, name, description, tags, machineType, - status, statusMessage, zone, networkInterfaces, null, metadata, serviceAccounts); + @Override public void write(JsonWriter out, Metadata src) throws IOException { + out.beginObject(); + out.name("kind").value("compute#metadata"); + out.name("items"); + out.beginArray(); + for (Map.Entry<String, String> entry : src.items().entrySet()) { + out.beginObject(); + out.name("key").value(entry.getKey()); + out.name("value").value(entry.getValue()); + out.endObject(); + } + out.endArray(); + if (src.fingerprint() != null) { + out.name("fingerprint").value(src.fingerprint()); } + out.endObject(); } - } - - private static class MetadataTypeAdapter implements JsonDeserializer<Metadata>, JsonSerializer<Metadata> { - @Override - public Metadata deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws - JsonParseException { + @Override public Metadata read(JsonReader in) throws IOException { + String fingerprint = null; ImmutableMap.Builder<String, String> builder = ImmutableMap.builder(); - JsonObject metadata = json.getAsJsonObject(); - JsonArray items = metadata.getAsJsonArray("items"); - if (items != null) { - for (JsonElement element : items) { - JsonObject object = element.getAsJsonObject(); - builder.put(object.get("key").getAsString(), object.get("value").getAsString()); + in.beginObject(); + while (in.hasNext()) { + String name = in.nextName(); + if (name.equals("items")) { + in.beginArray(); + while (in.hasNext()) { + in.beginObject(); + String key = null; + String value = null; + while (in.hasNext()) { + name = in.nextName(); + if (name.equals("key")) { + key = in.nextString(); + } else if (name.equals("value")) { + value = in.nextString(); + } else { + in.skipValue(); + } + } + builder.put(key, value); + in.endObject(); + } + in.endArray(); + } else if (name.equals("fingerprint")) { + fingerprint = in.nextString(); + } else { + in.skipValue(); } } - String fingerprint = null; - if (metadata.getAsJsonPrimitive("fingerprint") != null) { - fingerprint = metadata.getAsJsonPrimitive("fingerprint").getAsString(); - } else { - fingerprint = ""; - } - return new Metadata(fingerprint, builder.build()); - } - - @Override - public JsonElement serialize(Metadata src, Type typeOfSrc, JsonSerializationContext context) { - JsonObject metadataObject = new JsonObject(); - metadataObject.add("kind", new JsonPrimitive("compute#metadata")); - JsonArray items = new JsonArray(); - for (Map.Entry<String, String> entry : src.getItems().entrySet()) { - JsonObject object = new JsonObject(); - object.addProperty("key", entry.getKey()); - object.addProperty("value", entry.getValue()); - items.add(object); - } - metadataObject.add("items", items); - if (src.getFingerprint() != null) { - metadataObject.addProperty("fingerprint", src.getFingerprint()); - } - return metadataObject; - } - } - - private static class ProjectTypeAdapter implements JsonDeserializer<Project> { - - @Override - public Project deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws - JsonParseException { - return Project.builder().fromProject((Project) context.deserialize(json, ProjectInternal.class)).build(); - } - - private static class ProjectInternal extends Project { - - @ConstructorProperties({ - "id", "creationTimestamp", "selfLink", "name", "description", "commonInstanceMetadata", "quotas", - "externalIpAddresses" - }) - private ProjectInternal(String id, Date creationTimestamp, URI selfLink, String name, String description, - Metadata commonInstanceMetadata, Set<Quota> quotas, Set<String> externalIpAddresses) { - super(id, creationTimestamp, selfLink, name, description, commonInstanceMetadata, quotas, - externalIpAddresses); - } - + in.endObject(); + return Metadata.create(fingerprint, builder.build()); } } private static class FirewallOptionsTypeAdapter implements JsonSerializer<FirewallOptions> { - @Override - public JsonElement serialize(FirewallOptions src, Type typeOfSrc, JsonSerializationContext context) { + @Override public JsonElement serialize(FirewallOptions src, Type typeOfSrc, JsonSerializationContext context) { JsonObject firewall = new JsonObject(); - if (src.getName() != null) { - firewall.addProperty("name", src.getName()); + if (src.name() != null) { + firewall.addProperty("name", src.name()); } - if (src.getNetwork() != null) { - firewall.addProperty("network", src.getNetwork().toString()); + if (src.network() != null) { + firewall.addProperty("network", src.network().toString()); } - if (!src.getSourceRanges().isEmpty()) { - firewall.add("sourceRanges", buildArrayOfStrings(src.getSourceRanges())); + if (!src.sourceRanges().isEmpty()) { + firewall.add("sourceRanges", buildArrayOfStrings(src.sourceRanges())); } - if (!src.getSourceTags().isEmpty()) { - firewall.add("sourceTags", buildArrayOfStrings(src.getSourceTags())); + if (!src.sourceTags().isEmpty()) { + firewall.add("sourceTags", buildArrayOfStrings(src.sourceTags())); } - if (!src.getTargetTags().isEmpty()) { - firewall.add("targetTags", buildArrayOfStrings(src.getTargetTags())); + if (!src.targetTags().isEmpty()) { + firewall.add("targetTags", buildArrayOfStrings(src.targetTags())); } if (!src.getAllowed().isEmpty()) { JsonArray rules = new JsonArray(); @@ -304,11 +201,10 @@ public class GoogleComputeEngineParserModule extends AbstractModule { private static class RouteOptionsTypeAdapter implements JsonSerializer<RouteOptions> { - @Override - public JsonElement serialize(RouteOptions src, Type typeOfSrc, JsonSerializationContext context) { + @Override public JsonElement serialize(RouteOptions src, Type typeOfSrc, JsonSerializationContext context) { JsonObject route = new JsonObject(); - if (src.getName() != null) { - route.addProperty("name", src.getName()); + if (src.name() != null) { + route.addProperty("name", src.name()); } if (src.getNetwork() != null) { route.addProperty("network", src.getNetwork().toString()); @@ -341,7 +237,7 @@ public class GoogleComputeEngineParserModule extends AbstractModule { } } - private static JsonArray buildArrayOfStrings(Set<String> strings) { + private static JsonArray buildArrayOfStrings(Iterable<String> strings) { JsonArray array = new JsonArray(); for (String string : strings) { array.add(new JsonPrimitive(string)); @@ -349,43 +245,18 @@ public class GoogleComputeEngineParserModule extends AbstractModule { return array; } + private abstract static class SubtypeAdapterFactory<T> extends TypeAdapter<T> implements TypeAdapterFactory { + private final Class<T> baseClass; - private static class RuleTypeAdapter implements JsonDeserializer<Firewall.Rule>, JsonSerializer<Firewall.Rule> { - - @Override - public Firewall.Rule deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws - JsonParseException { - JsonObject rule = json.getAsJsonObject(); - Rule.Builder builder = Rule.builder(); - builder.IpProtocol(IpProtocol.fromValue(rule.get("IPProtocol").getAsString())); - if (rule.get("ports") != null) { - JsonArray ports = (JsonArray) rule.get("ports"); - for (JsonElement port : ports) { - String portAsString = port.getAsString(); - if (portAsString.contains("-")) { - String[] split = portAsString.split("-"); - builder.addPortRange(Integer.parseInt(split[0]), Integer.parseInt(split[1])); - } else { - builder.addPort(Integer.parseInt(portAsString)); - } - } - } - return builder.build(); + private SubtypeAdapterFactory(Class<T> baseClass) { + this.baseClass = baseClass; } - @Override - public JsonElement serialize(Firewall.Rule src, Type typeOfSrc, JsonSerializationContext context) { - JsonObject ruleObject = new JsonObject(); - ruleObject.addProperty("IPProtocol", src.getIpProtocol().value()); - if (src.getPorts() != null && !src.getPorts().isEmpty()) { - JsonArray ports = new JsonArray(); - for (Range<Integer> range : src.getPorts().asRanges()) { - ports.add(new JsonPrimitive(range.lowerEndpoint() == range.upperEndpoint() ? range.lowerEndpoint() + "" : - range.lowerEndpoint() + "-" + range.upperEndpoint())); - } - ruleObject.add("ports", ports); + @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { + if (!(baseClass.isAssignableFrom(typeToken.getRawType()))) { + return null; } - return ruleObject; + return (TypeAdapter<T>) this; } } } http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java ---------------------------------------------------------------------- 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 deleted file mode 100644 index e4b7986..0000000 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AbstractDisk.java +++ /dev/null @@ -1,120 +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.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 - */ -@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} - */ - @Override - 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<T extends Builder<T>> extends Resource.Builder<T> { - - 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<ConcreteBuilder> { - @Override - protected ConcreteBuilder self() { - return this; - } - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/b41b0d04/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java ---------------------------------------------------------------------- diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java index 9b0d083..1dea66f 100644 --- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java +++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/Address.java @@ -16,162 +16,46 @@ */ package org.jclouds.googlecomputeengine.domain; -import java.beans.ConstructorProperties; import java.net.URI; -import java.util.Date; -import com.google.common.annotations.Beta; -import com.google.common.base.Objects; -import com.google.common.base.Optional; +import org.jclouds.javax.annotation.Nullable; +import org.jclouds.json.SerializedNames; -import static com.google.common.base.Objects.equal; -import static com.google.common.base.Optional.fromNullable; -import static com.google.common.base.Preconditions.checkNotNull; +import com.google.auto.value.AutoValue; -/** - * Represents an Address resource. - */ -@Beta -public final class Address extends Resource { +@AutoValue +public abstract class Address { - private final String status; - private final Optional<URI> user; - private final URI region; - private final String address; + public abstract String id(); - @ConstructorProperties({ - "id", "creationTimestamp", "selfLink", "name", "description", "status", "user", - "region", "address" - }) - private Address(String id, Date creationTimestamp, URI selfLink, String name, String description, - String status, URI user, URI region, String address) { - super(Kind.ADDRESS, id, creationTimestamp, selfLink, name, description); - this.status = checkNotNull(status, "status of %s", name); - this.user = fromNullable(user); - this.region = checkNotNull(region, "region of %s", name); - this.address = checkNotNull(address, "address of %s", name); - } + public abstract URI selfLink(); - /** - * @return The status of the address. Valid items are RESERVED and IN USE. - * A reserved address is currently available to the project and can be - * used by a resource. An in-use address is currently being used by a resource. - */ - public String getStatus() { - return status; - } - - /** - * @return URL of the resource currently using this address. - */ - public Optional<URI> getUser() { - return user; - } + public abstract String name(); - /** - * @return URL of the region where the address resides. - */ - public URI getRegion() { - return region; - } + @Nullable public abstract String description(); /** - * @return The IP address represented by this resource. + * The status of the address. Valid items are RESERVED and IN USE. + * A reserved address is currently available to the project and can be + * used by a resource. An in-use address is currently being used by a resource. */ - public String getAddress() { - return address; - } + public abstract String status(); // TODO: enum - /** - * {@inheritDoc} - */ - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (obj == null || getClass() != obj.getClass()) return false; - Address that = Address.class.cast(obj); - return equal(this.kind, that.kind) - && equal(this.name, that.name) - && equal(this.region, that.region); - } + /** URL of the resource currently using this address. */ + @Nullable public abstract URI user(); - /** - * {@inheritDoc} - */ - @SuppressWarnings("deprecation") - @Override - protected Objects.ToStringHelper string() { - return super.string() - .omitNullValues() - .add("status", status) - .add("user", user.orNull()) - .add("region", region) - .add("address", address); - } + /** URL of the region where the address resides. */ + public abstract URI region(); - public static Builder builder() { - return new Builder(); - } + /** The IP address represented by this resource. */ + public abstract String address(); - public Builder toBuilder() { - return new Builder().fromAddress(this); + @SerializedNames({ "id", "selfLink", "name", "description", "status", "user", "region", "address" }) + public static Address create(String id, URI selfLink, String name, String description, String status, URI user, + URI region, String address) { + return new AutoValue_Address(id, selfLink, name, description, status, user, region, address); } - public static final class Builder extends Resource.Builder<Builder> { - private String status; - private URI user; - private URI region; - private String address; - - /** - * @see org.jclouds.googlecomputeengine.domain.Address#getStatus() - */ - public Builder status(String status) { - this.status = status; - return this; - } - - /** - * @see org.jclouds.googlecomputeengine.domain.Address#getUser() - */ - public Builder user(URI user) { - this.user = user; - return this; - } - - /** - * @see org.jclouds.googlecomputeengine.domain.Address#getRegion() - */ - public Builder region(URI region) { - this.region = region; - return this; - } - - /** - * @see org.jclouds.googlecomputeengine.domain.Address#getAddress() - */ - public Builder address(String address) { - this.address = address; - return this; - } - - @Override - protected Builder self() { - return this; - } - - public Address build() { - return new Address(super.id, super.creationTimestamp, super.selfLink, super.name, - super.description, status, user, region, address); - } - - public Builder fromAddress(Address in) { - return super.fromResource(in) - .status(in.getStatus()) - .user(in.getUser().orNull()) - .region(in.getRegion()) - .address(in.getAddress()); - } + Address() { } - }
