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/08/12 01:59:03 UTC

svn commit: r984618 - in /incubator/whirr/trunk: ./ core/ core/src/main/java/org/apache/whirr/service/ core/src/main/java/org/jclouds/aws/ec2/compute/functions/ core/src/test/resources/ scripts/sun/java/ services/cassandra/ services/cassandra/src/main/...

Author: tomwhite
Date: Wed Aug 11 23:59:02 2010
New Revision: 984618

URL: http://svn.apache.org/viewvc?rev=984618&view=rev
Log:
WHIRR-23. Upgrade to jclouds 1.0-beta-6. Contributed by Adrian Cole.

Added:
    incubator/whirr/trunk/core/src/test/resources/log4j.xml   (with props)
    incubator/whirr/trunk/services/cassandra/src/test/resources/
    incubator/whirr/trunk/services/cassandra/src/test/resources/log4j.xml   (with props)
    incubator/whirr/trunk/services/hadoop/src/test/resources/
    incubator/whirr/trunk/services/hadoop/src/test/resources/log4j.xml   (with props)
    incubator/whirr/trunk/services/zookeeper/src/test/resources/
    incubator/whirr/trunk/services/zookeeper/src/test/resources/log4j.xml   (with props)
Modified:
    incubator/whirr/trunk/CHANGES.txt
    incubator/whirr/trunk/core/pom.xml
    incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Cluster.java
    incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Service.java
    incubator/whirr/trunk/core/src/main/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadata.java
    incubator/whirr/trunk/scripts/sun/java/install
    incubator/whirr/trunk/services/cassandra/pom.xml
    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/CassandraServiceTest.java
    incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/integration/CassandraServiceTest.java
    incubator/whirr/trunk/services/hadoop/pom.xml
    incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopProxy.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/pom.xml
    incubator/whirr/trunk/services/zookeeper/src/main/java/org/apache/whirr/service/zookeeper/ZooKeeperService.java

Modified: incubator/whirr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/CHANGES.txt?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/CHANGES.txt (original)
+++ incubator/whirr/trunk/CHANGES.txt Wed Aug 11 23:59:02 2010
@@ -37,6 +37,8 @@ Trunk (unreleased changes)
 
     WHIRR-53. Adopt the standard Java SPI interface. (tomwhite)
 
+    WHIRR-23. Upgrade to jclouds 1.0-beta-6. (Adrian Cole via tomwhite)
+
   BUG FIXES
 
     WHIRR-50. Cassandra POM should depend on top-level. (tomwhite)

Modified: incubator/whirr/trunk/core/pom.xml
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/pom.xml?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/core/pom.xml (original)
+++ incubator/whirr/trunk/core/pom.xml Wed Aug 11 23:59:02 2010
@@ -32,27 +32,27 @@
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-aws</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-compute</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-enterprise</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-jsch</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-log4j</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>

Modified: incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Cluster.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Cluster.java?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Cluster.java (original)
+++ incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Cluster.java Wed Aug 11 23:59:02 2010
@@ -17,12 +17,14 @@
  */
 
 package org.apache.whirr.service;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.net.InetAddress;
 import java.util.Properties;
 import java.util.Set;
 
 import org.apache.whirr.service.ClusterSpec.InstanceTemplate;
