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 2017/11/21 08:59:06 UTC

jclouds git commit: JCLOUDS-1355: Enable VM creation without external IP address.

Repository: jclouds
Updated Branches:
  refs/heads/master 73c3b6024 -> 5d82a3df9


JCLOUDS-1355: Enable VM creation without external IP address.


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/5d82a3df
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/5d82a3df
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/5d82a3df

Branch: refs/heads/master
Commit: 5d82a3df97723453e1b7dc90bfd8e248be160fdd
Parents: 73c3b60
Author: Nelson Araujo <ne...@google.com>
Authored: Mon Nov 13 13:40:18 2017 -0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Nov 21 09:58:53 2017 +0100

----------------------------------------------------------------------
 .../GoogleComputeEngineServiceAdapter.java      | 23 ++++++---
 .../GoogleComputeEngineTemplateOptions.java     | 19 ++++++-
 .../googlecomputeengine/domain/NewInstance.java | 14 ++++--
 .../GoogleComputeEngineServiceMockTest.java     | 52 ++++++++++++++++++++
 .../test/resources/instance_insert_no_ip.json   | 42 ++++++++++++++++
 5 files changed, 139 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d82a3df/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
index 523c1b0..c5b3127 100644
--- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
@@ -19,7 +19,6 @@ package org.jclouds.googlecomputeengine.compute;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static com.google.common.collect.Iterables.filter;
-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.compute.domain.internal.RegionAndName.fromRegionAndName;
@@ -52,10 +51,12 @@ import org.jclouds.googlecomputeengine.domain.AttachDisk;
 import org.jclouds.googlecomputeengine.domain.DiskType;
 import org.jclouds.googlecomputeengine.domain.Image;
 import org.jclouds.googlecomputeengine.domain.Instance;
+import org.jclouds.googlecomputeengine.domain.Instance.NetworkInterface.AccessConfig;
 import org.jclouds.googlecomputeengine.domain.Instance.Scheduling;
 import org.jclouds.googlecomputeengine.domain.Instance.Scheduling.OnHostMaintenance;
 import org.jclouds.googlecomputeengine.domain.MachineType;
 import org.jclouds.googlecomputeengine.domain.NewInstance;
+import org.jclouds.googlecomputeengine.domain.NewInstance.NetworkInterface;
 import org.jclouds.googlecomputeengine.domain.Operation;
 import org.jclouds.googlecomputeengine.domain.Region;
 import org.jclouds.googlecomputeengine.domain.Subnetwork;
@@ -148,16 +149,24 @@ public final class GoogleComputeEngineServiceAdapter
 
       Scheduling scheduling = getScheduling(options);
 
