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:42 UTC

[32/35] jclouds git commit: JCLOUDS-1047: Fix ProfitBricks compute service live tests

JCLOUDS-1047: Fix ProfitBricks compute service live tests


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

Branch: refs/heads/master
Commit: 235b4b98d4d96b75b77de15e4a3522a5f68cb502
Parents: 52c6c2b
Author: Reijhanniel Jearl Campos <de...@gmail.com>
Authored: Tue Jan 19 22:09:00 2016 +0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Jan 19 15:29:57 2016 +0100

----------------------------------------------------------------------
 .../ProfitBricksProviderMetadata.java           |  29 ++++--
 .../ProfitBricksComputeServiceAdapter.java      |  29 ++++--
 .../ProfitBricksTemplateBuilderImpl.java        | 101 ++++++++++++++++++
 ...ProfitBricksComputeServiceContextModule.java |  13 ++-
 .../compute/function/ProvisionableToImage.java  |  31 ++++--
 .../config/ProfitBricksComputeProperties.java   |  10 +-
 .../profitbricks/domain/Provisionable.java      |  12 ++-
 .../internal/FirewallRuleCommonProperties.java  |  44 --------
 .../domain/internal/HotPluggable.java           | 102 -------------------
 .../domain/internal/Provisionable.java          |  67 ------------
 .../domain/internal/ServerCommonProperties.java |  29 ------
 .../ProfitBricksSoapMessageEnvelope.java        |   2 +-
 .../ProfitBricksComputeServiceLiveTest.java     |   6 +-
 .../ProfitBricksTemplateBuilderLiveTest.java    |  68 ++++++++++++-
 .../function/ProvisionableToImageTest.java      |   7 ++
 .../features/SnapshotApiLiveTest.java           |  19 +++-
 .../ProfitBricksSoapMessageEnvelopeTest.java    |   2 +-
 17 files changed, 286 insertions(+), 285 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
index ed6c556..ec7fc9a 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
@@ -16,11 +16,13 @@
  */
 package org.jclouds.profitbricks;
 
-import static org.jclouds.Constants.PROPERTY_CONNECTION_TIMEOUT;
 import static org.jclouds.Constants.PROPERTY_SO_TIMEOUT;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PERIOD;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_TERMINATED;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_INITIAL_PERIOD;
 import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_MAX_PERIOD;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_TIMEOUT;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.TIMEOUT_DATACENTER_AVAILABLE;
 
 import com.google.auto.service.AutoService;
 
