Repository: jclouds Updated Branches: refs/heads/2.0.x d99350130 -> fa746ff16
JCLOUDS-1206: Replace user metadata by byte[] userData Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/3ae2213a Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/3ae2213a Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/3ae2213a Branch: refs/heads/2.0.x Commit: 3ae2213a7de2a57cf53f3a589e3fd8106ffafcde Parents: d993501 Author: Fritz Elfert <[email protected]> Authored: Sat Nov 26 12:22:44 2016 +0100 Committer: Ignasi Barrera <[email protected]> Committed: Wed Dec 7 17:24:42 2016 +0100 ---------------------------------------------------------------------- .../DigitalOcean2ComputeServiceAdapter.java | 31 ++++++++++++------- .../options/DigitalOcean2TemplateOptions.java | 32 ++++++++++++++++++-- .../DigitalOcean2ComputeServiceLiveTest.java | 4 +-- .../DigitalOcean2TemplateOptionsTest.java | 9 +++++- 4 files changed, 60 insertions(+), 16 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/3ae2213a/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceAdapter.java ---------------------------------------------------------------------- diff --git a/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceAdapter.java b/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceAdapter.java index f520f45..1782551 100644 --- a/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceAdapter.java +++ b/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceAdapter.java @@ -26,7 +26,6 @@ import static com.google.common.collect.Sets.newHashSet; import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING; import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED; import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED; -import static org.jclouds.compute.util.ComputeServiceUtils.metadataAndTagsAsCommaDelimitedValue; import java.util.List; import java.util.Map; @@ -83,6 +82,17 @@ public class DigitalOcean2ComputeServiceAdapter implements ComputeServiceAdapter this.json = json; } + private void setUserDataIfSupported(Template template, CreateDropletOptions.Builder options, String userData) { + @SuppressWarnings("unchecked") + List<String> regionFeatures = (List<String>) template.getLocation().getMetadata().get("features"); + if (regionFeatures.contains("metadata")) { + options.userData(userData); + } else { + logger.debug(">> region %s does not support metadata, ignoring provided user data", template.getLocation() + .getId()); + } + } + @Override public NodeAndInitialCredentials<Droplet> createNodeWithGroupEncodedIntoName(String group, final String name, Template template) { @@ -96,16 +106,15 @@ public class DigitalOcean2ComputeServiceAdapter implements ComputeServiceAdapter options.addSshKeyIds(templateOptions.getSshKeyIds()); } - Map<String, String> metadataAndTags = metadataAndTagsAsCommaDelimitedValue(templateOptions); - if (!metadataAndTags.isEmpty()) { - @SuppressWarnings("unchecked") - List<String> regionFeatures = (List<String>) template.getLocation().getMetadata().get("features"); - if (regionFeatures.contains("metadata")) { - options.userData(json.toJson(metadataAndTags)); - } else { - logger.debug(">> region %s does not support metadata, ignoring provided user data", template.getLocation() - .getId()); - } + // In DigitalOcean, user_data is a SINGLE string, NOT a map! + // Encoding tags or anything else than user_data in here breaks their functionality. + if (null != templateOptions.getUserData()) { + setUserDataIfSupported(template, options, new String(templateOptions.getUserData())); + } + // Backwards compatible variant, getting userData from userMetaData map. + Map<String, String> metadataAndTags = templateOptions.getUserMetadata(); + if (null != metadataAndTags.get("user_data")) { + setUserDataIfSupported(template, options, metadataAndTags.get("user_data")); } DropletCreate dropletCreated = api.dropletApi().create(name, http://git-wip-us.apache.org/repos/asf/jclouds/blob/3ae2213a/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptions.java ---------------------------------------------------------------------- diff --git a/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptions.java b/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptions.java index cafcdb1..bc18a59 100644 --- a/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptions.java +++ b/providers/digitalocean2/src/main/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptions.java @@ -19,6 +19,7 @@ package org.jclouds.digitalocean2.compute.options; import static com.google.common.base.Objects.equal; import static com.google.common.base.Preconditions.checkNotNull; +import java.util.Arrays; import java.util.Set; import org.jclouds.compute.options.TemplateOptions; @@ -35,6 +36,7 @@ public class DigitalOcean2TemplateOptions extends TemplateOptions implements Clo private boolean privateNetworking = false; private boolean backupsEnabled = false; private boolean autoCreateKeyPair = true; + private byte[] userData; /** * Enables a private network interface if the region supports private networking. @@ -68,6 +70,14 @@ public class DigitalOcean2TemplateOptions extends TemplateOptions implements Clo return this; } + /** + * Sets the userData member. + */ + public DigitalOcean2TemplateOptions userData(byte[] userData) { + this.userData = userData; + return this; + } + public Set<Integer> getSshKeyIds() { return sshKeyIds; } @@ -84,6 +94,10 @@ public class DigitalOcean2TemplateOptions extends TemplateOptions implements Clo return autoCreateKeyPair; } + public byte[] getUserData() { + return userData; + } + @Override public DigitalOcean2TemplateOptions clone() { DigitalOcean2TemplateOptions options = new DigitalOcean2TemplateOptions(); @@ -100,12 +114,16 @@ public class DigitalOcean2TemplateOptions extends TemplateOptions implements Clo eTo.backupsEnabled(backupsEnabled); eTo.autoCreateKeyPair(autoCreateKeyPair); eTo.sshKeyIds(sshKeyIds); + if (null != getUserData()) { + eTo.userData(getUserData()); + } } } @Override public int hashCode() { - return Objects.hashCode(super.hashCode(), backupsEnabled, privateNetworking, autoCreateKeyPair, sshKeyIds); + return Objects.hashCode(super.hashCode(), backupsEnabled, privateNetworking, autoCreateKeyPair, sshKeyIds, + Arrays.hashCode(userData)); } @Override @@ -122,7 +140,8 @@ public class DigitalOcean2TemplateOptions extends TemplateOptions implements Clo DigitalOcean2TemplateOptions other = (DigitalOcean2TemplateOptions) obj; return super.equals(other) && equal(this.backupsEnabled, other.backupsEnabled) && equal(this.privateNetworking, other.privateNetworking) - && equal(this.autoCreateKeyPair, other.autoCreateKeyPair) && equal(this.sshKeyIds, other.sshKeyIds); + && equal(this.autoCreateKeyPair, other.autoCreateKeyPair) && equal(this.sshKeyIds, other.sshKeyIds) + && Arrays.equals(this.userData, other.userData); } @Override @@ -134,6 +153,7 @@ public class DigitalOcean2TemplateOptions extends TemplateOptions implements Clo toString.add("sshKeyIds", sshKeyIds); } toString.add("autoCreateKeyPair", autoCreateKeyPair); + toString.add("userData", userData); return toString; } @@ -170,5 +190,13 @@ public class DigitalOcean2TemplateOptions extends TemplateOptions implements Clo DigitalOcean2TemplateOptions options = new DigitalOcean2TemplateOptions(); return options.autoCreateKeyPair(autoCreateKeyPair); } + + /** + * @see DigitalOcean2TemplateOptions#userData + */ + public static DigitalOcean2TemplateOptions userData(byte[] userData) { + DigitalOcean2TemplateOptions options = new DigitalOcean2TemplateOptions(); + return options.userData(userData); + } } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/3ae2213a/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceLiveTest.java b/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceLiveTest.java index f45a73f..139ad52 100644 --- a/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceLiveTest.java +++ b/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/DigitalOcean2ComputeServiceLiveTest.java @@ -55,12 +55,12 @@ public class DigitalOcean2ComputeServiceLiveTest extends BaseComputeServiceLiveT @Override protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) { - // We encode the tags in the user data but the DigitalOcean API does not return it + // We do not support tags yet. } @Override protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) { - // The DigitalOcean API does not return the user data + // The DigitalOcean API does not support user metadata. } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/3ae2213a/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptionsTest.java ---------------------------------------------------------------------- diff --git a/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptionsTest.java b/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptionsTest.java index 982224c..e58161b 100644 --- a/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptionsTest.java +++ b/providers/digitalocean2/src/test/java/org/jclouds/digitalocean2/compute/options/DigitalOcean2TemplateOptionsTest.java @@ -43,10 +43,17 @@ public class DigitalOcean2TemplateOptionsTest { TemplateOptions options = new DigitalOcean2TemplateOptions().backupsEnabled(true); assertEquals(options.as(DigitalOcean2TemplateOptions.class).getBackupsEnabled(), true); } - + @Test public void testAutoCreateKeyPair() { TemplateOptions options = new DigitalOcean2TemplateOptions().autoCreateKeyPair(false); assertEquals(options.as(DigitalOcean2TemplateOptions.class).getAutoCreateKeyPair(), false); } + + @Test + public void testUserData() { + byte[] userData = "Lorem ipsum".getBytes(); + TemplateOptions options = new DigitalOcean2TemplateOptions().userData(userData); + assertEquals(options.as(DigitalOcean2TemplateOptions.class).getUserData(), userData); + } }
