Updated Branches: refs/heads/1.6.x a83564af7 -> d9e5ba15b
Support Disk Configuration Extension in NovaTemplateOptions Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/commit/d9e5ba15 Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/tree/d9e5ba15 Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/diff/d9e5ba15 Branch: refs/heads/1.6.x Commit: d9e5ba15bfe6db40bb484e113dc70e57c21acc1c Parents: 01f118b Author: Everett Toews <[email protected]> Authored: Thu Aug 1 12:40:32 2013 -0500 Committer: Everett Toews <[email protected]> Committed: Thu Aug 1 16:50:43 2013 -0500 ---------------------------------------------------------------------- .../v2_0/compute/NovaComputeServiceAdapter.java | 3 +- .../compute/options/NovaTemplateOptions.java | 34 ++++++++++++++++-- .../openstack/nova/v2_0/domain/Server.java | 4 +-- .../NovaComputeServiceAdapterExpectTest.java | 36 ++++++++++++++++++++ .../options/NovaTemplateOptionsTest.java | 9 +++++ .../nova/v2_0/parse/ParseServerTest.java | 1 + .../src/test/resources/server_details.json | 1 + .../CloudServersUKTemplateBuilderLiveTest.java | 2 ++ .../CloudServersUSTemplateBuilderLiveTest.java | 2 ++ 9 files changed, 86 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/d9e5ba15/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapter.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapter.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapter.java index 2923cb6..4904cfa 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapter.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapter.java @@ -39,6 +39,7 @@ import org.jclouds.logging.Logger; import org.jclouds.openstack.nova.v2_0.NovaApi; import org.jclouds.openstack.nova.v2_0.compute.functions.RemoveFloatingIpFromNodeAndDeallocate; import org.jclouds.openstack.nova.v2_0.compute.options.NovaTemplateOptions; +import org.jclouds.openstack.nova.v2_0.compute.strategy.ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet; import org.jclouds.openstack.nova.v2_0.domain.Flavor; import org.jclouds.openstack.nova.v2_0.domain.Image; import org.jclouds.openstack.nova.v2_0.domain.KeyPair; @@ -61,7 +62,6 @@ import com.google.common.base.Supplier; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet.Builder; -import com.google.common.collect.Iterables; /** * The adapter used by the NovaComputeServiceContextModule to interface the nova-specific domain @@ -109,6 +109,7 @@ public class NovaComputeServiceAdapter implements if (templateOptions.getSecurityGroupNames().isPresent()) options.securityGroupNames(templateOptions.getSecurityGroupNames().get()); options.userData(templateOptions.getUserData()); + options.diskConfig(templateOptions.getDiskConfig()); Optional<String> privateKey = Optional.absent(); if (templateOptions.getKeyPairName() != null) { http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/d9e5ba15/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptions.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptions.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptions.java index d092564..afa062a 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptions.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptions.java @@ -28,6 +28,7 @@ import java.util.Set; import org.jclouds.compute.options.TemplateOptions; import org.jclouds.domain.LoginCredentials; import org.jclouds.openstack.nova.v2_0.NovaApi; +import org.jclouds.openstack.nova.v2_0.options.CreateServerOptions; import org.jclouds.scriptbuilder.domain.Statement; import com.google.common.base.Objects; @@ -72,6 +73,9 @@ public class NovaTemplateOptions extends TemplateOptions implements Cloneable { if (getUserData() != null) { eTo.userData(getUserData()); } + if (getDiskConfig() != null) { + eTo.diskConfig(getDiskConfig()); + } } } @@ -80,6 +84,7 @@ public class NovaTemplateOptions extends TemplateOptions implements Cloneable { protected boolean generateKeyPair = false; protected String keyPairName; protected byte[] userData; + protected String diskConfig; @Override public boolean equals(Object o) { @@ -92,12 +97,13 @@ public class NovaTemplateOptions extends TemplateOptions implements Cloneable { && equal(this.securityGroupNames, that.securityGroupNames) && equal(this.generateKeyPair, that.generateKeyPair) && equal(this.keyPairName, that.keyPairName) - && Arrays.equals(this.userData, that.userData); + && Arrays.equals(this.userData, that.userData) + && equal(this.diskConfig, that.diskConfig); } @Override public int hashCode() { - return Objects.hashCode(super.hashCode(), autoAssignFloatingIp, securityGroupNames, generateKeyPair, keyPairName, userData); + return Objects.hashCode(super.hashCode(), autoAssignFloatingIp, securityGroupNames, generateKeyPair, keyPairName, userData, diskConfig); } @Override @@ -111,6 +117,7 @@ public class NovaTemplateOptions extends TemplateOptions implements Cloneable { toString.add("generateKeyPair", generateKeyPair); toString.add("keyPairName", keyPairName); toString.add("userData", userData); + toString.add("diskConfig", diskConfig); return toString; } @@ -204,6 +211,13 @@ public class NovaTemplateOptions extends TemplateOptions implements Cloneable { return userData; } + /** + * @see CreateServerOptions#getDiskConfig() + */ + public String getDiskConfig() { + return diskConfig; + } + public static class Builder { /** @@ -340,7 +354,14 @@ public class NovaTemplateOptions extends TemplateOptions implements Cloneable { NovaTemplateOptions options = new NovaTemplateOptions(); return NovaTemplateOptions.class.cast(options.userData(userData)); } - + + /** + * @see org.jclouds.openstack.nova.v2_0.options.CreateServerOptions#getDiskConfig() + */ + public static NovaTemplateOptions diskConfig(String diskConfig) { + NovaTemplateOptions options = new NovaTemplateOptions(); + return NovaTemplateOptions.class.cast(options.diskConfig(diskConfig)); + } } // methods that only facilitate returning the correct object type @@ -484,4 +505,11 @@ public class NovaTemplateOptions extends TemplateOptions implements Cloneable { return this; } + /** + * @see CreateServerOptions#getDiskConfig() + */ + public NovaTemplateOptions diskConfig(String diskConfig) { + this.diskConfig = diskConfig; + return this; + } } http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/d9e5ba15/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java index a02cc04..026a6d4 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Server.java @@ -46,8 +46,8 @@ import com.google.common.collect.Multimap; * /> */ public class Server extends Resource { - public final static String DISK_CONFIG_MANUAL = "MANUAL"; - public final static String DISK_CONFIG_AUTO = "AUTO"; + public static final String DISK_CONFIG_MANUAL = "MANUAL"; + public static final String DISK_CONFIG_AUTO = "AUTO"; /** * Servers contain a status attribute that can be used as an indication of the current server http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/d9e5ba15/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapterExpectTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapterExpectTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapterExpectTest.java index eca8f3d..94de755 100644 --- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapterExpectTest.java +++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapterExpectTest.java @@ -32,6 +32,7 @@ import org.jclouds.http.HttpRequest; import org.jclouds.http.HttpResponse; import org.jclouds.openstack.nova.v2_0.compute.options.NovaTemplateOptions; import org.jclouds.openstack.nova.v2_0.domain.KeyPair; +import org.jclouds.openstack.nova.v2_0.domain.Server; import org.jclouds.openstack.nova.v2_0.domain.zonescoped.ServerInZone; import org.jclouds.openstack.nova.v2_0.domain.zonescoped.ZoneAndName; import org.jclouds.openstack.nova.v2_0.internal.BaseNovaComputeServiceContextExpectTest; @@ -60,6 +61,41 @@ public class NovaComputeServiceAdapterExpectTest extends BaseNovaComputeServiceC HttpResponse serverDetailResponse = HttpResponse.builder().statusCode(200) .payload(payloadFromResource("/server_details.json")).build(); + public void testCreateNodeWithGroupEncodedIntoNameWithDiskConfig() throws Exception { + + HttpRequest createServer = HttpRequest + .builder() + .method("POST") + .endpoint("https://az-1.region-a.geo-1.compute.hpcloudsvc.com/v1.1/3456/servers") + .addHeader("Accept", "application/json") + .addHeader("X-Auth-Token", authToken) + .payload(payloadFromStringWithContentType( + "{\"server\":{\"name\":\"test-e92\",\"imageRef\":\"1241\",\"flavorRef\":\"100\",\"OS-DCF:diskConfig\":\"AUTO\"}}","application/json")) + .build(); + + HttpResponse createServerResponse = HttpResponse.builder().statusCode(202).message("HTTP/1.1 202 Accepted") + .payload(payloadFromResourceWithContentType("/new_server_disk_config_auto.json","application/json; charset=UTF-8")).build(); + + Map<HttpRequest, HttpResponse> requestResponseMap = ImmutableMap.<HttpRequest, HttpResponse> builder() + .put(keystoneAuthWithUsernameAndPasswordAndTenantName, responseWithKeystoneAccess) + .put(extensionsOfNovaRequest, extensionsOfNovaResponse) + .put(listDetail, listDetailResponse) + .put(listFlavorsDetail, listFlavorsDetailResponse) + .put(createServer, createServerResponse) + .put(serverDetail, serverDetailResponse).build(); + + Injector forDiskConfig = requestsSendResponses(requestResponseMap); + + Template template = forDiskConfig.getInstance(TemplateBuilder.class).build(); + template.getOptions().as(NovaTemplateOptions.class).diskConfig(Server.DISK_CONFIG_AUTO); + + NovaComputeServiceAdapter adapter = forDiskConfig.getInstance(NovaComputeServiceAdapter.class); + + NodeAndInitialCredentials<ServerInZone> server = adapter.createNodeWithGroupEncodedIntoName("test", "test-e92", template); + assertNotNull(server); + assertEquals(server.getNode().getServer().getDiskConfig().orNull(), Server.DISK_CONFIG_AUTO); + } + public void testCreateNodeWithGroupEncodedIntoNameWhenSecurityGroupsArePresent() throws Exception { HttpRequest createServer = HttpRequest http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/d9e5ba15/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptionsTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptionsTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptionsTest.java index 2177690..106da5b 100644 --- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptionsTest.java +++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/options/NovaTemplateOptionsTest.java @@ -28,6 +28,7 @@ import static org.testng.Assert.assertEquals; import java.io.IOException; import org.jclouds.compute.options.TemplateOptions; +import org.jclouds.openstack.nova.v2_0.domain.Server; import org.testng.annotations.Test; import com.google.common.base.Optional; @@ -195,6 +196,14 @@ public class NovaTemplateOptionsTest { options.userData("test".getBytes()); assertEquals(new String(options.getUserData()), "test"); } + + @Test + public void testDiskConfig() { + NovaTemplateOptions options = new NovaTemplateOptions(); + options.diskConfig(Server.DISK_CONFIG_AUTO); + assertEquals(options.getDiskConfig(), Server.DISK_CONFIG_AUTO); + } + @Test(expectedExceptions = IllegalArgumentException.class) public void testblockOnPortBadFormat() { NovaTemplateOptions options = new NovaTemplateOptions(); http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/d9e5ba15/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerTest.java ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerTest.java index d7119ef..db8e387 100644 --- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerTest.java +++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerTest.java @@ -66,6 +66,7 @@ public class ParseServerTest extends BaseItemParserTest<Server> { .accessIPv4("67.23.10.132") .accessIPv6("::babe:67.23.10.132") .status(Status.BUILD) + .diskConfig(Server.DISK_CONFIG_AUTO) .image( Resource .builder() http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/d9e5ba15/apis/openstack-nova/src/test/resources/server_details.json ---------------------------------------------------------------------- diff --git a/apis/openstack-nova/src/test/resources/server_details.json b/apis/openstack-nova/src/test/resources/server_details.json index 6c286b6..f548785 100644 --- a/apis/openstack-nova/src/test/resources/server_details.json +++ b/apis/openstack-nova/src/test/resources/server_details.json @@ -11,6 +11,7 @@ "accessIPv6" : "::babe:67.23.10.132", "status": "BUILD(scheduling)", "progress": 60, + "OS-DCF:diskConfig": "AUTO", "image" : { "id": "52415800-8b69-11e0-9b19-734f6f006e54", "links": [ http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/d9e5ba15/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/compute/CloudServersUKTemplateBuilderLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/compute/CloudServersUKTemplateBuilderLiveTest.java b/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/compute/CloudServersUKTemplateBuilderLiveTest.java index 143b693..1b974ca 100644 --- a/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/compute/CloudServersUKTemplateBuilderLiveTest.java +++ b/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/compute/CloudServersUKTemplateBuilderLiveTest.java @@ -18,6 +18,7 @@ package org.jclouds.rackspace.cloudservers.uk.compute; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; import java.util.Set; @@ -81,6 +82,7 @@ public class CloudServersUKTemplateBuilderLiveTest extends BaseTemplateBuilderLi assertEquals(defaultTemplate.getImage().getLocation().getId(), "LON"); assertEquals(defaultTemplate.getHardware().getLocation().getId(), "LON"); assertEquals(defaultTemplate.getOptions().as(NovaTemplateOptions.class).shouldAutoAssignFloatingIp(), false); + assertNull(defaultTemplate.getOptions().as(NovaTemplateOptions.class).getDiskConfig()); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); } http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/d9e5ba15/providers/rackspace-cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/us/compute/CloudServersUSTemplateBuilderLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/rackspace-cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/us/compute/CloudServersUSTemplateBuilderLiveTest.java b/providers/rackspace-cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/us/compute/CloudServersUSTemplateBuilderLiveTest.java index 8af9c90..78c8eb6 100644 --- a/providers/rackspace-cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/us/compute/CloudServersUSTemplateBuilderLiveTest.java +++ b/providers/rackspace-cloudservers-us/src/test/java/org/jclouds/rackspace/cloudservers/us/compute/CloudServersUSTemplateBuilderLiveTest.java @@ -18,6 +18,7 @@ package org.jclouds.rackspace.cloudservers.us.compute; import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNull; import java.util.Set; @@ -81,6 +82,7 @@ public class CloudServersUSTemplateBuilderLiveTest extends BaseTemplateBuilderLi assertEquals(defaultTemplate.getImage().getLocation().getId(), "DFW"); assertEquals(defaultTemplate.getHardware().getLocation().getId(), "DFW"); assertEquals(defaultTemplate.getOptions().as(NovaTemplateOptions.class).shouldAutoAssignFloatingIp(), false); + assertNull(defaultTemplate.getOptions().as(NovaTemplateOptions.class).getDiskConfig()); assertEquals(getCores(defaultTemplate.getHardware()), 1.0d); }