@@ -52,13 +54,20 @@ public class ProfitBricksProviderMetadata extends BaseProviderMetadata {
 
    public static Properties defaultProperties() {
       Properties properties = ProfitBricksApiMetadata.defaultProperties();
-      long defaultTimeout = 60l * 60l; // 1 hour
-      properties.put(POLL_TIMEOUT, defaultTimeout);
-      properties.put(POLL_PERIOD, 2l);
-      properties.put(POLL_MAX_PERIOD, 2l * 10l);
-
-      properties.put(PROPERTY_SO_TIMEOUT, 60000 * 5);
-      properties.put(PROPERTY_CONNECTION_TIMEOUT, 60000 * 5);
+      properties.put(TIMEOUT_DATACENTER_AVAILABLE, 30L * 60L); // 30 minutes
+      properties.put(POLL_INITIAL_PERIOD, 5L);
+      properties.put(POLL_MAX_PERIOD, 60L);
+
+      properties.put("jclouds.ssh.max-retries", "7");
+      properties.put("jclouds.ssh.retry-auth", "true");
+      
+      properties.put(PROPERTY_SO_TIMEOUT, 10 * 60 * 1000);
+
+      // Node might still not be available even after DataCenter is done provisioning
+      // Use 5-minute timeout by default
+      properties.put(TIMEOUT_NODE_RUNNING, 5 * 60 * 1000);
+      properties.put(TIMEOUT_NODE_SUSPENDED, 5 * 60 * 1000);
+      properties.put(TIMEOUT_NODE_TERMINATED, 5 * 60 * 1000);
 
       return properties;
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
index 4f6548e..68a7097 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.profitbricks.compute;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Strings.isNullOrEmpty;
 import static com.google.common.collect.Iterables.transform;
 import static com.google.common.util.concurrent.Futures.allAsList;
@@ -41,6 +42,8 @@ import org.jclouds.compute.domain.internal.VolumeImpl;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.compute.reference.ComputeServiceConstants;
 import org.jclouds.compute.util.ComputeServiceUtils;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationScope;
 import org.jclouds.domain.LoginCredentials;
 import org.jclouds.logging.Logger;
 import org.jclouds.profitbricks.ProfitBricksApi;
@@ -53,6 +56,7 @@ import org.jclouds.profitbricks.features.DataCenterApi;
 import org.jclouds.profitbricks.features.ServerApi;
 import org.jclouds.profitbricks.compute.concurrent.ProvisioningJob;
 import org.jclouds.profitbricks.compute.concurrent.ProvisioningManager;
+import org.jclouds.profitbricks.compute.function.ProvisionableToImage;
 import org.jclouds.profitbricks.domain.Snapshot;
 import org.jclouds.profitbricks.domain.Provisionable;
 import org.jclouds.profitbricks.util.Passwords;
@@ -99,7 +103,10 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<
 
    @Override
    public NodeAndInitialCredentials<Server> createNodeWithGroupEncodedIntoName(String group, String name, Template template) {
-      final String dataCenterId = template.getLocation().getId();
+      Location location = template.getLocation();
+      checkArgument(location.getScope() == LocationScope.ZONE, "Template must use a ZONE-scoped location");
+      final String dataCenterId = location.getId();
+
       Hardware hardware = template.getHardware();
 
       TemplateOptions options = template.getOptions();
@@ -116,20 +123,24 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<
       for (final Volume volume : volumes)
          try {
             logger.trace("<< provisioning storage '%s'", volume);
-            final Storage.Request.CreatePayload request = Storage.Request.creatingBuilder()
-                    .dataCenterId(dataCenterId)
-                    // put image to first storage
-                    .mountImageId(i == 1 ? image.getId() : "")
-                    .imagePassword(password)
+            final Storage.Request.CreatePayload.Builder storageBuilder = Storage.Request.creatingBuilder();
+            if (i == 1) {
+               storageBuilder.mountImageId(image.getId());
+               // we don't need to pass password to the API if we're using a snapshot
+               Provisionable.Type provisionableType = Provisionable.Type.fromValue(
+                       image.getUserMetadata().get(ProvisionableToImage.KEY_PROVISIONABLE_TYPE));
+               if (provisionableType == Provisionable.Type.IMAGE)
+                  storageBuilder.imagePassword(password);
+            }
+            storageBuilder.dataCenterId(dataCenterId)
                     .name(format("%s-disk-%d", name, i++))
-                    .size(volume.getSize())
-                    .build();
+                    .size(volume.getSize());
 
             String storageId = (String) provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
 
                @Override
                public Object get() {
-                  return api.storageApi().createStorage(request);
+                  return api.storageApi().createStorage(storageBuilder.build());
                }
             }));
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderImpl.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderImpl.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderImpl.java
new file mode 100644
index 0000000..a1967f8
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderImpl.java
@@ -0,0 +1,101 @@
+/*
+ * 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 com.google.common.collect.Iterables.find;
+import static java.lang.String.format;
+import static org.jclouds.domain.LocationScope.ZONE;
+
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+
+import org.jclouds.collect.Memoized;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.TemplateBuilder;
+import org.jclouds.compute.domain.internal.TemplateBuilderImpl;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.domain.Location;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+
+import org.jclouds.compute.domain.Image;
+
+public class ProfitBricksTemplateBuilderImpl extends TemplateBuilderImpl {
+
+   private final Function<org.jclouds.profitbricks.domain.Location, Location> fnLocation;
+
+   @Inject
+   ProfitBricksTemplateBuilderImpl(@Memoized Supplier<Set<? extends Location>> locations,
+         @Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares,
+         Supplier<Location> defaultLocation, @Named("DEFAULT") Provider<TemplateOptions> optionsProvider,
+         @Named("DEFAULT") Provider<TemplateBuilder> defaultTemplateProvider,
+         Function<org.jclouds.profitbricks.domain.Location, Location> fnLocation) {
+      super(locations, images, hardwares, defaultLocation, optionsProvider, defaultTemplateProvider);
+      this.fnLocation = fnLocation;
+   }
+
+   @Override
+   public TemplateBuilder locationId(final String locationId) {
+      org.jclouds.profitbricks.domain.Location nativeLocation
+              = org.jclouds.profitbricks.domain.Location.fromId(locationId);
+
+      Set<? extends Location> dataCenters = this.locations.get();
+      if (nativeLocation != org.jclouds.profitbricks.domain.Location.UNRECOGNIZED)
+         try {
+            // look for a child location instead if provided id is a Region
+            final Location parentLocation = fnLocation.apply(nativeLocation);
+            this.location = find(dataCenters, new Predicate<Location>() {
+
+               @Override
+               public boolean apply(Location input) {
+                  return parentLocation.equals(input.getParent());
+               }
+
+               @Override
+               public String toString() {
+                  return "first datacenter in locationId(" + locationId + ")";
+               }
+
+            });
+         } catch (NoSuchElementException ex) {
+            throw new NoSuchElementException(
+                    format("no child location found for location id %s in: %s", locationId, locations));
+         }
+      else
+         super.locationId(locationId);
+      return this;
+   }
+
+   @Override
+   public Template build() {
+      Template template = super.build();
+
+      Location loc = template.getLocation();
+      if (loc != null && loc.getScope() != ZONE)
+         return fromTemplate(template).locationId(loc.getId()).build();
+
+      return template;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/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 b3fe313..629fadc 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
@@ -19,11 +19,11 @@ 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_INITIAL_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.profitbricks.config.ProfitBricksComputeProperties.TIMEOUT_DATACENTER_AVAILABLE;
 import static org.jclouds.util.Predicates2.retry;
 
 import java.util.concurrent.TimeUnit;
@@ -36,6 +36,7 @@ import org.jclouds.compute.config.ComputeServiceAdapterContextModule;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.domain.Volume;
 import org.jclouds.domain.Location;
 import org.jclouds.functions.IdentityFunction;
@@ -49,6 +50,7 @@ import org.jclouds.profitbricks.compute.concurrent.ProvisioningManager;
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.profitbricks.compute.ProfitBricksTemplateBuilderImpl;
 import org.jclouds.profitbricks.compute.function.DataCenterToLocation;
 import org.jclouds.profitbricks.compute.function.LocationToLocation;
 import org.jclouds.profitbricks.compute.function.ProvisionableToImage;
@@ -64,6 +66,7 @@ import com.google.inject.Provides;
 import com.google.inject.TypeLiteral;
 import com.google.inject.assistedinject.FactoryModuleBuilder;
 
+
 public class ProfitBricksComputeServiceContextModule extends
         ComputeServiceAdapterContextModule<Server, Hardware, Provisionable, DataCenter> {
 
@@ -78,6 +81,8 @@ public class ProfitBricksComputeServiceContextModule extends
 
       bind(ImplicitLocationSupplier.class).to(OnlyLocationOrFirstZone.class).in(Singleton.class);
 
+      bind(new TypeLiteral<TemplateBuilder>(){}).to(ProfitBricksTemplateBuilderImpl.class);
+      
       bind(new TypeLiteral<ComputeServiceAdapter<Server, Hardware, Provisionable, DataCenter>>() {
       }).to(ProfitBricksComputeServiceAdapter.class);
 
@@ -202,11 +207,11 @@ public class ProfitBricksComputeServiceContextModule extends
    public static class ComputeConstants {
 
       @Inject
-      @Named(POLL_TIMEOUT)
+      @Named(TIMEOUT_DATACENTER_AVAILABLE)
       private String pollTimeout;
 
       @Inject
-      @Named(POLL_PERIOD)
+      @Named(POLL_INITIAL_PERIOD)
       private String pollPeriod;
 
       @Inject

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
index c5c7f5e..4d0f511 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
@@ -33,10 +33,13 @@ import org.jclouds.profitbricks.domain.Provisionable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 
 public class ProvisionableToImage implements Function<Provisionable, Image> {
 
+   public static final String KEY_PROVISIONABLE_TYPE = "provisionableType";
+
    private final ImageToImage fnImageToImage;
    private final SnapshotToImage fnSnapshotToImage;
 
@@ -76,7 +79,7 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
       }
    }
 
-   private static class ImageToImage implements Function<org.jclouds.profitbricks.domain.Image, Image> {
+   private static class ImageToImage implements ImageFunction<org.jclouds.profitbricks.domain.Image> {
 
       private static final Pattern HAS_NUMBERS = Pattern.compile(".*\\d+.*");
 
@@ -98,12 +101,12 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
                  .is64Bit(is64Bit(desc, from.type()))
                  .build();
 
-         return new ImageBuilder()
+         return addTypeMetadata(new ImageBuilder()
                  .ids(from.id())
                  .name(desc)
                  .location(fnRegion.apply(from.location()))
                  .status(Image.Status.AVAILABLE)
-                 .operatingSystem(os)
+                 .operatingSystem(os))
                  .build();
       }
 
@@ -147,9 +150,14 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
                return true;
          }
       }
+
+      @Override
+      public ImageBuilder addTypeMetadata(ImageBuilder builder) {
+         return builder.userMetadata(ImmutableMap.of(KEY_PROVISIONABLE_TYPE, Provisionable.Type.IMAGE.toString()));
+      }
    }
 
-   private static class SnapshotToImage implements Function<Snapshot, Image> {
+   private static class SnapshotToImage implements ImageFunction<Snapshot> {
 
       private final Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion;
 
@@ -169,13 +177,13 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
                  .version("00.00")
                  .build();
 
-         return new ImageBuilder()
+         return addTypeMetadata(new ImageBuilder()
                  .ids(from.id())
                  .name(from.name())
                  .description(from.description())
                  .location(fnRegion.apply(from.location()))
                  .status(mapStatus(from.state()))
-                 .operatingSystem(os)
+                 .operatingSystem(os))
                  .build();
       }
 
@@ -211,5 +219,16 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
                return Image.Status.UNRECOGNIZED;
          }
       }
+
+      @Override
+      public ImageBuilder addTypeMetadata(ImageBuilder builder) {
+         return builder.userMetadata(ImmutableMap.of(KEY_PROVISIONABLE_TYPE, Provisionable.Type.SNAPSHOT.toString()));
+      }
+   }
+
+   private interface ImageFunction<T extends Provisionable> extends Function<T, Image> {
+
+      ImageBuilder addTypeMetadata(ImageBuilder builder);
+
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/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 8f5840d..eadc038 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
@@ -18,12 +18,12 @@ 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_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";
-   public static final String POLL_MAX_PERIOD = "jclouds.profitbricks.operation.poll.max-period";
+   public static final String TIMEOUT_DATACENTER_AVAILABLE  = "jclouds.profitbricks.timeout.datacenter-available";
+   public static final String POLL_INITIAL_PERIOD           = "jclouds.profitbricks.poll-status.initial-period";
+   public static final String POLL_MAX_PERIOD               = "jclouds.profitbricks.poll-status.poll.max-period";
 
    private ProfitBricksComputeProperties() {
       throw new AssertionError("Intentionally unimplemented");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java
index 101f154..d3d29d4 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java
@@ -16,10 +16,20 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import com.google.common.base.Enums;
+
 /**
- * Marker interface for {@link org.jclouds.profitbricks.domain.Image} and 
+ * Marker interface for {@link org.jclouds.profitbricks.domain.Image} and
  * {@link org.jclouds.profitbricks.domain.Snapshot}
  */
 public interface Provisionable {
 
+   public enum Type {
+
+      IMAGE, SNAPSHOT;
+
+      public static Type fromValue(String v) {
+         return Enums.getIfPresent(Type.class, v).or(IMAGE);
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/FirewallRuleCommonProperties.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/FirewallRuleCommonProperties.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/FirewallRuleCommonProperties.java
deleted file mode 100644
index c607e38..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/FirewallRuleCommonProperties.java
+++ /dev/null
@@ -1,44 +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.domain.internal;
-
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.profitbricks.domain.Firewall;
-
-public interface FirewallRuleCommonProperties {
-
-   @Nullable
-   String name();
-
-   @Nullable
-   Integer portRangeEnd();
-
-   @Nullable
-   Integer portRangeStart();
-
-   @Nullable
-   Firewall.Protocol protocol();
-
-   @Nullable
-   String sourceIp();
-
-   @Nullable
-   String sourceMac();
-
-   @Nullable
-   String targetIp();
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/HotPluggable.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/HotPluggable.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/HotPluggable.java
deleted file mode 100644
index 98faf41..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/HotPluggable.java
+++ /dev/null
@@ -1,102 +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.domain.internal;
-
-import org.jclouds.javax.annotation.Nullable;
-
-public interface HotPluggable {
-
-   @Nullable
-   Boolean isCpuHotPlug();
-
-   @Nullable
-   Boolean isCpuHotUnPlug();
-
-   @Nullable
-   Boolean isRamHotPlug();
-
-   @Nullable
-   Boolean isRamHotUnPlug();
-
-   @Nullable
-   Boolean isNicHotPlug();
-
-   @Nullable
-   Boolean isNicHotUnPlug();
-
-   @Nullable
-   Boolean isDiscVirtioHotPlug();
-
-   @Nullable
-   Boolean isDiscVirtioHotUnPlug();
-
-   public abstract static class Builder<B extends Builder, D extends HotPluggable> {
-
-      protected Boolean cpuHotPlug;
-      protected Boolean cpuHotUnPlug;
-      protected Boolean ramHotPlug;
-      protected Boolean ramHotUnPlug;
-      protected Boolean nicHotPlug;
-      protected Boolean nicHotUnPlug;
-      protected Boolean discVirtioHotPlug;
-      protected Boolean discVirtioHotUnPlug;
-
-      public B isCpuHotPlug(Boolean cpuHotPlug) {
-         this.cpuHotPlug = cpuHotPlug;
-         return self();
-      }
-
-      public B isCpuHotUnPlug(Boolean cpuHotUnplug) {
-         this.cpuHotUnPlug = cpuHotUnplug;
-         return self();
-      }
-
-      public B isRamHotPlug(Boolean ramHotPlug) {
-         this.ramHotPlug = ramHotPlug;
-         return self();
-      }
-
-      public B isRamHotUnPlug(Boolean ramHotUnplug) {
-         this.ramHotUnPlug = ramHotUnplug;
-         return self();
-      }
-
-      public B isNicHotPlug(Boolean nicHotPlug) {
-         this.nicHotPlug = nicHotPlug;
-         return self();
-      }
-
-      public B isNicHotUnPlug(Boolean nicHotUnPlug) {
-         this.nicHotUnPlug = nicHotUnPlug;
-         return self();
-      }
-
-      public B isDiscVirtioHotPlug(Boolean discVirtioHotPlug) {
-         this.discVirtioHotPlug = discVirtioHotPlug;
-         return self();
-      }
-
-      public B isDiscVirtioHotUnPlug(Boolean discVirtioHotUnPlug) {
-         this.discVirtioHotUnPlug = discVirtioHotUnPlug;
-         return self();
-      }
-
-      public abstract B self();
-
-      public abstract D build();
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/Provisionable.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/Provisionable.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/Provisionable.java
deleted file mode 100644
index b81dc3b..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/Provisionable.java
+++ /dev/null
@@ -1,67 +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.domain.internal;
-
-import org.jclouds.profitbricks.domain.Location;
-import org.jclouds.profitbricks.domain.OsType;
-
-public interface Provisionable extends HotPluggable {
-
-   String id();
-
-   String name();
-
-   float size(); // MB
-
-   Location location();
-
-   OsType osType();
-
-   public abstract static class Builder<B extends Builder, D extends Provisionable> extends HotPluggable.Builder<B, D> {
-
-      protected String id;
-      protected String name;
-      protected float size;
-      protected Location location;
-      protected OsType osType;
-
-      public B id(String id) {
-         this.id = id;
-         return self();
-      }
-
-      public B name(String name) {
-         this.name = name;
-         return self();
-      }
-
-      public B size(float size) {
-         this.size = size;
-         return self();
-      }
-
-      public B location(Location location) {
-         this.location = location;
-         return self();
-      }
-
-      public B osType(OsType osType) {
-         this.osType = osType;
-         return self();
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/ServerCommonProperties.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/ServerCommonProperties.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/ServerCommonProperties.java
deleted file mode 100644
index 382f2cf..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/ServerCommonProperties.java
+++ /dev/null
@@ -1,29 +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.domain.internal;
-
-/**
- * An interface used as common data type for {@link org.jclouds.profitbricks.domain.Server.Builder}
- */
-public interface ServerCommonProperties extends HotPluggable {
-
-   String name();
-
-   int cores();
-
-   int ram(); // in MB
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelope.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelope.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelope.java
index 7f2131d..af78403 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelope.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelope.java
@@ -51,7 +51,7 @@ public class ProfitBricksSoapMessageEnvelope implements HttpRequestFilter {
       String body = SOAP_PREFIX.concat(oldPayload.getRawContent().toString()).concat(SOAP_SUFFIX);
       Payload newPayload = Payloads.newStringPayload(body);
       HttpUtils.copy(oldMetadata, newPayload.getContentMetadata());
-      newPayload.getContentMetadata().setContentLength(Long.valueOf(body.length())); // resize, add prefix/suffix length
+      newPayload.getContentMetadata().setContentLength(Long.valueOf(body.getBytes().length)); // resize, add prefix/suffix length
 
       return request.toBuilder().payload(newPayload).build();
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/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
index 2599f71..dcb1edc 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java
@@ -45,12 +45,12 @@ 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;
+import org.testng.annotations.BeforeClass;
 
 @Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceLiveTest")
 public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTest {
 
-   private static final String TEST_DC_NAME = "computeServiceLiveTest" + System.currentTimeMillis();
+   private static final String TEST_DC_NAME = "computeServiceLiveTest-" + System.currentTimeMillis();
 
    private DataCenter dataCenter;
 
@@ -58,7 +58,7 @@ public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTe
       provider = "profitbricks";
    }
 
-   @BeforeGroups(groups = {"integration", "live"})
+   @BeforeClass
    @Override
    public void setupContext() {
       super.setupContext();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderLiveTest.java
index eff7b01..f81ca28 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderLiveTest.java
@@ -16,19 +16,85 @@
  */
 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 java.util.Set;
 
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableSet;
+import com.google.inject.Key;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+
 import org.jclouds.compute.internal.BaseTemplateBuilderLiveTest;
+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.BeforeClass;
 import org.testng.annotations.Test;
 
-@Test(groups = "live", testName = "ProfitBricksTemplateBuilderLiveTest")
+@Test(groups = "live", testName = "ProfitBricksTemplateBuilderLiveTest", singleThreaded = true)
 public class ProfitBricksTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest {
 
+   private static final String TEST_DC_NAME = "templateBuilderLiveTest-" + System.currentTimeMillis();
+
+   private DataCenter dataCenter;
+
    public ProfitBricksTemplateBuilderLiveTest() {
       this.provider = "profitbricks";
    }
 
+   @BeforeClass
+   @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());
+         }
+      });
+   }
+
+   private Predicate<String> getDataCenterPredicate() {
+      return view.utils().injector().getInstance(Key.get(new TypeLiteral<Predicate<String>>() {
+      }, Names.named(POLL_PREDICATE_DATACENTER)));
+   }
+
+   private DataCenterApi getDataCenterApi() {
+      return view.unwrapApi(ProfitBricksApi.class).dataCenterApi();
+   }
+
+   @AfterClass(groups = {"integration", "live"}, alwaysRun = true)
+   @Override
+   protected void tearDownContext() {
+      super.tearDownContext();
+      if (dataCenter != null)
+         getDataCenterApi().deleteDataCenter(dataCenter.id());
+   }
+
    @Override
    protected Set<String> getIso3166Codes() {
       return ImmutableSet.of();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ProvisionableToImageTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ProvisionableToImageTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ProvisionableToImageTest.java
index d114efb..f27b302 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ProvisionableToImageTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ProvisionableToImageTest.java
@@ -35,6 +35,7 @@ import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
 @Test(groups = "unit", testName = "ProvisionableToImageTest")
@@ -88,6 +89,7 @@ public class ProvisionableToImageTest {
                       .version("14.04")
                       .is64Bit(false)
                       .build())
+              .userMetadata(ImmutableMap.of("provisionableType", "image"))
               .build();
 
       assertEquals(actual, expected);
@@ -118,6 +120,7 @@ public class ProvisionableToImageTest {
                       .version("7")
                       .is64Bit(true)
                       .build())
+              .userMetadata(ImmutableMap.of("provisionableType", "image"))
               .build();
 
       assertEquals(actual1, expected1);
@@ -145,6 +148,7 @@ public class ProvisionableToImageTest {
                       .version("6.5.0")
                       .is64Bit(true)
                       .build())
+              .userMetadata(ImmutableMap.of("provisionableType", "image"))
               .build();
 
       assertEquals(actual2, expected2);
@@ -172,6 +176,7 @@ public class ProvisionableToImageTest {
                       .version("2008")
                       .is64Bit(false)
                       .build())
+              .userMetadata(ImmutableMap.of("provisionableType", "image"))
               .build();
 
       assertEquals(actual3, expected3);
@@ -213,6 +218,7 @@ public class ProvisionableToImageTest {
                       .family(OsFamily.LINUX)
                       .is64Bit(true)
                       .build())
+              .userMetadata(ImmutableMap.of("provisionableType", "snapshot"))
               .build();
 
       assertEquals(actual1, expected1);
@@ -251,6 +257,7 @@ public class ProvisionableToImageTest {
                       .is64Bit(true)
                       .version("00.00")
                       .build())
+              .userMetadata(ImmutableMap.of("provisionableType", "snapshot"))
               .build();
 
       assertEquals(actual2, expected2);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiLiveTest.java
index 10a3f38..fa7eea0 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiLiveTest.java
@@ -21,6 +21,7 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
 import org.jclouds.profitbricks.domain.OsType;
@@ -36,6 +37,8 @@ import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
 import com.google.common.collect.FluentIterable;
 
+import org.jclouds.util.Predicates2;
+
 @Test(groups = "live", testName = "SnapshotApiLiveTest")
 public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
 
@@ -142,8 +145,20 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
    @Test(dependsOnMethods = "testRollbackSnapshot", alwaysRun = true)
    public void testDeleteSnapshot() {
       assertSnapshotAvailable(createdSnapshotId);
-      boolean result = api.snapshotApi().deleteSnapshot(createdSnapshotId);
-      assertTrue(result, "Created snapshot wasn't deleted");
+      // Newly created snapshots doesn't seem to reflect in the API right away,
+      // so we need to persistently try to delete (to clean up resources as well)
+      Predicate<String> persistentDelete = Predicates2.retry(new Predicate<String>() {
+
+         @Override
+         public boolean apply(String input) {
+            try {
+               return api.snapshotApi().deleteSnapshot(input);
+            } catch (Exception ex) {
+               return false;
+            }
+         }
+      }, 120L, 5L, 10L, TimeUnit.SECONDS);
+      assertTrue(persistentDelete.apply(createdSnapshotId), "Created snapshot wasn't deleted");
    }
 
    @AfterClass(alwaysRun = true)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/235b4b98/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelopeTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelopeTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelopeTest.java
index 7413d01..f6892b7 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelopeTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelopeTest.java
@@ -45,7 +45,7 @@ public class ProfitBricksSoapMessageEnvelopeTest {
       HttpRequest filtered = soapEnvelope.filter(request);
 
       assertEquals(filtered.getPayload().getRawContent(), expectedPayload);
-      assertEquals(filtered.getPayload().getContentMetadata().getContentLength(), Long.valueOf(expectedPayload.length()));
+      assertEquals(filtered.getPayload().getContentMetadata().getContentLength(), Long.valueOf(expectedPayload.getBytes().length));
    }
 
    @Test(expectedExceptions = NullPointerException.class, expectedExceptionsMessageRegExp = ".*must contain payload message.*")