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.*")