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/02/02 15:52:27 UTC

jclouds-labs git commit: Properly set the name and distribution of the DigitalOcean images

Repository: jclouds-labs
Updated Branches:
  refs/heads/master 3b6ddf0d7 -> d56c8721f


Properly set the name and distribution of the DigitalOcean images


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

Branch: refs/heads/master
Commit: d56c8721fdc1bcc9f3404fb56084654ccbb11237
Parents: 3b6ddf0
Author: Ignasi Barrera <na...@apache.org>
Authored: Fri Jan 30 12:57:46 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Fri Jan 30 16:19:47 2015 +0100

----------------------------------------------------------------------
 .../compute/functions/ImageToImage.java         | 17 ++++----
 .../strategy/CreateKeyPairsThenCreateNodes.java |  7 ++--
 .../digitalocean/domain/Distribution.java       | 12 +++---
 .../org/jclouds/digitalocean/domain/Image.java  | 42 ++++++++++++++++++--
 .../digitalocean/domain/OperatingSystem.java    | 13 +++---
 .../compute/functions/ImageToImageTest.java     | 18 ++++++---
 .../domain/OperatingSystemTest.java             | 32 +++++++++++----
 digitalocean/src/test/resources/image1.json     |  4 +-
 digitalocean/src/test/resources/image2.json     |  4 +-
 digitalocean/src/test/resources/image3.json     |  4 +-
 digitalocean/src/test/resources/images.json     | 12 ++++--
 11 files changed, 118 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/main/java/org/jclouds/digitalocean/compute/functions/ImageToImage.java
