You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by de...@apache.org on 2016/02/19 16:33:41 UTC

[31/35] jclouds git commit: JCLOUDS-947: Properly configure live tests in ProfitBricks

JCLOUDS-947: Properly configure live tests in ProfitBricks


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

Branch: refs/heads/master
Commit: 52c6c2b7b5acf48fcddbfe7c043b133f0fc71c00
Parents: 5e82bbf
Author: Reijhanniel Jearl Campos <de...@gmail.com>
Authored: Sat Nov 14 08:23:58 2015 +0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Nov 18 22:35:05 2015 +0100

----------------------------------------------------------------------
 .../DeregisterLoadBalancerRequestBinder.java    |   4 +-
 .../RegisterLoadBalancerRequestBinder.java      |   6 +-
 ...ProfitBricksComputeServiceContextModule.java |  93 +++++++++-
 .../internal/ProvisioningStatusAware.java       |  27 ---
 .../ProvisioningStatusPollingPredicate.java     |  70 --------
 .../config/ProfitBricksComputeProperties.java   |   1 +
 .../jclouds/profitbricks/domain/Location.java   |   5 +
 .../profitbricks/features/IpBlockApi.java       |   5 +-
 .../profitbricks/features/LoadBalancerApi.java  |  15 +-
 .../jclouds/profitbricks/features/NicApi.java   |  16 +-
 .../LoadBalancerIdOnlyResponseHandler.java      |  51 ++++++
 .../parser/nic/NicIdOnlyResponseHandler.java    |  51 ++++++
 .../profitbricks/BaseProfitBricksLiveTest.java  | 161 +++++++++++++++--
 ...DeregisterLoadBalancerRequestBinderTest.java |  17 +-
 .../RegisterLoadBalancerRequestBinderTest.java  |  18 +-
 ...ofitBricksComputeServiceAdapterLiveTest.java |  74 --------
 .../ProfitBricksComputeServiceLiveTest.java     | 142 +++++++++++++++
 .../compute/config/StatusPredicateTest.java     | 145 ++++++++++++++++
 .../ProvisioningStatusPollingPredicateTest.java | 173 -------------------
 .../features/DataCenterApiLiveTest.java         |  16 +-
 .../features/DrivesApiLiveTest.java             |  64 +++----
 .../features/FirewallApiLiveTest.java           | 110 ++++++------
 .../profitbricks/features/ImageApiLiveTest.java |  30 ++--
 .../features/IpBlockApiLiveTest.java            |  63 ++++---
 .../features/IpBlockApiMockTest.java            |   4 +-
 .../features/LoadBalancerApiLiveTest.java       | 127 ++++++++------
 .../features/LoadBalancerApiMockTest.java       |  31 ++--
 .../profitbricks/features/NicApiLiveTest.java   | 104 +++++------
 .../profitbricks/features/NicApiMockTest.java   |  27 +--
 .../features/ServerApiLiveTest.java             |  71 +++-----
 .../features/SnapshotApiLiveTest.java           | 133 +++++++-------
 .../features/StorageApiLiveTest.java            |  65 +++----
 .../LoadBalancerIdOnlyResponseHandlerTest.java  |  41 +++++
 .../nic/NicIdOnlyResponseHandlerTest.java       |  40 +++++
 .../loadbalancer/loadbalancer-create.xml        |  28 ++-
 .../loadbalancer/loadbalancer-deregister.xml    |  26 ++-
 .../loadbalancer/loadbalancer-register.xml      |  32 ++--
 .../loadbalancer/loadbalancer-update.xml        |  27 ++-
 .../src/test/resources/logback-test.xml         |  74 ++++++++
 .../src/test/resources/nic/nic-delete.xml       |  21 ++-
 .../test/resources/nic/nic-internetaccess.xml   |  23 +--
 .../src/test/resources/nic/nic-update.xml       |  27 ++-
 42 files changed, 1344 insertions(+), 914 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
