diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItemsToHardware.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItemsToHardware.java index 0db408b993..7316e0c0de 100644 --- a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItemsToHardware.java +++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItemsToHardware.java @@ -25,14 +25,12 @@ import static com.google.common.collect.Iterables.getOnlyElement; import static org.jclouds.softlayer.predicates.ProductItemPredicates.categoryCode; import static org.jclouds.softlayer.predicates.ProductItemPredicates.categoryCodeMatches; import static org.jclouds.softlayer.predicates.ProductItemPredicates.matches; -import static org.jclouds.softlayer.reference.SoftLayerConstants.PROPERTY_SOFTLAYER_VIRTUALGUEST_CPU_REGEX; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.inject.Inject; -import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.compute.domain.Hardware; @@ -56,51 +54,59 @@ import com.google.common.collect.Iterables; @Singleton public class ProductItemsToHardware implements Function, Hardware> { - private final Pattern cpuRegex; - private final Pattern categoryCodeMatches; + private static final String GUEST_DISK_CATEGORY_REGEX = "guest_disk[0-9]"; + private static final String FIRST_GUEST_DISK = "guest_disk0"; + private static final String STORAGE_AREA_NETWORK = "SAN"; + + private static final String RAM_CATEGORY = "ram"; + + private static final String CPU_DESCRIPTION_REGEX = "(Private )?[0-9]+ x ([.0-9]+) GHz Core[s]?"; + private static final double DEFAULT_CORE_SPEED = 2.0; + + private final Pattern cpuDescriptionRegex; + private final Pattern diskCategoryRegex; @Inject - public ProductItemsToHardware(@Named(PROPERTY_SOFTLAYER_VIRTUALGUEST_CPU_REGEX) String cpuRegex) { - this(Pattern.compile(checkNotNull(cpuRegex, "cpuRegex")), Pattern.compile("guest_disk[0-9]")); + public ProductItemsToHardware() { + this(Pattern.compile(CPU_DESCRIPTION_REGEX), Pattern.compile(GUEST_DISK_CATEGORY_REGEX)); } - public ProductItemsToHardware(Pattern cpuRegex, Pattern categoryCodeMatches) { - this.cpuRegex = checkNotNull(cpuRegex, "cpuRegex"); - this.categoryCodeMatches = checkNotNull(categoryCodeMatches, "categoryCodeMatches"); + public ProductItemsToHardware(Pattern cpuDescriptionRegex, Pattern diskCategoryRegex) { + this.cpuDescriptionRegex = checkNotNull(cpuDescriptionRegex, "cpuDescriptionRegex"); + this.diskCategoryRegex = checkNotNull(diskCategoryRegex, "diskCategoryRegex"); } @Override public Hardware apply(Iterable items) { - ProductItem coresItem = getOnlyElement(filter(items, matches(cpuRegex))); - ProductItem ramItem = getOnlyElement(filter(items, categoryCode("ram"))); - ProductItem volumeItem = get(filter(items, categoryCode("guest_disk0")), 0); + ProductItem coresItem = getOnlyElement(filter(items, matches(cpuDescriptionRegex))); + ProductItem ramItem = getOnlyElement(filter(items, categoryCode(RAM_CATEGORY))); + ProductItem volumeItem = get(filter(items, categoryCode(FIRST_GUEST_DISK)), 0); String hardwareId = hardwareId().apply(ImmutableList.of(coresItem, ramItem, volumeItem)); double cores = ProductItems.capacity().apply(coresItem).doubleValue(); - Matcher cpuMatcher = cpuRegex.matcher(coresItem.getDescription()); - double coreSpeed = (cpuMatcher.matches()) ? Double.parseDouble(cpuMatcher.group(cpuMatcher.groupCount())) : 2.0; + Matcher cpuMatcher = cpuDescriptionRegex.matcher(coresItem.getDescription()); + double coreSpeed = (cpuMatcher.matches()) ? Double.parseDouble(cpuMatcher.group(cpuMatcher.groupCount())) : DEFAULT_CORE_SPEED; int ram = ProductItems.capacity().apply(ramItem).intValue(); return new HardwareBuilder().ids(hardwareId).processors(ImmutableList.of(new Processor(cores, coreSpeed))).ram( ram).volumes( - Iterables.transform(filter(items, categoryCodeMatches(categoryCodeMatches)), + Iterables.transform(filter(items, categoryCodeMatches(diskCategoryRegex)), new Function() { - @Override - public Volume apply(ProductItem arg0) { - float volumeSize = ProductItems.capacity().apply(arg0); + public Volume apply(ProductItem item) { + float volumeSize = ProductItems.capacity().apply(item); return new VolumeImpl( - arg0.getId() + "", - arg0.getDescription().indexOf("SAN") != -1 ? Volume.Type.SAN : Volume.Type.LOCAL, - volumeSize, null, categoryCode("guest_disk0").apply(arg0), false); + item.getId() + "", + item.getDescription().indexOf(STORAGE_AREA_NETWORK) != -1 ? Volume.Type.SAN : Volume.Type.LOCAL, + volumeSize, null, categoryCode(FIRST_GUEST_DISK).apply(item), false); } })).build(); } /** * Generates a hardwareId based on the priceId's of the items in the list - * + * * @return comma separated list of priceid's */ public static Function, String> hardwareId() { diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemsToHardwareTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemsToHardwareTest.java index cd22d60f17..6e714b33b1 100644 --- a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemsToHardwareTest.java +++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemsToHardwareTest.java @@ -18,13 +18,10 @@ */ package org.jclouds.softlayer.compute.functions; -import static com.google.inject.name.Names.bindProperties; -import static org.jclouds.softlayer.compute.functions.ProductItemsToHardware.hardwareId; -import static org.testng.AssertJUnit.assertEquals; - -import java.util.List; -import java.util.Properties; - +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Processor; import org.jclouds.compute.domain.Volume; @@ -32,12 +29,15 @@ import org.jclouds.softlayer.SoftLayerPropertiesBuilder; import org.jclouds.softlayer.domain.ProductItem; import org.jclouds.softlayer.domain.ProductItemCategory; import org.jclouds.softlayer.domain.ProductItemPrice; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; +import java.util.List; +import java.util.Properties; + +import static com.google.inject.name.Names.bindProperties; +import static org.jclouds.softlayer.compute.functions.ProductItemsToHardware.hardwareId; +import static org.testng.AssertJUnit.assertEquals; /** * Tests {@code ProductItemsToHardware} @@ -47,6 +47,41 @@ import com.google.inject.Guice; @Test(groups = "unit") public class ProductItemsToHardwareTest { + private ProductItemsToHardware toHardware; + private ProductItem cpuItem; + private ProductItem ramItem; + private ProductItem volumeItem; + + @BeforeMethod + public void setup() { + + toHardware = Guice.createInjector(new AbstractModule() { + @Override + protected void configure() { + bindProperties(binder(), new SoftLayerPropertiesBuilder(new Properties()).build()); + } + }).getInstance(ProductItemsToHardware.class); + + + cpuItem = ProductItem.builder() + .id(1) + .description("2 x 2.0 GHz Cores") + .capacity(2F) + .category(ProductItemCategory.builder().categoryCode("guest_core").build()) + .price(ProductItemPrice.builder().id(123).build()) + .build(); + + ramItem = ProductItem.builder().id(2).description("2GB ram").capacity(2F).category( + ProductItemCategory.builder().categoryCode("ram").build()).price( + ProductItemPrice.builder().id(456).build()).build(); + + volumeItem = ProductItem.builder().id(3).description("100 GB (SAN)").capacity(100F).price( + ProductItemPrice.builder().id(789).build()).category( + ProductItemCategory.builder().categoryCode("guest_disk0").build()).build(); + + + } + @Test public void testHardwareId() { ProductItem item1 = ProductItem.builder().price(ProductItemPrice.builder().id(123).build()).build(); @@ -59,25 +94,8 @@ public class ProductItemsToHardwareTest { @Test public void testHardware() { - ProductItem cpuItem = ProductItem.builder().id(1).description("2 x 2.0 GHz Cores").units("PRIVATE_CORE") - .capacity(2F).price(ProductItemPrice.builder().id(123).build()).build(); - ProductItem ramItem = ProductItem.builder().id(2).description("2GB ram").capacity(2F).category( - ProductItemCategory.builder().categoryCode("ram").build()).price( - ProductItemPrice.builder().id(456).build()).build(); - - ProductItem volumeItem = ProductItem.builder().id(3).description("100 GB (SAN)").capacity(100F).price( - ProductItemPrice.builder().id(789).build()).category( - ProductItemCategory.builder().categoryCode("guest_disk0").build()).build(); - - Hardware hardware = Guice.createInjector(new AbstractModule() { - - @Override - protected void configure() { - bindProperties(binder(), new SoftLayerPropertiesBuilder(new Properties()).build()); - } - - }).getInstance(ProductItemsToHardware.class).apply(ImmutableSet.of(cpuItem, ramItem, volumeItem)); + Hardware hardware = toHardware.apply(ImmutableSet.of(cpuItem, ramItem, volumeItem)); assertEquals("123,456,789", hardware.getId()); @@ -89,6 +107,53 @@ public class ProductItemsToHardwareTest { List volumes = hardware.getVolumes(); assertEquals(1, volumes.size()); - assertEquals(100F, volumes.get(0).getSize()); + Volume volume = volumes.get(0); + assertEquals(100F, volume.getSize()); + assertEquals(Volume.Type.SAN, volume.getType()); + assertEquals(true, volume.isBootDevice()); + + } + + @Test + public void testHardwareWithPrivateCore() { + + cpuItem = cpuItem.toBuilder() + .description("Private 2 x 2.0 GHz Cores") + .build(); + + Hardware hardware = toHardware.apply(ImmutableSet.of(cpuItem, ramItem, volumeItem)); + + assertEquals("123,456,789", hardware.getId()); + + List processors = hardware.getProcessors(); + assertEquals(1, processors.size()); + assertEquals(2.0, processors.get(0).getCores()); + + assertEquals(2, hardware.getRam()); + + List volumes = hardware.getVolumes(); + assertEquals(1, volumes.size()); + assertEquals(100F, volumes.get(0).getSize()); + } + + @Test + public void testHardwareWithTwoDisks() { + ProductItem localVolumeItem = ProductItem.builder().id(4).description("25 GB").capacity(25F).price( + ProductItemPrice.builder().id(987).build()).category( + ProductItemCategory.builder().categoryCode("guest_disk1").build()).build(); + + Hardware hardware = toHardware.apply(ImmutableSet.of(cpuItem, ramItem, volumeItem,localVolumeItem)); + + List volumes = hardware.getVolumes(); + assertEquals(2, volumes.size()); + Volume volume = volumes.get(0); + assertEquals(100F, volume.getSize()); + assertEquals(Volume.Type.SAN, volume.getType()); + assertEquals(true, volume.isBootDevice()); + + Volume volume1 = volumes.get(1); + assertEquals(25F, volume1.getSize()); + assertEquals(Volume.Type.LOCAL, volume1.getType()); + assertEquals(false, volume1.isBootDevice()); } }