----------------------------------------------------------------------
diff --git a/digitalocean/src/main/java/org/jclouds/digitalocean/compute/functions/ImageToImage.java b/digitalocean/src/main/java/org/jclouds/digitalocean/compute/functions/ImageToImage.java
index 57d3f12..46f18d0 100644
--- a/digitalocean/src/main/java/org/jclouds/digitalocean/compute/functions/ImageToImage.java
+++ b/digitalocean/src/main/java/org/jclouds/digitalocean/compute/functions/ImageToImage.java
@@ -36,23 +36,24 @@ public class ImageToImage implements Function<Image, org.jclouds.compute.domain.
 
    @Override
    public org.jclouds.compute.domain.Image apply(final Image input) {
+      String description = input.getOs().getDistribution().getValue() + " " + input.getName();
       ImageBuilder builder = new ImageBuilder();
       // Private images don't have a slug
       builder.id(input.getSlug() != null ? input.getSlug() : String.valueOf(input.getId()));
       builder.providerId(String.valueOf(input.getId()));
       builder.name(input.getName());
-      builder.description(input.getName());
+      builder.description(description);
       builder.status(Status.AVAILABLE);
 
       OperatingSystem os = input.getOs();
 
-      builder.operatingSystem(builder() 
-            .name(input.getName()) 
-            .family(os.getDistribution().getOsFamily()) 
-            .description(input.getName()) 
-            .arch(os.getArch()) 
-            .version(os.getVersion()) 
-            .is64Bit(os.is64bit()) 
+      builder.operatingSystem(builder()
+            .name(os.getDistribution().getValue())
+            .family(os.getDistribution().getOsFamily())
+            .description(description)
+            .arch(os.getArch())
+            .version(os.getVersion())
+            .is64Bit(os.is64bit())
             .build());
 
       ImmutableMap.Builder<String, String> metadata = ImmutableMap.builder();

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/main/java/org/jclouds/digitalocean/compute/strategy/CreateKeyPairsThenCreateNodes.java
----------------------------------------------------------------------
diff --git a/digitalocean/src/main/java/org/jclouds/digitalocean/compute/strategy/CreateKeyPairsThenCreateNodes.java b/digitalocean/src/main/java/org/jclouds/digitalocean/compute/strategy/CreateKeyPairsThenCreateNodes.java
index b9da3dc..511a314 100644
--- a/digitalocean/src/main/java/org/jclouds/digitalocean/compute/strategy/CreateKeyPairsThenCreateNodes.java
+++ b/digitalocean/src/main/java/org/jclouds/digitalocean/compute/strategy/CreateKeyPairsThenCreateNodes.java
@@ -16,7 +16,6 @@
  */
 package org.jclouds.digitalocean.compute.strategy;
 
-import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Iterables.tryFind;
 
@@ -105,9 +104,9 @@ public class CreateKeyPairsThenCreateNodes extends CreateNodesWithGroupEncodedIn
 
       // If there is a script to run in the node, make sure a pivate key has been configured so jclouds will be able to
       // access the node
-      if (options.getRunScript() != null) {
-         checkArgument(!Strings.isNullOrEmpty(options.getLoginPrivateKey()),
-               "no private key configured for: %s; please use options.overrideLoginPrivateKey(rsa_private_text)", group);
+      if (options.getRunScript() != null && Strings.isNullOrEmpty(options.getLoginPrivateKey())) {
+         logger.warn(">> A runScript has been configured but no SSH key has been provided."
+               + " Authentication will delegate to the ssh-agent");
       }
 
       // If there is a key configured, then make sure there is a key pair for it

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Distribution.java
----------------------------------------------------------------------
diff --git a/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Distribution.java b/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Distribution.java
index 57e7a3e..ef107c4 100644
--- a/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Distribution.java
+++ b/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Distribution.java
@@ -30,12 +30,8 @@ import com.google.common.base.Predicate;
  * DigitalOcean image distributions.
  */
 public enum Distribution {
-   ARCHLINUX(OsFamily.ARCH, "Arch Linux"), 
-   CENTOS(OsFamily.CENTOS, "CentOS"), 
-   DEBIAN(OsFamily.DEBIAN, "Debian"), 
-   FEDORA(OsFamily.FEDORA, "Fedora"), 
-   UBUNTU(OsFamily.UBUNTU, "Ubuntu"), 
-   UNRECOGNIZED(OsFamily.UNRECOGNIZED, ""); 
+   ARCHLINUX(OsFamily.ARCH, "Arch Linux"), CENTOS(OsFamily.CENTOS, "CentOS"), DEBIAN(OsFamily.DEBIAN, "Debian"), FEDORA(
+         OsFamily.FEDORA, "Fedora"), UBUNTU(OsFamily.UBUNTU, "Ubuntu"), UNRECOGNIZED(OsFamily.UNRECOGNIZED, "");
 
    private static final List<Distribution> values = asList(Distribution.values());
 
@@ -51,6 +47,10 @@ public enum Distribution {
       return this.osFamily;
    }
 
+   public String getValue() {
+      return value;
+   }
+
    public static Distribution fromValue(String value) {
       return tryFind(values, hasValue(value)).or(UNRECOGNIZED);
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Image.java
----------------------------------------------------------------------
diff --git a/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Image.java b/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Image.java
index f4ac365..1ce92c2 100644
--- a/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Image.java
+++ b/digitalocean/src/main/java/org/jclouds/digitalocean/domain/Image.java
@@ -19,9 +19,14 @@ package org.jclouds.digitalocean.domain;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.beans.ConstructorProperties;
+import java.util.List;
+
+import javax.inject.Named;
 
 import org.jclouds.javax.annotation.Nullable;
 
+import com.google.common.collect.ImmutableList;
+
 /**
  * An Image.
  */
@@ -31,14 +36,21 @@ public class Image {
    private final OperatingSystem os;
    private final boolean publicImage;
    private final String slug;
+   @Named("regions")
+   private final List<Integer> regionIds;
+   @Named("region_slugs")
+   private final List<String> regionSlugs;
 
-   @ConstructorProperties({ "id", "name", "distribution", "public", "slug" })
-   public Image(int id, String name, String distribution, boolean publicImage, @Nullable String slug) {
+   @ConstructorProperties({ "id", "name", "distribution", "public", "slug", "regions", "region_slugs" })
+   public Image(int id, String name, String distribution, boolean publicImage, @Nullable String slug,
+         List<Integer> regionIds, List<String> regionSlugs) {
       this.id = id;
       this.name = checkNotNull(name, "name");
       this.os = OperatingSystem.builder().from(name, checkNotNull(distribution, "distribution")).build();
       this.publicImage = publicImage;
       this.slug = slug;
+      this.regionIds = ImmutableList.copyOf(checkNotNull(regionIds, "regionIds"));
+      this.regionSlugs = ImmutableList.copyOf(checkNotNull(regionSlugs, "regionSlugs"));
    }
 
    public int getId() {
@@ -61,6 +73,14 @@ public class Image {
       return slug;
    }
 
+   public List<Integer> getRegionIds() {
+      return regionIds;
+   }
+
+   public List<String> getRegionSlugs() {
+      return regionSlugs;
+   }
+
    @Override
    public int hashCode() {
       final int prime = 31;
@@ -70,6 +90,8 @@ public class Image {
       result = prime * result + (os == null ? 0 : os.hashCode());
       result = prime * result + (publicImage ? 1231 : 1237);
       result = prime * result + (slug == null ? 0 : slug.hashCode());
+      result = prime * result + (regionIds == null ? 0 : regionIds.hashCode());
+      result = prime * result + (regionSlugs == null ? 0 : regionSlugs.hashCode());
       return result;
    }
 
@@ -112,13 +134,27 @@ public class Image {
       } else if (!slug.equals(other.slug)) {
          return false;
       }
+      if (regionIds == null) {
+         if (other.regionIds != null) {
+            return false;
+         }
+      } else if (!regionIds.equals(other.regionIds)) {
+         return false;
+      }
+      if (regionSlugs == null) {
+         if (other.regionSlugs != null) {
+            return false;
+         }
+      } else if (!regionSlugs.equals(other.regionSlugs)) {
+         return false;
+      }
       return true;
    }
 
    @Override
    public String toString() {
       return "Image [id=" + id + ", name=" + name + ", os=" + os + ", publicImage=" + publicImage + ", slug=" + slug
-            + "]";
+            + ", regionIds=" + regionIds + ", regionSlugs=" + regionSlugs + "]";
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/main/java/org/jclouds/digitalocean/domain/OperatingSystem.java
----------------------------------------------------------------------
diff --git a/digitalocean/src/main/java/org/jclouds/digitalocean/domain/OperatingSystem.java b/digitalocean/src/main/java/org/jclouds/digitalocean/domain/OperatingSystem.java
index f7d5af5..09d6267 100644
--- a/digitalocean/src/main/java/org/jclouds/digitalocean/domain/OperatingSystem.java
+++ b/digitalocean/src/main/java/org/jclouds/digitalocean/domain/OperatingSystem.java
@@ -26,14 +26,13 @@ import java.util.regex.Pattern;
 /**
  * The operating system of an image.
  * <p>
- * This class parses the <code>name</code> string (e.g. "Ubuntu 12.10 x64") of the images and properly sets each field
- * to the right value.
+ * This class parses the <code>name</code> string (e.g. "12.10 x64") of the images and properly sets each field to the
+ * right value.
  */
 public class OperatingSystem {
 
-   // Parse something like "Ubuntu 12.10 x64"
-   private static final Pattern VERSION_PATTERN = compile("\\s(\\d+(?:\\.?\\d+)?)");
-   private static final Pattern ARCH_PATTERN = compile("x\\d{2}");
+   // Parse something like "12.10 x64" or "Ubuntu 12.10.1 x64" and matches the version and architecture
+   private static final Pattern VERSION_PATTERN = compile("(?:[a-zA-Z\\s]*\\s+)?(\\d+(?:\\.?\\d+)*)?(?:\\s*(x\\d{2}))?.*");
    private static final String IS_64_BIT = "x64";
 
    private final Distribution distribution;
@@ -77,13 +76,13 @@ public class OperatingSystem {
       }
 
       public OperatingSystem build() {
-         return new OperatingSystem(distribution, match(VERSION_PATTERN, name, 1), match(ARCH_PATTERN, name, 0));
+         return new OperatingSystem(distribution, match(VERSION_PATTERN, name, 1), match(VERSION_PATTERN, name, 2));
       }
    }
 
    private static String match(final Pattern pattern, final String input, int group) {
       Matcher m = pattern.matcher(input);
-      return m.find() ? nullToEmpty(m.group(group)) : "";
+      return m.matches() ? nullToEmpty(m.group(group)) : "";
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/test/java/org/jclouds/digitalocean/compute/functions/ImageToImageTest.java
----------------------------------------------------------------------
diff --git a/digitalocean/src/test/java/org/jclouds/digitalocean/compute/functions/ImageToImageTest.java b/digitalocean/src/test/java/org/jclouds/digitalocean/compute/functions/ImageToImageTest.java
index 1f92306..0c00b57 100644
--- a/digitalocean/src/test/java/org/jclouds/digitalocean/compute/functions/ImageToImageTest.java
+++ b/digitalocean/src/test/java/org/jclouds/digitalocean/compute/functions/ImageToImageTest.java
@@ -25,6 +25,7 @@ import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.digitalocean.domain.Image;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
 /**
@@ -35,18 +36,23 @@ public class ImageToImageTest {
 
    @Test
    public void testConvertImage() {
-      Image image = new Image(1, "Ubuntu 14.04 x64", "Ubuntu 14.04 x64", true, "ubuntu-1404-x86");
+      Image image = new Image(1, "14.04 x64", "Ubuntu", true, "ubuntu-1404-x86", ImmutableList.<Integer> of(),
+            ImmutableList.<String> of());
       org.jclouds.compute.domain.Image expected = new ImageBuilder()
             .id("ubuntu-1404-x86")
             .providerId("1")
-            .name("Ubuntu 14.04 x64")
+            .name("14.04 x64")
+            .description("Ubuntu 14.04 x64")
             .status(AVAILABLE)
             .operatingSystem(
-                  OperatingSystem.builder().name("Ubuntu 14.04 x64").description("Ubuntu 14.04 x64")
-                        .family(OsFamily.UBUNTU).version("14.04").arch("x64").is64Bit(true).build())
+                  OperatingSystem.builder().name("Ubuntu").description("Ubuntu 14.04 x64").family(OsFamily.UBUNTU)
+                        .version("14.04").arch("x64").is64Bit(true).build())
             .userMetadata(ImmutableMap.of("publicImage", "true")).build();
 
-      ImageToImage function = new ImageToImage();
-      assertEquals(function.apply(image), expected);
+      org.jclouds.compute.domain.Image result = new ImageToImage().apply(image);
+      assertEquals(result, expected);
+      assertEquals(result.getDescription(), expected.getDescription());
+      assertEquals(result.getOperatingSystem(), expected.getOperatingSystem());
+      assertEquals(result.getStatus(), expected.getStatus());
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/test/java/org/jclouds/digitalocean/domain/OperatingSystemTest.java
----------------------------------------------------------------------
diff --git a/digitalocean/src/test/java/org/jclouds/digitalocean/domain/OperatingSystemTest.java b/digitalocean/src/test/java/org/jclouds/digitalocean/domain/OperatingSystemTest.java
index 7ea528d..fcd33ad 100644
--- a/digitalocean/src/test/java/org/jclouds/digitalocean/domain/OperatingSystemTest.java
+++ b/digitalocean/src/test/java/org/jclouds/digitalocean/domain/OperatingSystemTest.java
@@ -29,7 +29,7 @@ import org.testng.annotations.Test;
 public class OperatingSystemTest {
 
    public void testParseStandard64bit() {
-      OperatingSystem os = OperatingSystem.builder().from("Ubuntu 12.10 x64", "Ubuntu").build();
+      OperatingSystem os = OperatingSystem.builder().from("12.10 x64", "Ubuntu").build();
 
       assertEquals(os.getDistribution(), Distribution.UBUNTU);
       assertEquals(os.getVersion(), "12.10");
@@ -37,22 +37,40 @@ public class OperatingSystemTest {
       assertTrue(os.is64bit());
    }
 
+   public void testLongVersionStandard64bit() {
+      OperatingSystem os = OperatingSystem.builder().from("12.10.1 x64", "Ubuntu").build();
+
+      assertEquals(os.getDistribution(), Distribution.UBUNTU);
+      assertEquals(os.getVersion(), "12.10.1");
+      assertEquals(os.getArch(), "x64");
+      assertTrue(os.is64bit());
+   }
+
+   public void testParseStandard64bitWithPrefix() {
+      OperatingSystem os = OperatingSystem.builder().from("Arch Linux 12.10 x64 Desktop", "Arch Linux").build();
+
+      assertEquals(os.getDistribution(), Distribution.ARCHLINUX);
+      assertEquals(os.getVersion(), "12.10");
+      assertEquals(os.getArch(), "x64");
+      assertTrue(os.is64bit());
+   }
+
    public void testParseStandard() {
-      OperatingSystem os = OperatingSystem.builder().from("Ubuntu 12.10 x32", "Ubuntu").build();
+      OperatingSystem os = OperatingSystem.builder().from("12.10 x32", "Ubuntu").build();
 
       assertEquals(os.getDistribution(), Distribution.UBUNTU);
       assertEquals(os.getVersion(), "12.10");
       assertEquals(os.getArch(), "x32");
       assertFalse(os.is64bit());
 
-      os = OperatingSystem.builder().from("CentOS 6.5 x64", "CentOS").build();
+      os = OperatingSystem.builder().from("6.5 x64", "CentOS").build();
 
       assertEquals(os.getDistribution(), Distribution.CENTOS);
       assertEquals(os.getVersion(), "6.5");
       assertEquals(os.getArch(), "x64");
       assertTrue(os.is64bit());
 
-      os = OperatingSystem.builder().from("CentOS 6.5 x64", "Centos").build();
+      os = OperatingSystem.builder().from("6.5 x64", "Centos").build();
 
       assertEquals(os.getDistribution(), Distribution.CENTOS);
       assertEquals(os.getVersion(), "6.5");
@@ -61,7 +79,7 @@ public class OperatingSystemTest {
    }
 
    public void testParseNoArch() {
-      OperatingSystem os = OperatingSystem.builder().from("Ubuntu 12.10", "Ubuntu").build();
+      OperatingSystem os = OperatingSystem.builder().from("12.10", "Ubuntu").build();
 
       assertEquals(os.getDistribution(), Distribution.UBUNTU);
       assertEquals(os.getVersion(), "12.10");
@@ -70,7 +88,7 @@ public class OperatingSystemTest {
    }
 
    public void testParseNoVersion() {
-      OperatingSystem os = OperatingSystem.builder().from("Ubuntu x64", "Ubuntu").build();
+      OperatingSystem os = OperatingSystem.builder().from("x64", "Ubuntu").build();
 
       assertEquals(os.getDistribution(), Distribution.UBUNTU);
       assertEquals(os.getVersion(), "");
@@ -79,7 +97,7 @@ public class OperatingSystemTest {
    }
 
    public void testParseUnknownDistribution() {
-      OperatingSystem os = OperatingSystem.builder().from("Ubuntu 12.04 x64", "Foo").build();
+      OperatingSystem os = OperatingSystem.builder().from("12.04 x64", "Foo").build();
 
       assertEquals(os.getDistribution(), Distribution.UNRECOGNIZED);
       assertEquals(os.getVersion(), "12.04");

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/test/resources/image1.json
----------------------------------------------------------------------
diff --git a/digitalocean/src/test/resources/image1.json b/digitalocean/src/test/resources/image1.json
index 97737d5..780057c 100644
--- a/digitalocean/src/test/resources/image1.json
+++ b/digitalocean/src/test/resources/image1.json
@@ -5,6 +5,8 @@
     "name" : "Arch Linux 2013.05 x32",
     "distribution" : "Arch Linux",
     "public" : true,
-    "slug" : "arch-linux-x32"
+    "slug" : "arch-linux-x32",
+    "regions": [1, 2, 3],
+    "region_slugs": ["nyc1", "ams1", "sfo1"]
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/test/resources/image2.json
----------------------------------------------------------------------
diff --git a/digitalocean/src/test/resources/image2.json b/digitalocean/src/test/resources/image2.json
index 2c5e16a..2d51360 100644
--- a/digitalocean/src/test/resources/image2.json
+++ b/digitalocean/src/test/resources/image2.json
@@ -5,6 +5,8 @@
     "name" : "Fedora 17 x64 Desktop",
     "distribution" : "Fedora",
     "public" : true,
-    "slug" : "fedora-17-x64"
+    "slug" : "fedora-17-x64",
+    "regions": [1, 2, 3],
+    "region_slugs": ["nyc1", "ams1", "sfo1"]
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/test/resources/image3.json
----------------------------------------------------------------------
diff --git a/digitalocean/src/test/resources/image3.json b/digitalocean/src/test/resources/image3.json
index b529db7..9156ba4 100644
--- a/digitalocean/src/test/resources/image3.json
+++ b/digitalocean/src/test/resources/image3.json
@@ -5,6 +5,8 @@
     "name" : "Dokku on Ubuntu 13.04 0.2.0rc3",
     "distribution" : "Ubuntu",
     "public" : true,
-    "slug" : null
+    "slug" : null,
+    "regions": [1, 2, 3],
+    "region_slugs": ["nyc1", "ams1", "sfo1"]
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d56c8721/digitalocean/src/test/resources/images.json
----------------------------------------------------------------------
diff --git a/digitalocean/src/test/resources/images.json b/digitalocean/src/test/resources/images.json
index 0eaef18..b4eb1f5 100644
--- a/digitalocean/src/test/resources/images.json
+++ b/digitalocean/src/test/resources/images.json
@@ -6,21 +6,27 @@
          "name":"CentOS 5.8 x64",
          "slug":"centos-58-x64",
          "distribution":"CentOS",
-         "public":true
+         "public":true,
+         "regions": [1, 2, 3],
+         "region_slugs": ["nyc1", "ams1", "sfo1"]
       },
       {
          "id":1602,
          "name":"CentOS 5.8 x32",
          "slug":"centos-58-x32",
          "distribution":"CentOS",
-         "public":true
+         "public":true,
+         "regions": [1, 2, 3],
+         "region_slugs": ["nyc1", "ams1", "sfo1"]
       },
       {
          "id":12573,
          "name":"Debian 6.0 x64",
          "slug":null,
          "distribution":"Debian",
-         "public":true
+         "public":true,
+         "regions": [1, 2, 3],
+         "region_slugs": ["nyc1", "ams1", "sfo1"]
       }
    ]
 }
\ No newline at end of file