You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by za...@apache.org on 2014/03/04 05:13:29 UTC

git commit: Adds an example on how to use cloud-init with Nova and rackspace

Repository: jclouds-examples
Updated Branches:
  refs/heads/master f42812be3 -> 6f75d5223


Adds an example on how to use cloud-init with Nova and rackspace


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

Branch: refs/heads/master
Commit: 6f75d5223458ecb1251bfcac812d1017e8ce49a6
Parents: f42812b
Author: Zack Shoylev <za...@rackspace.com>
Authored: Fri Feb 28 12:50:20 2014 -0600
Committer: Zack Shoylev <za...@rackspace.com>
Committed: Mon Mar 3 22:12:50 2014 -0600

----------------------------------------------------------------------
 rackspace/pom.xml                               |   5 +
 .../jclouds/examples/rackspace/SmokeTest.java   |   1 +
 .../cloudservers/CreateServerWithUserData.java  | 169 +++++++++++++++++++
 3 files changed, 175 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-examples/blob/6f75d522/rackspace/pom.xml
----------------------------------------------------------------------
diff --git a/rackspace/pom.xml b/rackspace/pom.xml
index 83ce268..8ec73b2 100644
--- a/rackspace/pom.xml
+++ b/rackspace/pom.xml
@@ -125,5 +125,10 @@
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.25</version>
     </dependency>
+    <dependency>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
+    <version>1.9</version>
+</dependency>
   </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/jclouds-examples/blob/6f75d522/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
