You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by an...@apache.org on 2013/11/10 18:04:33 UTC

[3/3] git commit: JCLOUDS-213: Fixing SoftLayer support

JCLOUDS-213: Fixing SoftLayer support


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

Branch: refs/heads/1.6.x
Commit: f278450355bbaa95c841c2f857a528091b90d723
Parents: 0298318
Author: Andrea Turli <an...@gmail.com>
Authored: Mon Jul 29 18:43:08 2013 +0200
Committer: Andrew Phillips <an...@apache.org>
Committed: Sun Nov 10 12:03:46 2013 -0500

----------------------------------------------------------------------
 .../softlayer/SoftLayerProviderMetadata.java    |     2 +-
 .../SoftLayerComputeServiceContextModule.java   |     2 +-
 .../compute/functions/ProductItemToImage.java   |    23 +-
 .../compute/functions/ProductItems.java         |     8 +-
 .../functions/VirtualGuestToNodeMetadata.java   |     6 +-
 .../SoftLayerComputeServiceAdapter.java         |     1 -
 .../jclouds/softlayer/domain/ProductOrder.java  |     2 +-
 .../softlayer/features/AccountAsyncClient.java  |    14 +-
 .../softlayer/features/AccountClient.java       |    16 +-
 .../SoftLayerComputeServiceAdapterLiveTest.java |    12 +-
 .../SoftLayerComputeServiceLiveTest.java        |    19 +-
 .../SoftLayerTemplateBuilderLiveTest.java       |    10 +-
 .../functions/ProductItemToImageTest.java       |    38 +-
 .../features/AccountClientExpectTest.java       |   130 +
 .../features/AccountClientLiveTest.java         |    10 +-
 .../features/BaseSoftLayerClientLiveTest.java   |    35 +
 .../features/DatacenterClientLiveTest.java      |    17 +-
 .../features/ProductPackageClientLiveTest.java  |    38 +-
 .../features/VirtualGuestClientLiveTest.java    |    76 +-
 .../src/test/resources/get_active_packages.json | 38287 +++++++++++++++++
 .../resources/get_reduced_active_packages.json  |    10 +
 21 files changed, 38608 insertions(+), 148 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/main/java/org/jclouds/softlayer/SoftLayerProviderMetadata.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/SoftLayerProviderMetadata.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/SoftLayerProviderMetadata.java
index 7efda6f..56bb71e 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/SoftLayerProviderMetadata.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/SoftLayerProviderMetadata.java
@@ -91,7 +91,7 @@ public class SoftLayerProviderMetadata extends BaseProviderMetadata {
          .apiMetadata(new SoftLayerApiMetadata())
          .homepage(URI.create("http://www.softlayer.com"))
          .console(URI.create("https://manage.softlayer.com"))
-         .iso3166Codes("SG","US-CA","US-TX","US-VA","US-WA","US-TX", "NL")
+         .iso3166Codes("SG","US-CA","US-TX","US-VA","US-WA","US-TX", "NL", "NSFTW-IL")  // NSFTW-IL is a weird isoCode returned by Softlayer
          .endpoint("https://api.softlayer.com/rest")
          .defaultProperties(SoftLayerProviderMetadata.defaultProperties());
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/config/SoftLayerComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/config/SoftLayerComputeServiceContextModule.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/config/SoftLayerComputeServiceContextModule.java
index a84b6e9..832e7f4 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/config/SoftLayerComputeServiceContextModule.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/config/SoftLayerComputeServiceContextModule.java
@@ -101,7 +101,7 @@ public class SoftLayerComputeServiceContextModule extends
                   public ProductPackage get() {
                      AccountClient accountClient = client.getAccountClient();
                      ProductPackageClient productPackageClient = client.getProductPackageClient();
-                     ProductPackage p = find(accountClient.getActivePackages(), named(virtualGuestPackageName));
+                     ProductPackage p = find(accountClient.getReducedActivePackages(), named(virtualGuestPackageName));
                      return productPackageClient.getProductPackage(p.getId());
                   }
                   

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItemToImage.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItemToImage.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItemToImage.java
index 31c4148..f8606b3 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItemToImage.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItemToImage.java
@@ -16,15 +16,8 @@
  */
 package org.jclouds.softlayer.compute.functions;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.annotation.Resource;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
 import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.ImageBuilder;
 import org.jclouds.compute.domain.OperatingSystem;
@@ -34,8 +27,13 @@ import org.jclouds.logging.Logger;
 import org.jclouds.softlayer.domain.ProductItem;
 import org.jclouds.softlayer.domain.ProductItemPrice;
 
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
+import javax.annotation.Resource;
+import javax.inject.Named;
+import javax.inject.Singleton;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * @author Jason King
@@ -162,7 +160,6 @@ public class ProductItemToImage implements Function<ProductItem, Image> {
                   return Integer.parseInt(m.group(1));
                }
             }
-
             return null;
          }
       };
@@ -179,7 +176,7 @@ public class ProductItemToImage implements Function<ProductItem, Image> {
          public String apply(ProductItem productItem) {
             checkNotNull(productItem, "productItem");
             ProductItemPrice price = ProductItems.price().apply(productItem);
-            return "" + price.getId();
+            return String.valueOf(checkNotNull(price, "price").getId());
          }
       };
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItems.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItems.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItems.java
index 7c551e1..a3460d3 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItems.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/ProductItems.java
@@ -19,6 +19,9 @@ package org.jclouds.softlayer.compute.functions;
 import java.util.NoSuchElementException;
 import java.util.Set;
 
