You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@whirr.apache.org by ab...@apache.org on 2014/01/07 23:29:31 UTC

git commit: WHIRR-753 - Move to jclouds 1.7.0, use security group extension

Updated Branches:
  refs/heads/trunk 454c93cfc -> ff785da1f


WHIRR-753 - Move to jclouds 1.7.0, use security group extension


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

Branch: refs/heads/trunk
Commit: ff785da1f55e343bf65d15bf34eeb696272d4081
Parents: 454c93c
Author: Andrew Bayer <an...@gmail.com>
Authored: Tue Jan 7 14:29:14 2014 -0800
Committer: Andrew Bayer <an...@gmail.com>
Committed: Tue Jan 7 14:29:14 2014 -0800

----------------------------------------------------------------------
 CHANGES.txt                                     |   3 +
 .../apache/whirr/compute/BootstrapTemplate.java |  39 ++++---
 .../whirr/service/BlobStoreContextBuilder.java  |  57 +++-------
 .../org/apache/whirr/service/ComputeCache.java  |  42 +++----
 .../apache/whirr/service/FirewallManager.java   | 112 +++++++------------
 .../whirr/compute/BootstrapTemplateTest.java    |  12 +-
 .../integration/FirewallManagerTest.java        |  16 ++-
 parent/pom.xml                                  |   4 +-
 8 files changed, 117 insertions(+), 168 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/whirr/blob/ff785da1/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index fc3207b..4d32e5c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -8,6 +8,9 @@ Release 0.9.0 (Unreleased Changes)
 
   IMPROVEMENTS
 
+    WHIRR-753. Move to jclouds 1.7.0, use new SecurityGroup
+    abstractions. (abayer)
+
     WHIRR-751. Improve Kerberos service (graham)
 
     WHIRR-748. Move to jclouds 1.6.2-incubating. (abayer)

http://git-wip-us.apache.org/repos/asf/whirr/blob/ff785da1/core/src/main/java/org/apache/whirr/compute/BootstrapTemplate.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/whirr/compute/BootstrapTemplate.java b/core/src/main/java/org/apache/whirr/compute/BootstrapTemplate.java
index 7c818b1..8d8c61c 100644
--- a/core/src/main/java/org/apache/whirr/compute/BootstrapTemplate.java
+++ b/core/src/main/java/org/apache/whirr/compute/BootstrapTemplate.java
@@ -25,28 +25,27 @@ import static org.jclouds.scriptbuilder.domain.Statements.interpret;
 import static org.jclouds.scriptbuilder.domain.Statements.newStatementList;
 import static org.jclouds.scriptbuilder.statements.ssh.SshStatements.sshdConfig;
 
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import org.apache.whirr.ClusterSpec;
 import org.apache.whirr.InstanceTemplate;
 import org.apache.whirr.service.jclouds.StatementBuilder;
-import org.jclouds.aws.ec2.AWSEC2ApiMetadata;
+import org.jclouds.aws.ec2.compute.AWSEC2ComputeService;
 import org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions;
