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/06/26 14:45:21 UTC
[46/50] [abbrv] jclouds git commit: JCLOUDS-934. Add support for
specifying boot disk type in compute service
JCLOUDS-934. Add support for specifying boot disk type in compute service
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/f3555cba
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/f3555cba
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/f3555cba
Branch: refs/heads/master
Commit: f3555cba1b5753f4be954194026d2f307fe37b8f
Parents: c1b1cfb
Author: Andrew Bayer <an...@gmail.com>
Authored: Mon Jun 15 15:55:03 2015 -0700
Committer: Andrew Bayer <an...@gmail.com>
Committed: Mon Jun 15 15:55:03 2015 -0700
----------------------------------------------------------------------
.../GoogleComputeEngineServiceAdapter.java | 41 +++++++++------
.../GoogleComputeEngineTemplateOptions.java | 19 ++++++-
.../googlecomputeengine/domain/AttachDisk.java | 8 +++
.../GoogleComputeEngineServiceLiveTest.java | 44 +++++++++++++++--
.../GoogleComputeEngineServiceMockTest.java | 52 ++++++++++++++++++++
.../src/test/resources/disktype_ssd.json | 11 +++++
.../src/test/resources/instance_insert_ssd.json | 40 +++++++++++++++
7 files changed, 195 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f3555cba/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 7e3d74e..e7035ba 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
@@ -22,9 +22,11 @@ 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.config.GoogleComputeEngineProperties.IMAGE_PROJECTS;
import static org.jclouds.googlecomputeengine.compute.strategy.CreateNodesWithGroupEncodedIntoNameThenAddToSet.simplifyPorts;
+import static org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperties.IMAGE_PROJECTS;
+import javax.inject.Inject;
+import javax.inject.Named;
import java.net.URI;
import java.util.ArrayList;
import java.util.Iterator;
@@ -32,9 +34,14 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
-import javax.inject.Inject;
-import javax.inject.Named;
-
+import com.google.common.base.Predicate;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.Atomics;
+import com.google.common.util.concurrent.UncheckedTimeoutException;
import org.jclouds.compute.ComputeServiceAdapter;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.NodeMetadata;
@@ -49,6 +56,7 @@ import org.jclouds.googlecomputeengine.compute.functions.FirewallTagNamingConven
import org.jclouds.googlecomputeengine.compute.functions.Resources;
import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions;
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.Scheduling;
@@ -62,15 +70,6 @@ import org.jclouds.googlecomputeengine.domain.Zone;
import org.jclouds.googlecomputeengine.features.InstanceApi;
import org.jclouds.location.suppliers.all.JustProvider;
-import com.google.common.base.Predicate;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.Atomics;
-import com.google.common.util.concurrent.UncheckedTimeoutException;
-
/**
* This implementation maps the following:
* <ul>
@@ -120,8 +119,10 @@ public final class GoogleComputeEngineServiceAdapter
checkNotNull(template.getHardware().getUri(), "hardware must have a URI");
checkNotNull(template.getImage().getUri(), "image URI is null");
+ String zone = template.getLocation().getId();
+
List<AttachDisk> disks = Lists.newArrayList();
- disks.add(AttachDisk.newBootDisk(template.getImage().getUri()));
+ disks.add(AttachDisk.newBootDisk(template.getImage().getUri(), getDiskTypeArgument(options, zone)));
Iterator<String> networks = options.getNetworks().iterator();
@@ -156,7 +157,6 @@ public final class GoogleComputeEngineServiceAdapter
format("%s:%s %s@localhost", credentials.getUser(), options.getPublicKey(), credentials.getUser()));
}
- String zone = template.getLocation().getId();
InstanceApi instanceApi = api.instancesInZone(zone);
Operation create = instanceApi.create(newInstance);
@@ -303,4 +303,15 @@ public final class GoogleComputeEngineServiceAdapter
String path = link.getPath();
return path.substring(path.lastIndexOf('/') + 1);
}
+
+ private URI getDiskTypeArgument(GoogleComputeEngineTemplateOptions options, String zone) {
+ if (options.bootDiskType() != null) {
+ DiskType diskType = api.diskTypesInZone(zone).get(options.bootDiskType());
+ if (diskType != null) {
+ return diskType.selfLink();
+ }
+ }
+
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f3555cba/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 1923c3a..a2cbd1f 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
@@ -21,14 +21,15 @@ import java.util.Map;
import org.jclouds.compute.options.TemplateOptions;
import org.jclouds.domain.LoginCredentials;
-import org.jclouds.scriptbuilder.domain.Statement;
import org.jclouds.googlecomputeengine.domain.Instance.ServiceAccount;
+import org.jclouds.scriptbuilder.domain.Statement;
/** Instance options specific to Google Compute Engine. */
public final class GoogleComputeEngineTemplateOptions extends TemplateOptions {
private boolean autoCreateKeyPair = true;
private List<ServiceAccount> serviceAccounts;
+ private String bootDiskType;
@Override
public GoogleComputeEngineTemplateOptions clone() {
@@ -44,10 +45,26 @@ public final class GoogleComputeEngineTemplateOptions extends TemplateOptions {
GoogleComputeEngineTemplateOptions eTo = GoogleComputeEngineTemplateOptions.class.cast(to);
eTo.autoCreateKeyPair(autoCreateKeyPair());
eTo.serviceAccounts(serviceAccounts());
+ eTo.bootDiskType(bootDiskType());
}
}
/**
+ * Sets the boot disk type.
+ */
+ public GoogleComputeEngineTemplateOptions bootDiskType(String diskType) {
+ this.bootDiskType = diskType;
+ return this;
+ }
+
+ /**
+ * Gets the boot disk type.
+ */
+ public String bootDiskType() {
+ return bootDiskType;
+ }
+
+ /**
* Sets whether an SSH key pair should be created automatically.
*/
public GoogleComputeEngineTemplateOptions autoCreateKeyPair(boolean autoCreateKeyPair) {
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f3555cba/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java
index 198b815..5c34818 100644
--- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/domain/AttachDisk.java
@@ -43,6 +43,10 @@ public abstract class AttachDisk {
return create(null, null, sourceImage, null);
}
+ static InitializeParams create(URI sourceImage, URI diskType) {
+ return create(null, null, sourceImage, diskType);
+ }
+
@SerializedNames({ "diskName", "diskSizeGb", "sourceImage", "diskType" })
public static InitializeParams create(String diskName, Long diskSizeGb, URI sourceImage, URI diskType) {
return new AutoValue_AttachDisk_InitializeParams(diskName, diskSizeGb, sourceImage, diskType);
@@ -103,6 +107,10 @@ public abstract class AttachDisk {
return create(Type.PERSISTENT, null, InitializeParams.create(sourceImage), true, true);
}
+ public static AttachDisk newBootDisk(URI sourceImage, URI diskType) {
+ return create(Type.PERSISTENT, null, InitializeParams.create(sourceImage, diskType), true, true);
+ }
+
public static AttachDisk existingDisk(URI existingDisk) {
return create(Type.PERSISTENT, existingDisk, null, false, false);
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f3555cba/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
index 1801408..afaa5bb 100644
--- a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
+++ b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
@@ -18,27 +18,34 @@ package org.jclouds.googlecomputeengine.compute;
import static com.google.common.collect.Iterables.contains;
import static org.jclouds.util.Strings2.toStringAndClose;
+import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
+import java.net.URI;
import java.util.Properties;
import java.util.Set;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.inject.Module;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.compute.domain.Hardware;
import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.predicates.NodePredicates;
import org.jclouds.googlecloud.internal.TestProperties;
import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
+import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions;
+import org.jclouds.googlecomputeengine.domain.Disk;
+import org.jclouds.googlecomputeengine.domain.Instance;
import org.jclouds.googlecomputeengine.domain.MachineType;
import org.jclouds.rest.AuthorizationException;
import org.jclouds.sshj.config.SshjSshClientModule;
import org.testng.annotations.Test;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-
@Test(groups = "live", singleThreaded = true)
public class GoogleComputeEngineServiceLiveTest extends BaseComputeServiceLiveTest {
@@ -67,6 +74,29 @@ public class GoogleComputeEngineServiceLiveTest extends BaseComputeServiceLiveTe
}
}
+ public void testCreateNodeWithSsd() throws Exception {
+ String group = this.group + "ssd";
+ try {
+ TemplateOptions options = client.templateOptions();
+
+ options.as(GoogleComputeEngineTemplateOptions.class).bootDiskType("pd-ssd");
+
+ // create a node
+ Set<? extends NodeMetadata> nodes =
+ client.createNodesInGroup(group, 1, options);
+ assertEquals(nodes.size(), 1, "One node should have been created");
+
+ // Verify the disk on the instance is an ssd.
+ NodeMetadata node = Iterables.get(nodes, 0);
+ GoogleComputeEngineApi api = client.getContext().unwrapApi(GoogleComputeEngineApi.class);
+ Instance instance = api.instancesInZone(node.getLocation().getId()).get(node.getName());
+ Disk disk = api.disksInZone(node.getLocation().getId()).get(toName(instance.disks().get(0).source()));
+ assertTrue(disk.type().toString().endsWith("pd-ssd"));
+
+ } finally {
+ client.destroyNodesMatching(NodePredicates.inGroup(group));
+ }
+ }
/**
* Nodes may have additional metadata entries (particularly they may have an "sshKeys" entry)
*/
@@ -110,4 +140,10 @@ public class GoogleComputeEngineServiceLiveTest extends BaseComputeServiceLiveTe
assert nodeTags.contains(tag) : String.format("node tags did not match %s %s node:", tags, nodeTags, node);
}
}
+
+ private static String toName(URI link) {
+ String path = link.getPath();
+ return path.substring(path.lastIndexOf('/') + 1);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f3555cba/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 d9e53f9..d374f93 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
@@ -184,12 +184,64 @@ public class GoogleComputeEngineServiceMockTest extends BaseGoogleComputeEngineA
assertSent(server, "GET", "/projects/party/zones/us-central1-a/instances/test-1");
}
+ public void createNodeWithSpecificDiskType() 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("/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));
+ 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");
+
+ 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/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");
+ assertSent(server, "GET", "/projects/party/aggregated/instances");
+ 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_ssd.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)
.replace("RUNNING", status.toString()));
}
+ private MockResponse instanceWithNetworkAndStatusAndSsd(String instanceName, String networkName, Instance.Status status) {
+ return new MockResponse().setBody(
+ stringFromResource("/instance_get.json").replace("test-0", instanceName).replace("default", networkName)
+ .replace("RUNNING", status.toString()).replace("pd-standard", "pd-ssd"));
+ }
+
private MockResponse aggregatedListWithInstanceNetworkAndStatus(String instanceName, String networkName,
Instance.Status status) {
return new MockResponse().setBody(
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f3555cba/providers/google-compute-engine/src/test/resources/disktype_ssd.json
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/test/resources/disktype_ssd.json b/providers/google-compute-engine/src/test/resources/disktype_ssd.json
new file mode 100644
index 0000000..fcedefb
--- /dev/null
+++ b/providers/google-compute-engine/src/test/resources/disktype_ssd.json
@@ -0,0 +1,11 @@
+{
+ "kind": "compute#diskType",
+ "creationTimestamp": "2014-06-02T11:07:28.529-07:00",
+ "name": "pd-ssd",
+ "description": "SSD Persistent Disk",
+ "validDiskSize": "10GB-1TB",
+ "zone": "https://content.googleapis.com/compute/v1/projects/party/zones/us-central1-a",
+ "selfLink": "https://content.googleapis.com/compute/v1/projects/party/zones/us-central1-a/diskTypes/pd-ssd",
+ "defaultDiskSizeGb": "100"
+}
+
http://git-wip-us.apache.org/repos/asf/jclouds/blob/f3555cba/providers/google-compute-engine/src/test/resources/instance_insert_ssd.json
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/test/resources/instance_insert_ssd.json b/providers/google-compute-engine/src/test/resources/instance_insert_ssd.json
new file mode 100644
index 0000000..7a5080d
--- /dev/null
+++ b/providers/google-compute-engine/src/test/resources/instance_insert_ssd.json
@@ -0,0 +1,40 @@
+{
+ "machineType": "%s",
+ "name": "test-1",
+ "networkInterfaces": [
+ {
+ "network": "https://www.googleapis.com/compute/v1/projects/party/networks/default",
+ "accessConfigs": [
+ {
+ "type": "ONE_TO_ONE_NAT"
+ }
+ ]
+ }
+ ],
+ "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"
+ }
+ ]
+ }
+}
\ No newline at end of file