index 678d7b2..b95e0fa 100644
--- a/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/SmokeTest.java
@@ -57,6 +57,7 @@ public class SmokeTest {
       CloudServersPublish.main(args);
       CreateServer.main(args);
       CreateServerWithKeyPair.main(args);
+      CreateServerWithUserData.main(args);
       ListServersWithFiltering.main(args);
       ServerMetadata.main(args);
       DeleteServer.main(args);

http://git-wip-us.apache.org/repos/asf/jclouds-examples/blob/6f75d522/rackspace/src/main/java/org/jclouds/examples/rackspace/cloudservers/CreateServerWithUserData.java
----------------------------------------------------------------------
diff --git a/rackspace/src/main/java/org/jclouds/examples/rackspace/cloudservers/CreateServerWithUserData.java b/rackspace/src/main/java/org/jclouds/examples/rackspace/cloudservers/CreateServerWithUserData.java
new file mode 100644
index 0000000..db2cf80
--- /dev/null
+++ b/rackspace/src/main/java/org/jclouds/examples/rackspace/cloudservers/CreateServerWithUserData.java
@@ -0,0 +1,169 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.examples.rackspace.cloudservers;
+
+import static org.jclouds.compute.config.ComputeServiceProperties.POLL_INITIAL_PERIOD;
+import static org.jclouds.compute.config.ComputeServiceProperties.POLL_MAX_PERIOD;
+import static org.jclouds.examples.rackspace.cloudservers.Constants.NAME;
+import static org.jclouds.examples.rackspace.cloudservers.Constants.POLL_PERIOD_TWENTY_SECONDS;
+import static org.jclouds.examples.rackspace.cloudservers.Constants.PROVIDER;
+import static org.jclouds.examples.rackspace.cloudservers.Constants.ZONE;
+import static org.jclouds.scriptbuilder.domain.Statements.exec;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.IOException;
+import java.util.Properties;
+import java.util.Set;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.compute.ComputeService;
+import org.jclouds.compute.ComputeServiceContext;
+import org.jclouds.compute.RunNodesException;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.options.RunScriptOptions;
+import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
+import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.NovaAsyncApi;
+import org.jclouds.openstack.nova.v2_0.compute.options.NovaTemplateOptions;
+import org.jclouds.openstack.nova.v2_0.domain.zonescoped.ZoneAndId;
+import org.jclouds.rest.RestContext;
+import org.jclouds.scriptbuilder.ScriptBuilder;
+import org.jclouds.scriptbuilder.domain.OsFamily;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.io.Closeables;
+import com.google.inject.Module;
+
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * This demonstrates how to apply user data and drive config to run cloud-init on the rackspace cloud (or nova-compatible clouds).
+ * The user data is a cloud-init config file, which is base-64 encoded by jclouds.
+ * The drive config needs to be set to true so that the supported images (not all images support cloud-init)
+ * can read the cloud-init config file.
+ * To check cloud-init status, see the /var/log/cloud-init.log logfile.
+ */
+public class CreateServerWithUserData implements Closeable {
+   private final ComputeService computeService;
+   private final RestContext<NovaApi, NovaAsyncApi> novaContext;
+
+   private final File UserDataFile = new File(NAME + ".pem");
+
+   /**
+    * To get a username and API key see
+    * http://jclouds.apache.org/documentation/quickstart/rackspace/
+    *
+    * The first argument (args[0]) must be your username
+    * The second argument (args[1]) must be your API key
+    */
+   public static void main(String[] args) throws IOException {
+      System.out.format("CreateServerWithUserData%n");
+
+      CreateServerWithUserData createServerWithUserData = new CreateServerWithUserData(args[0], args[1]);
+
+      try {
+         createServerWithUserData.createServer();
+      }
+      catch (Exception e) {
+         e.printStackTrace();
+      }
+      finally {
+         createServerWithUserData.close();
+      }
+   }
+
+   public CreateServerWithUserData(String username, String apiKey) {
+
+      // These properties control how often jclouds polls for a status update
+      Properties overrides = new Properties();
+      overrides.setProperty(POLL_INITIAL_PERIOD, POLL_PERIOD_TWENTY_SECONDS);
+      overrides.setProperty(POLL_MAX_PERIOD, POLL_PERIOD_TWENTY_SECONDS);
+      
+      // This module is responsible for enabling logging
+      Iterable<Module> modules = ImmutableSet.<Module> of(new SLF4JLoggingModule());
+      ComputeServiceContext context = ContextBuilder.newBuilder(PROVIDER)
+            .credentials(username, apiKey)
+            .overrides(overrides)
+            .modules(modules)
+            .buildView(ComputeServiceContext.class);
+
+      computeService = context.getComputeService();
+      novaContext = context.unwrap();
+   }
+
+   /**
+    * Create a server with cloud-init.
+    */
+   private NodeMetadata createServer() throws RunNodesException, TimeoutException {
+      System.out.format("  Create Server%n");      
+
+      String userData = 
+            "#cloud-config\r\n" + 
+                  "\r\n" + 
+                  "# boot commands\r\n" + 
+                  "# default: none\r\n" + 
+                  "# this is very similar to runcmd, but commands run very early\r\n" + 
+                  "# in the boot process, only slightly after a 'boothook' would run.\r\n" + 
+                  "# bootcmd should really only be used for things that could not be\r\n" + 
+                  "# done later in the boot process.  bootcmd is very much like\r\n" + 
+                  "# boothook, but possibly with more friendly.\r\n" + 
+                  "#  * bootcmd will run on every boot\r\n" + 
+                  "#  * the INSTANCE_ID variable will be set to the current instance id.\r\n" + 
+                  "#  * you can use 'cloud-init-boot-per' command to help only run once\r\n" + 
+                  "bootcmd:\r\n" + 
+                  " - echo 192.168.1.130 us.archive.ubuntu.com > /etc/hosts\r\n" + 
+                  " - echo 1.1.1.1 something.com > /etc/hosts\r\n" + 
+                  " - [ cloud-init-per, once, mymkfs, mkfs, /dev/vdb ]\r\n" + 
+                  "\r\n" + 
+                  "packages:\r\n" + 
+                  " - httpd\r\n";
+
+      // The data will be base64 encoded.
+      NovaTemplateOptions options = NovaTemplateOptions.Builder.userData(userData.getBytes()).configDrive(true);
+
+      ZoneAndId zoneAndId = ZoneAndId.fromZoneAndId(ZONE, "performance1-1");
+      Template template = computeService.templateBuilder()
+            .locationId(ZONE)
+            .osDescriptionMatches(".*Ubuntu 12.04.*") // Only some images support cloud init!
+            .hardwareId(zoneAndId.slashEncode())
+            .options(options)
+            .build();
+
+      // This method will continue to poll for the server status and won't return until this server is ACTIVE
+      // If you want to know what's happening during the polling, enable logging.
+      // @see https://github.com/jclouds/jclouds-examples/blob/master/rackspace/src/main/java/org/jclouds/examples/rackspace/Logging.java
+      Set<? extends NodeMetadata> nodes = computeService.createNodesInGroup(NAME, 1, template);
+      NodeMetadata node = Iterables.getOnlyElement(nodes);
+
+      System.out.format("    %s%n", node);
+
+      return node;
+   }   
+
+   /**
+    * Always close your service when you're done with it.
+    */
+   public void close() throws IOException {
+      Closeables.close(computeService.getContext(), true);
+   }
+}