-import org.jclouds.ec2.EC2ApiMetadata;
-import org.jclouds.ec2.compute.options.EC2TemplateOptions;
-import org.jclouds.ec2.compute.predicates.EC2ImagePredicates;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.ComputeServiceContext;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.ec2.compute.EC2ComputeService;
+import org.jclouds.ec2.compute.options.EC2TemplateOptions;
+import org.jclouds.ec2.compute.predicates.EC2ImagePredicates;
 import org.jclouds.scriptbuilder.domain.OsFamily;
 import org.jclouds.scriptbuilder.domain.Statement;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-
 public class BootstrapTemplate {
 
   private static final Logger LOG =
@@ -100,7 +99,7 @@ public class BootstrapTemplate {
       ComputeServiceContext context, ClusterSpec spec, Template template, InstanceTemplate instanceTemplate
   ) {
 
-    if (AWSEC2ApiMetadata.CONTEXT_TOKEN.isAssignableFrom(context.getBackendType())) {
+    if (AWSEC2ComputeService.class.isInstance(context.getComputeService())) {
       template.getOptions().as(AWSEC2TemplateOptions.class)
             .spotPrice(instanceTemplate.getAwsEc2SpotPrice() != null ? instanceTemplate.getAwsEc2SpotPrice() :
                                                                        spec.getAwsEc2SpotPrice());
@@ -116,12 +115,12 @@ public class BootstrapTemplate {
                                                            ClusterSpec spec,
                                                            Template template,
                                                            InstanceTemplate instanceTemplate) {
-        if (EC2ApiMetadata.CONTEXT_TOKEN.isAssignableFrom(context.getBackendType())) {
-            if (EC2ImagePredicates.rootDeviceType(EBS).apply(template.getImage())) {
-                template.getOptions().as(EC2TemplateOptions.class).mapEphemeralDeviceToDeviceName("/dev/sdc", "ephemeral1");
-            }
+      if (EC2ComputeService.class.isInstance(context.getComputeService())) {
+        if (EC2ImagePredicates.rootDeviceType(EBS).apply(template.getImage())) {
+          template.getOptions().as(EC2TemplateOptions.class).mapEphemeralDeviceToDeviceName("/dev/sdc", "ephemeral1");
         }
-        return setPlacementGroup(context, spec, template, instanceTemplate);
+      }
+      return setPlacementGroup(context, spec, template, instanceTemplate);
     }
     
     /**
@@ -129,13 +128,13 @@ public class BootstrapTemplate {
      */
     private static Template setPlacementGroup(ComputeServiceContext context, ClusterSpec spec,
                                               Template template, InstanceTemplate instanceTemplate) {
-        if (AWSEC2ApiMetadata.CONTEXT_TOKEN.isAssignableFrom(context.getBackendType())) {
-            if (spec.getAwsEc2PlacementGroup() != null) {
-                template.getOptions().as(AWSEC2TemplateOptions.class).placementGroup(spec.getAwsEc2PlacementGroup());
-            }
+      if (AWSEC2ComputeService.class.isInstance(context.getComputeService())) {
+        if (spec.getAwsEc2PlacementGroup() != null) {
+          template.getOptions().as(AWSEC2TemplateOptions.class).placementGroup(spec.getAwsEc2PlacementGroup());
         }
+      }
 
-        return template;
+      return template;
     }
 
   // must be used inside InitBuilder, as this sets the shell variables used in this statement

http://git-wip-us.apache.org/repos/asf/whirr/blob/ff785da1/core/src/main/java/org/apache/whirr/service/BlobStoreContextBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/whirr/service/BlobStoreContextBuilder.java b/core/src/main/java/org/apache/whirr/service/BlobStoreContextBuilder.java
index 0046bbf..82ce6dc 100644
--- a/core/src/main/java/org/apache/whirr/service/BlobStoreContextBuilder.java
+++ b/core/src/main/java/org/apache/whirr/service/BlobStoreContextBuilder.java
@@ -18,10 +18,23 @@
 
 package org.apache.whirr.service;
 
+import java.io.Closeable;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ForwardingObject;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import com.google.common.reflect.TypeToken;
+import com.google.inject.Module;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationConverter;
 import org.apache.whirr.ClusterSpec;
@@ -30,13 +43,10 @@ import org.jclouds.ContextBuilder;
 import org.jclouds.apis.ApiMetadata;
 import org.jclouds.apis.Apis;
 import org.jclouds.blobstore.AsyncBlobStore;
-import org.jclouds.blobstore.BlobMap;
 import org.jclouds.blobstore.BlobRequestSigner;
 import org.jclouds.blobstore.BlobStore;
 import org.jclouds.blobstore.BlobStoreContext;
-import org.jclouds.blobstore.InputStreamMap;
 import org.jclouds.blobstore.attr.ConsistencyModel;
-import org.jclouds.blobstore.options.ListContainerOptions;
 import org.jclouds.enterprise.config.EnterpriseConfigurationModule;
 import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
 import org.jclouds.providers.ProviderMetadata;
@@ -45,19 +55,6 @@ import org.jclouds.rest.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ForwardingObject;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-import com.google.common.reflect.TypeToken;
-import com.google.inject.Module;
-
 public class BlobStoreContextBuilder {
 
   private static final Logger LOG = LoggerFactory.getLogger(Cache.class);
@@ -126,25 +123,7 @@ public class BlobStoreContextBuilder {
       return delegate().getSigner();
     }
 
-    @Override
-    public InputStreamMap createInputStreamMap(String container, ListContainerOptions options) {
-      return delegate().createInputStreamMap(container, options);
-    }
-
-    @Override
-    public InputStreamMap createInputStreamMap(String container) {
-      return delegate().createInputStreamMap(container);
-    }
-
-    @Override
-    public BlobMap createBlobMap(String container, ListContainerOptions options) {
-      return delegate().createBlobMap(container, options);
-    }
 
-    @Override
-    public BlobMap createBlobMap(String container) {
-      return delegate().createBlobMap(container);
-    }
 
     @Override
     public AsyncBlobStore getAsyncBlobStore() {
@@ -162,11 +141,6 @@ public class BlobStoreContextBuilder {
     }
 
     @Override
-    public Utils getUtils() {
-      return delegate().getUtils();
-    }
-
-    @Override
     public Utils utils() {
       return delegate().utils();
     }
@@ -182,6 +156,11 @@ public class BlobStoreContextBuilder {
     }
 
     @Override
+    public <A extends Closeable> A unwrapApi(Class<A> apiClass) {
+      return delegate().unwrapApi(apiClass);
+    }
+
+    @Override
     public <C extends Context> C unwrap(TypeToken<C> type) {
       return delegate().<C>unwrap(type);
     }

http://git-wip-us.apache.org/repos/asf/whirr/blob/ff785da1/core/src/main/java/org/apache/whirr/service/ComputeCache.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/whirr/service/ComputeCache.java b/core/src/main/java/org/apache/whirr/service/ComputeCache.java
index 6a4b032..bc51059 100644
--- a/core/src/main/java/org/apache/whirr/service/ComputeCache.java
+++ b/core/src/main/java/org/apache/whirr/service/ComputeCache.java
@@ -23,10 +23,26 @@ import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_AMI_QUE
 import static org.jclouds.aws.ec2.reference.AWSEC2Constants.PROPERTY_EC2_CC_AMI_QUERY;
 import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGION;
 
+import java.io.Closeable;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ForwardingObject;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import com.google.common.eventbus.AllowConcurrentEvents;
+import com.google.common.eventbus.Subscribe;
+import com.google.common.reflect.TypeToken;
+import com.google.inject.Module;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationConverter;
 import org.apache.commons.lang.StringUtils;
@@ -55,22 +71,6 @@ import org.jclouds.sshj.config.SshjSshClientModule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ForwardingObject;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
-import com.google.common.eventbus.AllowConcurrentEvents;
-import com.google.common.eventbus.Subscribe;
-import com.google.common.reflect.TypeToken;
-import com.google.inject.Module;
-
 /**
  * A convenience class for building jclouds {@link ComputeServiceContext} objects.
  */
@@ -182,11 +182,6 @@ public enum ComputeCache implements Function<ClusterSpec, ComputeServiceContext>
     }
 
     @Override
-    public Utils getUtils() {
-      return delegate().getUtils();
-    }
-
-    @Override
     public Utils utils() {
       return delegate().utils();
     }
@@ -202,6 +197,11 @@ public enum ComputeCache implements Function<ClusterSpec, ComputeServiceContext>
     }
 
     @Override
+    public <A extends Closeable> A unwrapApi(Class<A> apiClass) {
+      return delegate().unwrapApi(apiClass);
+    }
+
+    @Override
     public <C extends Context> C unwrap(TypeToken<C> type) {
       return delegate().<C>unwrap(type);
     }

http://git-wip-us.apache.org/repos/asf/whirr/blob/ff785da1/core/src/main/java/org/apache/whirr/service/FirewallManager.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/whirr/service/FirewallManager.java b/core/src/main/java/org/apache/whirr/service/FirewallManager.java
index 0599e43..aa8906f 100644
--- a/core/src/main/java/org/apache/whirr/service/FirewallManager.java
+++ b/core/src/main/java/org/apache/whirr/service/FirewallManager.java
@@ -27,31 +27,25 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import org.apache.commons.io.IOUtils;
 import org.apache.whirr.Cluster;
 import org.apache.whirr.Cluster.Instance;
 import org.apache.whirr.ClusterSpec;
-import org.jclouds.aws.util.AWSUtils;
 import org.jclouds.compute.ComputeServiceContext;
-import org.jclouds.ec2.EC2ApiMetadata;
-import org.jclouds.ec2.EC2Client;
-import org.jclouds.ec2.domain.IpProtocol;
-import org.jclouds.openstack.nova.v2_0.NovaApiMetadata;
-import org.jclouds.openstack.nova.v2_0.domain.Ingress;
-import org.jclouds.openstack.nova.v2_0.domain.SecurityGroup;
-import org.jclouds.openstack.nova.v2_0.extensions.SecurityGroupApi;
+import org.jclouds.compute.domain.SecurityGroup;
+import org.jclouds.compute.extensions.SecurityGroupExtension;
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.net.domain.IpPermission;
+import org.jclouds.net.domain.IpProtocol;
 import org.jclouds.scriptbuilder.domain.Statement;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
 public class FirewallManager {
 
   public static class StoredRule {
@@ -282,66 +276,46 @@ public class FirewallManager {
   }
 
   public static void authorizeIngress(ComputeServiceContext computeServiceContext,
-                                      Set<Instance> instances, ClusterSpec clusterSpec, List<String> cidrs, int... ports) {
-
-    if (EC2ApiMetadata.CONTEXT_TOKEN.isAssignableFrom(computeServiceContext.getBackendType())) {
-      // This code (or something like it) may be added to jclouds (see
-      // http://code.google.com/p/jclouds/issues/detail?id=336).
-      // Until then we need this temporary workaround.
-      String region = AWSUtils.parseHandle(Iterables.get(instances, 0).getId())[0];
-      EC2Client ec2Client = computeServiceContext.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi();
-      String groupName = "jclouds#" + clusterSpec.getClusterName();
-      for (String cidr : cidrs) {
-        for (int port : ports) {
-          try {
-            ec2Client.getSecurityGroupServices()
-              .authorizeSecurityGroupIngressInRegion(region, groupName,
-                                                     IpProtocol.TCP, port, port, cidr);
-          } catch(IllegalStateException e) {
-            LOG.warn(e.getMessage());
-            /* ignore, it means that this permission was already granted */
+                                      Set<Instance> instances, final ClusterSpec clusterSpec, List<String> cidrs, int... ports) {
+
+    try {
+      if (computeServiceContext.getComputeService().getSecurityGroupExtension().isPresent()) {
+        SecurityGroupExtension securityGroupExtension = computeServiceContext.getComputeService().getSecurityGroupExtension().get();
+        Instance instance = Iterables.getFirst(instances, null);
+        if (instance != null) {
+          SecurityGroup group = Iterables.find(securityGroupExtension.listSecurityGroupsForNode(instance.getNodeMetadata().getId()),
+              new Predicate<SecurityGroup>() {
+                @Override
+                public boolean apply(SecurityGroup input) {
+                  if (input.getName().contains(clusterSpec.getClusterName()) ||
+                      input.getId().contains(clusterSpec.getClusterName())) {
+                    return true;
+                  }
+                  return false;  //To change body of implemented methods use File | Settings | File Templates.
+                }
+              });
+
+          if (group == null) {
+            group = securityGroupExtension.createSecurityGroup(clusterSpec.getClusterName(),
+                instance.getNodeMetadata().getLocation());
           }
-        }
-      }
-    } else if (NovaApiMetadata.CONTEXT_TOKEN.isAssignableFrom(computeServiceContext.getBackendType())) {
-      // This code (or something like it) may be added to jclouds (see
-      // http://code.google.com/p/jclouds/issues/detail?id=336).
-      // Until then we need this temporary workaround.
-      Optional<? extends SecurityGroupApi> securityGroupApi = computeServiceContext.unwrap(NovaApiMetadata.CONTEXT_TOKEN)
-        .getApi()
-        .getSecurityGroupExtensionForZone(clusterSpec.getTemplate().getLocationId());
-
-      if (securityGroupApi.isPresent()) {
-        final String groupName = "jclouds-" + clusterSpec.getClusterName();
-        Optional<? extends SecurityGroup> group = securityGroupApi.get().list().firstMatch(new Predicate<SecurityGroup>() {
-            @Override
-            public boolean apply(SecurityGroup secGrp) {
-              return secGrp.getName().equals(groupName);
-            }
-          });
-
-        if (group.isPresent()) {
-          for (String cidr : cidrs) {
-            for (int port : ports) {
-              try {
-                securityGroupApi.get().createRuleAllowingCidrBlock(group.get().getId(),
-                                                                   Ingress.builder()
-                                                                   .ipProtocol(org.jclouds.openstack.nova.v2_0.domain.IpProtocol.TCP)
-                                                                   .fromPort(port).toPort(port).build(),
-                                                                   cidr);
-                        
-              } catch(IllegalStateException e) {
-                LOG.warn(e.getMessage());
-                /* ignore, it means that this permission was already granted */
-              }
-            }
+
+          for (int port : ports) {
+            IpPermission.Builder builder = IpPermission.builder();
+            builder.cidrBlocks(cidrs);
+            builder.ipProtocol(IpProtocol.TCP);
+            builder.fromPort(port);
+            builder.toPort(port);
+            securityGroupExtension.addIpPermission(builder.build(), group);
           }
         } else {
-          LOG.warn("Expected security group " + groupName + " does not exist.");
+          LOG.warn("Cannot find any instance for group, so cannot determine security group.");
         }
       } else {
-        LOG.warn("OpenStack security group extension not available for this cloud.");
+        LOG.warn("No security group extension present for provider, so cannot set up security group.");
       }
+    } catch (Exception e) {
+      LOG.error("Error setting up security groups: {}", e);
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/whirr/blob/ff785da1/core/src/test/java/org/apache/whirr/compute/BootstrapTemplateTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/whirr/compute/BootstrapTemplateTest.java b/core/src/test/java/org/apache/whirr/compute/BootstrapTemplateTest.java
index 3a920af..1b73c12 100644
--- a/core/src/test/java/org/apache/whirr/compute/BootstrapTemplateTest.java
+++ b/core/src/test/java/org/apache/whirr/compute/BootstrapTemplateTest.java
@@ -28,11 +28,13 @@ import static org.mockito.Mockito.when;
 import java.net.MalformedURLException;
 import java.util.Map;
 
+import com.google.common.base.Joiner;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableMap;
 import org.apache.commons.configuration.CompositeConfiguration;
 import org.apache.whirr.ClusterSpec;
 import org.apache.whirr.InstanceTemplate;
 import org.apache.whirr.service.jclouds.StatementBuilder;
-import org.jclouds.aws.ec2.AWSEC2ApiMetadata;
 import org.jclouds.aws.ec2.compute.AWSEC2ComputeService;
 import org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions;
 import org.jclouds.compute.ComputeService;
@@ -45,11 +47,6 @@ import org.jclouds.compute.options.TemplateOptions;
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.common.base.Joiner;
-import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.reflect.TypeToken;
-
 public class BootstrapTemplateTest {
 
   private StatementBuilder statementBuilder;
@@ -117,8 +114,7 @@ private void assertSpotPriceIs(
     ComputeService computeService = mock(AWSEC2ComputeService.class);
     ComputeServiceContext context = mock(ComputeServiceContext.class);
     when(computeService.getContext()).thenReturn(context);
-
-    when(context.getBackendType()).thenReturn(TypeToken.class.cast(AWSEC2ApiMetadata.CONTEXT_TOKEN));
+    when(context.getComputeService()).thenReturn(computeService);
 
     TemplateBuilder templateBuilder = mock(TemplateBuilder.class);
     when(computeService.templateBuilder()).thenReturn(templateBuilder);

http://git-wip-us.apache.org/repos/asf/whirr/blob/ff785da1/core/src/test/java/org/apache/whirr/service/jclouds/integration/FirewallManagerTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/whirr/service/jclouds/integration/FirewallManagerTest.java b/core/src/test/java/org/apache/whirr/service/jclouds/integration/FirewallManagerTest.java
index defe820..b250dca 100644
--- a/core/src/test/java/org/apache/whirr/service/jclouds/integration/FirewallManagerTest.java
+++ b/core/src/test/java/org/apache/whirr/service/jclouds/integration/FirewallManagerTest.java
@@ -21,6 +21,7 @@ package org.apache.whirr.service.jclouds.integration;
 import java.io.IOException;
 import java.util.Set;
 
+import com.google.common.collect.Sets;
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.apache.whirr.Cluster;
 import org.apache.whirr.ClusterSpec;
@@ -30,13 +31,11 @@ import org.apache.whirr.service.FirewallManager;
 import org.apache.whirr.service.FirewallManager.Rule;
 import org.jclouds.compute.ComputeServiceContext;
 import org.jclouds.domain.Credentials;
-import org.jclouds.ec2.EC2ApiMetadata;
-import org.jclouds.ec2.EC2Client;
+import org.jclouds.ec2.EC2Api;
+import org.jclouds.ec2.compute.EC2ComputeService;
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.common.collect.Sets;
-
 public class FirewallManagerTest {
 
   private final String region = "us-east-1";
@@ -72,13 +71,12 @@ public class FirewallManagerTest {
 
   @Test(timeout = TestConstants.ITEST_TIMEOUT)
   public void testFirewallAuthorizationIsIdempotent() throws IOException {
-    if (EC2ApiMetadata.CONTEXT_TOKEN.isAssignableFrom(context.getBackendType())) {
-      EC2Client ec2Client = context.unwrap(EC2ApiMetadata.CONTEXT_TOKEN).getApi();
+    if (EC2ComputeService.class.isInstance(context.getComputeService())) {
+      EC2Api api = context.unwrapApi(EC2Api.class);
 
       String groupName = "jclouds#" + clusterSpec.getClusterName();
 
-      ec2Client.getSecurityGroupServices()
-          .createSecurityGroupInRegion(region, groupName, "group description");
+      api.getSecurityGroupApi().get().createSecurityGroupInRegion(region, groupName, "group description");
       try {
         manager.addRule(
           Rule.create().destination(instances).port(23344)
@@ -91,7 +89,7 @@ public class FirewallManagerTest {
 
         manager.authorizeAllRules();
       } finally {
-        ec2Client.getSecurityGroupServices()
+        api.getSecurityGroupApi().get()
             .deleteSecurityGroupInRegion(region, groupName);
       }
     }

http://git-wip-us.apache.org/repos/asf/whirr/blob/ff785da1/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 75b2b94..82efa4f 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -44,13 +44,13 @@
     <commons.io.version>1.4</commons.io.version>
     <common-ssl.version>0.3.11</common-ssl.version>
     <dnsjava.version>2.1.1</dnsjava.version>
-    <guava.version>14.0.1</guava.version>
+    <guava.version>15.0</guava.version>
     <hadoop.version>1.0.4</hadoop.version>
     <hamcrest.version>1.1</hamcrest.version>
     <hama.version>0.4.0-incubating</hama.version>
     <hbase.version>0.94.1</hbase.version>
     <jackson.version>1.5.2</jackson.version>
-    <jclouds.version>1.6.2-incubating</jclouds.version>
+    <jclouds.version>1.7.0</jclouds.version>
     <jdom.version>1.1</jdom.version>
     <jopt.simple.version>4.3</jopt.simple.version>
     <jsch.version>0.1.48</jsch.version>