You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whirr.apache.org by to...@apache.org on 2010/09/21 23:43:32 UTC

svn commit: r999659 - in /incubator/whirr/trunk: ./ cli/src/main/java/org/apache/whirr/cli/command/ core/ core/src/main/java/org/apache/whirr/service/ core/src/main/resources/ core/src/test/java/org/apache/whirr/service/ services/cassandra/src/main/jav...

Author: tomwhite
Date: Tue Sep 21 21:43:32 2010
New Revision: 999659

URL: http://svn.apache.org/viewvc?rev=999659&view=rev
Log:
WHIRR-90. Scripts should be versioned.

Added:
    incubator/whirr/trunk/core/src/main/resources/
    incubator/whirr/trunk/core/src/main/resources/whirr-default.properties   (with props)
    incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/ClusterSpecTest.java   (with props)
Modified:
    incubator/whirr/trunk/CHANGES.txt
    incubator/whirr/trunk/cli/src/main/java/org/apache/whirr/cli/command/ClusterSpecCommand.java
    incubator/whirr/trunk/core/pom.xml
    incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/ClusterSpec.java
    incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/RunUrlBuilder.java
    incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/RunUrlBuilderTest.java
    incubator/whirr/trunk/services/cassandra/src/main/java/org/apache/whirr/service/cassandra/CassandraService.java
    incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/integration/CassandraServiceTest.java
    incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopService.java
    incubator/whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/integration/HadoopServiceTest.java
    incubator/whirr/trunk/services/zookeeper/src/main/java/org/apache/whirr/service/zookeeper/ZooKeeperService.java
    incubator/whirr/trunk/services/zookeeper/src/test/java/org/apache/whirr/service/zookeeper/integration/ZooKeeperServiceTest.java
    incubator/whirr/trunk/src/site/confluence/configuration-guide.confluence

Modified: incubator/whirr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/CHANGES.txt?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/CHANGES.txt (original)
+++ incubator/whirr/trunk/CHANGES.txt Tue Sep 21 21:43:32 2010
@@ -6,6 +6,8 @@ Trunk (unreleased changes)
 
     WHIRR-89. Support maven 3 builds. (Adrian Cole via tomwhite)
 
+    WHIRR-90. Scripts should be versioned. (tomwhite)
+
   BUG FIXES
 
     WHIRR-93. Fail on checkstyle violation. (tomwhite)

Modified: incubator/whirr/trunk/cli/src/main/java/org/apache/whirr/cli/command/ClusterSpecCommand.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/cli/src/main/java/org/apache/whirr/cli/command/ClusterSpecCommand.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/cli/src/main/java/org/apache/whirr/cli/command/ClusterSpecCommand.java (original)
+++ incubator/whirr/trunk/cli/src/main/java/org/apache/whirr/cli/command/ClusterSpecCommand.java Tue Sep 21 21:43:32 2010
@@ -95,7 +95,7 @@ public abstract class ClusterSpecCommand
             required.getSimpleName()));
       }
     }
-    return ClusterSpec.fromConfiguration(config);
+    return new ClusterSpec(config);
   }
 
 }

Modified: incubator/whirr/trunk/core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/pom.xml?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/core/pom.xml (original)
+++ incubator/whirr/trunk/core/pom.xml Tue Sep 21 21:43:32 2010
@@ -82,4 +82,12 @@
       <artifactId>log4j</artifactId>
     </dependency>
   </dependencies>
+  <build>
+    <resources>
+      <resource>
+        <directory>${project.basedir}/src/main/resources</directory>
+        <filtering>true</filtering>
+      </resource>
+    </resources>
+  </build>
 </project>

Modified: incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/ClusterSpec.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/ClusterSpec.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/ClusterSpec.java (original)
+++ incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/ClusterSpec.java Tue Sep 21 21:43:32 2010
@@ -33,6 +33,7 @@ import java.io.IOException;
 import java.util.List;
 import java.util.Set;
 