+import org.jclouds.domain.Credentials;
 
 /**
  * This class represents a real cluster of {@link Instances}.
@@ -36,17 +38,23 @@ public class Cluster {
    * @see InstanceTemplate
    */
   public static class Instance {
-    private Set<String> roles;
-    private InetAddress publicAddress;
-    private InetAddress privateAddress;
+    private final Credentials loginCredentials;
+    private final Set<String> roles;
+    private final InetAddress publicAddress;
+    private final InetAddress privateAddress;
 
-    public Instance(Set<String> roles, InetAddress publicAddress,
+    public Instance(Credentials loginCredentials, Set<String> roles, InetAddress publicAddress,
         InetAddress privateAddress) {
-      this.roles = roles;
-      this.publicAddress = publicAddress;
-      this.privateAddress = privateAddress;
+      this.loginCredentials = checkNotNull(loginCredentials, "loginCredentials");
+      this.roles = checkNotNull(roles, "roles");
+      this.publicAddress = checkNotNull(publicAddress, "publicAddress");
+      this.privateAddress = checkNotNull(privateAddress, "privateAddress");
     }
 
+    public Credentials getLoginCredentials() {
+      return loginCredentials;
+    }
+    
     public Set<String> getRoles() {
       return roles;
     }

Modified: incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Service.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Service.java?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Service.java (original)
+++ incubator/whirr/trunk/core/src/main/java/org/apache/whirr/service/Service.java Wed Aug 11 23:59:02 2010
@@ -18,6 +18,8 @@
 
 package org.apache.whirr.service;
 
+import static org.jclouds.compute.predicates.NodePredicates.withTag;
+
 import java.io.IOException;
 
 import org.jclouds.compute.ComputeService;
@@ -54,7 +56,7 @@ public abstract class Service {
    */
   public void destroyCluster(ServiceSpec serviceSpec) throws IOException {
     ComputeService computeService = ComputeServiceBuilder.build(serviceSpec);
-    computeService.destroyNodesWithTag(serviceSpec.getClusterName());
+    computeService.destroyNodesMatching(withTag(serviceSpec.getClusterName()));
   }
 
 }

Modified: incubator/whirr/trunk/core/src/main/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadata.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/src/main/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadata.java?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/core/src/main/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadata.java (original)
+++ incubator/whirr/trunk/core/src/main/java/org/jclouds/aws/ec2/compute/functions/RunningInstanceToNodeMetadata.java Wed Aug 11 23:59:02 2010
@@ -21,18 +21,19 @@ package org.jclouds.aws.ec2.compute.func
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.jclouds.util.Utils.nullSafeSet;
 
-import java.net.InetAddress;
 import java.net.URI;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
 
 import javax.annotation.Resource;
 import javax.inject.Inject;
 import javax.inject.Named;
+import javax.inject.Provider;
 import javax.inject.Singleton;
 
-import org.jclouds.aws.ec2.compute.domain.RegionTag;
+import org.jclouds.aws.ec2.compute.domain.RegionAndName;
 import org.jclouds.aws.ec2.domain.InstanceState;
 import org.jclouds.aws.ec2.domain.KeyPair;
 import org.jclouds.aws.ec2.domain.RunningInstance;
@@ -63,21 +64,53 @@ public class RunningInstanceToNodeMetada
    @Resource
    protected Logger logger = Logger.NULL;
 
-   private static class FindImageForInstance implements Predicate<Image> {
+   @VisibleForTesting
+   static class FindImageForInstance implements Predicate<Image> {
       private final Location location;
       private final RunningInstance instance;
 
-      private FindImageForInstance(Location location, RunningInstance instance) {
-         this.location = location;
-         this.instance = instance;
+      FindImageForInstance(Location location, RunningInstance instance) {
+         this.location = checkNotNull(location, "location");
+         this.instance = checkNotNull(instance, "instance");
       }
 
       @Override
       public boolean apply(Image input) {
-         return input.getId().equals(instance.getImageId())
+         return input.getProviderId().equals(instance.getImageId())
                   && (input.getLocation() == null || input.getLocation().equals(location) || input
                            .getLocation().equals(location.getParent()));
       }
+
+      @Override
+      public int hashCode() {
+         final int prime = 31;
+         int result = 1;
+         result = prime * result + ((instance.getId() == null) ? 0 : instance.getId().hashCode());
+         result = prime * result + ((location.getId() == null) ? 0 : location.getId().hashCode());
+         return result;
+      }
+
+      @Override
+      public boolean equals(Object obj) {
+         if (this == obj)
+            return true;
+         if (obj == null)
+            return false;
+         if (getClass() != obj.getClass())
+            return false;
+         FindImageForInstance other = (FindImageForInstance) obj;
+         if (instance.getId() == null) {
+            if (other.instance.getId() != null)
+               return false;
+         } else if (!instance.getId().equals(other.instance.getId()))
+            return false;
+         if (location.getId() == null) {
+            if (other.location.getId() != null)
+               return false;
+         } else if (!location.getId().equals(other.location.getId()))
+            return false;
+         return true;
+      }
    }
 
    private static final Map<InstanceState, NodeState> instanceToNodeState = ImmutableMap
@@ -88,18 +121,20 @@ public class RunningInstanceToNodeMetada
                      InstanceState.STOPPED, NodeState.SUSPENDED).build();
 
    private final AMIClient amiClient;
-   private final Map<RegionTag, KeyPair> credentialsMap;
+   private final Map<RegionAndName, KeyPair> credentialsMap;
    private final PopulateDefaultLoginCredentialsForImageStrategy credentialProvider;
-   private final Set<? extends Image> images;
+   private final Provider<Set<? extends Image>> images;
    private final Set<? extends Location> locations;
    private final Function<RunningInstance, Map<String, String>> instanceToStorageMapping;
+   private final ConcurrentMap<RegionAndName, Image> imageMap;
 
    @Inject
    RunningInstanceToNodeMetadata(
             AMIClient amiClient,
-            Map<RegionTag, KeyPair> credentialsMap,
+            Map<RegionAndName, KeyPair> credentialsMap,
             PopulateDefaultLoginCredentialsForImageStrategy credentialProvider,
-            Set<? extends Image> images,
+            Provider<Set<? extends Image>> images, // to facilitate on-demand refresh of image list
+            ConcurrentMap<RegionAndName, Image> imageMap,
             Set<? extends Location> locations,
             @Named("volumeMapping") Function<RunningInstance, Map<String, String>> instanceToStorageMapping) {
       this.amiClient = checkNotNull(amiClient, "amiClient");
@@ -107,36 +142,77 @@ public class RunningInstanceToNodeMetada
       this.credentialProvider = checkNotNull(credentialProvider, "credentialProvider");
       this.images = checkNotNull(images, "images");
       this.locations = checkNotNull(locations, "locations");
-      this.instanceToStorageMapping = checkNotNull(instanceToStorageMapping);
+      this.instanceToStorageMapping = checkNotNull(instanceToStorageMapping,
+               "instanceToStorageMapping");
+      this.imageMap = checkNotNull(imageMap, "imageMap");
    }
 
    @Override
    public NodeMetadata apply(final RunningInstance instance) {
       String id = checkNotNull(instance, "instance").getId();
+
       String name = null; // user doesn't determine a node name;
       URI uri = null; // no uri to get rest access to host info
 
+      String tag = getTagForInstace(instance);
+
+      Credentials credentials = getCredentialsForInstanceWithTag(instance, tag);
+
+      Map<String, String> userMetadata = ImmutableMap.<String, String> of();
+
+      NodeState state = instanceToNodeState.get(instance.getInstanceState());
+
+      Set<String> publicAddresses = nullSafeSet(instance.getIpAddress());
+      Set<String> privateAddresses = nullSafeSet(instance.getPrivateIpAddress());
+
+      Map<String, String> extra = getExtra(instance);
+
+      Location location = getLocationForAvailabilityZone(instance);
+
+      Image image = resolveImageForInstanceInLocation(instance, location);
+
+      return new NodeMetadataImpl(id, name, instance.getRegion() + "/" + instance.getId(),
+               location, uri, userMetadata, tag, image, state, publicAddresses, privateAddresses,
+               extra, credentials);
+   }
+
+   private Credentials getCredentialsForInstanceWithTag(final RunningInstance instance, String tag) {
       Credentials credentials = null;// default if no keypair exists
-      String tag = String.format("NOTAG-%s", instance.getId());// default if no keypair exists
 
       if (instance.getKeyName() != null) {
-         tag = instance.getKeyName().replaceAll("-[0-9]+", "");
          credentials = new Credentials(getLoginAccountFor(instance), getPrivateKeyOrNull(instance,
                   tag));
       }
+      return credentials;
+   }
 
-      Map<String, String> userMetadata = ImmutableMap.<String, String> of();
+   private String getTagForInstace(final RunningInstance instance) {
+      String tag = String.format("NOTAG-%s", instance.getId());// default
+      try {
+         tag = Iterables.getOnlyElement(
+                  Iterables.filter(instance.getGroupIds(), new Predicate<String>() {
 
-      NodeState state = instanceToNodeState.get(instance.getInstanceState());
+                     @Override
+                     public boolean apply(String input) {
+                        return input.startsWith("jclouds#");
+                     }
 
-      Set<InetAddress> publicAddresses = nullSafeSet(instance.getIpAddress());
-      Set<InetAddress> privateAddresses = nullSafeSet(instance.getPrivateIpAddress());
+                  })).substring(8);
+      } catch (NoSuchElementException e) {
+         logger
+                  .warn("no tag parsed from %s's groups: %s", instance.getId(), instance
+                           .getGroupIds());
+      } catch (IllegalArgumentException e) {
+         logger.warn("too many groups match %s; %s's groups: %s", "jclouds#", instance.getId(),
+                  instance.getGroupIds());
+      }
+      return tag;
+   }
 
+   private Location getLocationForAvailabilityZone(final RunningInstance instance) {
       final String locationId = instance.getAvailabilityZone();
 
-      Map<String, String> extra = getExtra(instance);
-
-      final Location location = Iterables.find(locations, new Predicate<Location>() {
+      Location location = Iterables.find(locations, new Predicate<Location>() {
 
          @Override
          public boolean apply(Location input) {
@@ -144,16 +220,24 @@ public class RunningInstanceToNodeMetada
          }
 
       });
+      return location;
+   }
 
+   @VisibleForTesting
+   Image resolveImageForInstanceInLocation(final RunningInstance instance, final Location location) {
       Image image = null;
       try {
-         image = Iterables.find(images, new FindImageForInstance(location, instance));
+         image = Iterables.find(images.get(), new FindImageForInstance(location, instance));
       } catch (NoSuchElementException e) {
-         logger.warn("could not find a matching image for instance %s in location %s", instance,
-                  location);
+         RegionAndName key = new RegionAndName(instance.getRegion(), instance.getImageId());
+         try {
+            image = imageMap.get(key);
+         } catch (NullPointerException nex) {
+            logger.warn("could not find a matching image for instance %s in location %s", instance,
+                     location);
+         }
       }
-      return new NodeMetadataImpl(id, name, location, uri, userMetadata, tag, image, state,
-               publicAddresses, privateAddresses, extra, credentials);
+      return image;
    }
 
    /**
@@ -178,7 +262,7 @@ public class RunningInstanceToNodeMetada
 
    @VisibleForTesting
    String getPrivateKeyOrNull(RunningInstance instance, String tag) {
-      KeyPair keyPair = credentialsMap.get(new RegionTag(instance.getRegion(), instance
+      KeyPair keyPair = credentialsMap.get(new RegionAndName(instance.getRegion(), instance
                .getKeyName()));
       return keyPair != null ? keyPair.getKeyMaterial() : null;
    }

Added: incubator/whirr/trunk/core/src/test/resources/log4j.xml
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/core/src/test/resources/log4j.xml?rev=984618&view=auto
==============================================================================
--- incubator/whirr/trunk/core/src/test/resources/log4j.xml (added)
+++ incubator/whirr/trunk/core/src/test/resources/log4j.xml Wed Aug 11 23:59:02 2010
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+    <!--
+   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.
+    -->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+    <!--
+        For more configuration infromation and examples see the Apache
+        Log4j website: http://logging.apache.org/log4j/
+    -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
+    debug="false">
+
+    <!-- A time/date based rolling appender -->
+    <appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-wire.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <!-- A time/date based rolling appender -->
+    <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <!-- A time/date based rolling appender -->
+    <appender name="BLOBSTOREFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-blobstore.log" />
+        <param name="Append" value="true" />
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+        <param name="Threshold" value="TRACE" />
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+        </layout>
+    </appender>
+    
+
+    <!-- A time/date based rolling appender -->
+    <appender name="COMPUTEFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-compute.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <appender name="ASYNCCOMPUTE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="COMPUTEFILE" />
+    </appender>
+    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="FILE" />
+    </appender>
+
+    <appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="WIREFILE" />
+    </appender>
+
+    <appender name="ASYNCBLOBSTORE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="BLOBSTOREFILE" />
+    </appender>
+    <!-- ================ -->
+    <!-- Limit categories -->
+    <!-- ================ -->
+    <category name="jclouds.blobstore">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCBLOBSTORE" />
+    </category>
+
+    <category name="org.jclouds">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNC" />
+    </category>
+
+    <category name="jclouds.headers">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category>
+    <category name="jclouds.compute">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCCOMPUTE" />
+    </category>
+
+    <category name="jclouds.wire">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category><!--
+    
+       <category name="jclouds.signature">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category>
+    
+    
+    --><!--  ======================= -->
+    <!-- Setup the Root category -->
+    <!-- ======================= -->
+
+    <root>
+        <priority value="WARN" />
+    </root>
+
+</log4j:configuration>
\ No newline at end of file

Propchange: incubator/whirr/trunk/core/src/test/resources/log4j.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/whirr/trunk/scripts/sun/java/install
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/scripts/sun/java/install?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/scripts/sun/java/install (original)
+++ incubator/whirr/trunk/scripts/sun/java/install Wed Aug 11 23:59:02 2010
@@ -26,7 +26,13 @@ set -e
 # TODO: check that it is not already enabled
 sed -i -e 's/universe$/universe multiverse/' /etc/apt/sources.list
 
+cat > /etc/apt/sources.list.d/canonical.com.list <<EOF
+deb http://archive.canonical.com/ubuntu lucid partner
+deb-src http://archive.canonical.com/ubuntu lucid partner
+EOF
+
 apt-get update
+
 echo 'sun-java6-bin   shared/accepted-sun-dlj-v1-1    boolean true
 sun-java6-jdk   shared/accepted-sun-dlj-v1-1    boolean true
 sun-java6-jre   shared/accepted-sun-dlj-v1-1    boolean true

Modified: incubator/whirr/trunk/services/cassandra/pom.xml
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/cassandra/pom.xml?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/services/cassandra/pom.xml (original)
+++ incubator/whirr/trunk/services/cassandra/pom.xml Wed Aug 11 23:59:02 2010
@@ -37,27 +37,27 @@
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-aws</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-compute</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-enterprise</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-jsch</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-log4j</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>

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=984618&r1=984617&r2=984618&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 Wed Aug 11 23:59:02 2010
@@ -19,19 +19,17 @@
 package org.apache.whirr.service.cassandra;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.compute.domain.OsFamily.UBUNTU;
 import static org.jclouds.compute.options.TemplateOptions.Builder.runScript;
-
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import static org.jclouds.compute.predicates.NodePredicates.runningWithTag;
 
 import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import org.apache.whirr.service.Cluster;
@@ -45,15 +43,24 @@ import org.apache.whirr.service.ClusterS
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.RunNodesException;
 import org.jclouds.compute.RunScriptOnNodesException;
+import org.jclouds.compute.domain.Architecture;
 import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.ssh.ExecResponse;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 public class CassandraService extends Service {
 
   public static final String CASSANDRA_ROLE = "cassandra";
   public static final int CLIENT_PORT = 9160;
-  
+
   @Override
   public String getName() {
     return "cassandra";
@@ -67,11 +74,19 @@ public class CassandraService extends Se
 
     byte[] bootScript = RunUrlBuilder.runUrls("sun/java/install",
         "apache/cassandra/install");
-    Template template = computeService.templateBuilder().osFamily(
-        OsFamily.UBUNTU).options(
-        runScript(bootScript).installPrivateKey(serviceSpec.readPrivateKey())
-            .authorizePublicKey(serviceSpec.readPublicKey()).inboundPorts(22,
-                CLIENT_PORT)).build();
+
+    TemplateBuilder templateBuilder = computeService.templateBuilder()
+        .osFamily(UBUNTU).options(
+            runScript(bootScript).installPrivateKey(
+                serviceSpec.readPrivateKey()).authorizePublicKey(
+                serviceSpec.readPublicKey()).inboundPorts(22, CLIENT_PORT));
+
+    // TODO extract this logic elsewhere
+    if (serviceSpec.getProvider().equals("ec2"))
+      templateBuilder.imageNameMatches(".*10\\.?04.*").osDescriptionMatches(
+          "^ubuntu-images.*").architecture(Architecture.X86_32);
+
+    Template template = templateBuilder.build();
 
     InstanceTemplate instanceTemplate = clusterSpec
         .getInstanceTemplate(CASSANDRA_ROLE);
@@ -92,9 +107,13 @@ public class CassandraService extends Se
     String servers = Joiner.on(' ').join(getPrivateIps(seeds));
     byte[] configureScript = RunUrlBuilder
         .runUrls("apache/cassandra/post-configure " + servers);
+
     try {
-      computeService.runScriptOnNodesWithTag(serviceSpec.getClusterName(),
-          configureScript);
+      Map<? extends NodeMetadata, ExecResponse> responses = computeService
+          .runScriptOnNodesMatching(
+              runningWithTag(serviceSpec.getClusterName()), configureScript);
+      assert responses.size() > 0 : "no nodes matched "
+          + serviceSpec.getClusterName();
     } catch (RunScriptOnNodesException e) {
       // TODO: retry
       throw new IOException(e);
@@ -104,10 +123,12 @@ public class CassandraService extends Se
   }
 
   /**
-   * Pick a selection of the nodes that are to become seeds.
-   * TODO improve selection method. Right now it picks 20% of the nodes
-   * as seeds, or a minimum of one node if it is a small cluster. 
-   * @param nodes all nodes in cluster
+   * Pick a selection of the nodes that are to become seeds. TODO improve
+   * selection method. Right now it picks 20% of the nodes as seeds, or a
+   * minimum of one node if it is a small cluster.
+   * 
+   * @param nodes
+   *          all nodes in cluster
    * @return list of seeds
    */
   protected List<NodeMetadata> getSeeds(List<NodeMetadata> nodes) {
@@ -124,8 +145,7 @@ public class CassandraService extends Se
         new Function<NodeMetadata, String>() {
           @Override
           public String apply(NodeMetadata node) {
-            return Iterables.get(node.getPrivateAddresses(), 0)
-                .getHostAddress();
+            return Iterables.get(node.getPrivateAddresses(), 0);
           }
         });
   }
@@ -135,9 +155,14 @@ public class CassandraService extends Se
         new Function<NodeMetadata, Instance>() {
           @Override
           public Instance apply(NodeMetadata node) {
-            return new Instance(Collections.singleton(CASSANDRA_ROLE),
-                Iterables.get(node.getPublicAddresses(), 0), Iterables.get(node
-                    .getPrivateAddresses(), 0));
+            try {
+              return new Instance(node.getCredentials(), Collections
+                  .singleton(CASSANDRA_ROLE), InetAddress.getByName(Iterables
+                  .get(node.getPublicAddresses(), 0)), InetAddress
+                  .getByName(Iterables.get(node.getPrivateAddresses(), 0)));
+            } catch (UnknownHostException e) {
+              throw new RuntimeException(e);
+            }
           }
         }));
   }

Modified: incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/CassandraServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/CassandraServiceTest.java?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/CassandraServiceTest.java (original)
+++ incubator/whirr/trunk/services/cassandra/src/test/java/org/apache/whirr/service/cassandra/CassandraServiceTest.java Wed Aug 11 23:59:02 2010
@@ -20,7 +20,6 @@ package org.apache.whirr.service.cassand
 
 import static org.junit.Assert.assertEquals;
 
-import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -33,13 +32,13 @@ import org.junit.Test;
 public class CassandraServiceTest {
 
   private NodeMetadata getNodeMetadata(String id) {
-    return new NodeMetadataImpl("1", null, null, null, 
+    return new NodeMetadataImpl("1", null, "1", null, null, 
         new HashMap<String, String>(), null, null, 
-        NodeState.RUNNING, new ArrayList<InetAddress>(), 
-        new ArrayList<InetAddress>(), new HashMap<String, String>(), null); 
+        NodeState.RUNNING, new ArrayList<String>(), 
+        new ArrayList<String>(), new HashMap<String, String>(), null); 
   }
   
-  @Test
+  @Test()
   public void testGetSeeds() {
     List<NodeMetadata> nodes = new ArrayList<NodeMetadata>();
     nodes.add(getNodeMetadata("1"));
@@ -59,5 +58,4 @@ public class CassandraServiceTest {
     assertEquals(getNodeMetadata("1"), seeds2.get(0));
     assertEquals(getNodeMetadata("2"), seeds2.get(1));
   }
-
 }

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=984618&r1=984617&r2=984618&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 Wed Aug 11 23:59:02 2010
@@ -54,15 +54,15 @@ public class CassandraServiceTest {
   public void setUp() throws IOException, InterruptedException {
     String secretKeyFile;
     try {
-      secretKeyFile = checkNotNull(System.getProperty("whirr.test.ssh.keyfile"));
+      secretKeyFile = checkNotNull(System.getProperty("whirr.test.ssh.keyfile"), "whirr.test.ssh.keyfile");
     } catch (NullPointerException e) {
       secretKeyFile = System.getProperty("user.home") + "/.ssh/id_rsa";
     }
     serviceSpec = new ServiceSpec();
     serviceSpec.setProvider(checkNotNull(System.getProperty(
         "whirr.test.provider", "ec2")));
-    serviceSpec.setAccount(checkNotNull(System.getProperty("whirr.test.user")));
-    serviceSpec.setKey(checkNotNull(System.getProperty("whirr.test.key")));
+    serviceSpec.setAccount(checkNotNull(System.getProperty("whirr.test.user"), "whirr.test.user"));
+    serviceSpec.setKey(checkNotNull(System.getProperty("whirr.test.key"), "whirr.test.key"));
     serviceSpec.setSecretKeyFile(secretKeyFile);
     serviceSpec.setClusterName(clusterName);
     service = new CassandraService();

Added: incubator/whirr/trunk/services/cassandra/src/test/resources/log4j.xml
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/cassandra/src/test/resources/log4j.xml?rev=984618&view=auto
==============================================================================
--- incubator/whirr/trunk/services/cassandra/src/test/resources/log4j.xml (added)
+++ incubator/whirr/trunk/services/cassandra/src/test/resources/log4j.xml Wed Aug 11 23:59:02 2010
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+    <!--
+   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.
+    -->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+    <!--
+        For more configuration infromation and examples see the Apache
+        Log4j website: http://logging.apache.org/log4j/
+    -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
+    debug="false">
+
+    <!-- A time/date based rolling appender -->
+    <appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-wire.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <!-- A time/date based rolling appender -->
+    <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <!-- A time/date based rolling appender -->
+    <appender name="BLOBSTOREFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-blobstore.log" />
+        <param name="Append" value="true" />
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+        <param name="Threshold" value="TRACE" />
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+        </layout>
+    </appender>
+    
+
+    <!-- A time/date based rolling appender -->
+    <appender name="COMPUTEFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-compute.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <appender name="ASYNCCOMPUTE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="COMPUTEFILE" />
+    </appender>
+    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="FILE" />
+    </appender>
+
+    <appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="WIREFILE" />
+    </appender>
+
+    <appender name="ASYNCBLOBSTORE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="BLOBSTOREFILE" />
+    </appender>
+    <!-- ================ -->
+    <!-- Limit categories -->
+    <!-- ================ -->
+    <category name="jclouds.blobstore">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCBLOBSTORE" />
+    </category>
+
+    <category name="org.jclouds">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNC" />
+    </category>
+
+    <category name="jclouds.headers">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category>
+    <category name="jclouds.compute">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCCOMPUTE" />
+    </category>
+
+    <category name="jclouds.wire">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category><!--
+    
+       <category name="jclouds.signature">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category>
+    
+    
+    --><!--  ======================= -->
+    <!-- Setup the Root category -->
+    <!-- ======================= -->
+
+    <root>
+        <priority value="WARN" />
+    </root>
+
+</log4j:configuration>
\ No newline at end of file

Propchange: incubator/whirr/trunk/services/cassandra/src/test/resources/log4j.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/whirr/trunk/services/hadoop/pom.xml
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/hadoop/pom.xml?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/services/hadoop/pom.xml (original)
+++ incubator/whirr/trunk/services/hadoop/pom.xml Wed Aug 11 23:59:02 2010
@@ -37,32 +37,32 @@
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-aws</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-compute</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-enterprise</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-jsch</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-log4j</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-rackspace</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>

Modified: incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopProxy.java
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopProxy.java?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopProxy.java (original)
+++ incubator/whirr/trunk/services/hadoop/src/main/java/org/apache/whirr/service/hadoop/HadoopProxy.java Wed Aug 11 23:59:02 2010
@@ -24,6 +24,8 @@ import java.io.InputStreamReader;
 
 import org.apache.whirr.service.ServiceSpec;
 
+import com.google.common.collect.Iterables;
+
 public class HadoopProxy {
 
   private ServiceSpec serviceSpec;
@@ -39,7 +41,7 @@ public class HadoopProxy {
     // jsch doesn't support SOCKS-based dynamic port forwarding, so we need to shell out...
     // TODO: Use static port forwarding instead?
     String identityFile = serviceSpec.getSecretKeyFile();
-    String user = "ubuntu"; // TODO: get from jclouds
+    String user = Iterables.get(cluster.getInstances(), 0).getLoginCredentials().account;
     String server = cluster.getNamenodePublicAddress().getHostName();
     String[] command = new String[] { "ssh",
       "-i", identityFile,

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=984618&r1=984617&r2=984618&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 Wed Aug 11 23:59:02 2010
@@ -20,6 +20,7 @@ package org.apache.whirr.service.hadoop;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.compute.domain.OsFamily.UBUNTU;
 import static org.jclouds.compute.options.TemplateOptions.Builder.runScript;
 
 import com.google.common.base.Charsets;
@@ -32,6 +33,7 @@ import com.google.common.io.Files;
 import java.io.File;
 import java.io.IOException;
 import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.Collections;
 import java.util.Map.Entry;
 import java.util.Properties;
@@ -46,9 +48,10 @@ import org.apache.whirr.service.Cluster.
 import org.apache.whirr.service.ClusterSpec.InstanceTemplate;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.RunNodesException;
+import org.jclouds.compute.domain.Architecture;
 import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.TemplateBuilder;
 
 public class HadoopService extends Service {
   
@@ -63,23 +66,27 @@ public class HadoopService extends Servi
   @Override
   public HadoopCluster launchCluster(ServiceSpec serviceSpec, ClusterSpec clusterSpec) throws IOException {
     ComputeService computeService = ComputeServiceBuilder.build(serviceSpec);
-
-    String privateKey = serviceSpec.readPrivateKey();
-    String publicKey = serviceSpec.readPublicKey();
     
     // Launch Hadoop "master" (NN and JT)
     // deal with user packages and autoshutdown with extra runurls
     byte[] nnjtBootScript = RunUrlBuilder.runUrls(
       "sun/java/install",
       String.format("apache/hadoop/install nn,jt -c %s", serviceSpec.getProvider()));
+
+    TemplateBuilder masterTemplateBuilder = computeService.templateBuilder()
+      .osFamily(UBUNTU)
+      .options(runScript(nnjtBootScript)
+      .installPrivateKey(serviceSpec.readPrivateKey())
+      .authorizePublicKey(serviceSpec.readPublicKey())
+      .inboundPorts(22, 80, 8020, 8021, 50010, 50030, 50070)); // TODO: restrict further
+    
+    // TODO extract this logic elsewhere
+    if (serviceSpec.getProvider().equals("ec2"))
+      masterTemplateBuilder.imageNameMatches(".*10\\.?04.*")
+      .osDescriptionMatches("^ubuntu-images.*")
+      .architecture(Architecture.X86_32);
     
-    Template template = computeService.templateBuilder()
-    .osFamily(OsFamily.UBUNTU)
-    .options(runScript(nnjtBootScript)
-        .installPrivateKey(privateKey)
-        .authorizePublicKey(publicKey)
-        .inboundPorts(22, 80, 8020, 8021, 50010, 50030, 50070)) // TODO: restrict further
-    .build();
+    Template masterTemplate = masterTemplateBuilder.build();
     
     InstanceTemplate instanceTemplate = clusterSpec.getInstanceTemplate(MASTER_ROLE);
     checkNotNull(instanceTemplate);
@@ -87,14 +94,14 @@ public class HadoopService extends Servi
     Set<? extends NodeMetadata> nodes;
     try {
       nodes = computeService.runNodesWithTag(
-      serviceSpec.getClusterName(), 1, template);
+      serviceSpec.getClusterName(), 1, masterTemplate);
     } catch (RunNodesException e) {
       // TODO: can we do better here (retry?)
       throw new IOException(e);
     }
     NodeMetadata node = Iterables.getOnlyElement(nodes);
-    InetAddress namenodePublicAddress = Iterables.getOnlyElement(node.getPublicAddresses());
-    InetAddress jobtrackerPublicAddress = Iterables.getOnlyElement(node.getPublicAddresses());
+    InetAddress namenodePublicAddress = InetAddress.getByName(Iterables.get(node.getPublicAddresses(),0));
+    InetAddress jobtrackerPublicAddress = InetAddress.getByName(Iterables.get(node.getPublicAddresses(),0));
     
     // Launch slaves (DN and TT)
     byte[] slaveBootScript = RunUrlBuilder.runUrls(
@@ -103,20 +110,27 @@ public class HadoopService extends Servi
           namenodePublicAddress.getHostName(),
           jobtrackerPublicAddress.getHostName()));
 
-    template = computeService.templateBuilder()
-    .osFamily(OsFamily.UBUNTU)
-    .options(runScript(slaveBootScript)
-        .installPrivateKey(privateKey)
-        .authorizePublicKey(publicKey))
-    .build();
-
+    TemplateBuilder slaveTemplateBuilder = computeService.templateBuilder()
+      .osFamily(UBUNTU)
+      .options(runScript(slaveBootScript)
+      .installPrivateKey(serviceSpec.readPrivateKey())
+      .authorizePublicKey(serviceSpec.readPublicKey()));
+
+    // TODO extract this logic elsewhere
+    if (serviceSpec.getProvider().equals("ec2"))
+      slaveTemplateBuilder.imageNameMatches(".*10\\.?04.*")
+      .osDescriptionMatches("^ubuntu-images.*")
+      .architecture(Architecture.X86_32);
+    
+    Template slaveTemplate = slaveTemplateBuilder.build();
+    
     instanceTemplate = clusterSpec.getInstanceTemplate(WORKER_ROLE);
     checkNotNull(instanceTemplate);
 
     Set<? extends NodeMetadata> workerNodes;
     try {
       workerNodes = computeService.runNodesWithTag(serviceSpec.getClusterName(),
-        instanceTemplate.getNumberOfInstances(), template);
+        instanceTemplate.getNumberOfInstances(), slaveTemplate);
     } catch (RunNodesException e) {
       // TODO: don't bail out if only a few have failed to start
       throw new IOException(e);
@@ -136,9 +150,13 @@ public class HadoopService extends Servi
         new Function<NodeMetadata, Instance>() {
       @Override
       public Instance apply(NodeMetadata node) {
-        return new Instance(roles,
-            Iterables.get(node.getPublicAddresses(), 0),
-            Iterables.get(node.getPrivateAddresses(), 0));
+        try {
+        return new Instance(node.getCredentials(), roles,
+            InetAddress.getByName(Iterables.get(node.getPublicAddresses(), 0)),
+            InetAddress.getByName(Iterables.get(node.getPrivateAddresses(), 0)));
+        } catch (UnknownHostException e) {
+            throw new RuntimeException(e);
+        }
       }
     }));
   }

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=984618&r1=984617&r2=984618&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 Wed Aug 11 23:59:02 2010
@@ -146,7 +146,9 @@ public class HadoopServiceTest {
   
   @After
   public void tearDown() throws IOException {
-    proxy.stop();
+    if (proxy != null) {
+      proxy.stop();
+    }
     service.destroyCluster(serviceSpec);
   }
 

Added: incubator/whirr/trunk/services/hadoop/src/test/resources/log4j.xml
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/hadoop/src/test/resources/log4j.xml?rev=984618&view=auto
==============================================================================
--- incubator/whirr/trunk/services/hadoop/src/test/resources/log4j.xml (added)
+++ incubator/whirr/trunk/services/hadoop/src/test/resources/log4j.xml Wed Aug 11 23:59:02 2010
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+    <!--
+   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.
+    -->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+    <!--
+        For more configuration infromation and examples see the Apache
+        Log4j website: http://logging.apache.org/log4j/
+    -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
+    debug="false">
+
+    <!-- A time/date based rolling appender -->
+    <appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-wire.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <!-- A time/date based rolling appender -->
+    <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <!-- A time/date based rolling appender -->
+    <appender name="BLOBSTOREFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-blobstore.log" />
+        <param name="Append" value="true" />
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+        <param name="Threshold" value="TRACE" />
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+        </layout>
+    </appender>
+    
+
+    <!-- A time/date based rolling appender -->
+    <appender name="COMPUTEFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-compute.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <appender name="ASYNCCOMPUTE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="COMPUTEFILE" />
+    </appender>
+    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="FILE" />
+    </appender>
+
+    <appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="WIREFILE" />
+    </appender>
+
+    <appender name="ASYNCBLOBSTORE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="BLOBSTOREFILE" />
+    </appender>
+    <!-- ================ -->
+    <!-- Limit categories -->
+    <!-- ================ -->
+    <category name="jclouds.blobstore">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCBLOBSTORE" />
+    </category>
+
+    <category name="org.jclouds">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNC" />
+    </category>
+
+    <category name="jclouds.headers">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category>
+    <category name="jclouds.compute">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCCOMPUTE" />
+    </category>
+
+    <category name="jclouds.wire">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category><!--
+    
+       <category name="jclouds.signature">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category>
+    
+    
+    --><!--  ======================= -->
+    <!-- Setup the Root category -->
+    <!-- ======================= -->
+
+    <root>
+        <priority value="WARN" />
+    </root>
+
+</log4j:configuration>
\ No newline at end of file

Propchange: incubator/whirr/trunk/services/hadoop/src/test/resources/log4j.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/whirr/trunk/services/zookeeper/pom.xml
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/zookeeper/pom.xml?rev=984618&r1=984617&r2=984618&view=diff
==============================================================================
--- incubator/whirr/trunk/services/zookeeper/pom.xml (original)
+++ incubator/whirr/trunk/services/zookeeper/pom.xml Wed Aug 11 23:59:02 2010
@@ -37,27 +37,27 @@
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-aws</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-compute</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-enterprise</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-jsch</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-log4j</artifactId>
-      <version>1.0-beta-5</version>
+      <version>1.0-beta-6</version>
     </dependency>
     <dependency>
       <groupId>junit</groupId>

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=984618&r1=984617&r2=984618&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 Wed Aug 11 23:59:02 2010
@@ -19,16 +19,13 @@
 package org.apache.whirr.service.zookeeper;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.compute.domain.OsFamily.UBUNTU;
 import static org.jclouds.compute.options.TemplateOptions.Builder.runScript;
-
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import static org.jclouds.compute.predicates.NodePredicates.runningWithTag;
 
 import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -43,9 +40,18 @@ import org.apache.whirr.service.ClusterS
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.RunNodesException;
 import org.jclouds.compute.RunScriptOnNodesException;
+import org.jclouds.compute.domain.Architecture;
 import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.TemplateBuilder;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.base.Throwables;
+import com.google.common.collect.Collections2;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 public class ZooKeeperService extends Service {
     
@@ -65,13 +71,21 @@ public class ZooKeeperService extends Se
     byte[] bootScript = RunUrlBuilder.runUrls(
       "sun/java/install",
       "apache/zookeeper/install");
-    Template template = computeService.templateBuilder()
-      .osFamily(OsFamily.UBUNTU)
+    
+    TemplateBuilder templateBuilder = computeService.templateBuilder()
+      .osFamily(UBUNTU)
       .options(runScript(bootScript)
       .installPrivateKey(serviceSpec.readPrivateKey())
       .authorizePublicKey(serviceSpec.readPublicKey())
-      .inboundPorts(22, CLIENT_PORT))
-      .build();
+      .inboundPorts(22, CLIENT_PORT));
+    
+    // TODO extract this logic elsewhere
+    if (serviceSpec.getProvider().equals("ec2"))
+       templateBuilder.imageNameMatches(".*10\\.?04.*")
+       .osDescriptionMatches("^ubuntu-images.*")
+       .architecture(Architecture.X86_32);
+    
+    Template template = templateBuilder.build();
     
     InstanceTemplate instanceTemplate = clusterSpec.getInstanceTemplate(ZOOKEEPER_ROLE);
     checkNotNull(instanceTemplate);
@@ -92,7 +106,7 @@ public class ZooKeeperService extends Se
     byte[] configureScript = RunUrlBuilder.runUrls(
       "apache/zookeeper/post-configure " + servers);
     try {
-      computeService.runScriptOnNodesWithTag(serviceSpec.getClusterName(), configureScript);
+      computeService.runScriptOnNodesMatching(runningWithTag(serviceSpec.getClusterName()), configureScript);
     } catch (RunScriptOnNodesException e) {
       // TODO: retry
       throw new IOException(e);
@@ -107,7 +121,12 @@ public class ZooKeeperService extends Se
         new Function<NodeMetadata, String>() {
       @Override
       public String apply(NodeMetadata node) {
-        return Iterables.get(node.getPrivateAddresses(), 0).getHostAddress();
+        try {
+         return InetAddress.getByName(Iterables.get(node.getPrivateAddresses(), 0)).getHostAddress();
+      } catch (UnknownHostException e) {
+         Throwables.propagate(e);
+         return null;
+      }
       }
     });
   }
@@ -117,9 +136,13 @@ public class ZooKeeperService extends Se
         new Function<NodeMetadata, Instance>() {
       @Override
       public Instance apply(NodeMetadata node) {
-        return new Instance(Collections.singleton(ZOOKEEPER_ROLE),
-          Iterables.get(node.getPublicAddresses(), 0),
-          Iterables.get(node.getPrivateAddresses(), 0));
+        try {
+        return new Instance(node.getCredentials(), Collections.singleton(ZOOKEEPER_ROLE),
+          InetAddress.getByName(Iterables.get(node.getPublicAddresses(), 0)),
+          InetAddress.getByName(Iterables.get(node.getPrivateAddresses(), 0)));
+        } catch (UnknownHostException e) {
+          throw new RuntimeException(e);
+        }
       }
     }));
   }
@@ -129,8 +152,13 @@ public class ZooKeeperService extends Se
         new Function<NodeMetadata, String>() {
       @Override
       public String apply(NodeMetadata node) {
-        String publicIp =  Iterables.get(node.getPublicAddresses(), 0)
-         .getHostName();
+        String publicIp;
+      try {
+         publicIp = InetAddress.getByName(Iterables.get(node.getPublicAddresses(), 0)).getHostName();
+      } catch (UnknownHostException e) {
+         Throwables.propagate(e);
+         return null;
+      }
         return String.format("%s:%d", publicIp, CLIENT_PORT);
       }
     });

