You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2016/08/10 22:09:45 UTC

[01/12] jclouds git commit: Add S3Proxy profile to skip failing tests

Repository: jclouds
Updated Branches:
  refs/heads/gsoc2016-ivan 6bff97b6d -> 300261b24


Add S3Proxy profile to skip failing tests


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

Branch: refs/heads/gsoc2016-ivan
Commit: 08e78c979e6c241bebbb1d451d8359b3c49e7205
Parents: 6bff97b
Author: Andrew Gaul <ga...@apache.org>
Authored: Mon Jul 11 14:17:33 2016 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Mon Jul 11 16:42:09 2016 -0700

----------------------------------------------------------------------
 apis/s3/pom.xml                                 | 23 ++++++++++++++++++++
 .../java/org/jclouds/s3/S3ClientLiveTest.java   |  4 ++++
 .../integration/S3ContainerLiveTest.java        | 22 +++++++++++++++++++
 .../jclouds/s3/services/BucketsLiveTest.java    |  3 +++
 4 files changed, 52 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/08e78c97/apis/s3/pom.xml
----------------------------------------------------------------------
diff --git a/apis/s3/pom.xml b/apis/s3/pom.xml
index 8f4c738..37e764c 100644
--- a/apis/s3/pom.xml
+++ b/apis/s3/pom.xml
@@ -139,6 +139,29 @@
         </plugins>
       </build>
     </profile>
+    <profile>
+      <id>s3proxy</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <executions>
+              <execution>
+                <id>integration</id>
+                <phase>integration-test</phase>
+                <goals>
+                  <goal>test</goal>
+                </goals>
+                <configuration>
+                  <excludedGroups>fails-on-s3proxy</excludedGroups>
+                </configuration>
+              </execution>
+            </executions>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
   </profiles>
 
 </project>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/08e78c97/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java b/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
index a4b87a1..73a9eff 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/S3ClientLiveTest.java
@@ -111,6 +111,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest {
       return url;
    }
 
