You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2015/05/19 21:39:26 UTC

jclouds-labs-google git commit: Removing network management, use default network, use fewer firewalls.

Repository: jclouds-labs-google
Updated Branches:
  refs/heads/master 4a514501f -> cd16d5930


Removing network management, use default network, use fewer firewalls.


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/cd16d593
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/tree/cd16d593
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/diff/cd16d593

Branch: refs/heads/master
Commit: cd16d593005dfd2bec46ada665a1ae8af675eb8c
Parents: 4a51450
Author: Daniel Broudy <br...@google.com>
Authored: Thu Apr 23 13:39:03 2015 -0700
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue May 19 15:39:55 2015 +0200

----------------------------------------------------------------------
 .../compute/GoogleComputeEngineService.java     |  37 ++----
 .../GoogleComputeEngineServiceAdapter.java      |  21 ++-
 ...GoogleComputeEngineServiceContextModule.java |  18 ---
 .../compute/domain/NetworkAndAddressRange.java  |  41 ------
 .../functions/CreateNetworkIfNeeded.java        |  74 -----------
 .../compute/functions/FindNetworkOrCreate.java  |  45 -------
 .../functions/FirewallTagNamingConvention.java  |  14 +-
 .../functions/InstanceToNodeMetadata.java       |   1 -
 .../GoogleComputeEngineTemplateOptions.java     |  15 ---
 ...desWithGroupEncodedIntoNameThenAddToSet.java | 123 ++++++++++++------
 .../GoogleComputeEngineServiceLiveTest.java     |   9 ++
 .../GoogleComputeEngineServiceMockTest.java     |  52 +++-----
 .../functions/CreateNetworkIfNeededTest.java    | 130 -------------------
 .../functions/FindNetworkOrCreateTest.java      | 130 -------------------
 .../parse/ParseNetworkTest.java                 |   4 +-
 .../parse/SimpleParsingTests.java               |  82 ++++++++++++
 .../firewall_list.json                          |   3 +-
 .../src/test/resources/firewall_insert_2.json   |   6 +-
 .../src/test/resources/instance_insert_2.json   |   4 +-
 .../src/test/resources/network_get.json         |   4 +-
 .../src/test/resources/network_get_default.json |  10 ++
 .../src/test/resources/network_list.json        |   4 +-
 22 files changed, 258 insertions(+), 569 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/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 ed7c5fb..241a91d 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
@@ -58,7 +58,6 @@ import org.jclouds.domain.Location;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
 import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions;
 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.scriptbuilder.functions.InitAdminAccess;
