You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2016/10/06 11:09:45 UTC

[2/4] jclouds-labs git commit: ComputeService implementation for ProfitBricks Rest

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/ProvisionableToImageTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/ProvisionableToImageTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/ProvisionableToImageTest.java
new file mode 100644
index 0000000..1861ebf
--- /dev/null
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/ProvisionableToImageTest.java
@@ -0,0 +1,198 @@
+/*
+ * 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.apache.jclouds.profitbricks.rest.compute.function;
+
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import java.util.Set;
+import org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksApiMockTest;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.ImageBuilder;
+import org.jclouds.compute.domain.OperatingSystem;
+import org.jclouds.compute.domain.OsFamily;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import static org.testng.Assert.assertEquals;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "ProvisionableToImageTest", singleThreaded = true)
+public class ProvisionableToImageTest extends BaseProfitBricksApiMockTest {
+
+   private ProvisionableToImage fnImage;
+
+   private final Location location = new LocationBuilder().id("us/las").description("us/las").scope(LocationScope.ZONE)
+           .parent(new LocationBuilder().id("us").description("us").scope(LocationScope.REGION).build()).build();
+
+   @BeforeTest
+   public void setup() {
+      this.fnImage = new ProvisionableToImage(Suppliers.<Set<? extends Location>>ofInstance(ImmutableSet.of(location)));
+   }
+
+   @Test
+   public void testImageToImage() {
+
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/compute/image.json"))
+      );
+
+      org.apache.jclouds.profitbricks.rest.domain.Image image = api.imageApi().getImage("some-id");
+
+      Image actual = fnImage.apply(image);
+
+      Image expected = new ImageBuilder()
+              .ids(image.id())
+              .name(image.properties().name())
+              .location(location)
+              .status(Image.Status.AVAILABLE)
+              .operatingSystem(OperatingSystem.builder()
+                      .description("UBUNTU")
+                      .family(OsFamily.UBUNTU)
+                      .version("14.04")
+                      .is64Bit(false)
+                      .build())
+              .build();
+
+      assertEquals(actual, expected);
+   }
+
+   @Test
+   public void testImageDescriptionParsing() {
+
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/compute/image1.json"))
+      );
+
+      org.apache.jclouds.profitbricks.rest.domain.Image image1 = api.imageApi().getImage("some-id");
+
+      Image actual1 = fnImage.apply(image1);
+
+      Image expected1 = new ImageBuilder()
+              .ids(image1.id())
+              .name(image1.properties().name())
+              .location(location)
+              .status(Image.Status.AVAILABLE)
+              .operatingSystem(OperatingSystem.builder()
+                      .description("FEDORA")
+                      .family(OsFamily.FEDORA)
+                      .version("7")
+                      .is64Bit(true)
+                      .build())
+              .build();
+
+      assertEquals(actual1, expected1);
+
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/compute/image2.json"))
+      );
+
+      org.apache.jclouds.profitbricks.rest.domain.Image image2 = api.imageApi().getImage("some-id");
+
+      Image actual2 = fnImage.apply(image2);
+
+      Image expected2 = new ImageBuilder()
+              .ids(image2.id())
+              .name(image2.properties().name())
+              .location(location)
+              .status(Image.Status.AVAILABLE)
+              .operatingSystem(OperatingSystem.builder()
+                      .description("UNRECOGNIZED")
+                      .family(OsFamily.UNRECOGNIZED)
+                      .version("6.5.0")
+                      .is64Bit(true)
+                      .build())
+              .build();
+
+      assertEquals(actual2, expected2);
+
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/compute/image3.json"))
+      );
+
+      org.apache.jclouds.profitbricks.rest.domain.Image image3 = api.imageApi().getImage("some-id");
+
+      Image actual3 = fnImage.apply(image3);
+
+      Image expected3 = new ImageBuilder()
+              .ids(image3.id())
+              .name(image3.properties().name())
+              .location(location)
+              .status(Image.Status.AVAILABLE)
+              .operatingSystem(OperatingSystem.builder()
+                      .description("WINDOWS")
+                      .family(OsFamily.WINDOWS)
+                      .version("2008")
+                      .is64Bit(false)
+                      .build())
+              .build();
+
+      assertEquals(actual3, expected3);
+   }
+
+   @Test
+   public void testSnapshotToImage() {
+
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/compute/snapshot1.json"))
+      );
+
+      org.apache.jclouds.profitbricks.rest.domain.Snapshot snapshot1 = api.snapshotApi().get("some-id");
+
+      Image actual1 = fnImage.apply(snapshot1);
+
+      Image expected1 = new ImageBuilder()
+              .ids(snapshot1.id())
+              .name(snapshot1.properties().name())
+              .location(location)
+              .status(Image.Status.AVAILABLE)
+              .operatingSystem(OperatingSystem.builder()
+                      .description(snapshot1.properties().description())
+                      .family(OsFamily.LINUX)
+                      .is64Bit(true)
+                      .build())
+              .build();
+
+      assertEquals(actual1, expected1);
+
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/compute/snapshot2.json"))
+      );
+
+      org.apache.jclouds.profitbricks.rest.domain.Snapshot snapshot2 = api.snapshotApi().get("some-id");
+
+      Image actual2 = fnImage.apply(snapshot2);
+
+      Image expected2 = new ImageBuilder()
+              .ids(snapshot2.id())
+              .name(snapshot2.properties().name())
+              .location(location)
+              .status(Image.Status.PENDING)
+              .operatingSystem(OperatingSystem.builder()
+                      .description("ubuntu")
+                      .family(OsFamily.UBUNTU)
+                      .is64Bit(true)
+                      .version("00.00")
+                      .build())
+              .build();
+
+      assertEquals(actual2, expected2);
+      assertEquals(actual2.getOperatingSystem(), expected2.getOperatingSystem());
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/ServerInDataCenterToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/ServerInDataCenterToNodeMetadataTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/ServerInDataCenterToNodeMetadataTest.java
new file mode 100644
index 0000000..3c35e56
--- /dev/null
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/ServerInDataCenterToNodeMetadataTest.java
@@ -0,0 +1,157 @@
+/*
+ * 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.apache.jclouds.profitbricks.rest.compute.function;
+
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.name.Names;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import java.util.Set;
+import org.apache.jclouds.profitbricks.rest.ProfitBricksApi;
+import org.apache.jclouds.profitbricks.rest.ProfitBricksApiMetadata;
+import org.apache.jclouds.profitbricks.rest.domain.DataCenter;
+import org.apache.jclouds.profitbricks.rest.domain.Server;
+import org.apache.jclouds.profitbricks.rest.domain.zonescoped.ServerInDataCenter;
+import org.apache.jclouds.profitbricks.rest.features.DataCenterApi;
+import org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksApiMockTest;
+import org.easymock.EasyMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.NodeMetadataBuilder;
+import org.jclouds.compute.domain.OperatingSystem;
+import org.jclouds.compute.domain.OsFamily;
+import org.jclouds.compute.domain.Processor;
+import org.jclouds.compute.domain.Volume;
+import org.jclouds.compute.domain.VolumeBuilder;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "ServerInDataCenterToNodeMetadataTest", singleThreaded = true)
+public class ServerInDataCenterToNodeMetadataTest extends BaseProfitBricksApiMockTest {
+
+   private ServerInDataCenterToNodeMetadata fnNodeMetadata;
+   private DataCenterApi dataCenterApi;
+
+   @BeforeTest
+   public void setup() {
+      Supplier<Set<? extends Location>> locationsSupply = new Supplier<Set<? extends Location>>() {
+
+         @Override
+         public Set<? extends Location> get() {
+            return ImmutableSet.of(
+                    new LocationBuilder()
+                    .id("mock")
+                    .description("JClouds-DC")
+                    .scope(LocationScope.REGION)
+                    .metadata(ImmutableMap.<String, Object>of(
+                            "version", "10",
+                            "state", "AVAILABLE"))
+                    .parent(new LocationBuilder()
+                            .id("de/fra")
+                            .description("Germany, Frankfurt (M)")
+                            .scope(LocationScope.PROVIDER)
+                            .build())
+                    .build());
+         }
+      };
+
+      GroupNamingConvention.Factory namingConvention = Guice.createInjector(new AbstractModule() {
+         @Override
+         protected void configure() {
+            Names.bindProperties(binder(), new ProfitBricksApiMetadata().getDefaultProperties());
+         }
+      }).getInstance(GroupNamingConvention.Factory.class);
+
+      api = EasyMock.createMock(ProfitBricksApi.class);
+      dataCenterApi = EasyMock.createMock(DataCenterApi.class);
+      expect(dataCenterApi.getDataCenter("mock")).andReturn(
+              DataCenter.create("mock", "datacenter", "href", null, DataCenter.Properties.create("location", "location", org.apache.jclouds.profitbricks.rest.domain.Location.MOCK, 0), null));
+      expect(api.dataCenterApi()).andReturn(dataCenterApi);
+
+      replay(dataCenterApi, api);
+
+      this.fnNodeMetadata = new ServerInDataCenterToNodeMetadata(new VolumeToVolume(), locationsSupply, api, namingConvention);
+   }
+
+   @Test
+   public void testServerInDataCenterToNodeMetadata() {
+
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/compute/server.json"))
+      );
+      Server serverObject = api.serverApi().getServer("mock", "some-id");
+
+      ServerInDataCenter server = new ServerInDataCenter(serverObject, "mock");
+
+      NodeMetadata expected = fnNodeMetadata.apply(server);
+      assertNotNull(expected);
+
+      NodeMetadata actual = new NodeMetadataBuilder()
+              .group("docker001")
+              .ids(server.getDataCenter() + "/" + serverObject.id())
+              .name(server.getServer().properties().name())
+              .backendStatus("AVAILABLE")
+              .status(NodeMetadata.Status.RUNNING)
+              .hardware(new HardwareBuilder()
+                      .ids("cpu=4,ram=4096,disk=40")
+                      .name("cpu=4,ram=4096,disk=40")
+                      .ram(server.getServer().properties().ram())
+                      .processor(new Processor(server.getServer().properties().cores(), 1d))
+                      .hypervisor("kvm")
+                      .volume(new VolumeBuilder()
+                              .bootDevice(true)
+                              .size(40f)
+                              .id("c04a2198-7e60-4bc0-b869-6e9c9dbcb8e1")
+                              .durable(true)
+                              .type(Volume.Type.LOCAL)
+                              .build())
+                      .build())
+              .operatingSystem(new OperatingSystem.Builder()
+                      .description(OsFamily.LINUX.value())
+                      .family(OsFamily.LINUX)
+                      .build())
+              .location(new LocationBuilder()
+                      .id("mock")
+                      .description("JClouds-DC")
+                      .scope(LocationScope.REGION)
+                      .metadata(ImmutableMap.<String, Object>of(
+                              "version", "10",
+                              "state", "AVAILABLE"))
+                      .parent(new LocationBuilder()
+                              .id("de/fra")
+                              .description("Germany, Frankfurt (M)")
+                              .scope(LocationScope.PROVIDER)
+                              .build())
+                      .build())
+              .publicAddresses(ImmutableList.<String>of("173.252.120.6"))
+              .build();
+
+      assertEquals(actual, expected);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/VolumeToVolumeTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/VolumeToVolumeTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/VolumeToVolumeTest.java
new file mode 100644
index 0000000..979fee7
--- /dev/null
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/compute/function/VolumeToVolumeTest.java
@@ -0,0 +1,58 @@
+/*
+ * 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.apache.jclouds.profitbricks.rest.compute.function;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksApiMockTest;
+import org.jclouds.compute.domain.Volume;
+import org.jclouds.compute.domain.VolumeBuilder;
+import static org.testng.Assert.assertEquals;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "VolumeToVolumeTest", singleThreaded = true)
+public class VolumeToVolumeTest extends BaseProfitBricksApiMockTest {
+
+   private VolumeToVolume fnVolume;
+
+   @BeforeTest
+   public void setup() {
+      this.fnVolume = new VolumeToVolume();
+   }
+
+   @Test
+   public void testVolumeToVolume() {
+
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/compute/volume.json"))
+      );
+
+      org.apache.jclouds.profitbricks.rest.domain.Volume volume = api.volumeApi().getVolume("datacenter-id", "some-id");
+
+      Volume actual = fnVolume.apply(volume);
+
+      Volume expected = new VolumeBuilder()
+              .id(volume.id())
+              .size(40f)
+              .device("1")
+              .durable(true)
+              .type(Volume.Type.LOCAL)
+              .build();
+
+      assertEquals(actual, expected);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/DataCenterApiMockTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/DataCenterApiMockTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/DataCenterApiMockTest.java
index 4e73323..22d5ae2 100644
--- a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/DataCenterApiMockTest.java
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/DataCenterApiMockTest.java
@@ -30,23 +30,23 @@ import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "DataCenterApiMockTest", singleThreaded = true)
 public class DataCenterApiMockTest extends BaseProfitBricksApiMockTest {
-   
+
    @Test
    public void testGetList() throws InterruptedException {
       server.enqueue(
-         new MockResponse().setBody(stringFromResource("/datacenter/list.json"))
+              new MockResponse().setBody(stringFromResource("/datacenter/list.json"))
       );
-      
+
       List<DataCenter> list = dataCenterApi().list();
-      
+
       assertNotNull(list);
       assertEquals(list.size(), 3);
       assertEquals(list.get(0).properties().name(), "vea");
-      
+
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/datacenters");
    }
-   
+
    @Test
    public void testGetListWith404() throws InterruptedException {
       server.enqueue(response404());
@@ -55,81 +55,82 @@ public class DataCenterApiMockTest extends BaseProfitBricksApiMockTest {
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/datacenters?depth=1");
    }
-    
+
    @Test
    public void testGetDataCenter() throws InterruptedException {
       MockResponse response = new MockResponse();
       response.setBody(stringFromResource("/datacenter/get.json"));
       response.setHeader("Content-Type", "application/vnd.profitbricks.resource+json");
-      
+
       server.enqueue(response);
-      
+
       DataCenter dataCenter = dataCenterApi().getDataCenter("some-id");
-      
+
       assertNotNull(dataCenter);
       assertEquals(dataCenter.properties().name(), "docker");
-      
+      assertEquals(dataCenter.properties().location(), Location.US_LAS);
+
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/datacenters/some-id");
    }
-   
+
    public void testGetDataCenterWith404() throws InterruptedException {
       server.enqueue(response404());
 
       DataCenter dataCenter = dataCenterApi().getDataCenter("some-id");
-      
+
       assertNull(dataCenter);
 
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/datacenters/some-id");
    }
-   
+
    @Test
    public void testCreate() throws InterruptedException {
       server.enqueue(
-         new MockResponse().setBody(stringFromResource("/datacenter/get.json"))
+              new MockResponse().setBody(stringFromResource("/datacenter/get.json"))
       );
-      
-      DataCenter dataCenter = dataCenterApi().create("test-data-center", "example description", Location.US_LAS.value());
-      
+
+      DataCenter dataCenter = dataCenterApi().create("test-data-center", "example description", Location.US_LAS.getId());
+
       assertNotNull(dataCenter);
       assertNotNull(dataCenter.id());
-      
+
       assertEquals(server.getRequestCount(), 1);
-      assertSent(server, "POST", "/datacenters", 
+      assertSent(server, "POST", "/datacenters",
               "{\"properties\": {\"name\": \"test-data-center\", \"description\": \"example description\",\"location\": \"us/las\"}}"
       );
    }
-   
+
    @Test
    public void testUpdate() throws InterruptedException {
       server.enqueue(
-         new MockResponse().setBody(stringFromResource("/datacenter/get.json"))
+              new MockResponse().setBody(stringFromResource("/datacenter/get.json"))
       );
-      
+
       DataCenter dataCenter = dataCenterApi().update("some-id", "new name");
-      
+
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "PATCH", "/datacenters/some-id", "{\"name\": \"new name\"}");
    }
-   
+
    @Test
    public void testDelete() throws InterruptedException {
       server.enqueue(response204());
-      
+
       dataCenterApi().delete("some-id");
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "DELETE", "/datacenters/some-id");
    }
-   
+
    @Test
    public void testDepth() throws InterruptedException {
-      
+
       for (int i = 1; i <= 5; ++i) {
          server.enqueue(
-            new MockResponse().setBody(
-               stringFromResource(String.format("/datacenter/get-depth-%d.json", i))
-            )
+                 new MockResponse().setBody(
+                         stringFromResource(String.format("/datacenter/get-depth-%d.json", i))
+                 )
          );
          DataCenter dataCenter = dataCenterApi().getDataCenter("some-id", new DepthOptions().depth(i));
          assertNotNull(dataCenter);
@@ -137,9 +138,9 @@ public class DataCenterApiMockTest extends BaseProfitBricksApiMockTest {
          assertSent(server, "GET", "/datacenters/some-id?depth=" + i);
       }
    }
-     
+
    private DataCenterApi dataCenterApi() {
       return api.dataCenterApi();
    }
-   
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/IpBlockApiMockTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/IpBlockApiMockTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/IpBlockApiMockTest.java
new file mode 100644
index 0000000..db68b3d
--- /dev/null
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/IpBlockApiMockTest.java
@@ -0,0 +1,150 @@
+/*
+ * 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.apache.jclouds.profitbricks.rest.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import java.util.List;
+import org.apache.jclouds.profitbricks.rest.domain.IpBlock;
+import org.apache.jclouds.profitbricks.rest.domain.Location;
+import org.apache.jclouds.profitbricks.rest.domain.options.DepthOptions;
+import org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksApiMockTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "IpBlockApiMockTest", singleThreaded = true)
+public class IpBlockApiMockTest extends BaseProfitBricksApiMockTest {
+
+   private IpBlockApi ipBlockApi() {
+      return api.ipBlockApi();
+   }
+
+   @Test
+   public void testList() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/ipblock/list.json"))
+      );
+
+      List<IpBlock> list = ipBlockApi().list();
+
+      assertNotNull(list);
+      assertEquals(list.size(), 2);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/ipblocks");
+   }
+
+   @Test
+   public void testListWith404() throws InterruptedException {
+      server.enqueue(response404());
+      List<IpBlock> list = ipBlockApi().list();
+      assertTrue(list.isEmpty());
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/ipblocks");
+   }
+
+   @Test
+   public void testListWithDepth() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/ipblock/list.depth-5.json"))
+      );
+
+      List<IpBlock> list = ipBlockApi().list(new DepthOptions().depth(5));
+
+      assertNotNull(list);
+      assertEquals(list.size(), 2);
+      assertEquals(list.get(0).properties().name(), "jclouds-block");
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/ipblocks?depth=5");
+   }
+
+   @Test
+   public void testListWith404WithDepth() throws InterruptedException {
+      server.enqueue(response404());
+      List<IpBlock> list = ipBlockApi().list(new DepthOptions().depth(5));
+      assertTrue(list.isEmpty());
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/ipblocks?depth=5");
+   }
+
+   @Test
+   public void testGetIpBlock() throws InterruptedException {
+      MockResponse response = new MockResponse();
+      response.setBody(stringFromResource("/ipblock/get.json"));
+      response.setHeader("Content-Type", "application/vnd.profitbricks.resource+json");
+
+      server.enqueue(response);
+
+      IpBlock ipblock = ipBlockApi().get("some-id");
+
+      assertNotNull(ipblock);
+      assertEquals(ipblock.properties().name(), "jclouds-block");
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/ipblocks/some-id");
+   }
+
+   public void testGetIpBlockWith404() throws InterruptedException {
+      server.enqueue(response404());
+
+      IpBlock ipblock = ipBlockApi().get("some-id");
+
+      assertEquals(ipblock, null);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/ipblocks/some-id");
+   }
+
+   @Test
+   public void testCreate() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/ipblock/get.json"))
+      );
+
+      IpBlock.PropertiesRequest properties = IpBlock.PropertiesRequest.create("jclouds-block", Location.US_LAS.getId(), 2);
+      IpBlock ipblock = ipBlockApi().create(
+              IpBlock.Request.creatingBuilder()
+              .properties(properties)
+              .build());
+
+      assertNotNull(ipblock);
+      assertNotNull(ipblock.id());
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "POST", "/ipblocks",
+              "{\"properties\":{\n"
+              + "\"name\":\"jclouds-block\",\n"
+              + "\"location\":\"us/las\",\n"
+              + "\"size\":2}\n"
+              + "}"
+      );
+   }
+
+   @Test
+   public void testDelete() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody("")
+      );
+
+      ipBlockApi().delete("some-id");
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "DELETE", "/ipblocks/some-id");
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/IpblockApiLiveTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/IpblockApiLiveTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/IpblockApiLiveTest.java
new file mode 100644
index 0000000..c88ccda
--- /dev/null
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/IpblockApiLiveTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.apache.jclouds.profitbricks.rest.features;
+
+import com.google.common.base.Predicate;
+import java.util.List;
+import org.apache.jclouds.profitbricks.rest.domain.IpBlock;
+import org.apache.jclouds.profitbricks.rest.domain.Location;
+import org.apache.jclouds.profitbricks.rest.domain.State;
+import org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksLiveTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", testName = "IpblockApiLiveTest")
+public class IpblockApiLiveTest extends BaseProfitBricksLiveTest {
+
+   IpBlock testIpBlock;
+
+   private IpBlockApi ipBlockApi() {
+      return api.ipBlockApi();
+   }
+
+   @BeforeClass
+   public void setupTest() {
+      testIpBlock = ipBlockApi().create(IpBlock.Request.creatingBuilder()
+              .properties(IpBlock.PropertiesRequest.create("jclouds ipBlock", Location.US_LAS.getId(), 1)).build());
+      assertIpBlockAvailable(testIpBlock);
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void teardownTest() {
+      if (testIpBlock != null) {
+         ipBlockApi().delete(testIpBlock.id());
+         assertIpBlockRemoved(testIpBlock);
+
+      }
+   }
+
+   @Test
+   public void testGetNic() {
+      IpBlock ipBlock = ipBlockApi().get(testIpBlock.id());
+
+      assertNotNull(ipBlock);
+      assertEquals(ipBlock.id(), testIpBlock.id());
+   }
+
+   @Test
+   public void testList() {
+      List<IpBlock> ipBlocks = ipBlockApi().list();
+
+      assertNotNull(ipBlocks);
+      assertFalse(ipBlocks.isEmpty());
+   }
+
+   private void assertIpBlockAvailable(IpBlock ipblock) {
+      assertPredicate(new Predicate<IpBlock>() {
+         @Override
+         public boolean apply(IpBlock testIpBlock) {
+            IpBlock ipBlock = ipBlockApi().get(testIpBlock.id());
+            if (ipBlock == null || ipBlock.metadata() == null) {
+               return false;
+            }
+
+            return ipBlock.metadata().state() == State.AVAILABLE;
+         }
+      }, ipblock);
+   }
+
+   private void assertIpBlockRemoved(IpBlock ipblock) {
+      assertPredicate(new Predicate<IpBlock>() {
+         @Override
+         public boolean apply(IpBlock testIpBlock) {
+            return ipBlockApi().get(testIpBlock.id()) == null;
+         }
+      }, ipblock);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/ServerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/ServerApiLiveTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/ServerApiLiveTest.java
index 6117cf7..e81b8fb 100644
--- a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/ServerApiLiveTest.java
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/ServerApiLiveTest.java
@@ -18,6 +18,7 @@ package org.apache.jclouds.profitbricks.rest.features;
 
 import com.google.common.base.Predicate;
 import java.util.List;
+import org.apache.jclouds.profitbricks.rest.domain.CpuFamily;
 import org.apache.jclouds.profitbricks.rest.domain.DataCenter;
 import org.apache.jclouds.profitbricks.rest.domain.Image;
 import org.apache.jclouds.profitbricks.rest.domain.Server;
@@ -26,13 +27,13 @@ import org.apache.jclouds.profitbricks.rest.domain.Volume;
 import org.apache.jclouds.profitbricks.rest.ids.ServerRef;
 import org.apache.jclouds.profitbricks.rest.ids.VolumeRef;
 import org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksLiveTest;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
 
 @Test(groups = "live", testName = "ServerApiLiveTest")
 public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
@@ -41,7 +42,7 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    private Server testServer;
    private Image attachedCdrom;
    private Volume attachedVolume;
-  
+   
    @BeforeClass
    public void setupTest() {
       dataCenter = createDataCenter();
@@ -49,40 +50,41 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    
    @AfterClass(alwaysRun = true)
    public void teardownTest() {
-      if (dataCenter != null)
+      if (dataCenter != null) {
          deleteDataCenter(dataCenter.id());
+      }
    }
-     
+   
    @Test
    public void testCreateServer() {
       assertNotNull(dataCenter);
-            
+      
       testServer = serverApi().createServer(
               Server.Request.creatingBuilder()
               .dataCenterId(dataCenter.id())
               .name("jclouds-node")
+              .cpuFamily(CpuFamily.INTEL_XEON)
               .cores(1)
               .ram(1024)
               .build());
-
+      
       assertNotNull(testServer);
       assertEquals(testServer.properties().name(), "jclouds-node");
       assertNodeRunning(ServerRef.create(dataCenter.id(), testServer.id()));
    }
    
-
    @Test(dependsOnMethods = "testCreateServer")
    public void testGetServer() {
       Server server = serverApi().getServer(dataCenter.id(), testServer.id());
-
+      
       assertNotNull(server);
       assertEquals(server.id(), testServer.id());
    }
-
+   
    @Test(dependsOnMethods = "testCreateServer")
    public void testList() {
       List<Server> servers = serverApi().getList(dataCenter.id());
-
+      
       assertNotNull(servers);
       assertFalse(servers.isEmpty());
       assertEquals(servers.size(), 1);
@@ -100,10 +102,9 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
               .ram(1024 * 2)
               .cores(2)
               .build());
-
-      assertDataCenterAvailable(dataCenter);
-
+      
       assertNodeAvailable(ServerRef.create(dataCenter.id(), testServer.id()));
+      assertDataCenterAvailable(dataCenter);
       assertNodeRunning(ServerRef.create(dataCenter.id(), testServer.id()));
       
       Server server = serverApi().getServer(dataCenter.id(), testServer.id());
@@ -115,16 +116,16 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    public void testStopServer() {
       serverApi().stopServer(testServer.dataCenterId(), testServer.id());
       assertNodeSuspended(ServerRef.create(dataCenter.id(), testServer.id()));
-
+      
       Server server = serverApi().getServer(testServer.dataCenterId(), testServer.id());
       assertEquals(server.properties().vmState(), Server.Status.SHUTOFF);
    }
-
+   
    @Test(dependsOnMethods = "testStopServer")
    public void testStartServer() {
       serverApi().startServer(testServer.dataCenterId(), testServer.id());
       assertNodeRunning(ServerRef.create(dataCenter.id(), testServer.id()));
-
+      
       Server server = serverApi().getServer(testServer.dataCenterId(), testServer.id());
       assertEquals(server.properties().vmState(), Server.Status.RUNNING);
    }
@@ -133,7 +134,7 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    public void testRebootServer() {
       serverApi().rebootServer(testServer.dataCenterId(), testServer.id());
       assertNodeRunning(ServerRef.create(dataCenter.id(), testServer.id()));
-
+      
       Server server = serverApi().getServer(testServer.dataCenterId(), testServer.id());
       assertEquals(server.properties().vmState(), Server.Status.RUNNING);
    }
@@ -152,11 +153,11 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
       assertVolumeAvailable(VolumeRef.create(dataCenter.id(), volume.id()));
       
       attachedVolume = serverApi().attachVolume(
-         Server.Request.attachVolumeBuilder()
-            .dataCenterId(testServer.dataCenterId())
-            .serverId(testServer.id())
-            .volumeId(volume.id())
-            .build()
+              Server.Request.attachVolumeBuilder()
+              .dataCenterId(testServer.dataCenterId())
+              .serverId(testServer.id())
+              .volumeId(volume.id())
+              .build()
       );
       
       assertVolumeAttached(testServer, volume.id());
@@ -175,7 +176,7 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    public void testDetachVolume() {
       serverApi().detachVolume(testServer.dataCenterId(), testServer.id(), attachedVolume.id());
       assertVolumeDetached(testServer, attachedVolume.id());
-   }   
+   }
    
    @Test(dependsOnMethods = "testDetachVolume")
    public void testListCdroms() {
@@ -186,11 +187,11 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    @Test(dependsOnMethods = "testListCdroms")
    public void testAttachCdrom() {
       attachedCdrom = serverApi().attachCdrom(
-         Server.Request.attachCdromBuilder()
-            .dataCenterId(testServer.dataCenterId())
-            .serverId(testServer.id())
-            .imageId("7cb4b3a3-50c3-11e5-b789-52540066fee9")
-            .build()
+              Server.Request.attachCdromBuilder()
+              .dataCenterId(testServer.dataCenterId())
+              .serverId(testServer.id())
+              .imageId("7cb4b3a3-50c3-11e5-b789-52540066fee9")
+              .build()
       );
       assertEquals(attachedCdrom.properties().name(), "ubuntu-14.04.3-server-amd64.iso");
       assertCdromAvailable(testServer, attachedCdrom.id());
@@ -228,14 +229,15 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
             String[] params = args.split(",");
             Image cdrom = serverApi().getCdrom(params[0], params[1], params[2]);
             
-            if (cdrom == null || cdrom.metadata() == null)
+            if (cdrom == null || cdrom.metadata() == null) {
                return false;
+            }
             
             return cdrom.metadata().state() == State.AVAILABLE;
          }
       }, complexId(server.dataCenterId(), server.id(), cdRomId));
    }
-
+   
    private void assertCdromRemoved(Server server, String cdRomId) {
       assertPredicate(new Predicate<String>() {
          @Override
@@ -253,14 +255,15 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
             String[] params = args.split(",");
             Volume volume = serverApi().getVolume(params[0], params[1], params[2]);
             
-            if (volume == null || volume.metadata() == null)
+            if (volume == null || volume.metadata() == null) {
                return false;
+            }
             
             return volume.metadata().state() == State.AVAILABLE;
          }
       }, complexId(server.dataCenterId(), server.id(), volumeId));
    }
-
+   
    private void assertVolumeDetached(Server server, String volumeId) {
       assertPredicate(new Predicate<String>() {
          @Override
@@ -270,5 +273,5 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
          }
       }, complexId(server.dataCenterId(), server.id(), volumeId));
    }
-      
+   
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiLiveTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiLiveTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiLiveTest.java
index d4703a9..c3ade07 100644
--- a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiLiveTest.java
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiLiveTest.java
@@ -21,69 +21,72 @@ import com.google.common.collect.Iterables;
 import java.util.List;
 import org.apache.jclouds.profitbricks.rest.domain.DataCenter;
 import org.apache.jclouds.profitbricks.rest.domain.LicenceType;
+import org.apache.jclouds.profitbricks.rest.domain.ProvisioningState;
 import org.apache.jclouds.profitbricks.rest.domain.Snapshot;
 import org.apache.jclouds.profitbricks.rest.domain.State;
 import org.apache.jclouds.profitbricks.rest.domain.Volume;
 import org.apache.jclouds.profitbricks.rest.ids.VolumeRef;
 import org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksLiveTest;
-import org.testng.annotations.Test;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
 
 @Test(groups = "live", testName = "SnapshotApiLiveTest")
 public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
-   
+
    private DataCenter dataCenter;
    private Volume testVolume;
    private Snapshot testSnapshot;
-   
+
    @BeforeClass
    public void setupTest() {
       dataCenter = createDataCenter();
       assertDataCenterAvailable(dataCenter);
 
       testVolume = api.volumeApi().createVolume(
-         Volume.Request.creatingBuilder()
-         .dataCenterId(dataCenter.id())
-         .name("jclouds-volume")
-         .size(3)
-         .licenceType(LicenceType.LINUX)
-         .build()
+              Volume.Request.creatingBuilder()
+              .dataCenterId(dataCenter.id())
+              .name("jclouds-volume")
+              .size(3)
+              .licenceType(LicenceType.LINUX)
+              .build()
       );
 
       assertNotNull(testVolume);
       assertVolumeAvailable(testVolume);
-      
+
       testSnapshot = api.volumeApi().createSnapshot(
-         Volume.Request.createSnapshotBuilder()
-            .dataCenterId(testVolume.dataCenterId())
-            .volumeId(testVolume.id())
-            .name("test-snapshot")
-            .description("snapshot desc...")
-            .build());
+              Volume.Request.createSnapshotBuilder()
+              .dataCenterId(testVolume.dataCenterId())
+              .volumeId(testVolume.id())
+              .name("test-snapshot")
+              .description("snapshot desc...")
+              .build());
 
       assertSnapshotAvailable(testSnapshot);
    }
 
    @AfterClass(alwaysRun = true)
    public void teardownTest() {
-      if (dataCenter != null)
+      if (dataCenter != null) {
          deleteDataCenter(dataCenter.id());
+      }
    }
-   
+
    @Test
    public void testList() {
       List<Snapshot> snapshots = snapshotApi().list();
 
       assertNotNull(snapshots);
       assertFalse(snapshots.isEmpty());
-            
+
       assertTrue(Iterables.any(snapshots, new Predicate<Snapshot>() {
-         @Override public boolean apply(Snapshot input) {
+         @Override
+         public boolean apply(Snapshot input) {
             return input.id().equals(testSnapshot.id());
          }
       }));
@@ -96,21 +99,21 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
       assertNotNull(snapshot);
       assertEquals(snapshot.id(), testSnapshot.id());
       assertEquals(snapshot.properties().name(), "test-snapshot");
-   }  
-   
+   }
+
    @Test(dependsOnMethods = "testGetSnapshot")
    public void testUpdateSnapshot() {
       Snapshot snapshot = snapshotApi().update(
-         Snapshot.Request.updatingBuilder()
-         .id(testSnapshot.id())
-         .name("test-snapshot new name")
-         .build()
+              Snapshot.Request.updatingBuilder()
+              .id(testSnapshot.id())
+              .name("test-snapshot new name")
+              .build()
       );
 
       assertVolumeAvailable(testVolume);
       assertEquals(snapshot.properties().name(), "test-snapshot new name");
    }
-   
+
    @Test(dependsOnMethods = "testUpdateSnapshot")
    public void testDeleteSnapshot() {
       api.volumeApi().deleteVolume(testVolume.dataCenterId(), testVolume.id());
@@ -118,19 +121,20 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
       snapshotApi().delete(testSnapshot.id());
       assertSnapshotRemoved(testSnapshot);
    }
-   
+
    private SnapshotApi snapshotApi() {
       return api.snapshotApi();
    }
-   
+
    private void assertVolumeAvailable(Volume volume) {
       assertPredicate(new Predicate<VolumeRef>() {
          @Override
          public boolean apply(VolumeRef volumeRef) {
             Volume volume = api.volumeApi().getVolume(volumeRef.dataCenterId(), volumeRef.volumeId());
 
-            if (volume == null || volume.metadata() == null)
+            if (volume == null || volume.metadata() == null) {
                return false;
+            }
 
             return volume.metadata().state() == State.AVAILABLE;
          }
@@ -152,14 +156,15 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
          public boolean apply(String id) {
             Snapshot snapshot = api.snapshotApi().get(id);
 
-            if (snapshot == null || snapshot.metadata() == null)
+            if (snapshot == null || snapshot.metadata() == null) {
                return false;
+            }
 
-            return snapshot.metadata().state() == State.AVAILABLE;
+            return snapshot.metadata().state() == ProvisioningState.AVAILABLE;
          }
       }, snapshot.id());
    }
-   
+
    private void assertSnapshotRemoved(Snapshot snapshot) {
       assertPredicate(new Predicate<String>() {
          @Override
@@ -169,5 +174,4 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
       }, snapshot.id());
    }
 
-   
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiMockTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiMockTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiMockTest.java
index de944c2..034b438 100644
--- a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiMockTest.java
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/SnapshotApiMockTest.java
@@ -28,39 +28,39 @@ import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "SnapshotApiMockTest", singleThreaded = true)
 public class SnapshotApiMockTest extends BaseProfitBricksApiMockTest {
-   
+
    @Test
    public void testGetList() throws InterruptedException {
       server.enqueue(
-         new MockResponse().setBody(stringFromResource("/snapshot/list.json"))
+              new MockResponse().setBody(stringFromResource("/snapshot/list.json"))
       );
-      
+
       List<Snapshot> list = snapshotApi().list();
-      
+
       assertNotNull(list);
       assertEquals(list.size(), 9);
       assertEquals(list.get(0).properties().name(), "snapshot desc...");
-      
+
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/snapshots");
    }
-   
+
    @Test
    public void testGetListWithDepth() throws InterruptedException {
       server.enqueue(
-         new MockResponse().setBody(stringFromResource("/snapshot/list-depth-5.json"))
+              new MockResponse().setBody(stringFromResource("/snapshot/list-depth-5.json"))
       );
-      
+
       List<Snapshot> list = snapshotApi().list(new DepthOptions().depth(5));
-      
+
       assertNotNull(list);
       assertEquals(list.size(), 3);
       assertEquals(list.get(0).properties().name(), "test snapshot");
-      
+
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/snapshots?depth=5");
    }
-   
+
    @Test
    public void testGetListWith404() throws InterruptedException {
       server.enqueue(response404());
@@ -69,7 +69,7 @@ public class SnapshotApiMockTest extends BaseProfitBricksApiMockTest {
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/snapshots");
    }
-   
+
    @Test
    public void testGetListWithDepth404() throws InterruptedException {
       server.enqueue(response404());
@@ -78,102 +78,101 @@ public class SnapshotApiMockTest extends BaseProfitBricksApiMockTest {
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/snapshots?depth=5");
    }
-    
+
    @Test
    public void testGetSnapshot() throws InterruptedException {
       MockResponse response = new MockResponse();
       response.setBody(stringFromResource("/snapshot/get.json"));
       response.setHeader("Content-Type", "application/vnd.profitbricks.resource+json");
-      
+
       server.enqueue(response);
-      
+
       Snapshot snapshot = snapshotApi().get("some-id");
-      
+
       assertNotNull(snapshot);
       assertEquals(snapshot.properties().name(), "snapshot desc...");
-      
+
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/snapshots/some-id");
    }
-   
+
    @Test
    public void testGetSnapshotWithDepth() throws InterruptedException {
       MockResponse response = new MockResponse();
       response.setBody(stringFromResource("/snapshot/get-depth-5.json"));
       response.setHeader("Content-Type", "application/vnd.profitbricks.resource+json");
-      
+
       server.enqueue(response);
-      
+
       Snapshot snapshot = snapshotApi().get("some-id", new DepthOptions().depth(5));
-      
+
       assertNotNull(snapshot);
       assertEquals(snapshot.properties().name(), "test snapshot 2");
-      
+
       assertEquals(this.server.getRequestCount(), 1);
       assertSent(this.server, "GET", "/snapshots/some-id?depth=5");
    }
-   
-   
+
    public void testGetSnapshotWith404() throws InterruptedException {
       server.enqueue(response404());
 
       Snapshot snapshot = snapshotApi().get("some-id");
-      
+
       assertEquals(snapshot, null);
 
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/snapshots/some-id");
-   }   
-   
+   }
+
    public void testGetSnapshotWithDepth404() throws InterruptedException {
       server.enqueue(response404());
 
       Snapshot snapshot = snapshotApi().get("some-id", new DepthOptions().depth(5));
-      
+
       assertEquals(snapshot, null);
 
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "GET", "/snapshots/some-id?depth=5");
-   }   
-  
+   }
+
    @Test
    public void testUpdate() throws InterruptedException {
       server.enqueue(
-         new MockResponse().setBody(stringFromResource("/snapshot/get.json"))
+              new MockResponse().setBody(stringFromResource("/snapshot/get.json"))
       );
-      
+
       api.snapshotApi().update(
               Snapshot.Request.updatingBuilder()
               .id("some-id")
               .name("new-snapshot-name")
               .description("description...")
               .build());
-            
+
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "PATCH", "/rest/snapshots/some-id", "{\"name\": \"new-snapshot-name\", \"description\": \"description...\"}");
    }
-   
+
    @Test
    public void testDelete() throws InterruptedException {
       server.enqueue(response204());
-      
+
       snapshotApi().delete("some-id");
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "DELETE", "/snapshots/some-id");
    }
-   
+
    @Test
    public void testDeleteWith404() throws InterruptedException {
       server.enqueue(response404());
 
       snapshotApi().delete("some-id");
-      
+
       assertEquals(server.getRequestCount(), 1);
       assertSent(server, "DELETE", "/snapshots/some-id");
    }
-     
+
    private SnapshotApi snapshotApi() {
       return api.snapshotApi();
    }
-   
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/VolumeApiLiveTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/VolumeApiLiveTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/VolumeApiLiveTest.java
index ec6532a..98c8090 100644
--- a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/VolumeApiLiveTest.java
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/VolumeApiLiveTest.java
@@ -22,6 +22,8 @@ import java.util.List;
 import org.apache.jclouds.profitbricks.rest.domain.DataCenter;
 import org.apache.jclouds.profitbricks.rest.domain.Image;
 import org.apache.jclouds.profitbricks.rest.domain.LicenceType;
+import static org.apache.jclouds.profitbricks.rest.domain.Location.US_LAS;
+import org.apache.jclouds.profitbricks.rest.domain.ProvisioningState;
 import org.apache.jclouds.profitbricks.rest.domain.Snapshot;
 import org.apache.jclouds.profitbricks.rest.domain.State;
 import org.apache.jclouds.profitbricks.rest.domain.Volume;
@@ -29,12 +31,12 @@ import org.apache.jclouds.profitbricks.rest.domain.VolumeType;
 import org.apache.jclouds.profitbricks.rest.domain.options.DepthOptions;
 import org.apache.jclouds.profitbricks.rest.ids.VolumeRef;
 import org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksLiveTest;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
 
 @Test(groups = "live", testName = "VolumeApiLiveTest")
 public class VolumeApiLiveTest extends BaseProfitBricksLiveTest {
@@ -50,31 +52,30 @@ public class VolumeApiLiveTest extends BaseProfitBricksLiveTest {
 
    @AfterClass(alwaysRun = true)
    public void teardownTest() {
-      if (dataCenter != null)
+      if (dataCenter != null) {
          deleteDataCenter(dataCenter.id());
+      }
    }
 
    @Test
    public void testCreateVolume() {
       assertNotNull(dataCenter);
-      
+
       List<Image> images = api.imageApi().getList(new DepthOptions().depth(5));
-      
+
       Image testImage = null;
-      
+
       for (Image image : images) {
-         if (
-               image.metadata().state() == State.AVAILABLE &&
-               image.properties().isPublic() && 
-               image.properties().imageType() == Image.Type.HDD && 
-               image.properties().location() == TestLocation &&
-               image.properties().licenceType() == LicenceType.LINUX &&
-               ( testImage == null || testImage.properties().size() > image.properties().size() )
-            ) {
+         if (image.metadata().state() == State.AVAILABLE
+                 && image.properties().isPublic()
+                 && image.properties().imageType() == Image.Type.HDD
+                 && image.properties().location() == US_LAS
+                 && image.properties().licenceType() == LicenceType.LINUX
+                 && (testImage == null || testImage.properties().size() > image.properties().size())) {
             testImage = image;
          }
       }
-      
+
       HashSet<String> sshKeys = new HashSet<String>();
       sshKeys.add("hQGOEJeFL91EG3+l9TtRbWNjzhDVHeLuL3NWee6bekA=");
 
@@ -84,7 +85,7 @@ public class VolumeApiLiveTest extends BaseProfitBricksLiveTest {
               .name("jclouds-volume")
               .size(4)
               .licenceType(LicenceType.LINUX)
-              .type(VolumeType.HDD)
+              .type(VolumeType.SSD)
               .image(testImage.id())
               .sshKeys(sshKeys)
               .build());
@@ -94,7 +95,6 @@ public class VolumeApiLiveTest extends BaseProfitBricksLiveTest {
       assertVolumeAvailable(testVolume);
    }
 
-
    @Test(dependsOnMethods = "testCreateVolume")
    public void testGetVolume() {
       Volume volume = volumeApi().getVolume(dataCenter.id(), testVolume.id());
@@ -130,12 +130,12 @@ public class VolumeApiLiveTest extends BaseProfitBricksLiveTest {
    @Test(dependsOnMethods = "testUpdateVolume")
    public void testCreateSnapshot() {
       testSnapshot = volumeApi().createSnapshot(
-         Volume.Request.createSnapshotBuilder()
-            .dataCenterId(testVolume.dataCenterId())
-            .volumeId(testVolume.id())
-            .name("test-snapshot")
-            .description("snapshot desc...")
-            .build());
+              Volume.Request.createSnapshotBuilder()
+              .dataCenterId(testVolume.dataCenterId())
+              .volumeId(testVolume.id())
+              .name("test-snapshot")
+              .description("snapshot desc...")
+              .build());
 
       assertSnapshotAvailable(testSnapshot);
    }
@@ -143,11 +143,11 @@ public class VolumeApiLiveTest extends BaseProfitBricksLiveTest {
    @Test(dependsOnMethods = "testCreateSnapshot")
    public void testRestoreSnapshot() {
       volumeApi().restoreSnapshot(
-         Volume.Request.restoreSnapshotBuilder()
-            .dataCenterId(testVolume.dataCenterId())
-            .volumeId(testVolume.id())
-            .snapshotId(testSnapshot.id())
-            .build()
+              Volume.Request.restoreSnapshotBuilder()
+              .dataCenterId(testVolume.dataCenterId())
+              .volumeId(testVolume.id())
+              .snapshotId(testSnapshot.id())
+              .build()
       );
       assertVolumeAvailable(testVolume);
    }
@@ -165,8 +165,9 @@ public class VolumeApiLiveTest extends BaseProfitBricksLiveTest {
          public boolean apply(VolumeRef volumeRef) {
             Volume volume = volumeApi().getVolume(volumeRef.dataCenterId(), volumeRef.volumeId());
 
-            if (volume == null || volume.metadata() == null)
+            if (volume == null || volume.metadata() == null) {
                return false;
+            }
 
             return volume.metadata().state() == State.AVAILABLE;
          }
@@ -188,10 +189,11 @@ public class VolumeApiLiveTest extends BaseProfitBricksLiveTest {
          public boolean apply(String id) {
             Snapshot snapshot = api.snapshotApi().get(id);
 
-            if (snapshot == null || snapshot.metadata() == null)
+            if (snapshot == null || snapshot.metadata() == null) {
                return false;
+            }
 
-            return snapshot.metadata().state() == State.AVAILABLE;
+            return snapshot.metadata().state() == ProvisioningState.AVAILABLE;
          }
       }, snapshot.id());
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/internal/BaseProfitBricksLiveTest.java
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/internal/BaseProfitBricksLiveTest.java b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/internal/BaseProfitBricksLiveTest.java
index 74dde47..9e50dba 100644
--- a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/internal/BaseProfitBricksLiveTest.java
+++ b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/internal/BaseProfitBricksLiveTest.java
@@ -26,13 +26,12 @@ import com.google.inject.name.Names;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 import org.apache.jclouds.profitbricks.rest.ProfitBricksApi;
-import org.apache.jclouds.profitbricks.rest.util.ApiPredicatesModule.ComputeConstants;
+import org.apache.jclouds.profitbricks.rest.compute.config.ProfitBricksComputeServiceContextModule.ComputeConstants;
 import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
-import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.TIMEOUT_NODE_RUNNING;
-import static org.apache.jclouds.profitbricks.rest.config.ProfitBricksComputeProperties.TIMEOUT_NODE_SUSPENDED;
 import org.apache.jclouds.profitbricks.rest.domain.DataCenter;
 import org.apache.jclouds.profitbricks.rest.domain.LicenceType;
 import org.apache.jclouds.profitbricks.rest.domain.Location;
+import static org.apache.jclouds.profitbricks.rest.domain.Location.US_LAS;
 import org.apache.jclouds.profitbricks.rest.domain.Nic;
 import org.apache.jclouds.profitbricks.rest.domain.Server;
 import org.apache.jclouds.profitbricks.rest.domain.State;
@@ -41,90 +40,97 @@ import org.apache.jclouds.profitbricks.rest.domain.VolumeType;
 import org.apache.jclouds.profitbricks.rest.ids.ServerRef;
 import org.apache.jclouds.profitbricks.rest.ids.VolumeRef;
 import org.jclouds.apis.BaseApiLiveTest;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_RUNNING;
+import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_SUSPENDED;
 import org.jclouds.util.Predicates2;
 import static org.testng.Assert.assertTrue;
 
 public class BaseProfitBricksLiveTest extends BaseApiLiveTest<ProfitBricksApi> {
-   
+
    public static final Location TestLocation = Location.US_LASDEV;
-   
+
    private Predicate<String> dataCenterAvailable;
    private Predicate<ServerRef> serverRunning;
    private Predicate<ServerRef> serverSuspended;
    private Predicate<ServerRef> serverAvailable;
    private Predicate<ServerRef> serverRemoved;
    private Predicate<VolumeRef> volumeAvailable;
-   
+
    ComputeConstants computeConstants;
-   
+
    public BaseProfitBricksLiveTest() {
-      provider = "profitbricks-rest";      
+      provider = "profitbricks-rest";
    }
-  
+
    @Override
    protected ProfitBricksApi create(Properties props, Iterable<Module> modules) {
-      
+
       Injector injector = newBuilder().modules(modules).overrides(props).buildInjector();
-      
+
       computeConstants = injector.getInstance(ComputeConstants.class);
-      
+
       dataCenterAvailable = injector.getInstance(
-         Key.get(new TypeLiteral<Predicate<String>>() {}, Names.named(POLL_PREDICATE_DATACENTER))
+              Key.get(new TypeLiteral<Predicate<String>>() {
+              }, Names.named(POLL_PREDICATE_DATACENTER))
       );
-      
+
       serverRunning = injector.getInstance(
-         Key.get(new TypeLiteral<Predicate<ServerRef>>() {}, Names.named(TIMEOUT_NODE_RUNNING))
+              Key.get(new TypeLiteral<Predicate<ServerRef>>() {
+              }, Names.named(TIMEOUT_NODE_RUNNING))
       );
-      
+
       serverSuspended = injector.getInstance(
-         Key.get(new TypeLiteral<Predicate<ServerRef>>() {}, Names.named(TIMEOUT_NODE_SUSPENDED))
+              Key.get(new TypeLiteral<Predicate<ServerRef>>() {
+              }, Names.named(TIMEOUT_NODE_SUSPENDED))
       );
-   
+
       ComputeConstants c = computeConstants;
-      
+
       Predicate<ServerRef> serverAvailableCheck = new Predicate<ServerRef>() {
          @Override
          public boolean apply(ServerRef serverRef) {
             Server server = api.serverApi().getServer(serverRef.dataCenterId(), serverRef.serverId());
 
-            if (server == null || server.metadata().state() == null)
+            if (server == null || server.metadata().state() == null) {
                return false;
+            }
 
             return server.metadata().state() == State.AVAILABLE;
          }
       };
-      
+
       serverAvailable = Predicates2.retry(serverAvailableCheck, c.pollTimeout(), c.pollPeriod(), c.pollMaxPeriod(), TimeUnit.SECONDS);
-      
+
       Predicate<ServerRef> serverRemovedPredicate = new Predicate<ServerRef>() {
          @Override
          public boolean apply(ServerRef serverRef) {
             return api.serverApi().getServer(serverRef.dataCenterId(), serverRef.serverId()) == null;
          }
       };
-      
+
       serverRemoved = Predicates2.retry(serverRemovedPredicate, c.pollTimeout(), c.pollPeriod(), c.pollMaxPeriod(), TimeUnit.SECONDS);
-      
+
       Predicate<VolumeRef> volumeAvailablePredicate = new Predicate<VolumeRef>() {
          @Override
          public boolean apply(VolumeRef volumeRef) {
             Volume volume = api.volumeApi().getVolume(volumeRef.dataCenterId(), volumeRef.volumeId());
-            
-            if (volume == null || volume.metadata() == null)
+
+            if (volume == null || volume.metadata() == null) {
                return false;
+            }
 
             return volume.metadata().state() == State.AVAILABLE;
          }
       };
-      
+
       volumeAvailable = Predicates2.retry(volumeAvailablePredicate, c.pollTimeout(), c.pollPeriod(), c.pollMaxPeriod(), TimeUnit.SECONDS);
-              
+
       return injector.getInstance(ProfitBricksApi.class);
    }
-   
+
    protected <T> void assertPredicate(Predicate<T> check, T arguments) {
       ComputeConstants c = computeConstants;
-      Predicate<T>checkPoll = Predicates2.retry(check, c.pollTimeout(), c.pollPeriod(), c.pollMaxPeriod(), TimeUnit.SECONDS);
+      Predicate<T> checkPoll = Predicates2.retry(check, c.pollTimeout(), c.pollPeriod(), c.pollMaxPeriod(), TimeUnit.SECONDS);
       assertTrue(checkPoll.apply(arguments), "Random check failed in the configured timeout");
    }
 
@@ -144,42 +150,43 @@ public class BaseProfitBricksLiveTest extends BaseApiLiveTest<ProfitBricksApi> {
    protected void assertNodeSuspended(ServerRef serverRef) {
       assertTrue(serverSuspended.apply(serverRef), String.format("Server %s did not stop in the configured timeout", serverRef));
    }
-   
+
    protected void assertNodeRemoved(ServerRef serverRef) {
       assertTrue(serverRemoved.apply(serverRef), String.format("Server %s was not removed in the configured timeout", serverRef));
    }
-   
+
    protected void assertNodeAvailable(ServerRef serverRef) {
       assertTrue(serverAvailable.apply(serverRef), String.format("Server %s is not available", serverRef));
    }
-   
+
    protected void assertVolumeAvailable(VolumeRef volumeRef) {
       assertTrue(volumeAvailable.apply(volumeRef),
               String.format("Volume %s wasn't available in the configured timeout", volumeRef.volumeId()));
    }
-   
+
    protected void assertNicAvailable(Nic nic) {
       assertPredicate(new Predicate<Nic>() {
          @Override
          public boolean apply(Nic testNic) {
             Nic nic = api.nicApi().get(testNic.dataCenterId(), testNic.serverId(), testNic.id());
-            
-            if (nic == null || nic.metadata() == null)
+
+            if (nic == null || nic.metadata() == null) {
                return false;
-            
+            }
+
             return nic.metadata().state() == State.AVAILABLE;
          }
       }, nic);
    }
-   
+
    protected DataCenter createDataCenter() {
-      return api.dataCenterApi().create("test-data-center", "example description", TestLocation.value());
+      return api.dataCenterApi().create("test-data-center", "example description", US_LAS.getId());
    }
-   
+
    protected void deleteDataCenter(String id) {
       api.dataCenterApi().delete(id);
    }
-   
+
    protected Volume createVolume(DataCenter dataCenter) {
       return api.volumeApi().createVolume(
               Volume.Request.creatingBuilder()
@@ -190,8 +197,8 @@ public class BaseProfitBricksLiveTest extends BaseApiLiveTest<ProfitBricksApi> {
               .licenceType(LicenceType.LINUX)
               .build());
    }
-   
-   protected String complexId(String ... ids) {
+
+   protected String complexId(String... ids) {
       return Joiner.on(",").join(ids);
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/resources/compute/datacenter.json
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/resources/compute/datacenter.json b/profitbricks-rest/src/test/resources/compute/datacenter.json
new file mode 100644
index 0000000..b026ccf
--- /dev/null
+++ b/profitbricks-rest/src/test/resources/compute/datacenter.json
@@ -0,0 +1,123 @@
+{
+    "id": "12345678-abcd-efgh-ijkl-987654321000",
+    "type": "datacenter",
+    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419",
+    "metadata": {
+        "createdDate": "2014-10-20T21:20:46Z",
+        "createdBy": "vendors@stackpointcloud.com",
+        "etag": "9f6fc5de2dc07df011fff0e45a75b8c5",
+        "lastModifiedDate": "2015-05-12T17:21:54Z",
+        "lastModifiedBy": "vendors@stackpointcloud.com",
+        "state": "AVAILABLE"
+    },
+    "properties": {
+        "name": "docker",
+        "description": "Docker environment for generating Docker specific tutorials.",
+        "location": "de/fra",
+        "version": 10
+    },
+    "entities": {
+        "servers": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/servers",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers",
+            "items": [
+                {
+                    "id": "364f0f1c-7384-462b-8f0c-cfc4c3f6e2b2",
+                    "type": "server",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/364f0f1c-7384-462b-8f0c-cfc4c3f6e2b2"
+                },
+                {
+                    "id": "430ccbff-e67b-43de-bfce-097e068e57ba",
+                    "type": "server",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/430ccbff-e67b-43de-bfce-097e068e57ba"
+                },
+                {
+                    "id": "97bd33ed-b97e-4312-acc1-96f44c6e4465",
+                    "type": "server",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/97bd33ed-b97e-4312-acc1-96f44c6e4465"
+                },
+                {
+                    "id": "93e2efc3-752c-4c08-8997-e688891e53bf",
+                    "type": "server",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/93e2efc3-752c-4c08-8997-e688891e53bf"
+                },
+                {
+                    "id": "8345c895-727f-496c-80af-1e7224b2f34e",
+                    "type": "server",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/8345c895-727f-496c-80af-1e7224b2f34e"
+                }
+            ]
+        },
+        "volumes": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/volumes",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/volumes",
+            "items": [
+                {
+                    "id": "5c4d37ca-d620-4546-8b24-f92e3c608c2c",
+                    "type": "volume",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/volumes/5c4d37ca-d620-4546-8b24-f92e3c608c2c"
+                },
+                {
+                    "id": "f9217444-4711-477f-83d8-24adea5d9557",
+                    "type": "volume",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/volumes/f9217444-4711-477f-83d8-24adea5d9557"
+                },
+                {
+                    "id": "0eea1824-8079-4c80-8e18-4e1e41a80368",
+                    "type": "volume",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/volumes/0eea1824-8079-4c80-8e18-4e1e41a80368"
+                },
+                {
+                    "id": "c04a2198-7e60-4bc0-b869-6e9c9dbcb8e1",
+                    "type": "volume",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/volumes/c04a2198-7e60-4bc0-b869-6e9c9dbcb8e1"
+                },
+                {
+                    "id": "dc2f35f4-7335-46f2-b30f-96e31c5ba54d",
+                    "type": "volume",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/volumes/dc2f35f4-7335-46f2-b30f-96e31c5ba54d"
+                },
+                {
+                    "id": "af473785-b791-4724-bb01-242035bf88ef",
+                    "type": "volume",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/volumes/af473785-b791-4724-bb01-242035bf88ef"
+                }
+            ]
+        },
+        "loadbalancers": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/loadbalancers",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/loadbalancers",
+            "items": []
+        },
+        "lans": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/lans",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/lans",
+            "items": [
+                {
+                    "id": "4",
+                    "type": "lan",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/lans/4"
+                },
+                {
+                    "id": "3",
+                    "type": "lan",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/lans/3"
+                },
+                {
+                    "id": "2",
+                    "type": "lan",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/lans/2"
+                },
+                {
+                    "id": "1",
+                    "type": "lan",
+                    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/lans/1"
+                }
+            ]
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/resources/compute/image.json
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/resources/compute/image.json b/profitbricks-rest/src/test/resources/compute/image.json
new file mode 100644
index 0000000..61c54ed
--- /dev/null
+++ b/profitbricks-rest/src/test/resources/compute/image.json
@@ -0,0 +1,32 @@
+{
+    "id": "5ad99c9e-9166-11e4-9d74-52540066fee9",
+    "type": "image",
+    "href": "https://api.profitbricks.com/rest/images/5468d4f1-50bf-11e5-b789-52540066fee9",
+    "metadata": {
+        "createdDate": "2015-09-01T15:37:18Z",
+        "createdBy": "System",
+        "etag": "deeb6ea22d099ce8cddd1fc84e414fbe",
+        "lastModifiedDate": "2015-09-01T15:37:18Z",
+        "lastModifiedBy": "System",
+        "state": "AVAILABLE"
+    },
+    "properties": {
+        "name": "Ubuntu-14.04-LTS-server-2015-01-01",
+        "description": null,
+        "location": "us/las",
+        "size": 2,
+        "cpuHotPlug": true,
+        "cpuHotUnplug": false,
+        "ramHotPlug": true,
+        "ramHotUnplug": false,
+        "nicHotPlug": true,
+        "nicHotUnplug": true,
+        "discVirtioHotPlug": true,
+        "discVirtioHotUnplug": true,
+        "discScsiHotPlug": false,
+        "discScsiHotUnplug": false,
+        "licenceType": "LINUX",
+        "imageType": "HDD",
+        "public": true
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/resources/compute/image1.json
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/resources/compute/image1.json b/profitbricks-rest/src/test/resources/compute/image1.json
new file mode 100644
index 0000000..3e9aaa8
--- /dev/null
+++ b/profitbricks-rest/src/test/resources/compute/image1.json
@@ -0,0 +1,32 @@
+{
+    "id": "f4742db0-9160-11e4-9d74-52540066fee9",
+    "type": "image",
+    "href": "https://api.profitbricks.com/rest/images/5468d4f1-50bf-11e5-b789-52540066fee9",
+    "metadata": {
+        "createdDate": "2015-09-01T15:37:18Z",
+        "createdBy": "System",
+        "etag": "deeb6ea22d099ce8cddd1fc84e414fbe",
+        "lastModifiedDate": "2015-09-01T15:37:18Z",
+        "lastModifiedBy": "System",
+        "state": "AVAILABLE"
+    },
+    "properties": {
+        "name": "Fedora-19-server-2015-01-01",
+        "description": null,
+        "location": "us/las",
+        "size": 2,
+        "cpuHotPlug": true,
+        "cpuHotUnplug": false,
+        "ramHotPlug": true,
+        "ramHotUnplug": false,
+        "nicHotPlug": true,
+        "nicHotUnplug": true,
+        "discVirtioHotPlug": true,
+        "discVirtioHotUnplug": true,
+        "discScsiHotPlug": false,
+        "discScsiHotUnplug": false,
+        "licenceType": "LINUX",
+        "imageType": "HDD",
+        "public": true
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/resources/compute/image2.json
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/resources/compute/image2.json b/profitbricks-rest/src/test/resources/compute/image2.json
new file mode 100644
index 0000000..dae0c65
--- /dev/null
+++ b/profitbricks-rest/src/test/resources/compute/image2.json
@@ -0,0 +1,32 @@
+{
+    "id": "457bf707-d5d1-11e3-8b4f-52540066fee9",
+    "type": "image",
+    "href": "https://api.profitbricks.com/rest/images/5468d4f1-50bf-11e5-b789-52540066fee9",
+    "metadata": {
+        "createdDate": "2015-09-01T15:37:18Z",
+        "createdBy": "System",
+        "etag": "deeb6ea22d099ce8cddd1fc84e414fbe",
+        "lastModifiedDate": "2015-09-01T15:37:18Z",
+        "lastModifiedBy": "System",
+        "state": "AVAILABLE"
+    },
+    "properties": {
+        "name": "clearos-community-6.5.0-x86_64.iso",
+        "description": null,
+        "location": "us/las",
+        "size": 2,
+        "cpuHotPlug": true,
+        "cpuHotUnplug": false,
+        "ramHotPlug": true,
+        "ramHotUnplug": false,
+        "nicHotPlug": true,
+        "nicHotUnplug": true,
+        "discVirtioHotPlug": true,
+        "discVirtioHotUnplug": true,
+        "discScsiHotPlug": false,
+        "discScsiHotUnplug": false,
+        "licenceType": "LINUX",
+        "imageType": "CDROM",
+        "public": true
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/resources/compute/image3.json
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/resources/compute/image3.json b/profitbricks-rest/src/test/resources/compute/image3.json
new file mode 100644
index 0000000..8bd2d41
--- /dev/null
+++ b/profitbricks-rest/src/test/resources/compute/image3.json
@@ -0,0 +1,32 @@
+{
+    "id": "e54af701-53b8-11e3-8f17-52540066fee9",
+    "type": "image",
+    "href": "https://api.profitbricks.com/rest/images/5468d4f1-50bf-11e5-b789-52540066fee9",
+    "metadata": {
+        "createdDate": "2015-09-01T15:37:18Z",
+        "createdBy": "System",
+        "etag": "deeb6ea22d099ce8cddd1fc84e414fbe",
+        "lastModifiedDate": "2015-09-01T15:37:18Z",
+        "lastModifiedBy": "System",
+        "state": "AVAILABLE"
+    },
+    "properties": {
+        "name": "windows-2008-r2-server-setup.iso",
+        "description": null,
+        "location": "us/las",
+        "size": 2,
+        "cpuHotPlug": true,
+        "cpuHotUnplug": false,
+        "ramHotPlug": true,
+        "ramHotUnplug": false,
+        "nicHotPlug": true,
+        "nicHotUnplug": true,
+        "discVirtioHotPlug": true,
+        "discVirtioHotUnplug": true,
+        "discScsiHotPlug": false,
+        "discScsiHotUnplug": false,
+        "licenceType": "WINDOWS",
+        "imageType": "CDROM",
+        "public": true
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/resources/compute/predicate/datacenter-inprocess.json
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/resources/compute/predicate/datacenter-inprocess.json b/profitbricks-rest/src/test/resources/compute/predicate/datacenter-inprocess.json
new file mode 100644
index 0000000..06d6a77
--- /dev/null
+++ b/profitbricks-rest/src/test/resources/compute/predicate/datacenter-inprocess.json
@@ -0,0 +1,41 @@
+{
+    "id": "b0ac144e-e294-415f-ba39-6737d5a9d419",
+    "type": "datacenter",
+    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419",
+    "metadata": {
+        "createdDate": "2014-10-20T21:20:46Z",
+        "createdBy": "vendors@stackpointcloud.com",
+        "etag": "9f6fc5de2dc07df011fff0e45a75b8c5",
+        "lastModifiedDate": "2015-05-12T17:21:54Z",
+        "lastModifiedBy": "vendors@stackpointcloud.com",
+        "state": "BUSY"
+    },
+    "properties": {
+        "name": "docker",
+        "description": "Docker environment for generating Docker specific tutorials.",
+        "location": "us/las",
+        "version": 38
+    },
+    "entities": {
+        "servers": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/servers",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers"
+        },
+        "volumes": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/volumes",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/volumes"
+        },
+        "loadbalancers": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/loadbalancers",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/loadbalancers"
+        },
+        "lans": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/lans",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/lans"
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/5742745e/profitbricks-rest/src/test/resources/compute/predicate/datacenter.json
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/resources/compute/predicate/datacenter.json b/profitbricks-rest/src/test/resources/compute/predicate/datacenter.json
new file mode 100644
index 0000000..fa0e768
--- /dev/null
+++ b/profitbricks-rest/src/test/resources/compute/predicate/datacenter.json
@@ -0,0 +1,41 @@
+{
+    "id": "b0ac144e-e294-415f-ba39-6737d5a9d419",
+    "type": "datacenter",
+    "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419",
+    "metadata": {
+        "createdDate": "2014-10-20T21:20:46Z",
+        "createdBy": "vendors@stackpointcloud.com",
+        "etag": "9f6fc5de2dc07df011fff0e45a75b8c5",
+        "lastModifiedDate": "2015-05-12T17:21:54Z",
+        "lastModifiedBy": "vendors@stackpointcloud.com",
+        "state": "AVAILABLE"
+    },
+    "properties": {
+        "name": "docker",
+        "description": "Docker environment for generating Docker specific tutorials.",
+        "location": "us/las",
+        "version": 38
+    },
+    "entities": {
+        "servers": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/servers",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers"
+        },
+        "volumes": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/volumes",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/volumes"
+        },
+        "loadbalancers": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/loadbalancers",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/loadbalancers"
+        },
+        "lans": {
+            "id": "b0ac144e-e294-415f-ba39-6737d5a9d419/lans",
+            "type": "collection",
+            "href": "https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/lans"
+        }
+    }
+}
\ No newline at end of file