-      NewInstance newInstance = new NewInstance.Builder(name,
+      List<NetworkInterface> networks = Lists.newArrayList();
+      if (options.assignExternalIp()) {
+         networks.add(NetworkInterface.create(network, subnetwork));
+      } else {
+         // Do not assign an externally facing IP address to the machine.
+         networks.add(NetworkInterface.create(network, subnetwork, ImmutableList.<AccessConfig>of()));
+      }
+
+      NewInstance.Builder newInstanceBuilder = new NewInstance.Builder(name,
             template.getHardware().getUri(), // machineType
-            network,
-            subnetwork,
+            networks,
             disks)
             .description(group)
             .tags(Tags.create(null, ImmutableList.copyOf(options.getTags())))
             .serviceAccounts(options.serviceAccounts())
-            .scheduling(scheduling)
-            .build();
+            .scheduling(scheduling);
+
+      NewInstance newInstance = newInstanceBuilder.build();
 
       // Add metadata from template and for ssh key and image id
       newInstance.metadata().putAll(options.getUserMetadata());
@@ -216,7 +225,7 @@ public final class GoogleComputeEngineServiceAdapter
    }
 
    @Override public Iterable<Image> listImages() {
-      List<Iterable<Image>> images = newArrayList();
+      List<Iterable<Image>> images = Lists.newArrayList();
 
       images.add(concat(api.images().list()));
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d82a3df/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
index 288a35f..dc78d36 100644
--- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/options/GoogleComputeEngineTemplateOptions.java
@@ -28,6 +28,7 @@ import org.jclouds.scriptbuilder.domain.Statement;
 /** Instance options specific to Google Compute Engine. */
 public final class GoogleComputeEngineTemplateOptions extends TemplateOptions {
 
+   private boolean assignExternalIp = true;
    private boolean autoCreateKeyPair = true;
    private boolean autoCreateWindowsPassword;
    private List<ServiceAccount> serviceAccounts;
@@ -46,6 +47,7 @@ public final class GoogleComputeEngineTemplateOptions extends TemplateOptions {
       super.copyTo(to);
       if (to instanceof GoogleComputeEngineTemplateOptions) {
          GoogleComputeEngineTemplateOptions eTo = GoogleComputeEngineTemplateOptions.class.cast(to);
+         eTo.assignExternalIp(assignExternalIp());
          eTo.autoCreateKeyPair(autoCreateKeyPair());
          eTo.serviceAccounts(serviceAccounts());
          eTo.autoCreateWindowsPassword(autoCreateWindowsPassword());
@@ -70,6 +72,21 @@ public final class GoogleComputeEngineTemplateOptions extends TemplateOptions {
    }
 
    /**
+    * Sets whether an external IP address should be assigned to the machine.
+    */
+   public GoogleComputeEngineTemplateOptions assignExternalIp(boolean assignExternalIp) {
+      this.assignExternalIp = assignExternalIp;
+      return this;
+   }
+
+   /**
+    * Gets whether an external IP address should be assigned to the machine.
+    */
+   public boolean assignExternalIp() {
+      return assignExternalIp;
+   }
+
+   /**
     * Sets whether an SSH key pair should be created automatically.
     */
    public GoogleComputeEngineTemplateOptions autoCreateKeyPair(boolean autoCreateKeyPair) {
@@ -115,7 +132,7 @@ public final class GoogleComputeEngineTemplateOptions extends TemplateOptions {
     * the password if and only if the image is for a Windows VM.
     */
    public Boolean autoCreateWindowsPassword() {
-	   return autoCreateWindowsPassword;
+      return autoCreateWindowsPassword;
    }
    
    /**

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d82a3df/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java
index 67d9925..43f38fb 100644
--- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/NewInstance.java
@@ -37,19 +37,19 @@ import com.google.common.collect.ImmutableList;
 @AutoValue
 public abstract class NewInstance {
    @AutoValue
-   abstract static class NetworkInterface {
+   public abstract static class NetworkInterface {
       abstract URI network();
       @Nullable abstract URI subnetwork();
 
       abstract List<AccessConfig> accessConfigs();
 
-      static NetworkInterface create(URI network, URI subnetwork) {
+      public static NetworkInterface create(URI network, URI subnetwork) {
          return create(network, subnetwork,
              Arrays.asList(AccessConfig.create(null, Type.ONE_TO_ONE_NAT, null)));
       }
 
       @SerializedNames({ "network", "subnetwork", "accessConfigs" })
-      static NetworkInterface create(URI network, URI subnetwork, List<AccessConfig> accessConfigs) {
+      public static NetworkInterface create(URI network, URI subnetwork, List<AccessConfig> accessConfigs) {
          return new AutoValue_NewInstance_NetworkInterface(network, subnetwork, accessConfigs);
       }
 
@@ -131,6 +131,14 @@ public abstract class NewInstance {
          this.disks = disks;
       }
 
+      public Builder(String name, URI machineType, List<NetworkInterface> networks, List<AttachDisk> disks) {
+         checkNotNull(name, "NewInstance name cannot be null");
+         this.name = name;
+         this.machineType = machineType;
+         this.networkInterfaces = ImmutableList.copyOf(networks);
+         this.disks = disks;
+      }
+
       public Builder(String name, URI machineType, URI network, URI subnetwork, URI sourceImage) {
          checkNotNull(name, "NewInstance name cannot be null");
          this.name = name;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d82a3df/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java
index e5216e5..a81b175 100644
--- a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java
+++ b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceMockTest.java
@@ -319,6 +319,58 @@ public class GoogleComputeEngineServiceMockTest extends BaseGoogleComputeEngineA
       assertSent(server, "GET", "/projects/party/zones/us-central1-a/instances/test-1");
    }
 
+   public void createNodeWithoutExternalIp() 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(jsonResponse("/subnetwork_get.json"));
+      server.enqueue(jsonResponse("/network_get.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));
+      server.enqueue(jsonResponse("/disk_get_with_source_image.json"));
+      server.enqueue(jsonResponse("/image_get_for_source_image.json"));
+      server.enqueue(jsonResponse("/disktype_ssd.json"));
+      server.enqueue(jsonResponse("/operation.json")); // Create Instance
+      server.enqueue(instanceWithNetworkAndStatusAndSsd("test-1", "test-network", RUNNING));
+
+      ComputeService computeService = computeService();
+
+      GoogleComputeEngineTemplateOptions options = computeService.templateOptions()
+            .as(GoogleComputeEngineTemplateOptions.class).autoCreateKeyPair(false)
+            .tags(ImmutableSet.of("aTag")).blockUntilRunning(false)
+            .bootDiskType("pd-ssd").networks("jclouds-test").assignExternalIp(false);
+
+      Template template = computeService.templateBuilder().options(options).build();
+      NodeMetadata node = getOnlyElement(computeService.createNodesInGroup("test", 1, template));
+
+      // prove our caching works.
+      assertEquals(node.getImageId(), template.getImage().getId());
+      assertEquals(node.getLocation().getId(), template.getLocation().getId());
+
+      assertSent(server, "GET", "/projects/party/regions");
+      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/regions/us-central1/subnetworks/jclouds-test");
+      assertSent(server, "GET", "/projects/party/global/networks/mynetwork");
+      assertSent(server, "GET", "/projects/party/global/firewalls/jclouds-test-65f"); // Get Firewall
+      assertSent(server, "POST", "/projects/party/global/firewalls", // Create Firewall
+            stringFromResource("/firewall_insert_3.json"));
+
+      assertSent(server, "GET", "/projects/party/zones/us-central1-a/operations/operation-1354084865060");
+      assertSent(server, "GET", "/projects/party/aggregated/instances");
+      assertSent(server, "GET", "/projects/party/zones/us-central1-a/disks/test");
+      assertSent(server, "GET", "/projects/debian-cloud/global/images/debian-7-wheezy-v20140718");
+      assertSent(server, "GET", "/projects/party/zones/us-central1-a/diskTypes/pd-ssd");
+      assertSent(server, "POST", "/projects/party/zones/us-central1-a/instances",
+            String.format(stringFromResource("/instance_insert_no_ip.json"), template.getHardware().getId(), template.getImage().getId()));
+
+      assertSent(server, "GET", "/projects/party/zones/us-central1-a/instances/test-1");
+   }
+
    private MockResponse instanceWithNetworkAndStatus(String instanceName, String networkName, Instance.Status status) {
       return new MockResponse().setBody(
             stringFromResource("/instance_get.json").replace("test-0", instanceName).replace("default", networkName)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5d82a3df/providers/google-compute-engine/src/test/resources/instance_insert_no_ip.json
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/test/resources/instance_insert_no_ip.json b/providers/google-compute-engine/src/test/resources/instance_insert_no_ip.json
new file mode 100644
index 0000000..ce8b9a2
--- /dev/null
+++ b/providers/google-compute-engine/src/test/resources/instance_insert_no_ip.json
@@ -0,0 +1,42 @@
+{
+  "machineType": "%s",
+  "name": "test-1",
+  "networkInterfaces": [
+    {
+      "network": "https://www.googleapis.com/compute/v1/projects/party/global/networks/mynetwork",
+      "subnetwork": "https://www.googleapis.com/compute/v1/projects/party/regions/someregion/subnetworks/jclouds-test",
+      "accessConfigs": []
+    }
+  ],
+  "disks": [
+    {
+      "type": "PERSISTENT",
+      "initializeParams": {
+        "sourceImage": "%s",
+        "diskType": "https://content.googleapis.com/compute/v1/projects/party/zones/us-central1-a/diskTypes/pd-ssd"
+      },
+      "boot": true,
+      "autoDelete": true
+    }
+  ],
+  "description": "test",
+  "tags": {
+    "items": [
+      "aTag",
+      "jclouds-test-65f"
+    ]
+  },
+  "metadata": {
+    "items": [
+      {
+        "key": "jclouds-group",
+        "value": "test"
+      }
+    ]
+  },
+  "scheduling": {
+    "onHostMaintenance": "MIGRATE",
+    "automaticRestart": true,
+    "preemptible": false
+  }
+}
\ No newline at end of file