+   @Test(groups = {"fails-on-s3proxy"})
    public void testPutCannedAccessPolicyPublic() throws Exception {
       String containerName = getContainerName();
       try {
@@ -130,6 +131,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest {
 
    }
 
+   @Test(groups = {"fails-on-s3proxy"})
    public void testCopyCannedAccessPolicyPublic() throws Exception {
       String containerName = getContainerName();
       String destinationContainer = getContainerName();
@@ -154,6 +156,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest {
    String sourceKey = "apples";
    String destinationKey = "pears";
 
+   @Test(groups = {"fails-on-s3proxy"})
    public void testPublicWriteOnObject() throws InterruptedException, ExecutionException, TimeoutException, IOException {
       final String publicReadWriteObjectKey = "public-read-write-acl";
       final String containerName = getContainerName();
@@ -191,6 +194,7 @@ public class S3ClientLiveTest extends BaseBlobStoreIntegrationTest {
 
    }
 
+   @Test(groups = {"fails-on-s3proxy"})
    public void testUpdateObjectACL() throws InterruptedException, ExecutionException, TimeoutException, IOException {
       String containerName = getContainerName();
       try {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/08e78c97/apis/s3/src/test/java/org/jclouds/s3/blobstore/integration/S3ContainerLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/test/java/org/jclouds/s3/blobstore/integration/S3ContainerLiveTest.java b/apis/s3/src/test/java/org/jclouds/s3/blobstore/integration/S3ContainerLiveTest.java
index 7c90ea6..48e7dc7 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/blobstore/integration/S3ContainerLiveTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/blobstore/integration/S3ContainerLiveTest.java
@@ -16,6 +16,9 @@
  */
 package org.jclouds.s3.blobstore.integration;
 
+import java.io.IOException;
+import java.net.MalformedURLException;
+
 import org.jclouds.blobstore.integration.internal.BaseBlobStoreIntegrationTest;
 import org.jclouds.blobstore.integration.internal.BaseContainerLiveTest;
 import org.testng.annotations.Test;
@@ -27,4 +30,23 @@ public class S3ContainerLiveTest extends BaseContainerLiveTest {
       provider = "s3";
       BaseBlobStoreIntegrationTest.SANITY_CHECK_RETURNED_BUCKET_NAME = true;
    }
+
+   @Override
+   @Test(groups = {"live", "fails-on-s3proxy"})
+   public void testPublicAccess() throws InterruptedException, MalformedURLException, IOException {
+      super.testPublicAccess();
+   }
+
+   @Override
+   @Test(groups = {"live", "fails-on-s3proxy"}, dependsOnMethods = "testPublicAccess")
+   public void testPublicAccessInNonDefaultLocation() throws InterruptedException, MalformedURLException, IOException {
+      super.testPublicAccessInNonDefaultLocation();
+   }
+
+   @Override
+   @Test(groups = {"live", "fails-on-s3proxy"}, dependsOnMethods = "testPublicAccess")
+   public void testPublicAccessInNonDefaultLocationWithBigBlob() throws InterruptedException, MalformedURLException,
+            IOException {
+      super.testPublicAccessInNonDefaultLocationWithBigBlob();
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/08e78c97/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java b/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java
index bb9891f..285f72b 100644
--- a/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java
+++ b/apis/s3/src/test/java/org/jclouds/s3/services/BucketsLiveTest.java
@@ -108,6 +108,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest {
 
    }
 
+   @Test(groups = {"fails-on-s3proxy"})
    public void testUpdateBucketACL() throws InterruptedException, ExecutionException, TimeoutException, IOException,
          Exception {
       String bucketName = getContainerName();
@@ -177,6 +178,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest {
 
    }
 
+   @Test(groups = {"fails-on-s3proxy"})
    public void testBucketPayer() throws Exception {
       final String bucketName = getContainerName();
       try {
@@ -207,6 +209,7 @@ public class BucketsLiveTest extends BaseBlobStoreIntegrationTest {
       }
    }
 
+   @Test(groups = {"fails-on-s3proxy"})
    public void testBucketLogging() throws Exception {
       final String bucketName = getContainerName();
       final String targetBucket = getContainerName();


[07/12] jclouds git commit: [JCLOUDS-1147] upgrade snakeyaml version in byon and resolve removed deprecated Loader class

Posted by na...@apache.org.
[JCLOUDS-1147] upgrade snakeyaml version in byon and resolve removed deprecated Loader class


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

Branch: refs/heads/gsoc2016-ivan
Commit: 0616b865edcf9d082a95000cd3834fc0a6893b81
Parents: e7bf9b1
Author: Josef Cacek <jc...@redhat.com>
Authored: Tue Aug 2 14:37:56 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Aug 2 15:28:41 2016 +0200

----------------------------------------------------------------------
 apis/byon/pom.xml                                              | 2 +-
 apis/byon/src/main/java/org/jclouds/byon/domain/YamlNode.java  | 5 +----
 .../java/org/jclouds/byon/functions/NodesFromYamlStream.java   | 6 +-----
 3 files changed, 3 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/0616b865/apis/byon/pom.xml
----------------------------------------------------------------------
diff --git a/apis/byon/pom.xml b/apis/byon/pom.xml
index 6a46eb1..023d77b 100644
--- a/apis/byon/pom.xml
+++ b/apis/byon/pom.xml
@@ -73,7 +73,7 @@
     <dependency>
       <groupId>org.yaml</groupId>
       <artifactId>snakeyaml</artifactId>
-      <version>1.11</version>
+      <version>1.17</version>
     </dependency>
     <dependency>
       <groupId>com.google.auto.service</groupId>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/0616b865/apis/byon/src/main/java/org/jclouds/byon/domain/YamlNode.java
----------------------------------------------------------------------
diff --git a/apis/byon/src/main/java/org/jclouds/byon/domain/YamlNode.java b/apis/byon/src/main/java/org/jclouds/byon/domain/YamlNode.java
index 65aa991..8cbbdc0 100644
--- a/apis/byon/src/main/java/org/jclouds/byon/domain/YamlNode.java
+++ b/apis/byon/src/main/java/org/jclouds/byon/domain/YamlNode.java
@@ -25,7 +25,6 @@ import java.util.Map;
 import org.jclouds.byon.Node;
 import org.jclouds.util.Closeables2;
 import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.Loader;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.Constructor;
 
@@ -109,12 +108,10 @@ public class YamlNode {
       public YamlNode apply(ByteSource byteSource) {
          if (byteSource == null)
             return null;
-         // note that snakeyaml also throws nosuchmethod error when you use the non-deprecated
-         // constructor
          InputStream in = null;
          try {
             in = byteSource.openStream();
-            return (YamlNode) new Yaml(new Loader(new Constructor(YamlNode.class))).load(in);
+            return (YamlNode) new Yaml(new Constructor(YamlNode.class)).load(in);
          } catch (IOException ioe) {
             throw Throwables.propagate(ioe);
          } finally {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/0616b865/apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYamlStream.java
----------------------------------------------------------------------
diff --git a/apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYamlStream.java b/apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYamlStream.java
index 45a931f..18454e1 100644
--- a/apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYamlStream.java
+++ b/apis/byon/src/main/java/org/jclouds/byon/functions/NodesFromYamlStream.java
@@ -29,7 +29,6 @@ import javax.inject.Singleton;
 
 import org.jclouds.byon.Node;
 import org.jclouds.byon.domain.YamlNode;
-import org.yaml.snakeyaml.Loader;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.Constructor;
@@ -90,10 +89,7 @@ public class NodesFromYamlStream implements Function<ByteSource, LoadingCache<St
       TypeDescription configDesc = new TypeDescription(Config.class);
       configDesc.putListPropertyType("nodes", YamlNode.class);
       constructor.addTypeDescription(configDesc);
-      // note that snakeyaml also throws nosuchmethod error when you use the
-      // non-deprecated
-      // constructor
-      Yaml yaml = new Yaml(new Loader(constructor));
+      Yaml yaml = new Yaml(constructor);
       Config config;
       InputStream in = null;
       try {


[10/12] jclouds git commit: Always take into account the configured template builder spec when building a template in live tests

Posted by na...@apache.org.
Always take into account the configured template builder spec when building a template in live tests


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

Branch: refs/heads/gsoc2016-ivan
Commit: 80ec2aa632dd5bc2ccf6abcc10745eecc3df0363
Parents: 93028b7
Author: Ignasi Barrera <na...@apache.org>
Authored: Wed Aug 10 01:20:22 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Aug 10 01:20:22 2016 +0200

----------------------------------------------------------------------
 .../features/FirewallApiLiveTest.java           |  2 +-
 .../features/LoadBalancerApiLiveTest.java       |  2 +-
 .../features/SecurityGroupApiLiveTest.java      |  4 +--
 .../features/TemplateApiLiveTest.java           |  2 +-
 .../features/VirtualMachineApiLiveTest.java     |  4 +--
 ...taticNATVirtualMachineInNetworkLiveTest.java |  2 +-
 .../internal/BaseComputeServiceLiveTest.java    | 26 +++++++++++++-------
 ...aseGenericComputeServiceContextLiveTest.java | 12 ++++-----
 .../internal/BaseTemplateBuilderLiveTest.java   |  6 +++--
 9 files changed, 35 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/80ec2aa6/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/FirewallApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/FirewallApiLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/FirewallApiLiveTest.java
index 13269a7..3996577 100644
--- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/FirewallApiLiveTest.java
+++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/FirewallApiLiveTest.java
@@ -71,7 +71,7 @@ public class FirewallApiLiveTest extends BaseCloudStackApiLiveTest {
                }
             }));
 
-         String defaultTemplate = template != null ? template.getImageId() : null;
+         String defaultTemplate = templateBuilderSpec != null ? templateBuilderSpec.getImageId() : null;
 
          vm = VirtualMachineApiLiveTest.createVirtualMachineInNetwork(network,
             defaultTemplateOrPreferredInZone(defaultTemplate, client, network.getZoneId()),

http://git-wip-us.apache.org/repos/asf/jclouds/blob/80ec2aa6/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiLiveTest.java
index 8a02b49..eced10e 100644
--- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiLiveTest.java
+++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/LoadBalancerApiLiveTest.java
@@ -86,7 +86,7 @@ public class LoadBalancerApiLiveTest extends BaseCloudStackApiLiveTest {
    public void testCreateVm() {
       if (networksDisabled)
          return;
-      String defaultTemplate = template != null ? template.getImageId() : null;
+      String defaultTemplate = templateBuilderSpec != null ? templateBuilderSpec.getImageId() : null;
       vm = VirtualMachineApiLiveTest.createVirtualMachineInNetwork(network,
             defaultTemplateOrPreferredInZone(defaultTemplate, client, network.getZoneId()),
             client, jobComplete, virtualMachineRunning);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/80ec2aa6/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/SecurityGroupApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/SecurityGroupApiLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/SecurityGroupApiLiveTest.java
index ab07d43..943ebee 100644
--- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/SecurityGroupApiLiveTest.java
+++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/SecurityGroupApiLiveTest.java
@@ -174,7 +174,7 @@ public class SecurityGroupApiLiveTest extends BaseCloudStackApiLiveTest {
    @Test(dependsOnMethods = "testCreateIngress")
    public void testCreateVMInSecurityGroup() throws Exception {
       skipIfSecurityGroupsNotSupported();
-      String defaultTemplate = template != null ? template.getImageId() : null;
+      String defaultTemplate = templateBuilderSpec != null ? templateBuilderSpec.getImageId() : null;
       vm = VirtualMachineApiLiveTest.createVirtualMachineWithSecurityGroupInZone(zone.getId(),
             defaultTemplateOrPreferredInZone(defaultTemplate, client, zone.getId()), group.getId(), client,
             jobComplete, virtualMachineRunning);
@@ -204,7 +204,7 @@ public class SecurityGroupApiLiveTest extends BaseCloudStackApiLiveTest {
    @Test
    public void testCreateVMWithoutSecurityGroupAssignsDefault() throws Exception {
       skipIfSecurityGroupsNotSupported();
-      String defaultTemplate = template != null ? template.getImageId() : null;
+      String defaultTemplate = templateBuilderSpec != null ? templateBuilderSpec.getImageId() : null;
       VirtualMachine newVm = VirtualMachineApiLiveTest.createVirtualMachineWithOptionsInZone(DeployVirtualMachineOptions.NONE,
             zone.getId(), defaultTemplateOrPreferredInZone(defaultTemplate, client, zone.getId()), client,
             jobComplete, virtualMachineRunning);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/80ec2aa6/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateApiLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateApiLiveTest.java
index d85cd05..2c1ebe7 100644
--- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateApiLiveTest.java
+++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/TemplateApiLiveTest.java
@@ -110,7 +110,7 @@ public class TemplateApiLiveTest extends BaseCloudStackApiLiveTest {
       assertNotNull(network);
 
       // Create a VM and stop it
-      String defaultTemplate = template != null ? template.getImageId() : null;
+      String defaultTemplate = templateBuilderSpec != null ? templateBuilderSpec.getImageId() : null;
       vmForCreation = VirtualMachineApiLiveTest.createVirtualMachineInNetwork(network, defaultTemplate, client, jobComplete, virtualMachineRunning);
       assertTrue(jobComplete.apply(client.getVirtualMachineApi().stopVirtualMachine(vmForCreation.getId())), vmForCreation.toString());
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/80ec2aa6/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/VirtualMachineApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/VirtualMachineApiLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/VirtualMachineApiLiveTest.java
index 1b33bb5..36c01aa 100644
--- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/VirtualMachineApiLiveTest.java
+++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/features/VirtualMachineApiLiveTest.java
@@ -176,7 +176,7 @@ public class VirtualMachineApiLiveTest extends BaseCloudStackApiLiveTest {
 
    @Test
    public void testCreateVirtualMachine() throws Exception {
-      String defaultTemplate = template != null ? template.getImageId() : null;
+      String defaultTemplate = templateBuilderSpec != null ? templateBuilderSpec.getImageId() : null;
       vm = createVirtualMachine(client, defaultTemplate, jobComplete, virtualMachineRunning);
       if (vm.getPassword() != null) {
          conditionallyCheckSSH();
@@ -190,7 +190,7 @@ public class VirtualMachineApiLiveTest extends BaseCloudStackApiLiveTest {
    public void testCreateVirtualMachineWithSpecificIp() throws Exception {
       skipIfNotGlobalAdmin();
 
-      String defaultTemplate = template != null ? template.getImageId() : null;
+      String defaultTemplate = templateBuilderSpec != null ? templateBuilderSpec.getImageId() : null;
       Network network = null;
 
       try {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/80ec2aa6/apis/cloudstack/src/test/java/org/jclouds/cloudstack/functions/StaticNATVirtualMachineInNetworkLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/functions/StaticNATVirtualMachineInNetworkLiveTest.java b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/functions/StaticNATVirtualMachineInNetworkLiveTest.java
index 75bfd18..0bb726c 100644
--- a/apis/cloudstack/src/test/java/org/jclouds/cloudstack/functions/StaticNATVirtualMachineInNetworkLiveTest.java
+++ b/apis/cloudstack/src/test/java/org/jclouds/cloudstack/functions/StaticNATVirtualMachineInNetworkLiveTest.java
@@ -58,7 +58,7 @@ public class StaticNATVirtualMachineInNetworkLiveTest extends NATApiLiveTest {
       prefix += "nat";
       try {
          network = find(client.getNetworkApi().listNetworks(), NetworkPredicates.supportsStaticNAT());
-         String defaultTemplate = template != null ? template.getImageId() : null;
+         String defaultTemplate = templateBuilderSpec != null ? templateBuilderSpec.getImageId() : null;
          vm = VirtualMachineApiLiveTest.createVirtualMachineInNetwork(network,
                defaultTemplateOrPreferredInZone(defaultTemplate, client, network.getZoneId()), client, jobComplete,
                virtualMachineRunning);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/80ec2aa6/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
index 3169c81..5db3d32 100644
--- a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
+++ b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
@@ -218,7 +218,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
       } catch (Exception e) {
 
       }
-      template = buildTemplate(client.templateBuilder());
+      template = buildTemplate(templateBuilder());
       template.getOptions().blockOnPort(22, 120);
       try {
          Set<? extends NodeMetadata> nodes = client.createNodesInGroup(group, 1, template);
@@ -274,7 +274,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
       } catch (Exception e) {
 
       }
-      template = buildTemplate(client.templateBuilder());
+      template = buildTemplate(templateBuilder());
       try {
          Set<? extends NodeMetadata> nodes = client.createNodesInGroup(group, 1, template);
          NodeMetadata node = getOnlyElement(nodes);
@@ -333,7 +333,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
 
    @Test(enabled = true, dependsOnMethods = { "testImagesCache" })
    public void testTemplateMatch() throws Exception {
-      template = buildTemplate(client.templateBuilder());
+      template = buildTemplate(templateBuilder());
       Template toMatch = client.templateBuilder().imageId(template.getImage().getId()).build();
       assertEquals(toMatch.getImage(), template.getImage());
    }
@@ -374,7 +374,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
 
    @Test(enabled = true, dependsOnMethods = "testCreateTwoNodesWithRunScript")
    public void testCreateTwoNodesWithOneSpecifiedName() throws Exception {
-      template = buildTemplate(client.templateBuilder());
+      template = buildTemplate(templateBuilder());
       template.getOptions().nodeNames(ImmutableSet.of("first-node"));
       Set<? extends NodeMetadata> nodes;
       try {
@@ -399,7 +399,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
    }
 
    protected Template refreshTemplate() {
-      return template = addRunScriptToTemplate(buildTemplate(client.templateBuilder()));
+      return template = addRunScriptToTemplate(buildTemplate(templateBuilder()));
    }
 
    protected Template addRunScriptToTemplate(Template template) {
@@ -437,7 +437,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
 
       if (existingLocationIsAssignable) {
          getAnonymousLogger().info("creating another node based on existing nodes' location: " + existingLocation);
-         template = buildTemplate(client.templateBuilder());
+         template = buildTemplate(templateBuilder());
          template = addRunScriptToTemplate(client.templateBuilder().fromTemplate(template)
                .locationId(existingLocation.getId()).build());
       } else {
@@ -472,7 +472,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
             final int groupNum = i;
             final String group = "twin" + groupNum;
             groups.add(group);
-            template = buildTemplate(client.templateBuilder());
+            template = buildTemplate(templateBuilder());
             template.getOptions().inboundPorts(22, 8080).blockOnPort(22, 300 + groupNum);
             ListenableFuture<NodeMetadata> future = userExecutor.submit(new Callable<NodeMetadata>() {
                public NodeMetadata call() throws Exception {
@@ -524,6 +524,14 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
       }
    }
 
+   protected TemplateBuilder templateBuilder() {
+      TemplateBuilder templateBuilder =  client.templateBuilder();
+      if (templateBuilderSpec != null) {
+         templateBuilder = templateBuilder.from(templateBuilderSpec);
+      }
+      return templateBuilder;
+   }
+
    protected Template buildTemplate(TemplateBuilder templateBuilder) {
       return templateBuilder.build();
    }
@@ -731,7 +739,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
       ImmutableSet<String> tags = ImmutableSet.of(group);
       Stopwatch watch = Stopwatch.createStarted();
 
-      template = buildTemplate(client.templateBuilder());
+      template = buildTemplate(templateBuilder());
       template.getOptions().inboundPorts(22, 8080).blockOnPort(22, 300).userMetadata(userMetadata).tags(tags);
 
       NodeMetadata node = getOnlyElement(client.createNodesInGroup(group, 1, template));
@@ -834,7 +842,7 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
 
       }
       // no inbound ports
-      template = buildTemplate(client.templateBuilder());
+      template = buildTemplate(templateBuilder());
       template.getOptions().blockUntilRunning(false).inboundPorts();
       try {
          long time = currentTimeMillis();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/80ec2aa6/compute/src/test/java/org/jclouds/compute/internal/BaseGenericComputeServiceContextLiveTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/internal/BaseGenericComputeServiceContextLiveTest.java b/compute/src/test/java/org/jclouds/compute/internal/BaseGenericComputeServiceContextLiveTest.java
index a54579d..4b7043b 100644
--- a/compute/src/test/java/org/jclouds/compute/internal/BaseGenericComputeServiceContextLiveTest.java
+++ b/compute/src/test/java/org/jclouds/compute/internal/BaseGenericComputeServiceContextLiveTest.java
@@ -35,7 +35,7 @@ import com.google.inject.util.Modules;
 
 public abstract class BaseGenericComputeServiceContextLiveTest<W extends ComputeServiceContext> extends BaseViewLiveTest<W> {
 
-   protected TemplateBuilderSpec template;
+   protected TemplateBuilderSpec templateBuilderSpec;
    protected LoginCredentials loginCredentials = LoginCredentials.builder().user("root").build();
 
    // isolate tests from eachother, as default credentialStore is static
@@ -47,15 +47,15 @@ public abstract class BaseGenericComputeServiceContextLiveTest<W extends Compute
       Properties overrides = super.setupProperties();
       String spec = setIfTestSystemPropertyPresent(overrides, provider + ".template");
       if (spec != null) {
-         template = TemplateBuilderSpec.parse(spec);
-         if (template.getLoginUser() != null) {
-            Iterable<String> userPass = Splitter.on(':').split(template.getLoginUser());
+         templateBuilderSpec = TemplateBuilderSpec.parse(spec);
+         if (templateBuilderSpec.getLoginUser() != null) {
+            Iterable<String> userPass = Splitter.on(':').split(templateBuilderSpec.getLoginUser());
             Builder loginCredentialsBuilder = LoginCredentials.builder();
             loginCredentialsBuilder.user(Iterables.get(userPass, 0));
             if (Iterables.size(userPass) == 2)
                loginCredentialsBuilder.password(Iterables.get(userPass, 1));
-            if (template.getAuthenticateSudo() != null)
-               loginCredentialsBuilder.authenticateSudo(template.getAuthenticateSudo());
+            if (templateBuilderSpec.getAuthenticateSudo() != null)
+               loginCredentialsBuilder.authenticateSudo(templateBuilderSpec.getAuthenticateSudo());
             loginCredentials = loginCredentialsBuilder.build();
          }
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/80ec2aa6/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java b/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java
index 8792cd1..29b543f 100644
--- a/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java
+++ b/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java
@@ -191,9 +191,11 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseComputeServiceCont
       ComputeServiceContext context = null;
       try {
          Properties overrides = setupProperties();
-         String login = template != null && template.getLoginUser() != null ? template.getLoginUser() : "foo:bar";
+         String login = templateBuilderSpec != null && templateBuilderSpec.getLoginUser() != null ? templateBuilderSpec
+               .getLoginUser() : "foo:bar";
          overrides.setProperty(propertyKey + ".image.login-user", login);
-         boolean auth = template != null && template.getAuthenticateSudo() != null ? template.getAuthenticateSudo() : true;
+         boolean auth = templateBuilderSpec != null && templateBuilderSpec.getAuthenticateSudo() != null ? templateBuilderSpec
+               .getAuthenticateSudo() : true;
          overrides.setProperty(propertyKey + ".image.authenticate-sudo", auth + "");
 
          context = createView(overrides, ImmutableSet.<Module>of(credentialStoreModule));


[04/12] jclouds git commit: Parallel upload for BaseBlobStore

Posted by na...@apache.org.
Parallel upload for BaseBlobStore


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

Branch: refs/heads/gsoc2016-ivan
Commit: 42079e1392fb5b2b792f518812689854c375445f
Parents: a515ce2
Author: Zack Shoylev <za...@rackspace.com>
Authored: Thu Jul 7 16:39:04 2016 -0500
Committer: Zack Shoylev <za...@rackspace.com>
Committed: Fri Jul 15 04:15:17 2016 -0500

----------------------------------------------------------------------
 .../blobstore/RegionScopedSwiftBlobStore.java   |  1 -
 .../blobstore/internal/BaseBlobStore.java       | 80 +++++++++++++++-----
 2 files changed, 62 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/42079e13/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java
----------------------------------------------------------------------
diff --git a/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java b/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java
index 63f4315..0b29f1f 100644
--- a/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java
+++ b/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/blobstore/RegionScopedSwiftBlobStore.java
@@ -608,7 +608,6 @@ public class RegionScopedSwiftBlobStore implements BlobStore {
       }
    }
 
-   // copied from BaseBlobStore
    @Beta
    protected String putMultipartBlob(String container, Blob blob, PutOptions overrides, ListeningExecutorService executor) {
       ArrayList<ListenableFuture<MultipartPart>> parts = new ArrayList<ListenableFuture<MultipartPart>>();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/42079e13/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
index 818a154..21ae2ff 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/internal/BaseBlobStore.java
@@ -18,17 +18,20 @@ package org.jclouds.blobstore.internal;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
+import static org.jclouds.Constants.PROPERTY_USER_THREADS;
 import static org.jclouds.blobstore.options.ListContainerOptions.Builder.recursive;
 import static org.jclouds.util.Predicates2.retry;
 
 import java.io.InputStream;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Callable;
 
 import javax.inject.Inject;
+import javax.inject.Named;
 
 import org.jclouds.blobstore.BlobStore;
 import org.jclouds.blobstore.BlobStoreContext;
@@ -57,10 +60,13 @@ import org.jclouds.io.PayloadSlicer;
 import org.jclouds.util.Closeables2;
 
 import com.google.common.annotations.Beta;
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
 import com.google.common.base.Throwables;
-import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
 
 public abstract class BaseBlobStore implements BlobStore {
 
@@ -96,7 +102,7 @@ public abstract class BaseBlobStore implements BlobStore {
    /**
     * This implementation invokes
     * {@link #list(String,org.jclouds.blobstore.options.ListContainerOptions)}
-    * 
+    *
     * @param container
     *           container name
     */
@@ -107,7 +113,7 @@ public abstract class BaseBlobStore implements BlobStore {
 
    /**
     * This implementation invokes {@link BlobUtilsImpl#directoryExists}
-    * 
+    *
     * @param container
     *           container name
     * @param directory
@@ -120,7 +126,7 @@ public abstract class BaseBlobStore implements BlobStore {
 
    /**
     * This implementation invokes {@link BlobUtilsImpl#createDirectory}
-    * 
+    *
     * @param container
     *           container name
     * @param directory
@@ -141,7 +147,7 @@ public abstract class BaseBlobStore implements BlobStore {
    /**
     * This implementation invokes {@link #countBlobs} with the
     * {@link ListContainerOptions#recursive} option.
-    * 
+    *
     * @param container
     *           container name
     */
@@ -152,7 +158,7 @@ public abstract class BaseBlobStore implements BlobStore {
 
    /**
     * This implementation invokes {@link BlobUtilsImpl#countBlobs}
-    * 
+    *
     * @param container
     *           container name
     */
@@ -164,7 +170,7 @@ public abstract class BaseBlobStore implements BlobStore {
    /**
     * This implementation invokes {@link #clearContainer} with the
     * {@link ListContainerOptions#recursive} option.
-    * 
+    *
     * @param container
     *           container name
     */
@@ -175,7 +181,7 @@ public abstract class BaseBlobStore implements BlobStore {
 
    /**
     * This implementation invokes {@link BlobUtilsImpl#clearContainer}
-    * 
+    *
     * @param container
     *           container name
     */
@@ -186,7 +192,7 @@ public abstract class BaseBlobStore implements BlobStore {
 
    /**
     * This implementation invokes {@link BlobUtilsImpl#deleteDirectory}.
-    * 
+    *
     * @param container
     *           container name
     */
@@ -198,7 +204,7 @@ public abstract class BaseBlobStore implements BlobStore {
    /**
     * This implementation invokes
     * {@link #getBlob(String,String,org.jclouds.blobstore.options.GetOptions)}
-    * 
+    *
     * @param container
     *           container name
     * @param key
@@ -211,7 +217,7 @@ public abstract class BaseBlobStore implements BlobStore {
 
    /**
     * This implementation invokes {@link #deleteAndEnsurePathGone}
-    * 
+    *
     * @param container
     *           bucket name
     */
@@ -320,29 +326,67 @@ public abstract class BaseBlobStore implements BlobStore {
       }
    }
 
-   // TODO: parallel uploads
+   @com.google.inject.Inject
+   @Named(PROPERTY_USER_THREADS)
+   @VisibleForTesting
+   ListeningExecutorService userExecutor;
+
+   /**
+    * Upload using a user-provided executor, or the jclouds userExecutor
+    *
+    * @param container
+    * @param blob
+    * @param overrides
+    * @return the multipart blob etag
+    */
    @Beta
    protected String putMultipartBlob(String container, Blob blob, PutOptions overrides) {
+      if (overrides.getUseCustomExecutor()) {
+         return putMultipartBlob(container, blob, overrides, overrides.getCustomExecutor());
+      } else {
+         return putMultipartBlob(container, blob, overrides, userExecutor);
+      }
+   }
+
+   @Beta
+   protected String putMultipartBlob(String container, Blob blob, PutOptions overrides, ListeningExecutorService executor) {
+      ArrayList<ListenableFuture<MultipartPart>> parts = new ArrayList<ListenableFuture<MultipartPart>>();
       MultipartUpload mpu = initiateMultipartUpload(container, blob.getMetadata(), overrides);
       try {
-         List<MultipartPart> parts = Lists.newArrayList();
          long contentLength = blob.getMetadata().getContentMetadata().getContentLength();
          MultipartUploadSlicingAlgorithm algorithm = new MultipartUploadSlicingAlgorithm(
                getMinimumMultipartPartSize(), getMaximumMultipartPartSize(), getMaximumNumberOfParts());
          long partSize = algorithm.calculateChunkSize(contentLength);
          int partNumber = 1;
          for (Payload payload : slicer.slice(blob.getPayload(), partSize)) {
-            MultipartPart part = uploadMultipartPart(mpu, partNumber, payload);
-            parts.add(part);
-            ++partNumber;
+            BlobUploader b =
+                  new BlobUploader(mpu, partNumber++, payload);
+            parts.add(executor.submit(b));
          }
-         return completeMultipartUpload(mpu, parts);
+         return completeMultipartUpload(mpu, Futures.getUnchecked(Futures.allAsList(parts)));
       } catch (RuntimeException re) {
          abortMultipartUpload(mpu);
          throw re;
       }
    }
 
+   private final class BlobUploader implements Callable<MultipartPart> {
+      private final MultipartUpload mpu;
+      private final int partNumber;
+      private final Payload payload;
+
+      BlobUploader(MultipartUpload mpu, int partNumber, Payload payload) {
+         this.mpu = mpu;
+         this.partNumber = partNumber;
+         this.payload = payload;
+      }
+
+      @Override
+      public MultipartPart call() {
+         return uploadMultipartPart(mpu, partNumber, payload);
+      }
+   }
+
    private static HttpResponseException returnResponseException(int code) {
       HttpResponse response = HttpResponse.builder().statusCode(code).build();
       // TODO: bogus endpoint


[05/12] jclouds git commit: Isolate the task cancellation in a test

Posted by na...@apache.org.
Isolate the task cancellation in a test


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

Branch: refs/heads/gsoc2016-ivan
Commit: 87154bf89e66e7a101b4c5c28103775c9d80b548
Parents: 42079e1
Author: Ignasi Barrera <na...@apache.org>
Authored: Mon Jul 11 16:10:44 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Jul 18 08:09:30 2016 +0200

----------------------------------------------------------------------
 .../StubComputeServiceIntegrationTest.java      |  5 ++--
 .../internal/BaseComputeServiceLiveTest.java    | 26 +++++++++++++++-----
 2 files changed, 22 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/87154bf8/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java
index 9c9157b..9c546f4 100644
--- a/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java
+++ b/compute/src/test/java/org/jclouds/compute/StubComputeServiceIntegrationTest.java
@@ -27,7 +27,6 @@ import static org.testng.Assert.assertEquals;
 import java.io.IOException;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
 import org.easymock.IArgumentMatcher;
@@ -452,10 +451,10 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes
    public void testAScriptExecutionAfterBootWithBasicTemplate() throws Exception {
       super.testAScriptExecutionAfterBootWithBasicTemplate();
    }
-   
+
    @Test(enabled = false)
    @Override
-   public void weCanCancelTasks(NodeMetadata node) throws InterruptedException, ExecutionException {
+   public void testWeCanCancelTasks() throws Exception {
       // not sure how to do multithreading in a mock so that tests can work
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/87154bf8/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
index c4f3833..3169c81 100644
--- a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
+++ b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
@@ -251,7 +251,6 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
                .adminUsername("foo").adminHome("/over/ridden/foo").build(), nameTask("adminUpdate"));
 
          response = future.get(3, TimeUnit.MINUTES);
-
          assert response.getExitStatus() == 0 : node.getId() + ": " + response;
 
          node = client.getNodeMetadata(node.getId());
@@ -259,18 +258,31 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
          assertEquals(node.getCredentials().identity, "foo");
          assert node.getCredentials().credential != null : nodes;
 
-         weCanCancelTasks(node);
-
-         assert response.getExitStatus() == 0 : node.getId() + ": " + response;
-
          response = client.runScriptOnNode(node.getId(), "echo $USER", wrapInInitScript(false).runAsRoot(false));
-
          assert response.getOutput().trim().equals("foo") : node.getId() + ": " + response;
 
       } finally {
          client.destroyNodesMatching(inGroup(group));
       }
    }
+   
+   @Test
+   public void testWeCanCancelTasks() throws Exception {
+      String group = this.group + "w";
+      try {
+         client.destroyNodesMatching(inGroup(group));
+      } catch (Exception e) {
+
+      }
+      template = buildTemplate(client.templateBuilder());
+      try {
+         Set<? extends NodeMetadata> nodes = client.createNodesInGroup(group, 1, template);
+         NodeMetadata node = getOnlyElement(nodes);
+         weCanCancelTasks(node);
+      } finally {
+         client.destroyNodesMatching(inGroup(group));
+      }
+   }
 
    @Test(enabled = false)
    protected void tryBadPassword(String group, Credentials good) throws AssertionError {
@@ -806,6 +818,8 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
                provider2 = location.getParent().getParent();
             assertProvider(provider2);
             break;
+         default:
+            break;
          }
       }
    }


[08/12] jclouds git commit: add support for security groups

Posted by na...@apache.org.
add support for security groups


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

Branch: refs/heads/gsoc2016-ivan
Commit: deeedd55e83f1d3551820f6dc92fbd497a9ba2e9
Parents: 0616b86
Author: Andrea Turli <an...@gmail.com>
Authored: Tue Aug 2 11:58:15 2016 +0200
Committer: Andrea Turli <an...@gmail.com>
Committed: Tue Aug 2 16:46:04 2016 +0200

----------------------------------------------------------------------
 .../GoogleComputeEngineServiceAdapter.java      | 42 ++++++++------------
 ...desWithGroupEncodedIntoNameThenAddToSet.java | 25 ++++++++++++
 2 files changed, 41 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/deeedd55/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
index 1610b7d..07ee1f3 100644
--- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceAdapter.java
@@ -22,29 +22,17 @@ import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Lists.newArrayList;
 import static java.lang.String.format;
 import static org.jclouds.googlecloud.internal.ListPages.concat;
-import static org.jclouds.googlecomputeengine.compute.strategy.CreateNodesWithGroupEncodedIntoNameThenAddToSet.simplifyPorts;
 import static org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperties.IMAGE_PROJECTS;
 
-import javax.inject.Inject;
-import javax.inject.Named;
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
 
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.Atomics;
-import com.google.common.util.concurrent.UncheckedTimeoutException;
+import javax.inject.Inject;
+import javax.inject.Named;
+
 import org.jclouds.compute.ComputeServiceAdapter;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.NodeMetadata;
@@ -74,6 +62,18 @@ import org.jclouds.googlecomputeengine.domain.Zone;
 import org.jclouds.googlecomputeengine.features.InstanceApi;
 import org.jclouds.location.suppliers.all.JustProvider;
 
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Splitter;
+import com.google.common.base.Strings;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.Atomics;
+import com.google.common.util.concurrent.UncheckedTimeoutException;
+
 /**
  * This implementation maps the following:
  * <ul>
@@ -136,16 +136,6 @@ public final class GoogleComputeEngineServiceAdapter
       URI network = URI.create(networks.next());
       assert !networks.hasNext() : "Error: Options should specify only one network";
 
-      // Add tags from template
-      ArrayList<String> tags = new ArrayList<String>(options.getTags());
-
-      // Add tags for firewalls
-      FirewallTagNamingConvention naming = firewallTagNamingConvention.get(group);
-      List<String> ports = simplifyPorts(options.getInboundPorts());
-      if (ports != null){
-         tags.add(naming.name(ports));
-      }
-
       Scheduling scheduling = getScheduling(options);
 
       NewInstance newInstance = new NewInstance.Builder( name,
@@ -153,7 +143,7 @@ public final class GoogleComputeEngineServiceAdapter
             network,
             disks)
             .description(group)
-            .tags(Tags.create(null, ImmutableList.copyOf(tags)))
+            .tags(Tags.create(null, ImmutableList.copyOf(options.getTags())))
             .serviceAccounts(options.serviceAccounts())
             .scheduling(scheduling)
             .build();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/deeedd55/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
index 20bc2c3..1731cec 100644
--- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
@@ -58,6 +58,7 @@ import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Atomics;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
@@ -163,7 +164,21 @@ public final class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends
    private void getOrCreateFirewalls(GoogleComputeEngineTemplateOptions templateOptions, Network network,
          FirewallTagNamingConvention naming) {
 
+      Set<String> tags = Sets.newHashSet(templateOptions.getTags());
+
       FirewallApi firewallApi = api.firewalls();
+
+      if (!templateOptions.getGroups().isEmpty()) {
+         for (String firewallName : templateOptions.getGroups()) {
+            Firewall firewall = firewallApi.get(firewallName);
+            validateFirewall(firewall, network);
+            if (!firewall.targetTags().isEmpty()) {
+               // Add tags coming from firewalls
+               tags.addAll(firewall.targetTags());
+            }
+         }
+      }
+
       int[] inboundPorts = templateOptions.getInboundPorts();
       if ((inboundPorts == null) || inboundPorts.length == 0){
          return;
@@ -186,6 +201,16 @@ public final class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends
          operationDone.apply(operation);
          checkState(operation.get().httpErrorStatusCode() == null, "Could not insert firewall, operation failed %s",
                operation);
+
+         // Add tags for firewalls
+         tags.add(name);
+      }
+      templateOptions.tags(tags);
+   }
+
+   private void validateFirewall(Firewall firewall, Network network) {
+      if (firewall == null || !firewall.network().equals(network.selfLink())) {
+         throw new IllegalArgumentException(String.format("Can't find firewall %s in network %s.", firewall.name(), network));
       }
    }
 


[09/12] jclouds git commit: GCE: fix tags order

Posted by na...@apache.org.
GCE: fix tags order


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

Branch: refs/heads/gsoc2016-ivan
Commit: 93028b7529fe4671d1839cf138cb63c196d0f5eb
Parents: deeedd5
Author: Andrea Turli <an...@gmail.com>
Authored: Tue Aug 2 19:50:12 2016 +0200
Committer: Andrea Turli <an...@gmail.com>
Committed: Tue Aug 2 20:12:45 2016 +0200

----------------------------------------------------------------------
 .../strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/93028b75/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
index 1731cec..5e6cda7 100644
--- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/strategy/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
@@ -164,7 +164,7 @@ public final class CreateNodesWithGroupEncodedIntoNameThenAddToSet extends
    private void getOrCreateFirewalls(GoogleComputeEngineTemplateOptions templateOptions, Network network,
          FirewallTagNamingConvention naming) {
 
-      Set<String> tags = Sets.newHashSet(templateOptions.getTags());
+      Set<String> tags = Sets.newLinkedHashSet(templateOptions.getTags());
 
       FirewallApi firewallApi = api.firewalls();
 


[12/12] jclouds git commit: JCLOUDS-482: Add support for arbitrary CPU and RAM

Posted by na...@apache.org.
JCLOUDS-482: Add support for arbitrary CPU and RAM

This is a combination of 16 commits:

* First approach to ArbitraryCpuRamTemplateBuilderImpl
* Several fixes: refactoring some names, format, identation problems, some missing license headers and generateId method
* Refactored parse utility
* Added GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl to support GCE custom machine URI
* extracted hardware creation to automaticHardwareForCpuAndRam method
* Fixed ide automatic asterisk imports
* correcting WIP base case PR according to comments
* added machineTypeUriToHardware to set custom hardware in nodes
* fix checkstyle violations and other PR comments
* Set the providerId to custom machineType URI and fix adding node log
* Arbitrary hardware tests added to BaseTemplateBuilderLiveTest and GoogleComputeEngineTemplateBuilderLiveTest
* Added two more tests to BaseTemplateBuilderLiveTest
* Move repeated constants to TestUtils to reuse code
* Fix full path in the Hardware id and URI
* Add custom hardware tests to BaseComputeServiceLiveTest and GCEServiceLiveTest
* Change customHardware test to use buildTemplate and fix identation


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

Branch: refs/heads/gsoc2016-ivan
Commit: 300261b248e1b60bbb6d192821cb5580899c4716
Parents: 80ec2aa
Author: Iv�n Lomba <iv...@gmail.com>
Authored: Sat Jun 18 20:27:12 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Aug 10 21:35:03 2016 +0200

----------------------------------------------------------------------
 .../filesystem/FilesystemBlobStoreTest.java     |   6 +-
 .../FilesystemContainerIntegrationTest.java     |  10 +-
 .../FilesystemStorageStrategyImplTest.java      |   6 +-
 .../org/jclouds/filesystem/utils/TestUtils.java |   3 -
 .../oauth/v2/AuthorizationApiLiveTest.java      |   8 +-
 .../org/jclouds/oauth/v2/OAuthTestUtils.java    |   3 -
 .../ArbitraryCpuRamTemplateBuilderImpl.java     |  84 ++++++
 .../domain/internal/TemplateBuilderImpl.java    |  83 +++---
 ...desWithGroupEncodedIntoNameThenAddToSet.java |   4 +-
 .../compute/util/AutomaticHardwareIdSpec.java   |  72 +++++
 .../ArbitraryCpuRamTemplateBuilderImplTest.java | 275 ++++++++++++++++++
 .../internal/BaseComputeServiceLiveTest.java    |  25 ++
 .../internal/BaseTemplateBuilderLiveTest.java   | 103 +++++++
 .../util/AutomaticHardwareIdSpecTest.java       |  52 ++++
 .../test/java/org/jclouds/utils/TestUtils.java  |   3 +
 ...GoogleComputeEngineServiceContextModule.java |   4 +
 ...ngineArbitraryCpuRamTemplateBuilderImpl.java |  59 ++++
 .../functions/InstanceToNodeMetadata.java       |  46 ++-
 .../GoogleComputeEngineServiceLiveTest.java     |  23 +-
 ...gleComputeEngineTemplateBuilderLiveTest.java |  15 +
 ...eArbitraryCpuRamTemplateBuilderImplTest.java | 278 +++++++++++++++++++
 .../functions/InstanceToNodeMetadataTest.java   |  39 ++-
 22 files changed, 1123 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/apis/filesystem/src/test/java/org/jclouds/filesystem/FilesystemBlobStoreTest.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/FilesystemBlobStoreTest.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/FilesystemBlobStoreTest.java
index 88704e3..d27924f 100644
--- a/apis/filesystem/src/test/java/org/jclouds/filesystem/FilesystemBlobStoreTest.java
+++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/FilesystemBlobStoreTest.java
@@ -18,6 +18,8 @@ package org.jclouds.filesystem;
 
 import static com.google.common.io.BaseEncoding.base16;
 import static org.jclouds.filesystem.util.Utils.isMacOSX;
+import static org.jclouds.utils.TestUtils.NO_INVOCATIONS;
+import static org.jclouds.utils.TestUtils.SINGLE_NO_ARG_INVOCATION;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -912,7 +914,7 @@ public class FilesystemBlobStoreTest {
 
     @DataProvider
     public Object[][] ignoreOnMacOSX() {
-        return isMacOSX() ? TestUtils.NO_INVOCATIONS
-                : TestUtils.SINGLE_NO_ARG_INVOCATION;
+        return isMacOSX() ? NO_INVOCATIONS
+                : SINGLE_NO_ARG_INVOCATION;
     }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java
index 7a701a0..7dfdd3a 100644
--- a/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java
+++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/integration/FilesystemContainerIntegrationTest.java
@@ -19,6 +19,8 @@ package org.jclouds.filesystem.integration;
 import static org.jclouds.blobstore.options.ListContainerOptions.Builder.maxResults;
 import static org.jclouds.filesystem.util.Utils.isMacOSX;
 import static org.testng.Assert.assertEquals;
+import static org.jclouds.utils.TestUtils.NO_INVOCATIONS;
+import static org.jclouds.utils.TestUtils.SINGLE_NO_ARG_INVOCATION;
 
 import java.io.IOException;
 import java.util.Properties;
@@ -165,14 +167,14 @@ public class FilesystemContainerIntegrationTest extends BaseContainerIntegration
 
    @DataProvider
    public Object[][] ignoreOnMacOSX() {
-      return isMacOSX() ? TestUtils.NO_INVOCATIONS
-            : TestUtils.SINGLE_NO_ARG_INVOCATION;
+      return isMacOSX() ? NO_INVOCATIONS
+            : SINGLE_NO_ARG_INVOCATION;
    }
 
    @DataProvider
    public Object[][] ignoreOnWindows() {
-      return TestUtils.isWindowsOs() ? TestUtils.NO_INVOCATIONS
-            : TestUtils.SINGLE_NO_ARG_INVOCATION;
+      return TestUtils.isWindowsOs() ? NO_INVOCATIONS
+            : SINGLE_NO_ARG_INVOCATION;
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java
index 3fdd855..9079fa0 100644
--- a/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java
+++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java
@@ -17,6 +17,8 @@
 package org.jclouds.filesystem.strategy.internal;
 
 import static org.jclouds.filesystem.util.Utils.isMacOSX;
+import static org.jclouds.utils.TestUtils.NO_INVOCATIONS;
+import static org.jclouds.utils.TestUtils.SINGLE_NO_ARG_INVOCATION;
 import static org.jclouds.utils.TestUtils.randomByteSource;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
@@ -699,7 +701,7 @@ public class FilesystemStorageStrategyImplTest {
 
    @DataProvider
    public Object[][] ignoreOnMacOSX() {
-        return isMacOSX() ? TestUtils.NO_INVOCATIONS
-                : TestUtils.SINGLE_NO_ARG_INVOCATION;
+        return isMacOSX() ? NO_INVOCATIONS
+                : SINGLE_NO_ARG_INVOCATION;
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/apis/filesystem/src/test/java/org/jclouds/filesystem/utils/TestUtils.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/utils/TestUtils.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/utils/TestUtils.java
index cd0276c..224c21e 100644
--- a/apis/filesystem/src/test/java/org/jclouds/filesystem/utils/TestUtils.java
+++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/utils/TestUtils.java
@@ -54,9 +54,6 @@ public class TestUtils {
     private static final Iterator<File> IMAGE_RESOURCES_ITERATOR =
             Iterators.cycle(IMAGE_RESOURCES);
 
-    public static final Object[][] NO_INVOCATIONS = new Object[0][0];
-    public static final Object[][] SINGLE_NO_ARG_INVOCATION = { new Object[0] };
-
     /**
      * Generate a random blob key simple name (with no path in the key)
      * @return 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/apis/oauth/src/test/java/org/jclouds/oauth/v2/AuthorizationApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/test/java/org/jclouds/oauth/v2/AuthorizationApiLiveTest.java b/apis/oauth/src/test/java/org/jclouds/oauth/v2/AuthorizationApiLiveTest.java
index 5d0d7cf..0aba641 100644
--- a/apis/oauth/src/test/java/org/jclouds/oauth/v2/AuthorizationApiLiveTest.java
+++ b/apis/oauth/src/test/java/org/jclouds/oauth/v2/AuthorizationApiLiveTest.java
@@ -24,6 +24,8 @@ import static org.jclouds.oauth.v2.config.OAuthProperties.AUDIENCE;
 import static org.jclouds.oauth.v2.config.OAuthProperties.CERTIFICATE;
 import static org.jclouds.oauth.v2.config.OAuthProperties.CREDENTIAL_TYPE;
 import static org.jclouds.providers.AnonymousProviderMetadata.forApiOnEndpoint;
+import static org.jclouds.utils.TestUtils.NO_INVOCATIONS;
+import static org.jclouds.utils.TestUtils.SINGLE_NO_ARG_INVOCATION;
 import static org.testng.Assert.assertNotNull;
 
 import java.util.Properties;
@@ -63,19 +65,19 @@ public class AuthorizationApiLiveTest extends BaseApiLiveTest<AuthorizationApi>
    @DataProvider
    public Object[][] onlyRunForP12PrivateKeyCredentials() {
       return (CredentialType.fromValue(credentialType) == CredentialType.P12_PRIVATE_KEY_CREDENTIALS) ?
-            OAuthTestUtils.SINGLE_NO_ARG_INVOCATION : OAuthTestUtils.NO_INVOCATIONS;
+            SINGLE_NO_ARG_INVOCATION : NO_INVOCATIONS;
    }
 
    @DataProvider
    public Object[][] onlyRunForClientCredentialsSecret() {
       return (CredentialType.fromValue(credentialType) == CredentialType.CLIENT_CREDENTIALS_SECRET) ?
-              OAuthTestUtils.SINGLE_NO_ARG_INVOCATION : OAuthTestUtils.NO_INVOCATIONS;
+              SINGLE_NO_ARG_INVOCATION : NO_INVOCATIONS;
    }
 
    @DataProvider
    public Object[][] onlyRunForClientCredentialsP12() {
       return (CredentialType.fromValue(credentialType) == CredentialType.CLIENT_CREDENTIALS_P12_AND_CERTIFICATE) ?
-              OAuthTestUtils.SINGLE_NO_ARG_INVOCATION : OAuthTestUtils.NO_INVOCATIONS;
+              SINGLE_NO_ARG_INVOCATION : NO_INVOCATIONS;
    }
 
    @Test(dataProvider = "onlyRunForP12PrivateKeyCredentials")

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/apis/oauth/src/test/java/org/jclouds/oauth/v2/OAuthTestUtils.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/test/java/org/jclouds/oauth/v2/OAuthTestUtils.java b/apis/oauth/src/test/java/org/jclouds/oauth/v2/OAuthTestUtils.java
index d15f8b0..920ff18 100644
--- a/apis/oauth/src/test/java/org/jclouds/oauth/v2/OAuthTestUtils.java
+++ b/apis/oauth/src/test/java/org/jclouds/oauth/v2/OAuthTestUtils.java
@@ -32,9 +32,6 @@ import com.google.common.io.Files;
 
 public class OAuthTestUtils {
 
-   public static final Object[][] NO_INVOCATIONS = new Object[0][0];
-   public static final Object[][] SINGLE_NO_ARG_INVOCATION = { new Object[0] };
-
    public static Properties defaultProperties(Properties properties) {
       try {
          properties = properties == null ? new Properties() : properties;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/compute/src/main/java/org/jclouds/compute/domain/internal/ArbitraryCpuRamTemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git a/compute/src/main/java/org/jclouds/compute/domain/internal/ArbitraryCpuRamTemplateBuilderImpl.java b/compute/src/main/java/org/jclouds/compute/domain/internal/ArbitraryCpuRamTemplateBuilderImpl.java
new file mode 100644
index 0000000..f99b991
--- /dev/null
+++ b/compute/src/main/java/org/jclouds/compute/domain/internal/ArbitraryCpuRamTemplateBuilderImpl.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.compute.domain.internal;
+
+import com.google.common.base.Supplier;
+import org.jclouds.collect.Memoized;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.Processor;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.util.AutomaticHardwareIdSpec;
+import org.jclouds.domain.Location;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import static org.jclouds.compute.util.AutomaticHardwareIdSpec.automaticHardwareIdSpecBuilder;
+import static org.jclouds.compute.util.AutomaticHardwareIdSpec.isAutomaticId;
+import static org.jclouds.compute.util.AutomaticHardwareIdSpec.parseId;
+
+public class ArbitraryCpuRamTemplateBuilderImpl extends TemplateBuilderImpl {
+   @Inject
+   protected ArbitraryCpuRamTemplateBuilderImpl(@Memoized Supplier<Set<? extends Location>> locations,
+         @Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares,
+         Supplier<Location> defaultLocation, @Named("DEFAULT") Provider<TemplateOptions> optionsProvider,
+         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider) {
+      super(locations, images, hardwares, defaultLocation, optionsProvider, defaultTemplateProvider);
+   }
+
+   protected Hardware automaticHardwareForCpuAndRam(double cores, int ram) {
+      return new HardwareBuilder()
+            .id(automaticHardwareIdSpecBuilder(cores, ram).toString())
+            .ram(ram)
+            .processor(new Processor(cores, 1.0))
+            .build();
+   }
+
+   protected Hardware findHardwareWithId(Set<? extends Hardware> hardwaresToSearch) {
+      try {
+         return super.findHardwareWithId(hardwaresToSearch);
+      } catch (NoSuchElementException ex) {
+         if (isAutomaticId(hardwareId)) {
+            AutomaticHardwareIdSpec spec = parseId(hardwareId);
+            return automaticHardwareForCpuAndRam(spec.getCores(), spec.getRam());
+         }
+         else {
+            throw ex;
+         }
+        }
+    }
+
+   protected Hardware resolveHardware(Set<? extends Hardware> hardwarel, final Iterable<? extends Image> images) {
+      try {
+         return super.resolveHardware(hardwarel, images);
+      }
+      catch (NoSuchElementException ex) {
+         if (super.minCores != 0 && super.minRam != 0) {
+            return automaticHardwareForCpuAndRam(minCores, minRam);
+         }
+         else throw new IllegalArgumentException("No hardware profile matching the given criteria was found. If " +
+               "you want to use exact values, please set the minCores and minRam values", ex);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git a/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java b/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
index 2865409..f860674 100644
--- a/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
+++ b/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
@@ -16,33 +16,20 @@
  */
 package org.jclouds.compute.domain.internal;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.base.Predicates.and;
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.find;
-import static com.google.common.collect.Iterables.size;
-import static com.google.common.collect.Iterables.transform;
-import static com.google.common.collect.Iterables.tryFind;
-import static com.google.common.collect.Lists.newArrayList;
-import static java.lang.String.format;
-import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
-import static org.jclouds.compute.util.ComputeServiceUtils.getCoresAndSpeed;
-import static org.jclouds.compute.util.ComputeServiceUtils.getSpace;
-
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Provider;
-
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
+import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Ordering;
+import com.google.common.primitives.Doubles;
 import org.jclouds.collect.Memoized;
 import org.jclouds.compute.domain.ComputeMetadata;
 import org.jclouds.compute.domain.Hardware;
@@ -59,20 +46,31 @@ import org.jclouds.compute.suppliers.ImageCacheSupplier;
 import org.jclouds.domain.Location;
 import org.jclouds.logging.Logger;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
-import com.google.common.base.Objects.ToStringHelper;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ComparisonChain;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Ordering;
-import com.google.common.primitives.Doubles;
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Predicates.and;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.size;
+import static com.google.common.collect.Iterables.transform;
+import static com.google.common.collect.Iterables.tryFind;
+import static com.google.common.collect.Lists.newArrayList;
+import static java.lang.String.format;
+import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
+import static org.jclouds.compute.util.ComputeServiceUtils.getCoresAndSpeed;
+import static org.jclouds.compute.util.ComputeServiceUtils.getSpace;
 
 public class TemplateBuilderImpl implements TemplateBuilder {
    @Resource
@@ -348,7 +346,6 @@ public class TemplateBuilderImpl implements TemplateBuilder {
          return "imageDescription(" + imageDescription + ")";
       }
    };
-
    private final Predicate<Hardware> hardwareIdPredicate = new Predicate<Hardware>() {
       @Override
       public boolean apply(Hardware input) {
@@ -727,7 +724,7 @@ public class TemplateBuilderImpl implements TemplateBuilder {
       return image.get();
    }
 
-   private Hardware findHardwareWithId(Set<? extends Hardware> hardwaresToSearch) {
+   protected Hardware findHardwareWithId(Set<? extends Hardware> hardwaresToSearch) {
       Hardware hardware;
       // TODO: switch to GetHardwareStrategy in version 1.5
       hardware = tryFind(hardwaresToSearch, hardwareIdPredicate).orNull();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/compute/src/main/java/org/jclouds/compute/strategy/impl/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
----------------------------------------------------------------------
diff --git a/compute/src/main/java/org/jclouds/compute/strategy/impl/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java b/compute/src/main/java/org/jclouds/compute/strategy/impl/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
index e7f3384..6ac36c7 100644
--- a/compute/src/main/java/org/jclouds/compute/strategy/impl/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
+++ b/compute/src/main/java/org/jclouds/compute/strategy/impl/CreateNodesWithGroupEncodedIntoNameThenAddToSet.java
@@ -33,6 +33,7 @@ import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
 
+import com.google.common.base.Objects;
 import org.jclouds.Constants;
 import org.jclouds.compute.config.CustomizationResponse;
 import org.jclouds.compute.domain.ComputeMetadata;
@@ -75,7 +76,8 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet implements CreateNo
       public AtomicReference<NodeMetadata> call() throws Exception {
          NodeMetadata node = null;
          logger.debug(">> adding node location(%s) name(%s) image(%s) hardware(%s)", template.getLocation().getId(),
-                  name, template.getImage().getProviderId(), template.getHardware().getProviderId());
+               name, Objects.firstNonNull(template.getImage().getProviderId(), template.getImage().getId()),
+               Objects.firstNonNull(template.getHardware().getProviderId(), template.getHardware().getId()));
          node = addNodeWithGroupStrategy.createNodeWithGroupEncodedIntoName(group, name, template);
          logger.debug("<< %s node(%s)", formatStatus(node), node.getId());
          return new AtomicReference<NodeMetadata>(node);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/compute/src/main/java/org/jclouds/compute/util/AutomaticHardwareIdSpec.java
----------------------------------------------------------------------
diff --git a/compute/src/main/java/org/jclouds/compute/util/AutomaticHardwareIdSpec.java b/compute/src/main/java/org/jclouds/compute/util/AutomaticHardwareIdSpec.java
new file mode 100644
index 0000000..6aaa44a
--- /dev/null
+++ b/compute/src/main/java/org/jclouds/compute/util/AutomaticHardwareIdSpec.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.compute.util;
+
+import com.google.common.base.Splitter;
+
+import java.util.Map;
+
+public class AutomaticHardwareIdSpec {
+
+   private double cores;
+   private int ram;
+
+   public static boolean isAutomaticId(String id) {
+      return id.startsWith("automatic:");
+   }
+
+   public static AutomaticHardwareIdSpec parseId(String hardwareId) {
+      AutomaticHardwareIdSpec spec = new AutomaticHardwareIdSpec();
+      String hardwareSpec = hardwareId.substring(10);
+      Map<String, String> specValues = Splitter.on(';')
+            .trimResults()
+            .omitEmptyStrings()
+            .withKeyValueSeparator('=')
+            .split(hardwareSpec);
+      if (!specValues.containsKey("ram") || !specValues.containsKey("cores")) {
+         throw new IllegalArgumentException(String.format("Omitted keys on hardwareId: %s. Please set number " +
+               "of cores and ram amount.", hardwareId));
+      }
+      spec.ram = Integer.parseInt(specValues.get("ram"));
+      spec.cores = Double.parseDouble(specValues.get("cores"));
+      return spec;
+   }
+
+   public static AutomaticHardwareIdSpec automaticHardwareIdSpecBuilder(double cores, int ram) {
+      AutomaticHardwareIdSpec spec = new AutomaticHardwareIdSpec();
+      if (cores == 0 || ram == 0) {
+         throw new IllegalArgumentException(String.format("Omitted or wrong minCores and minRam. If you" +
+               " want to use exact values, please set the minCores and minRam values."));
+      }
+      spec.cores = cores;
+      spec.ram = ram;
+      return spec;
+   }
+
+   @Override
+   public String toString() {
+      return String.format("automatic:cores=%s;ram=%s", cores, ram);
+   }
+
+   public double getCores() {
+      return cores;
+   }
+
+   public int getRam() {
+      return ram;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/compute/src/test/java/org/jclouds/compute/domain/internal/ArbitraryCpuRamTemplateBuilderImplTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/domain/internal/ArbitraryCpuRamTemplateBuilderImplTest.java b/compute/src/test/java/org/jclouds/compute/domain/internal/ArbitraryCpuRamTemplateBuilderImplTest.java
new file mode 100644
index 0000000..568a60b
--- /dev/null
+++ b/compute/src/test/java/org/jclouds/compute/domain/internal/ArbitraryCpuRamTemplateBuilderImplTest.java
@@ -0,0 +1,275 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.compute.domain.internal;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.util.concurrent.Atomics;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.ImageBuilder;
+import org.jclouds.compute.domain.OperatingSystem;
+import org.jclouds.compute.domain.Processor;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.strategy.GetImageStrategy;
+import org.jclouds.compute.suppliers.ImageCacheSupplier;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.rest.AuthorizationException;
+import org.testng.annotations.Test;
+
+import java.net.URI;
+import java.util.Set;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+@Test(groups = "unit", singleThreaded = true, testName = "ArbitraryCpuRamTemplateBuilderImplTest")
+public class ArbitraryCpuRamTemplateBuilderImplTest {
+   private Location provider = new LocationBuilder()
+         .scope(LocationScope.PROVIDER)
+         .id("generic-provider")
+         .description("generic-provider")
+         .build();
+
+   private Location region = new LocationBuilder()
+         .scope(LocationScope.REGION)
+         .id("us-east-1")
+         .description("us-east-1")
+         .parent(provider)
+         .build();
+
+   private OperatingSystem os = OperatingSystem.builder()
+         .name("osName")
+         .version("osVersion")
+         .description("osDescription")
+         .arch("X86_32")
+         .build();
+
+   private Image image = new ImageBuilder()
+         .id("imageId")
+         .providerId("imageId")
+         .name("imageName")
+         .description("imageDescription")
+         .version("imageVersion")
+         .operatingSystem(os)
+         .status(Image.Status.AVAILABLE)
+         .location(null)
+         .build();
+
+   private Hardware hardware = new HardwareBuilder()
+         .ram(2048)
+         .processor(new Processor(2, 1))
+         .id("hardwareId")
+         .name("hardwareName")
+         .location(region)
+         .uri(URI.create("uri"))
+         .build();
+
+   private final String errorMessage = "No hardware profile matching the given criteria was found. " +
+         "If you want to use exact values, please set the minCores and minRam values";
+
+   @Test
+   public void testAutoGeneratedHardwareFromId(){
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+
+      TemplateBuilderImpl templateBuilder = new ArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region),
+            optionsProvider, templateBuilderProvider);
+
+      Hardware hardware = templateBuilder.hardwareId("automatic:cores=2;ram=256").build().getHardware();
+      assertThat(hardware.getRam()).isEqualTo(256);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(2.0);
+      assertThat(hardware.getId()).isEqualTo("automatic:cores=2.0;ram=256");
+   }
+
+   @Test
+   public void testAutoGeneratedHardwareWithMinCoresAndMinRam(){
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet.of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new ArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minRam(1024);
+      templateBuilder.minCores(4);
+      Template template = templateBuilder.build();
+      Hardware hardware = template.getHardware();
+      assertThat(hardware.getRam()).isEqualTo(1024);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(4.0);
+      assertThat(hardware.getId()).isEqualTo("automatic:cores=4.0;ram=1024");
+   }
+
+   @Test
+   public void testExistingHardwareProfileMatchHardwareProfileWithMinCoresMinRam() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new ArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minCores(2);
+      templateBuilder.minRam(1024);
+      Template template = templateBuilder.build();
+      Hardware hardware = template.getHardware();
+      assertThat(hardware.getRam()).isEqualTo(2048);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(2.0);
+      assertThat(hardware.getId()).isEqualTo("hardwareId");
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = errorMessage)
+   public void testOnlyRamTest() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet.of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new ArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minRam(4096);
+      templateBuilder.build();
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = errorMessage)
+   public void testOnlyCoresTest() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new ArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minCores(4);
+      templateBuilder.build();
+   }
+
+   @Test
+   public void testOnlyRamMatchHardwareProfileTest() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet.of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new ArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minRam(1024);
+      templateBuilder.build();
+      assertThat(hardware.getRam()).isEqualTo(2048);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(2.0);
+      assertThat(hardware.getId()).isEqualTo("hardwareId");
+   }
+
+   @Test
+   public void testOnlyCoresMatchHardwareProfileTest() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new ArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minCores(1);
+      templateBuilder.build();
+      assertThat(hardware.getRam()).isEqualTo(2048);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(2.0);
+      assertThat(hardware.getId()).isEqualTo("hardwareId");
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
index 5db3d32..b53412a 100644
--- a/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
+++ b/compute/src/test/java/org/jclouds/compute/internal/BaseComputeServiceLiveTest.java
@@ -33,6 +33,7 @@ import static java.lang.String.format;
 import static java.lang.System.currentTimeMillis;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static java.util.logging.Logger.getAnonymousLogger;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.jclouds.Constants.PROPERTY_USER_THREADS;
 import static org.jclouds.compute.options.RunScriptOptions.Builder.nameTask;
 import static org.jclouds.compute.options.RunScriptOptions.Builder.wrapInInitScript;
@@ -44,6 +45,8 @@ import static org.jclouds.compute.predicates.NodePredicates.inGroup;
 import static org.jclouds.compute.predicates.NodePredicates.runningInGroup;
 import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
 import static org.jclouds.util.Predicates2.retry;
+import static org.jclouds.utils.TestUtils.NO_INVOCATIONS;
+import static org.jclouds.utils.TestUtils.SINGLE_NO_ARG_INVOCATION;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -81,6 +84,7 @@ import org.jclouds.compute.domain.NodeMetadata.Status;
 import org.jclouds.compute.domain.OperatingSystem;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.domain.internal.ArbitraryCpuRamTemplateBuilderImpl;
 import org.jclouds.compute.util.OpenSocketFinder;
 import org.jclouds.domain.Credentials;
 import org.jclouds.domain.Location;
@@ -96,6 +100,7 @@ import org.jclouds.ssh.SshClient;
 import org.jclouds.ssh.SshException;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Function;
@@ -937,6 +942,26 @@ public abstract class BaseComputeServiceLiveTest extends BaseComputeServiceConte
       }
    }
 
+   @DataProvider
+   public Object[][] onlyIfAutomaticHardwareSupported() {
+      return  client.templateBuilder() instanceof ArbitraryCpuRamTemplateBuilderImpl ?
+            SINGLE_NO_ARG_INVOCATION : NO_INVOCATIONS;
+   }
+
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"})
+   public void testCreateNodeWithCustomHardware() throws Exception {
+      Template template = buildTemplate(templateBuilder()
+            .hardwareId("automatic:cores=2;ram=4096"));
+      try {
+         NodeMetadata node = getOnlyElement(client.createNodesInGroup("custom", 1, template));
+         assertThat(node.getHardware().getRam()).isEqualTo(4096);
+         assertThat(node.getHardware().getProcessors().get(0).getCores()).isEqualTo(2);
+      }
+      finally {
+         client.destroyNodesMatching(inGroup("custom"));
+      }
+   }
+
    @AfterClass(groups = { "integration", "live" })
    @Override
    protected void tearDownContext() {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java b/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java
index 29b543f..5e27d5a 100644
--- a/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java
+++ b/compute/src/test/java/org/jclouds/compute/internal/BaseTemplateBuilderLiveTest.java
@@ -16,7 +16,10 @@
  */
 package org.jclouds.compute.internal;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
+import static org.jclouds.utils.TestUtils.NO_INVOCATIONS;
+import static org.jclouds.utils.TestUtils.SINGLE_NO_ARG_INVOCATION;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
@@ -29,10 +32,14 @@ import org.jclouds.compute.ComputeServiceContext;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.internal.ArbitraryCpuRamTemplateBuilderImpl;
+import org.jclouds.compute.util.AutomaticHardwareIdSpec;
 import org.jclouds.domain.Location;
 import org.jclouds.domain.LocationScope;
 import org.jclouds.domain.LoginCredentials;
 import org.jclouds.rest.config.CredentialStoreModule;
+import org.testng.SkipException;
+import org.testng.annotations.DataProvider;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Splitter;
@@ -225,4 +232,100 @@ public abstract class BaseTemplateBuilderLiveTest extends BaseComputeServiceCont
       assertTrue(actual.getLocation().getScope().compareTo(expected.getLocation().getScope()) <= 0);
    }
 
+   @DataProvider
+   public Object[][] onlyIfAutomaticHardwareSupported() {
+      return  view.getComputeService().templateBuilder() instanceof ArbitraryCpuRamTemplateBuilderImpl ?
+            SINGLE_NO_ARG_INVOCATION : NO_INVOCATIONS;
+   }
+
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"})
+   public void testAutoGeneratedHardwareFromId() {
+      Template template = view.getComputeService().templateBuilder()
+            .hardwareId("automatic:cores=2;ram=1024").build();
+      assertThat(template.getHardware().getId()).isEqualTo("automatic:cores=2;ram=1024");
+      assertThat(template.getHardware().getRam()).isEqualTo(1024);
+      assertThat(template.getHardware().getProcessors().get(0).getCores()).isEqualTo(2);
+   }
+
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"})
+   public void testAutoGeneratedHardwareMatchHardwareProfile() {
+      if (!view.getComputeService().listHardwareProfiles().isEmpty()) {
+         Template template = view.getComputeService().templateBuilder()
+               .minRam(2048).minCores(2).build();
+         assertThat(AutomaticHardwareIdSpec.isAutomaticId(template.getHardware().getId())).isFalse();
+         assertThat(template.getHardware().getRam()).isGreaterThanOrEqualTo(2048);
+         assertThat(template.getHardware().getProcessors().get(0).getCores()).isGreaterThanOrEqualTo(2);
+      }
+      else {
+         throw new SkipException("Hardware profile list is empty, this provider can not match any hardware profile" +
+               "to the specified minRam and minCores.");
+      }
+   }
+
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"})
+   public void testAutoGeneratedHardwareWithMinCoresAndMinRam() {
+      if (view.getComputeService().listHardwareProfiles().isEmpty()) {
+         Template template = view.getComputeService().templateBuilder()
+               .minRam(2048).minCores(2).build();
+         assertThat(AutomaticHardwareIdSpec.isAutomaticId(template.getHardware().getId())).isTrue();
+         assertThat(template.getHardware().getRam()).isEqualTo(2048);
+         assertThat(template.getHardware().getProcessors().get(0).getCores()).isEqualTo(2);
+      }
+      else {
+         throw new SkipException("Hardware profile list not empty.");
+      }
+   }
+
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"})
+   public void testAutoGeneratedHardwareWithOnlyMinCoresMatchHardwareProfile() {
+      if (!view.getComputeService().listHardwareProfiles().isEmpty()) {
+         Template template = view.getComputeService().templateBuilder().minCores(4).build();
+         assertThat(AutomaticHardwareIdSpec.isAutomaticId(template.getHardware().getId())).isFalse();
+         assertThat(template.getHardware().getProcessors().get(0).getCores()).isGreaterThanOrEqualTo(4);
+      }
+      else {
+         throw new SkipException("Hardware profile list is empty, this provider can not match any hardware profile" +
+               "to the specified minRam and minCores.");
+      }
+   }
+
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"})
+   public void testAutoGeneratedHardwareWithOnlyMinRamMatchHardwareProfile() {
+      if (!view.getComputeService().listHardwareProfiles().isEmpty()) {
+         Template template = view.getComputeService().templateBuilder().minRam(4096).build();
+         assertThat(AutomaticHardwareIdSpec.isAutomaticId(template.getHardware().getId())).isFalse();
+         assertThat(template.getHardware().getRam()).isGreaterThanOrEqualTo(4096);
+      }
+      else {
+         throw new SkipException("Hardware profile list is empty, this provider can not match any hardware profile" +
+               "to the specified minRam and minCores.");
+      }
+   }
+
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"},
+         expectedExceptions = IllegalArgumentException.class,
+         expectedExceptionsMessageRegExp = "No hardware profile matching the given criteria was found. " +
+         "If you want to use exact values, please set the minCores and minRam values")
+   public void testAutoGeneratedHardwareWithOnlyMinRamNotMatchHardwareProfile() {
+      if (view.getComputeService().listHardwareProfiles().isEmpty()) {
+         view.getComputeService().templateBuilder().minRam(4096).build();
+      }
+      else {
+         throw new SkipException("Hardware profile list not empty.");
+      }
+   }
+
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"},
+         expectedExceptions = IllegalArgumentException.class,
+         expectedExceptionsMessageRegExp = "No hardware profile matching the given criteria was found. " +
+               "If you want to use exact values, please set the minCores and minRam values")
+   public void testAutoGeneratedHardwareWithOnlyMinCoresNotMatchHardwareProfile() {
+      if (view.getComputeService().listHardwareProfiles().isEmpty()) {
+         view.getComputeService().templateBuilder().minCores(4).build();
+      }
+      else {
+         throw new SkipException("Hardware profile list not empty.");
+      }
+   }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/compute/src/test/java/org/jclouds/compute/util/AutomaticHardwareIdSpecTest.java
----------------------------------------------------------------------
diff --git a/compute/src/test/java/org/jclouds/compute/util/AutomaticHardwareIdSpecTest.java b/compute/src/test/java/org/jclouds/compute/util/AutomaticHardwareIdSpecTest.java
new file mode 100644
index 0000000..9dc72a2
--- /dev/null
+++ b/compute/src/test/java/org/jclouds/compute/util/AutomaticHardwareIdSpecTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.compute.util;
+
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@Test(groups = "unit", testName = "AutomaticHardwareIdSpecTest")
+public class AutomaticHardwareIdSpecTest {
+   @Test
+   public void isAutomaticIdTest() {
+      assertThat(AutomaticHardwareIdSpec.isAutomaticId("automatic:cores=2;ram=256")).isTrue();
+   }
+
+   @Test
+   public void isNotAutomaticId() {
+      assertThat(AutomaticHardwareIdSpec.isAutomaticId("Hi, I'm a non automatic id.")).isFalse();
+   }
+
+   @Test
+   public void parseAutomaticIdTest() {
+      AutomaticHardwareIdSpec parser = AutomaticHardwareIdSpec.parseId("automatic:cores=2;ram=256");
+      assertThat(parser.getRam()).isEqualTo(256);
+      assertThat(parser.getCores()).isEqualTo(2);
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class)
+   public void parseAutomaticIdMissingValuesTest() {
+         AutomaticHardwareIdSpec.parseId("automatic:cores=2");
+   }
+
+   @Test
+   public void generateAutomaticIdTest() {
+      AutomaticHardwareIdSpec spec = AutomaticHardwareIdSpec.parseId("automatic:cores=2;ram=1024");
+      assertThat(spec.toString()).isEqualTo("automatic:cores=2.0;ram=1024");
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/core/src/test/java/org/jclouds/utils/TestUtils.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/jclouds/utils/TestUtils.java b/core/src/test/java/org/jclouds/utils/TestUtils.java
index 7082346..cce923b 100644
--- a/core/src/test/java/org/jclouds/utils/TestUtils.java
+++ b/core/src/test/java/org/jclouds/utils/TestUtils.java
@@ -27,6 +27,9 @@ import com.google.common.io.ByteSource;
  */
 public class TestUtils {
 
+   public static final Object[][] NO_INVOCATIONS = new Object[0][0];
+   public static final Object[][] SINGLE_NO_ARG_INVOCATION = { new Object[0] };
+
    public static boolean isJava6() {
       return System.getProperty("java.version", "").contains("1.6.");
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
index 484df91..8c35f32 100644
--- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/config/GoogleComputeEngineServiceContextModule.java
@@ -79,6 +79,8 @@ import com.google.inject.Injector;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
 import com.google.inject.TypeLiteral;
+import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
+import org.jclouds.googlecomputeengine.compute.domain.internal.GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl;
 
 public final class GoogleComputeEngineServiceContextModule
       extends ComputeServiceAdapterContextModule<Instance, MachineType, Image, Location> {
@@ -92,6 +94,8 @@ public final class GoogleComputeEngineServiceContextModule
       bind(new TypeLiteral<ComputeServiceAdapter<Instance, MachineType, Image, Location>>() {
       }).to(GoogleComputeEngineServiceAdapter.class);
 
+      bind(TemplateBuilderImpl.class).to(GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl.class);
+
       // Use compute service to supply locations, which are always zones.
       install(new LocationsFromComputeServiceAdapterModule<Instance, MachineType, Image, Location>() {
       });

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/internal/GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/internal/GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/internal/GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl.java
new file mode 100644
index 0000000..774dce9
--- /dev/null
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/domain/internal/GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.googlecomputeengine.compute.domain.internal;
+
+import com.google.common.base.Supplier;
+import org.jclouds.collect.Memoized;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.Processor;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.domain.internal.ArbitraryCpuRamTemplateBuilderImpl;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.domain.Location;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+import java.net.URI;
+import java.util.Set;
+
+public class GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl extends ArbitraryCpuRamTemplateBuilderImpl {
+   @Inject
+   protected GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl(@Memoized Supplier<Set<? extends Location>> locations,
+         @Memoized Supplier<Set<? extends org.jclouds.compute.domain.Image>> images,
+         @Memoized Supplier<Set<? extends Hardware>> hardwares, Supplier<Location> defaultLocation,
+         @Named("DEFAULT") Provider<TemplateOptions> optionsProvider,
+         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider) {
+      super(locations, images, hardwares, defaultLocation, optionsProvider, defaultTemplateProvider);
+   }
+
+   protected Hardware automaticHardwareForCpuAndRam(double cores, int ram) {
+      if (location == null) {
+         location = defaultLocation.get();
+      }
+      String uri = location.getDescription() + "/machineTypes/custom-" + (int)cores + "-" + ram;
+      return new HardwareBuilder()
+            .id(uri)
+            .ram(ram)
+            .processor(new Processor((int)cores, 1.0))
+            .providerId(uri)
+            .uri(URI.create(uri))
+            .build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java
index 6f72bee..7e7407e 100644
--- a/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java
+++ b/providers/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadata.java
@@ -16,27 +16,30 @@
  */
 package org.jclouds.googlecomputeengine.compute.functions;
 
-import static org.jclouds.compute.util.ComputeServiceUtils.groupFromMapOrName;
-
-import javax.inject.Inject;
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-
 import com.google.common.base.Function;
+import com.google.common.base.Splitter;
 import com.google.common.base.Supplier;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableList;
 import org.jclouds.collect.Memoized;
 import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.NodeMetadata.Status;
 import org.jclouds.compute.domain.NodeMetadataBuilder;
+import org.jclouds.compute.domain.Processor;
 import org.jclouds.compute.functions.GroupNamingConvention;
 import org.jclouds.domain.Location;
 import org.jclouds.googlecomputeengine.domain.Image;
 import org.jclouds.googlecomputeengine.domain.Instance;
 
+import javax.inject.Inject;
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+import static org.jclouds.compute.util.ComputeServiceUtils.groupFromMapOrName;
+
 public final class InstanceToNodeMetadata implements Function<Instance, NodeMetadata> {
 
    private final Map<Instance.Status, NodeMetadata.Status> toPortableNodeStatus;
@@ -73,13 +76,21 @@ public final class InstanceToNodeMetadata implements Function<Instance, NodeMeta
       // a loading cache. That would be more expensive, but could ensure this isn't null.
       Image image = diskURIToImage.getUnchecked(input.disks().get(0).source());
 
+      Hardware hardware;
+      if (isCustomMachineTypeURI(input.machineType())) {
+         hardware = machineTypeURIToCustomHardware(input.machineType());
+      }
+      else {
+         hardware = hardwares.get().get(input.machineType());
+      }
+
       builder.id(input.selfLink().toString())
              .name(input.name())
              .providerId(input.id())
              .hostname(input.name())
              .location(zone)
              .imageId(image != null ? image.selfLink().toString() : null)
-             .hardware(hardwares.get().get(input.machineType()))
+             .hardware(hardware)
              .status(input.status() != null ? toPortableNodeStatus.get(input.status()) : Status.UNRECOGNIZED)
              .tags(input.tags().items())
              .uri(input.selfLink())
@@ -111,4 +122,23 @@ public final class InstanceToNodeMetadata implements Function<Instance, NodeMeta
       }
       return publicAddressesBuilder.build();
    }
+
+   public static boolean isCustomMachineTypeURI(URI machineType) {
+      return machineType.toString().contains("machineTypes/custom");
+   }
+
+   public static Hardware machineTypeURIToCustomHardware(URI machineType) {
+      String uri = machineType.toString();
+      String values = uri.substring(uri.lastIndexOf('/') + 8);
+      List<String> hardwareValues = Splitter.on('-')
+            .trimResults()
+            .splitToList(values);
+      return new HardwareBuilder()
+            .id(uri)
+            .providerId(uri)
+            .processor(new Processor(Double.parseDouble(hardwareValues.get(0)), 1.0))
+            .ram(Integer.parseInt(hardwareValues.get(1)))
+            .uri(machineType)
+            .build();
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
index ca381db..d8bd28e 100644
--- a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
+++ b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
@@ -17,6 +17,9 @@
 package org.jclouds.googlecomputeengine.compute;
 
 import static com.google.common.collect.Iterables.contains;
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.jclouds.compute.predicates.NodePredicates.inGroup;
 import static org.jclouds.util.Strings2.toStringAndClose;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
@@ -33,9 +36,9 @@ import com.google.inject.Module;
 import org.jclouds.compute.ComputeServiceContext;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
 import org.jclouds.compute.options.TemplateOptions;
-import org.jclouds.compute.predicates.NodePredicates;
 import org.jclouds.googlecloud.internal.TestProperties;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
 import org.jclouds.googlecomputeengine.compute.options.GoogleComputeEngineTemplateOptions;
@@ -95,7 +98,7 @@ public class GoogleComputeEngineServiceLiveTest extends BaseComputeServiceLiveTe
          assertTrue(instance.scheduling().preemptible());
 
       } finally {
-         client.destroyNodesMatching(NodePredicates.inGroup(group));
+         client.destroyNodesMatching(inGroup(group));
       }
    }
    /**
@@ -152,4 +155,20 @@ public class GoogleComputeEngineServiceLiveTest extends BaseComputeServiceLiveTe
       // Hardware profiles might not have volumes.
    }
 
+   @Override
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"})
+   public void testCreateNodeWithCustomHardware() throws Exception {
+      Template template = buildTemplate(templateBuilder()
+            .hardwareId("automatic:cores=2;ram=4096"));
+      try {
+         NodeMetadata node = getOnlyElement(client.createNodesInGroup("custom", 1, template));
+         assertThat(node.getHardware().getRam()).isEqualTo(4096);
+         assertThat(node.getHardware().getProcessors().get(0).getCores()).isEqualTo(2);
+         assertThat(node.getHardware().getId()).isEqualTo(node.getLocation().getDescription() + "/machineTypes/custom-2-4096");
+      }
+      finally {
+         client.destroyNodesMatching(inGroup("custom"));
+      }
+   }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineTemplateBuilderLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineTemplateBuilderLiveTest.java b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineTemplateBuilderLiveTest.java
index dbbedb3..a954e21 100644
--- a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineTemplateBuilderLiveTest.java
+++ b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineTemplateBuilderLiveTest.java
@@ -17,6 +17,7 @@
 package org.jclouds.googlecomputeengine.compute;
 
 import static com.google.common.base.Objects.firstNonNull;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.jclouds.compute.domain.OsFamily.COREOS;
 import static org.jclouds.compute.domain.OsFamily.DEBIAN;
 import static org.jclouds.compute.domain.OsFamily.WINDOWS;
@@ -25,6 +26,7 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
 import java.io.IOException;
+import java.net.URI;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
@@ -76,4 +78,17 @@ public class GoogleComputeEngineTemplateBuilderLiveTest extends BaseTemplateBuil
       return ImmutableSet.<String> of();
    }
 
+   @Override
+   @Test(dataProvider = "onlyIfAutomaticHardwareSupported", groups = {"integration", "live"})
+   public void testAutoGeneratedHardwareFromId() {
+      Template template = view.getComputeService().templateBuilder()
+            .hardwareId("automatic:cores=2;ram=1024").build();
+      assertThat(template.getHardware().getId()).isEqualTo(template.getLocation()
+            .getDescription() + "/machineTypes/custom-2-1024");
+      assertThat(template.getHardware().getRam()).isEqualTo(1024);
+      assertThat(template.getHardware().getProcessors().get(0).getCores()).isEqualTo(2);
+      assertThat(template.getHardware().getUri()).isEqualTo(URI.create(template.getLocation()
+            .getDescription() + "/machineTypes/custom-2-1024"));
+   }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/domain/internal/GoogleComputeEngineArbitraryCpuRamTemplateBuilderImplTest.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/domain/internal/GoogleComputeEngineArbitraryCpuRamTemplateBuilderImplTest.java b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/domain/internal/GoogleComputeEngineArbitraryCpuRamTemplateBuilderImplTest.java
new file mode 100644
index 0000000..98b3144
--- /dev/null
+++ b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/domain/internal/GoogleComputeEngineArbitraryCpuRamTemplateBuilderImplTest.java
@@ -0,0 +1,278 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.googlecomputeengine.compute.domain.internal;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.util.concurrent.Atomics;
+import com.google.inject.Provider;
+import com.google.inject.util.Providers;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.ImageBuilder;
+import org.jclouds.compute.domain.OperatingSystem;
+import org.jclouds.compute.domain.Processor;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.compute.strategy.GetImageStrategy;
+import org.jclouds.compute.suppliers.ImageCacheSupplier;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.rest.AuthorizationException;
+import org.testng.annotations.Test;
+
+import java.net.URI;
+import java.util.Set;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+@Test(groups = "unit", singleThreaded = true, testName = "GoogleComputeEngineTemplateBuilderImplTest")
+public class GoogleComputeEngineArbitraryCpuRamTemplateBuilderImplTest {
+   private Location provider = new LocationBuilder()
+         .scope(LocationScope.PROVIDER)
+         .id("google-compute-engine")
+         .description("google-compute-engine")
+         .build();
+
+   private Location region = new LocationBuilder()
+         .scope(LocationScope.REGION)
+         .id("us-east-1")
+         .description("http://localhost/projects/party/zones/us-east-1")
+         .parent(provider)
+         .build();
+
+   private OperatingSystem os = OperatingSystem.builder()
+         .name("osName")
+         .version("osVersion")
+         .description("osDescription")
+         .arch("X86_32")
+         .build();
+
+   private Image image = new ImageBuilder()
+         .id("imageId")
+         .providerId("imageId")
+         .name("imageName")
+         .description("imageDescription")
+         .version("imageVersion")
+         .operatingSystem(os)
+         .status(Image.Status.AVAILABLE)
+         .location(null)
+         .build();
+
+   private Hardware hardware = new HardwareBuilder()
+         .ram(2048)
+         .processor(new Processor(2, 1))
+         .id("http://localhost/projects/party/zones/us-east-1/machineTypes/n2-standard-2")
+         .name("n2-standard-2")
+         .location(region)
+         .uri(URI.create("http://localhost/projects/party/zones/us-east-1/machineTypes/n2-standard-2"))
+         .build();
+
+   private final String errorMessage = "No hardware profile matching the given criteria was found. " +
+         "If you want to use exact values, please set the minCores and minRam values";
+
+   @Test
+   public void testAutoGeneratedHardwareFromIdTest(){
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet.of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+
+      TemplateBuilderImpl templateBuilder =
+            new GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl(locations, new ImageCacheSupplier(images, 60,
+                  Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+                  Suppliers.ofInstance(region),
+                  optionsProvider, templateBuilderProvider);
+
+      Hardware hardware = templateBuilder.hardwareId("automatic:cores=2;ram=1024").build().getHardware();
+      assertThat(hardware.getRam()).isEqualTo(1024);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(2.0);
+      assertThat(hardware.getUri()).isEqualTo(URI.create("http://localhost/projects/party/zones/us-east-1/machineTypes/custom-2-1024"));
+      assertThat(hardware.getId()).isEqualTo("http://localhost/projects/party/zones/us-east-1/machineTypes/custom-2-1024");
+   }
+
+   @Test
+   public void testAutoGeneratedHardwareWithMinCoresAndMinRamDontMatchTest() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minRam(4096);
+      templateBuilder.minCores(2);
+      Hardware hardware = templateBuilder.build().getHardware();
+      assertThat(hardware.getRam()).isEqualTo(4096);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(2.0);
+      assertThat(hardware.getId()).isEqualTo("http://localhost/projects/party/zones/us-east-1/machineTypes/custom-2-4096");
+   }
+
+   @Test
+   public void testAutoGeneratedHardwareMatchHardwareProfile() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minRam(1024);
+      templateBuilder.minCores(2);
+      Hardware hardware = templateBuilder.build().getHardware();
+      assertThat(hardware.getRam()).isEqualTo(2048);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(2.0);
+      assertThat(hardware.getId()).isEqualTo("http://localhost/projects/party/zones/us-east-1/machineTypes/n2-standard-2");
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = errorMessage)
+   public void testAutoGeneratedHardwareWithOnlyMinCoresTest() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minCores(4);
+      templateBuilder.build().getHardware();
+   }
+
+   @Test(expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = errorMessage)
+   public void testAutoGeneratedHardwareWithOnlyMinRamTest() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minRam(4096);
+      templateBuilder.build().getHardware();
+   }
+
+   @Test
+   public void testAutoGeneratedHardwareWithOnlyMinCoresMatchedHardware() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minCores(2);
+      Hardware hardware = templateBuilder.build().getHardware();
+      assertThat(hardware.getRam()).isEqualTo(2048);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(2.0);
+      assertThat(hardware.getId())
+            .isEqualTo("http://localhost/projects/party/zones/us-east-1/machineTypes/n2-standard-2");
+   }
+
+   @Test
+   public void testAutoGeneratedHardwareOnlyRamMatchHardwareProfile() {
+      Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .of(region));
+      Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(image));
+      Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(hardware));
+      Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
+      Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
+      TemplateBuilder defaultTemplate = createMock(TemplateBuilder.class);
+      GetImageStrategy getImageStrategy = createMock(GetImageStrategy.class);
+
+      expect(optionsProvider.get()).andReturn(new TemplateOptions());
+      expect(getImageStrategy.getImage(anyObject(String.class))).andReturn(null);
+      replay(defaultTemplate, optionsProvider, templateBuilderProvider, getImageStrategy);
+      TemplateBuilderImpl templateBuilder = new GoogleComputeEngineArbitraryCpuRamTemplateBuilderImpl(locations,
+            new ImageCacheSupplier(images, 60,
+            Atomics.<AuthorizationException>newReference(), Providers.of(getImageStrategy)), hardwares,
+            Suppliers.ofInstance(region), optionsProvider, templateBuilderProvider);
+      templateBuilder.minRam(1024);
+      Hardware hardware = templateBuilder.build().getHardware();
+      assertThat(hardware.getRam()).isEqualTo(2048);
+      assertThat(hardware.getProcessors()).extracting("cores").containsExactly(2.0);
+      assertThat(hardware.getId())
+            .isEqualTo("http://localhost/projects/party/zones/us-east-1/machineTypes/n2-standard-2");
+   }
+
+}


[03/12] jclouds git commit: Change line endings on files recursively

Posted by na...@apache.org.
Change line endings on files recursively


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

Branch: refs/heads/gsoc2016-ivan
Commit: a515ce2f220ac506bf31f199baf9ae3101f7b608
Parents: 4874a1e
Author: Andrea Turli <an...@gmail.com>
Authored: Wed Jul 13 23:55:01 2016 +0200
Committer: Andrea Turli <an...@gmail.com>
Committed: Thu Jul 14 00:02:13 2016 +0200

----------------------------------------------------------------------
 apis/chef/src/test/resources/logback.xml        |  66 +++++-----
 .../src/test/resources/logback.xml              | 128 +++++++++----------
 .../src/test/resources/logback.xml              |  76 +++++------
 apis/route53/src/test/resources/logback.xml     |  76 +++++------
 compute/src/test/resources/logback.xml          | 128 +++++++++----------
 providers/dynect/src/test/resources/logback.xml |  76 +++++------
 .../ultradns-ws/src/test/resources/logback.xml  |  76 +++++------
 7 files changed, 313 insertions(+), 313 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/a515ce2f/apis/chef/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/apis/chef/src/test/resources/logback.xml b/apis/chef/src/test/resources/logback.xml
index f9c023f..9adb536 100644
--- a/apis/chef/src/test/resources/logback.xml
+++ b/apis/chef/src/test/resources/logback.xml
@@ -1,33 +1,33 @@
-<?xml version="1.0"?>
-<configuration scan="false">
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds.log</file>
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-wire.log</file>
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <root>
-        <level value="warn" />
-    </root>
-
-    <logger name="org.jclouds">
-        <level value="DEBUG" />
-        <appender-ref ref="FILE" />
-    </logger>
-    <logger name="jclouds.wire">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-    <logger name="jclouds.headers">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-</configuration>
+<?xml version="1.0"?>
+<configuration scan="false">
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root>
+        <level value="warn" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a515ce2f/apis/openstack-keystone/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/logback.xml b/apis/openstack-keystone/src/test/resources/logback.xml
index 8f628c3..98b1ea9 100644
--- a/apis/openstack-keystone/src/test/resources/logback.xml
+++ b/apis/openstack-keystone/src/test/resources/logback.xml
@@ -1,64 +1,64 @@
-<?xml version="1.0"?>
-<configuration scan="false">
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-wire.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <appender name="COMPUTEFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-compute.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-    
-    <appender name="SSHFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-ssh.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <root>
-        <level value="warn" />
-    </root>
-
-    <logger name="org.jclouds">
-        <level value="DEBUG" />
-        <appender-ref ref="FILE" />
-    </logger>
-
-    <logger name="jclouds.wire">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-    <logger name="jclouds.headers">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-    <logger name="jclouds.compute">
-        <level value="DEBUG" />
-        <appender-ref ref="COMPUTEFILE" />
-    </logger>
-    
-    <logger name="jclouds.ssh">
-        <level value="DEBUG" />
-        <appender-ref ref="SSHFILE" />
-    </logger>
-
-</configuration>
+<?xml version="1.0"?>
+<configuration scan="false">
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="COMPUTEFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-compute.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+    
+    <appender name="SSHFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-ssh.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root>
+        <level value="warn" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.compute">
+        <level value="DEBUG" />
+        <appender-ref ref="COMPUTEFILE" />
+    </logger>
+    
+    <logger name="jclouds.ssh">
+        <level value="DEBUG" />
+        <appender-ref ref="SSHFILE" />
+    </logger>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a515ce2f/apis/rackspace-clouddns/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/apis/rackspace-clouddns/src/test/resources/logback.xml b/apis/rackspace-clouddns/src/test/resources/logback.xml
index 9679b2e..a5e1de3 100644
--- a/apis/rackspace-clouddns/src/test/resources/logback.xml
+++ b/apis/rackspace-clouddns/src/test/resources/logback.xml
@@ -1,38 +1,38 @@
-<?xml version="1.0"?>
-<configuration scan="false">
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-wire.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-    
-    <root>
-        <level value="warn" />
-    </root>
-
-    <logger name="org.jclouds">
-        <level value="DEBUG" />
-        <appender-ref ref="FILE" />
-    </logger>
-
-    <logger name="jclouds.wire">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-    <logger name="jclouds.headers">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-</configuration>
+<?xml version="1.0"?>
+<configuration scan="false">
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+    
+    <root>
+        <level value="warn" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a515ce2f/apis/route53/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/apis/route53/src/test/resources/logback.xml b/apis/route53/src/test/resources/logback.xml
index 9679b2e..a5e1de3 100644
--- a/apis/route53/src/test/resources/logback.xml
+++ b/apis/route53/src/test/resources/logback.xml
@@ -1,38 +1,38 @@
-<?xml version="1.0"?>
-<configuration scan="false">
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-wire.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-    
-    <root>
-        <level value="warn" />
-    </root>
-
-    <logger name="org.jclouds">
-        <level value="DEBUG" />
-        <appender-ref ref="FILE" />
-    </logger>
-
-    <logger name="jclouds.wire">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-    <logger name="jclouds.headers">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-</configuration>
+<?xml version="1.0"?>
+<configuration scan="false">
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+    
+    <root>
+        <level value="warn" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a515ce2f/compute/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/compute/src/test/resources/logback.xml b/compute/src/test/resources/logback.xml
index 8f628c3..98b1ea9 100644
--- a/compute/src/test/resources/logback.xml
+++ b/compute/src/test/resources/logback.xml
@@ -1,64 +1,64 @@
-<?xml version="1.0"?>
-<configuration scan="false">
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-wire.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <appender name="COMPUTEFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-compute.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-    
-    <appender name="SSHFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-ssh.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <root>
-        <level value="warn" />
-    </root>
-
-    <logger name="org.jclouds">
-        <level value="DEBUG" />
-        <appender-ref ref="FILE" />
-    </logger>
-
-    <logger name="jclouds.wire">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-    <logger name="jclouds.headers">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-    <logger name="jclouds.compute">
-        <level value="DEBUG" />
-        <appender-ref ref="COMPUTEFILE" />
-    </logger>
-    
-    <logger name="jclouds.ssh">
-        <level value="DEBUG" />
-        <appender-ref ref="SSHFILE" />
-    </logger>
-
-</configuration>
+<?xml version="1.0"?>
+<configuration scan="false">
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="COMPUTEFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-compute.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+    
+    <appender name="SSHFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-ssh.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root>
+        <level value="warn" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.compute">
+        <level value="DEBUG" />
+        <appender-ref ref="COMPUTEFILE" />
+    </logger>
+    
+    <logger name="jclouds.ssh">
+        <level value="DEBUG" />
+        <appender-ref ref="SSHFILE" />
+    </logger>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a515ce2f/providers/dynect/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/providers/dynect/src/test/resources/logback.xml b/providers/dynect/src/test/resources/logback.xml
index 9679b2e..a5e1de3 100644
--- a/providers/dynect/src/test/resources/logback.xml
+++ b/providers/dynect/src/test/resources/logback.xml
@@ -1,38 +1,38 @@
-<?xml version="1.0"?>
-<configuration scan="false">
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-wire.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-    
-    <root>
-        <level value="warn" />
-    </root>
-
-    <logger name="org.jclouds">
-        <level value="DEBUG" />
-        <appender-ref ref="FILE" />
-    </logger>
-
-    <logger name="jclouds.wire">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-    <logger name="jclouds.headers">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-</configuration>
+<?xml version="1.0"?>
+<configuration scan="false">
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+    
+    <root>
+        <level value="warn" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+</configuration>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/a515ce2f/providers/ultradns-ws/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/providers/ultradns-ws/src/test/resources/logback.xml b/providers/ultradns-ws/src/test/resources/logback.xml
index 9679b2e..a5e1de3 100644
--- a/providers/ultradns-ws/src/test/resources/logback.xml
+++ b/providers/ultradns-ws/src/test/resources/logback.xml
@@ -1,38 +1,38 @@
-<?xml version="1.0"?>
-<configuration scan="false">
-    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-
-    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-wire.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-    
-    <root>
-        <level value="warn" />
-    </root>
-
-    <logger name="org.jclouds">
-        <level value="DEBUG" />
-        <appender-ref ref="FILE" />
-    </logger>
-
-    <logger name="jclouds.wire">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-    <logger name="jclouds.headers">
-        <level value="DEBUG" />
-        <appender-ref ref="WIREFILE" />
-    </logger>
-
-</configuration>
+<?xml version="1.0"?>
+<configuration scan="false">
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+    
+    <root>
+        <level value="warn" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+</configuration>


[11/12] jclouds git commit: JCLOUDS-482: Add support for arbitrary CPU and RAM

Posted by na...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/300261b2/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadataTest.java b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadataTest.java
index 83d4292..a4d9925 100644
--- a/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadataTest.java
+++ b/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/InstanceToNodeMetadataTest.java
@@ -16,13 +16,6 @@
  */
 package org.jclouds.googlecomputeengine.compute.functions;
 
-import static com.google.common.collect.Maps.uniqueIndex;
-import static org.testng.Assert.assertEquals;
-
-import java.net.URI;
-import java.util.Map;
-import java.util.Set;
-
 import com.google.common.base.Function;
 import com.google.common.base.Functions;
 import com.google.common.base.Predicate;
@@ -49,6 +42,16 @@ import org.jclouds.googlecomputeengine.parse.ParseInstanceTest;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import java.net.URI;
+import java.util.Map;
+import java.util.Set;
+
+import static com.google.common.collect.Maps.uniqueIndex;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.jclouds.googlecomputeengine.compute.functions.InstanceToNodeMetadata.isCustomMachineTypeURI;
+import static org.jclouds.googlecomputeengine.compute.functions.InstanceToNodeMetadata.machineTypeURIToCustomHardware;
+import static org.testng.Assert.assertEquals;
+
 @Test(groups = "unit", testName = "InstanceToNodeMetadataTest", singleThreaded = true) // BeforeMethod = singleThreaded
 public class InstanceToNodeMetadataTest {
 
@@ -199,4 +202,26 @@ public class InstanceToNodeMetadataTest {
       assertEquals(nodeMetadata.getId(), instance.selfLink().toString());
       assertEquals(nodeMetadata.getTags(), ImmutableSet.of("aTag", "Group-port-42"));
    }
+
+   @Test
+   public void isCustomMachineTypeTest() {
+      URI uri = URI.create("https://www.googleapis.com/compute/v1/projects/jclouds-dev/zones/asia-east1-a/machineTypes/custom-1-1024");
+      assertThat(isCustomMachineTypeURI(uri)).isTrue();
+
+      URI uri2 = URI.create("https://www.googleapis.com/compute/v1/projects/jclouds-dev/");
+      assertThat(isCustomMachineTypeURI(uri2)).isFalse();
+   }
+
+   @Test
+   public void machineTypeParserTest() {
+      URI uri = URI.create("https://www.googleapis.com/compute/v1/projects/jclouds-dev/zones/asia-east1-a/machineTypes/custom-1-1024");
+      Hardware hardware = machineTypeURIToCustomHardware(uri);
+      assertThat(hardware.getRam()).isEqualTo(1024);
+      assertThat(hardware.getProcessors().get(0).getCores()).isEqualTo(1);
+      assertThat(hardware.getUri())
+            .isEqualTo(URI.create("https://www.googleapis.com/compute/v1/projects/jclouds-dev/zones/asia-east1-a/machineTypes/custom-1-1024"));
+      assertThat(hardware.getId())
+            .isEqualTo("https://www.googleapis.com/compute/v1/projects/jclouds-dev/zones/asia-east1-a/machineTypes/custom-1-1024");
+   }
+
 }


[06/12] jclouds git commit: Ensure the canonicalRequest is logged properly

Posted by na...@apache.org.
Ensure the canonicalRequest is logged properly

Resolves JCLOUDS-1143

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

Branch: refs/heads/gsoc2016-ivan
Commit: e7bf9b129851dcf1af14bd114fa6ffd2d388045e
Parents: 87154bf
Author: neonbunny <ne...@users.noreply.github.com>
Authored: Tue Jul 19 14:50:03 2016 +0100
Committer: GitHub <no...@github.com>
Committed: Tue Jul 19 14:50:03 2016 +0100

----------------------------------------------------------------------
 apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerBase.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/e7bf9b12/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerBase.java
----------------------------------------------------------------------
diff --git a/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerBase.java b/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerBase.java
index 4d724af..1348e22 100644
--- a/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerBase.java
+++ b/apis/s3/src/main/java/org/jclouds/s3/filters/Aws4SignerBase.java
@@ -400,7 +400,7 @@ public abstract class Aws4SignerBase {
       // HexEncode(Hash(Payload))
       canonicalRequest.append(hashedPayload);
 
-      signatureWire.getWireLog().debug("<<", canonicalRequest);
+      signatureWire.getWireLog().debug("<< " + canonicalRequest);
 
       // Create a String to Sign
       StringBuilder toSign = new StringBuilder();


[02/12] jclouds git commit: JCLOUDS-1137: Handle TOCTOU during blobMetadata

Posted by na...@apache.org.
JCLOUDS-1137: Handle TOCTOU during blobMetadata

A similar issue exists when getting a blob payload when a caller
simultaneously removes the blob.


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

Branch: refs/heads/gsoc2016-ivan
Commit: 4874a1eb185870eef88731080ae8cf9ceebc3be2
Parents: 08e78c9
Author: Andrew Gaul <ga...@apache.org>
Authored: Mon Jul 11 21:51:52 2016 -0700
Committer: Andrew Gaul <ga...@apache.org>
Committed: Mon Jul 11 22:02:15 2016 -0700

----------------------------------------------------------------------
 .../internal/FilesystemStorageStrategyImpl.java        |  3 +++
 .../org/jclouds/blobstore/config/LocalBlobStore.java   | 13 ++++++++-----
 2 files changed, 11 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/4874a1eb/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
----------------------------------------------------------------------
diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
index ff16954..3de142e 100644
--- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
+++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java
@@ -32,6 +32,7 @@ import static org.jclouds.filesystem.util.Utils.setPublic;
 import static org.jclouds.util.Closeables2.closeQuietly;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
@@ -389,6 +390,8 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy {
                .contentLength(byteSource.size())
                .contentMD5(byteSource.hash(Hashing.md5()).asBytes());
          }
+      } catch (FileNotFoundException fnfe) {
+         return null;
       } catch (IOException e) {
          throw Throwables.propagate(e);
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/4874a1eb/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
----------------------------------------------------------------------
diff --git a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
index 65d39ba..631f182 100644
--- a/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
+++ b/blobstore/src/main/java/org/jclouds/blobstore/config/LocalBlobStore.java
@@ -245,18 +245,21 @@ public final class LocalBlobStore implements BlobStore {
                   return storageStrategy.blobExists(containerName, key);
                }
             });
-      SortedSet<StorageMetadata> contents = newTreeSet(transform(blobBelongingToContainer,
-            new Function<String, StorageMetadata>() {
+      SortedSet<StorageMetadata> contents = newTreeSet(FluentIterable.from(blobBelongingToContainer)
+            .transform(new Function<String, StorageMetadata>() {
+               @Override
                public StorageMetadata apply(String key) {
                   Blob oldBlob = loadBlob(containerName, key);
-                  checkState(oldBlob != null, "blob " + key + " is not present although it was in the list of "
-                        + containerName);
+                  if (oldBlob == null) {
+                     return null;
+                  }
                   checkState(oldBlob.getMetadata() != null, "blob " + containerName + "/" + key + " has no metadata");
                   MutableBlobMetadata md = BlobStoreUtils.copy(oldBlob.getMetadata());
                   md.setSize(oldBlob.getMetadata().getSize());
                   return md;
                }
-            }));
+            })
+            .filter(Predicates.<StorageMetadata>notNull()));
 
       String marker = null;
       if (options != null) {