mirror of https://github.com/apache/jclouds.git
Changed the instance Size to support floating-point type of # of cores (ex, 6.5 cores). Propogated the change to template builder and related ComputeService usages.
This commit is contained in:
parent
c0b5d832b5
commit
d71b439981
|
@ -39,13 +39,18 @@ public class EC2Size extends SizeImpl {
|
||||||
private static final long serialVersionUID = 8605688733788974797L;
|
private static final long serialVersionUID = 8605688733788974797L;
|
||||||
private final InstanceType instanceType;
|
private final InstanceType instanceType;
|
||||||
|
|
||||||
EC2Size(InstanceType instanceType, Integer cores, Integer ram, Integer disk,
|
EC2Size(InstanceType instanceType, Double cores, Integer ram, Integer disk,
|
||||||
Iterable<Architecture> supportedArchitectures) {
|
Iterable<Architecture> supportedArchitectures) {
|
||||||
super(instanceType.toString(), instanceType.toString(), null, null, ImmutableMap
|
super(instanceType.toString(), instanceType.toString(), null, null, ImmutableMap
|
||||||
.<String, String> of(),cores, ram, disk, supportedArchitectures);
|
.<String, String> of(),cores, ram, disk, supportedArchitectures);
|
||||||
this.instanceType = instanceType;
|
this.instanceType = instanceType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EC2Size(InstanceType instanceType, Integer cores, Integer ram, Integer disk,
|
||||||
|
Iterable<Architecture> supportedArchitectures) {
|
||||||
|
this(instanceType, cores.doubleValue(), ram, disk, supportedArchitectures);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the EC2 InstanceType associated with this size.
|
* Returns the EC2 InstanceType associated with this size.
|
||||||
*/
|
*/
|
||||||
|
@ -71,7 +76,7 @@ public class EC2Size extends SizeImpl {
|
||||||
/**
|
/**
|
||||||
* @see InstanceType#M2_XLARGE
|
* @see InstanceType#M2_XLARGE
|
||||||
*/
|
*/
|
||||||
public static final EC2Size M2_XLARGE = new EC2Size(InstanceType.M2_XLARGE, 6 /*TODO: 6.5*/, 17510, 420,
|
public static final EC2Size M2_XLARGE = new EC2Size(InstanceType.M2_XLARGE, 6.5, 17510, 420,
|
||||||
ImmutableSet.of(Architecture.X86_64));
|
ImmutableSet.of(Architecture.X86_64));
|
||||||
/**
|
/**
|
||||||
* @see InstanceType#M2_2XLARGE
|
* @see InstanceType#M2_2XLARGE
|
||||||
|
|
|
@ -60,33 +60,14 @@ public class EC2ComputeServiceTest {
|
||||||
* {@link org.jclouds.compute.domain.Size} from {@link EC2Size}.
|
* {@link org.jclouds.compute.domain.Size} from {@link EC2Size}.
|
||||||
*
|
*
|
||||||
* Expected size: m2.xlarge
|
* Expected size: m2.xlarge
|
||||||
*
|
|
||||||
* @throws Exception if non-test-related exception arises
|
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testTemplateChoiceForInstanceBySizeId() throws Exception {
|
public void testTemplateChoiceForInstanceBySizeId() throws Exception {
|
||||||
|
Template template = newTemplateBuilder().
|
||||||
//create an instance of TemplateBuilderImpl
|
|
||||||
Location location = new LocationImpl(LocationScope.REGION, "us-east-1", "us east", null, true);
|
|
||||||
Image image = new ImageImpl("ami-image", "image", "us-east-1", new URI("http"),
|
|
||||||
Maps.<String,String>newHashMap(), "description", "1.0",
|
|
||||||
null, "ubuntu", Architecture.X86_64);
|
|
||||||
|
|
||||||
TemplateBuilderImpl templateBuilder =
|
|
||||||
new TemplateBuilderImpl(ImmutableMap.of("us-east-1", location),
|
|
||||||
ImmutableMap.of("ami-image", image),
|
|
||||||
ImmutableMap.of("m2.xlarge", EC2Size.M2_XLARGE,
|
|
||||||
"m2.2xlarge", EC2Size.M2_2XLARGE,
|
|
||||||
"m2.4xlarge", EC2Size.M2_4XLARGE),
|
|
||||||
location);
|
|
||||||
|
|
||||||
//find the matching template
|
|
||||||
Template template = templateBuilder.
|
|
||||||
architecture(Architecture.X86_64).sizeId("m2.xlarge").
|
architecture(Architecture.X86_64).sizeId("m2.xlarge").
|
||||||
locationId("us-east-1").
|
locationId("us-east-1").
|
||||||
build();
|
build();
|
||||||
|
|
||||||
//assert the template is correct
|
|
||||||
assert template != null : "The returned template was null, but it should have a value.";
|
assert template != null : "The returned template was null, but it should have a value.";
|
||||||
assert EC2Size.M2_XLARGE.equals(template.getSize()) :
|
assert EC2Size.M2_XLARGE.equals(template.getSize()) :
|
||||||
format("Incorrect image determined by the template. Expected: %s. Found: %s.",
|
format("Incorrect image determined by the template. Expected: %s. Found: %s.",
|
||||||
|
@ -98,35 +79,17 @@ public class EC2ComputeServiceTest {
|
||||||
* Verifies that {@link TemplateBuilderImpl} would
|
* Verifies that {@link TemplateBuilderImpl} would
|
||||||
* choose the correct size of the instance, based on
|
* choose the correct size of the instance, based on
|
||||||
* physical attributes (# of cores, ram, etc).
|
* physical attributes (# of cores, ram, etc).
|
||||||
* Expected size: m2.xlarge
|
|
||||||
*
|
*
|
||||||
* @throws Exception if non-test-related exception arises
|
* Expected size: m2.xlarge
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testTemplateChoiceForInstanceByAttributes() throws Exception {
|
public void testTemplateChoiceForInstanceByAttributes() throws Exception {
|
||||||
|
Template template = newTemplateBuilder().
|
||||||
//create an instance of TemplateBuilderImpl
|
|
||||||
Location location = new LocationImpl(LocationScope.REGION, "us-east-1", "us east", null, true);
|
|
||||||
Image image = new ImageImpl("ami-image", "image", "us-east-1", new URI("http"),
|
|
||||||
Maps.<String,String>newHashMap(), "description", "1.0",
|
|
||||||
null, "ubuntu", Architecture.X86_64);
|
|
||||||
|
|
||||||
TemplateBuilderImpl templateBuilder =
|
|
||||||
new TemplateBuilderImpl(ImmutableMap.of("us-east-1", location),
|
|
||||||
ImmutableMap.of("ami-image", image),
|
|
||||||
Maps.uniqueIndex(ImmutableSet.of(EC2Size.C1_MEDIUM, EC2Size.C1_XLARGE,
|
|
||||||
EC2Size.M1_LARGE, EC2Size.M1_SMALL, EC2Size.M1_XLARGE, EC2Size.M2_XLARGE,
|
|
||||||
EC2Size.M2_2XLARGE, EC2Size.M2_4XLARGE), indexer()),
|
|
||||||
location);
|
|
||||||
|
|
||||||
//find the matching template
|
|
||||||
Template template = templateBuilder.
|
|
||||||
architecture(Architecture.X86_64).
|
architecture(Architecture.X86_64).
|
||||||
minRam(17510).minCores(6).smallest().
|
minRam(17510).minCores(6.5).smallest().
|
||||||
locationId("us-east-1").
|
locationId("us-east-1").
|
||||||
build();
|
build();
|
||||||
|
|
||||||
//assert the template is correct
|
|
||||||
assert template != null : "The returned template was null, but it should have a value.";
|
assert template != null : "The returned template was null, but it should have a value.";
|
||||||
assert EC2Size.M2_XLARGE.equals(template.getSize()) :
|
assert EC2Size.M2_XLARGE.equals(template.getSize()) :
|
||||||
format("Incorrect image determined by the template. Expected: %s. Found: %s.",
|
format("Incorrect image determined by the template. Expected: %s. Found: %s.",
|
||||||
|
@ -134,6 +97,45 @@ public class EC2ComputeServiceTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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).
|
||||||
|
*
|
||||||
|
* Expected size: anything but m2.xlarge
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testNegativeTemplateChoiceForInstanceByAttributes() throws Exception {
|
||||||
|
Template template = newTemplateBuilder().
|
||||||
|
architecture(Architecture.X86_64).
|
||||||
|
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 ! EC2Size.M2_XLARGE.equals(template.getSize()) :
|
||||||
|
format("Incorrect image determined by the template. Expected: not %s. Found: %s.",
|
||||||
|
"m2.xlarge", String.valueOf(template.getSize()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private TemplateBuilder newTemplateBuilder() {
|
||||||
|
Location location = new LocationImpl(LocationScope.REGION, "us-east-1", "us east", null, true);
|
||||||
|
Image image = new ImageImpl("ami-image", "image", "us-east-1", null,
|
||||||
|
Maps.<String,String>newHashMap(), "description", "1.0",
|
||||||
|
null, "ubuntu", Architecture.X86_64);
|
||||||
|
|
||||||
|
return new TemplateBuilderImpl(ImmutableMap.of("us-east-1", location),
|
||||||
|
ImmutableMap.of("ami-image", image),
|
||||||
|
Maps.uniqueIndex(ImmutableSet.of(EC2Size.C1_MEDIUM, EC2Size.C1_XLARGE,
|
||||||
|
EC2Size.M1_LARGE, EC2Size.M1_SMALL, EC2Size.M1_XLARGE, EC2Size.M2_XLARGE,
|
||||||
|
EC2Size.M2_2XLARGE, EC2Size.M2_4XLARGE), indexer()),
|
||||||
|
location);
|
||||||
|
}
|
||||||
|
|
||||||
Function<ComputeMetadata, String> indexer() {
|
Function<ComputeMetadata, String> indexer() {
|
||||||
return new Function<ComputeMetadata, String>() {
|
return new Function<ComputeMetadata, String>() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -40,7 +40,7 @@ public interface Size extends ComputeMetadata {
|
||||||
/**
|
/**
|
||||||
* Amount of virtual or physical cores provided
|
* Amount of virtual or physical cores provided
|
||||||
*/
|
*/
|
||||||
int getCores();
|
double getCores();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Amount of RAM provided in MB (256M, 1740)
|
* Amount of RAM provided in MB (256M, 1740)
|
||||||
|
|
|
@ -111,7 +111,7 @@ public interface TemplateBuilder {
|
||||||
/**
|
/**
|
||||||
* Configure this template to require the minimum cores below
|
* Configure this template to require the minimum cores below
|
||||||
*/
|
*/
|
||||||
TemplateBuilder minCores(int minCores);
|
TemplateBuilder minCores(double minCores);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configure this template to require the minimum ram in megabytes below
|
* Configure this template to require the minimum ram in megabytes below
|
||||||
|
|
|
@ -41,14 +41,14 @@ import com.google.common.collect.Sets;
|
||||||
public class SizeImpl extends ComputeMetadataImpl implements Size {
|
public class SizeImpl extends ComputeMetadataImpl implements Size {
|
||||||
/** The serialVersionUID */
|
/** The serialVersionUID */
|
||||||
private static final long serialVersionUID = 8994255275911717567L;
|
private static final long serialVersionUID = 8994255275911717567L;
|
||||||
private final int cores;
|
private final double cores;
|
||||||
private final int ram;
|
private final int ram;
|
||||||
private final int disk;
|
private final int disk;
|
||||||
|
|
||||||
private final Set<Architecture> supportedArchitectures = Sets.newHashSet();
|
private final Set<Architecture> supportedArchitectures = Sets.newHashSet();
|
||||||
|
|
||||||
public SizeImpl(String id, String name, @Nullable String location, URI uri,
|
public SizeImpl(String id, String name, @Nullable String location, URI uri,
|
||||||
Map<String, String> userMetadata, int cores, int ram, int disk,
|
Map<String, String> userMetadata, double cores, int ram, int disk,
|
||||||
Iterable<Architecture> supportedArchitectures) {
|
Iterable<Architecture> supportedArchitectures) {
|
||||||
super(ComputeType.SIZE, id, name, location, uri, userMetadata);
|
super(ComputeType.SIZE, id, name, location, uri, userMetadata);
|
||||||
this.cores = cores;
|
this.cores = cores;
|
||||||
|
@ -62,7 +62,7 @@ public class SizeImpl extends ComputeMetadataImpl implements Size {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public int getCores() {
|
public double getCores() {
|
||||||
return cores;
|
return cores;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ import javax.annotation.Resource;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
|
|
||||||
|
import com.google.common.primitives.Doubles;
|
||||||
import org.jclouds.compute.domain.Architecture;
|
import org.jclouds.compute.domain.Architecture;
|
||||||
import org.jclouds.compute.domain.ComputeMetadata;
|
import org.jclouds.compute.domain.ComputeMetadata;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
|
@ -54,7 +55,7 @@ public class TemplateBuilderImpl implements TemplateBuilder {
|
||||||
private String imageVersion;
|
private String imageVersion;
|
||||||
private String imageName;
|
private String imageName;
|
||||||
|
|
||||||
private int minCores;
|
private double minCores;
|
||||||
private int minRam;
|
private int minRam;
|
||||||
|
|
||||||
private boolean biggest;
|
private boolean biggest;
|
||||||
|
@ -212,7 +213,7 @@ public class TemplateBuilderImpl implements TemplateBuilder {
|
||||||
};
|
};
|
||||||
static final Ordering<Size> BY_CORES_ORDERING = new Ordering<Size>() {
|
static final Ordering<Size> BY_CORES_ORDERING = new Ordering<Size>() {
|
||||||
public int compare(Size left, Size right) {
|
public int compare(Size left, Size right) {
|
||||||
return Ints.compare(left.getCores(), right.getCores());
|
return Doubles.compare(left.getCores(), right.getCores());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
static final Ordering<Image> DEFAULT_IMAGE_ORDERING = new Ordering<Image>() {
|
static final Ordering<Image> DEFAULT_IMAGE_ORDERING = new Ordering<Image>() {
|
||||||
|
@ -386,7 +387,7 @@ public class TemplateBuilderImpl implements TemplateBuilder {
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public TemplateBuilder minCores(int minCores) {
|
public TemplateBuilder minCores(double minCores) {
|
||||||
this.minCores = minCores;
|
this.minCores = minCores;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
|
@ -180,7 +180,7 @@ public class VCloudComputeServiceContextModule extends VCloudContextModule {
|
||||||
@Override
|
@Override
|
||||||
public NodeMetadata execute(String tag, String name, Template template) {
|
public NodeMetadata execute(String tag, String name, Template template) {
|
||||||
Map<String, String> metaMap = computeClient.start(template.getLocation().getId(), name,
|
Map<String, String> metaMap = computeClient.start(template.getLocation().getId(), name,
|
||||||
template.getImage().getId(), template.getSize().getCores(), template.getSize()
|
template.getImage().getId(), Double.valueOf(template.getSize().getCores()).intValue(), template.getSize()
|
||||||
.getRam(), template.getSize().getDisk() * 1024 * 1024l, ImmutableMap
|
.getRam(), template.getSize().getDisk() * 1024 * 1024l, ImmutableMap
|
||||||
.<String, String> of(), template.getOptions().getInboundPorts());
|
.<String, String> of(), template.getOptions().getInboundPorts());
|
||||||
VApp vApp = client.getVApp(metaMap.get("id"));
|
VApp vApp = client.getVApp(metaMap.get("id"));
|
||||||
|
|
Loading…
Reference in New Issue