Added: incubator/whirr/trunk/services/zookeeper/src/test/resources/log4j.xml
URL: http://svn.apache.org/viewvc/incubator/whirr/trunk/services/zookeeper/src/test/resources/log4j.xml?rev=984618&view=auto
==============================================================================
--- incubator/whirr/trunk/services/zookeeper/src/test/resources/log4j.xml (added)
+++ incubator/whirr/trunk/services/zookeeper/src/test/resources/log4j.xml Wed Aug 11 23:59:02 2010
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+    <!--
+   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.
+    -->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+    <!--
+        For more configuration infromation and examples see the Apache
+        Log4j website: http://logging.apache.org/log4j/
+    -->
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
+    debug="false">
+
+    <!-- A time/date based rolling appender -->
+    <appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-wire.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <!-- A time/date based rolling appender -->
+    <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <!-- A time/date based rolling appender -->
+    <appender name="BLOBSTOREFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-blobstore.log" />
+        <param name="Append" value="true" />
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+        <param name="Threshold" value="TRACE" />
+        <layout class="org.apache.log4j.PatternLayout">
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+        </layout>
+    </appender>
+    
+
+    <!-- A time/date based rolling appender -->
+    <appender name="COMPUTEFILE" class="org.apache.log4j.DailyRollingFileAppender">
+        <param name="File" value="target/test-data/jclouds-compute.log" />
+        <param name="Append" value="true" />
+
+        <!-- Rollover at midnight each day -->
+        <param name="DatePattern" value="'.'yyyy-MM-dd" />
+
+        <param name="Threshold" value="TRACE" />
+
+        <layout class="org.apache.log4j.PatternLayout">
+            <!-- The default pattern: Date Priority [Category] Message\n -->
+            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
+
+            <!--
+                The full pattern: Date MS Priority [Category]
+                (Thread:NDC) Message\n <param name="ConversionPattern"
+                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
+            -->
+        </layout>
+    </appender>
+
+    <appender name="ASYNCCOMPUTE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="COMPUTEFILE" />
+    </appender>
+    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="FILE" />
+    </appender>
+
+    <appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="WIREFILE" />
+    </appender>
+
+    <appender name="ASYNCBLOBSTORE" class="org.apache.log4j.AsyncAppender">
+        <appender-ref ref="BLOBSTOREFILE" />
+    </appender>
+    <!-- ================ -->
+    <!-- Limit categories -->
+    <!-- ================ -->
+    <category name="jclouds.blobstore">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCBLOBSTORE" />
+    </category>
+
+    <category name="org.jclouds">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNC" />
+    </category>
+
+    <category name="jclouds.headers">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category>
+    <category name="jclouds.compute">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCCOMPUTE" />
+    </category>
+
+    <category name="jclouds.wire">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category><!--
+    
+       <category name="jclouds.signature">
+        <priority value="DEBUG" />
+        <appender-ref ref="ASYNCWIRE" />
+    </category>
+    
+    
+    --><!--  ======================= -->
+    <!-- Setup the Root category -->
+    <!-- ======================= -->
+
+    <root>
+        <priority value="WARN" />
+    </root>
+
+</log4j:configuration>
\ No newline at end of file

Propchange: incubator/whirr/trunk/services/zookeeper/src/test/resources/log4j.xml
------------------------------------------------------------------------------
    svn:eol-style = native