@@ -125,36 +124,26 @@ public final class GoogleComputeEngineService extends BaseComputeService {
    protected synchronized void cleanUpIncidentalResourcesOfDeadNodes(Set<? extends NodeMetadata> deadNodes) {
       Set<String> orphanedGroups = findOrphanedGroups.apply(deadNodes);
       for (String orphanedGroup : orphanedGroups) {
-         cleanUpNetworksAndFirewallsForGroup(orphanedGroup);
+         cleanUpFirewallsForGroup(orphanedGroup);
       }
    }
 
-   private void cleanUpNetworksAndFirewallsForGroup(final String groupName) {
-      String resourceName = namingConvention.create().sharedNameForGroup(groupName);
-      Network network = api.networks().get(resourceName);
+   private void cleanUpFirewallsForGroup(final String groupName) {
+      GroupNamingConvention namingScheme = namingConvention.create();
       FirewallApi firewallApi = api.firewalls();
 
       for (Firewall firewall : concat(firewallApi.list())) {
-         if (firewall == null || !firewall.network().equals(network.selfLink())) {
-            continue;
+         String foundGroup = namingScheme.groupInUniqueNameOrNull(firewall.name());
+         if ((foundGroup != null) && foundGroup.equals(groupName)){
+            AtomicReference<Operation> operation = Atomics.newReference(firewallApi.delete(firewall.name()));
+            operationDone.apply(operation);
+
+            if (operation.get().httpErrorStatusCode() != null) {
+               logger.warn("delete orphaned firewall %s failed. Http Error Code: %d HttpError: %s",
+                     operation.get().targetId(), operation.get().httpErrorStatusCode(),
+                     operation.get().httpErrorMessage());
+            }
          }
-         AtomicReference<Operation> operation = Atomics.newReference(firewallApi.delete(firewall.name()));
-         operationDone.apply(operation);
-
-         if (operation.get().httpErrorStatusCode() != null) {
-            logger.warn("delete orphaned firewall %s failed. Http Error Code: %d HttpError: %s",
-                  operation.get().targetId(), operation.get().httpErrorStatusCode(),
-                  operation.get().httpErrorMessage());
-         }
-      }
-
-      AtomicReference<Operation> operation = Atomics.newReference(api.networks().delete(resourceName));
-
-      operationDone.apply(operation);
-
-      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/cd16d593/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 91a8dfe..01654ec 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
@@ -23,8 +23,10 @@ import static com.google.common.collect.Lists.newArrayList;
 import static java.lang.String.format;
 import static org.jclouds.googlecloud.internal.ListPages.concat;
 import static org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperties.IMAGE_PROJECTS;
+import static org.jclouds.googlecomputeengine.compute.strategy.CreateNodesWithGroupEncodedIntoNameThenAddToSet.simplifyPorts;
 
 import java.net.URI;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
@@ -111,26 +113,35 @@ public final class GoogleComputeEngineServiceAdapter
    @Override public NodeAndInitialCredentials<Instance> createNodeWithGroupEncodedIntoName(String group, String name,
          Template template) {
       GoogleComputeEngineTemplateOptions options = GoogleComputeEngineTemplateOptions.class.cast(template.getOptions());
-      checkNotNull(options.network(), "template options must specify a network");
+
+      checkNotNull(options.getNetworks(), "template options must specify a network");
       checkNotNull(template.getHardware().getUri(), "hardware must have a URI");
       checkNotNull(template.getImage().getUri(), "image URI is null");
 
       List<AttachDisk> disks = Lists.newArrayList();
       disks.add(AttachDisk.newBootDisk(template.getImage().getUri()));
 
+      Iterator<String> networks = options.getNetworks().iterator();
+
+      URI network = URI.create(networks.next());
+      assert !networks.hasNext() : "Error: Options should specify only one network";
+
       NewInstance newInstance = NewInstance.create(
             name, // name
             template.getHardware().getUri(), // machineType
-            options.network(), // network
+            network, // network
             disks, // disks
             group // description
       );
 
-      // Add tags from template and for security groups
+      // Add tags from template
       newInstance.tags().items().addAll(options.getTags());
+
+      // Add tags for firewalls
       FirewallTagNamingConvention naming = firewallTagNamingConvention.get(group);
-      for (int port : options.getInboundPorts()) {
-         newInstance.tags().items().add(naming.name(port));
+      List<String> ports = simplifyPorts(options.getInboundPorts());
+      if (ports != null){
+         newInstance.tags().items().add(naming.name(ports));
       }
 
       // Add metadata from template and for ssh key and image id

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/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 8eaeaa9..b943c2c 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
@@ -45,9 +45,6 @@ import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.domain.Location;
 import org.jclouds.googlecomputeengine.compute.GoogleComputeEngineService;
 import org.jclouds.googlecomputeengine.compute.GoogleComputeEngineServiceAdapter;
-import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange;
-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.GoogleComputeEngineImageToImage;
 import org.jclouds.googlecomputeengine.compute.functions.InstanceToNodeMetadata;
@@ -62,7 +59,6 @@ import org.jclouds.googlecomputeengine.compute.strategy.CreateNodesWithGroupEnco
 import org.jclouds.googlecomputeengine.domain.Image;
 import org.jclouds.googlecomputeengine.domain.Instance;
 import org.jclouds.googlecomputeengine.domain.MachineType;
-import org.jclouds.googlecomputeengine.domain.Network;
 import org.jclouds.googlecomputeengine.domain.Operation;
 import org.jclouds.location.suppliers.ImplicitLocationSupplier;
 import org.jclouds.location.suppliers.implicit.FirstZone;
@@ -72,9 +68,6 @@ import com.google.common.base.Functions;
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.inject.Injector;
@@ -121,12 +114,6 @@ public final class GoogleComputeEngineServiceContextModule
       bind(new TypeLiteral<Predicate<String>>() {
       }).to(AllNodesInGroupTerminated.class);
 
-      bind(new TypeLiteral<Function<NetworkAndAddressRange, Network>>() {
-      }).to(CreateNetworkIfNeeded.class);
-
-      bind(new TypeLiteral<CacheLoader<NetworkAndAddressRange, Network>>() {
-      }).to(FindNetworkOrCreate.class);
-
       bind(FirewallTagNamingConvention.Factory.class).in(Scopes.SINGLETON);
       bindHttpApi(binder(), Resources.class);
    }
@@ -173,11 +160,6 @@ public final class GoogleComputeEngineServiceContextModule
       }, seconds, SECONDS);
    }
 
-   @Provides @Singleton
-   LoadingCache<NetworkAndAddressRange, Network> networkMap(CacheLoader<NetworkAndAddressRange, Network> in) {
-      return CacheBuilder.newBuilder().build(in);
-   }
-
    @Override protected Optional<ImageExtension> provideImageExtension(Injector i) {
       return Optional.absent();
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/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
deleted file mode 100644
index d70cc98..0000000
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/NetworkAndAddressRange.java
+++ /dev/null
@@ -1,41 +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.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/cd16d593/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
deleted file mode 100644
index 3923ad7..0000000
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/CreateNetworkIfNeeded.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.googlecomputeengine.compute.functions;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import javax.inject.Inject;
-
-import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
-import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange;
-import org.jclouds.googlecomputeengine.domain.Network;
-import org.jclouds.googlecomputeengine.domain.Operation;
-import org.jclouds.googlecomputeengine.options.NetworkCreationOptions;
-
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.util.concurrent.Atomics;
-
-public final class CreateNetworkIfNeeded implements Function<NetworkAndAddressRange, Network> {
-   private final GoogleComputeEngineApi api;
-   private final Predicate<AtomicReference<Operation>> operationDone;
-
-   @Inject CreateNetworkIfNeeded(GoogleComputeEngineApi api, Predicate<AtomicReference<Operation>> operationDone) {
-      this.api = api;
-      this.operationDone = operationDone;
-   }
-
-   @Override
-   public Network apply(NetworkAndAddressRange input) {
-      checkNotNull(input, "input");
-
-      Network nw = api.networks().get(input.name());
-      if (nw != null) {
-         return nw;
-      }
-
-      if (input.gateway() != null) {
-         NetworkCreationOptions options = new NetworkCreationOptions.Builder(input.name(), input.rangeIPv4())
-            .gatewayIPv4(input.gateway()).build();
-         AtomicReference<Operation> operation = Atomics.newReference(api.networks()
-               .createInIPv4Range(options));
-         operationDone.apply(operation);
-
-         checkState(operation.get().httpErrorStatusCode() == null,
-               "Could not insert network, operation failed" + operation);
-      } else {
-         AtomicReference<Operation> operation = Atomics
-               .newReference(api.networks().createInIPv4Range(input.name(), input.rangeIPv4()));
-         operationDone.apply(operation);
-
-         checkState(operation.get().httpErrorStatusCode() == null,
-               "Could not insert network, operation failed" + operation);
-      }
-      return checkNotNull(api.networks().get(input.name()), "no network with name %s was found",
-            input.name());
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/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
deleted file mode 100644
index 1137ef9..0000000
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/FindNetworkOrCreate.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.googlecomputeengine.compute.functions;
-
-import javax.inject.Inject;
-
-import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
-import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange;
-import org.jclouds.googlecomputeengine.domain.Network;
-
-import com.google.common.base.Function;
-import com.google.common.cache.CacheLoader;
-
-public final class FindNetworkOrCreate extends CacheLoader<NetworkAndAddressRange, Network> {
-   private final GoogleComputeEngineApi api;
-   private final Function<NetworkAndAddressRange, Network> networkCreator;
-
-   @Inject FindNetworkOrCreate(GoogleComputeEngineApi api, Function<NetworkAndAddressRange, Network> networkCreator) {
-      this.api = api;
-      this.networkCreator = networkCreator;
-   }
-
-   @Override public Network load(NetworkAndAddressRange in) {
-      Network network = api.networks().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/cd16d593/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 2cd7e84..1fe5928 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,6 +16,8 @@
  */
 package org.jclouds.googlecomputeengine.compute.functions;
 
+import java.util.List;
+
 import javax.inject.Inject;
 
 import org.jclouds.compute.functions.GroupNamingConvention;
@@ -46,10 +48,18 @@ public final class FirewallTagNamingConvention {
       this.sharedResourceName = sharedResourceName;
    }
 
-   public String name(int port) {
-      return String.format("%s-port-%s", sharedResourceName, port);
+   public String name(List<String> ports) {
+      final int prime = 31;
+      int result = 1;
+      for (String s : ports){
+         result = result * prime + s.hashCode();
+         // TODO(broudy): this may break between java versions! Consider a different implementation.
+      }
+
+      return String.format("%s-%s", sharedResourceName, Integer.toHexString(result));
    }
 
+
    public Predicate<String> isFirewallTag() {
       return new Predicate<String>() {
          @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java
index 5562b48..81e40b9 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java
@@ -89,7 +89,6 @@ public final class InstanceToNodeMetadata implements Function<Instance, NodeMeta
       URI bootImage = diskToSourceImage.get(input.disks().get(0).source());
 
       builder.id(input.selfLink().toString())
-             .providerId(input.id())
              .name(input.name())
              .providerId(input.id())
              .hostname(input.name())

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/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 1b1dac8..2fc8e8a 100644
--- a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
+++ b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
@@ -16,18 +16,15 @@
  */
 package org.jclouds.googlecomputeengine.compute.options;
 
-import java.net.URI;
 import java.util.Map;
 
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.domain.LoginCredentials;
-import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.scriptbuilder.domain.Statement;
 
 /** Instance options specific to Google Compute Engine. */
 public final class GoogleComputeEngineTemplateOptions extends TemplateOptions {
 
-   private URI network = null;
    private boolean autoCreateKeyPair = true;
 
    @Override
@@ -42,22 +39,10 @@ public final class GoogleComputeEngineTemplateOptions extends TemplateOptions {
       super.copyTo(to);
       if (to instanceof GoogleComputeEngineTemplateOptions) {
          GoogleComputeEngineTemplateOptions eTo = GoogleComputeEngineTemplateOptions.class.cast(to);
-         eTo.network(network());
          eTo.autoCreateKeyPair(autoCreateKeyPair());
       }
    }
 
-   /** @see #network()  */
-   public GoogleComputeEngineTemplateOptions network(URI network) {
-      this.network = network;
-      return this;
-   }
-
-   /** The network instances will attach to. When absent, a new network will be created for the project. */
-   @Nullable public URI network() {
-      return network;
-   }
-
    /**
     * Sets whether an SSH key pair should be created automatically.
     */

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/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 7fb71df..20bc2c3 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,10 +16,13 @@
  */
 package org.jclouds.googlecomputeengine.compute.strategy;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.ImmutableList.of;
 
-import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -39,7 +42,6 @@ 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.domain.Firewall;
@@ -53,9 +55,8 @@ import org.jclouds.ssh.SshKeyPairGenerator;
 
 import com.google.common.base.Predicate;
 import com.google.common.base.Strings;
-import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
 import com.google.common.util.concurrent.Atomics;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -67,8 +68,9 @@ public final class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends
    public static final String EXTERIOR_RANGE = "0.0.0.0/0";
    public static final String DEFAULT_INTERNAL_NETWORK_RANGE = "10.0.0.0/8";
 
+   public static final String DEFAULT_NETWORK_NAME = "default";
+
    private final GoogleComputeEngineApi api;
-   private final LoadingCache<NetworkAndAddressRange, Network> networkMap;
    private final Predicate<AtomicReference<Operation>> operationDone;
    private final FirewallTagNamingConvention.Factory firewallTagNamingConvention;
    private final SshKeyPairGenerator keyGenerator;
@@ -85,13 +87,11 @@ public final class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends
          @Named(Constants.PROPERTY_USER_THREADS) ListeningExecutorService userExecutor,
          CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory,
          GoogleComputeEngineApi api, Predicate<AtomicReference<Operation>> operationDone,
-         LoadingCache<NetworkAndAddressRange, Network> networkMap,
          FirewallTagNamingConvention.Factory firewallTagNamingConvention, SshKeyPairGenerator keyGenerator) {
       super(addNodeWithGroupStrategy, listNodesStrategy, namingConvention, userExecutor,
             customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory);
       this.api = api;
       this.operationDone = operationDone;
-      this.networkMap = networkMap;
       this.firewallTagNamingConvention = firewallTagNamingConvention;
       this.keyGenerator = keyGenerator;
    }
@@ -101,17 +101,16 @@ public final class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends
          Set<NodeMetadata> goodNodes, Map<NodeMetadata, Exception> badNodes,
          Multimap<NodeMetadata, CustomizationResponse> customizationResponses) {
 
-      String sharedResourceName = namingConvention.create().sharedNameForGroup(group);
-      Template mutableTemplate = template.clone();
+            Template mutableTemplate = template.clone();
       GoogleComputeEngineTemplateOptions templateOptions = GoogleComputeEngineTemplateOptions.class
             .cast(mutableTemplate.getOptions());
       assert template.getOptions().equals(templateOptions) : "options didn't clone properly";
 
-      // get or insert the network and insert a firewall with the users
-      // configuration
-      Network network = getOrCreateNetwork(templateOptions, sharedResourceName);
+      // Get Network
+      Network network = getNetwork(templateOptions.getNetworks());
+      // Setup Firewall rules
       getOrCreateFirewalls(templateOptions, network, firewallTagNamingConvention.get(group));
-      templateOptions.network(network.selfLink());
+      templateOptions.networks(ImmutableSet.of(network.selfLink().toString()));
       templateOptions.userMetadata(ComputeServiceConstants.NODE_GROUP_KEY, group);
 
       // Configure the default credentials, if needed
@@ -131,12 +130,22 @@ public final class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends
    }
 
    /**
-    * Try and find a network either previously created by jclouds or user
-    * defined.
+    * Try and find a network previously created by the user.
     */
-   private Network getOrCreateNetwork(GoogleComputeEngineTemplateOptions templateOptions, String sharedResourceName) {
-      String networkName = templateOptions.network() != null ? toName(templateOptions.network()) : sharedResourceName;
-      return networkMap.getUnchecked(NetworkAndAddressRange.create(networkName, DEFAULT_INTERNAL_NETWORK_RANGE, null));
+   private Network getNetwork(Set<String> networks) {
+      String networkName;
+      if (networks == null || networks.isEmpty()){
+         networkName = DEFAULT_NETWORK_NAME;
+      }
+      else {
+         Iterator<String> iterator = networks.iterator();
+         networkName = nameFromNetworkString(iterator.next());
+         checkArgument(!iterator.hasNext(), "Error: Please specify only one network in TemplateOptions when using GCE.");
+
+      }
+      Network network = api.networks().get(networkName);
+      checkArgument(network != null, "Error: no network with name %s was found", networkName);
+      return network;
    }
 
    /**
@@ -147,7 +156,7 @@ public final class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends
     * {@link FirewallTagNamingConvention}, with a target tag also following the
     * {@link FirewallTagNamingConvention}, which opens the requested port for
     * all sources on both TCP and UDP protocols.
-    * 
+    *
     * @see org.jclouds.googlecomputeengine.features.FirewallApi#patch(String,
     *      org.jclouds.googlecomputeengine.options.FirewallOptions)
     */
@@ -155,32 +164,70 @@ public final class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends
          FirewallTagNamingConvention naming) {
 
       FirewallApi firewallApi = api.firewalls();
-      List<AtomicReference<Operation>> operations = Lists.newArrayList();
-
-      for (Integer port : templateOptions.getInboundPorts()) {
-         String name = naming.name(port);
-         Firewall firewall = firewallApi.get(name);
-         if (firewall == null) {
-            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.selfLink())
-                  .allowedRules(rules).sourceTags(templateOptions.getTags())
-                  .sourceRanges(of(DEFAULT_INTERNAL_NETWORK_RANGE, EXTERIOR_RANGE)).targetTags(ImmutableList.of(name));
-            AtomicReference<Operation> operation = Atomics.newReference(firewallApi.createInNetwork(
-                  firewallOptions.name(), network.selfLink(), firewallOptions));
-            operations.add(operation);
-         }
+      int[] inboundPorts = templateOptions.getInboundPorts();
+      if ((inboundPorts == null) || inboundPorts.length == 0){
+         return;
       }
 
-      for (AtomicReference<Operation> operation : operations) {
+      List<String> ports = simplifyPorts(inboundPorts);
+      String name = naming.name(ports);
+      Firewall firewall = firewallApi.get(name);
+      AtomicReference<Operation> operation = null;
+      if (firewall == null) {
+         List<Rule> rules = ImmutableList.of(Rule.create("tcp", ports), Rule.create("udp", ports));
+         FirewallOptions firewallOptions = new FirewallOptions().name(name).network(network.selfLink())
+                  .allowedRules(rules).sourceTags(templateOptions.getTags())
+                  .sourceRanges(of(DEFAULT_INTERNAL_NETWORK_RANGE, EXTERIOR_RANGE))
+                  .targetTags(ImmutableList.of(name));
+
+         operation = Atomics.newReference(firewallApi
+               .createInNetwork(firewallOptions.name(), network.selfLink(), firewallOptions));
+
          operationDone.apply(operation);
          checkState(operation.get().httpErrorStatusCode() == null, "Could not insert firewall, operation failed %s",
                operation);
       }
    }
 
-   private static String toName(URI link) {
-      String path = link.getPath();
-      return path.substring(path.lastIndexOf('/') + 1);
+   // Helper function for simplifying an array of ports to a list of ranges FirewallOptions expects.
+   public static List<String> simplifyPorts(int[] ports){
+      if ((ports == null) || (ports.length == 0)) {
+         return null;
+      }
+      ArrayList<String> output = new ArrayList<String>();
+      Arrays.sort(ports);
+
+      int range_start = ports[0];
+      int range_end = ports[0];
+      for (int i = 1; i < ports.length; i++) {
+         if ((ports[i - 1] == ports[i] - 1) || (ports[i - 1] == ports[i])){
+            // Range continues.
+            range_end = ports[i];
+         }
+         else {
+            // Range ends.
+            output.add(formatRange(range_start, range_end));
+            range_start = ports[i];
+            range_end = ports[i];
+         }
+      }
+      // Make sure we get the last range.
+      output.add(formatRange(range_start, range_end));
+      return output;
+   }
+
+   // Helper function for simplifyPorts. Formats port range strings.
+   private static String formatRange(int start, int finish){
+      if (start == finish){
+         return Integer.toString(start);
+      }
+      else {
+         return String.format("%s-%s", Integer.toString(start), Integer.toString(finish));
+      }
+   }
+
+   // Helper function for getting the network name from the full URI.
+   public static String nameFromNetworkString(String networkString) {
+      return networkString.substring(networkString.lastIndexOf('/') + 1);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
index 42c62f0..8c449b0 100644
--- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
+++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
@@ -21,6 +21,7 @@ import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 
 import java.util.Properties;
+import java.util.Set;
 
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.NodeMetadata;
@@ -113,4 +114,12 @@ public class GoogleComputeEngineServiceLiveTest extends BaseComputeServiceLiveTe
    protected Module getSshModule() {
       return new SshjSshClientModule();
    }
+
+   @Override
+   protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) {
+      Set<String> nodeTags = node.getTags();
+      for (String tag : tags){
+         assert nodeTags.contains(tag) : String.format("node tags did not match %s %s node:", tags, nodeTags, node);
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java
index 839a344..23a2b50 100644
--- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java
+++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java
@@ -73,39 +73,34 @@ public class GoogleComputeEngineServiceMockTest extends BaseGoogleComputeEngineA
       assertSent(server, "GET", "/projects/party/aggregated/machineTypes");
    }
 
-   public void networksAndFirewallDeletedWhenAllGroupNodesAreTerminated() throws IOException, InterruptedException {
-      server.enqueue(instanceWithNetworkAndStatus("test-delete-networks", "test-network", RUNNING));
+   public void firewallDeletedWhenAllGroupNodesAreTerminated() throws IOException, InterruptedException {
+      server.enqueue(instanceWithNetworkAndStatus("test-delete-1", "default", RUNNING));
       server.enqueue(singleRegionSingleZoneResponse());
-      server.enqueue(jsonResponse("/aggregated_machinetype_list.json"));
-      server.enqueue(jsonResponse("/operation.json"));
+      server.enqueue(jsonResponse("/aggregated_machinetype_list.json")); // Why are we getting machineTypes to delete an instance?
+      server.enqueue(jsonResponse("/operation.json")); // instance delete
       server.enqueue(jsonResponse("/zone_operation.json"));
-      server.enqueue(instanceWithNetworkAndStatus("test-delete-networks", "test-network", TERMINATED));
-      server.enqueue(aggregatedListWithInstanceNetworkAndStatus("test-delete-networks", "test-network", TERMINATED));
-      server.enqueue(jsonResponse("/GoogleComputeEngineServiceExpectTest/network_get.json"));
+      server.enqueue(instanceWithNetworkAndStatus("test-delete-1", "default", TERMINATED));
+      server.enqueue(aggregatedListWithInstanceNetworkAndStatus("test-delete-1", "default", TERMINATED));
       server.enqueue(jsonResponse("/GoogleComputeEngineServiceExpectTest/firewall_list.json"));
       server.enqueue(jsonResponse("/operation.json"));
       server.enqueue(jsonResponse("/zone_operation.json"));
-      server.enqueue(jsonResponse("/operation.json"));
-      server.enqueue(jsonResponse("/zone_operation.json"));
 
       ComputeService computeService = computeService();
-      computeService.destroyNode(url("/jclouds/zones/us-central1-a/instances/test-delete-networks"));
+      computeService.destroyNode(url("/jclouds/zones/us-central1-a/instances/test-delete-1"));
 
-      assertSent(server, "GET", "/jclouds/zones/us-central1-a/instances/test-delete-networks");
+      assertSent(server, "GET", "/jclouds/zones/us-central1-a/instances/test-delete-1");
       assertSent(server, "GET", "/projects/party/regions");
-      assertSent(server, "GET", "/projects/party/aggregated/machineTypes");
-      assertSent(server, "DELETE", "/jclouds/zones/us-central1-a/instances/test-delete-networks");
+      assertSent(server, "GET", "/projects/party/aggregated/machineTypes"); // Why are we getting machineTypes to delete an instance?
+      assertSent(server, "DELETE", "/jclouds/zones/us-central1-a/instances/test-delete-1"); // instance delete
       assertSent(server, "GET", "/projects/party/zones/us-central1-a/operations/operation-1354084865060");
-      assertSent(server, "GET", "/projects/party/zones/us-central1-a/instances/test-delete-networks");
+      assertSent(server, "GET", "/projects/party/zones/us-central1-a/instances/test-delete-1"); // get instance
       assertSent(server, "GET", "/projects/party/aggregated/instances");
-      assertSent(server, "GET", "/projects/party/global/networks/jclouds-test-delete");
       assertSent(server, "GET", "/projects/party/global/firewalls");
-      assertSent(server, "DELETE", "/projects/party/global/firewalls/jclouds-test-delete");
-      assertSent(server, "GET", "/projects/party/zones/us-central1-a/operations/operation-1354084865060");
-      assertSent(server, "DELETE", "/projects/party/global/networks/jclouds-test-delete");
+      assertSent(server, "DELETE", "/projects/party/global/firewalls/jclouds-test-delete-34sf");
       assertSent(server, "GET", "/projects/party/zones/us-central1-a/operations/operation-1354084865060");
    }
 
+
    public void listAssignableLocations() throws Exception {
       server.enqueue(singleRegionSingleZoneResponse());
 
@@ -146,17 +141,13 @@ public class GoogleComputeEngineServiceMockTest extends BaseGoogleComputeEngineA
       assertSent(server, "GET", "/projects/party/aggregated/machineTypes");
    }
 
-   public void createNodeWhenNetworkNorFirewallExistDoesNotExist() throws Exception {
+   public void createNodeWhenFirewallDoesNotExist() throws Exception {
       server.enqueue(singleRegionSingleZoneResponse());
       server.enqueue(jsonResponse("/image_list.json"));
       server.enqueue(jsonResponse("/image_list_debian.json")); // per IMAGE_PROJECTS = "debian-cloud"
       server.enqueue(jsonResponse("/aggregated_machinetype_list.json"));
-      server.enqueue(new MockResponse().setResponseCode(404)); // Network
-      server.enqueue(new MockResponse().setResponseCode(404)); // Network again?
-      server.enqueue(jsonResponse("/operation.json")); // Create Network
-      server.enqueue(jsonResponse("/zone_operation.json"));
-      server.enqueue(jsonResponse("/network_get.json"));
-      server.enqueue(new MockResponse().setResponseCode(404)); // Firewall
+      server.enqueue(jsonResponse("/network_get_default.json"));
+      server.enqueue(new MockResponse().setResponseCode(404)); // Get Firewall
       server.enqueue(jsonResponse("/operation.json")); // Create Firewall
       server.enqueue(jsonResponse("/zone_operation.json"));
       server.enqueue(aggregatedListWithInstanceNetworkAndStatus("test-0", "test-network", RUNNING));
@@ -179,14 +170,9 @@ public class GoogleComputeEngineServiceMockTest extends BaseGoogleComputeEngineA
       assertSent(server, "GET", "/projects/party/global/images");
       assertSent(server, "GET", "/projects/debian-cloud/global/images");
       assertSent(server, "GET", "/projects/party/aggregated/machineTypes");
-      assertSent(server, "GET", "/projects/party/global/networks/jclouds-test");
-      assertSent(server, "GET", "/projects/party/global/networks/jclouds-test");
-      assertSent(server, "POST", "/projects/party/global/networks",
-            "{\"name\":\"jclouds-test\",\"IPv4Range\":\"10.0.0.0/8\"}");
-      assertSent(server, "GET", "/projects/party/zones/us-central1-a/operations/operation-1354084865060");
-      assertSent(server, "GET", "/projects/party/global/networks/jclouds-test");
-      assertSent(server, "GET", "/projects/party/global/firewalls/jclouds-test-port-22");
-      assertSent(server, "POST", "/projects/party/global/firewalls",
+      assertSent(server, "GET", "/projects/party/global/networks/default");
+      assertSent(server, "GET", "/projects/party/global/firewalls/jclouds-test-65f"); // Get Firewall
+      assertSent(server, "POST", "/projects/party/global/firewalls", // Create Firewall
             stringFromResource("/firewall_insert_2.json"));
 
       assertSent(server, "GET", "/projects/party/zones/us-central1-a/operations/operation-1354084865060");

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/CreateNetworkIfNeededTest.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/CreateNetworkIfNeededTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/CreateNetworkIfNeededTest.java
deleted file mode 100644
index 8a5dd8f..0000000
--- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/CreateNetworkIfNeededTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.googlecomputeengine.compute.functions;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.testng.Assert.assertEquals;
-
-import java.net.URI;
-
-import org.jclouds.date.internal.SimpleDateFormatDateService;
-import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
-import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange;
-import org.jclouds.googlecomputeengine.compute.predicates.AtomicOperationDone;
-import org.jclouds.googlecomputeengine.domain.Network;
-import org.jclouds.googlecomputeengine.domain.Operation;
-import org.jclouds.googlecomputeengine.features.NetworkApi;
-import org.jclouds.googlecomputeengine.options.NetworkCreationOptions;
-import org.jclouds.googlecomputeengine.parse.ParseGlobalOperationTest;
-import org.testng.annotations.Test;
-
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-
-@Test
-public class CreateNetworkIfNeededTest {
-
-   private static final String BASE_URL = "https://www.googleapis.com/compute/v1/projects";
-
-   public void testApply() {
-      GoogleComputeEngineApi api = createMock(GoogleComputeEngineApi.class);
-      NetworkApi nwApi = createMock(NetworkApi.class);
-      Resources resources = createMock(Resources.class);
-
-      Network network = Network.create( //
-            "abcd", // id
-            new SimpleDateFormatDateService().iso8601DateParse("2014-07-18T09:47:30.826-07:00"), // creationTimestamp
-            URI.create(BASE_URL + "/party/global/networks/this-network"), // selfLink
-            "this-network", // name
-            null, // description
-            "0.0.0.0/0", // rangeIPv4
-            null // gatewayIPv4
-      );
-
-      Operation createOp = new ParseGlobalOperationTest().expected();
-
-      expect(api.networks()).andReturn(nwApi).atLeastOnce();
-
-      expect(nwApi.createInIPv4Range("this-network", "0.0.0.0/0")) .andReturn(createOp);
-      expect(resources.operation(createOp.selfLink())).andReturn(createOp);
-      expect(nwApi.get("this-network")).andReturn(null);
-      expect(nwApi.get("this-network")).andReturn(network);
-
-      replay(api, nwApi, resources);
-
-      NetworkAndAddressRange input = NetworkAndAddressRange.create("this-network", "0.0.0.0/0", null);
-
-      AtomicOperationDone pred = atomicOperationDone(api, resources);
-
-      CreateNetworkIfNeeded creator = new CreateNetworkIfNeeded(api, pred);
-
-      assertEquals(creator.apply(input), network);
-
-      verify(api, nwApi, resources);
-   }
-
-   public void testApplyWithGateway() {
-      GoogleComputeEngineApi api = createMock(GoogleComputeEngineApi.class);
-      NetworkApi nwApi = createMock(NetworkApi.class);
-      Resources resources = createMock(Resources.class);
-
-      Network network = Network.create( //
-            "abcd", // id
-            new SimpleDateFormatDateService().iso8601DateParse("2014-07-18T09:47:30.826-07:00"), // creationTimestamp
-            URI.create(BASE_URL + "/party/global/networks/this-network"), // selfLink
-            "this-network", // name
-            null, // description
-            "0.0.0.0/0", // rangeIPv4
-            "1.2.3.4" // gatewayIPv4
-      );
-
-      Operation createOp = new ParseGlobalOperationTest().expected();
-
-      expect(api.networks()).andReturn(nwApi).atLeastOnce();
-
-      expect(nwApi.createInIPv4Range(new NetworkCreationOptions.Builder("this-network", "0.0.0.0/0")
-         .gatewayIPv4("1.2.3.4").build())).andReturn(createOp);
-      expect(resources.operation(createOp.selfLink())).andReturn(createOp);
-      expect(nwApi.get("this-network")).andReturn(null);
-      expect(nwApi.get("this-network")).andReturn(network);
-
-      replay(api, nwApi, resources);
-
-      NetworkAndAddressRange input = NetworkAndAddressRange.create("this-network", "0.0.0.0/0", "1.2.3.4");
-
-      AtomicOperationDone pred = atomicOperationDone(api, resources);
-
-      CreateNetworkIfNeeded creator = new CreateNetworkIfNeeded(api, pred);
-
-      assertEquals(creator.apply(input), network);
-
-      verify(api, nwApi, resources);
-   }
-
-   private AtomicOperationDone atomicOperationDone(final GoogleComputeEngineApi api,
-         final Resources resources) {
-      return Guice.createInjector(new AbstractModule() { // Rather than opening ctor public
-         @Override protected void configure() {
-            bind(GoogleComputeEngineApi.class).toInstance(api);
-            bind(Resources.class).toInstance(resources);
-         }
-      }).getInstance(AtomicOperationDone.class);
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/FindNetworkOrCreateTest.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/FindNetworkOrCreateTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/FindNetworkOrCreateTest.java
deleted file mode 100644
index 137f004..0000000
--- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/FindNetworkOrCreateTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.googlecomputeengine.compute.functions;
-
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
-import static org.testng.Assert.assertEquals;
-
-import java.net.URI;
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.jclouds.date.internal.SimpleDateFormatDateService;
-import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
-import org.jclouds.googlecomputeengine.compute.domain.NetworkAndAddressRange;
-import org.jclouds.googlecomputeengine.compute.predicates.AtomicOperationDone;
-import org.jclouds.googlecomputeengine.domain.Network;
-import org.jclouds.googlecomputeengine.domain.Operation;
-import org.jclouds.googlecomputeengine.features.NetworkApi;
-import org.jclouds.googlecomputeengine.parse.ParseGlobalOperationTest;
-import org.testng.annotations.Test;
-
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.LoadingCache;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-
-@Test
-public class FindNetworkOrCreateTest {
-   private static final String BASE_URL = "https://www.googleapis.com/compute/v1/projects";
-   private static final Network NETWORK = Network.create( //
-         "abcd", // id
-         new SimpleDateFormatDateService().iso8601DateParse("2014-07-18T09:47:30.826-07:00"), // creationTimestamp
-         URI.create(BASE_URL + "/party/global/networks/this-network"), // selfLink
-         "this-network", // name
-         null, // description
-         "0.0.0.0/0", // rangeIPv4
-         null // gatewayIPv4
-   );
-
-   public void testLoadExisting() {
-      GoogleComputeEngineApi api = createMock(GoogleComputeEngineApi.class);
-      NetworkApi nwApi = createMock(NetworkApi.class);
-
-      expect(api.networks()).andReturn(nwApi).atLeastOnce();
-
-      expect(nwApi.get("this-network")).andReturn(NETWORK);
-
-      replay(api, nwApi);
-
-      NetworkAndAddressRange input = NetworkAndAddressRange.create("this-network", "0.0.0.0/0", null);
-
-      Predicate<AtomicReference<Operation>> operationDone = Predicates.alwaysFalse(); // No op should be created!
-
-      CreateNetworkIfNeeded creator = new CreateNetworkIfNeeded(api, operationDone);
-
-      FindNetworkOrCreate loader = new FindNetworkOrCreate(api, creator);
-
-      LoadingCache<NetworkAndAddressRange, Network> cache = CacheBuilder.newBuilder().build(loader);
-
-      assertEquals(cache.getUnchecked(input), NETWORK);
-
-      // Second call is to ensure we only need to make the API calls once.
-      assertEquals(cache.getUnchecked(input), NETWORK);
-
-      verify(api, nwApi);
-   }
-
-   public void testLoadNew() {
-      GoogleComputeEngineApi api = createMock(GoogleComputeEngineApi.class);
-      NetworkApi nwApi = createMock(NetworkApi.class);
-      Resources resources = createMock(Resources.class);
-
-      Operation createOp = new ParseGlobalOperationTest().expected();
-
-      expect(api.networks()).andReturn(nwApi).atLeastOnce();
-
-      expect(nwApi.createInIPv4Range("this-network", "0.0.0.0/0")).andReturn(createOp);
-      expect(resources.operation(createOp.selfLink())).andReturn(createOp);
-      // pre-creation
-      expect(nwApi.get("this-network")).andReturn(null).times(2);
-      // post-creation
-      expect(nwApi.get("this-network")).andReturn(NETWORK);
-
-      replay(api, nwApi, resources);
-
-      NetworkAndAddressRange input = NetworkAndAddressRange.create("this-network", "0.0.0.0/0", null);
-
-      AtomicOperationDone pred = atomicOperationDone(resources);
-
-      CreateNetworkIfNeeded creator = new CreateNetworkIfNeeded(api, pred);
-
-      FindNetworkOrCreate loader = new FindNetworkOrCreate(api, creator);
-
-      LoadingCache<NetworkAndAddressRange, Network> cache = CacheBuilder.newBuilder().build(loader);
-
-      assertEquals(cache.getUnchecked(input), NETWORK);
-
-      // Second call is to ensure we only need to make the API calls once.
-      assertEquals(cache.getUnchecked(input), NETWORK);
-
-      verify(api, nwApi, resources);
-   }
-
-   private AtomicOperationDone atomicOperationDone(final Resources resources) {
-      return Guice.createInjector(new AbstractModule() { // Rather than opening ctor public
-         @Override protected void configure() {
-            bind(Resources.class).toInstance(resources);
-         }
-      }).getInstance(AtomicOperationDone.class);
-   }
-}
-

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkTest.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkTest.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkTest.java
index fc29125..98ad345 100644
--- a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkTest.java
+++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkTest.java
@@ -45,8 +45,8 @@ public class ParseNetworkTest extends BaseGoogleComputeEngineParseTest<Network>
             "13024414170909937976", // id
             parse("2012-10-24T20:13:19.967"), // creationTimestamp
             URI.create(baseUrl + "/party/networks/jclouds-test"), // selfLink
-            "default", // name
-            "Default network for the project", // description
+            "jclouds-test", // name
+            "A custom network for the project", // description
             "10.0.0.0/8", // rangeIPv4
             "10.0.0.1" // gatewayIPv4
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/SimpleParsingTests.java
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/SimpleParsingTests.java b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/SimpleParsingTests.java
new file mode 100644
index 0000000..3b13193
--- /dev/null
+++ b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/SimpleParsingTests.java
@@ -0,0 +1,82 @@
+/*
+ * 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.parse;
+
+import static org.jclouds.googlecomputeengine.compute.strategy.CreateNodesWithGroupEncodedIntoNameThenAddToSet.simplifyPorts;
+import static org.jclouds.googlecomputeengine.compute.strategy.CreateNodesWithGroupEncodedIntoNameThenAddToSet.nameFromNetworkString;
+
+import java.util.List;
+
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+import static org.testng.Assert.assertEquals;
+
+
+@Test(groups = "unit", testName = "SimpleParsingTests", singleThreaded = true)
+public class SimpleParsingTests {
+
+   public void testOnePort(){
+      int[] ports = {22};
+      List<String> output = simplifyPorts(ports);
+
+      assertEquals(ImmutableList.of("22"), output);
+   }
+
+   public void testBasic(){
+      int[] ports = {1, 2, 3, 4};
+      List<String> output = simplifyPorts(ports);
+
+      assertEquals(ImmutableList.of("1-4"), output);
+   }
+
+   public void testComplex(){
+      int[] ports = {3, 1, 5, 2, 1002, 17, 1001, 22, 80, 1000};
+      List<String> output = simplifyPorts(ports);
+
+      assertEquals(ImmutableList.of("1-3", "5", "17", "22", "80", "1000-1002"), output);
+   }
+
+   public void testEmpty(){
+      int[] ports = {};
+      List<String> output = simplifyPorts(ports);
+
+      assertEquals(null, output);
+   }
+
+   public void testEndSingle(){
+      int[] ports = {1, 2, 3, 4, 7};
+      List<String> output = simplifyPorts(ports);
+
+      assertEquals(ImmutableList.of("1-4", "7"), output);
+   }
+
+   public void testNetworkFromString(){
+      String network = "https://www.googleapis.com/compute/v1/projects/project/global/networks/network";
+      assertEquals("network", nameFromNetworkString(network));
+
+      network = "projects/project/global/networks/network";
+      assertEquals("network", nameFromNetworkString(network));
+
+      network = "global/networks/default";
+      assertEquals("default", nameFromNetworkString(network));
+
+      network = "default";
+      assertEquals("default", nameFromNetworkString(network));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/resources/GoogleComputeEngineServiceExpectTest/firewall_list.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/GoogleComputeEngineServiceExpectTest/firewall_list.json b/google-compute-engine/src/test/resources/GoogleComputeEngineServiceExpectTest/firewall_list.json
index f549d2a..0ad66be 100644
--- a/google-compute-engine/src/test/resources/GoogleComputeEngineServiceExpectTest/firewall_list.json
+++ b/google-compute-engine/src/test/resources/GoogleComputeEngineServiceExpectTest/firewall_list.json
@@ -4,12 +4,11 @@
    "selfLink": "https://www.googleapis.com/compute/v1/projects/google/global/firewalls",
    "items": [
       {
-
          "kind": "compute#firewall",
          "id": "12862241031274216284",
          "creationTimestamp": "2012-04-13T03:05:02.855",
          "selfLink": "https://www.googleapis.com/compute/v1/projects/party/global/firewalls/jclouds-test-delete",
-         "name": "jclouds-test-delete",
+         "name": "jclouds-test-delete-34sf",
          "description": "Internal traffic from default allowed",
          "network": "https://www.googleapis.com/compute/v1/projects/party/global/networks/jclouds-test-delete",
          "sourceRanges": [

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/resources/firewall_insert_2.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/firewall_insert_2.json b/google-compute-engine/src/test/resources/firewall_insert_2.json
index 485721e..6d0ed14 100644
--- a/google-compute-engine/src/test/resources/firewall_insert_2.json
+++ b/google-compute-engine/src/test/resources/firewall_insert_2.json
@@ -1,6 +1,6 @@
 {
-  "name": "jclouds-test-port-22",
-  "network": "https://www.googleapis.com/compute/v1/projects/party/networks/jclouds-test",
+  "name": "jclouds-test-65f",
+  "network": "https://www.googleapis.com/compute/v1/projects/party/networks/default",
   "sourceRanges": [
     "10.0.0.0/8",
     "0.0.0.0/0"
@@ -9,7 +9,7 @@
     "aTag"
   ],
   "targetTags": [
-    "jclouds-test-port-22"
+    "jclouds-test-65f"
   ],
   "allowed": [
     {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/resources/instance_insert_2.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/instance_insert_2.json b/google-compute-engine/src/test/resources/instance_insert_2.json
index 78002a6..012e172 100644
--- a/google-compute-engine/src/test/resources/instance_insert_2.json
+++ b/google-compute-engine/src/test/resources/instance_insert_2.json
@@ -3,7 +3,7 @@
   "name": "test-1",
   "networkInterfaces": [
     {
-      "network": "https://www.googleapis.com/compute/v1/projects/party/networks/jclouds-test",
+      "network": "https://www.googleapis.com/compute/v1/projects/party/networks/default",
       "accessConfigs": [
         {
           "type": "ONE_TO_ONE_NAT"
@@ -25,7 +25,7 @@
   "tags": {
     "items": [
       "aTag",
-      "jclouds-test-port-22"
+      "jclouds-test-65f"
     ]
   },
   "metadata": {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/resources/network_get.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/network_get.json b/google-compute-engine/src/test/resources/network_get.json
index a1a6203..ca82f69 100644
--- a/google-compute-engine/src/test/resources/network_get.json
+++ b/google-compute-engine/src/test/resources/network_get.json
@@ -3,8 +3,8 @@
    "id": "13024414170909937976",
    "creationTimestamp": "2012-10-24T20:13:19.967",
    "selfLink": "https://www.googleapis.com/compute/v1/projects/party/networks/jclouds-test",
-   "name": "default",
-   "description": "Default network for the project",
+   "name": "jclouds-test",
+   "description": "A custom network for the project",
    "IPv4Range": "10.0.0.0/8",
    "gatewayIPv4": "10.0.0.1"
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/resources/network_get_default.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/network_get_default.json b/google-compute-engine/src/test/resources/network_get_default.json
new file mode 100644
index 0000000..55b322c
--- /dev/null
+++ b/google-compute-engine/src/test/resources/network_get_default.json
@@ -0,0 +1,10 @@
+{
+   "kind": "compute#network",
+   "id": "13024414170909937976",
+   "creationTimestamp": "2012-10-24T20:13:19.967",
+   "selfLink": "https://www.googleapis.com/compute/v1/projects/party/networks/default",
+   "name": "default",
+   "description": "Default network for the project",
+   "IPv4Range": "10.0.0.0/8",
+   "gatewayIPv4": "10.0.0.1"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/cd16d593/google-compute-engine/src/test/resources/network_list.json
----------------------------------------------------------------------
diff --git a/google-compute-engine/src/test/resources/network_list.json b/google-compute-engine/src/test/resources/network_list.json
index eb4249a..ed2273b 100644
--- a/google-compute-engine/src/test/resources/network_list.json
+++ b/google-compute-engine/src/test/resources/network_list.json
@@ -9,8 +9,8 @@
          "id": "13024414170909937976",
          "creationTimestamp": "2012-10-24T20:13:19.967",
          "selfLink": "https://www.googleapis.com/compute/v1/projects/party/networks/jclouds-test",
-         "name": "default",
-         "description": "Default network for the project",
+         "name": "jclouds-test",
+         "description": "A custom network for the project",
          "IPv4Range": "10.0.0.0/8",
          "gatewayIPv4": "10.0.0.1"
       }