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) {