mirror of https://github.com/apache/jclouds.git
added volume to hardware object, added signed blob support, added example of how to use signed blobs with computeservice
This commit is contained in:
parent
59aea16b07
commit
198eeec3d9
|
@ -51,6 +51,7 @@ import org.jclouds.blobstore.domain.PageSet;
|
|||
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||
import org.jclouds.blobstore.internal.BaseAsyncBlobStore;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.concurrent.Futures;
|
||||
|
@ -85,8 +86,9 @@ public class AtmosAsyncBlobStore extends BaseAsyncBlobStore {
|
|||
ObjectToBlob object2Blob, ObjectToBlobMetadata object2BlobMd, BlobToObject blob2Object,
|
||||
BlobStoreListOptionsToListOptions container2ContainerListOptions,
|
||||
DirectoryEntryListToResourceMetadataList container2ResourceList, Crypto crypto,
|
||||
BlobToHttpGetOptions blob2ObjectGetOptions, Provider<FetchBlobMetadata> fetchBlobMetadataProvider) {
|
||||
super(context, blobUtils, service, defaultLocation, locations);
|
||||
BlobToHttpGetOptions blob2ObjectGetOptions, Provider<FetchBlobMetadata> fetchBlobMetadataProvider,
|
||||
SignRequestForBlobStrategy signRequestForBlob) {
|
||||
super(context, blobUtils, service, defaultLocation, locations, signRequestForBlob);
|
||||
this.blob2ObjectGetOptions = checkNotNull(blob2ObjectGetOptions, "blob2ObjectGetOptions");
|
||||
this.sync = checkNotNull(sync, "sync");
|
||||
this.async = checkNotNull(async, "async");
|
||||
|
|
|
@ -43,6 +43,7 @@ import org.jclouds.blobstore.domain.PageSet;
|
|||
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||
import org.jclouds.blobstore.internal.BaseBlobStore;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.crypto.Crypto;
|
||||
|
@ -72,8 +73,9 @@ public class AtmosBlobStore extends BaseBlobStore {
|
|||
ObjectToBlobMetadata object2BlobMd, BlobToObject blob2Object,
|
||||
BlobStoreListOptionsToListOptions container2ContainerListOptions,
|
||||
DirectoryEntryListToResourceMetadataList container2ResourceList, Crypto crypto,
|
||||
BlobToHttpGetOptions blob2ObjectGetOptions, Provider<FetchBlobMetadata> fetchBlobMetadataProvider) {
|
||||
super(context, blobUtils, defaultLocation, locations);
|
||||
BlobToHttpGetOptions blob2ObjectGetOptions, Provider<FetchBlobMetadata> fetchBlobMetadataProvider,
|
||||
SignRequestForBlobStrategy signRequestForBlob) {
|
||||
super(context, blobUtils, defaultLocation, locations, signRequestForBlob);
|
||||
this.blob2ObjectGetOptions = checkNotNull(blob2ObjectGetOptions, "blob2ObjectGetOptions");
|
||||
this.sync = checkNotNull(sync, "sync");
|
||||
this.container2ContainerListOptions = checkNotNull(container2ContainerListOptions,
|
||||
|
|
|
@ -28,6 +28,7 @@ import org.jclouds.atmosonline.saas.AtmosStorageClient;
|
|||
import org.jclouds.atmosonline.saas.blobstore.AtmosAsyncBlobStore;
|
||||
import org.jclouds.atmosonline.saas.blobstore.AtmosBlobStore;
|
||||
import org.jclouds.atmosonline.saas.blobstore.strategy.FindMD5InUserMetadata;
|
||||
import org.jclouds.atmosonline.saas.blobstore.strategy.SignReadFile;
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
|
@ -35,6 +36,7 @@ import org.jclouds.blobstore.attr.ConsistencyModel;
|
|||
import org.jclouds.blobstore.config.BlobStoreMapModule;
|
||||
import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
||||
import org.jclouds.blobstore.strategy.ContainsValueInListStrategy;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.domain.LocationScope;
|
||||
import org.jclouds.domain.internal.LocationImpl;
|
||||
|
@ -65,6 +67,7 @@ public class AtmosBlobStoreContextModule extends AbstractModule {
|
|||
new TypeLiteral<BlobStoreContextImpl<AtmosStorageClient, AtmosStorageAsyncClient>>() {
|
||||
}).in(Scopes.SINGLETON);
|
||||
bind(ContainsValueInListStrategy.class).to(FindMD5InUserMetadata.class);
|
||||
bind(SignRequestForBlobStrategy.class).to(SignReadFile.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.atmosonline.saas.blobstore.strategy;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class SignReadFile implements SignRequestForBlobStrategy {
|
||||
private final RestAnnotationProcessor<AtmosStorageAsyncClient> processor;
|
||||
private final Method method;
|
||||
|
||||
@Inject
|
||||
public SignReadFile(RestAnnotationProcessor<AtmosStorageAsyncClient> processor) throws SecurityException,
|
||||
NoSuchMethodException {
|
||||
this.processor = checkNotNull(processor, "processor");
|
||||
this.method = AtmosStorageAsyncClient.class.getMethod("readFile", String.class, GetOptions[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest apply(String container, String name) {
|
||||
GeneratedHttpRequest<AtmosStorageAsyncClient> returnVal = processor.createRequest(method, checkNotNull(container,
|
||||
"container")
|
||||
+ "/" + checkNotNull(name, "name"));
|
||||
for (HttpRequestFilter filter : returnVal.getFilters())
|
||||
filter.filter(returnVal);
|
||||
return new HttpRequest(returnVal.getMethod(), returnVal.getEndpoint(), ImmutableMultimap.copyOf(returnVal
|
||||
.getHeaders()));
|
||||
}
|
||||
|
||||
}
|
|
@ -182,8 +182,7 @@ public class AtmosStorageAsyncClientTest extends RestClientTest<AtmosStorageAsyn
|
|||
}
|
||||
|
||||
public void testReadFile() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = AtmosStorageAsyncClient.class.getMethod("readFile", String.class, Array.newInstance(
|
||||
GetOptions.class, 0).getClass());
|
||||
Method method = AtmosStorageAsyncClient.class.getMethod("readFile", String.class, GetOptions[].class);
|
||||
HttpRequest request = processor.createRequest(method, "dir/file");
|
||||
|
||||
assertRequestLineEquals(request, "GET https://accesspoint.atmosonline.com/rest/namespace/dir/file HTTP/1.1");
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.atmosonline.saas.blobstore.integration;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.atmosonline.saas.AtmosStorageAsyncClient;
|
||||
import org.jclouds.atmosonline.saas.blobstore.strategy.SignReadFile;
|
||||
import org.jclouds.atmosonline.saas.config.AtmosStorageRestClientModule;
|
||||
import org.jclouds.atmosonline.saas.filters.SignRequest;
|
||||
import org.jclouds.date.TimeStamp;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.rest.ConfiguresRestClient;
|
||||
import org.jclouds.rest.RestClientTest;
|
||||
import org.jclouds.rest.RestContextFactory;
|
||||
import org.jclouds.rest.RestContextFactory.ContextSpec;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
@Test(groups = "unit", testName = "emcsaas.SignReadFileTest")
|
||||
public class SignReadFileTest extends RestClientTest<AtmosStorageAsyncClient> {
|
||||
|
||||
public void testSignReadFile() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException,
|
||||
NoSuchMethodException, IOException {
|
||||
HttpRequest request = new SignReadFile(processor).apply("container", "name");
|
||||
|
||||
assertRequestLineEquals(request, "GET https://accesspoint.atmosonline.com/rest/namespace/container/name HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(
|
||||
request,
|
||||
"Accept: */*\nDate: Thu, 05 Jun 2008 16:38:19 GMT\nx-emc-signature: Mhe5tqaKv04BlMvEjreNKkHHxzk=\nx-emc-uid: identity\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertEquals(request.getFilters().size(), 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void checkFilters(HttpRequest request) {
|
||||
assertEquals(request.getFilters().size(), 1);
|
||||
assertEquals(request.getFilters().get(0).getClass(), SignRequest.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypeLiteral<RestAnnotationProcessor<AtmosStorageAsyncClient>> createTypeLiteral() {
|
||||
return new TypeLiteral<RestAnnotationProcessor<AtmosStorageAsyncClient>>() {
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Module createModule() {
|
||||
return new TestAtmosStorageRestClientModule();
|
||||
}
|
||||
|
||||
@RequiresHttp
|
||||
@ConfiguresRestClient
|
||||
private static final class TestAtmosStorageRestClientModule extends AtmosStorageRestClientModule {
|
||||
@Override
|
||||
protected void configure() {
|
||||
super.configure();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String provideTimeStamp(@TimeStamp Supplier<String> cache) {
|
||||
return "Thu, 05 Jun 2008 16:38:19 GMT";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ContextSpec<?, ?> createContextSpec() {
|
||||
return new RestContextFactory().createContextSpec("atmosonline", "identity", "credential", new Properties());
|
||||
}
|
||||
|
||||
}
|
|
@ -54,13 +54,12 @@ import org.jclouds.aws.ec2.compute.strategy.EC2ListNodesStrategy;
|
|||
import org.jclouds.aws.ec2.compute.strategy.EC2LoadBalanceNodesStrategy;
|
||||
import org.jclouds.aws.ec2.compute.strategy.EC2RebootNodeStrategy;
|
||||
import org.jclouds.aws.ec2.compute.strategy.EC2RunNodesAndAddToSetStrategy;
|
||||
import org.jclouds.aws.ec2.compute.suppliers.EC2LocationSupplier;
|
||||
import org.jclouds.aws.ec2.compute.suppliers.EC2HardwareSupplier;
|
||||
import org.jclouds.aws.ec2.compute.suppliers.EC2LocationSupplier;
|
||||
import org.jclouds.aws.ec2.compute.suppliers.RegionAndNameToImageSupplier;
|
||||
import org.jclouds.aws.ec2.domain.KeyPair;
|
||||
import org.jclouds.aws.ec2.domain.PlacementGroup;
|
||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||
import org.jclouds.aws.ec2.functions.RunningInstanceToStorageMappingUnix;
|
||||
import org.jclouds.aws.ec2.predicates.InstancePresent;
|
||||
import org.jclouds.aws.ec2.predicates.PlacementGroupAvailable;
|
||||
import org.jclouds.aws.ec2.predicates.PlacementGroupDeleted;
|
||||
|
@ -69,8 +68,8 @@ import org.jclouds.compute.ComputeService;
|
|||
import org.jclouds.compute.ComputeServiceContext;
|
||||
import org.jclouds.compute.config.BaseComputeServiceContextModule;
|
||||
import org.jclouds.compute.config.ComputeServiceTimeoutsModule;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.TemplateBuilder;
|
||||
import org.jclouds.compute.internal.ComputeServiceContextImpl;
|
||||
import org.jclouds.compute.options.TemplateOptions;
|
||||
|
@ -99,7 +98,6 @@ import com.google.inject.Key;
|
|||
import com.google.inject.Provides;
|
||||
import com.google.inject.Scopes;
|
||||
import com.google.inject.TypeLiteral;
|
||||
import com.google.inject.name.Names;
|
||||
|
||||
/**
|
||||
* Configures the {@link ComputeServiceContext}; requires {@link EC2ComputeService} bound.
|
||||
|
@ -148,8 +146,6 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod
|
|||
bind(GetNodeMetadataStrategy.class).to(EC2GetNodeMetadataStrategy.class);
|
||||
bind(RebootNodeStrategy.class).to(EC2RebootNodeStrategy.class);
|
||||
bind(DestroyNodeStrategy.class).to(EC2DestroyNodeStrategy.class);
|
||||
bind(new TypeLiteral<Function<RunningInstance, Map<String, String>>>() {
|
||||
}).annotatedWith(Names.named("volumeMapping")).to(RunningInstanceToStorageMappingUnix.class).in(Scopes.SINGLETON);
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
@ -169,8 +165,8 @@ public class EC2ComputeServiceContextModule extends BaseComputeServiceContextMod
|
|||
@Override
|
||||
protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) {
|
||||
String region = injector.getInstance(Key.get(String.class, Region.class));
|
||||
return "Eucalyptus".equals(region) ? template.osFamily(CENTOS).smallest() : template.osFamily(
|
||||
UBUNTU).osVersionMatches("10.04").os64Bit(true).osDescriptionMatches(".*ubuntu-images.*");
|
||||
return "Eucalyptus".equals(region) ? template.osFamily(CENTOS).smallest() : template.osFamily(UBUNTU)
|
||||
.osVersionMatches("10.04").os64Bit(true).osDescriptionMatches(".*ubuntu-images.*");
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
|
|
@ -30,7 +30,9 @@ import org.jclouds.aws.ec2.domain.InstanceType;
|
|||
import org.jclouds.aws.ec2.domain.RootDeviceType;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.domain.Location;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
|
@ -40,6 +42,9 @@ import com.google.common.collect.ImmutableMap;
|
|||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
* @see <a
|
||||
* href="http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?instance-types.html"
|
||||
* />
|
||||
*/
|
||||
public class EC2Hardware extends HardwareImpl {
|
||||
/** The serialVersionUID */
|
||||
|
@ -68,23 +73,24 @@ public class EC2Hardware extends HardwareImpl {
|
|||
};
|
||||
}
|
||||
|
||||
EC2Hardware(String instanceType, Iterable<? extends Processor> processors, Integer ram, Integer disk,
|
||||
RootDeviceType rootDeviceType) {
|
||||
EC2Hardware(String instanceType, Iterable<? extends Processor> processors, Integer ram,
|
||||
Iterable<? extends Volume> volumes, RootDeviceType rootDeviceType) {
|
||||
super(instanceType, instanceType, instanceType, null, null, ImmutableMap.<String, String> of(), processors, ram,
|
||||
disk, hasRootDeviceType(rootDeviceType));
|
||||
volumes, hasRootDeviceType(rootDeviceType));
|
||||
this.instanceType = instanceType;
|
||||
}
|
||||
|
||||
EC2Hardware(String instanceType, Iterable<? extends Processor> processors, Integer ram, Integer disk, boolean is64Bit) {
|
||||
EC2Hardware(String instanceType, Iterable<? extends Processor> processors, Integer ram,
|
||||
Iterable<? extends Volume> volumes, boolean is64Bit) {
|
||||
super(instanceType, instanceType, instanceType, null, null, ImmutableMap.<String, String> of(), processors, ram,
|
||||
disk, is64Bit ? is64Bit() : not(is64Bit()));
|
||||
volumes, is64Bit ? is64Bit() : not(is64Bit()));
|
||||
this.instanceType = instanceType;
|
||||
}
|
||||
|
||||
public EC2Hardware(Location location, String instanceType, Iterable<? extends Processor> processors, Integer ram,
|
||||
Integer disk, String[] ids) {
|
||||
Iterable<? extends Volume> volumes, String[] ids) {
|
||||
super(instanceType, instanceType, instanceType, location, null, ImmutableMap.<String, String> of(), processors,
|
||||
ram, disk, (ids.length == 0 ? is64Bit() : idIn(Arrays.asList(ids))));
|
||||
ram, volumes, (ids.length == 0 ? is64Bit() : idIn(Arrays.asList(ids))));
|
||||
this.instanceType = instanceType;
|
||||
}
|
||||
|
||||
|
@ -99,48 +105,59 @@ public class EC2Hardware extends HardwareImpl {
|
|||
* @see InstanceType#M1_SMALL
|
||||
*/
|
||||
public static final EC2Hardware M1_SMALL = new EC2Hardware(InstanceType.M1_SMALL, ImmutableList.of(new Processor(
|
||||
1.0, 1.0)), 1740, 160, false);
|
||||
1.0, 1.0)), 1740, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(150.0f,
|
||||
"/dev/sda2", false, false)), false);
|
||||
|
||||
/**
|
||||
* @see InstanceType#T1_MICRO
|
||||
*/
|
||||
public static final EC2Hardware T1_MICRO = new EC2Hardware(InstanceType.T1_MICRO, ImmutableList.of(new Processor(
|
||||
1.0, 1.0)), 630, 0, RootDeviceType.EBS);
|
||||
1.0, 1.0)), 630, ImmutableList.<Volume> of(), RootDeviceType.EBS);
|
||||
/**
|
||||
* @see InstanceType#M1_LARGE
|
||||
*/
|
||||
public static final EC2Hardware M1_LARGE = new EC2Hardware(InstanceType.M1_LARGE, ImmutableList.of(new Processor(
|
||||
2.0, 2.0)), 7680, 850, true);
|
||||
2.0, 2.0)), 7680, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(420.0f,
|
||||
"/dev/sdb", false, false), new VolumeImpl(420.0f, "/dev/sdc", false, false)), true);
|
||||
|
||||
/**
|
||||
* @see InstanceType#M1_XLARGE
|
||||
*/
|
||||
public static final EC2Hardware M1_XLARGE = new EC2Hardware(InstanceType.M1_XLARGE, ImmutableList.of(new Processor(
|
||||
4.0, 2.0)), 15360, 1690, true);
|
||||
4.0, 2.0)), 15360, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(420.0f,
|
||||
"/dev/sdb", false, false), new VolumeImpl(420.0f, "/dev/sdc", false, false), new VolumeImpl(420.0f,
|
||||
"/dev/sdd", false, false), new VolumeImpl(420.0f, "/dev/sde", false, false)), true);
|
||||
/**
|
||||
* @see InstanceType#M2_XLARGE
|
||||
*/
|
||||
public static final EC2Hardware M2_XLARGE = new EC2Hardware(InstanceType.M2_XLARGE,ImmutableList.of(new Processor(
|
||||
2.0, 3.25)), 17510, 420, true);
|
||||
public static final EC2Hardware M2_XLARGE = new EC2Hardware(InstanceType.M2_XLARGE, ImmutableList.of(new Processor(
|
||||
2.0, 3.25)), 17510, ImmutableList.of(new VolumeImpl(420.0f, "/dev/sda1", true, false)), true);
|
||||
/**
|
||||
* @see InstanceType#M2_2XLARGE
|
||||
*/
|
||||
public static final EC2Hardware M2_2XLARGE = new EC2Hardware(InstanceType.M2_2XLARGE, ImmutableList.of(new Processor(
|
||||
4.0, 3.25)), 35020, 850, true);
|
||||
public static final EC2Hardware M2_2XLARGE = new EC2Hardware(InstanceType.M2_2XLARGE, ImmutableList
|
||||
.of(new Processor(4.0, 3.25)), 35020, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false),
|
||||
new VolumeImpl(840.0f, "/dev/sdb", false, false)), true);
|
||||
/**
|
||||
* @see InstanceType#M2_4XLARGE
|
||||
*/
|
||||
public static final EC2Hardware M2_4XLARGE = new EC2Hardware(InstanceType.M2_4XLARGE,ImmutableList.of(new Processor(
|
||||
8.0, 3.25)), 70041, 1690, true);
|
||||
public static final EC2Hardware M2_4XLARGE = new EC2Hardware(InstanceType.M2_4XLARGE, ImmutableList
|
||||
.of(new Processor(8.0, 3.25)), 70041, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false),
|
||||
new VolumeImpl(840.0f, "/dev/sdb", false, false), new VolumeImpl(840.0f, "/dev/sdc", false, false)), true);
|
||||
/**
|
||||
* @see InstanceType#C1_MEDIUM
|
||||
*/
|
||||
public static final EC2Hardware C1_MEDIUM = new EC2Hardware(InstanceType.C1_MEDIUM, ImmutableList.of(new Processor(
|
||||
2.0, 2.5)), 1740, 350, false);
|
||||
2.0, 2.5)), 1740, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(340.0f,
|
||||
"/dev/sda2", false, false)), false);
|
||||
|
||||
/**
|
||||
* @see InstanceType#C1_XLARGE
|
||||
*/
|
||||
public static final EC2Hardware C1_XLARGE = new EC2Hardware(InstanceType.C1_XLARGE, ImmutableList.of(new Processor(
|
||||
8.0, 2.5)), 7168, 1690, true);
|
||||
8.0, 2.5)), 7168, ImmutableList.of(new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(420.0f,
|
||||
"/dev/sdb", false, false), new VolumeImpl(420.0f, "/dev/sdc", false, false), new VolumeImpl(420.0f,
|
||||
"/dev/sdd", false, false), new VolumeImpl(420.0f, "/dev/sde", false, false)), true);
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
|
|
|
@ -26,24 +26,30 @@ import java.net.URI;
|
|||
import java.util.Map;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Set;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.aws.ec2.EC2Client;
|
||||
import org.jclouds.aws.ec2.compute.domain.RegionAndName;
|
||||
import org.jclouds.aws.ec2.domain.InstanceState;
|
||||
import org.jclouds.aws.ec2.domain.KeyPair;
|
||||
import org.jclouds.aws.ec2.domain.RootDeviceType;
|
||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||
import org.jclouds.aws.ec2.domain.RunningInstance.EbsBlockDevice;
|
||||
import org.jclouds.aws.ec2.options.DescribeImagesOptions;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.domain.internal.NodeMetadataImpl;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
|
||||
import org.jclouds.compute.util.ComputeServiceUtils;
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.logging.Logger;
|
||||
|
@ -54,7 +60,6 @@ import com.google.common.base.Predicate;
|
|||
import com.google.common.base.Supplier;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Maps;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
|
@ -76,19 +81,19 @@ public class RunningInstanceToNodeMetadata implements Function<RunningInstance,
|
|||
private final Map<RegionAndName, KeyPair> credentialsMap;
|
||||
private final PopulateDefaultLoginCredentialsForImageStrategy credentialProvider;
|
||||
private final Supplier<Set<? extends Location>> locations;
|
||||
private final Function<RunningInstance, Map<String, String>> instanceToStorageMapping;
|
||||
private final Supplier<Set<? extends Hardware>> hardware;
|
||||
private final ConcurrentMap<RegionAndName, Image> imageMap;
|
||||
|
||||
@Inject
|
||||
RunningInstanceToNodeMetadata(EC2Client client, Map<RegionAndName, KeyPair> credentialsMap,
|
||||
PopulateDefaultLoginCredentialsForImageStrategy credentialProvider,
|
||||
ConcurrentMap<RegionAndName, Image> imageMap, Supplier<Set<? extends Location>> locations,
|
||||
@Named("volumeMapping") Function<RunningInstance, Map<String, String>> instanceToStorageMapping) {
|
||||
Supplier<Set<? extends Hardware>> hardware) {
|
||||
this.client = checkNotNull(client, "client");
|
||||
this.credentialsMap = checkNotNull(credentialsMap, "credentialsMap");
|
||||
this.credentialProvider = checkNotNull(credentialProvider, "credentialProvider");
|
||||
this.locations = checkNotNull(locations, "locations");
|
||||
this.instanceToStorageMapping = checkNotNull(instanceToStorageMapping, "instanceToStorageMapping");
|
||||
this.hardware = checkNotNull(hardware, "hardware");
|
||||
this.imageMap = checkNotNull(imageMap, "imageMap");
|
||||
}
|
||||
|
||||
|
@ -110,15 +115,46 @@ public class RunningInstanceToNodeMetadata implements Function<RunningInstance,
|
|||
Set<String> publicAddresses = nullSafeSet(instance.getIpAddress());
|
||||
Set<String> privateAddresses = nullSafeSet(instance.getPrivateIpAddress());
|
||||
|
||||
Map<String, String> extra = getExtra(instance);
|
||||
Hardware hardware = getHardwareForInstance(instance);
|
||||
|
||||
if (hardware != null) {
|
||||
hardware = ComputeServiceUtils.replacesVolumes(hardware, addEBS(instance, hardware.getVolumes()));
|
||||
}
|
||||
|
||||
Location location = getLocationForAvailabilityZone(instance);
|
||||
|
||||
Image image = resolveImageForInstanceInLocation(instance, location);
|
||||
|
||||
return new NodeMetadataImpl(id, name, instance.getRegion() + "/" + instance.getId(), location, uri, userMetadata,
|
||||
tag, instance.getRegion() + "/" + instance.getImageId(), image != null ? image.getOperatingSystem()
|
||||
: null, state, publicAddresses, privateAddresses, extra, credentials);
|
||||
tag, hardware, instance.getRegion() + "/" + instance.getImageId(), image != null ? image
|
||||
.getOperatingSystem() : null, state, publicAddresses, privateAddresses, credentials);
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
static Iterable<? extends Volume> addEBS(final RunningInstance instance, Iterable<? extends Volume> volumes) {
|
||||
Iterable<Volume> ebsVolumes = Iterables.transform(instance.getEbsBlockDevices().entrySet(),
|
||||
new Function<Entry<String, EbsBlockDevice>, Volume>() {
|
||||
|
||||
@Override
|
||||
public Volume apply(Entry<String, EbsBlockDevice> from) {
|
||||
return new VolumeImpl(from.getValue().getVolumeId(), Volume.Type.SAN, null, from.getKey(),
|
||||
instance.getRootDeviceName().equals(from.getKey()), true);
|
||||
}
|
||||
});
|
||||
|
||||
if (instance.getRootDeviceType() == RootDeviceType.EBS) {
|
||||
volumes = Iterables.filter(volumes, new Predicate<Volume>() {
|
||||
|
||||
@Override
|
||||
public boolean apply(Volume input) {
|
||||
return !input.isBootDevice();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
return Iterables.concat(volumes, ebsVolumes);
|
||||
|
||||
}
|
||||
|
||||
private Credentials getCredentialsForInstanceWithTag(final RunningInstance instance, String tag) {
|
||||
|
@ -152,6 +188,23 @@ public class RunningInstanceToNodeMetadata implements Function<RunningInstance,
|
|||
return tag;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
Hardware getHardwareForInstance(final RunningInstance instance) {
|
||||
try {
|
||||
return Iterables.find(hardware.get(), new Predicate<Hardware>() {
|
||||
|
||||
@Override
|
||||
public boolean apply(Hardware input) {
|
||||
return input.getId().equals(instance.getInstanceType());
|
||||
}
|
||||
|
||||
});
|
||||
} catch (NoSuchElementException e) {
|
||||
logger.debug("couldn't match instance type %s in: %s", instance.getInstanceType(), hardware.get());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private Location getLocationForAvailabilityZone(final RunningInstance instance) {
|
||||
final String locationId = instance.getAvailabilityZone();
|
||||
|
||||
|
@ -178,30 +231,6 @@ public class RunningInstanceToNodeMetadata implements Function<RunningInstance,
|
|||
return image;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set extras for the node.
|
||||
*
|
||||
* Extras are derived from either additional API calls or hard-coded values.
|
||||
*
|
||||
* @param instance
|
||||
* instance for which the extras are retrieved
|
||||
* @return map with extras
|
||||
*/
|
||||
@VisibleForTesting
|
||||
Map<String, String> getExtra(RunningInstance instance) {
|
||||
Map<String, String> extra = Maps.newHashMap();
|
||||
extra.put("virtualizationType", instance.getVirtualizationType());
|
||||
if (instance.getPlacementGroup() != null)
|
||||
extra.put("placementGroup", instance.getPlacementGroup());
|
||||
if (instance.getSubnetId() != null)
|
||||
extra.put("subnetId", instance.getSubnetId());
|
||||
// put storage info
|
||||
/* TODO: only valid for UNIX */
|
||||
extra.putAll(instanceToStorageMapping.apply(instance));
|
||||
|
||||
return extra;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
String getPrivateKeyOrNull(RunningInstance instance, String tag) {
|
||||
KeyPair keyPair = credentialsMap.get(new RegionAndName(instance.getRegion(), instance.getKeyName()));
|
||||
|
|
|
@ -34,6 +34,7 @@ import org.jclouds.aws.ec2.compute.domain.EC2Hardware;
|
|||
import org.jclouds.aws.ec2.domain.InstanceType;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.domain.LocationScope;
|
||||
|
@ -76,7 +77,9 @@ public class EC2HardwareSupplier implements Supplier<Set<? extends Hardware>> {
|
|||
|
||||
});
|
||||
sizes.add(new EC2Hardware(location, InstanceType.CC1_4XLARGE, ImmutableList.of(new Processor(4.0, 4.0),
|
||||
new Processor(4.0, 4.0)), 23 * 1024, 1690, ccAmis));
|
||||
new Processor(4.0, 4.0)), 23 * 1024, ImmutableList.of(
|
||||
new VolumeImpl(10.0f, "/dev/sda1", true, false), new VolumeImpl(840.0f, "/dev/sdb", false, false),
|
||||
new VolumeImpl(840.0f, "/dev/sdc", false, false)), ccAmis));
|
||||
}
|
||||
sizes.addAll(ImmutableSet.<Hardware> of(EC2Hardware.T1_MICRO, EC2Hardware.C1_MEDIUM, EC2Hardware.C1_XLARGE,
|
||||
EC2Hardware.M1_LARGE, EC2Hardware.M1_SMALL, EC2Hardware.M1_XLARGE, EC2Hardware.M2_XLARGE,
|
||||
|
|
|
@ -1,180 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.aws.ec2.functions;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.Maps;
|
||||
import org.jclouds.aws.ec2.domain.InstanceType;
|
||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import static org.jclouds.compute.reference.ComputeServiceConstants.LOCAL_PARTITION_GB_PATTERN;
|
||||
|
||||
/**
|
||||
* Map the instance to storage information known about it. This information is statically set as
|
||||
* described by Amazon.
|
||||
*
|
||||
* Note that having the partitions available doesn't mean they're formatted/mounted by default. The
|
||||
* links below describe what partitions are formatted initially. To format/mount an available
|
||||
* device, refer to <a href="http://meinit.nl/howto-use-amazon-elastic-compute-cloud-ec2">this
|
||||
* article</a>.
|
||||
*
|
||||
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/2010-06-15/UserGuide/index.html?instance-storage-concepts.html"
|
||||
* />
|
||||
* @see <a
|
||||
* href="http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?instance-types.html"
|
||||
* />
|
||||
*
|
||||
* @author Oleksiy Yarmula
|
||||
*/
|
||||
public class RunningInstanceToStorageMappingUnix implements Function<RunningInstance, Map<String, String>> {
|
||||
|
||||
public final static String ROOT_PARTITION_NAME_UNIX = "/dev/sda1";
|
||||
|
||||
@Override
|
||||
public Map<String, String> apply(RunningInstance instance) {
|
||||
final String instanceType = instance.getInstanceType();
|
||||
|
||||
Map<String, String> mapping = Maps.newHashMap();
|
||||
|
||||
// root partition
|
||||
mapping.put(String.format(LOCAL_PARTITION_GB_PATTERN, ROOT_PARTITION_NAME_UNIX),
|
||||
getRootPartitionSizeForInstanceType(instanceType) + "");
|
||||
|
||||
// primary partition (always formatted/mounted)
|
||||
mapping.put(String.format(LOCAL_PARTITION_GB_PATTERN, getPrimaryPartitionDeviceName(instanceType)),
|
||||
getPrimaryPartitionSizeForInstanceType(instanceType) + "");
|
||||
|
||||
// additional partitions if any
|
||||
for (Map.Entry<String, Integer> entry : getAdditionalPartitionsMapping(instanceType).entrySet()) {
|
||||
mapping.put(String.format(LOCAL_PARTITION_GB_PATTERN, entry.getKey()), entry.getValue() + "");
|
||||
}
|
||||
|
||||
return mapping;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the root partition size. Note, this is usually a rather small partition. Refer to
|
||||
* {@link #getPrimaryPartitionSizeForInstanceType} to determine the size of the primary (usually,
|
||||
* biggest) partition. In some cases, for large instances there are several partitions of the
|
||||
* size of primary partition.
|
||||
*
|
||||
* @param instanceType
|
||||
* for which the root partition size is to be determined
|
||||
* @return size in GB
|
||||
*
|
||||
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/2010-06-15/UserGuide/index.html?instance-storage-concepts.html"
|
||||
* />
|
||||
* @see <a href=
|
||||
* "http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?instance-types.html"
|
||||
* />
|
||||
*/
|
||||
public int getRootPartitionSizeForInstanceType(String instanceType) {
|
||||
/*
|
||||
* per documentation at
|
||||
* http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?instance-types.html M2
|
||||
* XLARGE doesn't have the root partition TODO verify
|
||||
*/
|
||||
if (InstanceType.M2_XLARGE.equals(instanceType))
|
||||
return 0;
|
||||
|
||||
// other types have 10 GB root partition
|
||||
return 10;
|
||||
}
|
||||
|
||||
public static String getPrimaryPartitionDeviceName(String instanceType) {
|
||||
if (InstanceType.M1_SMALL.equals(instanceType) || InstanceType.C1_MEDIUM.equals(instanceType))
|
||||
return "/dev/sda2";
|
||||
return "/dev/sdb";
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the primary partition size.
|
||||
*
|
||||
* This is usually the biggest partition. In some cases, for large instances there are several
|
||||
* partitions of the size of primary partition.
|
||||
*
|
||||
* @param instanceType
|
||||
* for which the primary partition size is to be determined
|
||||
* @return size in GB
|
||||
*/
|
||||
public static int getPrimaryPartitionSizeForInstanceType(String instanceType) {
|
||||
if (InstanceType.M1_SMALL.equals(instanceType)) {
|
||||
return 150;
|
||||
} else if (InstanceType.C1_MEDIUM.equals(instanceType)) {
|
||||
return 340;
|
||||
} else if (InstanceType.M1_LARGE.equals(instanceType)) {
|
||||
return 420;
|
||||
} else if (InstanceType.M1_XLARGE.equals(instanceType)) {
|
||||
return 420;
|
||||
} else if (InstanceType.C1_XLARGE.equals(instanceType)) {
|
||||
return 420;
|
||||
} else if (InstanceType.M2_XLARGE.equals(instanceType)) {
|
||||
return 420;
|
||||
} else if (InstanceType.M2_2XLARGE.equals(instanceType)) {
|
||||
return 840;
|
||||
} else if (InstanceType.M2_4XLARGE.equals(instanceType)) {
|
||||
return 840;
|
||||
} else if (InstanceType.CC1_4XLARGE.equals(instanceType))
|
||||
return 840;
|
||||
return 150;// TODO make this more graceful
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve additional devices mapping (non-root and non-primary) for the instance type.
|
||||
*
|
||||
* @param instanceType
|
||||
* @return map with device name(s) and size(s) or empty map if the instance doesn't have any
|
||||
* additional
|
||||
*
|
||||
* @see <a href="http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/index.html?concepts-amis-and-instances.html#instance-types"
|
||||
* />
|
||||
*/
|
||||
public static Map<String, Integer> getAdditionalPartitionsMapping(String instanceType) {
|
||||
Map<String, Integer> mapping = Maps.newHashMap();
|
||||
|
||||
int size = 0;
|
||||
if (InstanceType.M1_LARGE.equals(instanceType) || InstanceType.M1_XLARGE.equals(instanceType)
|
||||
|| InstanceType.C1_XLARGE.equals(instanceType)) {
|
||||
size = 420;
|
||||
} else if (InstanceType.M2_4XLARGE.equals(instanceType) || instanceType.startsWith("cc")) {
|
||||
size = 840;
|
||||
}
|
||||
|
||||
// m1.large, m1.xlarge, and c1.xlarge
|
||||
if (InstanceType.M1_LARGE.equals(instanceType) || InstanceType.M1_XLARGE.equals(instanceType)
|
||||
|| InstanceType.C1_XLARGE.equals(instanceType) || InstanceType.M2_4XLARGE.equals(instanceType)
|
||||
|| instanceType.startsWith("cc")) {
|
||||
|
||||
mapping.put("/dev/sdc", size);
|
||||
}
|
||||
|
||||
if (InstanceType.M1_XLARGE.equals(instanceType) || InstanceType.C1_XLARGE.equals(instanceType)) {
|
||||
mapping.put("/dev/sdd", size);
|
||||
}
|
||||
|
||||
if (InstanceType.M1_XLARGE.equals(instanceType) || InstanceType.C1_XLARGE.equals(instanceType)) {
|
||||
mapping.put("/dev/sde", size);
|
||||
}
|
||||
|
||||
return mapping;
|
||||
}
|
||||
}
|
|
@ -53,6 +53,7 @@ import org.jclouds.blobstore.domain.internal.PageSetImpl;
|
|||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||
import org.jclouds.blobstore.internal.BaseAsyncBlobStore;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.concurrent.Futures;
|
||||
|
@ -89,8 +90,8 @@ public class S3AsyncBlobStore extends BaseAsyncBlobStore {
|
|||
BucketToResourceMetadata bucket2ResourceMd, ContainerToBucketListOptions container2BucketListOptions,
|
||||
BucketToResourceList bucket2ResourceList, ObjectToBlob object2Blob,
|
||||
BlobToHttpGetOptions blob2ObjectGetOptions, BlobToObject blob2Object, ObjectToBlobMetadata object2BlobMd,
|
||||
Provider<FetchBlobMetadata> fetchBlobMetadataProvider) {
|
||||
super(context, blobUtils, service, defaultLocation, locations);
|
||||
Provider<FetchBlobMetadata> fetchBlobMetadataProvider, SignRequestForBlobStrategy signRequestForBlob) {
|
||||
super(context, blobUtils, service, defaultLocation, locations, signRequestForBlob);
|
||||
this.blob2ObjectGetOptions = checkNotNull(blob2ObjectGetOptions, "blob2ObjectGetOptions");
|
||||
this.async = checkNotNull(async, "async");
|
||||
this.sync = checkNotNull(sync, "sync");
|
||||
|
|
|
@ -47,6 +47,7 @@ import org.jclouds.blobstore.domain.internal.PageSetImpl;
|
|||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||
import org.jclouds.blobstore.internal.BaseBlobStore;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.domain.Location;
|
||||
|
@ -78,8 +79,8 @@ public class S3BlobStore extends BaseBlobStore {
|
|||
Supplier<Set<? extends Location>> locations, S3Client sync, BucketToResourceMetadata bucket2ResourceMd,
|
||||
ContainerToBucketListOptions container2BucketListOptions, BucketToResourceList bucket2ResourceList,
|
||||
ObjectToBlob object2Blob, BlobToHttpGetOptions blob2ObjectGetOptions, BlobToObject blob2Object,
|
||||
ObjectToBlobMetadata object2BlobMd, Provider<FetchBlobMetadata> fetchBlobMetadataProvider) {
|
||||
super(context, blobUtils, defaultLocation, locations);
|
||||
ObjectToBlobMetadata object2BlobMd, Provider<FetchBlobMetadata> fetchBlobMetadataProvider, SignRequestForBlobStrategy signRequestForBlob) {
|
||||
super(context, blobUtils, defaultLocation, locations, signRequestForBlob);
|
||||
this.blob2ObjectGetOptions = checkNotNull(blob2ObjectGetOptions, "blob2ObjectGetOptions");
|
||||
this.sync = checkNotNull(sync, "sync");
|
||||
this.bucket2ResourceMd = checkNotNull(bucket2ResourceMd, "bucket2ResourceMd");
|
||||
|
|
|
@ -28,6 +28,7 @@ import org.jclouds.aws.s3.S3AsyncClient;
|
|||
import org.jclouds.aws.s3.S3Client;
|
||||
import org.jclouds.aws.s3.blobstore.S3AsyncBlobStore;
|
||||
import org.jclouds.aws.s3.blobstore.S3BlobStore;
|
||||
import org.jclouds.aws.s3.blobstore.strategy.SignGetObject;
|
||||
import org.jclouds.aws.suppliers.DefaultLocationSupplier;
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
|
@ -35,6 +36,7 @@ import org.jclouds.blobstore.BlobStoreContext;
|
|||
import org.jclouds.blobstore.attr.ConsistencyModel;
|
||||
import org.jclouds.blobstore.config.BlobStoreMapModule;
|
||||
import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.domain.LocationScope;
|
||||
import org.jclouds.domain.internal.LocationImpl;
|
||||
|
@ -66,6 +68,7 @@ public class S3BlobStoreContextModule extends AbstractModule {
|
|||
bind(BlobStore.class).to(S3BlobStore.class).in(Scopes.SINGLETON);
|
||||
bind(BlobStoreContext.class).to(new TypeLiteral<BlobStoreContextImpl<S3Client, S3AsyncClient>>() {
|
||||
}).in(Scopes.SINGLETON);
|
||||
bind(SignRequestForBlobStrategy.class).to(SignGetObject.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.aws.s3.blobstore.strategy;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.aws.s3.S3AsyncClient;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class SignGetObject implements SignRequestForBlobStrategy {
|
||||
private final RestAnnotationProcessor<S3AsyncClient> processor;
|
||||
private final Method method;
|
||||
|
||||
@Inject
|
||||
public SignGetObject(RestAnnotationProcessor<S3AsyncClient> processor) throws SecurityException,
|
||||
NoSuchMethodException {
|
||||
this.processor = checkNotNull(processor, "processor");
|
||||
this.method = S3AsyncClient.class.getMethod("getObject", String.class, String.class, GetOptions[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest apply(String container, String name) {
|
||||
GeneratedHttpRequest<S3AsyncClient> returnVal = processor.createRequest(method, checkNotNull(container,
|
||||
"container"), checkNotNull(name, "name"));
|
||||
for (HttpRequestFilter filter : returnVal.getFilters())
|
||||
filter.filter(returnVal);
|
||||
return new HttpRequest(returnVal.getMethod(), returnVal.getEndpoint(), ImmutableMultimap.copyOf(returnVal
|
||||
.getHeaders()));
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.aws;
|
||||
|
||||
import static org.jclouds.compute.BaseComputeServiceLiveTest.buildScript;
|
||||
import static org.jclouds.compute.options.TemplateOptions.Builder.runScript;
|
||||
import static org.jclouds.compute.util.ComputeServiceUtils.buildCurlsh;
|
||||
import static org.jclouds.io.Payloads.newStringPayload;
|
||||
|
||||
import org.jclouds.aws.ec2.compute.BlobStoreAndComputeServiceLiveTest;
|
||||
import org.jclouds.compute.RunNodesException;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.OperatingSystem;
|
||||
import org.jclouds.compute.options.TemplateOptions;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "live", testName = "jclouds.ComputeAndBlobStoreTogetherHappilyLiveTest")
|
||||
public class ComputeAndBlobStoreTogetherHappilyLiveTest extends BlobStoreAndComputeServiceLiveTest {
|
||||
|
||||
protected void setupCredentials() {
|
||||
blobStoreProvider = "s3";
|
||||
computeServiceProvider = "ec2";
|
||||
super.setupCredentials();
|
||||
}
|
||||
|
||||
/**
|
||||
* This test generates a bootstrap script based on the default operating system of the compute
|
||||
* provider.
|
||||
* <p/>
|
||||
* It then uploads this to a blobstore, in a private location. Now, we want the bootstrap of the
|
||||
* server to be able to load from this location without sending credentials to the starting
|
||||
* machine. Accordingly, we send a signed url instead.
|
||||
* <p/>
|
||||
* Using the {@link BlobStore} api, we get a signed url corresponding to the bootstrap script. We
|
||||
* next convert this into something that can be invoked via the commandline. Looking around, it
|
||||
* seems like alestic runurl is pretty close. However, it is limited as it only works on requests
|
||||
* that can be fully specified without headers (ex. Amazon S3). Instead, we use a variant
|
||||
* (curlsh).
|
||||
* <p/>
|
||||
* curlsh simply assembles an http request, headers and all, and passes it to bash
|
||||
* <p/>
|
||||
* With this script ready, any node or nodes will take instructions from the blobstore when it
|
||||
* boots up. we verify this with an assertion.
|
||||
*
|
||||
*/
|
||||
@Test
|
||||
public void testWeCanIndirectBootstrapInstructionsToAnArbitraryAndPrivateBlobStore() throws RunNodesException {
|
||||
|
||||
OperatingSystem defaultOperatingSystem = computeContext.getComputeService().templateBuilder().build().getImage()
|
||||
.getOperatingSystem();
|
||||
|
||||
// using jclouds ability to detect operating systems before we launch them, we can avoid
|
||||
// the bad practice of assuming everything is ubuntu.
|
||||
uploadBlob(tag, "openjdk/install", buildScript(defaultOperatingSystem));
|
||||
|
||||
// instead of hard-coding to amazon s3, we can use any blobstore, conceding this test is
|
||||
// configured for amz. Note we are getting temporary access to a private blob.
|
||||
HttpRequest signedRequestOfInstallScript = blobContext.getBlobStore().signRequestForBlob(tag, "openjdk/install");
|
||||
|
||||
// instruct the bootstrap to pull the script from the blobstore and invoke it directly with bash.
|
||||
TemplateOptions runOpenJDKInstallDirectlyFromBlobStore = runScript(newStringPayload(buildCurlsh(signedRequestOfInstallScript)));
|
||||
|
||||
// now that we have the correct instructions, kick-off the provisioner
|
||||
Iterable<? extends NodeMetadata> nodes = computeContext.getComputeService().runNodesWithTag(tag, 1,
|
||||
runOpenJDKInstallDirectlyFromBlobStore);
|
||||
|
||||
// ensure the bootstrap operated by checking for a known signature of success.
|
||||
assertSshOutputOfCommandContains(nodes, "openjdk -version", "OpenJDK");
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,112 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.aws.ec2.compute;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static com.google.common.collect.Iterables.get;
|
||||
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
import org.jclouds.blobstore.BlobStoreContextFactory;
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.compute.ComputeServiceContext;
|
||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.predicates.NodePredicates;
|
||||
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||
import org.jclouds.net.IPSocket;
|
||||
import org.jclouds.ssh.ExecResponse;
|
||||
import org.jclouds.ssh.SshClient;
|
||||
import org.jclouds.ssh.jsch.config.JschSshClientModule;
|
||||
import org.testng.annotations.AfterGroups;
|
||||
import org.testng.annotations.BeforeGroups;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class BlobStoreAndComputeServiceLiveTest {
|
||||
|
||||
protected ComputeServiceContext computeContext;
|
||||
protected BlobStoreContext blobContext;
|
||||
protected String tag = System.getProperty("user.name") + "happy";
|
||||
protected String identity;
|
||||
protected String credential;
|
||||
protected String blobStoreProvider;
|
||||
protected String computeServiceProvider;
|
||||
|
||||
protected void setupCredentials() {
|
||||
tag = System.getProperty("user.name") + "happy";
|
||||
identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity");
|
||||
credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential");
|
||||
}
|
||||
|
||||
@BeforeGroups(groups = { "live" })
|
||||
public void setupClient() {
|
||||
setupCredentials();
|
||||
computeContext = new ComputeServiceContextFactory().createContext(computeServiceProvider, identity, credential,
|
||||
ImmutableSet.of(new Log4JLoggingModule(), new JschSshClientModule()));
|
||||
blobContext = new BlobStoreContextFactory().createContext(blobStoreProvider, identity, credential,
|
||||
ImmutableSet.of(new Log4JLoggingModule()));
|
||||
blobContext.getAsyncBlobStore().createContainerInLocation(null, tag);
|
||||
computeContext.getComputeService().destroyNodesMatching(NodePredicates.withTag(tag));
|
||||
}
|
||||
|
||||
protected void assertSshOutputOfCommandContains(Iterable<? extends NodeMetadata> nodes, String cmd, String expects) {
|
||||
IPSocket socket = new IPSocket(get(get(nodes, 0).getPublicAddresses(), 0), 22);
|
||||
|
||||
SshClient ssh = computeContext.utils().sshFactory().create(socket, get(nodes, 0).getCredentials().identity,
|
||||
get(nodes, 0).getCredentials().credential.getBytes());
|
||||
try {
|
||||
ssh.connect();
|
||||
;
|
||||
ExecResponse exec = ssh.exec(cmd);
|
||||
assert exec.getOutput().indexOf(expects) != -1 || exec.getError().indexOf(expects) != -1 : exec;
|
||||
} finally {
|
||||
if (ssh != null)
|
||||
ssh.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
protected void uploadBlob(String container, String name, String script) {
|
||||
Blob blob = blobContext.getBlobStore().newBlob(name);
|
||||
blob.setPayload(script);
|
||||
blob.getPayload().setContentType("text/plain");
|
||||
blobContext.getBlobStore().putBlob(container, blob);
|
||||
}
|
||||
|
||||
@AfterGroups(groups = { "live" })
|
||||
public void teardownCompute() {
|
||||
if (computeContext != null) {
|
||||
computeContext.getComputeService().destroyNodesMatching(NodePredicates.withTag(tag));
|
||||
computeContext.close();
|
||||
}
|
||||
}
|
||||
|
||||
@AfterGroups(groups = { "live" })
|
||||
public void teardownBlobStore() {
|
||||
if (blobContext != null) {
|
||||
blobContext.getAsyncBlobStore().deleteContainer(tag);
|
||||
blobContext.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -282,7 +282,6 @@ public class EC2ComputeServiceLiveTest extends BaseComputeServiceLiveTest {
|
|||
RunningInstance instance = getInstance(instanceClient, startedId);
|
||||
|
||||
assertEquals(instance.getSubnetId(), subnetId);
|
||||
assertEquals(instance.getSubnetId(), Iterables.getOnlyElement(nodes).getExtra().get("subnetId"));
|
||||
|
||||
} finally {
|
||||
if (nodeId != null)
|
||||
|
|
|
@ -40,6 +40,7 @@ import org.jclouds.compute.domain.Template;
|
|||
import org.jclouds.compute.domain.TemplateBuilder;
|
||||
import org.jclouds.compute.domain.internal.ImageImpl;
|
||||
import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.compute.options.TemplateOptions;
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.domain.Location;
|
||||
|
@ -57,8 +58,8 @@ import com.google.common.collect.Maps;
|
|||
/**
|
||||
* Tests compute service specifically to EC2.
|
||||
*
|
||||
* These tests are designed to verify the local functionality of jclouds, rather
|
||||
* than the interaction with Amazon Web Services.
|
||||
* These tests are designed to verify the local functionality of jclouds, rather than the
|
||||
* interaction with Amazon Web Services.
|
||||
*
|
||||
* @see EC2ComputeServiceLiveTest
|
||||
*
|
||||
|
@ -68,12 +69,13 @@ public class EC2ComputeServiceTest {
|
|||
private static final Location location = new LocationImpl(LocationScope.REGION, "us-east-1", "us east", null);
|
||||
|
||||
public static final EC2Hardware CC1_4XLARGE = new EC2Hardware(location, InstanceType.CC1_4XLARGE, ImmutableList.of(
|
||||
new Processor(4.0, 4.0), new Processor(4.0, 4.0)), 23 * 1024, 1690, new String[] { "us-east-1/cc-image" });
|
||||
new Processor(4.0, 4.0), new Processor(4.0, 4.0)), 23 * 1024, ImmutableList.of(new VolumeImpl(10.0f,
|
||||
"/dev/sda1", true, false), new VolumeImpl(840.0f, "/dev/sdb", false, false), new VolumeImpl(840.0f,
|
||||
"/dev/sdc", false, false)), new String[] { "us-east-1/cc-image" });
|
||||
|
||||
/**
|
||||
* Verifies that {@link TemplateBuilderImpl} would choose the correct size of
|
||||
* the instance, based on {@link org.jclouds.compute.domain.Hardware} from
|
||||
* {@link EC2Hardware}.
|
||||
* Verifies that {@link TemplateBuilderImpl} would choose the correct size of the instance, based
|
||||
* on {@link org.jclouds.compute.domain.Hardware} from {@link EC2Hardware}.
|
||||
*
|
||||
* Expected size: m2.xlarge
|
||||
*/
|
||||
|
@ -83,8 +85,8 @@ public class EC2ComputeServiceTest {
|
|||
|
||||
assert template != null : "The returned template was null, but it should have a value.";
|
||||
assert EC2Hardware.M2_XLARGE.equals(template.getHardware()) : format(
|
||||
"Incorrect image determined by the template. Expected: %s. Found: %s.", "m2.xlarge",
|
||||
String.valueOf(template.getHardware()));
|
||||
"Incorrect image determined by the template. Expected: %s. Found: %s.", "m2.xlarge", String
|
||||
.valueOf(template.getHardware()));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -93,46 +95,44 @@ public class EC2ComputeServiceTest {
|
|||
|
||||
assert template != null : "The returned template was null, but it should have a value.";
|
||||
assert CC1_4XLARGE.equals(template.getHardware()) : format(
|
||||
"Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE.getId(),
|
||||
String.valueOf(template.getHardware()));
|
||||
"Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE.getId(), String
|
||||
.valueOf(template.getHardware()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies that {@link TemplateBuilderImpl} would choose the correct size of
|
||||
* the instance, based on physical attributes (# of cores, ram, etc).
|
||||
* Verifies that {@link TemplateBuilderImpl} would choose the correct size of the instance, based
|
||||
* on physical attributes (# of cores, ram, etc).
|
||||
*
|
||||
* Expected size: m2.xlarge
|
||||
*/
|
||||
@Test
|
||||
public void testTemplateChoiceForInstanceByAttributes() throws Exception {
|
||||
Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.5).smallest()
|
||||
.locationId("us-east-1").build();
|
||||
Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.5).smallest().locationId(
|
||||
"us-east-1").build();
|
||||
|
||||
assert template != null : "The returned template was null, but it should have a value.";
|
||||
assert CC1_4XLARGE.equals(template.getHardware()) : format(
|
||||
"Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE,
|
||||
String.valueOf(template.getHardware()));
|
||||
"Incorrect image determined by the template. Expected: %s. Found: %s.", CC1_4XLARGE, String
|
||||
.valueOf(template.getHardware()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Negative test version of
|
||||
* {@link #testTemplateChoiceForInstanceByAttributes}.
|
||||
* Negative test version of {@link #testTemplateChoiceForInstanceByAttributes}.
|
||||
*
|
||||
* Verifies that {@link TemplateBuilderImpl} would not choose the
|
||||
* insufficient size of the instance, based on physical attributes (# of
|
||||
* cores, ram, etc).
|
||||
* Verifies that {@link TemplateBuilderImpl} would not choose the insufficient size of the
|
||||
* instance, based on physical attributes (# of cores, ram, etc).
|
||||
*
|
||||
* Expected size: anything but m2.xlarge
|
||||
*/
|
||||
@Test
|
||||
public void testNegativeTemplateChoiceForInstanceByAttributes() throws Exception {
|
||||
Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.7).smallest()
|
||||
.locationId("us-east-1").build();
|
||||
Template template = newTemplateBuilder().os64Bit(true).minRam(17510).minCores(6.7).smallest().locationId(
|
||||
"us-east-1").build();
|
||||
|
||||
assert template != null : "The returned template was null, but it should have a value.";
|
||||
assert !EC2Hardware.M2_XLARGE.equals(template.getHardware()) : format(
|
||||
"Incorrect image determined by the template. Expected: not %s. Found: %s.", "m2.xlarge",
|
||||
String.valueOf(template.getHardware()));
|
||||
"Incorrect image determined by the template. Expected: not %s. Found: %s.", "m2.xlarge", String
|
||||
.valueOf(template.getHardware()));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
@ -144,10 +144,9 @@ public class EC2ComputeServiceTest {
|
|||
|
||||
expect(optionsProvider.get()).andReturn(defaultOptions);
|
||||
|
||||
Image image = new ImageImpl("cc-image", "image", "us-east-1/cc-image", location, null,
|
||||
Maps.<String, String> newHashMap(),
|
||||
new OperatingSystem(OsFamily.UBUNTU, null, "1.0", null, "ubuntu", true), "description", "1.0",
|
||||
new Credentials("root", null));
|
||||
Image image = new ImageImpl("cc-image", "image", "us-east-1/cc-image", location, null, Maps
|
||||
.<String, String> newHashMap(), new OperatingSystem(OsFamily.UBUNTU, null, "1.0", null, "ubuntu", true),
|
||||
"description", "1.0", new Credentials("root", null));
|
||||
replay(optionsProvider);
|
||||
replay(templateBuilderProvider);
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
|
|
|
@ -33,6 +33,7 @@ import java.util.concurrent.ConcurrentMap;
|
|||
|
||||
import org.jclouds.aws.domain.Region;
|
||||
import org.jclouds.aws.ec2.EC2Client;
|
||||
import org.jclouds.aws.ec2.compute.domain.EC2Hardware;
|
||||
import org.jclouds.aws.ec2.compute.domain.RegionAndName;
|
||||
import org.jclouds.aws.ec2.domain.AvailabilityZone;
|
||||
import org.jclouds.aws.ec2.domain.Image;
|
||||
|
@ -40,8 +41,8 @@ import org.jclouds.aws.ec2.domain.InstanceState;
|
|||
import org.jclouds.aws.ec2.domain.InstanceType;
|
||||
import org.jclouds.aws.ec2.domain.KeyPair;
|
||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||
import org.jclouds.aws.ec2.functions.RunningInstanceToStorageMappingUnix;
|
||||
import org.jclouds.aws.ec2.services.AMIClient;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.OperatingSystem;
|
||||
import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy;
|
||||
|
@ -83,6 +84,8 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null);
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
.<Location> of(location));
|
||||
Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(EC2Hardware.M2_4XLARGE));
|
||||
PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class);
|
||||
RunningInstance instance = createMock(RunningInstance.class);
|
||||
|
||||
|
@ -90,9 +93,6 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
expect(instance.getGroupIds()).andReturn(ImmutableSet.<String> of()).atLeastOnce();
|
||||
expect(instance.getKeyName()).andReturn(null).atLeastOnce();
|
||||
expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING);
|
||||
expect(instance.getVirtualizationType()).andReturn("paravirtual");
|
||||
expect(instance.getPlacementGroup()).andReturn(null);
|
||||
expect(instance.getSubnetId()).andReturn(null);
|
||||
|
||||
expect(instance.getIpAddress()).andReturn("127.0.0.1");
|
||||
expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1");
|
||||
|
@ -115,7 +115,7 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
replay(instance);
|
||||
|
||||
RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap,
|
||||
credentialProvider, imageMap, locations, new RunningInstanceToStorageMappingUnix());
|
||||
credentialProvider, imageMap, locations, hardwares);
|
||||
|
||||
NodeMetadata metadata = parser.apply(instance);
|
||||
assertEquals(metadata.getLocation(), locations.get().iterator().next());
|
||||
|
@ -145,6 +145,8 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null);
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
.<Location> of(location));
|
||||
Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(EC2Hardware.M2_4XLARGE));
|
||||
PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class);
|
||||
RunningInstance instance = createMock(RunningInstance.class);
|
||||
|
||||
|
@ -152,9 +154,6 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
expect(instance.getGroupIds()).andReturn(ImmutableSet.<String> of()).atLeastOnce();
|
||||
expect(instance.getKeyName()).andReturn(null).atLeastOnce();
|
||||
expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING);
|
||||
expect(instance.getVirtualizationType()).andReturn("paravirtual");
|
||||
expect(instance.getPlacementGroup()).andReturn(null);
|
||||
expect(instance.getSubnetId()).andReturn(null);
|
||||
|
||||
expect(instance.getIpAddress()).andReturn("127.0.0.1");
|
||||
expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1");
|
||||
|
@ -178,7 +177,7 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
replay(instance);
|
||||
|
||||
RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap,
|
||||
credentialProvider, imageMap, locations, new RunningInstanceToStorageMappingUnix());
|
||||
credentialProvider, imageMap, locations, hardwares);
|
||||
|
||||
NodeMetadata metadata = parser.apply(instance);
|
||||
assertEquals(metadata.getLocation(), locations.get().iterator().next());
|
||||
|
@ -208,6 +207,8 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null);
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
.<Location> of(location));
|
||||
Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(EC2Hardware.M2_4XLARGE));
|
||||
PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class);
|
||||
RunningInstance instance = createMock(RunningInstance.class);
|
||||
|
||||
|
@ -215,9 +216,6 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
expect(instance.getGroupIds()).andReturn(ImmutableSet.<String> of()).atLeastOnce();
|
||||
expect(instance.getKeyName()).andReturn(null).atLeastOnce();
|
||||
expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING);
|
||||
expect(instance.getVirtualizationType()).andReturn("paravirtual");
|
||||
expect(instance.getPlacementGroup()).andReturn(null);
|
||||
expect(instance.getSubnetId()).andReturn(null);
|
||||
|
||||
expect(instance.getIpAddress()).andReturn("127.0.0.1");
|
||||
expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1");
|
||||
|
@ -245,7 +243,7 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
replay(instance);
|
||||
|
||||
RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap,
|
||||
credentialProvider, imageMap, locations, new RunningInstanceToStorageMappingUnix());
|
||||
credentialProvider, imageMap, locations, hardwares);
|
||||
|
||||
NodeMetadata metadata = parser.apply(instance);
|
||||
assertEquals(metadata.getLocation(), locations.get().iterator().next());
|
||||
|
@ -276,6 +274,8 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null);
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
.<Location> of(location));
|
||||
Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(EC2Hardware.M2_4XLARGE));
|
||||
PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class);
|
||||
RunningInstance instance = createMock(RunningInstance.class);
|
||||
|
||||
|
@ -284,9 +284,6 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
expect(instance.getGroupIds()).andReturn(ImmutableSet.<String> of()).atLeastOnce();
|
||||
expect(instance.getKeyName()).andReturn(null).atLeastOnce();
|
||||
expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING);
|
||||
expect(instance.getVirtualizationType()).andReturn("paravirtual");
|
||||
expect(instance.getPlacementGroup()).andReturn(null);
|
||||
expect(instance.getSubnetId()).andReturn(null);
|
||||
|
||||
expect(instance.getIpAddress()).andReturn("127.0.0.1");
|
||||
expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1");
|
||||
|
@ -309,7 +306,7 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
replay(instance);
|
||||
|
||||
RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap,
|
||||
credentialProvider, imageMap, locations, new RunningInstanceToStorageMappingUnix());
|
||||
credentialProvider, imageMap, locations, hardwares);
|
||||
|
||||
NodeMetadata metadata = parser.apply(instance);
|
||||
assertEquals(metadata.getLocation(), locations.get().iterator().next());
|
||||
|
@ -338,6 +335,8 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null);
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
.<Location> of(location));
|
||||
Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(EC2Hardware.M2_4XLARGE));
|
||||
PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class);
|
||||
RunningInstance instance = createMock(RunningInstance.class);
|
||||
|
||||
|
@ -346,9 +345,6 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds#tag#us-east-1")).atLeastOnce();
|
||||
expect(instance.getKeyName()).andReturn(null).atLeastOnce();
|
||||
expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING);
|
||||
expect(instance.getVirtualizationType()).andReturn("paravirtual");
|
||||
expect(instance.getPlacementGroup()).andReturn(null);
|
||||
expect(instance.getSubnetId()).andReturn(null);
|
||||
|
||||
expect(instance.getIpAddress()).andReturn("127.0.0.1");
|
||||
expect(instance.getPrivateIpAddress()).andReturn("127.0.0.1");
|
||||
|
@ -371,7 +367,7 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
replay(instance);
|
||||
|
||||
RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap,
|
||||
credentialProvider, imageMap, locations, new RunningInstanceToStorageMappingUnix());
|
||||
credentialProvider, imageMap, locations, hardwares);
|
||||
|
||||
NodeMetadata metadata = parser.apply(instance);
|
||||
assertEquals(metadata.getLocation(), locations.get().iterator().next());
|
||||
|
@ -388,7 +384,7 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
verify(instance);
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@SuppressWarnings( { "unchecked", "rawtypes" })
|
||||
@Test
|
||||
public void testApplyWithKeyPairCreatesTagOfParsedSecurityGroupAndCredentialsBasedOnIt() throws UnknownHostException {
|
||||
EC2Client client = createMock(EC2Client.class);
|
||||
|
@ -396,7 +392,8 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce();
|
||||
Map<RegionAndName, KeyPair> credentialsMap = createMock(Map.class);
|
||||
ConcurrentMap<RegionAndName, org.jclouds.compute.domain.Image> imageMap = createMock(ConcurrentMap.class);
|
||||
|
||||
Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(EC2Hardware.M2_4XLARGE));
|
||||
PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class);
|
||||
RunningInstance instance = createMock(RunningInstance.class);
|
||||
Image image = createMock(Image.class);
|
||||
|
@ -405,9 +402,6 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds#tag#us-east-1")).atLeastOnce();
|
||||
expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce();
|
||||
expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING);
|
||||
expect(instance.getVirtualizationType()).andReturn("paravirtual");
|
||||
expect(instance.getPlacementGroup()).andReturn(null);
|
||||
expect(instance.getSubnetId()).andReturn(null);
|
||||
|
||||
Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null);
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
|
@ -445,7 +439,7 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
replay(jcImage);
|
||||
|
||||
RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap,
|
||||
credentialProvider, imageMap, locations, new RunningInstanceToStorageMappingUnix());
|
||||
credentialProvider, imageMap, locations, hardwares);
|
||||
NodeMetadata metadata = parser.apply(instance);
|
||||
|
||||
assertEquals(metadata.getTag(), "tag");
|
||||
|
@ -464,7 +458,7 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@SuppressWarnings( { "unchecked", "rawtypes" })
|
||||
@Test
|
||||
public void testApplyWithTwoSecurityGroups() throws UnknownHostException {
|
||||
EC2Client client = createMock(EC2Client.class);
|
||||
|
@ -472,7 +466,8 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
expect(client.getAMIServices()).andReturn(amiClient).atLeastOnce();
|
||||
Map<RegionAndName, KeyPair> credentialsMap = createMock(Map.class);
|
||||
ConcurrentMap<RegionAndName, org.jclouds.compute.domain.Image> imageMap = createMock(ConcurrentMap.class);
|
||||
|
||||
Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(EC2Hardware.M2_4XLARGE));
|
||||
PopulateDefaultLoginCredentialsForImageStrategy credentialProvider = createMock(PopulateDefaultLoginCredentialsForImageStrategy.class);
|
||||
RunningInstance instance = createMock(RunningInstance.class);
|
||||
Image image = createMock(Image.class);
|
||||
|
@ -481,9 +476,6 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
expect(instance.getGroupIds()).andReturn(ImmutableSet.of("jclouds1", "jclouds2")).atLeastOnce();
|
||||
expect(instance.getKeyName()).andReturn("jclouds#tag#us-east-1#50").atLeastOnce();
|
||||
expect(instance.getInstanceState()).andReturn(InstanceState.RUNNING);
|
||||
expect(instance.getVirtualizationType()).andReturn("paravirtual");
|
||||
expect(instance.getPlacementGroup()).andReturn(null);
|
||||
expect(instance.getSubnetId()).andReturn(null);
|
||||
|
||||
Location location = new LocationImpl(LocationScope.ZONE, "us-east-1a", "description", null);
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
|
@ -521,7 +513,7 @@ public class RunningInstanceToNodeMetadataTest {
|
|||
replay(jcImage);
|
||||
|
||||
RunningInstanceToNodeMetadata parser = new RunningInstanceToNodeMetadata(client, credentialsMap,
|
||||
credentialProvider, imageMap, locations, new RunningInstanceToStorageMappingUnix());
|
||||
credentialProvider, imageMap, locations, hardwares);
|
||||
|
||||
NodeMetadata metadata = parser.apply(instance);
|
||||
|
||||
|
|
|
@ -33,11 +33,12 @@ import javax.inject.Provider;
|
|||
|
||||
import org.jclouds.aws.ec2.compute.domain.RegionAndName;
|
||||
import org.jclouds.aws.ec2.compute.options.EC2TemplateOptions;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.OperatingSystem;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.TemplateBuilder;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
|
||||
import org.jclouds.compute.domain.internal.TemplateBuilderImplTest;
|
||||
|
@ -72,8 +73,8 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest {
|
|||
@Override
|
||||
protected EC2TemplateBuilderImpl createTemplateBuilder(final Image knownImage,
|
||||
Supplier<Set<? extends Location>> locations, Supplier<Set<? extends Image>> images,
|
||||
Supplier<Set<? extends Hardware>> sizes, Location defaultLocation, Provider<TemplateOptions> optionsProvider,
|
||||
Provider<TemplateBuilder> templateBuilderProvider) {
|
||||
Supplier<Set<? extends Hardware>> sizes, Location defaultLocation,
|
||||
Provider<TemplateOptions> optionsProvider, Provider<TemplateBuilder> templateBuilderProvider) {
|
||||
final RegionAndName knownRegionAndName = new RegionAndName("region", "ami");
|
||||
|
||||
ConcurrentMap<RegionAndName, Image> imageMap = new MapMaker()
|
||||
|
@ -99,8 +100,9 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest {
|
|||
Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(Sets
|
||||
.<Image> newLinkedHashSet());
|
||||
Supplier<Set<? extends Hardware>> sizes = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(new HardwareImpl("1", "1", "region/1", location, null, ImmutableMap.<String, String> of(),
|
||||
ImmutableList.of(new Processor(1, 1.0)), 1, 1, ImagePredicates.any())));
|
||||
.<Hardware> of(new HardwareImpl("1", "1", "region/1", location, null,
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(1, 1.0)), 1, ImmutableList
|
||||
.<Volume> of(), ImagePredicates.any())));
|
||||
|
||||
Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
|
||||
Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
|
||||
|
@ -152,8 +154,9 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest {
|
|||
.<Location> of(location));
|
||||
Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.<Image> of());
|
||||
Supplier<Set<? extends Hardware>> sizes = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(new HardwareImpl("1", "1", "region/1", location, null, ImmutableMap.<String, String> of(),
|
||||
ImmutableList.of(new Processor(1, 1.0)), 1, 1, ImagePredicates.any())));
|
||||
.<Hardware> of(new HardwareImpl("1", "1", "region/1", location, null,
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(1, 1.0)), 1, ImmutableList
|
||||
.<Volume> of(), ImagePredicates.any())));
|
||||
|
||||
Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
|
||||
Provider<TemplateBuilder> templateBuilderProvider = createMock(Provider.class);
|
||||
|
@ -190,8 +193,9 @@ public class EC2TemplateBuilderImplTest extends TemplateBuilderImplTest {
|
|||
.<Location> of(location));
|
||||
Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.<Image> of());
|
||||
Supplier<Set<? extends Hardware>> sizes = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
|
||||
.<Hardware> of(new HardwareImpl("1", "1", "region/1", location, null, ImmutableMap.<String, String> of(),
|
||||
ImmutableList.of(new Processor(1, 1.0)), 1, 1, ImagePredicates.any())));
|
||||
.<Hardware> of(new HardwareImpl("1", "1", "region/1", location, null,
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(1, 1.0)), 1, ImmutableList
|
||||
.<Volume> of(), ImagePredicates.any())));
|
||||
|
||||
Location defaultLocation = createMock(Location.class);
|
||||
Provider<TemplateOptions> optionsProvider = createMock(Provider.class);
|
||||
|
|
|
@ -1,71 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.aws.ec2.functions;
|
||||
|
||||
import org.jclouds.aws.ec2.domain.InstanceType;
|
||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import static org.easymock.EasyMock.expect;
|
||||
import static org.easymock.classextension.EasyMock.createMock;
|
||||
import static org.easymock.classextension.EasyMock.replay;
|
||||
|
||||
/**
|
||||
* @author Oleksiy Yarmula
|
||||
*/
|
||||
public class RunningInstanceToStorageMappingUnixTest {
|
||||
|
||||
@Test
|
||||
public void testMappingForM1LargeInstance() {
|
||||
RunningInstanceToStorageMappingUnix volumeMapping = new RunningInstanceToStorageMappingUnix();
|
||||
RunningInstance instance = createMock(RunningInstance.class);
|
||||
expect(instance.getInstanceType()).andStubReturn(InstanceType.M1_LARGE);
|
||||
replay(instance);
|
||||
|
||||
Map<String, String> mappingReturned = volumeMapping.apply(instance);
|
||||
assert mappingReturned.size() == 3 : String.format(
|
||||
"Expected size of mapping devices: %d. Found: %d", 3, mappingReturned.size());
|
||||
|
||||
assert mappingReturned.containsKey("disk_drive//dev/sda1/gb");
|
||||
assert mappingReturned.containsKey("disk_drive//dev/sdb/gb");
|
||||
assert mappingReturned.containsKey("disk_drive//dev/sdc/gb");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMappingForM1XLargeInstance() {
|
||||
RunningInstanceToStorageMappingUnix volumeMapping = new RunningInstanceToStorageMappingUnix();
|
||||
RunningInstance instance = createMock(RunningInstance.class);
|
||||
expect(instance.getInstanceType()).andStubReturn(InstanceType.M1_XLARGE);
|
||||
replay(instance);
|
||||
|
||||
Map<String, String> mappingReturned = volumeMapping.apply(instance);
|
||||
assert mappingReturned.size() == 5 : String.format(
|
||||
"Expected size of mapping devices: %d. Found: %d", 5, mappingReturned.size());
|
||||
|
||||
assert mappingReturned.containsKey("disk_drive//dev/sda1/gb");
|
||||
assert mappingReturned.containsKey("disk_drive//dev/sdb/gb");
|
||||
assert mappingReturned.containsKey("disk_drive//dev/sdc/gb");
|
||||
assert mappingReturned.containsKey("disk_drive//dev/sdd/gb");
|
||||
assert mappingReturned.containsKey("disk_drive//dev/sde/gb");
|
||||
}
|
||||
|
||||
}
|
|
@ -35,7 +35,6 @@ import org.jclouds.aws.domain.Region;
|
|||
import org.jclouds.aws.ec2.EC2Client;
|
||||
import org.jclouds.aws.ec2.domain.InstanceType;
|
||||
import org.jclouds.aws.ec2.domain.PlacementGroup;
|
||||
import org.jclouds.aws.ec2.domain.RunningInstance;
|
||||
import org.jclouds.aws.ec2.domain.PlacementGroup.State;
|
||||
import org.jclouds.aws.ec2.predicates.PlacementGroupAvailable;
|
||||
import org.jclouds.aws.ec2.predicates.PlacementGroupDeleted;
|
||||
|
@ -43,9 +42,9 @@ import org.jclouds.compute.BaseComputeServiceLiveTest;
|
|||
import org.jclouds.compute.ComputeServiceContext;
|
||||
import org.jclouds.compute.ComputeServiceContextFactory;
|
||||
import org.jclouds.compute.RunNodesException;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Template;
|
||||
import org.jclouds.compute.predicates.NodePredicates;
|
||||
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||
|
@ -176,10 +175,8 @@ public class PlacementGroupClientLiveTest {
|
|||
Set<? extends NodeMetadata> nodes = context.getComputeService().runNodesWithTag(tag, 1, template);
|
||||
NodeMetadata node = Iterables.getOnlyElement(nodes);
|
||||
|
||||
RunningInstance instance = Iterables.getOnlyElement(Iterables.getOnlyElement(client.getInstanceServices()
|
||||
.describeInstancesInRegion(null, node.getProviderId())));
|
||||
assertEquals(instance.getVirtualizationType(), node.getExtra().get("virtualizationType"));
|
||||
assertEquals(instance.getPlacementGroup(), node.getExtra().get("placementGroup"));
|
||||
Iterables.getOnlyElement(Iterables.getOnlyElement(client.getInstanceServices().describeInstancesInRegion(null,
|
||||
node.getProviderId())));
|
||||
|
||||
} catch (RunNodesException e) {
|
||||
System.err.println(e.getNodeErrors().keySet());
|
||||
|
|
|
@ -270,8 +270,7 @@ public class S3AsyncClientTest extends BaseS3AsyncClientTest {
|
|||
|
||||
public void testGetObject() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException,
|
||||
NoSuchMethodException, IOException {
|
||||
Method method = S3AsyncClient.class.getMethod("getObject", String.class, String.class, Array.newInstance(
|
||||
GetOptions.class, 0).getClass());
|
||||
Method method = S3AsyncClient.class.getMethod("getObject", String.class, String.class, GetOptions[].class);
|
||||
HttpRequest request = processor.createRequest(method, "bucket", "object");
|
||||
|
||||
assertRequestLineEquals(request, "GET https://bucket.s3.amazonaws.com/object HTTP/1.1");
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.aws.s3.blobstore.strategy;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import org.jclouds.aws.s3.BaseS3AsyncClientTest;
|
||||
import org.jclouds.aws.s3.config.S3RestClientModule;
|
||||
import org.jclouds.date.TimeStamp;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.rest.ConfiguresRestClient;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code SignGetObject}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "s3.SignGetObjectTest")
|
||||
public class SignGetObjectTest extends BaseS3AsyncClientTest {
|
||||
|
||||
public void testSignGetObject() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException,
|
||||
NoSuchMethodException, IOException {
|
||||
HttpRequest request = new SignGetObject(processor).apply( "bucket", "object");
|
||||
|
||||
assertRequestLineEquals(request, "GET https://bucket.s3.amazonaws.com/object HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "Authorization: AWS identity:1UqxCBECNncBHUhxJ3Y/Q1O3IiA=\nDate: 2009-11-08T15:54:08.897Z\nHost: bucket.s3.amazonaws.com\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertEquals(request.getFilters().size(), 0);
|
||||
}
|
||||
|
||||
|
||||
@RequiresHttp
|
||||
@ConfiguresRestClient
|
||||
protected static final class TestS3RestClientModule extends S3RestClientModule {
|
||||
@Override
|
||||
protected void configure() {
|
||||
super.configure();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String provideTimeStamp(@TimeStamp Supplier<String> cache) {
|
||||
return "2009-11-08T15:54:08.897Z";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Module createModule() {
|
||||
return new TestS3RestClientModule();
|
||||
}
|
||||
|
||||
}
|
|
@ -52,6 +52,7 @@ import org.jclouds.blobstore.domain.internal.PageSetImpl;
|
|||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||
import org.jclouds.blobstore.internal.BaseAsyncBlobStore;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.concurrent.Futures;
|
||||
import org.jclouds.domain.Location;
|
||||
|
@ -84,8 +85,8 @@ public class AzureAsyncBlobStore extends BaseAsyncBlobStore {
|
|||
ListOptionsToListBlobsOptions blobStore2AzureContainerListOptions,
|
||||
ListBlobsResponseToResourceList azure2BlobStoreResourceList, AzureBlobToBlob azureBlob2Blob,
|
||||
BlobToAzureBlob blob2AzureBlob, BlobPropertiesToBlobMetadata blob2BlobMd,
|
||||
BlobToHttpGetOptions blob2ObjectGetOptions) {
|
||||
super(context, blobUtils, service, defaultLocation, locations);
|
||||
BlobToHttpGetOptions blob2ObjectGetOptions, SignRequestForBlobStrategy signRequestForBlob) {
|
||||
super(context, blobUtils, service, defaultLocation, locations, signRequestForBlob);
|
||||
this.async = checkNotNull(async, "async");
|
||||
this.container2ResourceMd = checkNotNull(container2ResourceMd, "container2ResourceMd");
|
||||
this.blobStore2AzureContainerListOptions = checkNotNull(blobStore2AzureContainerListOptions,
|
||||
|
|
|
@ -46,6 +46,7 @@ import org.jclouds.blobstore.domain.internal.PageSetImpl;
|
|||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||
import org.jclouds.blobstore.internal.BaseBlobStore;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
|
@ -75,8 +76,8 @@ public class AzureBlobStore extends BaseBlobStore {
|
|||
ListOptionsToListBlobsOptions blobStore2AzureContainerListOptions,
|
||||
ListBlobsResponseToResourceList azure2BlobStoreResourceList, AzureBlobToBlob azureBlob2Blob,
|
||||
BlobToAzureBlob blob2AzureBlob, BlobPropertiesToBlobMetadata blob2BlobMd,
|
||||
BlobToHttpGetOptions blob2ObjectGetOptions) {
|
||||
super(context, blobUtils, defaultLocation, locations);
|
||||
BlobToHttpGetOptions blob2ObjectGetOptions, SignRequestForBlobStrategy signRequestForBlob) {
|
||||
super(context, blobUtils, defaultLocation, locations, signRequestForBlob);
|
||||
this.sync = checkNotNull(sync, "sync");
|
||||
this.container2ResourceMd = checkNotNull(container2ResourceMd, "container2ResourceMd");
|
||||
this.blobStore2AzureContainerListOptions = checkNotNull(blobStore2AzureContainerListOptions,
|
||||
|
|
|
@ -28,6 +28,7 @@ import org.jclouds.azure.storage.blob.AzureBlobClient;
|
|||
import org.jclouds.azure.storage.blob.blobstore.AzureAsyncBlobStore;
|
||||
import org.jclouds.azure.storage.blob.blobstore.AzureBlobStore;
|
||||
import org.jclouds.azure.storage.blob.blobstore.strategy.FindMD5InBlobProperties;
|
||||
import org.jclouds.azure.storage.blob.blobstore.strategy.SignGetBlob;
|
||||
import org.jclouds.blobstore.AsyncBlobStore;
|
||||
import org.jclouds.blobstore.BlobStore;
|
||||
import org.jclouds.blobstore.BlobStoreContext;
|
||||
|
@ -35,6 +36,7 @@ import org.jclouds.blobstore.attr.ConsistencyModel;
|
|||
import org.jclouds.blobstore.config.BlobStoreMapModule;
|
||||
import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
||||
import org.jclouds.blobstore.strategy.ContainsValueInListStrategy;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.domain.LocationScope;
|
||||
import org.jclouds.domain.internal.LocationImpl;
|
||||
|
@ -64,6 +66,7 @@ public class AzureBlobStoreContextModule extends AbstractModule {
|
|||
bind(BlobStoreContext.class).to(new TypeLiteral<BlobStoreContextImpl<AzureBlobClient, AzureBlobAsyncClient>>() {
|
||||
}).in(Scopes.SINGLETON);
|
||||
bind(ContainsValueInListStrategy.class).to(FindMD5InBlobProperties.class);
|
||||
bind(SignRequestForBlobStrategy.class).to(SignGetBlob.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.azure.storage.blob.blobstore.strategy;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class SignGetBlob implements SignRequestForBlobStrategy {
|
||||
private final RestAnnotationProcessor<AzureBlobAsyncClient> processor;
|
||||
private final Method method;
|
||||
|
||||
@Inject
|
||||
public SignGetBlob(RestAnnotationProcessor<AzureBlobAsyncClient> processor) throws SecurityException,
|
||||
NoSuchMethodException {
|
||||
this.processor = checkNotNull(processor, "processor");
|
||||
this.method = AzureBlobAsyncClient.class.getMethod("getBlob", String.class, String.class, GetOptions[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest apply(String container, String name) {
|
||||
HttpRequest returnVal = processor.createRequest(method, checkNotNull(container,
|
||||
"container"), checkNotNull(name, "name"));
|
||||
for (HttpRequestFilter filter : returnVal.getFilters())
|
||||
filter.filter(returnVal);
|
||||
returnVal.getFilters().clear();
|
||||
return new HttpRequest(returnVal.getMethod(), returnVal.getEndpoint(), ImmutableMultimap.copyOf(returnVal.getHeaders()));
|
||||
}
|
||||
|
||||
}
|
|
@ -28,6 +28,7 @@ import java.lang.reflect.Method;
|
|||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.azure.storage.blob.functions.ParseBlobFromHeadersAndHttpContent;
|
||||
import org.jclouds.azure.storage.blob.functions.ParseContainerPropertiesFromHeaders;
|
||||
import org.jclouds.azure.storage.blob.functions.ReturnFalseIfContainerAlreadyExists;
|
||||
import org.jclouds.azure.storage.blob.options.CreateContainerOptions;
|
||||
|
@ -37,11 +38,13 @@ import org.jclouds.azure.storage.blob.xml.ContainerNameEnumerationResultsHandler
|
|||
import org.jclouds.azure.storage.filters.SharedKeyLiteAuthentication;
|
||||
import org.jclouds.azure.storage.options.ListOptions;
|
||||
import org.jclouds.blobstore.functions.ReturnNullOnContainerNotFound;
|
||||
import org.jclouds.blobstore.functions.ReturnNullOnKeyNotFound;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.http.functions.ReleasePayloadAndReturn;
|
||||
import org.jclouds.http.functions.ReturnTrueIf2xx;
|
||||
import org.jclouds.http.functions.ReturnTrueOn404;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rest.RestClientTest;
|
||||
import org.jclouds.rest.RestContextFactory;
|
||||
import org.jclouds.rest.RestContextFactory.ContextSpec;
|
||||
|
@ -153,8 +156,7 @@ public class AzureBlobAsyncClientTest extends RestClientTest<AzureBlobAsyncClien
|
|||
Method method = AzureBlobAsyncClient.class.getMethod("deleteRootContainer");
|
||||
HttpRequest request = processor.createRequest(method);
|
||||
|
||||
assertRequestLineEquals(request,
|
||||
"DELETE https://identity.blob.core.windows.net/$root?restype=container HTTP/1.1");
|
||||
assertRequestLineEquals(request, "DELETE https://identity.blob.core.windows.net/$root?restype=container HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "x-ms-version: 2009-09-19\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
|
@ -235,6 +237,19 @@ public class AzureBlobAsyncClientTest extends RestClientTest<AzureBlobAsyncClien
|
|||
assertExceptionParserClassEquals(method, null);
|
||||
}
|
||||
|
||||
public void testGetBlob() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = AzureBlobAsyncClient.class.getMethod("getBlob", String.class, String.class, GetOptions[].class);
|
||||
HttpRequest request = processor.createRequest(method, "container", "blob");
|
||||
|
||||
assertRequestLineEquals(request, "GET https://identity.blob.core.windows.net/container/blob HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "x-ms-version: 2009-09-19\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertResponseParserClassEquals(method, request, ParseBlobFromHeadersAndHttpContent.class);
|
||||
assertSaxResponseParserClassEquals(method, null);
|
||||
assertExceptionParserClassEquals(method, ReturnNullOnKeyNotFound.class);
|
||||
}
|
||||
|
||||
public void testSetBlobMetadata() throws SecurityException, NoSuchMethodException, IOException {
|
||||
Method method = AzureBlobAsyncClient.class.getMethod("setBlobMetadata", String.class, String.class, Map.class);
|
||||
HttpRequest request = processor.createRequest(method, "container", "blob", ImmutableMap.of("key", "value"));
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.azure.storage.blob.blobstore.config;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.azure.storage.blob.AzureBlobAsyncClient;
|
||||
import org.jclouds.azure.storage.blob.blobstore.strategy.SignGetBlob;
|
||||
import org.jclouds.azure.storage.blob.config.AzureBlobRestClientModule;
|
||||
import org.jclouds.azure.storage.filters.SharedKeyLiteAuthentication;
|
||||
import org.jclouds.date.TimeStamp;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.RequiresHttp;
|
||||
import org.jclouds.rest.ConfiguresRestClient;
|
||||
import org.jclouds.rest.RestClientTest;
|
||||
import org.jclouds.rest.RestContextFactory;
|
||||
import org.jclouds.rest.RestContextFactory.ContextSpec;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code SignGetBlob}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "azureblob.SignGetBlobTest")
|
||||
public class SignGetBlobTest extends RestClientTest<AzureBlobAsyncClient> {
|
||||
|
||||
public void testSignGetBlob() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException,
|
||||
NoSuchMethodException, IOException {
|
||||
HttpRequest request = new SignGetBlob(processor).apply("container", "blob");
|
||||
|
||||
assertRequestLineEquals(request, "GET https://identity.blob.core.windows.net/container/blob HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(
|
||||
request,
|
||||
"Authorization: SharedKeyLite identity:bX3fHsuXQQEzvLey2TD76FcDDvDIHZpgSX2j5oH4Iy8=\nDate: 2009-11-08T15:54:08.897Z\nx-ms-version: 2009-09-19\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertEquals(request.getFilters().size(), 0);
|
||||
}
|
||||
|
||||
@RequiresHttp
|
||||
@ConfiguresRestClient
|
||||
protected static final class TestAzureBlobRestClientModule extends AzureBlobRestClientModule {
|
||||
@Override
|
||||
protected void configure() {
|
||||
super.configure();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String provideTimeStamp(@TimeStamp Supplier<String> cache) {
|
||||
return "2009-11-08T15:54:08.897Z";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Module createModule() {
|
||||
return new TestAzureBlobRestClientModule();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void checkFilters(HttpRequest request) {
|
||||
assertEquals(request.getFilters().size(), 1);
|
||||
assertEquals(request.getFilters().get(0).getClass(), SharedKeyLiteAuthentication.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypeLiteral<RestAnnotationProcessor<AzureBlobAsyncClient>> createTypeLiteral() {
|
||||
return new TypeLiteral<RestAnnotationProcessor<AzureBlobAsyncClient>>() {
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public ContextSpec<?, ?> createContextSpec() {
|
||||
return new RestContextFactory().createContextSpec("azureblob", "identity", "credential", new Properties());
|
||||
}
|
||||
|
||||
}
|
|
@ -238,6 +238,14 @@ Options can also be specified for extension modules
|
|||
([container-name path #^BlobStore blobstore]
|
||||
(.getBlob blobstore container-name path)))
|
||||
|
||||
(defn sign-blob-request
|
||||
"Get a signed http request for a blob, so that you can retrieve it
|
||||
in another application. ex. curl"
|
||||
([container-name path]
|
||||
(sign-blob-request container-name path *blobstore*))
|
||||
([container-name path #^BlobStore blobstore]
|
||||
(.signRequestForBlob blobstore container-name path)))
|
||||
|
||||
(defn get-blob-stream
|
||||
"Get an inputstream from the blob at a given path"
|
||||
([container-name path]
|
||||
|
|
|
@ -31,6 +31,7 @@ import org.jclouds.blobstore.domain.StorageMetadata;
|
|||
import org.jclouds.blobstore.options.GetOptions;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
||||
/**
|
||||
* Provides hooks needed to run a blob store asynchronously
|
||||
|
@ -48,6 +49,11 @@ public interface AsyncBlobStore {
|
|||
*/
|
||||
Blob newBlob(String name);
|
||||
|
||||
/**
|
||||
* @see BlobStore#signRequestForBlob
|
||||
*/
|
||||
HttpRequest signRequestForBlob(String container, String name);
|
||||
|
||||
/**
|
||||
* @see BlobStore#listAssignableLocations
|
||||
*/
|
||||
|
|
|
@ -30,6 +30,7 @@ import org.jclouds.blobstore.domain.StorageMetadata;
|
|||
import org.jclouds.blobstore.options.GetOptions;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
||||
/**
|
||||
* Synchronous access to a BlobStore such as Amazon S3
|
||||
|
@ -50,6 +51,19 @@ public interface BlobStore {
|
|||
*/
|
||||
Blob newBlob(String name);
|
||||
|
||||
/**
|
||||
* gets a signed request, including headers as necessary, to access a blob from an external
|
||||
* client.
|
||||
*
|
||||
* @param container
|
||||
* container where the blob resides
|
||||
* @param directory
|
||||
* full path to the blob
|
||||
* @throws UnsupportedOperationException
|
||||
* if not supported by the provider
|
||||
*/
|
||||
HttpRequest signRequestForBlob(String container, String name);
|
||||
|
||||
/**
|
||||
* The get locations command returns all the valid locations for containers. A location has a
|
||||
* scope, which is typically region or zone. A region is a general area, like eu-west, where a
|
||||
|
|
|
@ -77,6 +77,7 @@ import org.jclouds.blobstore.internal.BaseAsyncBlobStore;
|
|||
import org.jclouds.blobstore.options.GetOptions;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.strategy.IfDirectoryReturnNameStrategy;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.crypto.Crypto;
|
||||
import org.jclouds.crypto.CryptoStreams;
|
||||
|
@ -124,8 +125,8 @@ public class TransientAsyncBlobStore extends BaseAsyncBlobStore {
|
|||
HttpGetOptionsListToGetOptions httpGetOptionsConverter,
|
||||
IfDirectoryReturnNameStrategy ifDirectoryReturnName, Blob.Factory blobFactory, BlobUtils blobUtils,
|
||||
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier<Location> defaultLocation,
|
||||
Supplier<Set<? extends Location>> locations) {
|
||||
super(context, blobUtils, service, defaultLocation, locations);
|
||||
Supplier<Set<? extends Location>> locations, SignRequestForBlobStrategy signRequestForBlob) {
|
||||
super(context, blobUtils, service, defaultLocation, locations, signRequestForBlob);
|
||||
this.blobFactory = blobFactory;
|
||||
this.dateService = dateService;
|
||||
this.crypto = crypto;
|
||||
|
|
|
@ -37,9 +37,11 @@ import org.jclouds.blobstore.domain.Blob;
|
|||
import org.jclouds.blobstore.domain.PageSet;
|
||||
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.blobstore.util.internal.BlobUtilsImpl;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Supplier;
|
||||
|
@ -57,16 +59,18 @@ public abstract class BaseAsyncBlobStore implements AsyncBlobStore {
|
|||
protected final ExecutorService service;
|
||||
protected final Supplier<Location> defaultLocation;
|
||||
protected final Supplier<Set<? extends Location>> locations;
|
||||
protected final SignRequestForBlobStrategy signRequestForBlob;
|
||||
|
||||
@Inject
|
||||
protected BaseAsyncBlobStore(BlobStoreContext context, BlobUtils blobUtils,
|
||||
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService service, Supplier<Location> defaultLocation,
|
||||
Supplier<Set<? extends Location>> locations) {
|
||||
Supplier<Set<? extends Location>> locations, SignRequestForBlobStrategy signRequestForBlob) {
|
||||
this.context = checkNotNull(context, "context");
|
||||
this.blobUtils = checkNotNull(blobUtils, "blobUtils");
|
||||
this.service = checkNotNull(service, "service");
|
||||
this.defaultLocation = checkNotNull(defaultLocation, "defaultLocation");
|
||||
this.locations = checkNotNull(locations, "locations");
|
||||
this.signRequestForBlob = checkNotNull(signRequestForBlob, "signRequestForBlob");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -266,4 +270,9 @@ public abstract class BaseAsyncBlobStore implements AsyncBlobStore {
|
|||
}
|
||||
|
||||
protected abstract boolean deleteAndVerifyContainerGone(String container);
|
||||
|
||||
@Override
|
||||
public HttpRequest signRequestForBlob(String container, String name) {
|
||||
return signRequestForBlob.apply(container, name);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,9 +33,11 @@ import org.jclouds.blobstore.domain.Blob;
|
|||
import org.jclouds.blobstore.domain.PageSet;
|
||||
import org.jclouds.blobstore.domain.StorageMetadata;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.blobstore.util.internal.BlobUtilsImpl;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Supplier;
|
||||
|
@ -50,14 +52,16 @@ public abstract class BaseBlobStore implements BlobStore {
|
|||
protected final BlobUtils blobUtils;
|
||||
protected final Supplier<Location> defaultLocation;
|
||||
protected final Supplier<Set<? extends Location>> locations;
|
||||
protected final SignRequestForBlobStrategy signRequestForBlob;
|
||||
|
||||
@Inject
|
||||
protected BaseBlobStore(BlobStoreContext context, BlobUtils blobUtils, Supplier<Location> defaultLocation,
|
||||
Supplier<Set<? extends Location>> locations) {
|
||||
Supplier<Set<? extends Location>> locations, SignRequestForBlobStrategy signRequestForBlob) {
|
||||
this.context = checkNotNull(context, "context");
|
||||
this.blobUtils = checkNotNull(blobUtils, "blobUtils");
|
||||
this.defaultLocation = checkNotNull(defaultLocation, "defaultLocation");
|
||||
this.locations = checkNotNull(locations, "locations");
|
||||
this.signRequestForBlob = checkNotNull(signRequestForBlob, "signRequestForBlob");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -219,4 +223,9 @@ public abstract class BaseBlobStore implements BlobStore {
|
|||
}
|
||||
|
||||
protected abstract boolean deleteAndVerifyContainerGone(String container);
|
||||
|
||||
@Override
|
||||
public HttpRequest signRequestForBlob(String container, String name) {
|
||||
return signRequestForBlob.apply(container, name);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.blobstore.strategy;
|
||||
|
||||
import org.jclouds.blobstore.strategy.internal.SignRequestForBlobUnsupported;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@ImplementedBy(SignRequestForBlobUnsupported.class)
|
||||
public interface SignRequestForBlobStrategy {
|
||||
HttpRequest apply(String container, String name);
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.blobstore.strategy.internal;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class SignRequestForBlobUnsupported implements SignRequestForBlobStrategy {
|
||||
@Override
|
||||
public HttpRequest apply(String container, String name) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
|
@ -28,6 +28,8 @@ import java.net.URLConnection;
|
|||
|
||||
import org.jclouds.blobstore.domain.Blob;
|
||||
import org.jclouds.crypto.CryptoStreams;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.util.Utils;
|
||||
import org.testng.annotations.Optional;
|
||||
import org.testng.annotations.Parameters;
|
||||
import org.testng.annotations.Test;
|
||||
|
@ -52,7 +54,7 @@ public class BaseBlobLiveTest extends BaseBlobStoreIntegrationTest {
|
|||
|
||||
httpStreamETag = checkNotNull(httpStreamETag != null ? httpStreamETag : sysHttpStreamETag, "httpStreamMd5");
|
||||
|
||||
String key = "hello";
|
||||
String name = "hello";
|
||||
|
||||
URL url = new URL(httpStreamUrl);
|
||||
byte[] md5 = CryptoStreams.hex(httpStreamETag);
|
||||
|
@ -61,16 +63,39 @@ public class BaseBlobLiveTest extends BaseBlobStoreIntegrationTest {
|
|||
long length = connection.getContentLength();
|
||||
InputStream input = connection.getInputStream();
|
||||
|
||||
Blob object = context.getBlobStore().newBlob(key);
|
||||
object.setPayload(input);
|
||||
object.getPayload().setContentLength(length);
|
||||
object.getPayload().setContentMD5(md5);
|
||||
String bucketName = getContainerName();
|
||||
Blob blob = context.getBlobStore().newBlob(name);
|
||||
blob.setPayload(input);
|
||||
blob.getPayload().setContentLength(length);
|
||||
blob.getPayload().setContentMD5(md5);
|
||||
String container = getContainerName();
|
||||
try {
|
||||
context.getBlobStore().putBlob(bucketName, object);
|
||||
assertEquals(context.getBlobStore().blobMetadata(bucketName, key).getContentMD5(), md5);
|
||||
context.getBlobStore().putBlob(container, blob);
|
||||
assertEquals(context.getBlobStore().blobMetadata(container, name).getContentMD5(), md5);
|
||||
} finally {
|
||||
returnContainer(bucketName);
|
||||
returnContainer(container);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSignUrl() throws Exception {
|
||||
String name = "hello";
|
||||
String text = "fooooooooooooooooooooooo";
|
||||
|
||||
Blob blob = context.getBlobStore().newBlob(name);
|
||||
blob.setPayload(text);
|
||||
blob.getPayload().setContentType("text/plain");
|
||||
String container = getContainerName();
|
||||
try {
|
||||
context.getBlobStore().putBlob(container, blob);
|
||||
HttpRequest request = context.getBlobStore().signRequestForBlob(container, name);
|
||||
assertEquals(request.getFilters().size(), 0);
|
||||
assertEquals(Utils.toStringAndClose(context.utils().http().get(request)), text);
|
||||
request = context.getAsyncBlobStore().signRequestForBlob(container, name);
|
||||
assertEquals(request.getFilters().size(), 0);
|
||||
assertEquals(Utils.toStringAndClose(context.utils().http().get(request)), text);
|
||||
} finally {
|
||||
returnContainer(container);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -312,8 +312,8 @@ See http://code.google.com/p/jclouds for details."
|
|||
|
||||
(define-accessors Template image hardware location options)
|
||||
(define-accessors Image version os-family os-description architecture)
|
||||
(define-accessors Hardware processors ram disk)
|
||||
(define-accessors NodeMetadata "node" credentials extra state tag)
|
||||
(define-accessors Hardware processors ram volumes)
|
||||
(define-accessors NodeMetadata "node" credentials hardware state tag)
|
||||
|
||||
(defn builder-options [builder]
|
||||
(or (get-field org.jclouds.compute.domain.internal.TemplateBuilderImpl :options builder)
|
||||
|
|
|
@ -25,6 +25,6 @@ package org.jclouds.compute.domain;
|
|||
*/
|
||||
public enum ComputeType {
|
||||
|
||||
NODE, IMAGE, SIZE;
|
||||
NODE, IMAGE, HARDWARE;
|
||||
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.util.List;
|
|||
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
|
@ -44,12 +45,13 @@ public interface Hardware extends ComputeMetadata {
|
|||
int getRam();
|
||||
|
||||
/**
|
||||
* Amount of boot disk provided in GB (200)
|
||||
* volumes associated with this.
|
||||
*/
|
||||
int getDisk();
|
||||
List<? extends Volume> getVolumes();
|
||||
|
||||
/**
|
||||
* Determines whether this size can run an image.
|
||||
*/
|
||||
boolean supportsImage(Image image);
|
||||
Predicate<Image> supportsImage();
|
||||
|
||||
}
|
|
@ -19,7 +19,6 @@
|
|||
|
||||
package org.jclouds.compute.domain;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
@ -45,6 +44,13 @@ public interface NodeMetadata extends ComputeMetadata {
|
|||
*/
|
||||
String getTag();
|
||||
|
||||
/**
|
||||
*
|
||||
* The harware this node is running, if possible to determine.
|
||||
*/
|
||||
@Nullable
|
||||
Hardware getHardware();
|
||||
|
||||
/**
|
||||
*
|
||||
* The id of the image this node was created from, if possible to correlate.
|
||||
|
@ -80,8 +86,4 @@ public interface NodeMetadata extends ComputeMetadata {
|
|||
*/
|
||||
Credentials getCredentials();
|
||||
|
||||
/**
|
||||
* Other variables present that the provider supports
|
||||
*/
|
||||
Map<String, String> getExtra();
|
||||
}
|
|
@ -0,0 +1,94 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
|
||||
import com.google.inject.ImplementedBy;
|
||||
|
||||
/**
|
||||
* Describes what appears as a disk to an {@link OperatingSystem}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@ImplementedBy(VolumeImpl.class)
|
||||
public interface Volume {
|
||||
|
||||
/**
|
||||
* Describes the cardinal type of a volume; used to determine scope and exclusivity.
|
||||
*/
|
||||
public enum Type {
|
||||
/**
|
||||
* scoped to a node cannot be remounted onto another node.
|
||||
*/
|
||||
LOCAL,
|
||||
|
||||
/**
|
||||
* shared mount, non-exclusive by nature, although may happen to be exclusive.
|
||||
*/
|
||||
NAS,
|
||||
/**
|
||||
* network storage; exclusive by nature, remountable onto other machines.
|
||||
*/
|
||||
SAN;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unique identifier. If set, can be used to reference the volume for reorganizing within
|
||||
* {@link Hardware} or external commands such as backups.
|
||||
*
|
||||
*/
|
||||
@Nullable
|
||||
String getId();
|
||||
|
||||
/**
|
||||
* Describes the cardinal type of a volume; used to determine scope and exclusivity.
|
||||
*/
|
||||
Type getType();
|
||||
|
||||
/**
|
||||
* @return capacity in gigabytes, if available
|
||||
*
|
||||
*/
|
||||
@Nullable
|
||||
Float getSize();
|
||||
|
||||
/**
|
||||
*
|
||||
* @return device this volume relates to on an operating system, if available
|
||||
*/
|
||||
@Nullable
|
||||
String getDevice();
|
||||
|
||||
/**
|
||||
*
|
||||
* @return true if this survives restarts
|
||||
*/
|
||||
boolean isDurable();
|
||||
|
||||
/**
|
||||
*
|
||||
* @return true if this is the boot device
|
||||
*/
|
||||
boolean isBootDevice();
|
||||
|
||||
}
|
|
@ -19,6 +19,10 @@
|
|||
|
||||
package org.jclouds.compute.domain.internal;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static org.jclouds.compute.util.ComputeServiceUtils.getCoresAndSpeed;
|
||||
import static org.jclouds.compute.util.ComputeServiceUtils.getSpace;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
@ -29,6 +33,7 @@ import org.jclouds.compute.domain.ComputeType;
|
|||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.domain.ResourceMetadata;
|
||||
|
||||
|
@ -45,17 +50,17 @@ public class HardwareImpl extends ComputeMetadataImpl implements Hardware {
|
|||
private static final long serialVersionUID = 8994255275911717567L;
|
||||
private final List<Processor> processors = Lists.newArrayList();
|
||||
private final int ram;
|
||||
private final int disk;
|
||||
private final List<Volume> volumes = Lists.newArrayList();
|
||||
|
||||
private Predicate<Image> supportsImage;
|
||||
|
||||
public HardwareImpl(String providerId, String name, String id, @Nullable Location location, URI uri,
|
||||
Map<String, String> userMetadata, Iterable<? extends Processor> processors, int ram, int disk,
|
||||
Predicate<Image> supportsImage) {
|
||||
super(ComputeType.SIZE, providerId, name, id, location, uri, userMetadata);
|
||||
Iterables.addAll(this.processors, processors);
|
||||
Map<String, String> userMetadata, Iterable<? extends Processor> processors, int ram,
|
||||
Iterable<? extends Volume> volumes, Predicate<Image> supportsImage) {
|
||||
super(ComputeType.HARDWARE, providerId, name, id, location, uri, userMetadata);
|
||||
Iterables.addAll(this.processors, checkNotNull(processors, "processors"));
|
||||
this.ram = ram;
|
||||
this.disk = disk;
|
||||
Iterables.addAll(this.volumes, checkNotNull(volumes, "volumes"));
|
||||
this.supportsImage = supportsImage;
|
||||
}
|
||||
|
||||
|
@ -79,8 +84,8 @@ public class HardwareImpl extends ComputeMetadataImpl implements Hardware {
|
|||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public int getDisk() {
|
||||
return disk;
|
||||
public List<? extends Volume> getVolumes() {
|
||||
return volumes;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -90,46 +95,38 @@ public class HardwareImpl extends ComputeMetadataImpl implements Hardware {
|
|||
public int compareTo(ResourceMetadata<ComputeType> that) {
|
||||
if (that instanceof Hardware) {
|
||||
Hardware thatHardware = Hardware.class.cast(that);
|
||||
return ComparisonChain.start()
|
||||
.compare(sumProcessors(this.getProcessors()), sumProcessors(thatHardware.getProcessors()))
|
||||
.compare(this.getRam(), thatHardware.getRam()).compare(this.getDisk(), thatHardware.getDisk()).result();
|
||||
return ComparisonChain.start().compare(getCoresAndSpeed(this), getCoresAndSpeed(thatHardware)).compare(
|
||||
this.getRam(), thatHardware.getRam()).compare(getSpace(this), getSpace(thatHardware)).result();
|
||||
} else {
|
||||
return super.compareTo(that);
|
||||
}
|
||||
}
|
||||
|
||||
static double sumProcessors(List<? extends Processor> in) {
|
||||
double returnVal = 0;
|
||||
for (Processor processor : in)
|
||||
returnVal = processor.getCores() * processor.getSpeed();
|
||||
return returnVal;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[id=" + getId() + ", providerId=" + getProviderId() + ", name=" + getName() + ", processors="
|
||||
+ processors + ", ram=" + ram + ", disk=" + disk + ", supportsImage=" + supportsImage + "]";
|
||||
+ processors + ", ram=" + ram + ", volumes=" + volumes + ", supportsImage=" + supportsImage + "]";
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public boolean supportsImage(Image image) {
|
||||
return supportsImage.apply(image);
|
||||
public Predicate<Image> supportsImage() {
|
||||
return supportsImage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + disk;
|
||||
result = prime * result + ((processors == null) ? 0 : processors.hashCode());
|
||||
result = prime * result + ram;
|
||||
result = prime * result + ((supportsImage == null) ? 0 : supportsImage.hashCode());
|
||||
result = prime * result + ((volumes == null) ? 0 : volumes.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -142,8 +139,6 @@ public class HardwareImpl extends ComputeMetadataImpl implements Hardware {
|
|||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
HardwareImpl other = (HardwareImpl) obj;
|
||||
if (disk != other.disk)
|
||||
return false;
|
||||
if (processors == null) {
|
||||
if (other.processors != null)
|
||||
return false;
|
||||
|
@ -156,6 +151,11 @@ public class HardwareImpl extends ComputeMetadataImpl implements Hardware {
|
|||
return false;
|
||||
} else if (!supportsImage.equals(other.supportsImage))
|
||||
return false;
|
||||
if (volumes == null) {
|
||||
if (other.volumes != null)
|
||||
return false;
|
||||
} else if (!volumes.equals(other.volumes))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,7 @@ import java.util.Set;
|
|||
import javax.annotation.Nullable;
|
||||
|
||||
import org.jclouds.compute.domain.ComputeType;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
import org.jclouds.compute.domain.OperatingSystem;
|
||||
|
@ -35,7 +36,6 @@ import org.jclouds.domain.Credentials;
|
|||
import org.jclouds.domain.Location;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.common.collect.Sets;
|
||||
|
||||
/**
|
||||
|
@ -49,24 +49,25 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
|
|||
private final NodeState state;
|
||||
private final Set<String> publicAddresses = Sets.newLinkedHashSet();
|
||||
private final Set<String> privateAddresses = Sets.newLinkedHashSet();
|
||||
private final Map<String, String> extra = Maps.newLinkedHashMap();
|
||||
private final Credentials credentials;
|
||||
private final String tag;
|
||||
private final String imageId;
|
||||
@Nullable
|
||||
private final Hardware hardware;
|
||||
private final OperatingSystem os;
|
||||
|
||||
public NodeMetadataImpl(String providerId, String name, String id, Location location, URI uri,
|
||||
Map<String, String> userMetadata, @Nullable String tag, @Nullable String imageId,
|
||||
@Nullable OperatingSystem os, NodeState state, Iterable<String> publicAddresses,
|
||||
Iterable<String> privateAddresses, Map<String, String> extra, @Nullable Credentials credentials) {
|
||||
Map<String, String> userMetadata, @Nullable String tag, @Nullable Hardware hardware,
|
||||
@Nullable String imageId, @Nullable OperatingSystem os, NodeState state, Iterable<String> publicAddresses,
|
||||
Iterable<String> privateAddresses, @Nullable Credentials credentials) {
|
||||
super(ComputeType.NODE, providerId, name, id, location, uri, userMetadata);
|
||||
this.tag = tag;
|
||||
this.hardware = hardware;
|
||||
this.imageId = imageId;
|
||||
this.os = os;
|
||||
this.state = checkNotNull(state, "state");
|
||||
Iterables.addAll(this.publicAddresses, checkNotNull(publicAddresses, "publicAddresses"));
|
||||
Iterables.addAll(this.privateAddresses, checkNotNull(privateAddresses, "privateAddresses"));
|
||||
this.extra.putAll(checkNotNull(extra, "extra"));
|
||||
this.credentials = credentials;
|
||||
}
|
||||
|
||||
|
@ -78,6 +79,14 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
|
|||
return tag;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public Hardware getHardware() {
|
||||
return hardware;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
|
@ -114,8 +123,16 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
|
|||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public Map<String, String> getExtra() {
|
||||
return extra;
|
||||
public String getImageId() {
|
||||
return imageId;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public OperatingSystem getOperatingSystem() {
|
||||
return os;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -123,8 +140,8 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
|
|||
return "[id=" + getId() + ", providerId=" + getProviderId() + ", tag=" + getTag() + ", name=" + getName()
|
||||
+ ", location=" + getLocation() + ", uri=" + getUri() + ", imageId=" + getImageId() + ", os="
|
||||
+ getOperatingSystem() + ", userMetadata=" + getUserMetadata() + ", state=" + getState()
|
||||
+ ", privateAddresses=" + privateAddresses + ", publicAddresses=" + publicAddresses + ", extra="
|
||||
+ getExtra() + "]";
|
||||
+ ", privateAddresses=" + privateAddresses + ", publicAddresses=" + publicAddresses + ", hardware="
|
||||
+ getHardware() + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -135,6 +152,7 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
|
|||
result = prime * result + ((publicAddresses == null) ? 0 : publicAddresses.hashCode());
|
||||
result = prime * result + ((tag == null) ? 0 : tag.hashCode());
|
||||
result = prime * result + ((imageId == null) ? 0 : imageId.hashCode());
|
||||
result = prime * result + ((hardware == null) ? 0 : hardware.hashCode());
|
||||
result = prime * result + ((os == null) ? 0 : os.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
@ -168,6 +186,11 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
|
|||
return false;
|
||||
} else if (!imageId.equals(other.imageId))
|
||||
return false;
|
||||
if (hardware == null) {
|
||||
if (other.hardware != null)
|
||||
return false;
|
||||
} else if (!hardware.equals(other.hardware))
|
||||
return false;
|
||||
if (os == null) {
|
||||
if (other.os != null)
|
||||
return false;
|
||||
|
@ -176,14 +199,4 @@ public class NodeMetadataImpl extends ComputeMetadataImpl implements NodeMetadat
|
|||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getImageId() {
|
||||
return imageId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public OperatingSystem getOperatingSystem() {
|
||||
return os;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ import static com.google.common.collect.Iterables.filter;
|
|||
import static com.google.common.collect.Lists.newArrayList;
|
||||
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 static org.jclouds.util.Utils.multiMax;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
@ -384,7 +385,7 @@ public class TemplateBuilderImpl implements TemplateBuilder {
|
|||
static final Ordering<Hardware> DEFAULT_SIZE_ORDERING = new Ordering<Hardware>() {
|
||||
public int compare(Hardware left, Hardware right) {
|
||||
return ComparisonChain.start().compare(getCores(left), getCores(right)).compare(left.getRam(), right.getRam())
|
||||
.compare(left.getDisk(), right.getDisk()).result();
|
||||
.compare(getSpace(left), getSpace(right)).result();
|
||||
}
|
||||
};
|
||||
static final Ordering<Hardware> BY_CORES_ORDERING = new Ordering<Hardware>() {
|
||||
|
@ -554,7 +555,7 @@ public class TemplateBuilderImpl implements TemplateBuilder {
|
|||
|
||||
@Override
|
||||
public boolean apply(Image input) {
|
||||
return hardware.supportsImage(input);
|
||||
return hardware.supportsImage().apply(input);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -596,7 +597,7 @@ public class TemplateBuilderImpl implements TemplateBuilder {
|
|||
|
||||
@Override
|
||||
public boolean apply(Image arg0) {
|
||||
return hardware.supportsImage(arg0);
|
||||
return hardware.supportsImage().apply(arg0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -0,0 +1,159 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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 static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class VolumeImpl implements Volume {
|
||||
/** The serialVersionUID */
|
||||
private static final long serialVersionUID = -3306004212804159093L;
|
||||
|
||||
private final String id;
|
||||
private final Volume.Type type;
|
||||
private final @Nullable
|
||||
Float size;
|
||||
private final @Nullable
|
||||
String device;
|
||||
private final boolean bootDevice;
|
||||
private final boolean durable;
|
||||
|
||||
public VolumeImpl(@Nullable String id, Volume.Type type, @Nullable Float size, @Nullable String device,
|
||||
boolean bootDevice, boolean durable) {
|
||||
this.id = id;
|
||||
this.type = checkNotNull(type, "type");
|
||||
this.size = size;
|
||||
this.device = device;
|
||||
this.bootDevice = bootDevice;
|
||||
this.durable = durable;
|
||||
}
|
||||
|
||||
public VolumeImpl(@Nullable Float size, boolean bootDevice, boolean durable) {
|
||||
this(null, Volume.Type.LOCAL, size, null, bootDevice, durable);
|
||||
}
|
||||
|
||||
public VolumeImpl(@Nullable Float size, @Nullable String device, boolean bootDevice, boolean durable) {
|
||||
this(null, Volume.Type.LOCAL, size, device, bootDevice, durable);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public Volume.Type getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public Float getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String getDevice() {
|
||||
return device;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public boolean isDurable() {
|
||||
return durable;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public boolean isBootDevice() {
|
||||
return bootDevice;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return "[id=" + getId() + ", type=" + type + ", size=" + size + ", device=" + device + ", durable=" + durable
|
||||
+ ", isBootDevice=" + bootDevice + "]";
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
final int prime = 31;
|
||||
int result = super.hashCode();
|
||||
result = prime * result + ((device == null) ? 0 : device.hashCode());
|
||||
result = prime * result + (durable ? 1231 : 1237);
|
||||
result = prime * result + ((size == null) ? 0 : size.hashCode());
|
||||
result = prime * result + ((type == null) ? 0 : type.hashCode());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object obj) {
|
||||
if (this == obj)
|
||||
return true;
|
||||
if (!super.equals(obj))
|
||||
return false;
|
||||
if (getClass() != obj.getClass())
|
||||
return false;
|
||||
VolumeImpl other = (VolumeImpl) obj;
|
||||
if (device == null) {
|
||||
if (other.device != null)
|
||||
return false;
|
||||
} else if (!device.equals(other.device))
|
||||
return false;
|
||||
if (durable != other.durable)
|
||||
return false;
|
||||
if (size == null) {
|
||||
if (other.size != null)
|
||||
return false;
|
||||
} else if (!size.equals(other.size))
|
||||
return false;
|
||||
if (type == null) {
|
||||
if (other.type != null)
|
||||
return false;
|
||||
} else if (!type.equals(other.type))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -31,6 +31,7 @@ import java.util.concurrent.ExecutorService;
|
|||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Named;
|
||||
import javax.inject.Provider;
|
||||
|
@ -52,6 +53,7 @@ import org.jclouds.compute.domain.Processor;
|
|||
import org.jclouds.compute.domain.Template;
|
||||
import org.jclouds.compute.domain.internal.ImageImpl;
|
||||
import org.jclouds.compute.domain.internal.NodeMetadataImpl;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.compute.internal.ComputeServiceContextImpl;
|
||||
import org.jclouds.compute.predicates.NodePredicates;
|
||||
import org.jclouds.compute.strategy.AddNodeWithTagStrategy;
|
||||
|
@ -156,7 +158,7 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo
|
|||
|
||||
}
|
||||
|
||||
@SuppressWarnings({ "rawtypes" })
|
||||
@SuppressWarnings( { "rawtypes" })
|
||||
@Override
|
||||
protected void configure() {
|
||||
bind(new TypeLiteral<ComputeServiceContext>() {
|
||||
|
@ -180,11 +182,11 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo
|
|||
private final ExecutorService service;
|
||||
|
||||
public StubNodeMetadata(String providerId, String name, String id, Location location, URI uri,
|
||||
Map<String, String> userMetadata, String tag, String imageId, Image image, OperatingSystem os,
|
||||
NodeState state, Iterable<String> publicAddresses, Iterable<String> privateAddresses,
|
||||
Map<String, String> extra, Credentials credentials, ExecutorService service) {
|
||||
super(providerId, name, id, location, uri, userMetadata, tag, imageId, os, state, publicAddresses,
|
||||
privateAddresses, extra, credentials);
|
||||
Map<String, String> userMetadata, String tag, @Nullable Hardware hardware, String imageId, Image image,
|
||||
OperatingSystem os, NodeState state, Iterable<String> publicAddresses,
|
||||
Iterable<String> privateAddresses, Credentials credentials, ExecutorService service) {
|
||||
super(providerId, name, id, location, uri, userMetadata, tag, hardware, imageId, os, state, publicAddresses,
|
||||
privateAddresses, credentials);
|
||||
this.setState(state, 0);
|
||||
this.service = service;
|
||||
}
|
||||
|
@ -243,11 +245,10 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo
|
|||
public NodeMetadata execute(String tag, String name, Template template) {
|
||||
checkArgument(location.get().equals(template.getLocation()), "invalid location: " + template.getLocation());
|
||||
int id = idProvider.get();
|
||||
StubNodeMetadata node = new StubNodeMetadata(id + "", name, id + "", location.get(), null,
|
||||
ImmutableMap.<String, String> of(), tag, template.getImage().getId(), template.getImage(), template
|
||||
.getImage().getOperatingSystem(), NodeState.PENDING,
|
||||
ImmutableSet.<String> of(publicIpPrefix + id), ImmutableSet.<String> of(privateIpPrefix + id),
|
||||
ImmutableMap.<String, String> of(), new Credentials("root", passwordPrefix + id), service);
|
||||
StubNodeMetadata node = new StubNodeMetadata(id + "", name, id + "", location.get(), null, ImmutableMap
|
||||
.<String, String> of(), tag, null, template.getImage().getId(), template.getImage(), template
|
||||
.getImage().getOperatingSystem(), NodeState.PENDING, ImmutableSet.<String> of(publicIpPrefix + id),
|
||||
ImmutableSet.<String> of(privateIpPrefix + id), new Credentials("root", passwordPrefix + id), service);
|
||||
nodes.put(id, node);
|
||||
node.setState(NodeState.RUNNING, 100);
|
||||
return node;
|
||||
|
@ -389,9 +390,9 @@ public class StubComputeServiceContextModule extends BaseComputeServiceContextMo
|
|||
/** The serialVersionUID */
|
||||
private static final long serialVersionUID = -1842135761654973637L;
|
||||
|
||||
StubHardware(String type, int cores, int ram, int disk) {
|
||||
StubHardware(String type, int cores, int ram, float disk) {
|
||||
super(type, type, type, null, null, ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(cores,
|
||||
1.0)), ram, disk, any());
|
||||
1.0)), ram, ImmutableList.of(new VolumeImpl(disk, true, false)), any());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,8 +21,8 @@ package org.jclouds.compute.util;
|
|||
|
||||
import java.util.Formatter;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.NoSuchElementException;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
@ -32,12 +32,17 @@ import org.jclouds.compute.domain.ComputeMetadata;
|
|||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.domain.internal.NodeMetadataImpl;
|
||||
import org.jclouds.domain.Credentials;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.ssh.SshClient;
|
||||
import org.jclouds.util.Utils;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
@ -50,6 +55,24 @@ import com.google.common.collect.Iterables;
|
|||
public class ComputeServiceUtils {
|
||||
public static final Pattern DELIMETED_BY_HYPHEN_ENDING_IN_HYPHEN_HEX = Pattern.compile("([^-]+)-[0-9a-f]+");
|
||||
|
||||
/**
|
||||
* build a shell script that invokes the contents of the http request in bash.
|
||||
*
|
||||
* @return a shell script that will invoke the http request
|
||||
*/
|
||||
public static String buildCurlsh(HttpRequest request) {
|
||||
String headers = Joiner.on(' ').join(
|
||||
Iterables.transform(request.getHeaders().entries(), new Function<Entry<String, String>, String>() {
|
||||
|
||||
@Override
|
||||
public String apply(Entry<String, String> from) {
|
||||
return String.format("-H \"%s: %s\"", from.getKey(), from.getValue());
|
||||
}
|
||||
|
||||
}));
|
||||
return String.format("curl -s --retry 20 %s %s |bash\n", headers, request.getEndpoint().toASCIIString());
|
||||
}
|
||||
|
||||
public static String parseTagFromName(String from) {
|
||||
Matcher matcher = DELIMETED_BY_HYPHEN_ENDING_IN_HYPHEN_HEX.matcher(from);
|
||||
return matcher.find() ? matcher.group(1) : "NOTAG-" + from;
|
||||
|
@ -69,15 +92,21 @@ public class ComputeServiceUtils {
|
|||
return total;
|
||||
}
|
||||
|
||||
public static double getSpace(Hardware input) {
|
||||
double total = 0;
|
||||
for (Volume volume : input.getVolumes())
|
||||
total += volume.getSize() != null ? volume.getSize() : 0;
|
||||
return total;
|
||||
}
|
||||
|
||||
public static final Map<org.jclouds.compute.domain.OsFamily, Map<String, String>> NAME_VERSION_MAP = ImmutableMap
|
||||
.<org.jclouds.compute.domain.OsFamily, Map<String, String>> of(
|
||||
org.jclouds.compute.domain.OsFamily.CENTOS,
|
||||
ImmutableMap.<String, String> builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5").build(),
|
||||
org.jclouds.compute.domain.OsFamily.RHEL,
|
||||
ImmutableMap.<String, String> builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5").build(),
|
||||
org.jclouds.compute.domain.OsFamily.UBUNTU,
|
||||
ImmutableMap.<String, String> builder().put("hardy", "8.04").put("intrepid", "8.10")
|
||||
.put("jaunty", "9.04").put("karmic", "9.10").put("lucid", "10.04").put("maverick", "10.10")
|
||||
.<org.jclouds.compute.domain.OsFamily, Map<String, String>> of(org.jclouds.compute.domain.OsFamily.CENTOS,
|
||||
ImmutableMap.<String, String> builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5")
|
||||
.build(), org.jclouds.compute.domain.OsFamily.RHEL,
|
||||
ImmutableMap.<String, String> builder().put("5.3", "5.3").put("5.4", "5.4").put("5.5", "5.5")
|
||||
.build(), org.jclouds.compute.domain.OsFamily.UBUNTU, ImmutableMap
|
||||
.<String, String> builder().put("hardy", "8.04").put("intrepid", "8.10").put("jaunty",
|
||||
"9.04").put("karmic", "9.10").put("lucid", "10.04").put("maverick", "10.10")
|
||||
.build());
|
||||
|
||||
public static String parseVersionOrReturnEmptyString(org.jclouds.compute.domain.OsFamily family, final String in) {
|
||||
|
@ -110,8 +139,8 @@ public class ComputeServiceUtils {
|
|||
Formatter fmt = new Formatter().format("Execution failures:%n%n");
|
||||
int index = 1;
|
||||
for (Entry<?, Exception> errorMessage : executionExceptions.entrySet()) {
|
||||
fmt.format("%s) %s on %s:%n%s%n%n", index++, errorMessage.getValue().getClass().getSimpleName(),
|
||||
errorMessage.getKey(), Throwables.getStackTraceAsString(errorMessage.getValue()));
|
||||
fmt.format("%s) %s on %s:%n%s%n%n", index++, errorMessage.getValue().getClass().getSimpleName(), errorMessage
|
||||
.getKey(), Throwables.getStackTraceAsString(errorMessage.getValue()));
|
||||
}
|
||||
return fmt.format("%s error[s]", executionExceptions.size()).toString();
|
||||
}
|
||||
|
@ -161,14 +190,24 @@ public class ComputeServiceUtils {
|
|||
}
|
||||
|
||||
/**
|
||||
* Given the instances of {@link NodeMetadata} (immutable) and
|
||||
* {@link Credentials} (immutable), returns a new instance of
|
||||
* {@link NodeMetadata} that has new credentials
|
||||
* Given the instances of {@link NodeMetadata} (immutable) and {@link Credentials} (immutable),
|
||||
* returns a new instance of {@link NodeMetadata} that has new credentials
|
||||
*/
|
||||
public static NodeMetadata installNewCredentials(NodeMetadata node, Credentials newCredentials) {
|
||||
return new NodeMetadataImpl(node.getProviderId(), node.getName(), node.getId(), node.getLocation(),
|
||||
node.getUri(), node.getUserMetadata(), node.getTag(), node.getImageId(), node.getOperatingSystem(),
|
||||
node.getState(), node.getPublicAddresses(), node.getPrivateAddresses(), node.getExtra(), newCredentials);
|
||||
node.getUri(), node.getUserMetadata(), node.getTag(), node.getHardware(), node.getImageId(), node
|
||||
.getOperatingSystem(), node.getState(), node.getPublicAddresses(), node.getPrivateAddresses(),
|
||||
newCredentials);
|
||||
}
|
||||
|
||||
/**
|
||||
* Given the instances of {@link Hardware} (immutable) and {@link Iterable<? extends Volume>}
|
||||
* (immutable), returns a new instance of {@link Hardware} with the new volumes
|
||||
*/
|
||||
public static Hardware replacesVolumes(Hardware hardware, Iterable<? extends Volume> volumes) {
|
||||
return new HardwareImpl(hardware.getProviderId(), hardware.getName(), hardware.getId(), hardware.getLocation(),
|
||||
hardware.getUri(), hardware.getUserMetadata(), hardware.getProcessors(), hardware.getRam(), volumes,
|
||||
hardware.supportsImage());
|
||||
}
|
||||
|
||||
public static Iterable<String> getSupportedProviders() {
|
||||
|
|
|
@ -55,11 +55,11 @@ import java.util.concurrent.TimeoutException;
|
|||
import org.jclouds.Constants;
|
||||
import org.jclouds.compute.domain.ComputeMetadata;
|
||||
import org.jclouds.compute.domain.ComputeType;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
import org.jclouds.compute.domain.OperatingSystem;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Template;
|
||||
import org.jclouds.compute.domain.TemplateBuilder;
|
||||
import org.jclouds.compute.options.TemplateOptions;
|
||||
|
@ -85,7 +85,6 @@ import com.google.common.collect.ImmutableMap;
|
|||
import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.io.Files;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Module;
|
||||
|
||||
/**
|
||||
|
@ -125,7 +124,6 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
abstract public void setServiceDefaults();
|
||||
|
||||
protected String provider;
|
||||
protected SshClient.Factory sshFactory;
|
||||
protected String tag;
|
||||
|
||||
protected RetryablePredicate<IPSocket> socketTester;
|
||||
|
@ -145,12 +143,12 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
setupCredentials();
|
||||
setupKeyPairForTest();
|
||||
initializeContextAndClient();
|
||||
buildSocketTester();
|
||||
}
|
||||
|
||||
Injector injector = createSshClientInjector();
|
||||
sshFactory = injector.getInstance(SshClient.Factory.class);
|
||||
SocketOpen socketOpen = injector.getInstance(SocketOpen.class);
|
||||
protected void buildSocketTester() {
|
||||
SocketOpen socketOpen = Guice.createInjector(getSshModule()).getInstance(SocketOpen.class);
|
||||
socketTester = new RetryablePredicate<IPSocket>(socketOpen, 60, 1, TimeUnit.SECONDS);
|
||||
injector.injectMembers(socketOpen); // add logger
|
||||
}
|
||||
|
||||
protected void setupKeyPairForTest() throws FileNotFoundException, IOException {
|
||||
|
@ -167,8 +165,8 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
checkSecretKeyFile(secretKeyFile);
|
||||
String secret = Files.toString(new File(secretKeyFile), Charsets.UTF_8);
|
||||
assert secret.startsWith("-----BEGIN RSA PRIVATE KEY-----") : "invalid key:\n" + secret;
|
||||
return ImmutableMap.<String, String> of("private", secret, "public",
|
||||
Files.toString(new File(secretKeyFile + ".pub"), Charsets.UTF_8));
|
||||
return ImmutableMap.<String, String> of("private", secret, "public", Files.toString(new File(secretKeyFile
|
||||
+ ".pub"), Charsets.UTF_8));
|
||||
}
|
||||
|
||||
protected void setupCredentials() {
|
||||
|
@ -176,18 +174,14 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential");
|
||||
}
|
||||
|
||||
protected Injector createSshClientInjector() {
|
||||
return Guice.createInjector(getSshModule());
|
||||
}
|
||||
|
||||
private void initializeContextAndClient() throws IOException {
|
||||
if (context != null)
|
||||
context.close();
|
||||
Properties props = new Properties();
|
||||
props.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true");
|
||||
props.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true");
|
||||
context = new ComputeServiceContextFactory().createContext(provider, identity, credential,
|
||||
ImmutableSet.of(new Log4JLoggingModule(), getSshModule()), props);
|
||||
context = new ComputeServiceContextFactory().createContext(provider, identity, credential, ImmutableSet.of(
|
||||
new Log4JLoggingModule(), getSshModule()), props);
|
||||
client = context.getComputeService();
|
||||
}
|
||||
|
||||
|
@ -205,8 +199,8 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
public void testCorrectAuthException() throws Exception {
|
||||
ComputeServiceContext context = null;
|
||||
try {
|
||||
context = new ComputeServiceContextFactory().createContext(provider, "MOMMA", "MIA",
|
||||
ImmutableSet.<Module> of(new Log4JLoggingModule()));
|
||||
context = new ComputeServiceContextFactory().createContext(provider, "MOMMA", "MIA", ImmutableSet
|
||||
.<Module> of(new Log4JLoggingModule()));
|
||||
context.getComputeService().listNodes();
|
||||
} finally {
|
||||
if (context != null)
|
||||
|
@ -299,9 +293,9 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
private void refreshTemplate() {
|
||||
template = buildTemplate(client.templateBuilder());
|
||||
|
||||
template.getOptions().installPrivateKey(newStringPayload(keyPair.get("private")))
|
||||
.authorizePublicKey(newStringPayload(keyPair.get("public")))
|
||||
.runScript(newStringPayload(buildScript(template.getImage().getOperatingSystem())));
|
||||
template.getOptions().installPrivateKey(newStringPayload(keyPair.get("private"))).authorizePublicKey(
|
||||
newStringPayload(keyPair.get("public"))).runScript(
|
||||
newStringPayload(buildScript(template.getImage().getOperatingSystem())));
|
||||
}
|
||||
|
||||
protected void checkImageIdMatchesTemplate(NodeMetadata node) {
|
||||
|
@ -312,8 +306,8 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
protected void checkOsMatchesTemplate(NodeMetadata node) {
|
||||
if (node.getOperatingSystem() != null)
|
||||
assert node.getOperatingSystem().getFamily().equals(template.getImage().getOperatingSystem().getFamily()) : String
|
||||
.format("expecting family %s but got %s", template.getImage().getOperatingSystem().getFamily(),
|
||||
node.getOperatingSystem());
|
||||
.format("expecting family %s but got %s", template.getImage().getOperatingSystem().getFamily(), node
|
||||
.getOperatingSystem());
|
||||
}
|
||||
|
||||
void assertLocationSameOrChild(Location test, Location expected) {
|
||||
|
@ -353,8 +347,7 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
assertNotNull(node.getTag());
|
||||
assertEquals(node.getTag(), tag);
|
||||
assertEquals(node.getState(), NodeState.RUNNING);
|
||||
assert node.getPublicAddresses().size() >= 1 || node.getPrivateAddresses().size() >= 1 : "no ips in"
|
||||
+ node;
|
||||
assert node.getPublicAddresses().size() >= 1 || node.getPrivateAddresses().size() >= 1 : "no ips in" + node;
|
||||
assertNotNull(node.getCredentials());
|
||||
if (node.getCredentials().identity != null) {
|
||||
assertNotNull(node.getCredentials().identity);
|
||||
|
@ -439,8 +432,7 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
// assert nodeMetadata.getName() != null : nodeMetadata;
|
||||
if (nodeMetadata.getState() == NodeState.RUNNING) {
|
||||
assert nodeMetadata.getPublicAddresses() != null : nodeMetadata;
|
||||
assert nodeMetadata.getPublicAddresses().size() > 0
|
||||
|| nodeMetadata.getPrivateAddresses().size() > 0 : nodeMetadata;
|
||||
assert nodeMetadata.getPublicAddresses().size() > 0 || nodeMetadata.getPrivateAddresses().size() > 0 : nodeMetadata;
|
||||
assertNotNull(nodeMetadata.getPrivateAddresses());
|
||||
}
|
||||
}
|
||||
|
@ -517,9 +509,9 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
for (Hardware hardware : client.listHardwareProfiles()) {
|
||||
assert hardware.getProviderId() != null;
|
||||
assert getCores(hardware) > 0;
|
||||
assert hardware.getDisk() >= 0;
|
||||
assert hardware.getVolumes().size() >= 0;
|
||||
assert hardware.getRam() > 0;
|
||||
assertEquals(hardware.getType(), ComputeType.SIZE);
|
||||
assertEquals(hardware.getType(), ComputeType.HARDWARE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -567,7 +559,13 @@ public abstract class BaseComputeServiceLiveTest {
|
|||
socketTester.apply(socket); // TODO add transitionTo option that accepts
|
||||
// a socket conection
|
||||
// state.
|
||||
SshClient ssh = sshFactory.create(socket, node.getCredentials().identity, keyPair.get("private").getBytes());
|
||||
SshClient ssh = (node.getCredentials().credential != null && !node.getCredentials().credential
|
||||
.startsWith("-----BEGIN RSA PRIVATE KEY-----")) ? context.utils().sshFactory().create(socket,
|
||||
node.getCredentials().identity, node.getCredentials().credential) : context.utils().sshFactory().create(
|
||||
socket,
|
||||
node.getCredentials().identity,
|
||||
node.getCredentials().credential != null ? node.getCredentials().credential.getBytes() : keyPair.get(
|
||||
"private").getBytes());
|
||||
try {
|
||||
ssh.connect();
|
||||
ExecResponse hello = ssh.exec("echo hello");
|
||||
|
|
|
@ -26,6 +26,7 @@ import static org.easymock.EasyMock.expect;
|
|||
import static org.easymock.EasyMock.reportMatcher;
|
||||
import static org.easymock.classextension.EasyMock.createMock;
|
||||
import static org.easymock.classextension.EasyMock.replay;
|
||||
import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
|
@ -34,6 +35,7 @@ import java.io.Serializable;
|
|||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
||||
import org.easymock.IArgumentMatcher;
|
||||
|
@ -43,6 +45,7 @@ import org.jclouds.compute.domain.Template;
|
|||
import org.jclouds.compute.stub.config.StubComputeServiceContextModule.StubNodeMetadata;
|
||||
import org.jclouds.io.Payload;
|
||||
import org.jclouds.net.IPSocket;
|
||||
import org.jclouds.predicates.RetryablePredicate;
|
||||
import org.jclouds.predicates.SocketOpen;
|
||||
import org.jclouds.rest.RestContext;
|
||||
import org.jclouds.scriptbuilder.InitBuilder;
|
||||
|
@ -61,10 +64,7 @@ import com.google.common.collect.ImmutableList;
|
|||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.inject.AbstractModule;
|
||||
import com.google.inject.Guice;
|
||||
import com.google.inject.Injector;
|
||||
import com.google.inject.Module;
|
||||
import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -96,64 +96,17 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes
|
|||
assertEquals(getCores(defaultTemplate.getHardware()), 1.0d);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Injector createSshClientInjector() {
|
||||
return Guice.createInjector(new AbstractModule() {
|
||||
protected void buildSocketTester() {
|
||||
SocketOpen socketOpen = createMock(SocketOpen.class);
|
||||
|
||||
@Override
|
||||
protected void configure() {
|
||||
SshClient.Factory factory = createMock(SshClient.Factory.class);
|
||||
SocketOpen open = createMock(SocketOpen.class);
|
||||
SshClient client1 = createMock(SshClient.class);
|
||||
SshClient client2 = createMock(SshClient.class);
|
||||
SshClient client3 = createMock(SshClient.class);
|
||||
SshClient client4 = createMock(SshClient.class);
|
||||
expect(socketOpen.apply(new IPSocket("144.175.1.1", 22))).andReturn(true);
|
||||
expect(socketOpen.apply(new IPSocket("144.175.1.2", 22))).andReturn(true);
|
||||
expect(socketOpen.apply(new IPSocket("144.175.1.3", 22))).andReturn(true);
|
||||
expect(socketOpen.apply(new IPSocket("144.175.1.4", 22))).andReturn(true);
|
||||
|
||||
expect(open.apply(new IPSocket("144.175.1.1", 22))).andReturn(true);
|
||||
expect(open.apply(new IPSocket("144.175.1.2", 22))).andReturn(true);
|
||||
expect(open.apply(new IPSocket("144.175.1.3", 22))).andReturn(true);
|
||||
expect(open.apply(new IPSocket("144.175.1.4", 22))).andReturn(true);
|
||||
replay(socketOpen);
|
||||
|
||||
expect(
|
||||
factory.create(eq(new IPSocket("144.175.1.1", 22)), eq("root"), aryEq(keyPair.get("private")
|
||||
.getBytes()))).andReturn(client1).atLeastOnce();
|
||||
expect(
|
||||
factory.create(eq(new IPSocket("144.175.1.2", 22)), eq("root"), aryEq(keyPair.get("private")
|
||||
.getBytes()))).andReturn(client2).atLeastOnce();
|
||||
expect(
|
||||
factory.create(eq(new IPSocket("144.175.1.3", 22)), eq("root"), aryEq(keyPair.get("private")
|
||||
.getBytes()))).andReturn(client3).atLeastOnce();
|
||||
expect(
|
||||
factory.create(eq(new IPSocket("144.175.1.4", 22)), eq("root"), aryEq(keyPair.get("private")
|
||||
.getBytes()))).andReturn(client4).atLeastOnce();
|
||||
|
||||
helloAndJava(client1);
|
||||
helloAndJava(client2);
|
||||
helloAndJava(client3);
|
||||
helloAndJava(client4);
|
||||
|
||||
replay(open);
|
||||
replay(factory);
|
||||
replay(client1);
|
||||
replay(client2);
|
||||
replay(client3);
|
||||
replay(client4);
|
||||
|
||||
bind(SshClient.Factory.class).toInstance(factory);
|
||||
|
||||
bind(SocketOpen.class).toInstance(open);
|
||||
}
|
||||
|
||||
private void helloAndJava(SshClient client) {
|
||||
client.connect();
|
||||
|
||||
expect(client.exec("echo hello")).andReturn(new ExecResponse("hello", "", 0));
|
||||
expect(client.exec("java -version")).andReturn(new ExecResponse("", "OpenJDK", 0));
|
||||
|
||||
client.disconnect();
|
||||
}
|
||||
|
||||
});
|
||||
socketTester = new RetryablePredicate<IPSocket>(socketOpen, 60, 1, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -188,6 +141,24 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes
|
|||
runScriptAndInstallSsh(client3, "runscript", 3);
|
||||
runScriptAndInstallSsh(client4, "runscript", 4);
|
||||
|
||||
expect(
|
||||
factory.create(eq(new IPSocket("144.175.1.1", 22)), eq("root"), aryEq(keyPair.get("private")
|
||||
.getBytes()))).andReturn(client1).atLeastOnce();
|
||||
expect(
|
||||
factory.create(eq(new IPSocket("144.175.1.2", 22)), eq("root"), aryEq(keyPair.get("private")
|
||||
.getBytes()))).andReturn(client2).atLeastOnce();
|
||||
expect(
|
||||
factory.create(eq(new IPSocket("144.175.1.3", 22)), eq("root"), aryEq(keyPair.get("private")
|
||||
.getBytes()))).andReturn(client3).atLeastOnce();
|
||||
expect(
|
||||
factory.create(eq(new IPSocket("144.175.1.4", 22)), eq("root"), aryEq(keyPair.get("private")
|
||||
.getBytes()))).andReturn(client4).atLeastOnce();
|
||||
|
||||
helloAndJava(client1);
|
||||
helloAndJava(client2);
|
||||
helloAndJava(client3);
|
||||
helloAndJava(client4);
|
||||
|
||||
replay(factory);
|
||||
replay(client1);
|
||||
replay(client2);
|
||||
|
@ -212,13 +183,12 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes
|
|||
expect(client.exec("chmod 600 .ssh/id_rsa")).andReturn(EXEC_GOOD);
|
||||
|
||||
client.disconnect();
|
||||
client.disconnect();
|
||||
|
||||
}
|
||||
|
||||
private void runScript(SshClient client, String scriptName, int nodeId) {
|
||||
client.put(eq("" + scriptName + ""),
|
||||
payloadEq(initScript(scriptName, BaseComputeServiceLiveTest.APT_RUN_SCRIPT)));
|
||||
client.put(eq("" + scriptName + ""), payloadEq(initScript(scriptName,
|
||||
BaseComputeServiceLiveTest.APT_RUN_SCRIPT)));
|
||||
expect(client.exec("chmod 755 " + scriptName + "")).andReturn(EXEC_GOOD);
|
||||
expect(client.getUsername()).andReturn("root").atLeastOnce();
|
||||
expect(client.getHostAddress()).andReturn(nodeId + "").atLeastOnce();
|
||||
|
@ -231,6 +201,15 @@ public class StubComputeServiceIntegrationTest extends BaseComputeServiceLiveTes
|
|||
expect(client.exec("./" + scriptName + " tailerr")).andReturn(EXEC_GOOD);
|
||||
}
|
||||
|
||||
private void helloAndJava(SshClient client) {
|
||||
client.connect();
|
||||
|
||||
expect(client.exec("echo hello")).andReturn(new ExecResponse("hello", "", 0));
|
||||
expect(client.exec("java -version")).andReturn(new ExecResponse("", "OpenJDK", 0));
|
||||
|
||||
client.disconnect();
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -36,6 +36,7 @@ import org.jclouds.compute.domain.OperatingSystem;
|
|||
import org.jclouds.compute.domain.OsFamily;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.TemplateBuilder;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.options.TemplateOptions;
|
||||
import org.jclouds.compute.predicates.ImagePredicates;
|
||||
import org.jclouds.domain.Location;
|
||||
|
@ -63,8 +64,9 @@ public class TemplateBuilderImplTest {
|
|||
Image image2 = createMock(Image.class);
|
||||
OperatingSystem os2 = createMock(OperatingSystem.class);
|
||||
|
||||
Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null,
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, 0, ImagePredicates.any());
|
||||
Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, ImmutableList.<Volume> of(),
|
||||
ImagePredicates.any());
|
||||
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
.<Location> of(defaultLocation));
|
||||
|
@ -124,8 +126,9 @@ public class TemplateBuilderImplTest {
|
|||
OperatingSystem os = createMock(OperatingSystem.class);
|
||||
OperatingSystem os2 = createMock(OperatingSystem.class);
|
||||
|
||||
Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null,
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, 0, ImagePredicates.any());
|
||||
Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, ImmutableList.<Volume> of(),
|
||||
ImagePredicates.any());
|
||||
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
.<Location> of(defaultLocation));
|
||||
|
@ -178,8 +181,8 @@ public class TemplateBuilderImplTest {
|
|||
Image image = createMock(Image.class);
|
||||
OperatingSystem os = createMock(OperatingSystem.class);
|
||||
|
||||
Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null,
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, 0,
|
||||
Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, ImmutableList.<Volume> of(),
|
||||
ImagePredicates.idEquals("imageId"));
|
||||
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
|
@ -234,8 +237,8 @@ public class TemplateBuilderImplTest {
|
|||
Image image = createMock(Image.class);
|
||||
OperatingSystem os = createMock(OperatingSystem.class);
|
||||
|
||||
Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null,
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, 0,
|
||||
Hardware size = new HardwareImpl("hardwareId", null, "hardwareId", defaultLocation, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(1.0, 1.0)), 0, ImmutableList.<Volume> of(),
|
||||
ImagePredicates.idEquals("imageId"));
|
||||
|
||||
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
|
||||
|
@ -359,8 +362,8 @@ public class TemplateBuilderImplTest {
|
|||
protected TemplateBuilderImpl createTemplateBuilder(Image knownImage, Supplier<Set<? extends Location>> locations,
|
||||
Supplier<Set<? extends Image>> images, Supplier<Set<? extends Hardware>> sizes, Location defaultLocation,
|
||||
Provider<TemplateOptions> optionsProvider, Provider<TemplateBuilder> templateBuilderProvider) {
|
||||
TemplateBuilderImpl template = new TemplateBuilderImpl(locations, images, sizes,
|
||||
Suppliers.ofInstance(defaultLocation), optionsProvider, templateBuilderProvider);
|
||||
TemplateBuilderImpl template = new TemplateBuilderImpl(locations, images, sizes, Suppliers
|
||||
.ofInstance(defaultLocation), optionsProvider, templateBuilderProvider);
|
||||
return template;
|
||||
}
|
||||
|
||||
|
|
|
@ -19,10 +19,14 @@
|
|||
|
||||
package org.jclouds.compute.util;
|
||||
|
||||
import org.jclouds.util.Utils;
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
* Test the compute utils.
|
||||
|
@ -34,14 +38,14 @@ import com.google.common.collect.Iterables;
|
|||
public class ComputeServiceUtilsTest {
|
||||
|
||||
@Test
|
||||
public void testSupportedComputeServiceProviders() {
|
||||
Iterable<String> providers = ComputeServiceUtils.getSupportedProviders();
|
||||
assert Iterables.contains(providers, "stub") : providers;
|
||||
}
|
||||
public void testCurlSh() {
|
||||
HttpRequest request = new HttpRequest("GET", URI.create("https://adriancolehappy.s3.amazonaws.com/java/install"),
|
||||
ImmutableMultimap.of("Host", "adriancolehappy.s3.amazonaws.com", "Date",
|
||||
"Sun, 12 Sep 2010 08:25:19 GMT", "Authorization", "AWS 0ASHDJAS82:JASHFDA="));
|
||||
|
||||
assertEquals(
|
||||
ComputeServiceUtils.buildCurlsh(request),
|
||||
"curl -s --retry 20 -H \"Host: adriancolehappy.s3.amazonaws.com\" -H \"Date: Sun, 12 Sep 2010 08:25:19 GMT\" -H \"Authorization: AWS 0ASHDJAS82:JASHFDA=\" https://adriancolehappy.s3.amazonaws.com/java/install |bash\n");
|
||||
|
||||
@Test
|
||||
public void testSupportedProviders() {
|
||||
Iterable<String> providers = Utils.getSupportedProviders();
|
||||
assert Iterables.contains(providers, "stub") : providers;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@ import javax.ws.rs.POST;
|
|||
import javax.ws.rs.PUT;
|
||||
import javax.ws.rs.Path;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.functions.ParseETagHeader;
|
||||
import org.jclouds.http.options.HttpRequestOptions;
|
||||
import org.jclouds.io.Payload;
|
||||
|
@ -88,6 +89,12 @@ public interface HttpAsyncClient {
|
|||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||
ListenableFuture<InputStream> get(@EndpointParam URI location);
|
||||
|
||||
/**
|
||||
* @see HttpClient#get
|
||||
*/
|
||||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||
ListenableFuture<InputStream> get(HttpRequest location);
|
||||
|
||||
@GET
|
||||
@Path("")
|
||||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||
|
|
|
@ -24,6 +24,7 @@ import java.net.URI;
|
|||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.jclouds.concurrent.Timeout;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.options.HttpRequestOptions;
|
||||
import org.jclouds.io.Payload;
|
||||
|
||||
|
@ -62,6 +63,11 @@ public interface HttpClient {
|
|||
*/
|
||||
InputStream get(URI location);
|
||||
|
||||
/**
|
||||
* @return null if the resource didn't exist.
|
||||
*/
|
||||
InputStream get(HttpRequest location);
|
||||
|
||||
InputStream get(URI location, HttpRequestOptions options);
|
||||
|
||||
/**
|
||||
|
|
|
@ -109,10 +109,11 @@ public class AsyncRestClientProxy<T> implements InvocationHandler {
|
|||
if (exceptionParser instanceof InvocationContext) {
|
||||
((InvocationContext) exceptionParser).setContext(null);
|
||||
}
|
||||
HttpRequest request;
|
||||
HttpRequest request = RestAnnotationProcessor.findHttpRequestInArgs(args);
|
||||
if (request == null) {
|
||||
try {
|
||||
request = annotationProcessor.createRequest(method, args);
|
||||
if (exceptionParser instanceof InvocationContext) {
|
||||
if (exceptionParser instanceof InvocationContext && request instanceof GeneratedHttpRequest) {
|
||||
((InvocationContext) exceptionParser).setContext((GeneratedHttpRequest<T>) request);
|
||||
}
|
||||
} catch (RuntimeException e) {
|
||||
|
@ -125,6 +126,7 @@ public class AsyncRestClientProxy<T> implements InvocationHandler {
|
|||
}
|
||||
return Futures.immediateFailedFuture(e);
|
||||
}
|
||||
}
|
||||
logger.trace("Converted %s.%s to %s", declaring.getSimpleName(), method.getName(), request.getRequestLine());
|
||||
|
||||
Function<HttpResponse, ?> transformer = annotationProcessor.createResponseParser(method, request);
|
||||
|
|
|
@ -1010,7 +1010,16 @@ public class RestAnnotationProcessor<T> {
|
|||
return parts;
|
||||
}
|
||||
|
||||
Payload findPayloadInArgs(Object[] args) {
|
||||
public static HttpRequest findHttpRequestInArgs(Object[] args) {
|
||||
if (args == null)
|
||||
return null;
|
||||
for (int i = 0; i < args.length; i++)
|
||||
if (args[i] instanceof HttpRequest)
|
||||
return HttpRequest.class.cast(args[i]);
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Payload findPayloadInArgs(Object[] args) {
|
||||
if (args == null)
|
||||
return null;
|
||||
for (int i = 0; i < args.length; i++)
|
||||
|
|
|
@ -21,6 +21,7 @@ package org.jclouds.gogrid.compute.config;
|
|||
|
||||
import static org.jclouds.compute.domain.OsFamily.CENTOS;
|
||||
import static org.jclouds.compute.util.ComputeServiceUtils.getCores;
|
||||
import static org.jclouds.compute.util.ComputeServiceUtils.getSpace;
|
||||
import static org.jclouds.gogrid.reference.GoGridConstants.PROPERTY_GOGRID_DEFAULT_DC;
|
||||
|
||||
import java.util.Map;
|
||||
|
@ -32,10 +33,10 @@ import org.jclouds.compute.ComputeServiceContext;
|
|||
import org.jclouds.compute.LoadBalancerService;
|
||||
import org.jclouds.compute.config.BaseComputeServiceContextModule;
|
||||
import org.jclouds.compute.config.ComputeServiceTimeoutsModule;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.TemplateBuilder;
|
||||
import org.jclouds.compute.internal.ComputeServiceContextImpl;
|
||||
import org.jclouds.compute.strategy.AddNodeWithTagStrategy;
|
||||
|
@ -52,9 +53,9 @@ import org.jclouds.gogrid.compute.strategy.GoGridDestroyNodeStrategy;
|
|||
import org.jclouds.gogrid.compute.strategy.GoGridGetNodeMetadataStrategy;
|
||||
import org.jclouds.gogrid.compute.strategy.GoGridListNodesStrategy;
|
||||
import org.jclouds.gogrid.compute.strategy.GoGridRebootNodeStrategy;
|
||||
import org.jclouds.gogrid.compute.suppliers.GoGridHardwareSupplier;
|
||||
import org.jclouds.gogrid.compute.suppliers.GoGridImageSupplier;
|
||||
import org.jclouds.gogrid.compute.suppliers.GoGridLocationSupplier;
|
||||
import org.jclouds.gogrid.compute.suppliers.GoGridHardwareSupplier;
|
||||
import org.jclouds.gogrid.domain.Server;
|
||||
import org.jclouds.gogrid.domain.ServerState;
|
||||
import org.jclouds.rest.RestContext;
|
||||
|
@ -137,13 +138,13 @@ public class GoGridComputeServiceContextModule extends BaseComputeServiceContext
|
|||
return new Function<Hardware, String>() {
|
||||
@Override
|
||||
public String apply(Hardware hardware) {
|
||||
if (hardware.getRam() >= 8 * 1024 || getCores(hardware) >= 6 || hardware.getDisk() >= 450)
|
||||
if (hardware.getRam() >= 8 * 1024 || getCores(hardware) >= 6 || getSpace(hardware) >= 450)
|
||||
return "8GB";
|
||||
if (hardware.getRam() >= 4 * 1024 || getCores(hardware) >= 3 || hardware.getDisk() >= 230)
|
||||
if (hardware.getRam() >= 4 * 1024 || getCores(hardware) >= 3 || getSpace(hardware) >= 230)
|
||||
return "4GB";
|
||||
if (hardware.getRam() >= 2 * 1024 || hardware.getDisk() >= 110)
|
||||
if (hardware.getRam() >= 2 * 1024 || getSpace(hardware) >= 110)
|
||||
return "2GB";
|
||||
if (hardware.getRam() >= 1024 || hardware.getDisk() >= 55)
|
||||
if (hardware.getRam() >= 1024 || getSpace(hardware) >= 55)
|
||||
return "1GB";
|
||||
return "512MB"; /* smallest */
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ import javax.annotation.Resource;
|
|||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
|
@ -60,9 +61,10 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
|||
private final Map<ServerState, NodeState> serverStateToNodeState;
|
||||
private final GoGridClient client;
|
||||
private final Supplier<Set<? extends Image>> images;
|
||||
private final Supplier<Set<? extends Hardware>> hardwares;
|
||||
private final Supplier<Map<String, ? extends Location>> locations;
|
||||
|
||||
private static class FindImageForServer implements Predicate<Image> {
|
||||
static class FindImageForServer implements Predicate<Image> {
|
||||
private final Server instance;
|
||||
|
||||
@Inject
|
||||
|
@ -78,12 +80,28 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
|||
}
|
||||
}
|
||||
|
||||
static class FindHardwareForServer implements Predicate<Hardware> {
|
||||
private final Server instance;
|
||||
|
||||
@Inject
|
||||
private FindHardwareForServer(Server instance) {
|
||||
this.instance = instance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Hardware input) {
|
||||
return input.getRam() == Integer.parseInt(instance.getRam().getName().replaceAll("[^0-9]", ""));
|
||||
}
|
||||
}
|
||||
|
||||
@Inject
|
||||
ServerToNodeMetadata(Map<ServerState, NodeState> serverStateToNodeState, GoGridClient client,
|
||||
Supplier<Set<? extends Image>> images, Supplier<Map<String, ? extends Location>> locations) {
|
||||
Supplier<Set<? extends Image>> images, Supplier<Set<? extends Hardware>> hardwares,
|
||||
Supplier<Map<String, ? extends Location>> locations) {
|
||||
this.serverStateToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState");
|
||||
this.client = checkNotNull(client, "client");
|
||||
this.images = checkNotNull(images, "images");
|
||||
this.hardwares = checkNotNull(hardwares, "hardwares");
|
||||
this.locations = checkNotNull(locations, "locations");
|
||||
}
|
||||
|
||||
|
@ -99,10 +117,18 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
|||
} catch (NoSuchElementException e) {
|
||||
logger.warn("could not find a matching image for server %s", from);
|
||||
}
|
||||
|
||||
Hardware hardware = null;
|
||||
try {
|
||||
hardware = Iterables.find(hardwares.get(), new FindHardwareForServer(from));
|
||||
} catch (NoSuchElementException e) {
|
||||
logger.warn("could not find a matching hardware for server %s", from);
|
||||
}
|
||||
|
||||
return new NodeMetadataImpl(from.getId() + "", from.getName(), from.getId() + "", locations.get().get(
|
||||
from.getDatacenter().getId() + ""), null, ImmutableMap.<String, String> of(), tag, from.getImage()
|
||||
.getId()
|
||||
from.getDatacenter().getId() + ""), null, ImmutableMap.<String, String> of(), tag, hardware, from
|
||||
.getImage().getId()
|
||||
+ "", image != null ? image.getOperatingSystem() : null, state, ipSet, ImmutableList.<String> of(),
|
||||
ImmutableMap.<String, String> of(), creds);
|
||||
creds);
|
||||
}
|
||||
}
|
|
@ -28,11 +28,12 @@ import javax.inject.Singleton;
|
|||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -41,20 +42,26 @@ import com.google.common.collect.Sets;
|
|||
@Singleton
|
||||
public class GoGridHardwareSupplier implements Supplier<Set<? extends Hardware>> {
|
||||
|
||||
public static final HardwareImpl H8192 = new HardwareImpl("5", "5", "5", null, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(8, 1.0)), 8192, ImmutableList.of(new VolumeImpl(
|
||||
480.0f, true, true)), any());
|
||||
public static final HardwareImpl H4096 = new HardwareImpl("4", "4", "4", null, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(4, 1.0)), 4096, ImmutableList.of(new VolumeImpl(
|
||||
240.0f, true, true)), any());
|
||||
public static final HardwareImpl H2048 = new HardwareImpl("3", "3", "3", null, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(2, 1.0)), 2048, ImmutableList.of(new VolumeImpl(
|
||||
120.0f, true, true)), any());
|
||||
public static final HardwareImpl H1024 = new HardwareImpl("2", "2", "2", null, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(1, 1.0)), 1024, ImmutableList.of(new VolumeImpl(
|
||||
60.0f, true, true)), any());
|
||||
public static final HardwareImpl H512 = new HardwareImpl("1", "1", "1", null, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(0.5, 1.0)), 512, ImmutableList.of(new VolumeImpl(
|
||||
30.0f, true, true)), any());
|
||||
|
||||
public static final ImmutableSet<HardwareImpl> H_ALL = ImmutableSet.of(H512, H1024, H2048, H4096, H8192);
|
||||
|
||||
@Override
|
||||
public Set<? extends Hardware> get() {
|
||||
final Set<Hardware> sizes = Sets.newHashSet();
|
||||
|
||||
sizes.add(new HardwareImpl("1", "1", "1", null, null, ImmutableMap.<String, String> of(), ImmutableList
|
||||
.of(new Processor(0.5, 1.0)), 512, 30, any()));
|
||||
sizes.add(new HardwareImpl("2", "2", "2", null, null, ImmutableMap.<String, String> of(), ImmutableList
|
||||
.of(new Processor(1, 1.0)), 1024, 60, any()));
|
||||
sizes.add(new HardwareImpl("3", "3", "3", null, null, ImmutableMap.<String, String> of(), ImmutableList
|
||||
.of(new Processor(2, 1.0)), 2048, 120, any()));
|
||||
sizes.add(new HardwareImpl("4", "4", "4", null, null, ImmutableMap.<String, String> of(), ImmutableList
|
||||
.of(new Processor(4, 1.0)), 4096, 240, any()));
|
||||
sizes.add(new HardwareImpl("5", "5", "5", null, null, ImmutableMap.<String, String> of(), ImmutableList
|
||||
.of(new Processor(8, 1.0)), 8192, 480, any()));
|
||||
return sizes;
|
||||
return H_ALL;
|
||||
}
|
||||
}
|
|
@ -29,6 +29,7 @@ import java.net.UnknownHostException;
|
|||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
|
@ -38,6 +39,7 @@ import org.jclouds.domain.Location;
|
|||
import org.jclouds.domain.LocationScope;
|
||||
import org.jclouds.domain.internal.LocationImpl;
|
||||
import org.jclouds.gogrid.GoGridClient;
|
||||
import org.jclouds.gogrid.compute.suppliers.GoGridHardwareSupplier;
|
||||
import org.jclouds.gogrid.domain.Ip;
|
||||
import org.jclouds.gogrid.domain.Option;
|
||||
import org.jclouds.gogrid.domain.Server;
|
||||
|
@ -65,6 +67,7 @@ public class ServerToNodeMetadataTest {
|
|||
Map<ServerState, NodeState> serverStateToNodeState = createMock(Map.class);
|
||||
org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class);
|
||||
Option dc = new Option(1l, "US-West-1", "US West 1 Datacenter");
|
||||
Option ram = new Option(1l, "512MB", "Server with 512MB RAM");
|
||||
|
||||
Set<? extends org.jclouds.compute.domain.Image> images = ImmutableSet.of(jcImage);
|
||||
Server server = createMock(Server.class);
|
||||
|
@ -85,6 +88,7 @@ public class ServerToNodeMetadataTest {
|
|||
|
||||
ServerImage image = createMock(ServerImage.class);
|
||||
expect(server.getImage()).andReturn(image).atLeastOnce();
|
||||
expect(server.getRam()).andReturn(ram).atLeastOnce();
|
||||
expect(server.getDatacenter()).andReturn(dc).atLeastOnce();
|
||||
expect(image.getId()).andReturn(2000l).atLeastOnce();
|
||||
expect(jcImage.getProviderId()).andReturn("2000").atLeastOnce();
|
||||
|
@ -101,6 +105,7 @@ public class ServerToNodeMetadataTest {
|
|||
|
||||
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, caller, Suppliers
|
||||
.<Set<? extends Image>> ofInstance(images), Suppliers
|
||||
.<Set< ? extends Hardware>> ofInstance(GoGridHardwareSupplier.H_ALL), Suppliers
|
||||
.<Map<String, ? extends Location>> ofInstance(locations));
|
||||
|
||||
NodeMetadata metadata = parser.apply(server);
|
||||
|
|
|
@ -40,6 +40,7 @@ import org.jclouds.blobstore.domain.internal.PageSetImpl;
|
|||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||
import org.jclouds.blobstore.internal.BaseAsyncBlobStore;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.concurrent.Futures;
|
||||
|
@ -88,8 +89,8 @@ public class CloudFilesAsyncBlobStore extends BaseAsyncBlobStore {
|
|||
BlobStoreListContainerOptionsToListContainerOptions container2ContainerListOptions,
|
||||
ContainerToResourceList container2ResourceList, ObjectToBlob object2Blob, BlobToObject blob2Object,
|
||||
ObjectToBlobMetadata object2BlobMd, BlobToHttpGetOptions blob2ObjectGetOptions,
|
||||
Provider<FetchBlobMetadata> fetchBlobMetadataProvider) {
|
||||
super(context, blobUtils, service, defaultLocation, locations);
|
||||
Provider<FetchBlobMetadata> fetchBlobMetadataProvider, SignRequestForBlobStrategy signRequestForBlob) {
|
||||
super(context, blobUtils, service, defaultLocation, locations, signRequestForBlob);
|
||||
this.sync = sync;
|
||||
this.async = async;
|
||||
this.container2ResourceMd = container2ResourceMd;
|
||||
|
|
|
@ -37,6 +37,7 @@ import org.jclouds.blobstore.domain.internal.PageSetImpl;
|
|||
import org.jclouds.blobstore.functions.BlobToHttpGetOptions;
|
||||
import org.jclouds.blobstore.internal.BaseBlobStore;
|
||||
import org.jclouds.blobstore.options.ListContainerOptions;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.blobstore.strategy.internal.FetchBlobMetadata;
|
||||
import org.jclouds.blobstore.util.BlobUtils;
|
||||
import org.jclouds.domain.Location;
|
||||
|
@ -77,8 +78,8 @@ public class CloudFilesBlobStore extends BaseBlobStore {
|
|||
BlobStoreListContainerOptionsToListContainerOptions container2ContainerListOptions,
|
||||
ContainerToResourceList container2ResourceList, ObjectToBlob object2Blob, BlobToObject blob2Object,
|
||||
ObjectToBlobMetadata object2BlobMd, BlobToHttpGetOptions blob2ObjectGetOptions,
|
||||
Provider<FetchBlobMetadata> fetchBlobMetadataProvider) {
|
||||
super(context, blobUtils, defaultLocation, locations);
|
||||
Provider<FetchBlobMetadata> fetchBlobMetadataProvider, SignRequestForBlobStrategy signRequestForBlob) {
|
||||
super(context, blobUtils, defaultLocation, locations, signRequestForBlob);
|
||||
this.sync = sync;
|
||||
this.container2ResourceMd = container2ResourceMd;
|
||||
this.container2ContainerListOptions = container2ContainerListOptions;
|
||||
|
|
|
@ -29,11 +29,13 @@ import org.jclouds.blobstore.BlobStoreContext;
|
|||
import org.jclouds.blobstore.attr.ConsistencyModel;
|
||||
import org.jclouds.blobstore.config.BlobStoreMapModule;
|
||||
import org.jclouds.blobstore.internal.BlobStoreContextImpl;
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.rackspace.cloudfiles.CloudFilesAsyncClient;
|
||||
import org.jclouds.rackspace.cloudfiles.CloudFilesClient;
|
||||
import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesAsyncBlobStore;
|
||||
import org.jclouds.rackspace.cloudfiles.blobstore.CloudFilesBlobStore;
|
||||
import org.jclouds.rackspace.cloudfiles.blobstore.strategy.SignGetObject;
|
||||
import org.jclouds.rackspace.config.RackspaceLocationsModule;
|
||||
|
||||
import com.google.common.base.Supplier;
|
||||
|
@ -61,6 +63,7 @@ public class CloudFilesBlobStoreContextModule extends AbstractModule {
|
|||
bind(BlobStore.class).to(CloudFilesBlobStore.class).in(Scopes.SINGLETON);
|
||||
bind(BlobStoreContext.class).to(new TypeLiteral<BlobStoreContextImpl<CloudFilesClient, CloudFilesAsyncClient>>() {
|
||||
}).in(Scopes.SINGLETON);
|
||||
bind(SignRequestForBlobStrategy.class).to(SignGetObject.class);
|
||||
}
|
||||
|
||||
@Provides
|
||||
|
|
|
@ -0,0 +1,64 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.rackspace.cloudfiles.blobstore.strategy;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.blobstore.strategy.SignRequestForBlobStrategy;
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.http.HttpRequestFilter;
|
||||
import org.jclouds.http.options.GetOptions;
|
||||
import org.jclouds.rackspace.cloudfiles.CloudFilesAsyncClient;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class SignGetObject implements SignRequestForBlobStrategy {
|
||||
private final RestAnnotationProcessor<CloudFilesAsyncClient> processor;
|
||||
private final Method method;
|
||||
|
||||
@Inject
|
||||
public SignGetObject(RestAnnotationProcessor<CloudFilesAsyncClient> processor) throws SecurityException,
|
||||
NoSuchMethodException {
|
||||
this.processor = checkNotNull(processor, "processor");
|
||||
this.method = CloudFilesAsyncClient.class.getMethod("getObject", String.class, String.class, GetOptions[].class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public HttpRequest apply(String container, String name) {
|
||||
HttpRequest returnVal = processor.createRequest(method, checkNotNull(container,
|
||||
"container"), checkNotNull(name, "name"));
|
||||
for (HttpRequestFilter filter : returnVal.getFilters())
|
||||
filter.filter(returnVal);
|
||||
returnVal.getFilters().clear();
|
||||
return new HttpRequest(returnVal.getMethod(), returnVal.getEndpoint(), ImmutableMultimap.copyOf(returnVal.getHeaders()));
|
||||
}
|
||||
|
||||
}
|
|
@ -30,6 +30,7 @@ import javax.annotation.Resource;
|
|||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
|
@ -44,7 +45,6 @@ import org.jclouds.rackspace.cloudservers.domain.ServerStatus;
|
|||
import com.google.common.base.Function;
|
||||
import com.google.common.base.Predicate;
|
||||
import com.google.common.base.Supplier;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
/**
|
||||
|
@ -55,6 +55,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
|||
private final Supplier<Location> location;
|
||||
private final Map<ServerStatus, NodeState> serverToNodeState;
|
||||
private final Supplier<Set<? extends Image>> images;
|
||||
private final Supplier<Set<? extends Hardware>> hardwares;
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
@ -75,12 +76,26 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
|||
}
|
||||
}
|
||||
|
||||
private static class FindHardwareForServer implements Predicate<Hardware> {
|
||||
private final Server instance;
|
||||
|
||||
private FindHardwareForServer(Server instance) {
|
||||
this.instance = instance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Hardware input) {
|
||||
return input.getProviderId().equals(instance.getFlavorId() + "");
|
||||
}
|
||||
}
|
||||
|
||||
@Inject
|
||||
ServerToNodeMetadata(Map<ServerStatus, NodeState> serverStateToNodeState, Supplier<Set<? extends Image>> images,
|
||||
Supplier<Location> location) {
|
||||
Supplier<Location> location, Supplier<Set<? extends Hardware>> hardwares) {
|
||||
this.serverToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState");
|
||||
this.images = checkNotNull(images, "images");
|
||||
this.location = checkNotNull(location, "location");
|
||||
this.hardwares = checkNotNull(hardwares, "hardwares");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -93,10 +108,16 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
|||
} catch (NoSuchElementException e) {
|
||||
logger.warn("could not find a matching image for server %s in location %s", from, location);
|
||||
}
|
||||
Hardware hardware = null;
|
||||
try {
|
||||
hardware = Iterables.find(hardwares.get(), new FindHardwareForServer(from));
|
||||
} catch (NoSuchElementException e) {
|
||||
logger.warn("could not find a matching hardware for server %s", from);
|
||||
}
|
||||
return new NodeMetadataImpl(from.getId() + "", from.getName(), from.getId() + "", host, null, from.getMetadata(),
|
||||
tag, from.getImageId() + "", image != null ? image.getOperatingSystem() : null, serverToNodeState
|
||||
.get(from.getStatus()), from.getAddresses().getPublicAddresses(), from.getAddresses()
|
||||
.getPrivateAddresses(), ImmutableMap.<String, String> of(), null);
|
||||
tag, hardware, from.getImageId() + "", image != null ? image.getOperatingSystem() : null,
|
||||
serverToNodeState.get(from.getStatus()), from.getAddresses().getPublicAddresses(), from.getAddresses()
|
||||
.getPrivateAddresses(), null);
|
||||
}
|
||||
|
||||
}
|
|
@ -35,8 +35,6 @@ import org.jclouds.domain.internal.LocationImpl;
|
|||
import org.jclouds.rackspace.cloudservers.CloudServersClient;
|
||||
import org.jclouds.rackspace.cloudservers.domain.Server;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
|
@ -55,9 +53,9 @@ public class CloudServersAddNodeWithTagStrategy implements AddNodeWithTagStrateg
|
|||
.parseInt(template.getHardware().getProviderId()));
|
||||
return new NodeMetadataImpl(server.getId() + "", name, server.getId() + "", new LocationImpl(LocationScope.HOST,
|
||||
server.getHostId(), server.getHostId(), template.getLocation()), null, server.getMetadata(), tag,
|
||||
template.getImage().getId(), template.getImage().getOperatingSystem(), NodeState.PENDING, server
|
||||
.getAddresses().getPublicAddresses(), server.getAddresses().getPrivateAddresses(), ImmutableMap
|
||||
.<String, String> of(), new Credentials("root", server.getAdminPass()));
|
||||
template.getHardware(), template.getImage().getId(), template.getImage().getOperatingSystem(),
|
||||
NodeState.PENDING, server.getAddresses().getPublicAddresses(), server.getAddresses()
|
||||
.getPrivateAddresses(), new Credentials("root", server.getAdminPass()));
|
||||
}
|
||||
|
||||
}
|
|
@ -30,6 +30,7 @@ import org.jclouds.compute.domain.ComputeMetadata;
|
|||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.compute.predicates.ImagePredicates;
|
||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||
import org.jclouds.domain.Location;
|
||||
|
@ -70,7 +71,8 @@ public class CloudServersHardwareSupplier implements Supplier<Set<? extends Hard
|
|||
for (final Flavor from : sync.listFlavors(ListOptions.Builder.withDetails())) {
|
||||
sizes.add(new HardwareImpl(from.getId() + "", from.getName(), from.getId() + "", location.get(), null,
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(from.getDisk() / 10.0, 1.0)), from
|
||||
.getRam(), from.getDisk(), ImagePredicates.any()));
|
||||
.getRam(), ImmutableList.of(new VolumeImpl((float) from.getDisk(), true, true)),
|
||||
ImagePredicates.any()));
|
||||
}
|
||||
logger.debug("<< sizes(%d)", sizes.size());
|
||||
return sizes;
|
||||
|
|
|
@ -69,6 +69,8 @@ public class ParseCloudServersErrorFromHttpResponse implements HttpErrorHandler
|
|||
exception = new ResourceNotFoundException(message);
|
||||
}
|
||||
break;
|
||||
case 409:
|
||||
exception = new IllegalStateException(content);
|
||||
default:
|
||||
exception = new HttpResponseException(command, response, content);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
package org.jclouds.rackspace.cloudfiles.blobstore.strategy;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.jclouds.http.HttpRequest;
|
||||
import org.jclouds.rackspace.cloudfiles.CloudFilesAsyncClient;
|
||||
import org.jclouds.rackspace.cloudfiles.config.CloudFilesRestClientModule;
|
||||
import org.jclouds.rackspace.cloudservers.TestRackspaceAuthenticationRestClientModule;
|
||||
import org.jclouds.rest.RestClientTest;
|
||||
import org.jclouds.rest.RestContextFactory;
|
||||
import org.jclouds.rest.RestContextFactory.ContextSpec;
|
||||
import org.jclouds.rest.internal.RestAnnotationProcessor;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.TypeLiteral;
|
||||
|
||||
/**
|
||||
* Tests behavior of {@code SignGetBlob}
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "cloudfiles.SignGetBlobTest")
|
||||
public class SignGetBlobTest extends RestClientTest<CloudFilesAsyncClient> {
|
||||
|
||||
public void testSignGetBlob() throws ArrayIndexOutOfBoundsException, SecurityException, IllegalArgumentException,
|
||||
NoSuchMethodException, IOException {
|
||||
HttpRequest request = new SignGetObject(processor).apply("container", "blob");
|
||||
|
||||
assertRequestLineEquals(request, "GET http://storageUrl/container/blob HTTP/1.1");
|
||||
assertNonPayloadHeadersEqual(request, "X-Auth-Token: testtoken\n");
|
||||
assertPayloadEquals(request, null, null, false);
|
||||
|
||||
assertEquals(request.getFilters().size(), 0);
|
||||
}
|
||||
|
||||
protected Module createModule() {
|
||||
return new CloudFilesRestClientModule(new TestRackspaceAuthenticationRestClientModule());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void checkFilters(HttpRequest request) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TypeLiteral<RestAnnotationProcessor<CloudFilesAsyncClient>> createTypeLiteral() {
|
||||
return new TypeLiteral<RestAnnotationProcessor<CloudFilesAsyncClient>>() {
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public ContextSpec<?, ?> createContextSpec() {
|
||||
return new RestContextFactory().createContextSpec("cloudfiles", "identity", "credential", new Properties());
|
||||
}
|
||||
|
||||
}
|
|
@ -30,23 +30,21 @@ import org.jclouds.rest.ConfiguresRestClient;
|
|||
import com.google.common.base.Supplier;
|
||||
|
||||
@RequiresHttp
|
||||
@ConfiguresRestClient class TestRackspaceAuthenticationRestClientModule extends
|
||||
RackspaceAuthenticationRestModule {
|
||||
@ConfiguresRestClient
|
||||
public class TestRackspaceAuthenticationRestClientModule extends RackspaceAuthenticationRestModule {
|
||||
@Override
|
||||
protected void configure() {
|
||||
super.configure();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected AuthenticationResponse provideAuthenticationResponse(
|
||||
Supplier<AuthenticationResponse> supplier) {
|
||||
return new AuthenticationResponseImpl("authToken", "http://CDNManagementUrl",
|
||||
"http://serverManagementUrl", "http://storageUrl");
|
||||
protected AuthenticationResponse provideAuthenticationResponse(Supplier<AuthenticationResponse> supplier) {
|
||||
return new AuthenticationResponseImpl("authToken", "http://CDNManagementUrl", "http://serverManagementUrl",
|
||||
"http://storageUrl");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Supplier<String> provideAuthenticationTokenCache(
|
||||
Supplier<AuthenticationResponse> supplier) {
|
||||
public Supplier<String> provideAuthenticationTokenCache(Supplier<AuthenticationResponse> supplier) {
|
||||
return new Supplier<String>() {
|
||||
public String get() {
|
||||
return "testtoken";
|
||||
|
|
|
@ -29,6 +29,7 @@ import java.net.UnknownHostException;
|
|||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
|
@ -58,6 +59,11 @@ public class ServerToNodeMetadataTest {
|
|||
org.jclouds.compute.domain.Image jcImage = createMock(org.jclouds.compute.domain.Image.class);
|
||||
|
||||
Set<org.jclouds.compute.domain.Image> images = ImmutableSet.of(jcImage);
|
||||
|
||||
org.jclouds.compute.domain.Hardware jcHardware = createMock(org.jclouds.compute.domain.Hardware.class);
|
||||
|
||||
Set<org.jclouds.compute.domain.Hardware> hardwares = ImmutableSet.of(jcHardware);
|
||||
|
||||
Server server = createMock(Server.class);
|
||||
|
||||
expect(server.getId()).andReturn(10000).atLeastOnce();
|
||||
|
@ -81,17 +87,23 @@ public class ServerToNodeMetadataTest {
|
|||
expect(addresses.getPrivateAddresses()).andReturn(privateAddresses);
|
||||
|
||||
expect(server.getImageId()).andReturn(2000).atLeastOnce();
|
||||
|
||||
expect(jcImage.getProviderId()).andReturn("2000").atLeastOnce();
|
||||
expect(jcHardware.getProviderId()).andReturn("1000").atLeastOnce();
|
||||
expect(server.getFlavorId()).andReturn(1000).atLeastOnce();
|
||||
|
||||
expect(jcImage.getLocation()).andReturn(provider).atLeastOnce();
|
||||
expect(jcImage.getOperatingSystem()).andReturn(createMock(OperatingSystem.class)).atLeastOnce();
|
||||
|
||||
replay(addresses);
|
||||
replay(jcImage);
|
||||
replay(jcHardware);
|
||||
replay(serverStateToNodeState);
|
||||
replay(server);
|
||||
|
||||
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers
|
||||
.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider));
|
||||
.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider), Suppliers
|
||||
.<Set<? extends Hardware>> ofInstance(hardwares));
|
||||
|
||||
NodeMetadata metadata = parser.apply(server);
|
||||
assertEquals(metadata.getLocation(), location);
|
||||
|
@ -107,6 +119,8 @@ public class ServerToNodeMetadataTest {
|
|||
verify(serverStateToNodeState);
|
||||
verify(server);
|
||||
verify(jcImage);
|
||||
verify(jcHardware);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -61,8 +61,6 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
|||
private final Function<Server, Iterable<String>> getPublicAddresses;
|
||||
private final Map<RunningState, NodeState> runningStateToNodeState;
|
||||
private final Supplier<Set<? extends Image>> images;
|
||||
@SuppressWarnings("unused")
|
||||
private final Supplier<Set<? extends Location>> locations;
|
||||
|
||||
private static class FindImageForServer implements Predicate<Image> {
|
||||
private final Location location;
|
||||
|
@ -83,12 +81,10 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
|||
|
||||
@Inject
|
||||
ServerToNodeMetadata(Function<Server, Iterable<String>> getPublicAddresses,
|
||||
Map<RunningState, NodeState> runningStateToNodeState, Supplier<Set<? extends Image>> images,
|
||||
Supplier<Set<? extends Location>> locations) {
|
||||
Map<RunningState, NodeState> runningStateToNodeState, Supplier<Set<? extends Image>> images) {
|
||||
this.getPublicAddresses = checkNotNull(getPublicAddresses, "serverStateToNodeState");
|
||||
this.runningStateToNodeState = checkNotNull(runningStateToNodeState, "serverStateToNodeState");
|
||||
this.images = checkNotNull(images, "images");
|
||||
this.locations = checkNotNull(locations, "locations");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -105,11 +101,11 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
|||
} catch (NoSuchElementException e) {
|
||||
logger.warn("could not find a matching image for server %s in location %s", from, location);
|
||||
}
|
||||
|
||||
NodeState state = runningStateToNodeState.get(from.getState());
|
||||
return new NodeMetadataImpl(from.getId() + "", from.getName(), from.getId() + "", location, null, ImmutableMap
|
||||
.<String, String> of(), tag, from.getImageId(), image != null ? image.getOperatingSystem() : null,
|
||||
state, getPublicAddresses.apply(from), ImmutableList.<String> of(), ImmutableMap.<String, String> of(),
|
||||
creds);
|
||||
.<String, String> of(), tag, null, from.getImageId(), image != null ? image.getOperatingSystem() : null,
|
||||
state, getPublicAddresses.apply(from), ImmutableList.<String> of(), creds);
|
||||
|
||||
}
|
||||
}
|
|
@ -65,9 +65,9 @@ public class RimuHostingAddNodeWithTagStrategy implements AddNodeWithTagStrategy
|
|||
"imageId"), checkNotNull(template.getHardware().getProviderId(), "hardwareId"));
|
||||
Server server = client.getServer(serverResponse.getServer().getId());
|
||||
NodeMetadata node = new NodeMetadataImpl(server.getId().toString(), name, server.getId().toString(), template
|
||||
.getLocation(), null, ImmutableMap.<String, String> of(), tag, template.getImage().getId(), template
|
||||
.getImage().getOperatingSystem(), runningStateToNodeState.get(server.getState()), getPublicAddresses
|
||||
.apply(server), ImmutableList.<String> of(), ImmutableMap.<String, String> of(), new Credentials("root",
|
||||
.getLocation(), null, ImmutableMap.<String, String> of(), tag, template.getHardware(), template
|
||||
.getImage().getId(), template.getImage().getOperatingSystem(), runningStateToNodeState.get(server
|
||||
.getState()), getPublicAddresses.apply(server), ImmutableList.<String> of(), new Credentials("root",
|
||||
serverResponse.getNewInstanceRequest().getCreateOptions().getPassword()));
|
||||
return node;
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@ import javax.inject.Singleton;
|
|||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.compute.predicates.ImagePredicates;
|
||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||
import org.jclouds.domain.Location;
|
||||
|
@ -78,8 +79,8 @@ public class RimuHostingHardwareSupplier implements Supplier<Set<? extends Hardw
|
|||
|
||||
});
|
||||
sizes.add(new HardwareImpl(from.getId(), from.getId(), from.getId(), location, null, ImmutableMap
|
||||
.<String, String> of(), ImmutableList.of(new Processor(1, 1.0)), from.getRam(), from.getDiskSize(),
|
||||
ImagePredicates.any()));
|
||||
.<String, String> of(), ImmutableList.of(new Processor(1, 1.0)), from.getRam(), ImmutableList
|
||||
.of(new VolumeImpl((float) from.getDiskSize(), true, true)), ImagePredicates.any()));
|
||||
} catch (NullPointerException e) {
|
||||
logger.warn("datacenter not present in " + from.getId());
|
||||
}
|
||||
|
|
|
@ -29,6 +29,7 @@ import java.util.Set;
|
|||
import javax.annotation.Resource;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
|
@ -50,6 +51,7 @@ public class SliceToNodeMetadata implements Function<Slice, NodeMetadata> {
|
|||
private final Supplier<Location> location;
|
||||
private final Map<Slice.Status, NodeState> sliceToNodeState;
|
||||
private final Supplier<Set<? extends Image>> images;
|
||||
private final Supplier<Set<? extends Hardware>> hardwares;
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
@ -67,12 +69,26 @@ public class SliceToNodeMetadata implements Function<Slice, NodeMetadata> {
|
|||
}
|
||||
}
|
||||
|
||||
private static class FindHardwareForSlice implements Predicate<Hardware> {
|
||||
private final Slice slice;
|
||||
|
||||
private FindHardwareForSlice(Slice slice) {
|
||||
this.slice = slice;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean apply(Hardware input) {
|
||||
return input.getProviderId().equals(slice.getFlavorId() + "");
|
||||
}
|
||||
}
|
||||
|
||||
@Inject
|
||||
SliceToNodeMetadata(Map<Slice.Status, NodeState> sliceStateToNodeState, Supplier<Set<? extends Image>> images,
|
||||
Supplier<Location> location) {
|
||||
Supplier<Location> location, Supplier<Set<? extends Hardware>> hardwares) {
|
||||
this.sliceToNodeState = checkNotNull(sliceStateToNodeState, "sliceStateToNodeState");
|
||||
this.images = checkNotNull(images, "images");
|
||||
this.location = checkNotNull(location, "location");
|
||||
this.hardwares = checkNotNull(hardwares, "hardwares");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -84,9 +100,14 @@ public class SliceToNodeMetadata implements Function<Slice, NodeMetadata> {
|
|||
} catch (NoSuchElementException e) {
|
||||
logger.warn("could not find a matching image for slice %s in location %s", from, location);
|
||||
}
|
||||
|
||||
Hardware hardware = null;
|
||||
try {
|
||||
hardware = Iterables.find(hardwares.get(), new FindHardwareForSlice(from));
|
||||
} catch (NoSuchElementException e) {
|
||||
logger.warn("could not find a matching hardware for slice %s", from);
|
||||
}
|
||||
return new NodeMetadataImpl(from.getId() + "", from.getName(), from.getId() + "", location.get(), null,
|
||||
ImmutableMap.<String, String> of(), tag, from.getImageId() + "", image != null ? image
|
||||
ImmutableMap.<String, String> of(), tag, hardware, from.getImageId() + "", image != null ? image
|
||||
.getOperatingSystem() : null, sliceToNodeState.get(from.getStatus()), Iterables.filter(from
|
||||
.getAddresses(), new Predicate<String>() {
|
||||
|
||||
|
@ -102,6 +123,6 @@ public class SliceToNodeMetadata implements Function<Slice, NodeMetadata> {
|
|||
return input.startsWith("10.");
|
||||
}
|
||||
|
||||
}), ImmutableMap.<String, String> of(), null);
|
||||
}), null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -55,8 +55,8 @@ public class SlicehostAddNodeWithTagStrategy implements AddNodeWithTagStrategy {
|
|||
Slice slice = client.createSlice(name, Integer.parseInt(template.getImage().getProviderId()), Integer
|
||||
.parseInt(template.getHardware().getProviderId()));
|
||||
return new NodeMetadataImpl(slice.getId() + "", name, slice.getId() + "", template.getLocation(), null,
|
||||
ImmutableMap.<String, String> of(), tag, template.getImage().getId(), template.getImage()
|
||||
.getOperatingSystem(), NodeState.PENDING, Iterables.filter(slice.getAddresses(),
|
||||
ImmutableMap.<String, String> of(), tag, template.getHardware(), template.getImage().getId(), template
|
||||
.getImage().getOperatingSystem(), NodeState.PENDING, Iterables.filter(slice.getAddresses(),
|
||||
new Predicate<String>() {
|
||||
|
||||
@Override
|
||||
|
@ -71,7 +71,7 @@ public class SlicehostAddNodeWithTagStrategy implements AddNodeWithTagStrategy {
|
|||
return input.startsWith("10.");
|
||||
}
|
||||
|
||||
}), ImmutableMap.<String, String> of(), new Credentials("root", slice.getRootPassword()));
|
||||
}), new Credentials("root", slice.getRootPassword()));
|
||||
}
|
||||
|
||||
}
|
|
@ -29,6 +29,7 @@ import javax.inject.Singleton;
|
|||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.compute.predicates.ImagePredicates;
|
||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||
import org.jclouds.domain.Location;
|
||||
|
@ -66,8 +67,9 @@ public class SlicehostHardwareSupplier implements Supplier<Set<? extends Hardwar
|
|||
logger.debug(">> providing sizes");
|
||||
for (final Flavor from : sync.listFlavors()) {
|
||||
sizes.add(new HardwareImpl(from.getId() + "", from.getName(), from.getId() + "", location.get(), null,
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(from.getRam() / 1024.0, 1.0)), from
|
||||
.getRam(), (from.getRam() * 4) / 1024, ImagePredicates.any()));
|
||||
ImmutableMap.<String, String> of(), ImmutableList.of(new Processor(from.getRam() / 1024.0, 1.0)),
|
||||
from.getRam(), ImmutableList.of(new VolumeImpl((from.getRam() * 4) / 1024.0f, true, true)),
|
||||
ImagePredicates.any()));
|
||||
}
|
||||
logger.debug("<< sizes(%d)", sizes.size());
|
||||
return sizes;
|
||||
|
|
|
@ -171,8 +171,8 @@ public class ComputeTask extends Task {
|
|||
private void listHardwares(ComputeService computeService) {
|
||||
log("list hardwares");
|
||||
for (Hardware hardware : computeService.listHardwareProfiles()) {// TODO
|
||||
log(String.format(" hardware id=%s, cores=%s, ram=%s, disk=%s", hardware.getProviderId(), getCores(hardware), hardware
|
||||
.getRam(), hardware.getDisk()));
|
||||
log(String.format(" hardware id=%s, cores=%s, ram=%s, volumes=%s", hardware.getProviderId(), getCores(hardware), hardware
|
||||
.getRam(), hardware.getVolumes()));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -252,10 +252,10 @@ public class ComputeTask extends Task {
|
|||
private void logDetails(ComputeService computeService, ComputeMetadata node) {
|
||||
NodeMetadata metadata = node instanceof NodeMetadata ? NodeMetadata.class.cast(node) : computeService
|
||||
.getNodeMetadata(node.getId());
|
||||
log(String.format(" node id=%s, name=%s, tag=%s, location=%s, state=%s, publicIp=%s, privateIp=%s, extra=%s",
|
||||
log(String.format(" node id=%s, name=%s, tag=%s, location=%s, state=%s, publicIp=%s, privateIp=%s, hardware=%s",
|
||||
metadata.getProviderId(), metadata.getName(), metadata.getTag(), metadata.getLocation(), metadata
|
||||
.getState(), ComputeTaskUtils.ipOrEmptyString(metadata.getPublicAddresses()),
|
||||
ipOrEmptyString(metadata.getPrivateAddresses()), metadata.getExtra()));
|
||||
ipOrEmptyString(metadata.getPrivateAddresses()), metadata.getHardware()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.vcloud.compute.functions;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.vcloud.domain.VApp;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class GetExtraFromVApp implements Function<VApp, Map<String, String>> {
|
||||
private final GetExtraFromVm getExtraFromVm;
|
||||
|
||||
@Inject
|
||||
GetExtraFromVApp(GetExtraFromVm getExtraFromVm) {
|
||||
this.getExtraFromVm = getExtraFromVm;
|
||||
}
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
public Map<String, String> apply(VApp vApp) {
|
||||
// TODO make this work with composite vApps
|
||||
return vApp.getChildren().size() == 0 ? ImmutableMap.<String, String> of() : getExtraFromVm.apply(Iterables.get(
|
||||
vApp.getChildren(), 0));
|
||||
}
|
||||
}
|
|
@ -1,74 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.vcloud.compute.functions;
|
||||
|
||||
import static com.google.common.collect.Iterables.filter;
|
||||
import static com.google.common.collect.Iterables.find;
|
||||
import static com.google.common.collect.Maps.newHashMap;
|
||||
import static org.jclouds.vcloud.predicates.VCloudPredicates.resourceType;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl;
|
||||
import org.jclouds.vcloud.domain.VCloudExpressVApp;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceAllocation;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceType;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
* Configures the {@link VCloudComputeServiceContext}; requires
|
||||
* {@link VCloudExpressComputeClientImpl} bound.
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class GetExtraFromVCloudExpressVApp implements Function<VCloudExpressVApp, Map<String, String>> {
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
public Map<String, String> apply(VCloudExpressVApp vApp) {
|
||||
Map<String, String> extra = newHashMap();
|
||||
try {
|
||||
extra.put("memory/mb", find(vApp.getResourceAllocations(), resourceType(ResourceType.MEMORY))
|
||||
.getVirtualQuantity()
|
||||
+ "");
|
||||
extra.put("processor/count", find(vApp.getResourceAllocations(), resourceType(ResourceType.PROCESSOR))
|
||||
.getVirtualQuantity()
|
||||
+ "");
|
||||
for (ResourceAllocation disk : filter(vApp.getResourceAllocations(), resourceType(ResourceType.DISK_DRIVE))) {
|
||||
extra.put(String.format("disk_drive/%s/kb", disk.getAddressOnParent()), disk.getVirtualQuantity() + "");
|
||||
}
|
||||
|
||||
for (Entry<String, String> net : vApp.getNetworkToAddresses().entries()) {
|
||||
extra.put(String.format("network/%s/ip", net.getKey()), net.getValue());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(e, "error getting extra data for vApp: %s", vApp);
|
||||
}
|
||||
return extra;
|
||||
}
|
||||
}
|
|
@ -1,81 +0,0 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.vcloud.compute.functions;
|
||||
|
||||
import static com.google.common.collect.Iterables.filter;
|
||||
import static com.google.common.collect.Iterables.find;
|
||||
import static com.google.common.collect.Maps.newHashMap;
|
||||
import static org.jclouds.vcloud.predicates.VCloudPredicates.resourceType;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.vcloud.domain.Vm;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceAllocation;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceType;
|
||||
import org.jclouds.vcloud.domain.ovf.VCloudHardDisk;
|
||||
import org.jclouds.vcloud.domain.ovf.VCloudNetworkAdapter;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class GetExtraFromVm implements Function<Vm, Map<String, String>> {
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
public Map<String, String> apply(Vm vm) {
|
||||
Map<String, String> extra = newHashMap();
|
||||
try {
|
||||
extra.put("memory/mb", find(vm.getVirtualHardwareSection().getResourceAllocations(),
|
||||
resourceType(ResourceType.MEMORY)).getVirtualQuantity()
|
||||
+ "");
|
||||
extra.put("processor/count", find(vm.getVirtualHardwareSection().getResourceAllocations(),
|
||||
resourceType(ResourceType.PROCESSOR)).getVirtualQuantity()
|
||||
+ "");
|
||||
for (ResourceAllocation disk : filter(vm.getVirtualHardwareSection().getResourceAllocations(),
|
||||
resourceType(ResourceType.DISK_DRIVE))) {
|
||||
if (disk instanceof VCloudHardDisk) {
|
||||
VCloudHardDisk vDisk = VCloudHardDisk.class.cast(disk);
|
||||
extra.put(String.format("disk_drive/%s/mb", disk.getAddressOnParent()), vDisk.getCapacity() + "");
|
||||
} else {
|
||||
extra.put(String.format("disk_drive/%s/kb", disk.getAddressOnParent()), disk.getVirtualQuantity() + "");
|
||||
}
|
||||
}
|
||||
for (ResourceAllocation net : filter(vm.getVirtualHardwareSection().getResourceAllocations(),
|
||||
resourceType(ResourceType.ETHERNET_ADAPTER))) {
|
||||
if (net instanceof VCloudNetworkAdapter) {
|
||||
VCloudNetworkAdapter vNet = VCloudNetworkAdapter.class.cast(net);
|
||||
extra.put(String.format("network/%s/ip", net.getAddressOnParent()), vNet.getIpAddress());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error(e, "error getting extra data for vm: %s", vm);
|
||||
}
|
||||
return extra;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.vcloud.compute.functions;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static com.google.common.collect.Iterables.filter;
|
||||
import static com.google.common.collect.Iterables.find;
|
||||
import static com.google.common.collect.Iterables.transform;
|
||||
import static org.jclouds.vcloud.predicates.VCloudPredicates.resourceType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.predicates.ImagePredicates;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.vcloud.domain.VApp;
|
||||
import org.jclouds.vcloud.domain.Vm;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceAllocation;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceType;
|
||||
import org.jclouds.vcloud.domain.ovf.VirtualHardwareSection;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class HardwareForVApp implements Function<VApp, Hardware> {
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
private final FindLocationForResource findLocationForResource;
|
||||
private final ResourceAllocationsToVolumes resourceAllocationsToVolumes;
|
||||
|
||||
@Inject
|
||||
protected HardwareForVApp(FindLocationForResource findLocationForResource,
|
||||
ResourceAllocationsToVolumes resourceAllocationsToVolumes) {
|
||||
this.findLocationForResource = checkNotNull(findLocationForResource, "findLocationForResource");
|
||||
this.resourceAllocationsToVolumes = checkNotNull(resourceAllocationsToVolumes, "resourceAllocationsToVolumes");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Hardware apply(VApp from) {
|
||||
checkNotNull(from, "VApp");
|
||||
// TODO make this work with composite vApps
|
||||
Vm vm = from.getChildren().size() == 0 ? null : Iterables.get(from.getChildren(), 0);
|
||||
if (vm == null)
|
||||
return null;
|
||||
Location location = findLocationForResource.apply(checkNotNull(from, "from").getVDC());
|
||||
|
||||
VirtualHardwareSection hardware = vm.getVirtualHardwareSection();
|
||||
|
||||
int ram = (int) find(hardware.getResourceAllocations(), resourceType(ResourceType.MEMORY)).getVirtualQuantity();
|
||||
|
||||
List<Processor> processors = Lists.newArrayList(transform(filter(hardware.getResourceAllocations(),
|
||||
resourceType(ResourceType.PROCESSOR)), new Function<ResourceAllocation, Processor>() {
|
||||
|
||||
@Override
|
||||
public Processor apply(ResourceAllocation arg0) {
|
||||
return new Processor(arg0.getVirtualQuantity(), 1);
|
||||
}
|
||||
|
||||
}));
|
||||
Iterable<? extends Volume> volumes = resourceAllocationsToVolumes.apply(hardware.getResourceAllocations());
|
||||
return new HardwareImpl(from.getHref().toASCIIString(), from.getName()
|
||||
+ String.format(": vpus(%s), ram(%d), volumes(%s)", processors, ram, volumes), from.getHref()
|
||||
.toASCIIString(), location, null, ImmutableMap.<String, String> of(), processors, ram, volumes,
|
||||
ImagePredicates.idEquals(from.getHref().toASCIIString()));
|
||||
}
|
||||
}
|
|
@ -32,6 +32,7 @@ import javax.inject.Inject;
|
|||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.predicates.ImagePredicates;
|
||||
import org.jclouds.domain.Location;
|
||||
|
@ -42,7 +43,6 @@ import org.jclouds.vcloud.domain.VAppTemplate;
|
|||
import org.jclouds.vcloud.domain.ovf.OvfEnvelope;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceAllocation;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceType;
|
||||
import org.jclouds.vcloud.domain.ovf.VCloudHardDisk;
|
||||
import org.jclouds.vcloud.domain.ovf.VirtualHardwareSection;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
@ -60,12 +60,16 @@ public class HardwareForVAppTemplate implements Function<VAppTemplate, Hardware>
|
|||
|
||||
private final VCloudClient client;
|
||||
private final FindLocationForResource findLocationForResource;
|
||||
private final ResourceAllocationsToVolumes resourceAllocationsToVolumes;
|
||||
|
||||
private ReferenceType parent;
|
||||
|
||||
@Inject
|
||||
protected HardwareForVAppTemplate(VCloudClient client, FindLocationForResource findLocationForResource) {
|
||||
protected HardwareForVAppTemplate(VCloudClient client, FindLocationForResource findLocationForResource,
|
||||
ResourceAllocationsToVolumes resourceAllocationsToVolumes) {
|
||||
this.client = checkNotNull(client, "client");
|
||||
this.findLocationForResource = checkNotNull(findLocationForResource, "findLocationForResource");
|
||||
this.resourceAllocationsToVolumes = checkNotNull(resourceAllocationsToVolumes, "resourceAllocationsToVolumes");
|
||||
}
|
||||
|
||||
public HardwareForVAppTemplate withParent(ReferenceType parent) {
|
||||
|
@ -99,11 +103,9 @@ public class HardwareForVAppTemplate implements Function<VAppTemplate, Hardware>
|
|||
VirtualHardwareSection hardware = Iterables.get(ovf.getVirtualSystem().getHardware(), 0);
|
||||
|
||||
int ram = (int) find(hardware.getResourceAllocations(), resourceType(ResourceType.MEMORY)).getVirtualQuantity();
|
||||
ResourceAllocation diskR = find(hardware.getResourceAllocations(), resourceType(ResourceType.DISK_DRIVE));
|
||||
int disk = (int) (((diskR instanceof VCloudHardDisk) ? VCloudHardDisk.class.cast(diskR).getCapacity() : diskR
|
||||
.getVirtualQuantity()) / 1024l);
|
||||
|
||||
List<Processor> processors = Lists.newArrayList(transform(filter(hardware.getResourceAllocations(), resourceType(ResourceType.PROCESSOR)), new Function<ResourceAllocation, Processor>(){
|
||||
List<Processor> processors = Lists.newArrayList(transform(filter(hardware.getResourceAllocations(),
|
||||
resourceType(ResourceType.PROCESSOR)), new Function<ResourceAllocation, Processor>() {
|
||||
|
||||
@Override
|
||||
public Processor apply(ResourceAllocation arg0) {
|
||||
|
@ -111,11 +113,11 @@ public class HardwareForVAppTemplate implements Function<VAppTemplate, Hardware>
|
|||
}
|
||||
|
||||
}));
|
||||
|
||||
Iterable<? extends Volume> volumes = resourceAllocationsToVolumes.apply(hardware.getResourceAllocations());
|
||||
return new HardwareImpl(from.getHref().toASCIIString(), from.getName()
|
||||
+ String.format(": vpus(%s), ram(%d), disk(%d)", processors, ram, disk), from.getHref().toASCIIString(),
|
||||
location, null, ImmutableMap.<String, String> of(), processors, ram, disk, ImagePredicates.idEquals(from
|
||||
.getHref().toASCIIString()));
|
||||
+ String.format(": vpus(%s), ram(%d), volumes(%s)", processors, ram, volumes), from.getHref()
|
||||
.toASCIIString(), location, null, ImmutableMap.<String, String> of(), processors, ram, volumes,
|
||||
ImagePredicates.idEquals(from.getHref().toASCIIString()));
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.vcloud.compute.functions;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static com.google.common.collect.Iterables.filter;
|
||||
import static com.google.common.collect.Iterables.find;
|
||||
import static com.google.common.collect.Iterables.transform;
|
||||
import static org.jclouds.vcloud.predicates.VCloudPredicates.resourceType;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.predicates.ImagePredicates;
|
||||
import org.jclouds.domain.Location;
|
||||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.vcloud.domain.VCloudExpressVApp;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceAllocation;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceType;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
public class HardwareForVCloudExpressVApp implements Function<VCloudExpressVApp, Hardware> {
|
||||
|
||||
@Resource
|
||||
protected Logger logger = Logger.NULL;
|
||||
|
||||
private final FindLocationForResource findLocationForResource;
|
||||
private final ResourceAllocationsToVolumes resourceAllocationsToVolumes;
|
||||
|
||||
@Inject
|
||||
protected HardwareForVCloudExpressVApp(FindLocationForResource findLocationForResource,
|
||||
ResourceAllocationsToVolumes resourceAllocationsToVolumes) {
|
||||
this.findLocationForResource = checkNotNull(findLocationForResource, "findLocationForResource");
|
||||
this.resourceAllocationsToVolumes = checkNotNull(resourceAllocationsToVolumes, "resourceAllocationsToVolumes");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Hardware apply(VCloudExpressVApp from) {
|
||||
checkNotNull(from, "VApp");
|
||||
Location location = findLocationForResource.apply(checkNotNull(from, "from").getVDC());
|
||||
|
||||
int ram = (int) find(from.getResourceAllocations(), resourceType(ResourceType.MEMORY)).getVirtualQuantity();
|
||||
|
||||
List<Processor> processors = Lists.newArrayList(transform(filter(from.getResourceAllocations(),
|
||||
resourceType(ResourceType.PROCESSOR)), new Function<ResourceAllocation, Processor>() {
|
||||
|
||||
@Override
|
||||
public Processor apply(ResourceAllocation arg0) {
|
||||
return new Processor(arg0.getVirtualQuantity(), 1);
|
||||
}
|
||||
|
||||
}));
|
||||
Iterable<? extends Volume> volumes = resourceAllocationsToVolumes.apply(from.getResourceAllocations());
|
||||
return new HardwareImpl(from.getHref().toASCIIString(), from.getName()
|
||||
+ String.format(": vpus(%s), ram(%d), volumes(%s)", processors, ram, volumes), from.getHref()
|
||||
.toASCIIString(), location, null, ImmutableMap.<String, String> of(), processors, ram, volumes,
|
||||
ImagePredicates.idEquals(from.getHref().toASCIIString()));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.vcloud.compute.functions;
|
||||
|
||||
import static com.google.common.collect.Iterables.filter;
|
||||
import static com.google.common.collect.Iterables.transform;
|
||||
import static org.jclouds.vcloud.predicates.VCloudPredicates.resourceType;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.compute.domain.Volume;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceAllocation;
|
||||
import org.jclouds.vcloud.domain.ovf.ResourceType;
|
||||
import org.jclouds.vcloud.domain.ovf.VCloudHardDisk;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Singleton
|
||||
public class ResourceAllocationsToVolumes implements
|
||||
Function<Iterable<? extends ResourceAllocation>, Iterable<? extends Volume>> {
|
||||
@Override
|
||||
public Iterable<? extends Volume> apply(Iterable<? extends ResourceAllocation> resourceAllocations) {
|
||||
Iterable<Volume> volumes = transform(filter(resourceAllocations, resourceType(ResourceType.DISK_DRIVE)),
|
||||
new Function<ResourceAllocation, Volume>() {
|
||||
|
||||
@Override
|
||||
public Volume apply(ResourceAllocation from) {
|
||||
if (from instanceof VCloudHardDisk) {
|
||||
VCloudHardDisk vDisk = VCloudHardDisk.class.cast(from);
|
||||
return new VolumeImpl(from.getAddressOnParent() + "", Volume.Type.LOCAL,
|
||||
vDisk.getCapacity() * 1024f, null, from.getAddressOnParent() == 0, true);
|
||||
} else {
|
||||
return new VolumeImpl(from.getAddressOnParent() + "", Volume.Type.LOCAL, from
|
||||
.getVirtualQuantity() * 1024 * 1024f, null, from.getAddressOnParent() == 0, true);
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
return volumes;
|
||||
}
|
||||
}
|
|
@ -70,7 +70,8 @@ public class VCloudAddNodeWithTagStrategy implements AddNodeWithTagStrategy {
|
|||
@Override
|
||||
public NodeMetadata execute(String tag, String name, Template template) {
|
||||
InstantiateVAppTemplateOptions options = processorCount((int) getCores(template.getHardware())).memory(
|
||||
template.getHardware().getRam()).disk(template.getHardware().getDisk() * 1024 * 1024l);
|
||||
template.getHardware().getRam()).disk(
|
||||
(long) ((template.getHardware().getVolumes().get(0).getSize()) * 1024 * 1024l));
|
||||
|
||||
String customizationScript = null;
|
||||
if (template.getOptions() instanceof VCloudTemplateOptions) {
|
||||
|
@ -99,8 +100,8 @@ public class VCloudAddNodeWithTagStrategy implements AddNodeWithTagStrategy {
|
|||
return blockOnDeployAndPowerOnIfConfigured(options, vAppResponse, task);
|
||||
} else {
|
||||
if (!successTester.apply(task.getHref())) {
|
||||
throw new RuntimeException(
|
||||
String.format("failed to %s %s: %s", "instantiate", vAppResponse.getName(), task));
|
||||
throw new RuntimeException(String
|
||||
.format("failed to %s %s: %s", "instantiate", vAppResponse.getName(), task));
|
||||
}
|
||||
Vm vm = Iterables.get(client.getVApp(vAppResponse.getHref()).getChildren(), 0);
|
||||
GuestCustomizationSection guestConfiguration = vm.getGuestCustomizationSection();
|
||||
|
@ -113,8 +114,8 @@ public class VCloudAddNodeWithTagStrategy implements AddNodeWithTagStrategy {
|
|||
guestConfiguration.setCustomizationScript(customizationScript);
|
||||
task = client.updateGuestCustomizationOfVm(vm.getHref(), guestConfiguration);
|
||||
if (!successTester.apply(task.getHref())) {
|
||||
throw new RuntimeException(String.format("failed to %s %s: %s", "updateGuestCustomizationOfVm",
|
||||
vm.getName(), task));
|
||||
throw new RuntimeException(String.format("failed to %s %s: %s", "updateGuestCustomizationOfVm", vm
|
||||
.getName(), task));
|
||||
}
|
||||
task = client.deployAndPowerOnVAppOrVm(vAppResponse.getHref());
|
||||
return blockOnDeployAndPowerOnIfConfigured(options, vAppResponse, task);
|
||||
|
@ -126,8 +127,8 @@ public class VCloudAddNodeWithTagStrategy implements AddNodeWithTagStrategy {
|
|||
Task task) {
|
||||
if (options.shouldBlock()) {
|
||||
if (!successTester.apply(task.getHref())) {
|
||||
throw new RuntimeException(String.format("failed to %s %s: %s", "deploy and power on",
|
||||
vAppResponse.getName(), task));
|
||||
throw new RuntimeException(String.format("failed to %s %s: %s", "deploy and power on", vAppResponse
|
||||
.getName(), task));
|
||||
}
|
||||
logger.debug("<< ready vApp(%s)", vAppResponse.getName());
|
||||
}
|
||||
|
|
|
@ -64,11 +64,12 @@ public class VCloudExpressAddNodeWithTagStrategy implements AddNodeWithTagStrate
|
|||
@Override
|
||||
public NodeMetadata execute(String tag, String name, Template template) {
|
||||
InstantiateVAppTemplateOptions options = processorCount((int) getCores(template.getHardware())).memory(
|
||||
template.getHardware().getRam()).disk(template.getHardware().getDisk() * 1024 * 1024l);
|
||||
template.getHardware().getRam()).disk(
|
||||
(long) ((template.getHardware().getVolumes().get(0).getSize()) * 1024 * 1024l));
|
||||
if (!template.getOptions().shouldBlockUntilRunning())
|
||||
options.block(false);
|
||||
Map<String, String> metaMap = computeClient.start(URI.create(template.getLocation().getId()),
|
||||
URI.create(template.getImage().getId()), name, options, template.getOptions().getInboundPorts());
|
||||
Map<String, String> metaMap = computeClient.start(URI.create(template.getLocation().getId()), URI.create(template
|
||||
.getImage().getId()), name, options, template.getOptions().getInboundPorts());
|
||||
VCloudExpressVApp vApp = client.getVApp(URI.create(metaMap.get("id")));
|
||||
return newCreateNodeResponse(tag, template, metaMap, vApp);
|
||||
}
|
||||
|
@ -76,11 +77,11 @@ public class VCloudExpressAddNodeWithTagStrategy implements AddNodeWithTagStrate
|
|||
protected NodeMetadata newCreateNodeResponse(String tag, Template template, Map<String, String> metaMap,
|
||||
VCloudExpressVApp vApp) {
|
||||
return new NodeMetadataImpl(vApp.getHref().toASCIIString(), vApp.getName(), vApp.getHref().toASCIIString(),
|
||||
template.getLocation(), vApp.getHref(), ImmutableMap.<String, String> of(), tag, template.getImage()
|
||||
.getId(), getOperatingSystemForVAppOrDefaultTo(vApp, template.getImage().getOperatingSystem()),
|
||||
vAppStatusToNodeState.get(vApp.getStatus()), computeClient.getPublicAddresses(vApp.getHref()),
|
||||
computeClient.getPrivateAddresses(vApp.getHref()), ImmutableMap.<String, String> of(), new Credentials(
|
||||
metaMap.get("username"), metaMap.get("password")));
|
||||
template.getLocation(), vApp.getHref(), ImmutableMap.<String, String> of(), tag, template.getHardware(),
|
||||
template.getImage().getId(), getOperatingSystemForVAppOrDefaultTo(vApp, template.getImage()
|
||||
.getOperatingSystem()), vAppStatusToNodeState.get(vApp.getStatus()), computeClient
|
||||
.getPublicAddresses(vApp.getHref()), computeClient.getPrivateAddresses(vApp.getHref()),
|
||||
new Credentials(metaMap.get("username"), metaMap.get("password")));
|
||||
}
|
||||
|
||||
private OperatingSystem getOperatingSystemForVAppOrDefaultTo(VCloudExpressVApp vApp, OperatingSystem operatingSystem) {
|
||||
|
|
|
@ -31,6 +31,7 @@ import javax.inject.Inject;
|
|||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
|
@ -43,7 +44,7 @@ import org.jclouds.logging.Logger;
|
|||
import org.jclouds.vcloud.VCloudExpressClient;
|
||||
import org.jclouds.vcloud.compute.VCloudExpressComputeClient;
|
||||
import org.jclouds.vcloud.compute.functions.FindLocationForResource;
|
||||
import org.jclouds.vcloud.compute.functions.GetExtraFromVCloudExpressVApp;
|
||||
import org.jclouds.vcloud.compute.functions.HardwareForVCloudExpressVApp;
|
||||
import org.jclouds.vcloud.domain.Status;
|
||||
import org.jclouds.vcloud.domain.VCloudExpressVApp;
|
||||
|
||||
|
@ -62,16 +63,16 @@ public class VCloudExpressGetNodeMetadataStrategy implements GetNodeMetadataStra
|
|||
protected final VCloudExpressComputeClient computeClient;
|
||||
protected final Supplier<Set<? extends Image>> images;
|
||||
protected final FindLocationForResource findLocationForResourceInVDC;
|
||||
protected final GetExtraFromVCloudExpressVApp getExtra;
|
||||
protected final HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp;
|
||||
protected final Map<Status, NodeState> vAppStatusToNodeState;
|
||||
|
||||
@Inject
|
||||
protected VCloudExpressGetNodeMetadataStrategy(VCloudExpressClient client, VCloudExpressComputeClient computeClient,
|
||||
Map<Status, NodeState> vAppStatusToNodeState, GetExtraFromVCloudExpressVApp getExtra,
|
||||
Map<Status, NodeState> vAppStatusToNodeState, HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp,
|
||||
FindLocationForResource findLocationForResourceInVDC, Supplier<Set<? extends Image>> images) {
|
||||
this.client = checkNotNull(client, "client");
|
||||
this.images = checkNotNull(images, "images");
|
||||
this.getExtra = checkNotNull(getExtra, "getExtra");
|
||||
this.hardwareForVCloudExpressVApp = checkNotNull(hardwareForVCloudExpressVApp, "hardwareForVCloudExpressVApp");
|
||||
this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC");
|
||||
this.computeClient = checkNotNull(computeClient, "computeClient");
|
||||
this.vAppStatusToNodeState = checkNotNull(vAppStatusToNodeState, "vAppStatusToNodeState");
|
||||
|
@ -84,11 +85,12 @@ public class VCloudExpressGetNodeMetadataStrategy implements GetNodeMetadataStra
|
|||
return null;
|
||||
String tag = parseTagFromName(from.getName());
|
||||
Location location = findLocationForResourceInVDC.apply(from.getVDC());
|
||||
Hardware hardware = hardwareForVCloudExpressVApp.apply(from);
|
||||
return new NodeMetadataImpl(in, from.getName(), in, location, from.getHref(), ImmutableMap.<String, String> of(),
|
||||
tag, null, from.getOsType() != null ? new CIMOperatingSystem(CIMOperatingSystem.OSType.fromValue(from
|
||||
.getOsType()), null, null, from.getOperatingSystemDescription()) : null, vAppStatusToNodeState
|
||||
.get(from.getStatus()), computeClient.getPublicAddresses(id), computeClient
|
||||
.getPrivateAddresses(id), getExtra.apply(from), null);
|
||||
tag, hardware, null, from.getOsType() != null ? new CIMOperatingSystem(CIMOperatingSystem.OSType
|
||||
.fromValue(from.getOsType()), null, null, from.getOperatingSystemDescription()) : null,
|
||||
vAppStatusToNodeState.get(from.getStatus()), computeClient.getPublicAddresses(id), computeClient
|
||||
.getPrivateAddresses(id), null);
|
||||
}
|
||||
|
||||
}
|
|
@ -35,6 +35,7 @@ import javax.inject.Inject;
|
|||
import javax.inject.Named;
|
||||
import javax.inject.Singleton;
|
||||
|
||||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Image;
|
||||
import org.jclouds.compute.domain.NodeMetadata;
|
||||
import org.jclouds.compute.domain.NodeState;
|
||||
|
@ -45,7 +46,7 @@ import org.jclouds.domain.Location;
|
|||
import org.jclouds.logging.Logger;
|
||||
import org.jclouds.vcloud.VCloudClient;
|
||||
import org.jclouds.vcloud.compute.functions.FindLocationForResource;
|
||||
import org.jclouds.vcloud.compute.functions.GetExtraFromVApp;
|
||||
import org.jclouds.vcloud.compute.functions.HardwareForVApp;
|
||||
import org.jclouds.vcloud.domain.Status;
|
||||
import org.jclouds.vcloud.domain.VApp;
|
||||
|
||||
|
@ -63,16 +64,16 @@ public class VCloudGetNodeMetadataStrategy implements GetNodeMetadataStrategy {
|
|||
protected final VCloudClient client;
|
||||
protected final Supplier<Set<? extends Image>> images;
|
||||
protected final FindLocationForResource findLocationForResourceInVDC;
|
||||
protected final GetExtraFromVApp getExtra;
|
||||
protected final HardwareForVApp hardwareForVApp;
|
||||
protected final Map<Status, NodeState> vAppStatusToNodeState;
|
||||
|
||||
@Inject
|
||||
protected VCloudGetNodeMetadataStrategy(VCloudClient client, Map<Status, NodeState> vAppStatusToNodeState,
|
||||
GetExtraFromVApp getExtra, FindLocationForResource findLocationForResourceInVDC,
|
||||
HardwareForVApp hardwareForVApp, FindLocationForResource findLocationForResourceInVDC,
|
||||
Supplier<Set<? extends Image>> images) {
|
||||
this.client = checkNotNull(client, "client");
|
||||
this.images = checkNotNull(images, "images");
|
||||
this.getExtra = checkNotNull(getExtra, "getExtra");
|
||||
this.hardwareForVApp = checkNotNull(hardwareForVApp, "hardwareForVApp");
|
||||
this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC");
|
||||
this.vAppStatusToNodeState = checkNotNull(vAppStatusToNodeState, "vAppStatusToNodeState");
|
||||
}
|
||||
|
@ -84,8 +85,9 @@ public class VCloudGetNodeMetadataStrategy implements GetNodeMetadataStrategy {
|
|||
return null;
|
||||
String tag = parseTagFromName(from.getName());
|
||||
Location location = findLocationForResourceInVDC.apply(from.getVDC());
|
||||
Hardware hardware = hardwareForVApp.apply(from);
|
||||
return new NodeMetadataImpl(in, from.getName(), in, location, from.getHref(), ImmutableMap.<String, String> of(),
|
||||
tag, null, toComputeOs(from, null), vAppStatusToNodeState.get(from.getStatus()),
|
||||
getPublicIpsFromVApp(from), getPrivateIpsFromVApp(from), getExtra.apply(from), getCredentialsFrom(from));
|
||||
tag, hardware, null, toComputeOs(from, null), vAppStatusToNodeState.get(from.getStatus()),
|
||||
getPublicIpsFromVApp(from), getPrivateIpsFromVApp(from), getCredentialsFrom(from));
|
||||
}
|
||||
}
|
|
@ -26,6 +26,7 @@ import javax.inject.Singleton;
|
|||
import org.jclouds.compute.domain.Hardware;
|
||||
import org.jclouds.compute.domain.Processor;
|
||||
import org.jclouds.compute.domain.internal.HardwareImpl;
|
||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||
import org.jclouds.compute.predicates.ImagePredicates;
|
||||
|
||||
import com.google.common.base.Supplier;
|
||||
|
@ -46,7 +47,8 @@ public class StaticHardwareSupplier implements Supplier<Set<? extends Hardware>>
|
|||
for (int ram : new int[] { 512, 1024, 2048, 4096, 8192, 16384 }) {
|
||||
String id = String.format("cpu=%d,ram=%s,disk=%d", cpus, ram, 10);
|
||||
sizes.add(new HardwareImpl(id, null, id, null, null, ImmutableMap.<String, String> of(), ImmutableList
|
||||
.of(new Processor(cpus, 1.0)), ram, 10, ImagePredicates.any()));
|
||||
.of(new Processor(cpus, 1.0)), ram, ImmutableList.of(new VolumeImpl(10f, true, true)),
|
||||
ImagePredicates.any()));
|
||||
}
|
||||
return sizes;
|
||||
}
|
||||
|
|
|
@ -70,10 +70,7 @@ public class VCloudComputeServiceLiveTest extends BaseComputeServiceLiveTest {
|
|||
assert node.getLocation() != null;
|
||||
assertEquals(node.getType(), ComputeType.NODE);
|
||||
NodeMetadata allData = client.getNodeMetadata(node.getId());
|
||||
assert allData.getExtra().get("processor/count") != null : allData.getExtra();
|
||||
assert allData.getExtra().get("disk_drive/0/kb") != null : allData.getExtra();
|
||||
assert allData.getExtra().get("memory/mb") != null : allData.getExtra();
|
||||
System.out.println(allData.getExtra());
|
||||
System.out.println(allData.getHardware());
|
||||
}
|
||||
}
|
||||
}
|
|
@ -70,10 +70,7 @@ public class VCloudExpressComputeServiceLiveTest extends BaseComputeServiceLiveT
|
|||
assert node.getLocation() != null;
|
||||
assertEquals(node.getType(), ComputeType.NODE);
|
||||
NodeMetadata allData = client.getNodeMetadata(node.getId());
|
||||
assert allData.getExtra().get("processor/count") != null : allData.getExtra();
|
||||
assert allData.getExtra().get("disk_drive/0/kb") != null : allData.getExtra();
|
||||
assert allData.getExtra().get("memory/mb") != null : allData.getExtra();
|
||||
System.out.println(allData.getExtra());
|
||||
System.out.println(allData.getHardware());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ import org.jclouds.vcloud.VCloudExpressClient;
|
|||
import org.jclouds.vcloud.compute.VCloudExpressComputeClient;
|
||||
import org.jclouds.vcloud.compute.domain.VCloudLocation;
|
||||
import org.jclouds.vcloud.compute.functions.FindLocationForResource;
|
||||
import org.jclouds.vcloud.compute.functions.GetExtraFromVCloudExpressVApp;
|
||||
import org.jclouds.vcloud.compute.functions.HardwareForVCloudExpressVApp;
|
||||
import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy;
|
||||
import org.jclouds.vcloud.domain.Status;
|
||||
import org.jclouds.vcloud.terremark.compute.domain.KeyPairCredentials;
|
||||
|
@ -64,7 +64,7 @@ public class TerremarkVCloudGetNodeMetadataStrategy extends VCloudExpressGetNode
|
|||
@Inject
|
||||
protected TerremarkVCloudGetNodeMetadataStrategy(VCloudExpressClient client,
|
||||
VCloudExpressComputeClient computeClient, Map<Status, NodeState> vAppStatusToNodeState,
|
||||
GetExtraFromVCloudExpressVApp getExtra, FindLocationForResource findLocationForResourceInVDC,
|
||||
HardwareForVCloudExpressVApp getExtra, FindLocationForResource findLocationForResourceInVDC,
|
||||
Supplier<Set<? extends Image>> images, ConcurrentMap<OrgAndName, KeyPairCredentials> credentialsMap) {
|
||||
super(client, computeClient, vAppStatusToNodeState, getExtra, findLocationForResourceInVDC, images);
|
||||
this.credentialsMap = credentialsMap;
|
||||
|
|
Loading…
Reference in New Issue