+import org.apache.commons.configuration.CompositeConfiguration;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.PropertiesConfiguration;
@@ -53,7 +54,8 @@ public class ClusterSpec {
     CLUSTER_NAME(String.class, false),
     PUBLIC_KEY_FILE(String.class, false),
     PRIVATE_KEY_FILE(String.class, false),
-    CLIENT_CIDRS(String.class, true);
+    CLIENT_CIDRS(String.class, true),
+    RUN_URL_BASE(String.class, false);
     
     private Class<?> type;
     private boolean multipleArguments;
@@ -134,8 +136,10 @@ public class ClusterSpec {
       return templates;
     }
   }
+
+  private static final String DEFAULT_PROPERTIES = "whirr-default.properties";
   
-  private List<InstanceTemplate> instanceTemplates = Lists.newArrayList();
+  private List<InstanceTemplate> instanceTemplates;
   private String serviceName;
   private String provider;
   private String identity;
@@ -143,41 +147,48 @@ public class ClusterSpec {
   private String clusterName;
   private Payload privateKey;
   private Payload publicKey;
-  private List<String> clientCidrs = Lists.newArrayList();
-  private Configuration config = new PropertiesConfiguration();
+  private List<String> clientCidrs;
+  private String runUrlBase;
+  
+  private Configuration config;
+  
+  public ClusterSpec() throws ConfigurationException {
+    this(new PropertiesConfiguration());
+  }
   
   /**
    * 
    * @throws ConfigurationException if the public or private key cannot be read.
    */
-  public static ClusterSpec fromConfiguration(Configuration config)
-  throws ConfigurationException {
-    ClusterSpec spec = new ClusterSpec();
-    spec.setServiceName(config.getString(Property.SERVICE_NAME.getConfigName()));
-    spec.setInstanceTemplates(InstanceTemplate.parse(
-        config.getStringArray(Property.INSTANCE_TEMPLATES.getConfigName())));
-    spec.setProvider(config.getString(Property.PROVIDER.getConfigName()));
-    spec.setIdentity(checkNotNull(
-        config.getString(Property.IDENTITY.getConfigName()), Property.IDENTITY));
-    spec.setCredential(config.getString(Property.CREDENTIAL.getConfigName()));
-    spec.setClusterName(config.getString(Property.CLUSTER_NAME.getConfigName()));
+  public ClusterSpec(Configuration config)
+      throws ConfigurationException {
+    CompositeConfiguration c = new CompositeConfiguration();
+    c.addConfiguration(config);
+    c.addConfiguration(new PropertiesConfiguration(DEFAULT_PROPERTIES));
+    setServiceName(c.getString(Property.SERVICE_NAME.getConfigName()));
+    setInstanceTemplates(InstanceTemplate.parse(
+        c.getStringArray(Property.INSTANCE_TEMPLATES.getConfigName())));
+    setProvider(c.getString(Property.PROVIDER.getConfigName()));
+    setIdentity(c.getString(Property.IDENTITY.getConfigName()));
+    setCredential(c.getString(Property.CREDENTIAL.getConfigName()));
+    setClusterName(c.getString(Property.CLUSTER_NAME.getConfigName()));
     try {
-      String privateKeyPath = config.getString(
+      String privateKeyPath = c.getString(
           Property.PRIVATE_KEY_FILE.getConfigName());
       if (privateKeyPath != null)
-        spec.setPrivateKey(new File(privateKeyPath));
-      String publicKeyPath = config.getString(Property.PUBLIC_KEY_FILE.
+        setPrivateKey(new File(privateKeyPath));
+      String publicKeyPath = c.getString(Property.PUBLIC_KEY_FILE.
                getConfigName());
       publicKeyPath = publicKeyPath == null && privateKeyPath != null ?
                 privateKeyPath + ".pub" : publicKeyPath;
       if (publicKeyPath != null)
-        spec.setPublicKey(new File(publicKeyPath));
+        setPublicKey(new File(publicKeyPath));
     } catch (IOException e) {
       throw new ConfigurationException("error reading key from file", e);
     }
-    spec.setClientCidrs(config.getList(Property.CLIENT_CIDRS.getConfigName()));
-    spec.config = config;
-    return spec;
+    setClientCidrs(c.getList(Property.CLIENT_CIDRS.getConfigName()));
+    setRunUrlBase(c.getString(Property.RUN_URL_BASE.getConfigName()));
+    this.config = c;
   }
 
   public List<InstanceTemplate> getInstanceTemplates() {
@@ -236,6 +247,10 @@ public class ClusterSpec {
     return clientCidrs;
   }
   
+  public String getRunUrlBase() {
+    return runUrlBase;
+  }
+  
   public void setInstanceTemplates(List<InstanceTemplate> instanceTemplates) {
     this.instanceTemplates = instanceTemplates;
   }
@@ -310,6 +325,10 @@ public class ClusterSpec {
     this.clientCidrs = clientCidrs;
   }
 
+  public void setRunUrlBase(String runUrlBase) {
+    this.runUrlBase = runUrlBase;
+  }
+  
   //
   
   public Configuration getConfiguration() {
@@ -325,7 +344,9 @@ public class ClusterSpec {
         && Objects.equal(identity, that.identity)
         && Objects.equal(credential, that.credential)
         && Objects.equal(clusterName, that.clusterName)
-        && Objects.equal(clientCidrs, that.clientCidrs);
+        && Objects.equal(clientCidrs, that.clientCidrs)
+        && Objects.equal(runUrlBase, that.runUrlBase)
+        ;
     }
     return false;
   }
@@ -333,7 +354,7 @@ public class ClusterSpec {
   public int hashCode() {
     return Objects.hashCode(instanceTemplates, serviceName,
         provider, identity, credential, clusterName, publicKey,
-        privateKey, clientCidrs);
+        privateKey, clientCidrs, runUrlBase);
   }
   
   public String toString() {
@@ -347,6 +368,7 @@ public class ClusterSpec {
       .add("publicKey", publicKey)
       .add("privateKey", privateKey)
       .add("clientCidrs", clientCidrs)
+      .add("runUrlBase", runUrlBase)
       .toString();
   }
   

Modified: incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/RunUrlBuilder.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/RunUrlBuilder.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/RunUrlBuilder.java (original)
+++ incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/RunUrlBuilder.java Tue Sep 21 21:43:32 2010
@@ -18,35 +18,35 @@
 
 package org.apache.whirr.service;
 
+import static org.jclouds.scriptbuilder.domain.Statements.exec;
+
 import java.net.MalformedURLException;
 import java.net.URL;
 
-import static org.jclouds.scriptbuilder.domain.Statements.exec;
-
 import org.jclouds.scriptbuilder.ScriptBuilder;
+import org.jclouds.scriptbuilder.domain.OsFamily;
 
 /**
  * A convenience class for building scripts to run on nodes.
  */
 public class RunUrlBuilder {
 
-  // Need to be able to specify base URL
-  // Perhaps make these scripts parameterizable?
-  // e.g. just java/install then base url is .../openjdk or .../sun or
-  // .../apache or .../cloudera
-  public static byte[] runUrls(String... urls) throws MalformedURLException {
+  /**
+   * 
+   * @param runUrlBase The base URL to construct URLs from.
+   * @param urls The (possibly relative) URLs to build the runurls from.
+   * @return
+   * @throws MalformedURLException
+   */
+  public static byte[] runUrls(String runUrlBase, String... urls) throws MalformedURLException {
     ScriptBuilder scriptBuilder = new ScriptBuilder().addStatement(
       exec("wget -qO/usr/bin/runurl run.alestic.com/runurl")).addStatement(
       exec("chmod 755 /usr/bin/runurl"));
-
-    // Note that the runurl scripts should be checked in to whirr/scripts/
-    String runUrlBase = System.getProperty("whirr.runurl.base", "http://whirr.s3.amazonaws.com/");
     for (String url : urls) {
-      scriptBuilder.addStatement(exec("runurl " + new URL(new URL(runUrlBase), url)));
+      String runUrl = new URL(new URL(runUrlBase), url).toExternalForm();
+      scriptBuilder.addStatement(exec("runurl " + runUrl));
     }
-
-    return scriptBuilder.build(org.jclouds.scriptbuilder.domain.OsFamily.UNIX)
-      .getBytes();
+    return scriptBuilder.build(OsFamily.UNIX).getBytes();
   }
 
 }

Added: incubator/whirr/trunk/core/src/main/resources/whirr-default.properties
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/src/main/resources/whirr-default.properties?rev=999659&view=auto
==============================================================================
--- incubator/whirr/trunk/core/src/main/resources/whirr-default.properties (added)
+++ incubator/whirr/trunk/core/src/main/resources/whirr-default.properties Tue Sep 21 21:43:32 2010
@@ -0,0 +1,3 @@
+whirr.private-key-file=${sys:user.home}/.ssh/id_rsa
+whirr.public-key-file=${sys:user.home}/.ssh/id_rsa.pub
+whirr.run-url-base=http://whirr.s3.amazonaws.com/${version}/
\ No newline at end of file

Propchange: incubator/whirr/trunk/core/src/main/resources/whirr-default.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/ClusterSpecTest.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/ClusterSpecTest.java?rev=999659&view=auto
==============================================================================
--- incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/ClusterSpecTest.java (added)
+++ incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/ClusterSpecTest.java Tue Sep 21 21:43:32 2010
@@ -0,0 +1,30 @@
+package org.apache.whirr.service;
+
+import static org.hamcrest.Matchers.startsWith;
+import static org.junit.Assert.assertThat;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.PropertiesConfiguration;
+import org.junit.Test;
+
+public class ClusterSpecTest {
+  
+  @Test
+  public void testDefaultsAreSet() throws ConfigurationException {
+    ClusterSpec spec = new ClusterSpec();
+    assertThat(spec.getRunUrlBase(),
+        startsWith("http://whirr.s3.amazonaws.com/"));
+  }
+
+  @Test
+  public void testDefaultsCanBeOverridden() throws ConfigurationException {
+    Configuration conf = new PropertiesConfiguration();
+    conf.setProperty(ClusterSpec.Property.RUN_URL_BASE.getConfigName(),
+        "http://example.org");
+    ClusterSpec spec = new ClusterSpec(conf);
+    assertThat(spec.getRunUrlBase(),
+        startsWith("http://example.org"));
+  }
+
+}

Propchange: incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/ClusterSpecTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/RunUrlBuilderTest.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/RunUrlBuilderTest.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/RunUrlBuilderTest.java (original)
+++ incubator/whirr/trunk/core/src/test/java/org/apache/whirr/service/RunUrlBuilderTest.java Tue Sep 21 21:43:32 2010
@@ -28,53 +28,33 @@ import org.junit.Test;
 
 public class RunUrlBuilderTest {
 
-  private static final String WHIRR_RUNURL_BASE = "whirr.runurl.base";
-
   @Test
   public void testOnePath() throws MalformedURLException {
-    assertThat(runUrls("/a/b"),
-        containsString("runurl http://whirr.s3.amazonaws.com/a/b"));
+    assertThat(runUrls("http://example.org/", "a/b"),
+        containsString("runurl http://example.org/a/b"));
   }
   
-  @SuppressWarnings("unchecked")
   @Test
-  public void testTwoPaths() throws MalformedURLException {
-    assertThat(runUrls("/a/b", "/c/d"), allOf(
-        containsString("runurl http://whirr.s3.amazonaws.com/a/b"),
-        containsString("runurl http://whirr.s3.amazonaws.com/c/d")));
-  }
-
-  @Test
-  public void testAbsolutePath() throws MalformedURLException {
-    assertThat(runUrls("http://example.org/a/b"),
+  public void testOnePathNoSlash() throws MalformedURLException {
+    assertThat(runUrls("http://example.org", "a/b"),
         containsString("runurl http://example.org/a/b"));
   }
   
+  @SuppressWarnings("unchecked")
   @Test
-  public void testSystemOverrideOfRunUrlBaseNoSlash() throws MalformedURLException {
-    String prev = System.setProperty(WHIRR_RUNURL_BASE, "http://example.org");
-    assertThat(runUrls("/a/b"),
-        containsString("runurl http://example.org/a/b"));
-    if (prev == null) {
-      System.clearProperty(WHIRR_RUNURL_BASE);
-    } else {
-      System.setProperty(WHIRR_RUNURL_BASE, prev);
-    }
+  public void testTwoPaths() throws MalformedURLException {
+    assertThat(runUrls("http://example.org/", "a/b", "c/d"), allOf(
+        containsString("runurl http://example.org/a/b"),
+        containsString("runurl http://example.org/c/d")));
   }
-  
+
   @Test
-  public void testSystemOverrideOfRunUrlBaseWithSlash() throws MalformedURLException {
-    String prev = System.setProperty(WHIRR_RUNURL_BASE, "http://example.org/");
-    assertThat(runUrls("/a/b"),
-        containsString("runurl http://example.org/a/b"));
-    if (prev == null) {
-      System.clearProperty(WHIRR_RUNURL_BASE);
-    } else {
-      System.setProperty(WHIRR_RUNURL_BASE, prev);
-    }
+  public void testAbsolutePath() throws MalformedURLException {
+    assertThat(runUrls("http://example.org/", "http://example2.org/a/b"),
+        containsString("runurl http://example2.org/a/b"));
   }
-  
-  private String runUrls(String... urls) throws MalformedURLException {
-    return new String(RunUrlBuilder.runUrls(urls));
+
+  private String runUrls(String runUrlBase, String... urls) throws MalformedURLException {
+    return new String(RunUrlBuilder.runUrls(runUrlBase, urls));
   }
 }

Modified: incubator/whirr/trunk/services/cassandra/src/main/java/org/apache/whirr/service/cassandra/CassandraService.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/cassandra/src/main/java/org/apache/whirr/service/cassandra/CassandraService.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/services/cassandra/src/main/java/org/apache/whirr/service/cassandra/CassandraService.java (original)
+++ incubator/whirr/trunk/services/cassandra/src/main/java/org/apache/whirr/service/cassandra/CassandraService.java Tue Sep 21 21:43:32 2010
@@ -73,7 +73,8 @@ public class CassandraService extends Se
         ComputeServiceContextBuilder.build(clusterSpec);
     ComputeService computeService = computeServiceContext.getComputeService();
 
-    byte[] bootScript = RunUrlBuilder.runUrls("sun/java/install",
+    byte[] bootScript = RunUrlBuilder.runUrls(clusterSpec.getRunUrlBase(),
+        "sun/java/install",
         "apache/cassandra/install");
 
     TemplateBuilder templateBuilder = computeService.templateBuilder()
@@ -110,7 +111,8 @@ public class CassandraService extends Se
     // Pass list of all servers in cluster to configure script.
     String servers = Joiner.on(' ').join(getPrivateIps(seeds));
     byte[] configureScript = RunUrlBuilder
-        .runUrls("apache/cassandra/post-configure " + servers);
+        .runUrls(clusterSpec.getRunUrlBase(),
+            "apache/cassandra/post-configure " + servers);
 
     try {
       Map<? extends NodeMetadata, ExecResponse> responses = computeService

Modified: incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/integration/CassandraServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/integration/CassandraServiceTest.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/integration/CassandraServiceTest.java (original)
+++ incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/integration/CassandraServiceTest.java Tue Sep 21 21:43:32 2010
@@ -60,7 +60,7 @@ public class CassandraServiceTest {
       config.addConfiguration(new PropertiesConfiguration(System.getProperty("config")));
     }
     config.addConfiguration(new PropertiesConfiguration("whirr-cassandra-test.properties"));
-    clusterSpec = ClusterSpec.fromConfiguration(config);
+    clusterSpec = new ClusterSpec(config);
     Service s = new ServiceFactory().create(clusterSpec.getServiceName());
     assertThat(s, instanceOf(CassandraService.class));
     service = (CassandraService) s;

Modified: incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopService.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopService.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopService.java (original)
+++ incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopService.java Tue Sep 21 21:43:32 2010
@@ -80,7 +80,7 @@ public class HadoopService extends Servi
     // deal with user packages and autoshutdown with extra runurls
     String hadoopInstallRunUrl = clusterSpec.getConfiguration().getString(
         "whirr.hadoop-install-runurl", "apache/hadoop/install");
-    byte[] nnjtBootScript = RunUrlBuilder.runUrls(
+    byte[] nnjtBootScript = RunUrlBuilder.runUrls(clusterSpec.getRunUrlBase(),
       "sun/java/install",
       String.format("%s nn,jt -c %s", hadoopInstallRunUrl,
           clusterSpec.getProvider()));
@@ -132,7 +132,7 @@ public class HadoopService extends Servi
     }
 
     // Launch slaves (DN and TT)
-    byte[] slaveBootScript = RunUrlBuilder.runUrls(
+    byte[] slaveBootScript = RunUrlBuilder.runUrls(clusterSpec.getRunUrlBase(),
       "sun/java/install",
       String.format("%s dn,tt -n %s -j %s",
           hadoopInstallRunUrl,

Modified: incubator/whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/integration/HadoopServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/integration/HadoopServiceTest.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/integration/HadoopServiceTest.java (original)
+++ incubator/whirr/trunk/services/hadoop/src/test/java/org/apache/whirr/service/hadoop/integration/HadoopServiceTest.java Tue Sep 21 21:43:32 2010
@@ -71,7 +71,7 @@ public class HadoopServiceTest {
       config.addConfiguration(new PropertiesConfiguration(System.getProperty("config")));
     }
     config.addConfiguration(new PropertiesConfiguration("whirr-hadoop-test.properties"));
-    clusterSpec = ClusterSpec.fromConfiguration(config);
+    clusterSpec = new ClusterSpec(config);
     Service s = new ServiceFactory().create(clusterSpec.getServiceName());
     assertThat(s, instanceOf(HadoopService.class));
     service = (HadoopService) s;

Modified: incubator/whirr/trunk/services/zookeeper/src/main/java/org/apache/whirr/service/zookeeper/ZooKeeperService.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/zookeeper/src/main/java/org/apache/whirr/service/zookeeper/ZooKeeperService.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/services/zookeeper/src/main/java/org/apache/whirr/service/zookeeper/ZooKeeperService.java (original)
+++ incubator/whirr/trunk/services/zookeeper/src/main/java/org/apache/whirr/service/zookeeper/ZooKeeperService.java Tue Sep 21 21:43:32 2010
@@ -70,7 +70,7 @@ public class ZooKeeperService extends Se
       ComputeServiceContextBuilder.build(clusterSpec);
     ComputeService computeService = computeServiceContext.getComputeService();
 
-    byte[] bootScript = RunUrlBuilder.runUrls(
+    byte[] bootScript = RunUrlBuilder.runUrls(clusterSpec.getRunUrlBase(),
       "sun/java/install",
       "apache/zookeeper/install");
     
@@ -107,7 +107,7 @@ public class ZooKeeperService extends Se
     // Pass list of all servers in ensemble to configure script.
     // Position is significant: i-th server has id i.
     String servers = Joiner.on(' ').join(getPrivateIps(nodes));
-    byte[] configureScript = RunUrlBuilder.runUrls(
+    byte[] configureScript = RunUrlBuilder.runUrls(clusterSpec.getRunUrlBase(),
       "apache/zookeeper/post-configure " + servers);
     try {
       computeService.runScriptOnNodesMatching(runningWithTag(clusterSpec.getClusterName()), configureScript);

Modified: incubator/whirr/trunk/services/zookeeper/src/test/java/org/apache/whirr/service/zookeeper/integration/ZooKeeperServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/zookeeper/src/test/java/org/apache/whirr/service/zookeeper/integration/ZooKeeperServiceTest.java?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/services/zookeeper/src/test/java/org/apache/whirr/service/zookeeper/integration/ZooKeeperServiceTest.java (original)
+++ incubator/whirr/trunk/services/zookeeper/src/test/java/org/apache/whirr/service/zookeeper/integration/ZooKeeperServiceTest.java Tue Sep 21 21:43:32 2010
@@ -56,7 +56,7 @@ public class ZooKeeperServiceTest {
       config.addConfiguration(new PropertiesConfiguration(System.getProperty("config")));
     }
     config.addConfiguration(new PropertiesConfiguration("whirr-zookeeper-test.properties"));
-    clusterSpec = ClusterSpec.fromConfiguration(config);
+    clusterSpec = new ClusterSpec(config);
     Service s = new ServiceFactory().create(clusterSpec.getServiceName());
     assertThat(s, instanceOf(ZooKeeperService.class));
     service = (ZooKeeperService) s;

Modified: incubator/whirr/trunk/src/site/confluence/configuration-guide.confluence
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/src/site/confluence/configuration-guide.confluence?rev=999659&r1=999658&r2=999659&view=diff
==============================================================================
--- incubator/whirr/trunk/src/site/confluence/configuration-guide.confluence (original)
+++ incubator/whirr/trunk/src/site/confluence/configuration-guide.confluence Tue Sep 21 21:43:32 2010
@@ -12,6 +12,7 @@ Whirr is configured using a properties f
 | {{credential}} | {{\--credential}} | none | The cloud credential. See the table below for how this maps to the credentials for your provider. |
 | {{secret-key-file}} | {{\--secret-key-file}} | _\~/.ssh/id\_rsa_ | The filename of the private key used to connect to instances. |
 | {{client-cidrs}} | {{\--client-cidrs}} | none | A comma-separated list of [CIDR |http://en.wikipedia.org/wiki/Classless\_Inter-Domain\_Routing] blocks. E.g. {{208.128.0.0/11,108.128.0.0/11}} |
+| {{run-url-base}} | {{\--run-url-base}} | {{http://whirr.s3.amazonaws.com/VERSION/}} | The base URL for forming run urls from. Change this to host your own set of launch scripts. |
 
 h2. Cloud provider specific configuration
 
@@ -35,6 +36,7 @@ h2. Comparison
 | none | {{credential}} | Specified using environment variables for Python. E.g. {{AWS\_ACCESS\_KEY\_ID}}, {{RACKSPACE\_SECRET}} |
 | {{private-key-file}} | {{private-key-file}} | |
 | {{client-cidr}} | {{client-cidrs}} | Python {{client-cidr}} option may be repeated multiple times, whereas Java {{client-cidrs}} contains comma-separated CIDRs. |
+| none | {{run-url-base}} | Specified using {{user-data-file}} in Python. |
 | {{public-key}} | none | Based on secret key in Java (add {{.pub}}). |
 | {{image-id}} | none | Need to add to Java. Along with more flexible image matching (pattern, OS, arch). See jclouds TemplateBuilder. |
 | {{instance-type}} | none | Ditto. |