index ba237c4..086fa3d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
@@ -31,12 +31,10 @@ public class DeregisterLoadBalancerRequestBinder extends BaseProfitBricksRequest
 
    @Override
    protected String createPayload(LoadBalancer.Request.DeregisterPayload payload) {
-      requestBuilder.append("<ws:deregisterServersOnLoadBalancer>")
-              .append("<request>");
+      requestBuilder.append("<ws:deregisterServersOnLoadBalancer>");
       for (String s : payload.serverIds())
          requestBuilder.append(format("<serverIds>%s</serverIds>", s));
       requestBuilder.append(format("<loadBalancerId>%s</loadBalancerId>", payload.id()))
-              .append("</request>")
               .append("</ws:deregisterServersOnLoadBalancer>");
 
       return requestBuilder.toString();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
index 21f1d84..3741dad 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
@@ -32,14 +32,12 @@ public class RegisterLoadBalancerRequestBinder extends BaseProfitBricksRequestBi
    @Override
    protected String createPayload(LoadBalancer.Request.RegisterPayload payload) {
       requestBuilder
-              .append("<ws:registerServersOnLoadBalancer>").append("<request>")
+              .append("<ws:registerServersOnLoadBalancer>")
               .append(format("<loadBalancerId>%s</loadBalancerId>", payload.id()));
 
       for (String s : payload.serverIds())
          requestBuilder.append(format("<serverIds>%s</serverIds>", s));
-      requestBuilder
-              .append("</request>")
-              .append("</ws:registerServersOnLoadBalancer>");
+      requestBuilder.append("</ws:registerServersOnLoadBalancer>");
 
       return requestBuilder.toString().replaceAll("\\s+", "");
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
index 2b45d18..b3fe313 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
@@ -16,10 +16,15 @@
  */
 package org.jclouds.profitbricks.compute.config;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
 import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PERIOD;
 import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_MAX_PERIOD;
 import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_SNAPSHOT;
 import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_TIMEOUT;
+import static org.jclouds.util.Predicates2.retry;
 
 import java.util.concurrent.TimeUnit;
 
@@ -49,11 +54,8 @@ import org.jclouds.profitbricks.compute.function.LocationToLocation;
 import org.jclouds.profitbricks.compute.function.ProvisionableToImage;
 import org.jclouds.profitbricks.compute.function.ServerToNodeMetadata;
 import org.jclouds.profitbricks.compute.function.StorageToVolume;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Provisionable;
-import org.jclouds.util.Predicates2;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
@@ -101,10 +103,26 @@ public class ProfitBricksComputeServiceContextModule extends
    @Provides
    @Singleton
    @Named(POLL_PREDICATE_DATACENTER)
-   Predicate<String> provideWaitDataCenterUntilAvailablePredicate(
+   Predicate<String> provideDataCenterAvailablePredicate(
            final ProfitBricksApi api, ComputeConstants constants) {
-      return Predicates2.retry(new ProvisioningStatusPollingPredicate(
-              api, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE),
+      return retry(new DataCenterProvisioningStatePredicate(
+              api, ProvisioningState.AVAILABLE),
+              constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS);
+   }
+
+   @Provides
+   @Named(TIMEOUT_NODE_RUNNING)
+   Predicate<String> provideServerRunningPredicate(final ProfitBricksApi api, ComputeConstants constants) {
+      return retry(new ServerStatusPredicate(
+              api, Server.Status.RUNNING),
+              constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS);
+   }
+
+   @Provides
+   @Named(TIMEOUT_NODE_SUSPENDED)
+   Predicate<String> provideServerSuspendedPredicate(final ProfitBricksApi api, ComputeConstants constants) {
+      return retry(new ServerStatusPredicate(
+              api, Server.Status.SHUTOFF),
               constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS);
    }
 
@@ -117,6 +135,69 @@ public class ProfitBricksComputeServiceContextModule extends
       return provisioningManager;
    }
 
+   @Provides
+   @Singleton
+   @Named(POLL_PREDICATE_SNAPSHOT)
+   Predicate<String> provideSnapshotAvailablePredicate(final ProfitBricksApi api, ComputeConstants constants) {
+      return retry(new SnapshotProvisioningStatePredicate(
+              api, ProvisioningState.AVAILABLE),
+              constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS);
+   }
+
+   static class DataCenterProvisioningStatePredicate implements Predicate<String> {
+
+      private final ProfitBricksApi api;
+      private final ProvisioningState expectedState;
+
+      public DataCenterProvisioningStatePredicate(ProfitBricksApi api, ProvisioningState expectedState) {
+         this.api = checkNotNull(api, "api must not be null");
+         this.expectedState = checkNotNull(expectedState, "expectedState must not be null");
+      }
+
+      @Override
+      public boolean apply(String input) {
+         checkNotNull(input, "datacenter id");
+         return api.dataCenterApi().getDataCenterState(input) == expectedState;
+      }
+
+   }
+
+   static class ServerStatusPredicate implements Predicate<String> {
+
+      private final ProfitBricksApi api;
+      private final Server.Status expectedStatus;
+
+      public ServerStatusPredicate(ProfitBricksApi api, Server.Status expectedStatus) {
+         this.api = checkNotNull(api, "api must not be null");
+         this.expectedStatus = checkNotNull(expectedStatus, "expectedStatus must not be null");
+      }
+
+      @Override
+      public boolean apply(String input) {
+         checkNotNull(input, "server id");
+         return api.serverApi().getServer(input).status() == expectedStatus;
+      }
+
+   }
+
+   static class SnapshotProvisioningStatePredicate implements Predicate<String> {
+
+      private final ProfitBricksApi api;
+      private final ProvisioningState expectedState;
+
+      public SnapshotProvisioningStatePredicate(ProfitBricksApi api, ProvisioningState expectedState) {
+         this.api = checkNotNull(api, "api must not be null");
+         this.expectedState = checkNotNull(expectedState, "expectedState must not be null");
+      }
+
+      @Override
+      public boolean apply(String input) {
+         checkNotNull(input, "snapshot id");
+         return api.snapshotApi().getSnapshot(input).state() == expectedState;
+      }
+
+   }
+
    @Singleton
    public static class ComputeConstants {
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
deleted file mode 100644
index bd00a3d..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * 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.profitbricks.compute.internal;
-
-/**
- * An enumeration of ProfitBricks domain classes containing a property 'ProvisioningState'.
- *
- * @see ProvisioningStatusPollingPredicate
- */
-public enum ProvisioningStatusAware {
-
-   DATACENTER, SERVER, STORAGE, NIC, SNAPSHOT;
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
deleted file mode 100644
index 41c3e93..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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.profitbricks.compute.internal;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.domain.ProvisioningState;
-
-import com.google.common.base.Predicate;
-import org.jclouds.rest.ResourceNotFoundException;
-
-/**
- * A custom predicate for waiting until a virtual resource satisfies the given expected status
- * <p>
- * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some
- * cases, the API user gets blocked from further requests, and will then need to contact tech support for api lock
- * release.
- */
-public class ProvisioningStatusPollingPredicate implements Predicate<String> {
-
-   private final ProfitBricksApi api;
-   private final ProvisioningStatusAware domain;
-   private final ProvisioningState expect;
-
-   public ProvisioningStatusPollingPredicate(ProfitBricksApi api, ProvisioningStatusAware domain, ProvisioningState expect) {
-      this.api = checkNotNull(api, "API null");
-      this.expect = checkNotNull(expect, "Expected state null");
-      this.domain = checkNotNull(domain, "Domain null");
-   }
-
-   @Override
-   public boolean apply(String input) {
-      checkNotNull(input, "Virtual item id can't be null.");
-      try {
-         switch (domain) {
-            case DATACENTER:
-               return expect == api.dataCenterApi().getDataCenterState(input);
-            case SERVER:
-               return expect == api.serverApi().getServer(input).state();
-            case STORAGE:
-               return expect == api.storageApi().getStorage(input).state();
-            case NIC:
-               return expect == api.nicApi().getNic(input).state();
-            case SNAPSHOT:
-               return expect == api.snapshotApi().getSnapshot(input).state();
-            default:
-               throw new IllegalArgumentException("Unknown domain '" + domain + "'");
-         }
-      } catch (ResourceNotFoundException ex) {
-         // After provisioning, a node might still not be "fetchable" via API
-         return false;
-      }
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java
index 19b0e53..8f5840d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java
@@ -19,6 +19,7 @@ package org.jclouds.profitbricks.config;
 public class ProfitBricksComputeProperties {
 
    public static final String POLL_PREDICATE_DATACENTER = "jclouds.profitbricks.predicate.datacenter";
+   public static final String POLL_PREDICATE_SNAPSHOT = "jclouds.profitbricks.predicate.snapshot";
 
    public static final String POLL_TIMEOUT = "jclouds.profitbricks.poll.timeout";
    public static final String POLL_PERIOD = "jclouds.profitbricks.operation.poll.initial-period";

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
index 6102a42..834fa86 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
@@ -52,4 +52,9 @@ public enum Location {
             return location;
       return UNRECOGNIZED;
    }
+
+   @Override
+   public String toString() {
+      return id;
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java
index a81293e..ca9841d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java
@@ -17,14 +17,17 @@
 package org.jclouds.profitbricks.features;
 
 import java.util.List;
+
 import javax.inject.Named;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+
 import org.jclouds.Fallbacks;
 import org.jclouds.http.filters.BasicAuthentication;
 import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
 import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
 import org.jclouds.profitbricks.http.parser.ipblock.IpBlockListResponseHandler;
@@ -58,7 +61,7 @@ public interface IpBlockApi {
    @Named("publicipblock:reserve")
    @Payload("<ws:reservePublicIpBlock><request><blockSize>{blockSize}</blockSize><location>{location}</location></request></ws:reservePublicIpBlock>")
    @XMLResponseParser(IpBlockResponseHandler.class)
-   IpBlock reservePublicIpBlock(@PayloadParam("blockSize") String blockSize, @PayloadParam("location") String location);
+   IpBlock reservePublicIpBlock(@PayloadParam("blockSize") int blockSize, @PayloadParam("location") Location location);
 
    @POST
    @Named("publicipblock:addip")

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
index 3d37183..6cf8e23 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
@@ -21,7 +21,9 @@ import javax.ws.rs.Consumes;
 import javax.ws.rs.POST;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
+
 import java.util.List;
+
 import org.jclouds.Fallbacks;
 import org.jclouds.http.filters.BasicAuthentication;
 import org.jclouds.profitbricks.binder.loadbalancer.CreateLoadBalancerRequestBinder;
@@ -31,6 +33,7 @@ import org.jclouds.profitbricks.binder.loadbalancer.UpdateLoadBalancerRequestBin
 import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
 import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.loadbalancer.LoadBalancerIdOnlyResponseHandler;
 import org.jclouds.profitbricks.http.parser.loadbalancer.LoadBalancerListResponseHandler;
 import org.jclouds.profitbricks.http.parser.loadbalancer.LoadBalancerResponseHandler;
 import org.jclouds.rest.annotations.Fallback;
@@ -62,7 +65,7 @@ public interface LoadBalancerApi {
    @POST
    @Named("loadbalancer:create")
    @MapBinder(CreateLoadBalancerRequestBinder.class)
-   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   @XMLResponseParser(LoadBalancerIdOnlyResponseHandler.class)
    String createLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.CreatePayload payload);
 
    @POST
@@ -72,10 +75,10 @@ public interface LoadBalancerApi {
    LoadBalancer registerLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.RegisterPayload payload);
 
    @POST
-   @Named("loadbalancer:Deregister")
+   @Named("loadbalancer:deregister")
    @MapBinder(DeregisterLoadBalancerRequestBinder.class)
-   @XMLResponseParser(LoadBalancerResponseHandler.class)
-   LoadBalancer deregisterLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.DeregisterPayload payload);
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String deregisterLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.DeregisterPayload payload);
 
    @POST
    @Named("loadbalancer:delete")
@@ -85,6 +88,6 @@ public interface LoadBalancerApi {
    @POST
    @Named("loadbalancer:update")
    @MapBinder(UpdateLoadBalancerRequestBinder.class)
-   @XMLResponseParser(LoadBalancerResponseHandler.class)
-   LoadBalancer updateLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.UpdatePayload payload);
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String updateLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.UpdatePayload payload);
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java
index 57e425f..c945935 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java
@@ -37,8 +37,12 @@ import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.POST;
+
 import java.util.List;
 
+import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.nic.NicIdOnlyResponseHandler;
+
 @RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
 @Consumes(MediaType.TEXT_XML)
 @Produces(MediaType.TEXT_XML)
@@ -54,8 +58,8 @@ public interface NicApi {
    @POST
    @Named("nic:create")
    @MapBinder(CreateNicRequestBinder.class)
-   @XMLResponseParser(NicResponseHandler.class)
-   Nic createNic(@PayloadParam("nic") Nic.Request.CreatePayload payload);
+   @XMLResponseParser(NicIdOnlyResponseHandler.class)
+   String createNic(@PayloadParam("nic") Nic.Request.CreatePayload payload);
 
    @POST
    @Named("nic:get")
@@ -67,14 +71,14 @@ public interface NicApi {
    @POST
    @Named("nic:update")
    @MapBinder(UpdateNicRequestBinder.class)
-   @XMLResponseParser(NicResponseHandler.class)
-   Nic updateNic(@PayloadParam("nic") Nic.Request.UpdatePayload payload);
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String updateNic(@PayloadParam("nic") Nic.Request.UpdatePayload payload);
 
    @POST
    @Named("nic:setInternetAccess")
    @MapBinder(SetInternetAccessBinder.class)
-   @XMLResponseParser(NicResponseHandler.class)
-   Nic setInternetAccess(@PayloadParam("nic") Nic.Request.SetInternetAccessPayload payload);
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String setInternetAccess(@PayloadParam("nic") Nic.Request.SetInternetAccessPayload payload);
 
    @POST
    @Named("nic:delete")

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java
new file mode 100644
index 0000000..a239336
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java
@@ -0,0 +1,51 @@
+/*
+ * 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.profitbricks.http.parser.loadbalancer;
+
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * Handler for parsing SOAP response where <i>loadBalancerId</i> is the only <i>usable</i> value.
+ *
+ * Other properties available (which are ignored): requestId, dataCenterId, dataCenterVersion
+ */
+public class LoadBalancerIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
+
+   private String loadBalancerId;
+
+   LoadBalancerIdOnlyResponseHandler() {
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      clearTextBuffer();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("loadBalancerId".equals(qName))
+         loadBalancerId = textToStringValue();
+   }
+
+   @Override
+   public String getResult() {
+      return loadBalancerId;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java
new file mode 100644
index 0000000..8f8ba03
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java
@@ -0,0 +1,51 @@
+/*
+ * 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.profitbricks.http.parser.nic;
+
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * Handler for parsing SOAP response where <i>nicId</i> is the only <i>usable</i> value.
+ *
+ * Other properties available (which are ignored): requestId, dataCenterId, dataCenterVersion
+ */
+public class NicIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
+
+   private String nicId;
+
+   NicIdOnlyResponseHandler() {
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      clearTextBuffer();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("nicId".equals(qName))
+         nicId = textToStringValue();
+   }
+
+   @Override
+   public String getResult() {
+      return nicId;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
index e310b6e..524149a 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
@@ -16,30 +16,171 @@
  */
 package org.jclouds.profitbricks;
 
-import java.util.concurrent.TimeUnit;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_SNAPSHOT;
+import static org.testng.Assert.assertTrue;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Properties;
 
 import org.jclouds.apis.BaseApiLiveTest;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.util.Predicates2;
+import org.jclouds.profitbricks.features.DataCenterApi;
+import org.jclouds.profitbricks.features.ServerApi;
 
 import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.FluentIterable;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.features.NicApi;
 
 public abstract class BaseProfitBricksLiveTest extends BaseApiLiveTest<ProfitBricksApi> {
 
-   protected Predicate<String> dcWaitingPredicate;
+   public static final Location testLocation = Location.US_LAS;
+
+   private Predicate<String> dataCenterAvailable;
+   private Predicate<String> snapshotAvailable;
+   private Predicate<String> serverRunning;
+   private Predicate<String> serverSuspended;
 
    public BaseProfitBricksLiveTest() {
       provider = "profitbricks";
    }
 
    @Override
-   protected void initialize() {
-      super.initialize();
-      this.dcWaitingPredicate = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE),
-              2l * 60l, 2l, TimeUnit.SECONDS);
+   protected ProfitBricksApi create(Properties props, Iterable<Module> modules) {
+      Injector injector = newBuilder().modules(modules).overrides(props).buildInjector();
+      dataCenterAvailable = injector.getInstance(Key.get(new TypeLiteral<Predicate<String>>() {
+      }, Names.named(POLL_PREDICATE_DATACENTER)));
+      snapshotAvailable = injector.getInstance(Key.get(new TypeLiteral<Predicate<String>>() {
+      }, Names.named(POLL_PREDICATE_SNAPSHOT)));
+      serverRunning = injector.getInstance(Key.get(new TypeLiteral<Predicate<String>>() {
+      }, Names.named(TIMEOUT_NODE_RUNNING)));
+      serverSuspended = injector.getInstance(Key.get(new TypeLiteral<Predicate<String>>() {
+      }, Names.named(TIMEOUT_NODE_SUSPENDED)));
+
+      return injector.getInstance(ProfitBricksApi.class);
+   }
+
+   protected void assertDataCenterAvailable(DataCenter dataCenter) {
+      assertDataCenterAvailable(dataCenter.id());
+   }
+
+   protected void assertDataCenterAvailable(String dataCenterId) {
+      assertTrue(dataCenterAvailable.apply(dataCenterId),
+              String.format("Datacenter %s wasn't available in the configured timeout", dataCenterId));
+   }
+   
+   protected void assertSnapshotAvailable(String snapshotId){
+      assertTrue(snapshotAvailable.apply(snapshotId),
+              String.format("Snapshot %s wasn't available in the configured timeout", snapshotId));
+   }
+
+   protected void assertNodeRunning(String serverId) {
+      assertTrue(serverRunning.apply(serverId), String.format("Server %s did not start in the configured timeout", serverId));
+   }
+
+   protected void assertNodeSuspended(String serverId) {
+      assertTrue(serverSuspended.apply(serverId), String.format("Server %s did not stop in the configured timeout", serverId));
+   }
+
+   protected DataCenter findOrCreateDataCenter(final String name) {
+      DataCenterApi dataCenterApi = api.dataCenterApi();
+
+      return FluentIterable.from(dataCenterApi.getAllDataCenters()).firstMatch(new Predicate<DataCenter>() {
+
+         @Override
+         public boolean apply(DataCenter input) {
+            boolean match = Objects.equals(input.name(), name);
+            if (match && input.location() == testLocation)
+               assertDataCenterAvailable(input);
+
+            return match;
+         }
+      }).or(new Supplier<DataCenter>() {
+
+         @Override
+         public DataCenter get() {
+            DataCenter dataCenter = api.dataCenterApi().createDataCenter(
+                    DataCenter.Request.creatingPayload(name, testLocation));
+            assertDataCenterAvailable(dataCenter);
+
+            return api.dataCenterApi().getDataCenter(dataCenter.id());
+         }
+      });
+   }
+
+   protected Server findOrCreateServer(final DataCenter dataCenter) {
+      return FluentIterable.from(dataCenter.servers()).firstMatch(new Predicate<Server>() {
+
+         @Override
+         public boolean apply(Server input) {
+            return input.state() == ProvisioningState.AVAILABLE;
+         }
+      }).or(new Supplier<Server>() {
+
+         @Override
+         public Server get() {
+            ServerApi serverApi = api.serverApi();
+            String name = String.format("server-%d", dataCenter.servers().size());
+            String createdServerId = serverApi.createServer(
+                    Server.Request.creatingBuilder()
+                    .dataCenterId(dataCenter.id())
+                    .name(name)
+                    .cores(1)
+                    .ram(256)
+                    .build());
+            assertDataCenterAvailable(dataCenter);
+            assertNodeRunning(createdServerId);
+
+            return serverApi.getServer(createdServerId);
+         }
+      });
+   }
+
+   protected Nic findOrCreateNic(final DataCenter dataCenter) {
+      final NicApi nicApi = api.nicApi();
+      final List<Nic> nics = nicApi.getAllNics();
+
+      return FluentIterable.from(nics).firstMatch(new Predicate<Nic>() {
+
+         @Override
+         public boolean apply(Nic input) {
+            return Objects.equals(input.dataCenterId(), dataCenter.id())
+                    && input.state() == ProvisioningState.AVAILABLE;
+         }
+      }).or(new Supplier<Nic>() {
+
+         @Override
+         public Nic get() {
+            Server server = findOrCreateServer(dataCenter);
+            String name = String.format("%s-nic-%d", server.name(), nics.size());
+            String nicId = nicApi.createNic(Nic.Request.creatingBuilder()
+                    .name(name)
+                    .lanId(1)
+                    .serverId(server.id())
+                    .build());
+            assertDataCenterAvailable(dataCenter);
+
+            return nicApi.getNic(nicId);
+         }
+      });
    }
 
+   protected void destroyDataCenter(final DataCenter dataCenter) {
+      boolean success = api.dataCenterApi().deleteDataCenter(dataCenter.id());
+      assertTrue(success, "DataCenter wasn't deleted");
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
index b1fa5c3..c690fb3 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
@@ -16,11 +16,12 @@
  */
 package org.jclouds.profitbricks.binder.loadbalancer;
 
-import com.google.common.collect.Lists;
-import java.util.List;
-import org.jclouds.profitbricks.domain.LoadBalancer;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+
+import com.google.common.collect.ImmutableList;
+
+import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "DeregisterLoadBalancerRequestBinderTest")
@@ -29,13 +30,9 @@ public class DeregisterLoadBalancerRequestBinderTest {
    @Test
    public void testDeregisterPayload() {
       DeregisterLoadBalancerRequestBinder binder = new DeregisterLoadBalancerRequestBinder();
-      List<String> serverIds = Lists.newArrayList();
-      serverIds.add("1");
-      serverIds.add("2");
-
-      LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request.createDeregisteringPayload("load-balancer-id", serverIds);
 
-      String actual = binder.createPayload(payload);
+      String actual = binder.createPayload(LoadBalancer.Request.createDeregisteringPayload(
+              "load-balancer-id", ImmutableList.of("1", "2")));
 
       assertNotNull(actual, "Binder returned null payload");
       assertEquals(expectedPayload, actual);
@@ -43,10 +40,8 @@ public class DeregisterLoadBalancerRequestBinderTest {
 
    private final String expectedPayload
            = ("        <ws:deregisterServersOnLoadBalancer>\n"
-           + "             <request>"
            + "                <serverIds>1</serverIds>\n"
            + "                <serverIds>2</serverIds>\n"
            + "                <loadBalancerId>load-balancer-id</loadBalancerId>\n"
-           + "             </request>"
            + "        </ws:deregisterServersOnLoadBalancer>").replaceAll("\\s+", "");
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
index db42403..8f2e5a9 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
@@ -16,11 +16,12 @@
  */
 package org.jclouds.profitbricks.binder.loadbalancer;
 
-import com.google.common.collect.Lists;
-import java.util.List;
-import org.jclouds.profitbricks.domain.LoadBalancer;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.profitbricks.domain.LoadBalancer;
+
+import com.google.common.collect.ImmutableList;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "RegisterLoadBalancerRequestBinderTest")
@@ -29,13 +30,8 @@ public class RegisterLoadBalancerRequestBinderTest {
    @Test
    public void testRegisterPayload() {
       RegisterLoadBalancerRequestBinder binder = new RegisterLoadBalancerRequestBinder();
-      List<String> serverIds = Lists.newArrayList();
-      serverIds.add("1");
-      serverIds.add("2");
-
-      LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request.createRegisteringPaylod("load-balancer-id", serverIds);
-
-      String actual = binder.createPayload(payload);
+      String actual = binder.createPayload(LoadBalancer.Request.createRegisteringPaylod(
+              "load-balancer-id", ImmutableList.of("1", "2")));
 
       assertNotNull(actual, "Binder returned null payload");
       assertEquals(expectedPayload, actual);
@@ -43,10 +39,8 @@ public class RegisterLoadBalancerRequestBinderTest {
 
    private final String expectedPayload
            = ("        <ws:registerServersOnLoadBalancer>\n"
-           + "             <request>"
            + "                <loadBalancerId>load-balancer-id</loadBalancerId>\n"
            + "                <serverIds>1</serverIds>\n"
            + "                <serverIds>2</serverIds>\n"
-           + "             </request>"
            + "        </ws:registerServersOnLoadBalancer>").replaceAll("\\s+", "");
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java
deleted file mode 100644
index 83540a5..0000000
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.profitbricks.compute;
-
-import org.jclouds.compute.domain.NodeMetadata;
-import org.testng.annotations.Test;
-
-import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
-import org.jclouds.sshj.config.SshjSshClientModule;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import org.jclouds.compute.domain.ExecResponse;
-import org.jclouds.logging.config.LoggingModule;
-import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
-
-@Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceAdapterLiveTest")
-public class ProfitBricksComputeServiceAdapterLiveTest extends BaseComputeServiceLiveTest {
-
-   public ProfitBricksComputeServiceAdapterLiveTest() {
-      provider = "profitbricks";
-   }
-
-   @Override
-   protected Module getSshModule() {
-      return new SshjSshClientModule();
-   }
-
-   @Override
-   protected LoggingModule getLoggingModule() {
-      return new SLF4JLoggingModule();
-   }
-
-   @Override
-   public void testOptionToNotBlock() throws Exception {
-      // ProfitBricks implementation intentionally blocks until the node is 'AVAILABLE'
-   }
-
-   @Override
-   protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) {
-      // ProfitBricks doesn't support tags
-   }
-
-   @Override
-   protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
-      // ProfitBricks doesn't support user metadata
-   }
-
-   @Override
-   protected void checkResponseEqualsHostname(ExecResponse execResponse, NodeMetadata node1) {
-      // ProfitBricks doesn't support hostname
-   }
-
-   @Override
-   protected void checkOsMatchesTemplate(NodeMetadata node) {
-      // Not enough description from API to match template
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java
new file mode 100644
index 0000000..2599f71
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.profitbricks.compute;
+
+import static org.jclouds.profitbricks.BaseProfitBricksLiveTest.testLocation;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
+
+import java.util.Objects;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.FluentIterable;
+
+import org.jclouds.compute.domain.NodeMetadata;
+import org.testng.annotations.Test;
+
+import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
+import org.jclouds.sshj.config.SshjSshClientModule;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+
+import org.jclouds.compute.domain.ExecResponse;
+import org.jclouds.logging.config.LoggingModule;
+import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.features.DataCenterApi;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeGroups;
+
+@Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceLiveTest")
+public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTest {
+
+   private static final String TEST_DC_NAME = "computeServiceLiveTest" + System.currentTimeMillis();
+
+   private DataCenter dataCenter;
+
+   public ProfitBricksComputeServiceLiveTest() {
+      provider = "profitbricks";
+   }
+
+   @BeforeGroups(groups = {"integration", "live"})
+   @Override
+   public void setupContext() {
+      super.setupContext();
+
+      final DataCenterApi api = getDataCenterApi();
+      final Predicate<String> predicate = getDataCenterPredicate();
+      dataCenter = FluentIterable.from(api.getAllDataCenters()).firstMatch(new Predicate<DataCenter>() {
+
+         @Override
+         public boolean apply(DataCenter input) {
+            boolean match = Objects.equals(input.name(), TEST_DC_NAME);
+            if (match && input.location() == testLocation)
+               return predicate.apply(input.id());
+            return match;
+         }
+      }).or(new Supplier<DataCenter>() {
+
+         @Override
+         public DataCenter get() {
+            DataCenter dataCenter = api.createDataCenter(
+                    DataCenter.Request.creatingPayload(TEST_DC_NAME, testLocation));
+            predicate.apply(dataCenter.id());
+
+            return api.getDataCenter(dataCenter.id());
+         }
+      });
+   }
+
+   @AfterClass(groups = {"integration", "live"}, alwaysRun = true)
+   @Override
+   protected void tearDownContext() {
+      super.tearDownContext();
+      if (dataCenter != null)
+         getDataCenterApi().deleteDataCenter(dataCenter.id());
+   }
+
+   private Predicate<String> getDataCenterPredicate() {
+      return client.getContext().utils().injector().getInstance(Key.get(new TypeLiteral<Predicate<String>>() {
+      }, Names.named(POLL_PREDICATE_DATACENTER)));
+   }
+
+   private DataCenterApi getDataCenterApi() {
+      return client.getContext().unwrapApi(ProfitBricksApi.class).dataCenterApi();
+   }
+
+   @Override
+   protected Module getSshModule() {
+      return new SshjSshClientModule();
+   }
+
+   @Override
+   protected LoggingModule getLoggingModule() {
+      return new SLF4JLoggingModule();
+   }
+
+   @Override
+   public void testOptionToNotBlock() throws Exception {
+      // ProfitBricks implementation intentionally blocks until the node is 'AVAILABLE'
+   }
+
+   @Override
+   protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) {
+      // ProfitBricks doesn't support tags
+   }
+
+   @Override
+   protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
+      // ProfitBricks doesn't support user metadata
+   }
+
+   @Override
+   protected void checkResponseEqualsHostname(ExecResponse execResponse, NodeMetadata node1) {
+      // ProfitBricks doesn't support hostname
+   }
+
+   @Override
+   protected void checkOsMatchesTemplate(NodeMetadata node) {
+      // Not enough description from API to match template
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java
new file mode 100644
index 0000000..9c2b228
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java
@@ -0,0 +1,145 @@
+/*
+ * 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.profitbricks.compute.config;
+
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+import static org.testng.Assert.assertEquals;
+
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule.DataCenterProvisioningStatePredicate;
+import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule.ServerStatusPredicate;
+import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule.SnapshotProvisioningStatePredicate;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import org.jclouds.util.Predicates2;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+
+/**
+ * Test class for {@link DataCenterProvisioningStatePredicate} and {@link ServerStatusPredicate}
+ */
+@Test(groups = "unit", testName = "ProvisioningStatusPollingPredicateTest")
+public class StatusPredicateTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testDataCenterPredicate() throws Exception {
+      MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/datacenter/datacenter-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/datacenter/datacenter-state.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new DataCenterProvisioningStatePredicate(pbApi, ProvisioningState.AVAILABLE),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      try {
+         waitUntilAvailable.apply(id);
+         ProvisioningState finalState = pbApi.dataCenterApi().getDataCenterState(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertEquals(finalState, ProvisioningState.AVAILABLE);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testServerPredicate() throws Exception {
+      MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/server/server-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/server/server.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new ServerStatusPredicate(pbApi, Server.Status.RUNNING),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+      try {
+         waitUntilAvailable.apply(id);
+         Server remoteServer = pbApi.serverApi().getServer(id);
+         assertEquals(remoteServer.status(), Server.Status.RUNNING);
+         assertRequestHasCommonProperties(server.takeRequest());
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testSnapshotPredicate() throws Exception {
+      MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/snapshot/snapshot-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/snapshot/snapshot.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new SnapshotProvisioningStatePredicate(pbApi, ProvisioningState.AVAILABLE),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+      try {
+         waitUntilAvailable.apply(id);
+         Snapshot snapshot = pbApi.snapshotApi().getSnapshot(id);
+         assertEquals(snapshot.state(), ProvisioningState.AVAILABLE);
+         assertRequestHasCommonProperties(server.takeRequest());
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
deleted file mode 100644
index 690412a..0000000
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * 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.profitbricks.compute.internal;
-
-import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
-import static org.testng.Assert.assertEquals;
-
-import java.util.concurrent.TimeUnit;
-
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
-import org.jclouds.util.Predicates2;
-import org.testng.annotations.Test;
-
-import com.google.common.base.Predicate;
-import com.squareup.okhttp.mockwebserver.MockResponse;
-import com.squareup.okhttp.mockwebserver.MockWebServer;
-
-/**
- * Tests for the {@link ProvisioningStatusPollingPredicate} class.
- * <p>
- */
-@Test(groups = "unit", testName = "ProvisioningStatusPollingPredicateTest")
-public class ProvisioningStatusPollingPredicateTest extends BaseProfitBricksMockTest {
-
-   @Test
-   public void testDataCenterPredicate() throws Exception {
-      MockWebServer server = mockWebServer();
-
-      byte[] payloadInProcess = payloadFromResource("/datacenter/datacenter-state-inprocess.xml");
-      byte[] payloadAvailable = payloadFromResource("/datacenter/datacenter-state.xml");
-
-      // wait 3 times
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-
-      Predicate<String> waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE),
-              30l, 1l, TimeUnit.SECONDS);
-
-      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
-      try {
-         waitUntilAvailable.apply(id);
-         ProvisioningState finalState = pbApi.dataCenterApi().getDataCenterState(id);
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertEquals(finalState, ProvisioningState.AVAILABLE);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testServerPredicate() throws Exception {
-      MockWebServer server = mockWebServer();
-
-      byte[] payloadInProcess = payloadFromResource("/server/server-state-inprocess.xml");
-      byte[] payloadAvailable = payloadFromResource("/server/server.xml");
-
-      // wait 3 times
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-
-      Predicate<String> waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.SERVER, ProvisioningState.AVAILABLE),
-              30l, 1l, TimeUnit.SECONDS);
-
-      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
-      try {
-         waitUntilAvailable.apply(id);
-         ProvisioningState finalState = pbApi.serverApi().getServer(id).state();
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertEquals(finalState, ProvisioningState.AVAILABLE);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testStoragePredicate() throws Exception {
-      MockWebServer server = mockWebServer();
-
-      byte[] payloadInProcess = payloadFromResource("/storage/storage-state-inprocess.xml");
-      byte[] payloadAvailable = payloadFromResource("/storage/storage.xml");
-
-      // wait 3 times
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-
-      Predicate<String> waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.STORAGE, ProvisioningState.AVAILABLE),
-              30l, 1l, TimeUnit.SECONDS);
-
-      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
-      try {
-         waitUntilAvailable.apply(id);
-         ProvisioningState finalState = pbApi.storageApi().getStorage(id).state();
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertEquals(finalState, ProvisioningState.AVAILABLE);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testSnapshotPredicate() throws Exception {
-      MockWebServer server = mockWebServer();
-
-      byte[] payloadInProcess = payloadFromResource("/snapshot/snapshot-state-inprocess.xml");
-      byte[] payloadAvailable = payloadFromResource("/snapshot/snapshot.xml");
-
-      // wait 3 times
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-
-      Predicate<String> waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.SNAPSHOT, ProvisioningState.AVAILABLE),
-              30l, 1l, TimeUnit.SECONDS);
-
-      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
-      try {
-         waitUntilAvailable.apply(id);
-         ProvisioningState finalState = pbApi.snapshotApi().getSnapshot(id).state();
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertEquals(finalState, ProvisioningState.AVAILABLE);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
index 6bcf053..33a086c 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
@@ -20,6 +20,7 @@ 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.List;
 
@@ -28,12 +29,10 @@ import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 
-import static org.testng.Assert.assertTrue;
-
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
 
-@Test(groups = "live", testName = "DataCenterApiLiveTest", singleThreaded = true)
+@Test(groups = "live", testName = "DataCenterApiLiveTest")
 public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest {
 
    private String dcId;
@@ -45,7 +44,7 @@ public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest {
       );
 
       assertNotNull(dc);
-      dcWaitingPredicate.apply(dc.id());
+      assertDataCenterAvailable(dc);
 
       dcId = dc.id();
    }
@@ -87,7 +86,7 @@ public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest {
       );
 
       assertNotNull(dataCenter);
-      dcWaitingPredicate.apply(dcId);
+      assertDataCenterAvailable(dataCenter);
 
       DataCenter fetchedDc = api.dataCenterApi().getDataCenter(dcId);
 
@@ -118,10 +117,7 @@ public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest {
 
    @AfterClass(alwaysRun = true)
    public void testDeleteDataCenter() {
-      if (dcId != null) {
-         boolean result = api.dataCenterApi().deleteDataCenter(dcId);
-
-         assertTrue(result, "Created test data center was not deleted.");
-      }
+      boolean result = api.dataCenterApi().deleteDataCenter(dcId);
+      assertTrue(result, "Created test data center was not deleted.");
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
index 2f3c767..ff4dbb4 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
@@ -16,51 +16,48 @@
  */
 package org.jclouds.profitbricks.features;
 
-import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 
-import java.util.List;
-
 import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Drive;
 import org.jclouds.profitbricks.domain.Image;
 import org.jclouds.profitbricks.domain.Server;
 import org.testng.annotations.Test;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
 
+import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 
-@Test(groups = "live", testName = "DrivesApiLiveTest", singleThreaded = true)
+@Test(groups = "live", testName = "DrivesApiLiveTest")
 public class DrivesApiLiveTest extends BaseProfitBricksLiveTest {
 
-   public String serverId;
-   public String imageId;
-
-   @Override
-   protected void initialize() {
-      super.initialize();
-
-      List<Server> servers = api.serverApi().getAllServers();
-      assertFalse(servers.isEmpty(), "At least one server is required to run drives test.");
-
-      Server server = Iterables.getFirst(servers, null);
-      assertNotNull(server);
-
-      this.serverId = server.id();
-
-      List<Image> images = api.imageApi().getAllImages();
-      assertFalse(images.isEmpty(), "At least one image is required to run drives test.");
-
-      Image image = Iterables.getFirst(images, null);
-      assertNotNull(image);
-
-      this.imageId = image.id();
+   private DataCenter dataCenter;
+   private Server server;
+   private Image image;
+
+   @BeforeClass
+   public void setupTest() {
+      dataCenter = findOrCreateDataCenter("drivesApiLiveTest" + System.currentTimeMillis());
+      server = findOrCreateServer(dataCenter);
+      image = Iterables.tryFind(api.imageApi().getAllImages(), new Predicate<Image>() {
+
+         @Override
+         public boolean apply(Image input) {
+            return input.location() == dataCenter.location()
+                    && input.type() == Image.Type.CDROM;
+         }
+      }).get();
    }
 
    @Test
    public void addRomDriveToServerTest() {
-      String requestId = api.drivesApi().addRomDriveToServer(Drive.Request.AddRomDriveToServerPayload.builder()
-              .serverId(serverId)
-              .imageId("05cadf29-6c12-11e4-beeb-52540066fee9")
+      assertDataCenterAvailable(dataCenter);
+      String requestId = api.drivesApi().addRomDriveToServer(
+              Drive.Request.AddRomDriveToServerPayload.builder()
+              .serverId(server.id())
+              .imageId(image.id())
               .deviceNumber("0")
               .build());
       assertNotNull(requestId);
@@ -68,8 +65,13 @@ public class DrivesApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test(dependsOnMethods = "addRomDriveToServerTest")
    public void removeRomDriveFromServerTest() {
-      String requestId = api.drivesApi().removeRomDriveFromServer(imageId, serverId);
-
+      assertDataCenterAvailable(dataCenter);
+      String requestId = api.drivesApi().removeRomDriveFromServer(image.id(), server.id());
       assertNotNull(requestId);
    }
+
+   @AfterClass(alwaysRun = true)
+   public void cleanUp() {
+      destroyDataCenter(dataCenter);
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
index 772667a..c5b63f2 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
@@ -16,79 +16,58 @@
  */
 package org.jclouds.profitbricks.features;
 
-import com.google.common.collect.Iterables;
-
-import java.util.List;
-
-import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
-import org.jclouds.profitbricks.domain.Firewall;
-import org.jclouds.profitbricks.domain.Nic;
-
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.concurrent.TimeUnit;
+import java.util.List;
 
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.Nic;
 import org.jclouds.profitbricks.domain.Firewall.Protocol;
-import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.util.Predicates2;
 import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 
-@Test(groups = "live", testName = "FirewallApiLiveTest", singleThreaded = true)
+
+@Test(groups = "live", testName = "FirewallApiLiveTest")
 public class FirewallApiLiveTest extends BaseProfitBricksLiveTest {
 
-   private Predicate<String> waitUntilAvailable;
+   private DataCenter dataCenter;
    private Nic nic;
 
    private Firewall createdFirewall;
-   private Firewall.Rule createdFirewallRule;
-
-   @Override
-   protected void initialize() {
-      super.initialize();
-      List<Nic> nics = api.nicApi().getAllNics();
-      assertFalse(nics.isEmpty(), "Must atleast have 1 NIC available for firewall testing.");
-
-      this.nic = Iterables.tryFind(nics, new Predicate<Nic>() {
-
-         @Override
-         public boolean apply(Nic input) {
-            return input.state() == ProvisioningState.AVAILABLE;
-         }
-      }).orNull();
-
-      assertNotNull(nic, "No available NIC for firewall testing was found.");
 
-      this.waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.NIC, ProvisioningState.AVAILABLE),
-              2l * 60l, 2l, TimeUnit.SECONDS);
+   @BeforeClass
+   public void setupTest() {
+      dataCenter = findOrCreateDataCenter("firewallApiLiveTest" + System.currentTimeMillis());
+      nic = findOrCreateNic(dataCenter);
    }
 
    @Test
    public void testAddFirewallRuleToNic() {
+      assertDataCenterAvailable(dataCenter);
       Firewall firewall = api.firewallApi().addFirewallRuleToNic(
-              Firewall.Request.createAddRulePayload(nic.id(), ImmutableList.of(
+              Firewall.Request.createAddRulePayload(
+                      nic.id(), ImmutableList.of(
                               Firewall.Rule.builder()
                               .name("test-rule-tcp")
                               .protocol(Protocol.TCP)
                               .build()
-                      ))
+                      )
+              )
       );
 
       assertNotNull(firewall);
-      assertNotNull(firewall.rules());
+      assertFalse(firewall.rules().isEmpty());
+      assertDataCenterAvailable(dataCenter);
 
-      waitUntilAvailable.apply(nic.id());
       createdFirewall = firewall;
-      createdFirewallRule = Iterables.getOnlyElement(firewall.rules());
    }
 
    @Test(dependsOnMethods = "testAddFirewallRuleToNic")
@@ -109,37 +88,52 @@ public class FirewallApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test(dependsOnMethods = "testAddFirewallRuleToNic")
    public void testActivateFirewall() {
-      boolean result = api.firewallApi().activateFirewall(ImmutableList.of(createdFirewall.id()));
-
-      waitUntilAvailable.apply(nic.id());
-
+      assertDataCenterAvailable(dataCenter);
+      boolean result = api.firewallApi().activateFirewall(
+              ImmutableList.of(createdFirewall.id()));
+      assertDataCenterAvailable(dataCenter);
       assertTrue(result);
+
+      Firewall firewall = api.firewallApi().getFirewall(createdFirewall.id());
+      assertTrue(firewall.active(), "Firewall wasn't activated");
    }
 
    @Test(dependsOnMethods = "testActivateFirewall")
    void testDeactivateFirewall() {
-      boolean result = api.firewallApi().deactivateFirewall(ImmutableList.of(createdFirewall.id()));
-
-      waitUntilAvailable.apply(nic.id());
-
+      assertDataCenterAvailable(dataCenter);
+      boolean result = api.firewallApi().deactivateFirewall(
+              ImmutableList.of(createdFirewall.id()));
+      assertDataCenterAvailable(dataCenter);
       assertTrue(result);
+
+      Firewall firewall = api.firewallApi().getFirewall(createdFirewall.id());
+      assertFalse(firewall.active(), "Firewall wasn't deactivated");
    }
 
-   @Test(dependsOnMethods = "testActivateFirewall")
+   @Test(dependsOnMethods = "testDeactivateFirewall")
    void testRemoveFirewallRule() {
-      boolean result = api.firewallApi().removeFirewallRules(ImmutableList.of(createdFirewallRule.id()));
+      assertDataCenterAvailable(dataCenter);
+      for (Firewall.Rule rule : createdFirewall.rules()) {
+         boolean result = api.firewallApi().removeFirewallRules(
+                 ImmutableList.of(rule.id()));
 
-      waitUntilAvailable.apply(nic.id());
+         assertTrue(result);
+         assertDataCenterAvailable(dataCenter);
 
-      assertTrue(result);
+      }
+      Firewall firewall = api.firewallApi().getFirewall(createdFirewall.id());
+      assertTrue(firewall.rules().isEmpty(), "Not all rules removed");
    }
 
-   @AfterClass(alwaysRun = true)
+   @Test(dependsOnMethods = "testRemoveFirewallRule")
    public void testDeleteFirewall() {
-      if (createdFirewall != null) {
-         boolean result = api.firewallApi().deleteFirewall(ImmutableList.of(createdFirewall.id()));
+      assertDataCenterAvailable(dataCenter);
+      boolean result = api.firewallApi().deleteFirewall(ImmutableList.of(createdFirewall.id()));
+      assertTrue(result, "Created firewall was not deleted.");
+   }
 
-         assertTrue(result, "Created firewall was not deleted.");
-      }
+   @AfterClass(alwaysRun = true)
+   public void cleanUp() {
+      destroyDataCenter(dataCenter);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java
index 2299a0c..b71cd8d 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiLiveTest.java
@@ -16,20 +16,24 @@
  */
 package org.jclouds.profitbricks.features;
 
-import com.google.common.collect.Iterables;
-import java.util.List;
-import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
-import org.jclouds.profitbricks.domain.Image;
 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 java.util.List;
+
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.Image;
 import org.testng.annotations.Test;
 
-@Test(groups = "live", testName = "ImageApiLiveTest", singleThreaded = true)
+import com.google.common.collect.Iterables;
+
+@Test(groups = "live", testName = "ImageApiLiveTest")
 public class ImageApiLiveTest extends BaseProfitBricksLiveTest {
 
-   private String imageId;
+   private Image image;
 
    @Test
    public void testGetAllImages() {
@@ -37,22 +41,22 @@ public class ImageApiLiveTest extends BaseProfitBricksLiveTest {
 
       assertNotNull(images);
       assertFalse(images.isEmpty(), "No images found.");
-      imageId = Iterables.getFirst(images, null).id();
+
+      image = Iterables.getFirst(images, null);
+      assertNotNull(image);
    }
 
    @Test(dependsOnMethods = "testGetAllImages")
    public void testGetImage() {
-      Image image = api.imageApi().getImage(imageId);
+      Image fetchedImage = api.imageApi().getImage(image.id());
 
-      assertNotNull(image);
-      assertEquals(image.id(), imageId);
+      assertNotNull(fetchedImage);
+      assertEquals(fetchedImage, image);
    }
 
    @Test
    public void testGetNonExistingImage() {
       String id = "random-non-existing-id";
-      Image image = api.imageApi().getImage(id);
-
-      assertNull(image, "Should've just returned null");
+      assertNull(api.imageApi().getImage(id), "Should've just returned null");
    }
 }