+import com.google.common.collect.Sets;
+import org.jclouds.compute.reference.ComputeServiceConstants;
+import org.jclouds.logging.Logger;
 import org.jclouds.softlayer.domain.ProductItem;
 import org.jclouds.softlayer.domain.ProductItemCategory;
 import org.jclouds.softlayer.domain.ProductItemPrice;
@@ -26,6 +29,9 @@ import org.jclouds.softlayer.domain.ProductItemPrice;
 import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 
+import javax.annotation.Resource;
+import javax.inject.Named;
+
 public class ProductItems {
 
    /**
@@ -60,7 +66,7 @@ public class ProductItems {
       return new Function<ProductItem, ProductItemPrice>() {
          @Override
          public ProductItemPrice apply(ProductItem productItem) {
-            if (productItem.getPrices().size() < 1)
+            if (productItem.getPrices().isEmpty())
                throw new NoSuchElementException("ProductItem has no prices:" + productItem);
             return Iterables.get(productItem.getPrices(), 0);
          }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/VirtualGuestToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/VirtualGuestToNodeMetadata.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/VirtualGuestToNodeMetadata.java
index 93f0fc4..1d2f961 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/VirtualGuestToNodeMetadata.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/functions/VirtualGuestToNodeMetadata.java
@@ -88,10 +88,8 @@ public class VirtualGuestToNodeMetadata implements Function<VirtualGuest, NodeMe
       if (image != null) {
          builder.imageId(image.getId());
          builder.operatingSystem(image.getOperatingSystem());
+         builder.hardware(hardware.getHardware(from));
       }
-
-      builder.hardware(hardware.getHardware(from));
-
       builder.status(serverStateToNodeStatus.get(from.getPowerState().getKeyName()));
 
       // These are null for 'bad' guest orders in the HALTED state.
@@ -147,6 +145,8 @@ public class VirtualGuestToNodeMetadata implements Function<VirtualGuest, NodeMe
             return null;
          Iterable<ProductItem> items = Iterables.transform(order.getPrices(), ProductItems.item());
          ProductItem os = Iterables.find(items, ProductItemPredicates.categoryCode("os"));
+         if (os.getPrices().isEmpty())
+             return null;
          return new ProductItemToImage().apply(os);
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java
index 5e614bb..0b2fc89 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/compute/strategy/SoftLayerComputeServiceAdapter.java
@@ -65,7 +65,6 @@ import com.google.common.base.Splitter;
 import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSet.Builder;
-import com.google.common.collect.Iterables;
 
 /**
  * defines the connection between the {@link SoftLayerClient} implementation and

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductOrder.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductOrder.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductOrder.java
index a0f7072..1cb8606 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductOrder.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/domain/ProductOrder.java
@@ -140,7 +140,7 @@ public class ProductOrder {
    private final boolean useHourlyPricing;
 
    @ConstructorProperties({
-         "packageId", "location", "prices", "virtualGuest", "quantity", "useHourlyPricing"
+      "packageId", "location", "prices", "virtualGuests", "quantity", "useHourlyPricing"
    })
    protected ProductOrder(int packageId, @Nullable String location, @Nullable Set<ProductItemPrice> prices, @Nullable Set<VirtualGuest> virtualGuests, int quantity, boolean useHourlyPricing) {
       this.packageId = packageId;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountAsyncClient.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountAsyncClient.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountAsyncClient.java
index fcb6b87..810baaf 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountAsyncClient.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountAsyncClient.java
@@ -26,6 +26,7 @@ import javax.ws.rs.core.MediaType;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.http.filters.BasicAuthentication;
 import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.QueryParams;
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.softlayer.domain.ProductPackage;
 
@@ -34,7 +35,7 @@ import com.google.common.util.concurrent.ListenableFuture;
 /**
  * Provides asynchronous access to Account via their REST API.
  * <p/>
- * 
+ *
  * @see AccountClient
  * @see <a href="http://sldn.softlayer.com/article/REST" />
  * @author Jason King
@@ -46,6 +47,16 @@ import com.google.common.util.concurrent.ListenableFuture;
 public interface AccountAsyncClient {
 
    /**
+    * @see AccountClient#getReducedActivePackages()
+    */
+   @GET
+   @Path("/SoftLayer_Account/ActivePackages.json")
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Fallback(NullOnNotFoundOr404.class)
+   @QueryParams(keys = "objectMask", values = "id;name")
+   ListenableFuture<Set<ProductPackage>> getReducedActivePackages();
+
+    /**
     * @see AccountClient#getActivePackages()
     */
    @GET
@@ -54,5 +65,4 @@ public interface AccountAsyncClient {
    @Fallback(NullOnNotFoundOr404.class)
    ListenableFuture<Set<ProductPackage>> getActivePackages();
 
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountClient.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountClient.java b/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountClient.java
index 9b2f85a..d58cff3 100644
--- a/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountClient.java
+++ b/providers/softlayer/src/main/java/org/jclouds/softlayer/features/AccountClient.java
@@ -31,15 +31,15 @@ import org.jclouds.softlayer.domain.ProductPackage;
 public interface AccountClient {
 
    /**
-    * 
-    * @return Gets all the active packages.
-    * This will give you a basic description of the packages that are currently
-    * active and from which you can order a server or additional services.
-    *
-    * Calling ProductPackage.getItems() will return an empty set.
-    * Use ProductPackageClient.getProductPackage(long id) to obtain items data.
-    * @see ProductPackageClient#getProductPackage
+    * @return return all the active packages.
     */
    Set<ProductPackage> getActivePackages();
 
+
+   /**
+    * @return return all the active packages's id and name.
+    * @see #getActivePackages()
+    */
+   Set<ProductPackage> getReducedActivePackages();
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceAdapterLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceAdapterLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceAdapterLiveTest.java
index 425918c..6d0c7c8 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceAdapterLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceAdapterLiveTest.java
@@ -21,9 +21,12 @@ import static org.testng.Assert.assertFalse;
 
 import java.util.Properties;
 import java.util.Random;
+import java.util.concurrent.TimeUnit;
 
+import com.google.common.base.Stopwatch;
 import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials;
 import org.jclouds.compute.domain.ExecResponse;
+import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.functions.DefaultCredentialsFromImageOrOverridingCredentials;
@@ -67,7 +70,7 @@ public class SoftLayerComputeServiceAdapterLiveTest extends BaseSoftLayerClientL
 
    @Test
    public void testListLocations() {
-      assertFalse(Iterables.isEmpty(adapter.listLocations()));
+      assertFalse(Iterables.isEmpty(adapter.listLocations()), "locations must not be empty");
    }
 
    private static final PrioritizeCredentialsFromTemplate prioritizeCredentialsFromTemplate = new PrioritizeCredentialsFromTemplate(
@@ -128,4 +131,11 @@ public class SoftLayerComputeServiceAdapterLiveTest extends BaseSoftLayerClientL
    protected Iterable<Module> setupModules() {
       return ImmutableSet.<Module> of(getLoggingModule(), new SshjSshClientModule());
    }
+
+   @Override
+   protected Properties setupProperties() {
+      Properties properties = super.setupProperties();
+      properties.setProperty("jclouds.ssh.max-retries", "10");
+      return properties;
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceLiveTest.java
index 15824aa..94dc2ab 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerComputeServiceLiveTest.java
@@ -24,13 +24,15 @@ import org.testng.annotations.Test;
 import com.google.common.collect.ImmutableMap;
 import com.google.inject.Module;
 
+import java.util.Properties;
+
 /**
- * 
+ *
  * Generally disabled, as it incurs higher fees.
- * 
+ *
  * @author Adrian Cole
  */
-@Test(groups = "live", enabled = true, sequential = true)
+@Test(groups = "live", enabled = true, singleThreaded = true)
 public class SoftLayerComputeServiceLiveTest extends BaseComputeServiceLiveTest {
 
    public SoftLayerComputeServiceLiveTest() {
@@ -42,7 +44,7 @@ public class SoftLayerComputeServiceLiveTest extends BaseComputeServiceLiveTest
    protected Module getSshModule() {
       return new SshjSshClientModule();
    }
-   
+
    // softlayer does not support metadata
    @Override
    protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
@@ -54,4 +56,11 @@ public class SoftLayerComputeServiceLiveTest extends BaseComputeServiceLiveTest
    public void testOptionToNotBlock() {
       // start call is blocking anyway.
    }
-}
+
+   @Override
+   protected Properties setupProperties() {
+      Properties properties = super.setupProperties();
+      properties.setProperty("jclouds.ssh.max-retries", "20");
+      return properties;
+   }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerTemplateBuilderLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerTemplateBuilderLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerTemplateBuilderLiveTest.java
index 98f31e7..ddb85db 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerTemplateBuilderLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/SoftLayerTemplateBuilderLiveTest.java
@@ -47,6 +47,8 @@ import com.google.common.collect.ImmutableSet;
 @Test(groups = "live")
 public class SoftLayerTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest {
 
+   public static final int MAX_RAM = 48 * 1024;
+
    public SoftLayerTemplateBuilderLiveTest() {
       provider = "softlayer";
    }
@@ -141,7 +143,7 @@ public class SoftLayerTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTes
 
          Template template = context.getComputeService().templateBuilder().biggest().build();
          assertEquals(getCores(template.getHardware()), 16.0d);
-         assertEquals(template.getHardware().getRam(), 16*1024);
+         assertEquals(template.getHardware().getRam(), MAX_RAM);
          assertEquals(getSpace(template.getHardware()), 100.0d);
          assertEquals(template.getHardware().getVolumes().get(0).getType(), Volume.Type.SAN);
       } finally {
@@ -181,7 +183,7 @@ public class SoftLayerTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTes
          
          Template template = context.getComputeService().templateBuilder().biggest().build();
          assertEquals(getCores(template.getHardware()), 8.0d);
-         assertEquals(template.getHardware().getRam(), 16*1024);
+         assertEquals(template.getHardware().getRam(), MAX_RAM);
          assertEquals(getSpace(template.getHardware()), 100.0d);
          assertEquals(template.getHardware().getVolumes().get(0).getType(), Volume.Type.LOCAL);
       } finally {
@@ -203,14 +205,14 @@ public class SoftLayerTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTes
    public void testBiggestTemplateBuilder() throws IOException {
       Template template = view.getComputeService().templateBuilder().biggest().build();
       assertEquals(getCores(template.getHardware()), 16.0d);
-      assertEquals(template.getHardware().getRam(), 16*1024);
+      assertEquals(template.getHardware().getRam(), MAX_RAM);
       assertEquals(getSpace(template.getHardware()), 100.0d);
       assertEquals(template.getHardware().getVolumes().get(0).getType(), Volume.Type.LOCAL);
    }
 
    @Override
    protected Set<String> getIso3166Codes() {
-      return ImmutableSet.<String> of("SG", "US-CA", "US-TX", "US-VA", "US-WA", "NL");
+      return ImmutableSet.<String> of("SG", "US-CA", "US-TX", "US-VA", "US-WA", "NL", "NSFTW-IL");
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemToImageTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemToImageTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemToImageTest.java
index 3a6426d..ebf439c 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemToImageTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/compute/functions/ProductItemToImageTest.java
@@ -20,11 +20,11 @@ import static org.jclouds.softlayer.compute.functions.ProductItemToImage.imageId
 import static org.jclouds.softlayer.compute.functions.ProductItemToImage.osBits;
 import static org.jclouds.softlayer.compute.functions.ProductItemToImage.osFamily;
 import static org.jclouds.softlayer.compute.functions.ProductItemToImage.osVersion;
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertFalse;
-import static org.testng.AssertJUnit.assertNotNull;
-import static org.testng.AssertJUnit.assertNull;
-import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
 
 import java.util.Arrays;
 import java.util.List;
@@ -125,8 +125,8 @@ public class ProductItemToImageTest {
          Image i = new ProductItemToImage().apply(item);
          OperatingSystem os = i.getOperatingSystem();
          assertNotNull(os);
-         assertEquals(OsFamily.UBUNTU, os.getFamily());
-         assertEquals("10.04",os.getVersion());
+         assertEquals(os.getFamily(), OsFamily.UBUNTU);
+         assertEquals(os.getVersion(), "10.04");
          assertTrue(os.is64Bit());
    }
 
@@ -139,8 +139,8 @@ public class ProductItemToImageTest {
       Image i = new ProductItemToImage().apply(item);
       OperatingSystem os = i.getOperatingSystem();
       assertNotNull(os);
-      assertEquals(OsFamily.UBUNTU, os.getFamily());
-      assertEquals("10.04",os.getVersion());
+      assertEquals(os.getFamily(), OsFamily.UBUNTU);
+      assertEquals(os.getVersion(), "10.04");
       assertFalse(os.is64Bit());
    }
 
@@ -154,7 +154,7 @@ public class ProductItemToImageTest {
       Image i = new ProductItemToImage().apply(item);
       OperatingSystem os = i.getOperatingSystem();
       assertNotNull(os);
-      assertEquals(OsFamily.UNRECOGNIZED, os.getFamily());
+      assertEquals(os.getFamily(), OsFamily.UNRECOGNIZED);
       assertNull(os.getVersion());
       assertFalse(os.is64Bit());
    }
@@ -168,7 +168,7 @@ public class ProductItemToImageTest {
       Image i = new ProductItemToImage().apply(item);
       OperatingSystem os = i.getOperatingSystem();
       assertNotNull(os);
-      assertEquals(OsFamily.UNRECOGNIZED, os.getFamily());
+      assertEquals(os.getFamily(), OsFamily.UNRECOGNIZED);
       assertNull(os.getVersion());
       assertTrue(os.is64Bit());
    }
@@ -189,16 +189,16 @@ public class ProductItemToImageTest {
    @Test
    public void testId() {
       ProductItemPrice price = ProductItemPrice.builder().id(1234).build();
-      ProductItem item = ProductItem.builder().prices(price).build();
-      assertEquals("1234",imageId().apply(item));
+      ProductItem item = ProductItem.builder().id(5678).prices(price).build();
+      assertEquals(imageId().apply(item), "1234", "Expected the ID of the ProductItemPrice to be returned");
    }
 
    @Test
    public void testIdManyPrices() {
       ProductItemPrice price1 = ProductItemPrice.builder().id(1234).build();
       ProductItemPrice price2 = ProductItemPrice.builder().id(5678).build();
-      ProductItem item = ProductItem.builder().prices(ImmutableSet.of(price1,price2)).build();
-      assertEquals("1234",imageId().apply(item));
+      ProductItem item = ProductItem.builder().id(9012).prices(ImmutableSet.of(price1,price2)).build();
+      assertEquals(imageId().apply(item), "1234", "Expected the ID of the ProductItemPrice to be returned");
    }
 
    @Test(expectedExceptions = NoSuchElementException.class)
@@ -214,17 +214,17 @@ public class ProductItemToImageTest {
 
    @Test
    public void testOsFamily() {
-      assertEquals(OsFamily.UBUNTU,osFamily().apply("Ubuntu Linux os"));
+      assertEquals(osFamily().apply("Ubuntu Linux os"), OsFamily.UBUNTU);
    }
 
    @Test
    public void testOsFamilyUnrecognized() {
-      assertEquals(OsFamily.UNRECOGNIZED,osFamily().apply("not a known operating system"));
+      assertEquals(osFamily().apply("not a known operating system"), OsFamily.UNRECOGNIZED);
    }
    
    @Test
    public void testOsFamilyNull() {
-      assertEquals(OsFamily.UNRECOGNIZED,osFamily().apply(null));
+      assertEquals(osFamily().apply(null), OsFamily.UNRECOGNIZED);
    }
 
    @Test
@@ -249,7 +249,7 @@ public class ProductItemToImageTest {
 
    @Test
    public void testOsVersion() {
-      assertEquals("2099",osVersion().apply("Windows Server 2099 (256 bit)"));
+      assertEquals(osVersion().apply("Windows Server 2099 (256 bit)"), "2099");
    }
 
    @Test

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/features/AccountClientExpectTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/AccountClientExpectTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/AccountClientExpectTest.java
new file mode 100644
index 0000000..651dbab
--- /dev/null
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/AccountClientExpectTest.java
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.softlayer.features;
+
+import com.google.common.collect.ImmutableSet;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.rest.internal.BaseRestClientExpectTest;
+import org.jclouds.softlayer.SoftLayerClient;
+import org.jclouds.softlayer.domain.ProductPackage;
+import org.testng.annotations.Test;
+
+import java.net.URI;
+
+import static org.testng.Assert.assertEquals;
+
+/**
+ *
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "AccountClientExpectTest")
+public class AccountClientExpectTest extends BaseRestClientExpectTest<SoftLayerClient> {
+
+   public static String ACTIVE_PACKAGE_MASK = "id;name";
+
+   public AccountClientExpectTest() {
+     provider = "softlayer";
+   }
+
+   public void testGetActivePackagesWhenResponseIs2xx() {
+
+      SoftLayerClient client = requestSendsResponse(HttpRequest.builder().method("GET")
+                      .endpoint("https://api.softlayer.com/rest/v3/SoftLayer_Account/ActivePackages.json")
+                      .addHeader("Accept", "application/json")
+                      .addHeader("Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==")
+                      .build(),
+
+              HttpResponse.builder()
+                      .statusCode(200)
+                      .payload(payloadFromResource("/get_active_packages.json"))
+                      .build());
+
+
+
+      assertEquals(client.getAccountClient().getActivePackages(),
+              ImmutableSet.of(
+                      ProductPackage.builder()
+                              .id(13)
+                              .name("Dual Xeon (Dual Core) Woodcrest/Cloverton")
+                              .description("<div class=\"PageTopicSubHead\">Dual Processor Multi-core Servers</div>")
+                              .build(),
+                      ProductPackage.builder()
+                              .id(15)
+                              .name("Single Xeon (Dual Core) Woodcrest/Cloverton")
+                              .description("<div class=\"PageTopicSubHead\">Single Processor Multi-core Servers</div>")
+                              .build()));
+   }
+
+   public void testGetActivePackagesWhenResponseIs404() {
+      SoftLayerClient client = requestSendsResponse(HttpRequest.builder()
+                        .method("GET")
+                        .endpoint("https://api.softlayer.com/rest/v3/SoftLayer_Account/ActivePackages.json")
+                        .addHeader("Accept", "application/json")
+                        .addHeader("Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==")
+                        .build(),
+                HttpResponse.builder()
+                            .statusCode(404)
+                            .build());
+
+      assertEquals(client.getAccountClient().getActivePackages(), null);
+   }
+
+   public void testGetReducedActivePackagesWhenResponseIs2xx() {
+      SoftLayerClient client = requestSendsResponse(
+             HttpRequest.builder().method("GET")
+                     .endpoint("https://api.softlayer.com/rest/v3/SoftLayer_Account/ActivePackages.json")
+                     .addHeader("Accept", "application/json")
+                     .addHeader("Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==")
+                     .addQueryParam("objectMask", ACTIVE_PACKAGE_MASK)
+                     .build(),
+
+             HttpResponse.builder()
+                     .statusCode(200)
+                     .payload(payloadFromResource("/get_reduced_active_packages.json"))
+                     .build());
+
+      assertEquals(client.getAccountClient().getReducedActivePackages(),
+             ImmutableSet.of(
+                     ProductPackage.builder()
+                             .id(13)
+                             .name("Dual Xeon (Dual Core) Woodcrest/Cloverton")
+                             .description("<div class=\"PageTopicSubHead\">Dual Processor Multi-core Servers</div>")
+                             .build(),
+                     ProductPackage.builder()
+                             .id(15)
+                             .name("Single Xeon (Dual Core) Woodcrest/Cloverton")
+                             .description("<div class=\"PageTopicSubHead\">Single Processor Multi-core Servers</div>")
+                             .build()));
+   }
+
+   public void testGetReducedActivePackagesWhenResponseIs404() {
+      SoftLayerClient client = requestSendsResponse(
+             HttpRequest.builder()
+                     .method("GET")
+                     .endpoint("https://api.softlayer.com/rest/v3/SoftLayer_Account/ActivePackages.json")
+                     .addHeader("Accept", "application/json")
+                     .addHeader("Authorization", "Basic aWRlbnRpdHk6Y3JlZGVudGlhbA==")
+                     .addQueryParam("objectMask", ACTIVE_PACKAGE_MASK)
+                     .build(),
+             HttpResponse.builder()
+                     .statusCode(404)
+                     .build());
+      assertEquals(client.getAccountClient().getReducedActivePackages(), null);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/features/AccountClientLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/AccountClientLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/AccountClientLiveTest.java
index 936c784..5c85e48 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/AccountClientLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/AccountClientLiveTest.java
@@ -20,6 +20,7 @@ import static org.testng.Assert.assertTrue;
 
 import java.util.Set;
 
+import org.jclouds.softlayer.domain.ProductItem;
 import org.jclouds.softlayer.domain.ProductPackage;
 import org.testng.annotations.Test;
 
@@ -37,11 +38,14 @@ public class AccountClientLiveTest extends BaseSoftLayerClientLiveTest {
       assert null != response;
 
       assertTrue(response.size() >= 0);
-      for (ProductPackage productPackage: response) {
+      for (ProductPackage p : response) {
+          ProductPackage productPackage = api.getProductPackageClient().getProductPackage(p.getId());
           assert productPackage.getId() > 0 : response;
           assert productPackage.getName() != null : response;
-          assert productPackage.getDescription() != null : response;
-          assertTrue(productPackage.getItems().isEmpty());
+
+          for (ProductItem item : productPackage.getItems()) {
+              checkProductItem(item);
+          }
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/features/BaseSoftLayerClientLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/BaseSoftLayerClientLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/BaseSoftLayerClientLiveTest.java
index 109a0aa..3cd9f5e 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/BaseSoftLayerClientLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/BaseSoftLayerClientLiveTest.java
@@ -17,9 +17,17 @@
 package org.jclouds.softlayer.features;
 
 import org.jclouds.apis.BaseApiLiveTest;
+import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.softlayer.SoftLayerClient;
+import org.jclouds.softlayer.domain.ProductItem;
+import org.jclouds.softlayer.domain.ProductItemCategory;
+import org.jclouds.softlayer.domain.ProductItemPrice;
 import org.testng.annotations.Test;
 
+import java.util.Set;
+
+import static org.testng.Assert.*;
+
 /**
  * Tests behavior of {@code SoftLayerClient}
  * 
@@ -31,4 +39,31 @@ public class BaseSoftLayerClientLiveTest extends BaseApiLiveTest<SoftLayerClient
    public BaseSoftLayerClientLiveTest() {
       this.provider = "softlayer";
    }
+
+   public void checkProductItem(ProductItem item) {
+      assertTrue(item.getId() > 0, "item id must be more than 0");
+      assertNotNull(item.getDescription(), "item description must be not null");
+      checkCategories(item.getCategories());
+      // units and capacity may be null
+      assertFalse(item.getPrices().isEmpty());
+      for (ProductItemPrice price : item.getPrices()) {
+         checkPrice(price);
+      }
+   }
+
+   public void checkCategories(Set<ProductItemCategory> categories) {
+      for (ProductItemCategory category : categories) {
+         assertTrue(category.getId() > 0, "category id must be more than 0");
+         assertNotNull(category.getName(), "category name must be not null");
+         assertNotNull(category.getCategoryCode(), "category code must be not null");
+      }
+   }
+
+   public void checkPrice(ProductItemPrice price) {
+      assertTrue(price.getId() > 0, "price id must be more than 0");
+      assertTrue(price.getItemId() > 0, "price itemId must be more than 0");
+      assertTrue(price.getRecurringFee() != null || price.getHourlyRecurringFee() != null,
+              "price.getRecurringFee() must be not null OR price.getHourlyRecurringFee() must be not null");
+   }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/features/DatacenterClientLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/DatacenterClientLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/DatacenterClientLiveTest.java
index 438efd1..dec0437 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/DatacenterClientLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/DatacenterClientLiveTest.java
@@ -54,19 +54,16 @@ public class DatacenterClientLiveTest extends BaseSoftLayerClientLiveTest {
       Builder<Datacenter> builder = ImmutableSet.builder();
       builder.add(Datacenter.builder().id(265592).name("ams01").longName("Amsterdam 1").build());
       builder.add(Datacenter.builder().id(3).name("dal01").longName("Dallas").build());
-      builder.add(Datacenter.builder().id(18171).name("sea01").longName("Seattle").build());
-      builder.add(Datacenter.builder().id(168642).name("sjc01").longName("San Jose 1").build());
-      builder.add(Datacenter.builder().id(2).name("dal00").longName("Corporate HQ").build());
-      builder.add(Datacenter.builder().id(37473).name("wdc01").longName("Washington, DC").build());
       builder.add(Datacenter.builder().id(154770).name("dal02").longName("Dallas 2").build());
-      builder.add(Datacenter.builder().id(138124).name("dal05").longName("Dallas 5").build());
-      builder.add(Datacenter.builder().id(167093).name("hou01").longName("Houston 1").build());
-      builder.add(Datacenter.builder().id(167094).name("lon01").longName("London 1").build());
       builder.add(Datacenter.builder().id(167092).name("dal04").longName("Dallas 4").build());
-      builder.add(Datacenter.builder().id(224092).name("sng01").longName("Singapore 1").build());
-      builder.add(Datacenter.builder().id(142775).name("hou02").longName("Houston 2").build());
-      builder.add(Datacenter.builder().id(142776).name("dal07").longName("Dallas 7").build());
+      builder.add(Datacenter.builder().id(138124).name("dal05").longName("Dallas 5").build());
       builder.add(Datacenter.builder().id(154820).name("dal06").longName("Dallas 6").build());
+      builder.add(Datacenter.builder().id(142776).name("dal07").longName("Dallas 7").build());
+      builder.add(Datacenter.builder().id(142775).name("hou02").longName("Houston 2").build());
+      builder.add(Datacenter.builder().id(18171).name("sea01").longName("Seattle").build());
+      builder.add(Datacenter.builder().id(168642).name("sjc01").longName("San Jose 1").build());
+      builder.add(Datacenter.builder().id(224092).name("sng01").longName("Singapore 1").build());
+      builder.add(Datacenter.builder().id(37473).name("wdc01").longName("Washington, DC").build());
       Set<Datacenter> response = api().listDatacenters();
       Set<Datacenter> expected = builder.build();
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/features/ProductPackageClientLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/ProductPackageClientLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/ProductPackageClientLiveTest.java
index 7d3dc9c..caf5b16 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/ProductPackageClientLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/ProductPackageClientLiveTest.java
@@ -79,22 +79,18 @@ public class ProductPackageClientLiveTest extends BaseSoftLayerClientLiveTest {
 
    @Test
    public void testGetProductPackage() {
-      for (ProductPackage productPackage : accountClient.getActivePackages()) {
+      for (ProductPackage productPackage : accountClient.getReducedActivePackages()) {
          ProductPackage response = client.getProductPackage(productPackage.getId());
 
          assert null != response;
          assert response.getId() > 0 : response;
          assert response.getName() != null : response;
-         assert response.getDescription() != null : response;
 
          assertTrue(response.getItems().size() >= 0);
          for (ProductItem item : response.getItems()) {
-            // ProductItem newDetails = client.getProductItem(item.getId());
-            // assertEquals(item.getId(), newDetails.getId());
             checkProductItem(item);
          }
 
-         assertTrue(response.getDatacenters().size() > 0);
          for (Datacenter datacenter : response.getDatacenters()) {
             checkDatacenter(datacenter);
          }
@@ -127,8 +123,6 @@ public class ProductPackageClientLiveTest extends BaseSoftLayerClientLiveTest {
 
    @Test
    public void testGetOneGBRamPrice() {
-      // Predicate p =
-      // Predicates.and(ProductItemPredicates.categoryCode("ram"),ProductItemPredicates.capacity(1.0f));
       Iterable<ProductItem> ramItems = Iterables.filter(cloudServerProductPackage.getItems(),
             Predicates.and(categoryCode("ram"), capacity(1.0f)));
 
@@ -166,28 +160,6 @@ public class ProductPackageClientLiveTest extends BaseSoftLayerClientLiveTest {
       assert Integer.valueOf(1693).equals(price.getId());
    }
 
-   private void checkProductItem(ProductItem item) {
-      assert item.getId() > 0 : item;
-      assert item.getDescription() != null : item;
-      checkCategories(item.getCategories());
-      // units and capacity may be null
-
-      assertTrue(item.getPrices().size() >= 0);
-
-      for (ProductItemPrice price : item.getPrices()) {
-         // ProductItemPrice newDetails =
-         // client.getProductItemPrice(prices.getId());
-         // assertEquals(item.getId(), newDetails.getId());
-         checkPrice(price);
-      }
-   }
-
-   private void checkPrice(ProductItemPrice price) {
-      assert price.getId() > 0 : price;
-      assert price.getItemId() > 0 : price;
-      assert price.getRecurringFee() != null || price.getHourlyRecurringFee() != null : price;
-   }
-
    private void checkDatacenter(Datacenter datacenter) {
       assert datacenter.getId() > 0 : datacenter;
       assert datacenter.getName() != null : datacenter;
@@ -207,12 +179,4 @@ public class ProductPackageClientLiveTest extends BaseSoftLayerClientLiveTest {
       if (!ImmutableSet.of("SG", "NL").contains(address.getCountry()))
          assert address.getState() != null : address;
    }
-
-   private void checkCategories(Set<ProductItemCategory> categories) {
-      for (ProductItemCategory category : categories) {
-         assert category.getId() > 0 : category;
-         assert category.getName() != null : category;
-         assert category.getCategoryCode() != null : category;
-      }
-   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f2784503/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestClientLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestClientLiveTest.java b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestClientLiveTest.java
index ad9a4fb..4fc9add 100644
--- a/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestClientLiveTest.java
+++ b/providers/softlayer/src/test/java/org/jclouds/softlayer/features/VirtualGuestClientLiveTest.java
@@ -16,6 +16,9 @@
  */
 package org.jclouds.softlayer.features;
 
+import static com.google.common.base.Predicates.and;
+import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.get;
 import static org.jclouds.softlayer.predicates.ProductItemPredicates.capacity;
 import static org.jclouds.softlayer.predicates.ProductItemPredicates.categoryCode;
 import static org.jclouds.softlayer.predicates.ProductItemPredicates.units;
@@ -29,6 +32,9 @@ import java.util.Properties;
 import java.util.Random;
 import java.util.Set;
 
+import com.google.common.base.Splitter;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.softlayer.SoftLayerClient;
 import org.jclouds.softlayer.compute.functions.ProductItems;
 import org.jclouds.softlayer.domain.ProductItem;
@@ -51,13 +57,14 @@ import com.google.inject.TypeLiteral;
 
 /**
  * Tests behavior of {@code VirtualGuestClient}
- * 
+ *
  * @author Adrian Cole
  */
 @Test(groups = "live")
 public class VirtualGuestClientLiveTest extends BaseSoftLayerClientLiveTest {
 
    private static final String TEST_HOSTNAME_PREFIX = "livetest";
+   private TemplateBuilder templateBuilder;
 
    @Test
    public void testListVirtualGuests() throws Exception {
@@ -71,11 +78,8 @@ public class VirtualGuestClientLiveTest extends BaseSoftLayerClientLiveTest {
       }
    }
 
-   @Test(enabled = false, groups = "live")
+   @Test(groups = "live")
    public void testCancelAndPlaceOrder() {
-
-      // This method was not working needs testing out.
-
       // TODO: Should also check if there are active transactions before trying to cancel.
       // objectMask: virtualGuests.activeTransaction
       for (VirtualGuest guest : api().listVirtualGuests()) {
@@ -90,43 +94,22 @@ public class VirtualGuestClientLiveTest extends BaseSoftLayerClientLiveTest {
                named(ProductPackageClientLiveTest.CLOUD_SERVER_PACKAGE_NAME)).getId();
       ProductPackage productPackage = api.getProductPackageClient().getProductPackage(pkgId);
 
-      Iterable<ProductItem> ramItems = Iterables.filter(productPackage.getItems(), Predicates.and(categoryCode("ram"),
-               capacity(2.0f)));
-
-      Map<Float, ProductItem> ramToProductItem = Maps.uniqueIndex(ramItems, ProductItems.capacity());
-
-      ProductItemPrice ramPrice = ProductItems.price().apply(ramToProductItem.get(2.0f));
-
-      Iterable<ProductItem> cpuItems = Iterables.filter(productPackage.getItems(), Predicates.and(
-               units("PRIVATE_CORE"), capacity(2.0f)));
-      Map<Float, ProductItem> coresToProductItem = Maps.uniqueIndex(cpuItems, ProductItems.capacity());
-
-      ProductItemPrice cpuPrice = ProductItems.price().apply(coresToProductItem.get(2.0f));
-
-      Iterable<ProductItem> operatingSystems = Iterables.filter(productPackage.getItems(), categoryCode("os"));
-      Map<String, ProductItem> osToProductItem = Maps.uniqueIndex(operatingSystems, ProductItems.description());
-      ProductItemPrice osPrice = ProductItems.price().apply(
-               osToProductItem.get("Ubuntu Linux 8 LTS Hardy Heron - Minimal Install (64 bit)"));
-
-      Builder<ProductItemPrice> prices = ImmutableSet.builder();
-      prices.addAll(defaultPrices);
-      prices.add(ramPrice);
-      prices.add(cpuPrice);
-      prices.add(osPrice);
-
       VirtualGuest guest = VirtualGuest.builder().domain("jclouds.org").hostname(
                TEST_HOSTNAME_PREFIX + new Random().nextInt()).build();
 
-      ProductOrder order = ProductOrder.builder().packageId(pkgId).quantity(1).useHourlyPricing(true).prices(
-               prices.build()).virtualGuests(guest).build();
+      Template template = templateBuilder.build();
+
+      ProductOrder order = ProductOrder.builder()
+              .packageId(productPackage.getId())
+              .quantity(1)
+              .location(template.getLocation().getId())
+              .useHourlyPricing(true)
+              .prices(getPrices(template, productPackage))
+              .virtualGuests(guest).build();
 
       ProductOrderReceipt receipt = api().orderVirtualGuest(order);
       ProductOrder order2 = receipt.getOrderDetails();
-      VirtualGuest result = Iterables.get(order2.getVirtualGuests(), 0);
-
-      ProductOrder order3 = api().getOrderTemplate(result.getId());
-
-      assertEquals(order.getPrices(), order3.getPrices());
+      assertEquals(order.getPrices(), order2.getPrices());
       assertNotNull(receipt);
    }
 
@@ -135,6 +118,7 @@ public class VirtualGuestClientLiveTest extends BaseSoftLayerClientLiveTest {
    @Override
    protected SoftLayerClient create(Properties props, Iterable<Module> modules) {
       Injector injector = newBuilder().modules(modules).overrides(props).buildInjector();
+      templateBuilder = injector.getInstance(TemplateBuilder.class);
       defaultPrices = injector.getInstance(Key.get(new TypeLiteral<Iterable<ProductItemPrice>>() {
       }));
       return injector.getInstance(SoftLayerClient.class);
@@ -157,8 +141,6 @@ public class VirtualGuestClientLiveTest extends BaseSoftLayerClientLiveTest {
       assert vg.getMaxCpu() > 0 : vg;
       assert vg.getMaxCpuUnits() != null : vg;
       assert vg.getMaxMemory() > 0 : vg;
-      assert vg.getMetricPollDate() != null : vg;
-      assert vg.getModifyDate() != null : vg;
       assert vg.getStartCpus() > 0 : vg;
       assert vg.getStatusId() >= 0 : vg;
       assert vg.getUuid() != null : vg;
@@ -166,4 +148,22 @@ public class VirtualGuestClientLiveTest extends BaseSoftLayerClientLiveTest {
       assert vg.getPrimaryIpAddress() != null : vg;
    }
 
+   private Iterable<ProductItemPrice> getPrices(Template template, ProductPackage productPackage) {
+      Builder<ProductItemPrice> result = ImmutableSet.builder();
+
+      int imageId = Integer.parseInt(template.getImage().getId());
+      result.add(ProductItemPrice.builder().id(imageId).build());
+
+      Iterable<String> hardwareIds = Splitter.on(",").split(template.getHardware().getId());
+      for (String hardwareId : hardwareIds) {
+         int id = Integer.parseInt(hardwareId);
+         result.add(ProductItemPrice.builder().id(id).build());
+      }
+      float portSpeed = 10f;
+      ProductItem uplinkItem = find(productPackage.getItems(),
+              and(capacity(portSpeed), categoryCode("port_speed")));
+      result.add(get(uplinkItem.getPrices(), 0));
+      result.addAll(defaultPrices);
+      return result.build();
+   }
 }