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

[01/35] jclouds git commit: JCLOUDS-702: JCloud ProfitBricks provider implementation

Repository: jclouds
Updated Branches:
  refs/heads/master e0ab5d848 -> d05cecc39


http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
new file mode 100644
index 0000000..9e72172
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.binder.datacenter;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "UpdateDataCenterRequestBinderTest")
+public class UpdateDataCenterRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      UpdateDataCenterRequestBinder binder = new UpdateDataCenterRequestBinder();
+
+      DataCenter.Request.UpdatePayload payload = DataCenter.Request.UpdatePayload.create("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "Apache-DC");
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload
+	   = ("      <ws:updateDataCenter>\n"
+	   + "         <request>\n"
+	   + "            <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>\n"
+	   + "            <dataCenterName>Apache-DC</dataCenterName>\n"
+	   + "         </request>\n"
+	   + "      </ws:updateDataCenter>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
new file mode 100644
index 0000000..05001f2
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.compute.internal;
+
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+import static org.testng.Assert.assertEquals;
+
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import org.jclouds.util.Predicates2;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Tests for the {@link ProvisioningStatusPollingPredicate} class.
+ * <p>
+ */
+@Test(groups = "unit", testName = "ProvisioningStatusPollingPredicateTest")
+public class ProvisioningStatusPollingPredicateTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testPredicate() throws Exception {
+      MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/datacenter/datacenter-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/datacenter/datacenter-state.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      try {
+         waitUntilAvailable.apply(id);
+         ProvisioningState finalState = pbApi.dataCenterApi().getDataCenterState(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertEquals(finalState, ProvisioningState.AVAILABLE);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
new file mode 100644
index 0000000..36191ca
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+
+import java.util.List;
+
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+
+import static org.testng.Assert.assertTrue;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", testName = "DataCenterApiLiveTest", singleThreaded = true)
+public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest {
+
+   private String dcId;
+
+   @Test
+   public void testCreateDataCenter() {
+      DataCenter dc = api.dataCenterApi().createDataCenter(
+              DataCenter.Request.CreatePayload.create("JClouds", Location.DE_FKB)
+      );
+
+      assertNotNull(dc);
+      dcWaitingPredicate.apply(dc.id());
+
+      dcId = dc.id();
+   }
+
+   @Test(dependsOnMethods = "testCreateDataCenter")
+   public void testGetDataCenter() {
+      assertNotNull(dcId, "No available datacenter found.");
+
+      DataCenter dataCenter = api.dataCenterApi().getDataCenter(dcId);
+
+      assertNotNull(dataCenter);
+      assertEquals(dataCenter.id(), dcId);
+   }
+
+   @Test(dependsOnMethods = "testCreateDataCenter")
+   public void testGetAllDataCenters() {
+      List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
+
+      assertNotNull(dataCenters);
+      assertFalse(dataCenters.isEmpty(), "No datacenter found.");
+   }
+
+   @Test(dependsOnMethods = "testCreateDataCenter")
+   public void testGetDataCenterState() {
+      assertNotNull(dcId, "No available datacenter found.");
+
+      ProvisioningState state = api.dataCenterApi().getDataCenterState(dcId);
+
+      assertNotNull(state);
+   }
+
+   @Test(dependsOnMethods = "testGetDataCenter")
+   public void testUpdateDataCenter() {
+      assertNotNull(dcId, "No available datacenter found.");
+
+      final String newName = "Apache";
+      DataCenter dataCenter = api.dataCenterApi().updateDataCenter(
+              DataCenter.Request.UpdatePayload.create(dcId, newName)
+      );
+
+      assertNotNull(dataCenter);
+      dcWaitingPredicate.apply(dcId);
+
+      DataCenter fetchedDc = api.dataCenterApi().getDataCenter(dcId);
+
+      assertNotNull(fetchedDc);
+      assertEquals(newName, fetchedDc.name());
+   }
+
+   @Test(dependsOnMethods = "testUpdateDataCenter")
+   public void testClearDataCenter() {
+      DataCenter dataCenter = api.dataCenterApi().clearDataCenter(dcId);
+
+      assertNotNull(dataCenter);
+   }
+
+   @Test
+   public void testGetNonExistingDataCenter() {
+      DataCenter dataCenter = api.dataCenterApi().getDataCenter("random-non-existing-id");
+
+      assertNull(dataCenter);
+   }
+
+   @Test
+   public void testDeleteNonExistingDataCenterMustReturnFalse() {
+      boolean result = api.dataCenterApi().deleteDataCenter("random-non-existing-id");
+
+      assertFalse(result);
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void testDeleteDataCenter() {
+      if (dcId != null) {
+         boolean result = api.dataCenterApi().deleteDataCenter(dcId);
+
+         assertTrue(result, "Created test data center was not deleted.");
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
new file mode 100644
index 0000000..a9c093e
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
@@ -0,0 +1,255 @@
+/*
+ * 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.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import java.util.List;
+
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Mock tests for the {@link org.jclouds.profitbricks.features.DataCenterApi} class
+ */
+@Test(groups = "unit", testName = "DataCenterApiMockTest")
+public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetAllDataCenters() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/datacenter/datacenters.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      try {
+         List<DataCenter> dataCenters = api.getAllDataCenters();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNotNull(dataCenters);
+         assertEquals(dataCenters.size(), 2);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllDataCentersReturning404() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      try {
+         List<DataCenter> dataCenters = api.getAllDataCenters();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertTrue(dataCenters.isEmpty());
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetDataCenter() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/datacenter/datacenter.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      String id = "12345678-abcd-efgh-ijkl-987654321000";
+      try {
+         DataCenter dataCenter = api.getDataCenter(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNotNull(dataCenter);
+         assertEquals(dataCenter.id(), id);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetNonExistingDataCenter() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(500).setBody(payloadFromResource("/fault-404.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      String id = "random-non-existing-id";
+      try {
+         DataCenter dataCenter = api.getDataCenter(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(dataCenter);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetDataCenterState() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/datacenter/datacenter-state.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      try {
+         ProvisioningState state = api.getDataCenterState(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNotNull(state);
+         assertEquals(state, ProvisioningState.AVAILABLE);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testCreateDataCenter() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/datacenter/datacenter-created.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      try {
+         DataCenter dataCenter = api.createDataCenter(
+                 DataCenter.Request.CreatePayload.create("JClouds-DC", Location.DE_FRA)
+         );
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNotNull(dataCenter);
+         assertEquals(dataCenter.id(), "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
+         assertEquals(dataCenter.version(), 1);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testCreateDataCenterWithIllegalArguments() throws Exception {
+      String[] names = {"JCl@ouds", "JC|ouds", "^clouds", ""};
+      for (String name : names) {
+         try {
+            DataCenter.Request.CreatePayload.create(name, Location.US_LAS);
+            fail("Should have failed for name: ".concat(name));
+         } catch (IllegalArgumentException ex) {
+            // expected exception
+         }
+      }
+   }
+
+   @Test
+   public void testUpdateDataCenter() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/datacenter/datacenter-updated.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      try {
+         DataCenter dataCenter = api.updateDataCenter(
+                 DataCenter.Request.UpdatePayload.create(id, "Apache")
+         );
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNotNull(dataCenter);
+         assertEquals(dataCenter.id(), id);
+         assertEquals(dataCenter.version(), 2);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testClearDataCenter() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/datacenter/datacenter-cleared.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      try {
+         DataCenter dataCenter = api.clearDataCenter(id);
+
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNotNull(dataCenter);
+         assertEquals(dataCenter.id(), id);
+         assertEquals(dataCenter.version(), 3);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteDataCenter() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/datacenter/datacenter-deleted.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      try {
+         boolean result = api.deleteDataCenter("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertTrue(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteNonExistingDataCenter() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(500).setBody(payloadFromResource("/fault-404.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      try {
+         boolean result = api.deleteDataCenter("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertFalse(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
new file mode 100644
index 0000000..9198840
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http;
+
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.features.DataCenterApi;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import org.jclouds.rest.AuthorizationException;
+import org.jclouds.rest.ResourceNotFoundException;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Mock tests for the {@link ResponseStatusFromPayloadHttpCommandExecutorService} class.
+ */
+@Test(groups = "unit", testName = "ResponseStatusFromPayloadHttpCommandExecutorServiceTest")
+public class ResponseStatusFromPayloadHttpCommandExecutorServiceTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testNotFound() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(500).setBody(payloadFromResource("/fault-404.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl("/"));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      String id = "random-non-existing-id";
+      try {
+         api.clearDataCenter(id);
+         fail("Request should have failed");
+      } catch (Exception ex) {
+         assertTrue(ex instanceof ResourceNotFoundException, "Exception should be an ResourceNotFoundException");
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testBadRequest() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(500).setBody(payloadFromResource("/fault-400.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl("/"));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      try {
+         api.createDataCenter(DataCenter.Request.CreatePayload.create("D@tacenter", Location.DE_FKB));
+         fail("Request should have failed");
+      } catch (Exception ex) {
+         assertTrue(ex instanceof IllegalArgumentException, "Exception should be an IllegalArgumentException");
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testUnauthorized() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(401).setBody(payloadFromResource("/fault-401.html")));
+
+      ProfitBricksApi pbApi = api(server.getUrl("/"));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      try {
+         api.clearDataCenter("some-datacenter-id");
+         fail("Request should have failed");
+      } catch (Exception ex) {
+         assertTrue(ex instanceof AuthorizationException, "Exception should be an AuthorizationException");
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/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
new file mode 100644
index 0000000..e6b692b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelopeTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.filters;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.http.HttpRequest;
+import org.testng.annotations.Test;
+
+/**
+ * Unit tests for the {@link ProfitBricksSoapMessageEnvelope} class.
+ */
+@Test(groups = "unit", testName = "ProfitBricksSoapMessageEnvelopeTest")
+public class ProfitBricksSoapMessageEnvelopeTest {
+
+   private final String SOAP_PREFIX
+	   = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">"
+	   + "<soapenv:Header/>"
+	   + "<soapenv:Body>";
+   private final String SOAP_SUFFIX = "</soapenv:Body></soapenv:Envelope>";
+   private final String endpoint = "https://api.profitbricks.com/1.3";
+
+   @Test
+   public void testPayloadEnclosedWithSoapTags() {
+      String requestBody = "<ws:getAllDataCenters/>";
+      String expectedPayload = SOAP_PREFIX.concat(requestBody).concat(SOAP_SUFFIX);
+
+      HttpRequest request = HttpRequest.builder().method("POST").endpoint(endpoint).payload(requestBody).build();
+
+      ProfitBricksSoapMessageEnvelope soapEnvelope = new ProfitBricksSoapMessageEnvelope();
+      HttpRequest filtered = soapEnvelope.filter(request);
+
+      assertEquals(filtered.getPayload().getRawContent(), expectedPayload);
+      assertEquals(filtered.getPayload().getContentMetadata().getContentLength(), Long.valueOf(expectedPayload.length()));
+   }
+
+   @Test(expectedExceptions = NullPointerException.class, expectedExceptionsMessageRegExp = ".*must contain payload message.*")
+   public void testNullRequest() {
+      HttpRequest request = HttpRequest.builder().method("POST").endpoint(endpoint).build();
+      new ProfitBricksSoapMessageEnvelope().filter(request);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/BaseResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/BaseResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/BaseResponseHandlerTest.java
new file mode 100644
index 0000000..23bdbc9
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/BaseResponseHandlerTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser;
+
+import static org.jclouds.util.Strings2.toStringAndClose;
+
+import java.io.IOException;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.http.functions.config.SaxParserModule;
+import org.jclouds.rest.internal.GeneratedHttpRequest;
+import org.testng.annotations.AfterTest;
+import org.testng.annotations.BeforeTest;
+
+import com.google.common.base.Throwables;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+public abstract class BaseResponseHandlerTest<T> {
+
+   protected Injector injector = null;
+   protected ParseSax.Factory factory;
+   protected GeneratedHttpRequest request;
+
+   protected abstract ParseSax<T> createParser();
+
+   @BeforeTest
+   protected void setUpInjector() {
+      injector = Guice.createInjector(new SaxParserModule());
+      factory = injector.getInstance(ParseSax.Factory.class);
+      assert factory != null;
+   }
+
+   protected String payloadFromResource(String resource) {
+      try {
+	 return toStringAndClose(getClass().getResourceAsStream(resource));
+      } catch (IOException e) {
+	 throw Throwables.propagate(e);
+      }
+   }
+
+   @AfterTest
+   protected void tearDownInjector() {
+      factory = null;
+      injector = null;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
new file mode 100644
index 0000000..66259ab
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.ServiceFault;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "ServiceFaultResponseHandlerTest")
+public class ServiceFaultResponseHandlerTest extends BaseResponseHandlerTest<ServiceFault> {
+
+   @Override
+   protected ParseSax<ServiceFault> createParser() {
+      return factory.create(injector.getInstance(ServiceFaultResponseHandler.class));
+   }
+
+   @Test
+   public void testParseSoapServiceFault() {
+      ParseSax<ServiceFault> parser = createParser();
+      ServiceFault actual = parser.parse(payloadFromResource("/fault-404.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      ServiceFault expected = ServiceFault.builder()
+	      .faultCode(ServiceFault.FaultCode.RESOURCE_NOT_FOUND)
+	      .httpCode(404)
+	      .message("The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id")
+	      .requestId(11122416)
+	      .build();
+
+      assertEquals(expected, actual);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
new file mode 100644
index 0000000..f4222fb
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.datacenter;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "DataCenterInfoResponseHandlerTest")
+public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<DataCenter> {
+
+   @Override
+   protected ParseSax<DataCenter> createParser() {
+      return factory.create(injector.getInstance(DataCenterInfoResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromGetDataCenter() throws ParserConfigurationException {
+      ParseSax<DataCenter> parser = createParser();
+      DataCenter actual = parser.parse(payloadFromResource("/datacenter/datacenter.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      DataCenter expected = DataCenter.builder()
+	      .id("12345678-abcd-efgh-ijkl-987654321000")
+	      .version(10)
+	      .name("JClouds-DC")
+	      .state(ProvisioningState.AVAILABLE)
+	      .location(Location.US_LAS)
+	      .build();
+      assertEquals(expected, actual);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandlerTest.java
new file mode 100644
index 0000000..b957b52
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandlerTest.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.datacenter;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.List;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+@Test(groups = "unit", testName = "DataCenterListResponseHandlerTest")
+public class DataCenterListResponseHandlerTest extends BaseResponseHandlerTest<List<DataCenter>> {
+
+   @Override
+   protected ParseSax<List<DataCenter>> createParser() {
+      return factory.create(injector.getInstance(DataCenterListResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromGetAllDataCenter() {
+      ParseSax<List<DataCenter>> parser = createParser();
+
+      List<DataCenter> actual = parser.parse(payloadFromResource("/datacenter/datacenters.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      List<DataCenter> expected = ImmutableList.<DataCenter>of(
+	      DataCenter.builder().id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee").name("JClouds-DC").version(10).state(ProvisioningState.AVAILABLE).build(),
+	      DataCenter.builder().id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy").name("Random DC").version(238).state(ProvisioningState.INPROCESS).build()
+      );
+      assertEquals(expected, actual);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandlerTest.java
new file mode 100644
index 0000000..0f9822b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandlerTest.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.state;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "GetProvisioningStateResponseHandlerTest")
+public class GetProvisioningStateResponseHandlerTest extends BaseResponseHandlerTest<ProvisioningState> {
+
+   @Override
+   protected ParseSax<ProvisioningState> createParser() {
+      return factory.create(injector.getInstance(GetProvisioningStateResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromGetProvisioningState() {
+      ParseSax<ProvisioningState> parser = createParser();
+
+      for (Map.Entry<ProvisioningState, String> pair : sampleResponses.entrySet()) {
+	 ProvisioningState actual = parser.parse(pair.getValue());
+	 assertNotNull(actual, "Parsed content returned null");
+
+	 assertEquals(pair.getKey(), actual);
+      }
+
+   }
+
+   private final Map<ProvisioningState, String> sampleResponses = new LinkedHashMap<ProvisioningState, String>() {
+      {
+	 put(ProvisioningState.INACTIVE,
+		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+		 + "   <soapenv:Header/>\n"
+		 + "   <soapenv:Body>\n"
+		 + "      <ws:getDataCenterStateResponse>\n"
+		 + "         <return>INACTIVE</return>\n"
+		 + "      </ws:getDataCenterStateResponse>\n"
+		 + "   </soapenv:Body>\n"
+		 + "</soapenv:Envelope>");
+	 put(ProvisioningState.INPROCESS,
+		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+		 + "   <soapenv:Header/>\n"
+		 + "   <soapenv:Body>\n"
+		 + "      <ws:getDataCenterStateResponse>\n"
+		 + "         <return>INPROCESS</return>\n"
+		 + "      </ws:getDataCenterStateResponse>\n"
+		 + "   </soapenv:Body>\n"
+		 + "</soapenv:Envelope>");
+	 put(ProvisioningState.AVAILABLE,
+		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+		 + "   <soapenv:Header/>\n"
+		 + "   <soapenv:Body>\n"
+		 + "      <ws:getDataCenterStateResponse>\n"
+		 + "         <return>AVAILABLE</return>\n"
+		 + "      </ws:getDataCenterStateResponse>\n"
+		 + "   </soapenv:Body>\n"
+		 + "</soapenv:Envelope>");
+	 put(ProvisioningState.DELETED,
+		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+		 + "   <soapenv:Header/>\n"
+		 + "   <soapenv:Body>\n"
+		 + "      <ws:getDataCenterStateResponse>\n"
+		 + "         <return>DELETED</return>\n"
+		 + "      </ws:getDataCenterStateResponse>\n"
+		 + "   </soapenv:Body>\n"
+		 + "</soapenv:Envelope>");
+	 put(ProvisioningState.ERROR,
+		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+		 + "   <soapenv:Header/>\n"
+		 + "   <soapenv:Body>\n"
+		 + "      <ws:getDataCenterStateResponse>\n"
+		 + "         <return>ERROR</return>\n"
+		 + "      </ws:getDataCenterStateResponse>\n"
+		 + "   </soapenv:Body>\n"
+		 + "</soapenv:Envelope>");
+	 put(ProvisioningState.UNRECOGNIZED,
+		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+		 + "   <soapenv:Header/>\n"
+		 + "   <soapenv:Body>\n"
+		 + "      <ws:getDataCenterStateResponse>\n"
+		 + "         <return>MEH</return>\n"
+		 + "      </ws:getDataCenterStateResponse>\n"
+		 + "   </soapenv:Body>\n"
+		 + "</soapenv:Envelope>");
+      }
+   };
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
new file mode 100644
index 0000000..665f1bd
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.internal;
+
+import static org.jclouds.util.Strings2.toStringAndClose;
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.ProfitBricksApi;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import com.squareup.okhttp.mockwebserver.RecordedRequest;
+
+/**
+ * Base class for all ProfitBricks mock test
+ */
+public class BaseProfitBricksMockTest {
+
+   protected static final String authHeader = BasicAuthentication.basic("username", "password");
+   protected static final String provider = "profitbricks";
+   protected static final String rootUrl = "/1.3";
+
+   private final Set<Module> modules = ImmutableSet.<Module>of();
+
+   public BaseProfitBricksMockTest() {
+   }
+
+   public ProfitBricksApi api(URL url) {
+      return ContextBuilder.newBuilder(provider)
+              .credentials("username", "password")
+              .endpoint(url.toString())
+              .modules(modules)
+              .overrides(setupProperties())
+              .buildApi(ProfitBricksApi.class);
+   }
+
+   protected Properties setupProperties() {
+      return new Properties();
+   }
+
+   public static MockWebServer mockWebServer() throws IOException {
+      MockWebServer server = new MockWebServer();
+      server.play();
+      return server;
+   }
+
+   public byte[] payloadFromResource(String resource) {
+      try {
+         return toStringAndClose(getClass().getResourceAsStream(resource)).getBytes(Charsets.UTF_8);
+      } catch (IOException e) {
+         throw Throwables.propagate(e);
+      }
+   }
+
+   protected static void assertRequestHasCommonProperties(final RecordedRequest request) {
+      assertEquals(request.getMethod(), "POST");
+      assertEquals(request.getPath(), rootUrl);
+      assertEquals(request.getHeader(HttpHeaders.AUTHORIZATION), authHeader);
+      assertEquals(request.getHeader(HttpHeaders.ACCEPT), MediaType.TEXT_XML);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/datacenter/datacenter-cleared.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-cleared.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-cleared.xml
new file mode 100644
index 0000000..5b85c96
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-cleared.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:clearDataCenterResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>1143191</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>3</dataCenterVersion>
+            </return>
+        </ns2:clearDataCenterResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/datacenter/datacenter-created.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-created.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-created.xml
new file mode 100644
index 0000000..92ef01d
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-created.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Body>
+        <ws:createDataCenterResponse>
+            <return>
+                <requestId>102456</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>1</dataCenterVersion>
+                <location>de/fra</location>
+            </return>
+        </ws:createDataCenterResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/datacenter/datacenter-deleted.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-deleted.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-deleted.xml
new file mode 100644
index 0000000..c09858e
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-deleted.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+   <S:Body>
+      <ns2:deleteDataCenterResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+         <return>
+            <requestId>11411363</requestId>
+         </return>
+      </ns2:deleteDataCenterResponse>
+   </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/datacenter/datacenter-state-inprocess.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-state-inprocess.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-state-inprocess.xml
new file mode 100644
index 0000000..77d41e3
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-state-inprocess.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+   <S:Body>
+      <ns2:getDataCenterStateResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+         <return>INPROCESS</return>
+      </ns2:getDataCenterStateResponse>
+   </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/datacenter/datacenter-state.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-state.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-state.xml
new file mode 100644
index 0000000..8bd56e2
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-state.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+   <S:Body>
+      <ns2:getDataCenterStateResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+         <return>AVAILABLE</return>
+      </ns2:getDataCenterStateResponse>
+   </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/datacenter/datacenter-updated.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-updated.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-updated.xml
new file mode 100644
index 0000000..f0c84d4
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-updated.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:updateDataCenterResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>1143190</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>2</dataCenterVersion>
+            </return>
+        </ns2:updateDataCenterResponse>
+    </S:Body>
+</S:Envelope>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
new file mode 100644
index 0000000..2911c81
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
@@ -0,0 +1,80 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getDataCenterResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>10933055</requestId>
+                <dataCenterId>12345678-abcd-efgh-ijkl-987654321000</dataCenterId>
+                <dataCenterVersion>10</dataCenterVersion>
+                <dataCenterName>JClouds-DC</dataCenterName>
+                <servers>
+                    <dataCenterId>12345678-abcd-efgh-ijkl-987654321000</dataCenterId>
+                    <dataCenterVersion>10</dataCenterVersion>
+                    <serverId>qqqqqqqq-wwww-eeee-rrrr-tttttttttttt</serverId>
+                    <serverName>jnode1</serverName>
+                    <cores>4</cores>
+                    <ram>4096</ram>
+                    <internetAccess>true</internetAccess>
+                    <ips>202.94.38.12</ips>
+                    <connectedStorages>
+                        <bootDevice>true</bootDevice>
+                        <busType>VIRTIO</busType>
+                        <deviceNumber>1</deviceNumber>
+                        <size>40</size>
+                        <storageId>ssssssss-aaaa-ffff-gggg-hhhhhhhhhhhh</storageId>
+                        <storageName>jnode1-disk1</storageName>
+                    </connectedStorages>
+                    <nics>
+                        <dataCenterId>12345678-abcd-efgh-ijkl-987654321000</dataCenterId>
+                        <dataCenterVersion>10</dataCenterVersion>
+                        <nicId>zzzzzzzz-xxxx-cccc-vvvv-bbbbbbbbbbbb</nicId>
+                        <lanId>1</lanId>
+                        <internetAccess>true</internetAccess>
+                        <serverId>12345678-abcd-efgh-ijkl-987654321000</serverId>
+                        <ips>202.94.38.12</ips>
+                        <macAddress>02:01:09:cd:f0:b0</macAddress>
+                        <firewall>`
+                            <active>false</active>
+                            <firewallId>llllllll-kkkk-jjjj-hhhh-gggggggggggg</firewallId>
+                            <firewallId>62383ec1-38c8-486b-8fa2-a3bb0a5edd97</firewallId>
+                            <nicId>zzzzzzzz-xxxx-cccc-vvvv-bbbbbbbbbbbb</nicId>
+                            <provisioningState>AVAILABLE</provisioningState>
+                        </firewall>
+                        <dhcpActive>true</dhcpActive>
+                        <gatewayIp>202.94.38.1</gatewayIp>
+                        <provisioningState>AVAILABLE</provisioningState>
+                    </nics>
+                    <provisioningState>AVAILABLE</provisioningState>
+                    <virtualMachineState>RUNNING</virtualMachineState>
+                    <creationTime>2014-12-04T07:09:23.138Z</creationTime>
+                    <lastModificationTime>2014-12-12T03:08:35.629Z</lastModificationTime>
+                    <osType>LINUX</osType>
+                    <availabilityZone>AUTO</availabilityZone>
+                    <cpuHotPlug>true</cpuHotPlug>
+                    <ramHotPlug>true</ramHotPlug>
+                    <nicHotPlug>true</nicHotPlug>
+                    <nicHotUnPlug>true</nicHotUnPlug>
+                    <discVirtioHotPlug>true</discVirtioHotPlug>
+                    <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                </servers>
+                <storages>
+                    <dataCenterId>12345678-abcd-efgh-ijkl-987654321000</dataCenterId>
+                    <dataCenterVersion>10</dataCenterVersion>
+                    <storageId>ssssssss-aaaa-ffff-gggg-hhhhhhhhhhhh</storageId>
+                    <size>40</size>
+                    <storageName>jnode1-disk1</storageName>
+                    <mountImage>
+                        <imageId>f0a59a5c-7940-11e4-8053-52540066fee9</imageId>
+                        <imageName>Ubuntu-14.04-LTS-server-2014-12-01</imageName>
+                    </mountImage>
+                    <serverIds>qqqqqqqq-wwww-eeee-rrrr-tttttttttttt</serverIds>
+                    <provisioningState>AVAILABLE</provisioningState>
+                    <creationTime>2014-12-04T07:09:23.138Z</creationTime>
+                    <lastModificationTime>2014-12-12T03:14:48.316Z</lastModificationTime>
+                </storages>
+                <provisioningState>AVAILABLE</provisioningState>
+                <location>us/las</location>
+            </return>
+        </ns2:getDataCenterResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/datacenter/datacenters.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenters.xml b/providers/profitbricks/src/test/resources/datacenter/datacenters.xml
new file mode 100644
index 0000000..b3b7bc3
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenters.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getAllDataCentersResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterName>JClouds-DC</dataCenterName>
+                <dataCenterVersion>10</dataCenterVersion>
+                <provisioningState>AVAILABLE</provisioningState>
+            </return>
+            <return>
+                <dataCenterId>qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy</dataCenterId>
+                <dataCenterName>Random DC</dataCenterName>
+                <dataCenterVersion>238</dataCenterVersion>
+                <provisioningState>INPROCESS</provisioningState>
+            </return>
+        </ns2:getAllDataCentersResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/fault-400.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/fault-400.xml b/providers/profitbricks/src/test/resources/fault-400.xml
new file mode 100644
index 0000000..9648b2a
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/fault-400.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
+            <faultcode>S:Server</faultcode>
+            <faultstring>RAM of requested server too small, 256 Mb is minimum</faultstring>
+            <detail>
+                <ns2:ProfitbricksServiceFault xmlns:ns2="http://ws.api.profitbricks.com/">
+                    <faultCode>BAD_REQUEST</faultCode>
+                    <httpCode>400</httpCode>
+                    <message>RAM of requested server too small, 256 Mb is minimum</message>
+                    <requestId>1045</requestId>
+                </ns2:ProfitbricksServiceFault>
+            </detail>
+        </S:Fault>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/fault-401.html
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/fault-401.html b/providers/profitbricks/src/test/resources/fault-401.html
new file mode 100644
index 0000000..ecadab1
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/fault-401.html
@@ -0,0 +1,43 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" lang="en"/>
+        <title>Profitbricks | 401 Unauthorized</title>
+        <base href="/"/>
+        <link rel="stylesheet" type="text/css" href="css/style.css"/>
+        <link rel="stylesheet" type="text/css" href="css/content.css"/>
+        <link rel="stylesheet" type="text/css" href="css/recent_additions.css"/>
+        <link rel="shortcut icon" href="favicon.ico" type="image/x-icon"/>
+    </head>
+    <body>
+        <div class="head1 h_bg"/>
+        <div class="head2 h_bg"/>
+        <div class="head3 h_bg"/>
+        <div id="wrapper">
+            <div class="wrapper_inner">
+                <div id="header">
+                    <a id="logo" href="#">
+                        <img alt="Profitbricks" src="img/logo.png"/>
+                    </a>
+                </div>
+                <div id="main">
+                    <div id="right" style="min-height: 550px;">
+                        <div class="article msg">
+                            <h1>Unauthorized</h1>
+                            <img title="" alt="message error" src="img/msg_error.png" class="msg_sign" style="margin: 10px;" height="49" width="49"/>
+                            <div class="container" style="margin:20px 80px !important;">
+                                <p class="bigmargin">This request requires authentication.</p>
+                            </div>
+                        </div>
+                    </div>
+                    <br class="clear"/>
+                </div>
+            </div>
+        </div>
+        <div id="footer">
+            <div class="bottom">
+                <div class="inner"></div>
+            </div>
+        </div>
+    </body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/resources/fault-404.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/fault-404.xml b/providers/profitbricks/src/test/resources/fault-404.xml
new file mode 100644
index 0000000..486706d
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/fault-404.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+   <S:Body>
+      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
+         <faultcode>S:Server</faultcode>
+         <faultstring>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</faultstring>
+         <detail>
+            <ns2:ProfitbricksServiceFault xmlns:ns2="http://ws.api.profitbricks.com/">
+               <faultCode>RESOURCE_NOT_FOUND</faultCode>
+               <httpCode>404</httpCode>
+               <message>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</message>
+               <requestId>11122416</requestId>
+            </ns2:ProfitbricksServiceFault>
+         </detail>
+      </S:Fault>
+   </S:Body>
+</S:Envelope>
\ No newline at end of file


[09/35] jclouds git commit: JCLOUDS-702: JClouds ProfitBricks provider - Storage API

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/StorageApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/StorageApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/StorageApi.java
new file mode 100644
index 0000000..f5d3577
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/StorageApi.java
@@ -0,0 +1,136 @@
+/*
+ * 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.features;
+
+import java.util.List;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.binder.storage.ConnectStorageToServerRequestBinder;
+import org.jclouds.profitbricks.binder.storage.CreateStorageRequestBinder;
+import org.jclouds.profitbricks.binder.storage.UpdateStorageRequestBinder;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.storage.StorageIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.storage.StorageInfoResponseHandler;
+import org.jclouds.profitbricks.http.parser.storage.StorageListResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface StorageApi {
+
+   /**
+    *
+    * @return Returns information about all virtual storage, such as configuration and provisioning state.
+    */
+   @POST
+   @Named("storage:getall")
+   @Payload("<ws:getAllStorages/>")
+   @XMLResponseParser(StorageListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<Storage> getAllStorages();
+
+   /**
+    *
+    * @param id Storage identifier
+    * @return Returns information about a virtual storage’s configuration and provisioning state.
+    */
+   @POST
+   @Named("storage:get")
+   @Payload("<ws:getStorage><storageId>{id}</storageId></ws:getStorage>")
+   @XMLResponseParser(StorageInfoResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Storage getStorage(@PayloadParam("id") String id);
+
+   /**
+    * Creates a virtual storage within an existing virtual data center. Additional parameters can be specified, e.g. for assigning a HDD
+    * image to the storage.
+    *
+    * @param payload Payload
+    * @return storageId of the created storage
+    */
+   @POST
+   @Named("storage:create")
+   @MapBinder(CreateStorageRequestBinder.class)
+   @XMLResponseParser(StorageIdOnlyResponseHandler.class)
+   String createStorage(@PayloadParam("storage") Storage.Request.CreatePayload payload);
+
+   /**
+    * Updates parameters of an existing virtual storage device. It is possible to increase the storage size without reboot of an already
+    * provisioned storage. The additional capacity is not added to any partition. You have to partition the storage afterwards. Vice versa,
+    * it is not possible to decrease the storage size of an already provisioned storage.
+    *
+    * @param payload Payload
+    * @return Identifier of current request
+    */
+   @POST
+   @Named("storage:update")
+   @MapBinder(UpdateStorageRequestBinder.class)
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String updateStorage(@PayloadParam("storage") Storage.Request.UpdatePayload payload);
+
+   /**
+    * Deletes an existing virtual storage device.
+    *
+    * @param id Identifier of the target virtual storage
+    * @return Identifier of current request
+    */
+   @POST
+   @Named("storage:delete")
+   @Payload("<ws:deleteStorage><storageId>{id}</storageId></ws:deleteStorage>")
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteStorage(@PayloadParam("id") String id);
+
+   /**
+    * Connects a virtual storage device to an existing server.
+    *
+    * @param payload Payload
+    * @return Identifier of current request
+    */
+   @POST
+   @Named("storage:connect")
+   @MapBinder(ConnectStorageToServerRequestBinder.class)
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String connectStorageToServer(@PayloadParam("storage") Storage.Request.ConnectPayload payload);
+
+   /**
+    * Disconnects a virtual storage device from a connected server.
+    *
+    * @param storageId Identifier of the connected virtual storage
+    * @param serverId Identifier of the connected virtual server
+    * @return Identifier of current request
+    */
+   @POST
+   @Named("storage:disconnect")
+   @Payload("<ws:disconnectStorageFromServer><storageId>{storageId}</storageId><serverId>{serverId}</serverId></ws:disconnectStorageFromServer>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String disconnectStorageFromServer(@PayloadParam("storageId") String storageId, @PayloadParam("serverId") String serverId);
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/handlers/ProfitBricksHttpErrorHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/handlers/ProfitBricksHttpErrorHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/handlers/ProfitBricksHttpErrorHandler.java
index 6453327..a4ecb50 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/handlers/ProfitBricksHttpErrorHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/handlers/ProfitBricksHttpErrorHandler.java
@@ -23,6 +23,7 @@ import javax.inject.Singleton;
 import org.jclouds.http.HttpCommand;
 import org.jclouds.http.HttpErrorHandler;
 import org.jclouds.http.HttpResponse;
+import org.jclouds.http.HttpResponseException;
 import org.jclouds.rest.AuthorizationException;
 import org.jclouds.rest.InsufficientResourcesException;
 import org.jclouds.rest.ResourceNotFoundException;
@@ -40,31 +41,35 @@ public class ProfitBricksHttpErrorHandler implements HttpErrorHandler {
    public void handleError(final HttpCommand command, final HttpResponse response) {
       Exception exception = null;
       try {
-	 switch (response.getStatusCode()) {
-	    case 400:
-	    case 405:
-	       exception = new IllegalArgumentException(response.getMessage(), exception);
-	       break;
-	    case 401:
-	       exception = new AuthorizationException(response.getMessage(), exception);
-	       break;
-	    case 402:
-	    case 409:
-	       exception = new IllegalStateException(response.getMessage(), exception);
-	       break;
-	    case 404:
-	    case 410:
-	       if (!command.getCurrentRequest().getMethod().equals("DELETE"))
-		  exception = new ResourceNotFoundException(response.getMessage(), exception);
-	       break;
-	    case 413:
-	    case 503:
-	       exception = new InsufficientResourcesException(response.getMessage(), exception);
-	       break;
-	 }
+         switch (response.getStatusCode()) {
+            case 400:
+            case 405:
+               exception = new IllegalArgumentException(response.getMessage(), exception);
+               break;
+            case 401:
+               exception = new AuthorizationException("This request requires authentication.", exception);
+               break;
+            case 402:
+            case 409:
+               exception = new IllegalStateException(response.getMessage(), exception);
+               break;
+            case 404:
+            case 410:
+               if (!command.getCurrentRequest().getMethod().equals("DELETE"))
+                  exception = new ResourceNotFoundException(response.getMessage(), exception);
+               break;
+            case 413:
+            case 503:
+               // if nothing (default message was OK) was parsed from command executor, assume it was an 503 (Maintenance) html response.
+               if (response.getMessage().equals("OK"))
+                  exception = new HttpResponseException("The ProfitBricks team is currently carrying out maintenance.", command, response);
+               else
+                  exception = new InsufficientResourcesException(response.getMessage(), exception);
+               break;
+         }
       } finally {
-	 closeQuietly(response.getPayload());
-	 command.setException(exception);
+         closeQuietly(response.getPayload());
+         command.setException(exception);
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
index 78b0c8b..b818d3d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
@@ -24,6 +24,7 @@ import java.io.InputStream;
 import java.net.HttpURLConnection;
 import java.net.Proxy;
 import java.net.URI;
+import java.util.regex.Pattern;
 
 import javax.inject.Named;
 import javax.inject.Singleton;
@@ -51,20 +52,22 @@ import com.google.inject.Inject;
 /**
  * Custom implementation of the HTTP driver to read actual http status and message from SOAP Fault.
  * <br/>
- * ProfitBricks API errors are always returned with 500 HTTP code. This class parses and reads the SOAP response to map the actual http code
- * and message
+ * ProfitBricks API errors are always returned with 500 HTTP code. This class parses and reads the SOAP response to map
+ * the actual http code and message
  */
 @Singleton
 public class ResponseStatusFromPayloadHttpCommandExecutorService extends JavaUrlHttpCommandExecutorService {
 
    private final ParseSax<ServiceFault> faultHandler;
 
+   private static final Pattern endSoapTag = Pattern.compile("</.+:Envelope>$");
+
    @Inject
    ResponseStatusFromPayloadHttpCommandExecutorService(HttpUtils utils, ContentMetadataCodec contentMetadataCodec,
-           DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler,
-           DelegatingErrorHandler errorHandler, HttpWire wire, @Named("untrusted") HostnameVerifier verifier,
-           @Named("untrusted") Supplier<SSLContext> untrustedSSLContextProvider, Function<URI, Proxy> proxyForURI,
-           ParseSax<ServiceFault> faultHandler) {
+	   DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler,
+	   DelegatingErrorHandler errorHandler, HttpWire wire, @Named("untrusted") HostnameVerifier verifier,
+	   @Named("untrusted") Supplier<SSLContext> untrustedSSLContextProvider, Function<URI, Proxy> proxyForURI,
+	   ParseSax<ServiceFault> faultHandler) {
       super(utils, contentMetadataCodec, retryHandler, ioRetryHandler, errorHandler, wire, verifier, untrustedSSLContextProvider, proxyForURI);
       this.faultHandler = faultHandler;
    }
@@ -74,38 +77,40 @@ public class ResponseStatusFromPayloadHttpCommandExecutorService extends JavaUrl
       HttpResponse originalResponse = super.invoke(connection);
       HttpResponse.Builder<?> responseBuilder = originalResponse.toBuilder();
 
-      if (hasPayload(originalResponse) && hasServerError(originalResponse)) {
-         // As we need to read the response body to determine if there are errors, but we may need to process the body
-         // again later in the response parsers if everything is OK, we buffer the body into an InputStream we can reset
-         InputStream in = null;
-         InputStream originalInputStream = originalResponse.getPayload().openStream();
-         if (originalInputStream instanceof ByteArrayInputStream)
-            in = originalInputStream;
-         else
-            try {
-               in = new ByteArrayInputStream(ByteStreams.toByteArray(originalInputStream));
-            } finally {
-               closeQuietly(originalInputStream);
-            }
-
-         try {
-            ServiceFault fault = faultHandler.parse(in);
-            if (fault != null)
-               responseBuilder
-                       .statusCode(fault.httpCode())
-                       .message(fault.message());
-         } catch (Exception ex) {
-            // ignore
-         } finally {
-            // Reset the input stream and set the payload, so it can be read again
-            // by the response and error parsers
-            if (in != null) {
-               in.reset();
-               Payload payload = Payloads.newInputStreamPayload(in);
-               contentMetadataCodec.fromHeaders(payload.getContentMetadata(), originalResponse.getHeaders());
-               responseBuilder.payload(payload);
-            }
-         }
+      if (hasServerError(originalResponse) && hasPayload(originalResponse)) {
+	 // As we need to read the response body to determine if there are errors, but we may need to process the body
+	 // again later in the response parsers if everything is OK, we buffer the body into an InputStream we can reset
+	 InputStream in = null;
+	 InputStream originalInputStream = originalResponse.getPayload().openStream();
+
+	 if (originalInputStream instanceof ByteArrayInputStream)
+	    in = originalInputStream;
+	 else
+	    try {
+	       in = new ByteArrayInputStream(ByteStreams.toByteArray(originalInputStream));
+	    } finally {
+	       closeQuietly(originalInputStream);
+	    }
+	 try {
+	    if (isSoapPayload(in)) {
+	       ServiceFault fault = faultHandler.parse(in);
+	       if (fault != null)
+		  responseBuilder
+			  .statusCode(fault.httpCode())
+			  .message(fault.message());
+	    }
+	 } catch (Exception ex) {
+	    // ignore
+	 } finally {
+	    // Reset the input stream and set the payload, so it can be read again
+	    // by the response and error parsers
+	    if (in != null) {
+	       in.reset();
+	       Payload payload = Payloads.newInputStreamPayload(in);
+	       contentMetadataCodec.fromHeaders(payload.getContentMetadata(), originalResponse.getHeaders());
+	       responseBuilder.payload(payload);
+	    }
+	 }
       }
 
       return responseBuilder.build();
@@ -119,4 +124,17 @@ public class ResponseStatusFromPayloadHttpCommandExecutorService extends JavaUrl
       return response.getPayload() != null && response.getPayload().getRawContent() != null;
    }
 
+   private static boolean isSoapPayload(final InputStream is) throws IOException {
+      int size = is.available();
+      char[] chars = new char[size];
+      byte[] bytes = new byte[size];
+
+      is.read(bytes, 0, size);
+      for (int i = 0; i < size;)
+	 chars[i] = (char) (bytes[i++] & 0xff);
+
+      is.reset(); // throws premature end of file w/o this
+
+      return endSoapTag.matcher(new String(chars)).find();
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/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 fce8e21..7f2131d 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
@@ -32,9 +32,9 @@ import org.jclouds.io.Payloads;
 public class ProfitBricksSoapMessageEnvelope implements HttpRequestFilter {
 
    private final String SOAP_PREFIX
-	   = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">"
-	   + "<soapenv:Header/>"
-	   + "<soapenv:Body>";
+           = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">"
+           + "<soapenv:Header/>"
+           + "<soapenv:Body>";
 
    private final String SOAP_SUFFIX = "</soapenv:Body></soapenv:Envelope>";
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
index c61f2b5..6a9933f 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
@@ -16,23 +16,14 @@
  */
 package org.jclouds.profitbricks.http.parser;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Date;
-
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.http.functions.ParseSax;
 import org.xml.sax.SAXException;
 
 public abstract class BaseProfitBricksResponseHandler<T> extends ParseSax.HandlerForGeneratedRequestWithResult<T> {
 
-   protected final DateCodec dateCodec;
-
    private final StringBuilder strBuilder;
 
-   public BaseProfitBricksResponseHandler(DateCodecFactory dateCodec) {
-      this.dateCodec = checkNotNull(checkNotNull(dateCodec, "dateCodecFactory null").iso8601(), "iso8601 date codec null");
+   public BaseProfitBricksResponseHandler() {
       this.strBuilder = new StringBuilder();
    }
 
@@ -41,10 +32,6 @@ public abstract class BaseProfitBricksResponseHandler<T> extends ParseSax.Handle
       strBuilder.append(ch, start, length);
    }
 
-   protected final Date textToIso8601Date() {
-      return dateCodec.toDate(textToStringValue());
-   }
-
    protected String textToStringValue() {
       return strBuilder.toString().trim();
    }
@@ -52,9 +39,9 @@ public abstract class BaseProfitBricksResponseHandler<T> extends ParseSax.Handle
    protected Float textToFloatValue() {
       return Float.valueOf(textToStringValue());
    }
-   
-   protected Double textToDoubleValue(){
-      return Double.valueOf( textToStringValue());
+
+   protected Double textToDoubleValue() {
+      return Double.valueOf(textToStringValue());
    }
 
    protected int textToIntValue() {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
index 6e6b288..2914e50 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
@@ -16,28 +16,24 @@
  */
 package org.jclouds.profitbricks.http.parser;
 
-import com.google.inject.Inject;
-import org.jclouds.date.DateCodecFactory;
 import org.xml.sax.SAXException;
 
 public class RequestIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
 
    private String requestId;
 
-   @Inject
-   RequestIdOnlyResponseHandler( DateCodecFactory dateCodec ) {
-      super( dateCodec );
+   RequestIdOnlyResponseHandler() {
    }
 
    @Override
-   public void endElement( String uri, String localName, String qName ) throws SAXException {
-      setPropertyOnEndTag( qName );
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
       clearTextBuffer();
    }
 
    @Override
-   protected void setPropertyOnEndTag( String qName ) {
-      if ( "requestId".equals( qName ) )
+   protected void setPropertyOnEndTag(String qName) {
+      if ("requestId".equals(qName))
          requestId = textToStringValue();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandler.java
index c6a504b..f21c32e 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandler.java
@@ -16,42 +16,37 @@
  */
 package org.jclouds.profitbricks.http.parser;
 
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.ServiceFault;
 import org.xml.sax.SAXException;
 
-import com.google.inject.Inject;
-
 public class ServiceFaultResponseHandler extends BaseProfitBricksResponseHandler<ServiceFault> {
 
    private final ServiceFault.Builder builder;
    private boolean done = false;
 
-   @Inject
-   ServiceFaultResponseHandler(DateCodecFactory dateCodec) {
-      super(dateCodec);
+   ServiceFaultResponseHandler() {
       this.builder = ServiceFault.builder();
    }
 
    @Override
    protected void setPropertyOnEndTag(String qName) {
       if ("faultCode".equals(qName))
-	 builder.faultCode(ServiceFault.FaultCode.fromValue(textToStringValue()));
+         builder.faultCode(ServiceFault.FaultCode.fromValue(textToStringValue()));
       else if ("httpCode".equals(qName))
-	 builder.httpCode(textToIntValue());
+         builder.httpCode(textToIntValue());
       else if ("message".equals(qName))
-	 builder.message(textToStringValue());
+         builder.message(textToStringValue());
       else if ("requestId".equals(qName))
-	 builder.requestId(textToIntValue());
+         builder.requestId(textToIntValue());
    }
 
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
       if (done)
-	 return;
+         return;
       setPropertyOnEndTag(qName);
       if ("detail".equals(qName))
-	 done = true;
+         done = true;
       clearTextBuffer();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/BaseDataCenterResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/BaseDataCenterResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/BaseDataCenterResponseHandler.java
index 409131f..931d5e9 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/BaseDataCenterResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/BaseDataCenterResponseHandler.java
@@ -16,9 +16,6 @@
  */
 package org.jclouds.profitbricks.http.parser.datacenter;
 
-import javax.inject.Inject;
-
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
 
@@ -26,18 +23,16 @@ public abstract class BaseDataCenterResponseHandler<T> extends BaseProfitBricksR
 
    protected DataCenter.Builder builder;
 
-   @Inject
-   BaseDataCenterResponseHandler(DateCodecFactory dateCodecFactory) {
-      super(dateCodecFactory);
+   BaseDataCenterResponseHandler() {
       this.builder = DataCenter.builder();
    }
 
    @Override
    protected void setPropertyOnEndTag(String qName) {
       if ("dataCenterId".equals(qName))
-	 builder.id(textToStringValue());
+         builder.id(textToStringValue());
       else if ("dataCenterVersion".equals(qName))
-	 builder.version(textToIntValue());
+         builder.version(textToIntValue());
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
index 5b3aadd..d44c880 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
@@ -16,42 +16,94 @@
  */
 package org.jclouds.profitbricks.http.parser.datacenter;
 
-import org.jclouds.date.DateCodecFactory;
+import java.util.List;
+
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.profitbricks.http.parser.server.ServerInfoResponseHandler;
+import org.jclouds.profitbricks.http.parser.storage.StorageInfoResponseHandler;
+import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
 public class DataCenterInfoResponseHandler extends BaseDataCenterResponseHandler<DataCenter> {
 
+   private final ServerInfoResponseHandler serverInfoResponseHandler;
+   private final StorageInfoResponseHandler storageInfoResponseHandler;
+
+   private final List<Server> servers = Lists.newArrayList();
+   private final List<Storage> storages = Lists.newArrayList();
+
    private boolean done = false;
+   private boolean useServerParser = false;
+   private boolean useStorageParser = false;
 
    @Inject
-   DataCenterInfoResponseHandler(DateCodecFactory dateCodecFactory) {
-      super(dateCodecFactory);
+   DataCenterInfoResponseHandler(ServerInfoResponseHandler serverInfoResponseHandler, StorageInfoResponseHandler storageInforResponseHandler) {
+      this.serverInfoResponseHandler = serverInfoResponseHandler;
+      this.storageInfoResponseHandler = storageInforResponseHandler;
+   }
+
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+      if ("servers".equals(qName))
+         useServerParser = true;
+      else if ("storages".equals(qName))
+         useStorageParser = true;
    }
 
    @Override
    protected void setPropertyOnEndTag(String qName) {
       super.setPropertyOnEndTag(qName);
       if ("dataCenterName".equals(qName))
-	 builder.name(textToStringValue());
+         builder.name(textToStringValue());
       else if ("location".equals(qName))
-	 builder.location(Location.fromId(textToStringValue()));
+         builder.location(Location.fromId(textToStringValue()));
       else if ("provisioningState".equals(qName))
-	 builder.state(ProvisioningState.fromValue(textToStringValue()));
+         builder.state(ProvisioningState.fromValue(textToStringValue()));
+   }
+
+   @Override
+   public void characters(char[] ch, int start, int length) {
+      if (useServerParser)
+         serverInfoResponseHandler.characters(ch, start, length);
+      else if (useStorageParser)
+         storageInfoResponseHandler.characters(ch, start, length);
+      else
+         super.characters(ch, start, length);
    }
 
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
       if (done)
-	 return;
-      setPropertyOnEndTag(qName);
-      if ("return".equals(qName))
-	 done = true;
-      clearTextBuffer();
+         return;
+
+      if ("servers".equals(qName)) {
+         useServerParser = false;
+         servers.add(serverInfoResponseHandler.getResult());
+      } else if ("storages".equals(qName)) {
+         useStorageParser = false;
+         storages.add(storageInfoResponseHandler.getResult());
+      }
+
+      if (useServerParser)
+         serverInfoResponseHandler.endElement(uri, localName, qName);
+      else if (useStorageParser)
+         storageInfoResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName)) {
+            done = true;
+            builder.servers(servers);
+            builder.storages(storages);
+         }
+         clearTextBuffer();
+      }
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandler.java
index 8b8ad1a..b66264e 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandler.java
@@ -18,22 +18,18 @@ package org.jclouds.profitbricks.http.parser.datacenter;
 
 import java.util.List;
 
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.xml.sax.SAXException;
 
 import com.google.common.collect.Lists;
-import com.google.inject.Inject;
 
 public class DataCenterListResponseHandler extends BaseDataCenterResponseHandler<List<DataCenter>> {
 
    private final List<DataCenter> dataCenters;
 
-   @Inject
-   DataCenterListResponseHandler(DateCodecFactory dateCodec) {
-      super(dateCodec);
+   DataCenterListResponseHandler() {
       this.dataCenters = Lists.newArrayList();
    }
 
@@ -46,19 +42,19 @@ public class DataCenterListResponseHandler extends BaseDataCenterResponseHandler
    protected void setPropertyOnEndTag(String qName) {
       super.setPropertyOnEndTag(qName);
       if ("dataCenterName".equals(qName))
-	 builder.name(textToStringValue());
+         builder.name(textToStringValue());
       else if ("location".equals(qName))
-	 builder.location(Location.fromValue(textToStringValue()));
+         builder.location(Location.fromValue(textToStringValue()));
       else if ("provisioningState".equals(qName))
-	 builder.state(ProvisioningState.fromValue(textToStringValue()));
+         builder.state(ProvisioningState.fromValue(textToStringValue()));
    }
 
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
       setPropertyOnEndTag(qName);
       if ("return".equals(qName)) {
-	 dataCenters.add(builder.build());
-	 builder = DataCenter.builder();
+         dataCenters.add(builder.build());
+         builder = DataCenter.builder();
       }
       clearTextBuffer();
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
index 1a6ff94..1e8828c 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
@@ -16,9 +16,6 @@
  */
 package org.jclouds.profitbricks.http.parser.image;
 
-import javax.inject.Inject;
-
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.Image;
 import org.jclouds.profitbricks.domain.Image.Type;
 import org.jclouds.profitbricks.domain.Location;
@@ -29,9 +26,7 @@ public abstract class BaseImageResponseHandler<T> extends BaseProfitBricksRespon
 
    protected Image.Builder builder;
 
-   @Inject
-   BaseImageResponseHandler(DateCodecFactory dateCodecFactory) {
-      super(dateCodecFactory);
+   BaseImageResponseHandler() {
       this.builder = Image.builder();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
index 0736acb..62d3973 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
@@ -16,8 +16,6 @@
  */
 package org.jclouds.profitbricks.http.parser.image;
 
-import com.google.inject.Inject;
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.Image;
 import org.xml.sax.SAXException;
 
@@ -25,9 +23,7 @@ public class ImageInfoResponseHandler extends BaseImageResponseHandler<Image> {
 
    private boolean done = false;
 
-   @Inject
-   ImageInfoResponseHandler(DateCodecFactory dateCodecFactory) {
-      super(dateCodecFactory);
+   ImageInfoResponseHandler() {
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
index 8fc8091..ee73908 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
@@ -17,9 +17,9 @@
 package org.jclouds.profitbricks.http.parser.image;
 
 import com.google.common.collect.Lists;
-import com.google.inject.Inject;
+
 import java.util.List;
-import org.jclouds.date.DateCodecFactory;
+
 import org.jclouds.profitbricks.domain.Image;
 import org.xml.sax.SAXException;
 
@@ -27,9 +27,7 @@ public class ImageListResponseHandler extends BaseImageResponseHandler<List<Imag
 
    private final List<Image> images;
 
-   @Inject
-   ImageListResponseHandler(DateCodecFactory dateCodecFactory) {
-      super(dateCodecFactory);
+   ImageListResponseHandler() {
       this.images = Lists.newArrayList();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
index e594ce4..356d218 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
@@ -16,7 +16,12 @@
  */
 package org.jclouds.profitbricks.http.parser.server;
 
+import java.util.Date;
+
+import org.jclouds.date.DateCodec;
+
 import com.google.inject.Inject;
+
 import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
 import org.jclouds.profitbricks.domain.OsType;
@@ -28,48 +33,54 @@ public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksRespo
 
    protected Server.DescribingBuilder builder;
 
+   protected final DateCodec dateCodec;
+
    @Inject
-   BaseServerResponseHandler( DateCodecFactory dateCodec ) {
-      super( dateCodec );
+   BaseServerResponseHandler(DateCodecFactory dateCodec) {
+      this.dateCodec = dateCodec.iso8601();
       this.builder = Server.builder();
    }
 
+   protected final Date textToIso8601Date() {
+      return dateCodec.toDate(textToStringValue());
+   }
+
    @Override
-   protected void setPropertyOnEndTag( String qName ) {
-      if ( "serverId".equals( qName ) )
-         builder.id( textToStringValue() );
-      else if ( "serverName".equals( qName ) )
-         builder.name( textToStringValue() );
-      else if ( "cores".equals( qName ) )
-         builder.cores( textToIntValue() );
-      else if ( "ram".equals( qName ) )
-         builder.ram( textToIntValue() );
-      else if ( "provisioningState".equals( qName ) )
-         builder.state( ProvisioningState.fromValue( textToStringValue() ) );
-      else if ( "virtualMachineState".equals( qName ) )
-         builder.status( Server.Status.fromValue( textToStringValue() ) );
-      else if ( "osType".equals( qName ) )
-         builder.osType( OsType.fromValue( textToStringValue() ) );
-      else if ( "availabilityZone".equals( qName ) )
-         builder.availabilityZone( AvailabilityZone.fromValue( textToStringValue() ) );
-      else if ( "creationTime".equals( qName ) )
-         builder.creationTime( textToIso8601Date() );
-      else if ( "lastModificationTime".equals( qName ) )
-         builder.lastModificationTime( textToIso8601Date() );
-      else if ( "internetAccess".equals( qName ) )
-         builder.hasInternetAccess( textToBooleanValue() );
-      else if ( "cpuHotPlug".equals( qName ) )
-         builder.isCpuHotPlug( textToBooleanValue() );
-      else if ( "ramHotPlug".equals( qName ) )
-         builder.isRamHotPlug( textToBooleanValue() );
-      else if ( "nicHotPlug".equals( qName ) )
-         builder.isNicHotPlug( textToBooleanValue() );
-      else if ( "nicHotUnPlug".equals( qName ) )
-         builder.isNicHotUnPlug( textToBooleanValue() );
-      else if ( "discVirtioHotPlug".equals( qName ) )
-         builder.isDiscVirtioHotPlug( textToBooleanValue() );
-      else if ( "discVirtioHotUnPlug".equals( qName ) )
-         builder.isDiscVirtioHotUnPlug( textToBooleanValue() );
+   protected void setPropertyOnEndTag(String qName) {
+      if ("serverId".equals(qName))
+         builder.id(textToStringValue());
+      else if ("serverName".equals(qName))
+         builder.name(textToStringValue());
+      else if ("cores".equals(qName))
+         builder.cores(textToIntValue());
+      else if ("ram".equals(qName))
+         builder.ram(textToIntValue());
+      else if ("provisioningState".equals(qName))
+         builder.state(ProvisioningState.fromValue(textToStringValue()));
+      else if ("virtualMachineState".equals(qName))
+         builder.status(Server.Status.fromValue(textToStringValue()));
+      else if ("osType".equals(qName))
+         builder.osType(OsType.fromValue(textToStringValue()));
+      else if ("availabilityZone".equals(qName))
+         builder.availabilityZone(AvailabilityZone.fromValue(textToStringValue()));
+      else if ("creationTime".equals(qName))
+         builder.creationTime(textToIso8601Date());
+      else if ("lastModificationTime".equals(qName))
+         builder.lastModificationTime(textToIso8601Date());
+      else if ("internetAccess".equals(qName))
+         builder.hasInternetAccess(textToBooleanValue());
+      else if ("cpuHotPlug".equals(qName))
+         builder.isCpuHotPlug(textToBooleanValue());
+      else if ("ramHotPlug".equals(qName))
+         builder.isRamHotPlug(textToBooleanValue());
+      else if ("nicHotPlug".equals(qName))
+         builder.isNicHotPlug(textToBooleanValue());
+      else if ("nicHotUnPlug".equals(qName))
+         builder.isNicHotUnPlug(textToBooleanValue());
+      else if ("discVirtioHotPlug".equals(qName))
+         builder.isDiscVirtioHotPlug(textToBooleanValue());
+      else if ("discVirtioHotUnPlug".equals(qName))
+         builder.isDiscVirtioHotUnPlug(textToBooleanValue());
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
index ed88018..1c74354 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
@@ -16,8 +16,6 @@
  */
 package org.jclouds.profitbricks.http.parser.server;
 
-import com.google.inject.Inject;
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
 import org.xml.sax.SAXException;
 
@@ -30,20 +28,18 @@ public class ServerIdOnlyResponseHandler extends BaseProfitBricksResponseHandler
 
    private String serverId;
 
-   @Inject
-   ServerIdOnlyResponseHandler( DateCodecFactory dateCodec ) {
-      super( dateCodec );
+   ServerIdOnlyResponseHandler() {
    }
 
    @Override
-   public void endElement( String uri, String localName, String qName ) throws SAXException {
-      setPropertyOnEndTag( qName );
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
       clearTextBuffer();
    }
 
    @Override
-   protected void setPropertyOnEndTag( String qName ) {
-      if ( "serverId".equals( qName ) )
+   protected void setPropertyOnEndTag(String qName) {
+      if ("serverId".equals(qName))
          serverId = textToStringValue();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
index dfac4ff..3dc6e6e 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
@@ -26,16 +26,16 @@ public class ServerInfoResponseHandler extends BaseServerResponseHandler<Server>
    private boolean done = false;
 
    @Inject
-   ServerInfoResponseHandler( DateCodecFactory dateCodec ) {
-      super( dateCodec );
+   ServerInfoResponseHandler(DateCodecFactory dateCodec) {
+      super(dateCodec);
    }
 
    @Override
-   public void endElement( String uri, String localName, String qName ) throws SAXException {
-      if ( done )
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
          return;
-      setPropertyOnEndTag( qName );
-      if ( "return".equals( qName ) )
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName))
          done = true;
       clearTextBuffer();
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
index f50027c..f0fcd3f 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
@@ -28,16 +28,16 @@ public class ServerListResponseHandler extends BaseServerResponseHandler<List<Se
    private final List<Server> servers;
 
    @Inject
-   ServerListResponseHandler( DateCodecFactory dateCodec ) {
-      super( dateCodec );
+   ServerListResponseHandler(DateCodecFactory dateCodec) {
+      super(dateCodec);
       this.servers = Lists.newArrayList();
    }
 
    @Override
-   public void endElement( String uri, String localName, String qName ) throws SAXException {
-      setPropertyOnEndTag( qName );
-      if ( "return".equals( qName ) ) {
-         servers.add( builder.build() );
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName)) {
+         servers.add(builder.build());
          builder = Server.builder();
       }
       clearTextBuffer();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandler.java
index 705a918..d618cc1 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandler.java
@@ -16,20 +16,15 @@
  */
 package org.jclouds.profitbricks.http.parser.state;
 
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
 import org.xml.sax.SAXException;
 
-import com.google.inject.Inject;
-
 public class GetProvisioningStateResponseHandler extends BaseProfitBricksResponseHandler<ProvisioningState> {
 
    private ProvisioningState state = ProvisioningState.UNRECOGNIZED;
 
-   @Inject
-   GetProvisioningStateResponseHandler(DateCodecFactory dateCodec) {
-      super(dateCodec);
+   GetProvisioningStateResponseHandler() {
    }
 
    @Override
@@ -41,7 +36,7 @@ public class GetProvisioningStateResponseHandler extends BaseProfitBricksRespons
    @Override
    protected void setPropertyOnEndTag(String qName) {
       if ("return".equals(qName))
-	 state = ProvisioningState.fromValue(textToStringValue());
+         state = ProvisioningState.fromValue(textToStringValue());
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/BaseStorageResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/BaseStorageResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/BaseStorageResponseHandler.java
new file mode 100644
index 0000000..cb61e79
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/BaseStorageResponseHandler.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.storage;
+
+import java.util.Date;
+import java.util.List;
+
+import org.jclouds.date.DateCodec;
+
+import com.google.inject.Inject;
+
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.profitbricks.domain.Storage.BusType;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+
+import com.google.common.collect.Lists;
+
+public abstract class BaseStorageResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected final DateCodec dateCodec;
+
+   protected Storage.Builder builder;
+   protected List<String> serverIds;
+
+   @Inject
+   BaseStorageResponseHandler(DateCodecFactory dateCodec) {
+      this.dateCodec = dateCodec.iso8601();
+      this.builder = Storage.builder();
+      this.serverIds = Lists.newArrayList();
+   }
+
+   protected final Date textToIso8601Date() {
+      return dateCodec.toDate(textToStringValue());
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+//            <requestId>?</requestId>
+//            <dataCenterId>?</dataCenterId>
+//            <dataCenterVersion>?</dataCenterVersion>
+      if ("storageId".equals(qName))
+         builder.id(textToStringValue());
+      else if ("size".equals(qName))
+         builder.size(textToFloatValue());
+      else if ("storageName".equals(qName))
+         builder.name(textToStringValue());
+      else if ("provisioningState".equals(qName))
+         builder.state(ProvisioningState.fromValue(textToStringValue()));
+      else if ("creationTime".equals(qName))
+         builder.creationTime(textToIso8601Date());
+      else if ("lastModificationTime".equals(qName))
+         builder.lastModificationTime(textToIso8601Date());
+//            <mountImage>
+//               <imageId>?</imageId>
+//               <imageName>?</imageName>
+//            </mountImage>
+      else if ("serverIds".equals(qName))
+         serverIds.add(textToStringValue());
+      else if ("bootDevice".equals(qName))
+         builder.bootDevice(textToBooleanValue());
+      else if ("busType".equals(qName))
+         builder.busType(BusType.fromValue(textToStringValue()));
+      else if ("deviceNumber".equals(qName))
+         builder.deviceNumber(textToIntValue());
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageIdOnlyResponseHandler.java
new file mode 100644
index 0000000..ac3a039
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageIdOnlyResponseHandler.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.storage;
+
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.xml.sax.SAXException;
+
+public class StorageIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
+
+   private String storageId;
+
+   StorageIdOnlyResponseHandler() {
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      clearTextBuffer();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("storageId".equals(qName))
+         storageId = textToStringValue();
+   }
+
+   @Override
+   public String getResult() {
+      return storageId;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandler.java
new file mode 100644
index 0000000..2bc1ed6
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandler.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.storage;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Storage;
+import org.xml.sax.SAXException;
+
+public class StorageInfoResponseHandler extends BaseStorageResponseHandler<Storage> {
+
+   private boolean done = false;
+
+   @Inject
+   StorageInfoResponseHandler(DateCodecFactory dateCodec) {
+      super(dateCodec);
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
+         return;
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName)) {
+         done = true;
+         builder.serverIds(serverIds);
+      }
+      clearTextBuffer();
+   }
+
+   @Override
+   public Storage getResult() {
+      return builder.build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
new file mode 100644
index 0000000..fe5e3fa
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.storage;
+
+import autovalue.shaded.com.google.common.common.collect.Lists;
+import com.google.inject.Inject;
+import java.util.List;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Storage;
+import org.xml.sax.SAXException;
+
+public class StorageListResponseHandler extends BaseStorageResponseHandler<List<Storage>> {
+
+   private final List<Storage> storages;
+
+   @Inject
+   StorageListResponseHandler(DateCodecFactory dateCodec) {
+      super(dateCodec);
+      this.storages = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName)) {
+         storages.add(builder
+                 .serverIds(serverIds)
+                 .build());
+         builder = Storage.builder();
+         serverIds = Lists.newArrayList();
+      }
+      clearTextBuffer();
+   }
+
+   @Override
+   public List<Storage> getResult() {
+      return storages;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
index 3ebc9c0..e310b6e 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
@@ -38,8 +38,8 @@ public abstract class BaseProfitBricksLiveTest extends BaseApiLiveTest<ProfitBri
    protected void initialize() {
       super.initialize();
       this.dcWaitingPredicate = Predicates2.retry(
-	      new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE),
-	      2l * 60l, 2l, TimeUnit.SECONDS);
+              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE),
+              2l * 60l, 2l, TimeUnit.SECONDS);
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
index b3a891b..6c4815f 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
@@ -38,10 +38,10 @@ public class CreateDataCenterRequestBinderTest {
    }
 
    private final String expectedPayload
-	   = ("      <ws:createDataCenter>\n"
-	   + "         <request>\n"
-	   + "            <dataCenterName>JClouds-DC</dataCenterName>\n"
-	   + "            <location>de/fkb</location>\n"
-	   + "         </request>\n"
-	   + "      </ws:createDataCenter>\n").replaceAll("\\s+", "");
+           = ("      <ws:createDataCenter>\n"
+           + "         <request>\n"
+           + "            <dataCenterName>JClouds-DC</dataCenterName>\n"
+           + "            <location>de/fkb</location>\n"
+           + "         </request>\n"
+           + "      </ws:createDataCenter>\n").replaceAll("\\s+", "");
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
index 9e72172..3f989ce 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
@@ -37,10 +37,10 @@ public class UpdateDataCenterRequestBinderTest {
    }
 
    private final String expectedPayload
-	   = ("      <ws:updateDataCenter>\n"
-	   + "         <request>\n"
-	   + "            <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>\n"
-	   + "            <dataCenterName>Apache-DC</dataCenterName>\n"
-	   + "         </request>\n"
-	   + "      </ws:updateDataCenter>").replaceAll("\\s+", "");
+           = ("      <ws:updateDataCenter>\n"
+           + "         <request>\n"
+           + "            <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>\n"
+           + "            <dataCenterName>Apache-DC</dataCenterName>\n"
+           + "         </request>\n"
+           + "      </ws:updateDataCenter>").replaceAll("\\s+", "");
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
index bf18841..355f318 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
@@ -21,7 +21,7 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "CreateServerRequestBinderTest" )
+@Test(groups = "unit", testName = "CreateServerRequestBinderTest")
 public class CreateServerRequestBinderTest {
 
    @Test
@@ -29,37 +29,37 @@ public class CreateServerRequestBinderTest {
       CreateServerRequestBinder binder = new CreateServerRequestBinder();
 
       Server.Request.CreatePayload payload = Server.Request.creatingBuilder()
-              .name( "jclouds-node" )
-              .cores( 4 )
-              .ram( 4 * 1024 )
-              .dataCenterId( "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" )
+              .name("jclouds-node")
+              .cores(4)
+              .ram(4 * 1024)
+              .dataCenterId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
               .build();
 
-      String actual = binder.createPayload( payload );
-      assertNotNull( actual, "Binder returned null payload" );
-      assertEquals( actual, expectedPayload );
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(actual, expectedPayload);
    }
 
    private final String expectedPayload
-           = ( "      <ws:createServer>\n"
+           = ("      <ws:createServer>\n"
            + "         <request>\n"
            + "            <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>\n"
            + "            <cores>4</cores>\n"
            + "            <ram>4096</ram>\n"
            + "            <serverName>jclouds-node</serverName>\n"
-//           + "            <bootFromStorageId>?</bootFromStorageId>\n"
-//           + "            <bootFromImageId>?</bootFromImageId>\n"
-//           + "            <internetAccess>false</internetAccess>\n"
-//           + "            <lanId>?</lanId>\n"
-//           + "            <osType>?</osType>\n"
-//           + "            <availabilityZone>AUTO</availabilityZone>\n"
-//           + "            <cpuHotPlug>false</cpuHotPlug>\n"
-//           + "            <ramHotPlug>false</ramHotPlug>\n"
-//           + "            <nicHotPlug>false</nicHotPlug>\n"
-//           + "            <nicHotUnPlug>false</nicHotUnPlug>\n"
-//           + "            <discVirtioHotPlug>false</discVirtioHotPlug>\n"
-//           + "            <discVirtioHotUnPlug>false</discVirtioHotUnPlug>\n"
+           //           + "            <bootFromStorageId>?</bootFromStorageId>\n"
+           //           + "            <bootFromImageId>?</bootFromImageId>\n"
+           //           + "            <internetAccess>false</internetAccess>\n"
+           //           + "            <lanId>?</lanId>\n"
+           //           + "            <osType>?</osType>\n"
+           //           + "            <availabilityZone>AUTO</availabilityZone>\n"
+           //           + "            <cpuHotPlug>false</cpuHotPlug>\n"
+           //           + "            <ramHotPlug>false</ramHotPlug>\n"
+           //           + "            <nicHotPlug>false</nicHotPlug>\n"
+           //           + "            <nicHotUnPlug>false</nicHotUnPlug>\n"
+           //           + "            <discVirtioHotPlug>false</discVirtioHotPlug>\n"
+           //           + "            <discVirtioHotUnPlug>false</discVirtioHotUnPlug>\n"
            + "         </request>\n"
-           + "      </ws:createServer>" )
-           .replaceAll( "\\s+", "" );
+           + "      </ws:createServer>")
+           .replaceAll("\\s+", "");
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
index cba666b..aa0e31c 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
@@ -21,7 +21,7 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "UpdateServerRequestBinderTest" )
+@Test(groups = "unit", testName = "UpdateServerRequestBinderTest")
 public class UpdateServerRequestBinderTest {
 
    @Test
@@ -29,36 +29,36 @@ public class UpdateServerRequestBinderTest {
       UpdateServerRequestBinder binder = new UpdateServerRequestBinder();
 
       Server.Request.UpdatePayload payload = Server.Request.updatingBuilder()
-              .id( "qwertyui-qwer-qwer-qwer-qwertyyuiiop" )
-              .cores( 8 )
-              .ram( 8 * 1024 )
-              .name( "apache-node")
+              .id("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+              .cores(8)
+              .ram(8 * 1024)
+              .name("apache-node")
               .build();
-      
-      String actual = binder.createPayload( payload );
+
+      String actual = binder.createPayload(payload);
       assertNotNull(actual, "Binder returned null payload");
       assertEquals(actual, expectedPayload);
    }
 
    private final String expectedPayload
-           = ( "      <ws:updateServer>\n"
+           = ("      <ws:updateServer>\n"
            + "         <request>\n"
            + "            <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>\n"
            + "            <cores>8</cores>\n"
            + "            <ram>8192</ram>\n"
            + "            <serverName>apache-node</serverName>\n"
-//           + "            <bootFromStorageId>?</bootFromStorageId>\n"
-//           + "            <bootFromImageId>?</bootFromImageId>\n"
-//           + "            <osType>?</osType>\n"
-//           + "            <availabilityZone>?</availabilityZone>\n"
-//           + "            <cpuHotPlug>?</cpuHotPlug>\n"
-//           + "            <ramHotPlug>?</ramHotPlug>\n"
-//           + "            <nicHotPlug>?</nicHotPlug>\n"
-//           + "            <nicHotUnPlug>?</nicHotUnPlug>\n"
-//           + "            <discVirtioHotPlug>?</discVirtioHotPlug>\n"
-//           + "            <discVirtioHotUnPlug>?</discVirtioHotUnPlug>\n"
+           //           + "            <bootFromStorageId>?</bootFromStorageId>\n"
+           //           + "            <bootFromImageId>?</bootFromImageId>\n"
+           //           + "            <osType>?</osType>\n"
+           //           + "            <availabilityZone>?</availabilityZone>\n"
+           //           + "            <cpuHotPlug>?</cpuHotPlug>\n"
+           //           + "            <ramHotPlug>?</ramHotPlug>\n"
+           //           + "            <nicHotPlug>?</nicHotPlug>\n"
+           //           + "            <nicHotUnPlug>?</nicHotUnPlug>\n"
+           //           + "            <discVirtioHotPlug>?</discVirtioHotPlug>\n"
+           //           + "            <discVirtioHotUnPlug>?</discVirtioHotUnPlug>\n"
            + "         </request>\n"
-           + "      </ws:updateServer>" )
-           .replaceAll( "\\s+", "" );
+           + "      </ws:updateServer>")
+           .replaceAll("\\s+", "");
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinderTest.java
new file mode 100644
index 0000000..0c0d3a4
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinderTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.binder.storage;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.profitbricks.domain.Storage;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "ConnectStorageToServerRequestBinderTest")
+public class ConnectStorageToServerRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      ConnectStorageToServerRequestBinder binder = new ConnectStorageToServerRequestBinder();
+
+      Storage.Request.ConnectPayload payload = Storage.Request.connectingBuilder()
+              .serverId("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+              .storageId("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+              .busType(Storage.BusType.VIRTIO)
+              .deviceNumber(2)
+              .build();
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(actual, expectedPayload);
+   }
+
+   private final String expectedPayload
+           = ("      <ws:connectStorageToServer>\n"
+           + "         <request>\n"
+           + "            <storageId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</storageId>\n"
+           + "            <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>\n"
+           + "            <busType>VIRTIO</busType>\n"
+           + "            <deviceNumber>2</deviceNumber>\n"
+           + "         </request>\n"
+           + "      </ws:connectStorageToServer>")
+           .replaceAll("\\s+", "");
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinderTest.java
new file mode 100644
index 0000000..9120be7
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinderTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.binder.storage;
+
+import org.jclouds.profitbricks.domain.Storage;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "CreateStorageRequestBinderTest")
+public class CreateStorageRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      CreateStorageRequestBinder binder = new CreateStorageRequestBinder();
+
+      Storage.Request.CreatePayload payload = Storage.Request.creatingBuilder()
+              .name("hdd-1")
+              .size(60f)
+              .dataCenterId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+              .mountImageId("5ad99c9e-9166-11e4-9d74-52540066fee9")
+              .imagePassword("qqqqqqqqq")
+              .build();
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(actual, expectedPayload);
+   }
+
+   private final String expectedPayload
+           = ("      <ws:createStorage>\n"
+           + "         <request>\n"
+           + "            <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>\n"
+           + "            <storageName>hdd-1</storageName>\n"
+           + "            <size>60</size>\n"
+           + "            <mountImageId>5ad99c9e-9166-11e4-9d74-52540066fee9</mountImageId>\n"
+           + "            <profitBricksImagePassword>qqqqqqqqq</profitBricksImagePassword>\n"
+           + "         </request>\n"
+           + "      </ws:createStorage>")
+           .replaceAll("\\s+", "");
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinderTest.java
new file mode 100644
index 0000000..0240297
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinderTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.binder.storage;
+
+import org.jclouds.profitbricks.domain.Storage;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "UpdateStorageRequestBinderTest")
+public class UpdateStorageRequestBinderTest {
+
+   @Test
+   public void testUpdatePayload() {
+      UpdateStorageRequestBinder binder = new UpdateStorageRequestBinder();
+
+      Storage.Request.UpdatePayload payload = Storage.Request.updatingBuilder()
+              .id("pppppppp-llkl-kkjk-fhgh-vnmegrdgdsgr")
+              .size(100f)
+              .name("hdd-2")
+              .mountImageId("5f3cac96-915f-11e4-9d74-52540066fee9")
+              .build();
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(actual, expectedPayload);
+   }
+
+   private final String expectedPayload
+           = ("      <ws:updateStorage>\n"
+           + "         <request>\n"
+           + "            <storageId>pppppppp-llkl-kkjk-fhgh-vnmegrdgdsgr</storageId>\n"
+           + "            <size>100</size>\n"
+           + "            <storageName>hdd-2</storageName>\n"
+           + "            <mountImageId>5f3cac96-915f-11e4-9d74-52540066fee9</mountImageId>\n"
+           + "         </request>\n"
+           + "      </ws:updateStorage>")
+           .replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
index 05001f2..f69fc02 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
@@ -39,7 +39,7 @@ import com.squareup.okhttp.mockwebserver.MockWebServer;
 public class ProvisioningStatusPollingPredicateTest extends BaseProfitBricksMockTest {
 
    @Test
-   public void testPredicate() throws Exception {
+   public void testDataCenterPredicate() throws Exception {
       MockWebServer server = mockWebServer();
 
       byte[] payloadInProcess = payloadFromResource("/datacenter/datacenter-state-inprocess.xml");
@@ -71,4 +71,70 @@ public class ProvisioningStatusPollingPredicateTest extends BaseProfitBricksMock
       }
    }
 
+   @Test
+   public void testServerPredicate() throws Exception {
+      MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/server/server-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/server/server.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.SERVER, ProvisioningState.AVAILABLE),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+      try {
+         waitUntilAvailable.apply(id);
+         ProvisioningState finalState = pbApi.serverApi().getServer(id).state();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertEquals(finalState, ProvisioningState.AVAILABLE);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testStoragePredicate() throws Exception {
+      MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/storage/storage-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/storage/storage.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.STORAGE, ProvisioningState.AVAILABLE),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+      try {
+         waitUntilAvailable.apply(id);
+         ProvisioningState finalState = pbApi.storageApi().getStorage(id).state();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertEquals(finalState, ProvisioningState.AVAILABLE);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
 }


[29/35] jclouds git commit: JCLOUDS-951: Remove inheritance in ProfitBrick's AutoValue classes

Posted by de...@apache.org.
JCLOUDS-951: Remove inheritance in ProfitBrick's AutoValue classes


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

Branch: refs/heads/master
Commit: 5e82bbfa462cf3a537fef4d6a42eba7bed87de55
Parents: ed247e7
Author: Reijhanniel Jearl Campos <de...@gmail.com>
Authored: Wed Oct 21 22:55:39 2015 +0800
Committer: Zack Shoylev <za...@rackspace.com>
Committed: Tue Oct 27 13:12:23 2015 -0500

----------------------------------------------------------------------
 .../AddFirewallRuleToNicRequestBinder.java      |   2 +-
 .../CreateLoadBalancerRequestBinder.java        |   4 +-
 .../UpdateLoadBalancerRequestBinder.java        |   2 +-
 .../snapshot/UpdateSnapshotRequestBinder.java   |   2 +-
 .../storage/CreateStorageRequestBinder.java     |   2 +-
 .../ProfitBricksComputeServiceAdapter.java      |   2 +-
 ...ProfitBricksComputeServiceContextModule.java |   2 +-
 .../compute/function/ProvisionableToImage.java  |   2 +-
 .../profitbricks/domain/AvailabilityZone.java   |   9 +-
 .../jclouds/profitbricks/domain/DataCenter.java | 112 ++---
 .../org/jclouds/profitbricks/domain/Drive.java  |  37 +-
 .../jclouds/profitbricks/domain/Firewall.java   | 332 +++----------
 .../org/jclouds/profitbricks/domain/Image.java  | 134 +++---
 .../jclouds/profitbricks/domain/IpBlock.java    |  90 ++--
 .../profitbricks/domain/LoadBalancer.java       | 321 ++++---------
 .../jclouds/profitbricks/domain/Location.java   |   8 +-
 .../org/jclouds/profitbricks/domain/Nic.java    | 303 ++++--------
 .../org/jclouds/profitbricks/domain/OsType.java |   8 +-
 .../profitbricks/domain/Provisionable.java      |  25 +
 .../profitbricks/domain/ProvisioningState.java  |   8 +-
 .../org/jclouds/profitbricks/domain/Server.java | 480 +++++++++----------
 .../profitbricks/domain/ServiceFault.java       |  45 +-
 .../jclouds/profitbricks/domain/Snapshot.java   | 290 +++++------
 .../jclouds/profitbricks/domain/Storage.java    | 259 +++-------
 .../ipblock/BaseIpBlockResponseHandler.java     |   7 +-
 .../parser/ipblock/IpBlockResponseHandler.java  |   4 +-
 .../BaseLoadBalancerResponseHandler.java        |   2 +-
 .../http/parser/nic/BaseNicResponseHandler.java |   7 +-
 .../http/parser/nic/NicListResponseHandler.java |   6 +
 .../http/parser/nic/NicResponseHandler.java     |   7 +-
 .../publicip/PublicIpListResponseHandler.java   |   4 +-
 .../server/BaseServerResponseHandler.java       |   2 +-
 .../server/ServerListResponseHandler.java       |   4 +-
 .../profitbricks/util/Preconditions.java        | 100 ++++
 .../CreateDataCenterRequestBinderTest.java      |   2 +-
 .../UpdateDataCenterRequestBinderTest.java      |   2 +-
 .../AddRomDriveToServerRequestBinderTest.java   |   2 +-
 .../AddFirewallRuleToNicRequestBinderTest.java  |  27 +-
 .../CreateLoadBalancerRequestBinderTest.java    |  28 +-
 ...DeregisterLoadBalancerRequestBinderTest.java |   2 +-
 .../RegisterLoadBalancerRequestBinderTest.java  |   2 +-
 .../UpdateLoadBalancerRequestBinderTest.java    |  19 +-
 .../CreateSnapshotRequestBinderTest.java        |  10 +-
 .../RollbackSnapshotRequestBinderTest.java      |   5 +-
 .../UpdateSnapshotRequestBinderTest.java        |  16 +-
 .../function/ServerToNodeMetadataTest.java      |   2 +-
 .../domain/FirewallRuleBuilderTest.java         |   2 +-
 .../profitbricks/domain/ServerBuilderTest.java  |   8 +-
 .../features/DataCenterApiLiveTest.java         |   4 +-
 .../features/DataCenterApiMockTest.java         |   6 +-
 .../features/DrivesApiLiveTest.java             |   2 +-
 .../features/DrivesApiMockTest.java             |   2 +-
 .../features/FirewallApiLiveTest.java           |  14 +-
 .../features/FirewallApiMockTest.java           |  24 +-
 .../features/LoadBalancerApiLiveTest.java       | 134 ++++++
 .../features/LoadBalancerApiMockTest.java       | 290 +++++++++++
 .../features/LoadbalancerApiLiveTest.java       | 135 ------
 .../features/LoadbalancerApiMockTest.java       | 285 -----------
 .../profitbricks/features/NicApiMockTest.java   |  18 +-
 .../features/ServerApiLiveTest.java             |   7 +-
 .../features/SnapshotApiLiveTest.java           |  10 +-
 .../features/SnapshotApiMockTest.java           |  10 +-
 .../features/StorageApiLiveTest.java            |   6 +-
 ...omPayloadHttpCommandExecutorServiceTest.java |  10 +-
 .../DataCenterInfoResponseHandlerTest.java      |   2 +-
 .../ipblock/IpBlockListResponseHandlerTest.java |  19 +-
 .../ipblock/IpBlockResponseHandlerTest.java     |   5 +-
 .../LoadBalancerListResponseHandlerTest.java    |   4 +-
 .../LoadBalancerResponseHandlerTest.java        |   2 +-
 .../parser/nic/NicListResponseHandlerTest.java  |   6 +-
 .../http/parser/nic/NicResponseHandlerTest.java |   8 +-
 .../server/ServerInfoResponseHandlerTest.java   |   2 +-
 .../server/ServerListResponseHandlerTest.java   |   4 +-
 .../SnapshotListResponseHandlerTest.java        |   4 +-
 .../snapshot/SnapshotResponseHandlerTest.java   |   2 +-
 .../test/resources/ipblock/ipblock-reserve.xml  |   2 +-
 .../src/test/resources/ipblock/ipblock.xml      |   4 +-
 .../src/test/resources/ipblock/ipblocks.xml     |  18 +-
 .../loadbalancer/loadbalancer-create.xml        |   2 +-
 .../loadbalancer/loadbalancer-delete.xml        |   2 +-
 .../resources/loadbalancer/loadbalancer.xml     |   2 +-
 .../resources/loadbalancer/loadbalancers.xml    |   4 +-
 .../profitbricks/src/test/resources/nic/nic.xml |   4 +-
 .../src/test/resources/nic/nics.xml             |   4 +-
 84 files changed, 1629 insertions(+), 2177 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
index 9bdbf76..8f4db03 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
@@ -33,7 +33,7 @@ public class AddFirewallRuleToNicRequestBinder extends BaseProfitBricksRequestBi
    protected String createPayload(Firewall.Request.AddRulePayload payload) {
       requestBuilder.append("<ws:addFirewallRulesToNic>")
               .append(format("<nicId>%s</nicId>", payload.nicId()));
-      for (Firewall.RuleWithIcmp rule : payload.rules())
+      for (Firewall.Rule rule : payload.rules())
          requestBuilder
                  .append("<request>")
                  .append(formatIfNotEmpty("<icmpCode>%s</icmpCode>", rule.icmpCode()))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
index 90eb93f..e3d13a1 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
@@ -35,8 +35,8 @@ public class CreateLoadBalancerRequestBinder extends BaseProfitBricksRequestBind
       requestBuilder.append("<ws:createLoadBalancer>")
               .append("<request>")
               .append(format("<dataCenterId>%s</dataCenterId>", payload.dataCenterId()))
-              .append(format("<loadBalancerName>%s</loadBalancerName>", payload.loadBalancerName()))
-              .append(format("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.loadBalancerAlgorithm()))
+              .append(format("<loadBalancerName>%s</loadBalancerName>", payload.name()))
+              .append(format("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.algorithm()))
               .append(format("<ip>%s</ip>", payload.ip()))
               .append(format("<lanId>%s</lanId>", payload.lanId()));
       for (String serverId : payload.serverIds())

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
index 0496655..c093f23 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
@@ -36,7 +36,7 @@ public class UpdateLoadBalancerRequestBinder extends BaseProfitBricksRequestBind
               .append("<request>")
               .append(format("<loadBalancerId>%s</loadBalancerId>", payload.id()))
               .append(formatIfNotEmpty("<loadBalancerName>%s</loadBalancerName>", payload.name()))
-              .append(formatIfNotEmpty("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.loadBalancerAlgorithm()))
+              .append(formatIfNotEmpty("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.algorithm()))
               .append(formatIfNotEmpty("<ip>%s</ip>", payload.ip()))
               .append("</request>")
               .append("</ws:updateLoadBalancer>").toString();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
index df1b7cd..1414c69 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
@@ -33,7 +33,7 @@ public class UpdateSnapshotRequestBinder extends BaseProfitBricksRequestBinder<S
    protected String createPayload(Snapshot.Request.UpdatePayload payload) {
       requestBuilder.append("<ws:updateSnapshot>")
               .append("<request>")
-              .append(format("<snapshotId>%s</snapshotId>", payload.snapshotId()))
+              .append(format("<snapshotId>%s</snapshotId>", payload.id()))
               .append(format("<description>%s</description>", payload.description()))
               .append(format("<snapshotName>%s</snapshotName>", payload.name()))
               .append(formatIfNotEmpty("<bootable>%s</bootable>", payload.bootable()))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
index acfb6f3..9681b64 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
@@ -37,7 +37,7 @@ public class CreateStorageRequestBinder extends BaseProfitBricksRequestBinder<St
               .append(formatIfNotEmpty("<storageName>%s</storageName>", payload.name()))
               .append(format("<size>%.0f</size>", payload.size()))
               .append(formatIfNotEmpty("<mountImageId>%s</mountImageId>", payload.mountImageId()))
-              .append(formatIfNotEmpty("<profitBricksImagePassword>%s</profitBricksImagePassword>", payload.profitBricksImagePassword()))
+              .append(formatIfNotEmpty("<profitBricksImagePassword>%s</profitBricksImagePassword>", payload.imagePassword()))
               .append("</request>")
               .append("</ws:createStorage>");
       return requestBuilder.toString();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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 add3fb9..4f6548e 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
@@ -54,7 +54,7 @@ import org.jclouds.profitbricks.features.ServerApi;
 import org.jclouds.profitbricks.compute.concurrent.ProvisioningJob;
 import org.jclouds.profitbricks.compute.concurrent.ProvisioningManager;
 import org.jclouds.profitbricks.domain.Snapshot;
-import org.jclouds.profitbricks.domain.internal.Provisionable;
+import org.jclouds.profitbricks.domain.Provisionable;
 import org.jclouds.profitbricks.util.Passwords;
 import org.jclouds.rest.ResourceNotFoundException;
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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 d260caf..2b45d18 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
@@ -52,7 +52,7 @@ import org.jclouds.profitbricks.compute.function.StorageToVolume;
 import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
 import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
 import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.profitbricks.domain.internal.Provisionable;
+import org.jclouds.profitbricks.domain.Provisionable;
 import org.jclouds.util.Predicates2;
 
 import com.google.common.base.Function;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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 c5fcd78..c5c7f5e 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
@@ -29,7 +29,7 @@ import org.jclouds.domain.Location;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Snapshot;
-import org.jclouds.profitbricks.domain.internal.Provisionable;
+import org.jclouds.profitbricks.domain.Provisionable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Strings;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
index 97cac69..a3c50ae 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
@@ -16,6 +16,8 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import com.google.common.base.Enums;
+
 public enum AvailabilityZone {
 
    AUTO, ZONE_1, ZONE_2, UNRECOGNIZED;
@@ -25,11 +27,6 @@ public enum AvailabilityZone {
    }
 
    public static AvailabilityZone fromValue(String v) {
-      try {
-         return valueOf(v);
-      } catch (Exception ex) {
-         return UNRECOGNIZED;
-      }
+      return Enums.getIfPresent(AvailabilityZone.class, v).or(UNRECOGNIZED);
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
index a24d84b..9bb09ab 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
@@ -16,17 +16,14 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Strings.isNullOrEmpty;
+import static org.jclouds.profitbricks.util.Preconditions.checkInvalidChars;
 
 import java.util.List;
-import java.util.regex.Pattern;
 
 import org.jclouds.javax.annotation.Nullable;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
 
 @AutoValue
 public abstract class DataCenter {
@@ -49,81 +46,60 @@ public abstract class DataCenter {
 
    @Nullable
    public abstract List<Storage> storages();
-//   @Nullable public abstract List<LoadBalancer> loadBalancers();
-
-   public static DataCenter create(String id, String name, int version, ProvisioningState state, Location location, List<Server> servers,
-           List<Storage> storages) {
-      return new AutoValue_DataCenter(id, name, version, state, location,
-              servers != null ? ImmutableList.copyOf(servers) : Lists.<Server>newArrayList(),
-              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList());
-   }
 
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_DataCenter.Builder()
+              .servers(ImmutableList.<Server>of())
+              .storages(ImmutableList.<Storage>of());
    }
 
-   public Builder toBuilder() {
-      return builder().fromDataCenter(this);
-   }
+   public abstract Builder toBuilder();
 
-   public static final class Builder {
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      private String id;
-      private String name;
-      private ProvisioningState state;
-      private Location location;
-      private int version;
-      private List<Server> servers;
-      private List<Storage> storages;
-//      private List<LoadBalancer> loadBalancer;
+      public abstract Builder id(String id);
 
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
+      public abstract Builder name(String name);
 
-      public Builder name(String name) {
-         this.name = name;
-         return this;
-      }
+      public abstract Builder version(int version);
 
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
+      public abstract Builder state(ProvisioningState state);
 
-      public Builder location(Location location) {
-         this.location = location;
-         return this;
-      }
+      public abstract Builder location(Location location);
 
-      public Builder version(int version) {
-         this.version = version;
-         return this;
-      }
+      public abstract Builder servers(List<Server> servers);
 
-      public Builder servers(List<Server> servers) {
-         this.servers = servers;
-         return this;
-      }
-
-      public Builder storages(List<Storage> storages) {
-         this.storages = storages;
-         return this;
-      }
+      public abstract Builder storages(List<Storage> storages);
 
-      public DataCenter build() {
-         return DataCenter.create(id, name, version, state, location, servers, storages);
+      abstract DataCenter autoBuild();
+      
+      public DataCenter build(){
+         DataCenter built = autoBuild();
+         return built.toBuilder()
+                 .servers(ImmutableList.copyOf(built.servers()))
+                 .storages(ImmutableList.copyOf(built.storages()))
+                 .autoBuild();
       }
 
-      public Builder fromDataCenter(DataCenter in) {
-         return this.id(in.id()).name(in.name()).version(in.version()).state(in.state()).location(in.location()).servers(in.servers())
-                 .storages(in.storages());
-      }
    }
 
    public static final class Request {
 
+      public static CreatePayload creatingPayload(String name, Location location) {
+         CreatePayload payload = new AutoValue_DataCenter_Request_CreatePayload(name, location);
+         checkInvalidChars(payload.name());
+
+         return payload;
+      }
+
+      public static UpdatePayload updatingPayload(String id, String name) {
+         UpdatePayload payload = new AutoValue_DataCenter_Request_UpdatePayload(id, name);
+         checkInvalidChars(payload.name());
+
+         return payload;
+      }
+
       @AutoValue
       public abstract static class CreatePayload {
 
@@ -131,11 +107,6 @@ public abstract class DataCenter {
 
          public abstract Location location();
 
-         public static CreatePayload create(String name, Location location) {
-            checkInvalidChars(name);
-            return new AutoValue_DataCenter_Request_CreatePayload(name, location);
-         }
-
       }
 
       @AutoValue
@@ -145,17 +116,6 @@ public abstract class DataCenter {
 
          public abstract String name();
 
-         public static UpdatePayload create(String id, String name) {
-            checkInvalidChars(name);
-            return new AutoValue_DataCenter_Request_UpdatePayload(id, name);
-         }
-      }
-
-      private static final Pattern INVALID_CHARS = Pattern.compile("^.*[@/\\|'`’^].*$");
-
-      private static void checkInvalidChars(String name) {
-         checkArgument(!isNullOrEmpty(name), "Name is required.");
-         checkArgument(!INVALID_CHARS.matcher(name).matches(), "Name must not contain any of: @ / \\ | ' ` ’ ^");
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
index 08add2a..c2efe09 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
@@ -18,10 +18,12 @@ package org.jclouds.profitbricks.domain;
 
 import com.google.auto.value.AutoValue;
 
+import org.jclouds.javax.annotation.Nullable;
+
 @AutoValue
 public abstract class Drive {
 
-   public static final class Request {
+   public abstract static class Request {
 
       @AutoValue
       public abstract static class AddRomDriveToServerPayload {
@@ -30,40 +32,23 @@ public abstract class Drive {
 
          public abstract String imageId();
 
+         @Nullable
          public abstract String deviceNumber();
 
-         public static AddRomDriveToServerPayload create(String serverId, String storageId, String deviceNumber) {
-            return new AutoValue_Drive_Request_AddRomDriveToServerPayload(serverId, storageId, deviceNumber);
-         }
-
          public static Builder builder() {
-            return new Builder();
+            return new AutoValue_Drive_Request_AddRomDriveToServerPayload.Builder();
          }
 
-         public static class Builder {
-
-            private String serverId;
-            private String imageId;
-            private String deviceNumber;
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-            public Builder serverId(String serverId) {
-               this.serverId = serverId;
-               return this;
-            }
+            public abstract Builder serverId(String serverId);
 
-            public Builder storageId(String storageId) {
-               this.imageId = storageId;
-               return this;
-            }
+            public abstract Builder imageId(String imageId);
 
-            public Builder deviceNumber(String deviceNumber) {
-               this.deviceNumber = deviceNumber;
-               return this;
-            }
+            public abstract Builder deviceNumber(String deviceNumber);
 
-            public AddRomDriveToServerPayload build() {
-               return AddRomDriveToServerPayload.create(serverId, imageId, deviceNumber);
-            }
+            public abstract AddRomDriveToServerPayload build();
          }
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
index 2108bc4..78b30c1 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
@@ -16,18 +16,18 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.net.InetAddresses.isInetAddress;
-import static org.jclouds.profitbricks.util.MacAddresses.isMacAddress;
+import static org.jclouds.profitbricks.util.Preconditions.checkIcmp;
+import static org.jclouds.profitbricks.util.Preconditions.checkIp;
+import static org.jclouds.profitbricks.util.Preconditions.checkMacAddress;
+import static org.jclouds.profitbricks.util.Preconditions.checkPortRange;
 
 import java.util.List;
 
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.profitbricks.domain.internal.FirewallRuleCommonProperties;
 
 import com.google.auto.value.AutoValue;
+import com.google.common.base.Enums;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
 
 @AutoValue
 public abstract class Firewall {
@@ -37,11 +37,7 @@ public abstract class Firewall {
       TCP, UDP, ICMP, ANY, UNRECOGNIZED;
 
       public static Protocol fromValue(String value) {
-         try {
-            return valueOf(value);
-         } catch (IllegalArgumentException e) {
-            return UNRECOGNIZED;
-         }
+         return Enums.getIfPresent(Protocol.class, value).or(UNRECOGNIZED);
       }
    }
 
@@ -51,7 +47,8 @@ public abstract class Firewall {
    @Nullable
    public abstract String nicId();
 
-   public abstract boolean active();
+   @Nullable
+   public abstract Boolean active();
 
    @Nullable
    public abstract ProvisioningState state();
@@ -59,228 +56,79 @@ public abstract class Firewall {
    @Nullable
    public abstract List<Rule> rules();
 
-   public static Firewall create(String id, String nicId, boolean active, ProvisioningState provisioningState,
-           List<Rule> rules) {
-      return new AutoValue_Firewall(id, nicId, active, provisioningState,
-              rules != null ? ImmutableList.copyOf(rules) : ImmutableList.<Rule>of());
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_Firewall.Builder()
+              .rules(ImmutableList.<Rule>of());
    }
 
-   public static final class Request {
-
-      public static AddRulePayload.Builder ruleAddingBuilder() {
-         return new AddRulePayload.Builder();
-      }
-
-      @AutoValue
-      public abstract static class AddRulePayload {
+   public abstract Builder toBuilder();
 
-         public abstract String nicId();
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-         public abstract List<RuleWithIcmp> rules();
+      public abstract Builder id(String id);
 
-         public static AddRulePayload create(String nicId, List<RuleWithIcmp> rules) {
-            return new AutoValue_Firewall_Request_AddRulePayload(nicId, rules);
-         }
+      public abstract Builder nicId(String nicId);
 
-         public static class Builder {
+      public abstract Builder active(Boolean active);
 
-            private String nicId;
-            private List<RuleWithIcmp> rules = Lists.newArrayList();
+      public abstract Builder state(ProvisioningState state);
 
-            public Builder nicId(String nicId) {
-               this.nicId = nicId;
-               return this;
-            }
+      public abstract Builder rules(List<Rule> rules);
 
-            public Builder rules(List<RuleWithIcmp> rules) {
-               this.rules = rules;
-               return this;
-            }
-
-            public RuleWithIcmp.Builder newRule() {
-               return new RuleWithIcmp.Builder(this);
-            }
-
-            public Builder addRule(RuleWithIcmp rule) {
-               this.rules.add(rule);
-               return this;
-            }
-
-            public AddRulePayload build() {
-               return AddRulePayload.create(nicId, rules);
-            }
-         }
+      abstract Firewall autoBuild();
+      
+      public Firewall build(){
+         Firewall built = autoBuild();
+         
+         return built.toBuilder()
+                 .rules(ImmutableList.copyOf(built.rules()))
+                 .autoBuild();
       }
    }
 
-   public static class Builder {
-
-      private String id;
-      private String nicId;
-      private boolean active;
-
-      private ProvisioningState state;
-      private List<Rule> rules;
-
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
-
-      public Builder nicId(String nicId) {
-         this.nicId = nicId;
-         return this;
-      }
-
-      public Builder active(boolean active) {
-         this.active = active;
-         return this;
-      }
-
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
-
-      public Builder rules(List<Rule> firewallRules) {
-         this.rules = firewallRules;
-         return this;
-      }
-
-      public Builder fromFirewall(Firewall in) {
-         return this.id(in.id()).nicId(in.nicId()).active(in.active()).state(in.state())
-                 .rules(in.rules());
-      }
-
-      public Firewall build() {
-         return Firewall.create(id, nicId, active, state, rules);
-      }
-   }
-
-   public abstract static class RuleBuilder<B extends RuleBuilder, D extends FirewallRuleCommonProperties> {
-
-      protected String name;
-      protected Integer portRangeEnd;
-      protected Integer portRangeStart;
-      protected Protocol protocol;
-      protected String sourceIp;
-      protected String sourceMac;
-      protected String targetIp;
-
-      public B name(String name) {
-         this.name = name;
-         return self();
-      }
-
-      public B portRangeEnd(Integer portRangeEnd) {
-         this.portRangeEnd = portRangeEnd;
-         return self();
-      }
-
-      public B portRangeStart(Integer portRangeStart) {
-         this.portRangeStart = portRangeStart;
-         return self();
-      }
-
-      public B protocol(Protocol protocol) {
-         this.protocol = protocol;
-         return self();
-      }
-
-      public B sourceIp(String sourceIp) {
-         this.sourceIp = sourceIp;
-         return self();
-      }
-
-      public B sourceMac(String sourceMac) {
-         this.sourceMac = sourceMac;
-         return self();
-      }
+   public static final class Request {
 
-      public B targetIp(String targetIp) {
-         this.targetIp = targetIp;
-         return self();
+      public static AddRulePayload createAddRulePayload(String nicId, List<Rule> rules) {
+         return new AutoValue_Firewall_Request_AddRulePayload(nicId, ImmutableList.copyOf(rules));
       }
 
-      public abstract B self();
-
-      public abstract D build();
-
-      protected void checkPortRange() {
-         checkArgument(!(portRangeEnd == null ^ portRangeStart == null), "Port range must be both present or null");
-         if (portRangeEnd != null) {
-            checkArgument(protocol == Protocol.TCP || protocol == Protocol.UDP, "Port range can only be set for TCP or UDP");
-            checkArgument(portRangeEnd > portRangeStart, "portRangeEnd must be greater than portRangeStart");
-            checkArgument(portRangeEnd >= 1 && portRangeEnd <= 65534, "Port range end must be 1 to 65534");
-            checkArgument(portRangeStart >= 1 && portRangeStart <= 65534, "Port range start must be 1 to 65534");
-         }
-      }
+      @AutoValue
+      public abstract static class AddRulePayload {
 
-      protected void checkMac() {
-         if (sourceMac != null)
-            checkArgument(isMacAddress(sourceMac), "Source MAC must match pattern 'aa:bb:cc:dd:ee:ff'");
-      }
+         public abstract String nicId();
 
-      protected void checkIp() {
-         if (sourceIp != null)
-            checkArgument(isInetAddress(sourceIp), "Source IP is invalid");
-         if (targetIp != null)
-            checkArgument(isInetAddress(targetIp), "Target IP is invalid");
-      }
+         public abstract List<Rule> rules();
 
-      protected void checkFields() {
-         checkMac();
-         checkPortRange();
-         checkIp();
       }
-
    }
 
    @AutoValue
-   public abstract static class Rule implements FirewallRuleCommonProperties {
+   public abstract static class Rule {
 
       @Nullable
       public abstract String id();
 
-      public static Rule create(String id, String name, Integer portRangeEnd, Integer portRangeStart,
-              Protocol protocol, String sourceIp, String sourceMac, String targetIp) {
-         return new AutoValue_Firewall_Rule(name, portRangeEnd, portRangeStart, protocol, sourceIp, sourceMac,
-                 targetIp, id);
-      }
-
-      public static Builder builder() {
-         return new Builder();
-      }
-
-      public static class Builder extends RuleBuilder<Builder, Rule> {
+      @Nullable
+      public abstract String name();
 
-         private String id;
+      @Nullable
+      public abstract Integer portRangeEnd();
 
-         public Builder id(String id) {
-            this.id = id;
-            return self();
-         }
+      @Nullable
+      public abstract Integer portRangeStart();
 
-         @Override
-         public Builder self() {
-            return this;
-         }
+      @Nullable
+      public abstract Protocol protocol();
 
-         @Override
-         public Rule build() {
-            checkFields();
-            return Rule.create(id, name, portRangeEnd, portRangeStart, protocol, sourceIp, sourceMac, targetIp);
-         }
+      @Nullable
+      public abstract String sourceIp();
 
-      }
-   }
+      @Nullable
+      public abstract String sourceMac();
 
-   @AutoValue
-   public abstract static class RuleWithIcmp implements FirewallRuleCommonProperties {
+      @Nullable
+      public abstract String targetIp();
 
       @Nullable
       public abstract Integer icmpCode();
@@ -288,76 +136,52 @@ public abstract class Firewall {
       @Nullable
       public abstract Integer icmpType();
 
-      public static RuleWithIcmp create(Integer icmpCode, Integer icmpType, String name, Integer portRangeEnd,
-              Integer portRangeStart, Protocol protocol, String sourceIp, String sourceMac, String targetIp) {
-         return new AutoValue_Firewall_RuleWithIcmp(name, portRangeEnd, portRangeStart, protocol, sourceIp, sourceMac,
-                 targetIp, icmpCode, icmpType);
-      }
-
       public static Builder builder() {
-         return new Builder();
+         return new AutoValue_Firewall_Rule.Builder()
+                 .protocol(Protocol.ANY);
       }
 
-      public static class Builder extends RuleBuilder<Builder, RuleWithIcmp> {
+      public Builder toBuilder() {
+         return new AutoValue_Firewall_Rule.Builder(this);
+      }
 
-         private Request.AddRulePayload.Builder parentBuilder;
+      @AutoValue.Builder
+      public abstract static class Builder {
 
-         private Integer icmpCode;
-         private Integer icmpType;
+         public abstract Builder id(String id);
 
-         public Builder() {
+         public abstract Builder name(String name);
 
-         }
+         public abstract Builder portRangeEnd(Integer portRangeEnd);
 
-         private Builder(Request.AddRulePayload.Builder parentBuilder) {
-            this.parentBuilder = parentBuilder;
-         }
+         public abstract Builder portRangeStart(Integer portRangeStart);
 
-         public Builder nextRule() {
-            this.parentBuilder.addRule(build());
-            return new Builder(parentBuilder);
-         }
+         public abstract Builder protocol(Protocol protocol);
 
-         public Request.AddRulePayload.Builder endRule() {
-            this.parentBuilder.addRule(build());
-            return parentBuilder;
-         }
+         public abstract Builder sourceIp(String sourceIp);
 
-         public Builder icmpCode(Integer icmpCode) {
-            this.icmpCode = icmpCode;
-            return this;
-         }
+         public abstract Builder sourceMac(String sourceMac);
 
-         public Builder icmpType(Integer icmpType) {
-            this.icmpType = icmpType;
-            return this;
-         }
+         public abstract Builder targetIp(String targetIp);
 
-         @Override
-         public Builder self() {
-            return this;
-         }
+         public abstract Builder icmpCode(Integer icmpCode);
 
-         @Override
-         public RuleWithIcmp build() {
-            checkFields();
-            return RuleWithIcmp.create(icmpCode, icmpType, name, portRangeEnd, portRangeStart, protocol,
-                    sourceIp, sourceMac, targetIp);
-         }
+         public abstract Builder icmpType(Integer icmpType);
 
-         @Override
-         protected void checkFields() {
-            super.checkFields();
-            checkIcmp();
-         }
+         abstract Rule autoBuild();
 
-         private void checkIcmp() {
-            if (icmpCode != null)
-               checkArgument(icmpCode >= 1 && icmpCode <= 254, "ICMP code must be 1 to 254");
-            if (icmpType != null)
-               checkArgument(icmpType >= 1 && icmpType <= 254, "ICMP type must be 1 to 254");
-            if (icmpCode != null || icmpType != null)
-               checkArgument(protocol == Protocol.ICMP, "ICMP code and types can only be set for ICMP protocol");
+         public Rule build() {
+            Rule rule = autoBuild();
+            if (rule.sourceIp() != null)
+               checkIp(rule.sourceIp());
+            if (rule.targetIp() != null)
+               checkIp(rule.targetIp());
+            if (rule.sourceMac() != null)
+               checkMacAddress(rule.sourceMac());
+            checkPortRange(rule.portRangeStart(), rule.portRangeEnd(), rule.protocol());
+            checkIcmp(rule.icmpType(), rule.icmpCode(), rule.protocol());
+
+            return rule;
          }
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
index 0987324..383a744 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
@@ -16,9 +16,10 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import org.jclouds.profitbricks.domain.internal.Provisionable;
-
 import com.google.auto.value.AutoValue;
+import com.google.common.base.Enums;
+
+import org.jclouds.javax.annotation.Nullable;
 
 @AutoValue
 public abstract class Image implements Provisionable {
@@ -28,84 +29,99 @@ public abstract class Image implements Provisionable {
       HDD, CDROM, UNRECOGNIZED;
 
       public static Type fromValue(String v) {
-         try {
-            return valueOf(v);
-         } catch (IllegalArgumentException ex) {
-            return UNRECOGNIZED;
-         }
+         return Enums.getIfPresent(Type.class, v).or(UNRECOGNIZED);
       }
    }
 
+   public abstract String id();
+
+   public abstract String name();
+
+   public abstract float size(); // MB
+
+   public abstract Location location();
+
+   public abstract OsType osType();
+
    public abstract Type type();
 
-   public abstract boolean isPublic();
+   @Nullable
+   public abstract Boolean isPublic();
 
-   public abstract boolean isWriteable();
+   @Nullable
+   public abstract Boolean isWriteable();
 
-   public abstract boolean isBootable();
+   @Nullable
+   public abstract Boolean isBootable();
 
-   public static Image create(String id, String name, float size, Type type, Location location, OsType osType,
-           boolean isPublic, Boolean isWriteable, Boolean isBootable, Boolean cpuHotPlug, Boolean cpuHotUnPlug,
-           Boolean ramHotPlug, Boolean ramHotUnPlug, Boolean nicHotPlug, Boolean nicHotUnPlug,
-           Boolean discVirtioHotPlug, Boolean discVirtioHotUnPlug) {
-      return new AutoValue_Image(cpuHotPlug, cpuHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug,
-              discVirtioHotPlug, discVirtioHotUnPlug, id, name, size, location, osType, type, isPublic, isWriteable,
-              isBootable);
-   }
+   @Nullable
+   public abstract Boolean isCpuHotPlug();
+
+   @Nullable
+   public abstract Boolean isCpuHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isRamHotPlug();
+
+   @Nullable
+   public abstract Boolean isRamHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isNicHotPlug();
+
+   @Nullable
+   public abstract Boolean isNicHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isDiscVirtioHotPlug();
+
+   @Nullable
+   public abstract Boolean isDiscVirtioHotUnPlug();
 
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_Image.Builder();
    }
 
-   public Builder toBuilder() {
-      return builder().fromImage(this);
-   }
+   public abstract Builder toBuilder();
 
-   public static class Builder extends Provisionable.Builder<Builder, Image> {
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      private Type type;
-      private boolean isPublic;
-      private boolean isWriteable;
-      private boolean isBootable;
+      public abstract Builder id(String id);
 
-      public Builder type(Type type) {
-         this.type = type;
-         return this;
-      }
+      public abstract Builder name(String name);
 
-      public Builder isPublic(boolean isPublic) {
-         this.isPublic = isPublic;
-         return this;
-      }
+      public abstract Builder size(float size);
 
-      public Builder isWriteable(boolean isWriteable) {
-         this.isWriteable = isWriteable;
-         return this;
-      }
+      public abstract Builder location(Location location);
 
-      public Builder isBootable(boolean isBootable) {
-         this.isBootable = isBootable;
-         return this;
-      }
+      public abstract Builder osType(OsType osType);
 
-      @Override
-      public Image build() {
-         return Image.create(id, name, size, type, location, osType, isPublic, isWriteable, isBootable, cpuHotPlug, cpuHotUnPlug,
-                 ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
-      }
+      public abstract Builder type(Type type);
 
-      public Builder fromImage(Image in) {
-         return this.id(in.id()).isBootable(in.isBootable()).isCpuHotPlug(in.isCpuHotPlug()).isCpuHotUnPlug(in.isCpuHotUnPlug())
-                 .isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
-                 .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug()).isPublic(in.isPublic())
-                 .isRamHotPlug(in.isRamHotPlug()).isRamHotUnPlug(in.isRamHotUnPlug()).isWriteable(in.isWriteable())
-                 .location(in.location()).name(in.name()).osType(in.osType()).size(in.size()).type(in.type());
-      }
+      public abstract Builder isPublic(Boolean isPublic);
 
-      @Override
-      public Builder self() {
-         return this;
-      }
+      public abstract Builder isWriteable(Boolean isWriteable);
+
+      public abstract Builder isBootable(Boolean isBootable);
+
+      public abstract Builder isCpuHotPlug(Boolean isCpuHotPlug);
+
+      public abstract Builder isCpuHotUnPlug(Boolean isCpuHotUnPlug);
+
+      public abstract Builder isRamHotPlug(Boolean isRamHotPlug);
+
+      public abstract Builder isRamHotUnPlug(Boolean isRamHotUnPlug);
+
+      public abstract Builder isNicHotPlug(Boolean isNicHotPlug);
+
+      public abstract Builder isNicHotUnPlug(Boolean isNicHotUnPlug);
+
+      public abstract Builder isDiscVirtioHotPlug(Boolean isDiscVirtioHotPlug);
+
+      public abstract Builder isDiscVirtioHotUnPlug(Boolean isDiscVirtioHotUnPlug);
+
+      public abstract Image build();
 
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
index 47741ff..cc2c999 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
@@ -16,9 +16,14 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import static org.jclouds.profitbricks.util.Preconditions.checkIp;
+import static org.jclouds.profitbricks.util.Preconditions.checkIps;
+
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
+
 import java.util.List;
+
 import org.jclouds.javax.annotation.Nullable;
 
 @AutoValue
@@ -30,51 +35,39 @@ public abstract class IpBlock {
 
    public abstract List<PublicIp> publicIps();
 
+   @Nullable
    public abstract List<String> ips();
 
-   public static IpBlock create(String id, Location location, List<PublicIp> publicIps, List<String> ips) {
-      return new AutoValue_IpBlock(id, location, publicIps, ips != null ? ImmutableList.copyOf(ips) : ImmutableList.<String>of());
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_IpBlock.Builder()
+              .publicIps(ImmutableList.<PublicIp>of())
+              .ips(ImmutableList.<String>of());
    }
 
-   public static final class Builder {
+   public abstract Builder toBuilder();
 
-      private String id;
-      private Location location;
-      private List<PublicIp> publicIps;
-      private List<String> ips;
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
+      public abstract Builder id(String id);
 
-      public Builder location(Location location) {
-         this.location = location;
-         return this;
-      }
+      public abstract Builder location(Location location);
 
-      public Builder publicIps(List<PublicIp> publicIps) {
-         this.publicIps = publicIps;
-         return this;
-      }
+      public abstract Builder publicIps(List<PublicIp> publicIps);
 
-      public Builder ips(List<String> ips) {
-         this.ips = ips;
-         return this;
-      }
+      public abstract Builder ips(List<String> ips);
+
+      abstract IpBlock autoBuild();
 
       public IpBlock build() {
-         return IpBlock.create(id, location, publicIps, ips);
-      }
+         IpBlock ipBlock = autoBuild();
+         checkIps(ipBlock.ips());
 
-      public Builder fromIpBlock(IpBlock in) {
-         return this.id(in.id()).location(in.location()).publicIps(in.publicIps()).ips(in.ips());
+         return ipBlock.toBuilder()
+                 .publicIps(ImmutableList.copyOf(ipBlock.publicIps()))
+                 .ips(ImmutableList.copyOf(ipBlock.ips()))
+                 .autoBuild();
       }
-
    }
 
    @AutoValue
@@ -85,41 +78,26 @@ public abstract class IpBlock {
       @Nullable
       public abstract String nicId();
 
-      public static PublicIp create(String ip, String nicId) {
-         return new AutoValue_IpBlock_PublicIp(ip, nicId);
-      }
-
       public static Builder builder() {
-         return new Builder();
-      }
-
-      public Builder toBuilder() {
-         return builder().fromPublicIp(this);
+         return new AutoValue_IpBlock_PublicIp.Builder();
       }
 
-      public static final class Builder {
+      @AutoValue.Builder
+      public abstract static class Builder {
 
-         private String ip;
-         private String nicId;
+         public abstract Builder ip(String ip);
 
-         public Builder ip(String ip) {
-            this.ip = ip;
-            return this;
-         }
+         public abstract Builder nicId(String nicId);
 
-         public Builder nicId(String nicId) {
-            this.nicId = nicId;
-            return this;
-         }
+         abstract PublicIp autoBuild();
 
          public PublicIp build() {
-            return PublicIp.create(ip, nicId);
-         }
+            PublicIp publicIp = autoBuild();
+            checkIp(publicIp.ip());
 
-         public Builder fromPublicIp(PublicIp in) {
-            return this.ip(in.ip()).nicId(in.nicId());
+            return publicIp;
          }
       }
-   }
 
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
index 843999d..863890b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
@@ -16,16 +16,17 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import static org.jclouds.profitbricks.util.Preconditions.checkIp;
+import static org.jclouds.profitbricks.util.Preconditions.checkLanId;
+
+import java.util.Date;
+import java.util.List;
+
 import com.google.auto.value.AutoValue;
 import com.google.common.base.Enums;
-import static com.google.common.base.Preconditions.checkArgument;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import static com.google.common.net.InetAddresses.isInetAddress;
-import org.jclouds.javax.annotation.Nullable;
 
-import java.util.Date;
-import java.util.List;
+import org.jclouds.javax.annotation.Nullable;
 
 @AutoValue
 public abstract class LoadBalancer {
@@ -59,7 +60,7 @@ public abstract class LoadBalancer {
    public abstract String ip();
 
    @Nullable
-   public abstract String lanId();
+   public abstract Integer lanId();
 
    @Nullable
    public abstract ProvisioningState state();
@@ -76,141 +77,76 @@ public abstract class LoadBalancer {
    @Nullable
    public abstract List<Firewall> firewalls();
 
-   public static LoadBalancer create(String id, String name, Algorithm algorithm, DataCenter dataCenter,
-           boolean internetAccess, String ip, String lanId, ProvisioningState state, Date creationTime,
-           Date lastModificationTime, List<Server> balancedServers, List<Firewall> firewalls) {
-      return new AutoValue_LoadBalancer(id, name, algorithm, dataCenter,
-              internetAccess, ip, lanId, state, creationTime, lastModificationTime,
-              balancedServers != null ? ImmutableList.copyOf(balancedServers) : ImmutableList.<Server>of(),
-              firewalls != null ? ImmutableList.copyOf(firewalls) : ImmutableList.<Firewall>of());
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_LoadBalancer.Builder()
+              .balancedServers(ImmutableList.<Server>of())
+              .firewalls(ImmutableList.<Firewall>of());
    }
 
-   private static void checkIp(String ip) {
-      if (ip != null)
-         checkArgument(isInetAddress(ip), "Invalid IP");
-   }
-
-   public static class Builder {
-
-      private String id;
-
-      private String name;
-
-      private Algorithm algorithm;
-
-      private DataCenter dataCenter;
-
-      private boolean internetAccess;
-
-      private String ip;
-
-      private String lanId;
-
-      private ProvisioningState state;
+   public abstract Builder toBuilder();
 
-      private Date creationTime;
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      private Date lastModificationTime;
+      public abstract Builder id(String id);
 
-      public List<Server> balancedServers;
+      public abstract Builder name(String name);
 
-      private List<Firewall> firewalls;
+      public abstract Builder algorithm(Algorithm algorithm);
 
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
-
-      public Builder name(String name) {
-         this.name = name;
-         return this;
-      }
-
-      public Builder algorithm(Algorithm algorithm) {
-         this.algorithm = algorithm;
-         return this;
-      }
+      public abstract Builder dataCenter(DataCenter dataCenter);
 
-      public Builder dataCenter(DataCenter dataCenter) {
-         this.dataCenter = dataCenter;
-         return this;
-      }
+      public abstract Builder internetAccess(Boolean internetAccess);
 
-      public Builder internetAccess(boolean internetAccess) {
-         this.internetAccess = internetAccess;
-         return this;
-      }
+      public abstract Builder ip(String ip);
 
-      public Builder ip(String ip) {
-         this.ip = ip;
-         return this;
-      }
+      public abstract Builder lanId(Integer lanId);
 
-      public Builder lanId(String lanId) {
-         this.lanId = lanId;
-         return this;
-      }
+      public abstract Builder creationTime(Date creationTime);
 
-      public Builder creationTime(Date creationTime) {
-         this.creationTime = creationTime;
-         return this;
-      }
+      public abstract Builder state(ProvisioningState state);
 
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
+      public abstract Builder lastModificationTime(Date lastModificationTime);
 
-      public Builder lastModificationTime(Date lastModificationTime) {
-         this.lastModificationTime = lastModificationTime;
-         return this;
-      }
+      public abstract Builder balancedServers(List<Server> balancedServers);
 
-      public Builder balancedServers(List<Server> balancedServers) {
-         this.balancedServers = balancedServers;
-         return this;
-      }
+      public abstract Builder firewalls(List<Firewall> firewalls);
 
-      public Builder firewalls(List<Firewall> firewalls) {
-         this.firewalls = firewalls;
-         return this;
-      }
+      abstract LoadBalancer autoBuild();
 
       public LoadBalancer build() {
-         checkIp(ip);
-         return LoadBalancer.create(id, name, algorithm, dataCenter, internetAccess,
-                 ip, lanId, state, creationTime, lastModificationTime, balancedServers, firewalls);
-      }
-
-      public Builder fromLoadBalancer(LoadBalancer in) {
-         return this.id(in.id()).name(in.name()).algorithm(in.algorithm())
-                 .dataCenter(in.dataCenter()).internetAccess(in.internetAccess())
-                 .ip(in.ip()).lanId(in.lanId()).state(in.state()).creationTime(in.creationTime())
-                 .lastModificationTime(in.lastModificationTime()).balancedServers(in.balancedServers())
-                 .firewalls(in.firewalls());
+         LoadBalancer loadBalancer = autoBuild();
+         if (loadBalancer.ip() != null)
+            checkIp(loadBalancer.ip());
+         if (loadBalancer.lanId() != null)
+            checkLanId(loadBalancer.lanId());
+
+         return loadBalancer.toBuilder()
+                 .balancedServers(ImmutableList.copyOf(loadBalancer.balancedServers()))
+                 .firewalls(ImmutableList.copyOf(loadBalancer.firewalls()))
+                 .autoBuild();
       }
    }
 
    public static final class Request {
 
       public static CreatePayload.Builder creatingBuilder() {
-         return new CreatePayload.Builder();
+         return new AutoValue_LoadBalancer_Request_CreatePayload.Builder()
+                 .serverIds(ImmutableList.<String>of())
+                 .algorithm(Algorithm.ROUND_ROBIN);
       }
 
       public static UpdatePayload.Builder updatingBuilder() {
-         return new UpdatePayload.Builder();
+         return new AutoValue_LoadBalancer_Request_UpdatePayload.Builder()
+                 .algorithm(Algorithm.ROUND_ROBIN);
       }
 
-      public static RegisterPayload.Builder registerBuilder() {
-         return new RegisterPayload.Builder();
+      public static RegisterPayload createRegisteringPaylod(String loadBalancerId, List<String> serverIds) {
+         return new AutoValue_LoadBalancer_Request_RegisterPayload(loadBalancerId, ImmutableList.copyOf(serverIds));
       }
 
-      public static DeregisterPayload.Builder deregisterBuilder() {
-         return new DeregisterPayload.Builder();
+      public static DeregisterPayload createDeregisteringPayload(String loadBalancerId, List<String> serverIds) {
+         return new AutoValue_LoadBalancer_Request_DeregisterPayload(loadBalancerId, ImmutableList.copyOf(serverIds));
       }
 
       @AutoValue
@@ -218,63 +154,48 @@ public abstract class LoadBalancer {
 
          public abstract String dataCenterId();
 
-         public abstract String loadBalancerName();
+         @Nullable
+         public abstract String name();
 
-         public abstract Algorithm loadBalancerAlgorithm();
+         public abstract Algorithm algorithm();
 
+         @Nullable
          public abstract String ip();
 
-         public abstract String lanId();
+         @Nullable
+         public abstract Integer lanId();
 
          public abstract List<String> serverIds();
+         
+         public abstract Builder toBuilder();
 
-         public static CreatePayload create(String dataCenterId, String loadBalancerName, Algorithm loadBalancerAlgorithm, String ip, String lanId, List<String> serverIds) {
-            return new AutoValue_LoadBalancer_Request_CreatePayload(dataCenterId, loadBalancerName, loadBalancerAlgorithm, ip, lanId,
-                    serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList());
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder dataCenterId(String dataCenterId);
 
-            public String dataCenterId;
-            public String loadBalancerName;
-            public Algorithm loadBalancerAlgorithm;
-            public String ip;
-            public String lanId;
-            public List<String> serverIds;
+            public abstract Builder name(String name);
 
-            public Builder dataCenterId(String dataCenterId) {
-               this.dataCenterId = dataCenterId;
-               return this;
-            }
+            public abstract Builder algorithm(Algorithm algorithm);
 
-            public Builder loadBalancerName(String loadBalancerName) {
-               this.loadBalancerName = loadBalancerName;
-               return this;
-            }
+            public abstract Builder ip(String ip);
 
-            public Builder loadBalancerAlgorithm(Algorithm loadBalancerAlgorithm) {
-               this.loadBalancerAlgorithm = loadBalancerAlgorithm;
-               return this;
-            }
+            public abstract Builder lanId(Integer lanId);
 
-            public Builder ip(String ip) {
-               this.ip = ip;
-               return this;
-            }
+            public abstract Builder serverIds(List<String> serverIds);
 
-            public Builder lanId(String lanId) {
-               this.lanId = lanId;
-               return this;
-            }
-
-            public Builder serverIds(List<String> serverIds) {
-               this.serverIds = serverIds;
-               return this;
-            }
+            abstract CreatePayload autoBuild();
 
             public CreatePayload build() {
-               checkIp(ip);
-               return CreatePayload.create(dataCenterId, loadBalancerName, loadBalancerAlgorithm, ip, lanId, serverIds);
+               CreatePayload payload = autoBuild();
+               if (payload.ip() != null)
+                  checkIp(payload.ip());
+               if (payload.lanId() != null)
+                  checkLanId(payload.lanId());
+
+               return payload.toBuilder()
+                       .serverIds(ImmutableList.copyOf(payload.serverIds()))
+                       .autoBuild();
             }
          }
       }
@@ -282,67 +203,19 @@ public abstract class LoadBalancer {
       @AutoValue
       public abstract static class RegisterPayload {
 
-         public abstract List<String> serverIds();
-
          public abstract String id();
 
-         public static RegisterPayload create(List<String> serverIds, String id) {
-            return new AutoValue_LoadBalancer_Request_RegisterPayload(
-                    serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList(), id);
-         }
-
-         public static class Builder {
-
-            public List<String> serverIds;
-            public String id;
-
-            public Builder serverIds(List<String> serverIds) {
-               this.serverIds = serverIds;
-               return this;
-            }
-
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
+         public abstract List<String> serverIds();
 
-            public RegisterPayload build() {
-               return RegisterPayload.create(serverIds, id);
-            }
-         }
       }
 
       @AutoValue
       public abstract static class DeregisterPayload {
 
-         public abstract List<String> serverIds();
-
          public abstract String id();
 
-         public static DeregisterPayload create(List<String> serverIds, String id) {
-            return new AutoValue_LoadBalancer_Request_DeregisterPayload(
-                    serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList(), id);
-         }
-
-         public static class Builder {
-
-            public List<String> serverIds;
-            public String id;
-
-            public Builder serverIds(List<String> serverIds) {
-               this.serverIds = serverIds;
-               return this;
-            }
-
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
+         public abstract List<String> serverIds();
 
-            public DeregisterPayload build() {
-               return DeregisterPayload.create(serverIds, id);
-            }
-         }
       }
 
       @AutoValue
@@ -350,49 +223,33 @@ public abstract class LoadBalancer {
 
          public abstract String id();
 
+         @Nullable
          public abstract String name();
 
-         public abstract Algorithm loadBalancerAlgorithm();
+         public abstract Algorithm algorithm();
 
+         @Nullable
          public abstract String ip();
 
-         public static UpdatePayload create(String id, String name, Algorithm loadBalancerAlgorithm, String ip) {
-            return new AutoValue_LoadBalancer_Request_UpdatePayload(id, name, loadBalancerAlgorithm, ip);
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder id(String id);
 
-            public String id;
+            public abstract Builder name(String name);
 
-            public String name;
+            public abstract Builder algorithm(Algorithm algorithm);
 
-            public Algorithm loadBalancerAlgorithm;
+            public abstract Builder ip(String ip);
 
-            public String ip;
-
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
-
-            public Builder loadBalancerName(String loadBalancerName) {
-               this.name = loadBalancerName;
-               return this;
-            }
-
-            public Builder loadBalancerAlgorithm(Algorithm loadBalancerAlgorithm) {
-               this.loadBalancerAlgorithm = loadBalancerAlgorithm;
-               return this;
-            }
-
-            public Builder ip(String ip) {
-               this.ip = ip;
-               return this;
-            }
+            abstract UpdatePayload autoBuild();
 
             public UpdatePayload build() {
-               checkIp(ip);
-               return UpdatePayload.create(id, name, loadBalancerAlgorithm, ip);
+               UpdatePayload payload = autoBuild();
+               if (payload.ip() != null)
+                  checkIp(payload.ip());
+
+               return payload;
             }
          }
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
index 52acaf2..6102a42 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
@@ -16,6 +16,8 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import com.google.common.base.Enums;
+
 public enum Location {
 
    DE_FKB("de/fkb", "Germany, Karlsruhe"),
@@ -41,11 +43,7 @@ public enum Location {
    }
 
    public static Location fromValue(String v) {
-      try {
-         return valueOf(v);
-      } catch (IllegalArgumentException ex) {
-         return UNRECOGNIZED;
-      }
+      return Enums.getIfPresent(Location.class, v).or(UNRECOGNIZED);
    }
 
    public static Location fromId(String id) {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
index 0f7427c..a7e421d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
@@ -16,14 +16,15 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.net.InetAddresses.isInetAddress;
+import static org.jclouds.profitbricks.util.Preconditions.checkIp;
+import static org.jclouds.profitbricks.util.Preconditions.checkIps;
+import static org.jclouds.profitbricks.util.Preconditions.checkLanId;
+import static org.jclouds.profitbricks.util.Preconditions.checkMacAddress;
 
 import java.util.List;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
 
 import org.jclouds.javax.annotation.Nullable;
 
@@ -39,9 +40,11 @@ public abstract class Nic {
    @Nullable
    public abstract String dataCenterId();
 
-   public abstract int lanId();
+   @Nullable
+   public abstract Integer lanId();
 
-   public abstract boolean internetAccess();
+   @Nullable
+   public abstract Boolean internetAccess();
 
    @Nullable
    public abstract String serverId();
@@ -53,9 +56,10 @@ public abstract class Nic {
    public abstract String macAddress();
 
    @Nullable
-   public abstract Firewall firewalls();
+   public abstract Firewall firewall();
 
-   public abstract boolean dhcpActive();
+   @Nullable
+   public abstract Boolean dhcpActive();
 
    @Nullable
    public abstract String gatewayIp();
@@ -63,158 +67,81 @@ public abstract class Nic {
    @Nullable
    public abstract ProvisioningState state();
 
-   public static Nic create(String id, String name, String dataCenterId, int lanId, boolean internetAccess,
-           String serverId, List<String> ips, String macAddress, Firewall firewall, boolean dhcpActive,
-           String gatewayIp, ProvisioningState state) {
-      return new AutoValue_Nic(id, name, dataCenterId, lanId, internetAccess, serverId,
-              ips != null ? ImmutableList.copyOf(ips) : ImmutableList.<String>of(), macAddress,
-              firewall, dhcpActive, gatewayIp, state);
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_Nic.Builder()
+              .ips(ImmutableList.<String>of());
    }
 
-   public Builder toBuilder() {
-      return builder().fromNic(this);
-   }
-
-   private static void checkIp(String ip) {
-      if (ip != null)
-         checkArgument(isInetAddress(ip), "Invalid IP");
-   }
-
-   private static void checkIps(List<String> ips) {
-      for (String ip : ips)
-         checkIp(ip);
-   }
+   public abstract Builder toBuilder();
 
-   public static class Builder {
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      public String id;
+      public abstract Builder id(String id);
 
-      public String name;
+      public abstract Builder name(String name);
 
-      public String dataCenterId;
+      public abstract Builder dataCenterId(String dataCenterId);
 
-      public int lanId;
+      public abstract Builder lanId(Integer lanId);
 
-      public boolean internetAccess;
+      public abstract Builder internetAccess(Boolean internetAccess);
 
-      public String serverId;
+      public abstract Builder serverId(String serverId);
 
-      @Nullable
-      public List<String> ips;
+      public abstract Builder ips(List<String> ips);
 
-      public String macAddress;
+      public abstract Builder macAddress(String macAddress);
 
-      public Firewall firewall;
+      public abstract Builder firewall(Firewall firewall);
 
-      public boolean dhcpActive;
+      public abstract Builder dhcpActive(Boolean dhcpActive);
 
-      public String gatewayIp;
+      public abstract Builder gatewayIp(String gatewayIp);
 
-      public ProvisioningState state;
+      public abstract Builder state(ProvisioningState state);
 
-      public Builder() {
-         this.ips = Lists.newArrayList();
-      }
-
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
-
-      public Builder name(String name) {
-         this.name = name;
-         return this;
-      }
-
-      public Builder dataCenterId(String dataCenterId) {
-         this.dataCenterId = dataCenterId;
-         return this;
-      }
-
-      public Builder lanId(int lanId) {
-         this.lanId = lanId;
-         return this;
-      }
-
-      public Builder internetAccess(boolean internetAccess) {
-         this.internetAccess = internetAccess;
-         return this;
-      }
-
-      public Builder serverId(String serverId) {
-         this.serverId = serverId;
-         return this;
-      }
-
-      public Builder ips(List<String> ips) {
-         this.ips = ips;
-         return this;
-      }
-
-      public Builder ip(String ip) {
-         this.ips.add(ip);
-         return this;
-      }
-
-      public Builder macAddress(String macAddress) {
-         this.macAddress = macAddress;
-         return this;
-      }
-
-      public Builder dhcpActive(boolean dhcpActive) {
-         this.dhcpActive = dhcpActive;
-         return this;
-      }
-
-      public Builder gatewayIp(String gatewayIp) {
-         this.gatewayIp = gatewayIp;
-         return this;
-      }
-
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
-
-      public Builder firewall(Firewall firewall) {
-         this.firewall = firewall;
-         return this;
-      }
+      abstract Nic autoBuild();
 
       public Nic build() {
-         checkIps(ips);
-         return Nic.create(id, name, dataCenterId, lanId, internetAccess, serverId, ips,
-                 macAddress, firewall, dhcpActive, gatewayIp, state);
-      }
+         Nic nic = autoBuild();
+         if (nic.ips() != null)
+            checkIps(nic.ips());
+         if (nic.gatewayIp() != null)
+            checkIp(nic.gatewayIp());
+         if (nic.lanId() != null)
+            checkLanId(nic.lanId());
+         if (nic.macAddress() != null)
+            checkMacAddress(nic.macAddress());
 
-      private Builder fromNic(Nic in) {
-         return this.id(in.id()).name(in.name()).lanId(in.lanId()).internetAccess(in.internetAccess())
-                 .serverId(in.serverId()).ips(in.ips()).macAddress(in.macAddress()).dhcpActive(in.dhcpActive())
-                 .gatewayIp(in.gatewayIp()).dataCenterId(dataCenterId);
+         return nic.toBuilder()
+                 .ips(ImmutableList.copyOf(nic.ips()))
+                 .autoBuild();
       }
+
    }
 
    public static final class Request {
 
       public static CreatePayload.Builder creatingBuilder() {
-         return new CreatePayload.Builder();
+         return new AutoValue_Nic_Request_CreatePayload.Builder();
       }
 
       public static UpdatePayload.Builder updatingBuilder() {
-         return new UpdatePayload.Builder();
+         return new AutoValue_Nic_Request_UpdatePayload.Builder();
       }
 
       public static SetInternetAccessPayload.Builder setInternetAccessBuilder() {
-         return new SetInternetAccessPayload.Builder();
+         return new AutoValue_Nic_Request_SetInternetAccessPayload.Builder();
       }
 
       @AutoValue
       public abstract static class CreatePayload {
 
+         public abstract String serverId();
+
+         public abstract int lanId();
+
          @Nullable
          public abstract String ip();
 
@@ -224,54 +151,30 @@ public abstract class Nic {
          @Nullable
          public abstract Boolean dhcpActive();
 
-         public abstract String serverId();
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public abstract int lanId();
+            public abstract Builder serverId(String serverId);
 
-         public static CreatePayload create(String ip, String name, Boolean dhcpActive, String serverId, int lanId) {
-            return new AutoValue_Nic_Request_CreatePayload(ip, name, dhcpActive, serverId, lanId);
-         }
+            public abstract Builder lanId(int lanId);
 
-         public static class Builder {
+            public abstract Builder ip(String ip);
 
-            private String ip;
-            private String name;
-            private Boolean dhcpActive;
-            private String serverId;
-            private int lanId;
+            public abstract Builder name(String name);
 
-            public Builder ip(String ip) {
-               this.ip = ip;
-               return this;
-            }
+            public abstract Builder dhcpActive(Boolean dhcpActive);
 
-            public Builder name(String name) {
-               this.name = name;
-               return this;
-            }
-
-            public Builder dhcpActive(Boolean dhcpActive) {
-               this.dhcpActive = dhcpActive;
-               return this;
-            }
-
-            public Builder serverId(String serverId) {
-               this.serverId = serverId;
-               return this;
-            }
-
-            public Builder lanId(int lanId) {
-               this.lanId = lanId;
-               return this;
-            }
+            abstract CreatePayload autoBuild();
 
             public CreatePayload build() {
-               checkIp(ip);
-               return CreatePayload.create(ip, name, dhcpActive, serverId, lanId);
-            }
+               CreatePayload payload = autoBuild();
+               if (payload.ip() != null)
+                  checkIp(payload.ip());
+               checkLanId(payload.lanId());
 
+               return payload;
+            }
          }
-
       }
 
       @AutoValue
@@ -288,48 +191,32 @@ public abstract class Nic {
          @Nullable
          public abstract Boolean dhcpActive();
 
-         public abstract int lanId();
+         @Nullable
+         public abstract Integer lanId();
 
-         public static UpdatePayload create(String id, String ip, String name, Boolean dhcpActive, int lanId) {
-            return new AutoValue_Nic_Request_UpdatePayload(id, ip, name, dhcpActive, lanId);
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder id(String id);
 
-            private String id;
-            private String ip;
-            private String name;
-            private Boolean dhcpActive;
-            private int lanId;
+            public abstract Builder ip(String ip);
 
-            public Builder ip(String ip) {
-               this.ip = ip;
-               return this;
-            }
+            public abstract Builder name(String name);
 
-            public Builder name(String name) {
-               this.name = name;
-               return this;
-            }
-
-            public Builder dhcpActive(Boolean dhcpActive) {
-               this.dhcpActive = dhcpActive;
-               return this;
-            }
+            public abstract Builder dhcpActive(Boolean dhcpActive);
 
-            public Builder lanId(int lanId) {
-               this.lanId = lanId;
-               return this;
-            }
+            public abstract Builder lanId(Integer lanId);
 
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
+            abstract UpdatePayload autoBuild();
 
             public UpdatePayload build() {
-               checkIp(ip);
-               return UpdatePayload.create(id, ip, name, dhcpActive, lanId);
+               UpdatePayload payload = autoBuild();
+               if (payload.ip() != null)
+                  checkIp(payload.ip());
+               if (payload.lanId() != null)
+                  checkLanId(payload.lanId());
+
+               return payload;
             }
          }
       }
@@ -343,35 +230,19 @@ public abstract class Nic {
 
          public abstract boolean internetAccess();
 
-         public static SetInternetAccessPayload create(String dataCenterId, int lanId, boolean internetAccess) {
-            return new AutoValue_Nic_Request_SetInternetAccessPayload(dataCenterId, lanId, internetAccess);
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder dataCenterId(String dataCenterId);
 
-            public String dataCenterId;
-            public int lanId;
-            public boolean internetAccess;
+            public abstract Builder lanId(int lanId);
 
-            public Builder dataCenterId(String dataCenterId) {
-               this.dataCenterId = dataCenterId;
-               return this;
-            }
+            public abstract Builder internetAccess(boolean internetAccess);
 
-            public Builder lanId(int lanId) {
-               this.lanId = lanId;
-               return this;
-            }
+            public abstract SetInternetAccessPayload build();
 
-            public Builder internetAccess(boolean internetAccess) {
-               this.internetAccess = internetAccess;
-               return this;
-            }
-
-            public SetInternetAccessPayload build() {
-               return SetInternetAccessPayload.create(dataCenterId, lanId, internetAccess);
-            }
          }
       }
    }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
index c21f1c4..25bc70b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
@@ -16,15 +16,13 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import com.google.common.base.Enums;
+
 public enum OsType {
 
    WINDOWS, LINUX, OTHER, UNRECOGNIZED;
 
    public static OsType fromValue(String v) {
-      try {
-         return valueOf(v);
-      } catch (IllegalArgumentException ex) {
-         return UNRECOGNIZED;
-      }
+      return Enums.getIfPresent(OsType.class, v).or(UNRECOGNIZED);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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
new file mode 100644
index 0000000..101f154
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Provisionable.java
@@ -0,0 +1,25 @@
+/*
+ * 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;
+
+/**
+ * Marker interface for {@link org.jclouds.profitbricks.domain.Image} and 
+ * {@link org.jclouds.profitbricks.domain.Snapshot}
+ */
+public interface Provisionable {
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
index 833e979..d00342e 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
@@ -16,15 +16,13 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import com.google.common.base.Enums;
+
 public enum ProvisioningState {
 
    INACTIVE, INPROCESS, AVAILABLE, DELETED, ERROR, UNRECOGNIZED;
 
    public static ProvisioningState fromValue(String value) {
-      try {
-         return valueOf(value);
-      } catch (IllegalArgumentException e) {
-         return UNRECOGNIZED;
-      }
+      return Enums.getIfPresent(ProvisioningState.class, value).or(UNRECOGNIZED);
    }
 }


[21/35] jclouds git commit: Do not use AutoValue shaded imports

Posted by de...@apache.org.
Do not use AutoValue shaded imports


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

Branch: refs/heads/master
Commit: cd91e009edfda5aa362d52e38a883475a8085a28
Parents: 23f158f
Author: Ignasi Barrera <na...@apache.org>
Authored: Wed Jun 10 13:29:11 2015 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Wed Jun 10 13:29:11 2015 +0200

----------------------------------------------------------------------
 .../main/java/org/jclouds/profitbricks/domain/Firewall.java    | 2 +-
 .../src/main/java/org/jclouds/profitbricks/domain/Nic.java     | 4 ++--
 .../http/parser/firewall/FirewallListResponseHandler.java      | 3 +--
 .../http/parser/ipblock/IpBlockListResponseHandler.java        | 4 +++-
 .../parser/loadbalancer/LoadBalancerListResponseHandler.java   | 4 +++-
 .../profitbricks/http/parser/nic/NicListResponseHandler.java   | 4 +++-
 .../http/parser/storage/StorageListResponseHandler.java        | 4 +++-
 .../org/jclouds/profitbricks/features/DrivesApiLiveTest.java   | 6 +++++-
 .../org/jclouds/profitbricks/features/FirewallApiLiveTest.java | 3 +--
 9 files changed, 22 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/cd91e009/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
index 626a4b1..6a3d5fa 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
@@ -27,8 +27,8 @@ import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.profitbricks.domain.internal.FirewallRuleCommonProperties;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 
-import autovalue.shaded.com.google.common.common.collect.Lists;
 import static com.google.common.net.InetAddresses.isInetAddress;
 
 @AutoValue

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cd91e009/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
index fc0de67..f538d9b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
@@ -18,8 +18,6 @@ package org.jclouds.profitbricks.domain;
 
 import static com.google.common.base.Preconditions.checkArgument;
 
-import autovalue.shaded.com.google.common.common.collect.Lists;
-
 import com.google.auto.value.AutoValue;
 
 import java.util.List;
@@ -27,6 +25,8 @@ import java.util.List;
 import org.jclouds.javax.annotation.Nullable;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
 import static com.google.common.net.InetAddresses.isInetAddress;
 
 @AutoValue

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cd91e009/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
index e096148..b654801 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
@@ -16,8 +16,7 @@
  */
 package org.jclouds.profitbricks.http.parser.firewall;
 
-import autovalue.shaded.com.google.common.common.collect.Lists;
-
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cd91e009/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
index c56f0ea..6a0b419 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
@@ -16,9 +16,11 @@
  */
 package org.jclouds.profitbricks.http.parser.ipblock;
 
-import autovalue.shaded.com.google.common.common.collect.Lists;
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
+
 import java.util.List;
+
 import org.jclouds.profitbricks.domain.IpBlock;
 import org.jclouds.profitbricks.http.parser.publicip.PublicIpListResponseHandler;
 import org.xml.sax.SAXException;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cd91e009/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
index 4b31e8a..50c1bea 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
@@ -16,9 +16,11 @@
  */
 package org.jclouds.profitbricks.http.parser.loadbalancer;
 
-import autovalue.shaded.com.google.common.common.collect.Lists;
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
+
 import java.util.List;
+
 import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.jclouds.profitbricks.http.parser.firewall.FirewallListResponseHandler;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cd91e009/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
index 3d17c97..4a3ab66 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
@@ -16,12 +16,14 @@
  */
 package org.jclouds.profitbricks.http.parser.nic;
 
-import autovalue.shaded.com.google.common.common.collect.Lists;
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
+
 import org.jclouds.profitbricks.domain.Nic;
 import org.xml.sax.SAXException;
 
 import java.util.List;
+
 import org.jclouds.profitbricks.http.parser.firewall.FirewallResponseHandler;
 
 public class NicListResponseHandler extends BaseNicResponseHandler<List<Nic>> {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cd91e009/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
index d590c80..572f761 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
@@ -16,9 +16,11 @@
  */
 package org.jclouds.profitbricks.http.parser.storage;
 
-import autovalue.shaded.com.google.common.common.collect.Lists;
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
+
 import java.util.List;
+
 import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.Storage;
 import org.xml.sax.SAXException;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cd91e009/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
index aacc314..20cf5f8 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
@@ -16,16 +16,20 @@
  */
 package org.jclouds.profitbricks.features;
 
-import autovalue.shaded.com.google.common.common.collect.Iterables;
 import java.util.List;
+
 import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
 import org.jclouds.profitbricks.domain.Drive;
 import org.jclouds.profitbricks.domain.Image;
 import org.jclouds.profitbricks.domain.Server;
+
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
+
 import org.testng.annotations.Test;
 
+import com.google.common.collect.Iterables;
+
 @Test(groups = "live", testName = "DrivesApiLiveTest", singleThreaded = true)
 public class DrivesApiLiveTest extends BaseProfitBricksLiveTest {
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cd91e009/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
index 78e7dbd..cd38494 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.profitbricks.features;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
 import java.util.List;
@@ -41,8 +42,6 @@ import org.testng.annotations.Test;
 
 import com.google.common.base.Predicate;
 
-import autovalue.shaded.com.google.common.common.collect.ImmutableList;
-
 @Test(groups = "live", testName = "FirewallApiLiveTest", singleThreaded = true)
 public class FirewallApiLiveTest extends BaseProfitBricksLiveTest {
 


[19/35] jclouds git commit: JClouds Profitbricks provider - LoadBalancer API

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
new file mode 100644
index 0000000..cec0999
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.loadbalancer;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "LoadBalancerListResponseHandlerTest")
+public class LoadBalancerListResponseHandlerTest extends BaseResponseHandlerTest<List<LoadBalancer>> {
+
+   @Override
+   protected ParseSax<List<LoadBalancer>> createParser() {
+      return factory.create(injector.getInstance(LoadBalancerListResponseHandler.class));
+   }
+
+   protected DateCodecFactory createDateParser() {
+      return injector.getInstance(DateCodecFactory.class);
+   }
+
+   @Test
+   public void testParseResponseFromGetAllLoadbalancer() {
+      ParseSax<List<LoadBalancer>> parser = createParser();
+
+      List<LoadBalancer> actual = parser.parse(payloadFromResource("/loadbalancer/loadbalancers.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      DateCodec dateParser = createDateParser().iso8601();
+
+      List<LoadBalancer> expected = ImmutableList.<LoadBalancer>of(LoadBalancer.builder().id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee").loadBalancerAlgorithm(Algorithm.ROUND_ROBIN).name("load-1234567890-name")
+              .dataCenterId("datacenter-id").dataCenterVersion("datacenter-version").internetAccess(true).ip("192.168.0.1").lanId("lan-id").state(ProvisioningState.AVAILABLE).creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z")).lastModificationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+              .firewalls(ImmutableList.<Firewall>of(
+                              Firewall.builder().id("firewall-id").nicId("nic-id").active(false).state(ProvisioningState.AVAILABLE).build()
+                      ))
+              .balancedServers(ImmutableList.<Server>of(
+                              Server.builder().activate(true).balancedNicId("balanced-nic-id").id("server-id").name("server-name").build()
+                      )).build(),
+              LoadBalancer.builder().id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy").loadBalancerAlgorithm(Algorithm.ROUND_ROBIN).name("load-balancer-name")
+              .dataCenterId("datacenter-id").dataCenterVersion("datacenter-version").internetAccess(false).ip("192.168.0.1").lanId("lan-id").state(ProvisioningState.AVAILABLE).creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z")).lastModificationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+              .firewalls(ImmutableList.<Firewall>of(
+                              Firewall.builder().id("firewall-id").nicId("nic-id").active(false).state(ProvisioningState.AVAILABLE).build()
+                      ))
+              .balancedServers(ImmutableList.<Server>of(
+                              Server.builder().activate(false).balancedNicId("balanced-nic-id").id("server-id").name("server-name").build()
+                      ))
+              .build()
+      );
+      assertEquals(actual, expected);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
new file mode 100644
index 0000000..365383b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.loadbalancer;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "LoadBalancerResponseHandlerTest")
+public class LoadBalancerResponseHandlerTest extends BaseResponseHandlerTest<LoadBalancer> {
+
+   @Override
+   protected ParseSax<LoadBalancer> createParser() {
+      return factory.create(injector.getInstance(LoadBalancerResponseHandler.class));
+   }
+
+   protected DateCodecFactory createDateParser() {
+      return injector.getInstance(DateCodecFactory.class);
+   }
+
+   @Test
+   public void testParseResponseFromGetLoadbalancer() {
+      ParseSax<LoadBalancer> parser = createParser();
+
+      LoadBalancer actual = parser.parse(payloadFromResource("/loadbalancer/loadbalancer.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      DateCodec dateParser = createDateParser().iso8601();
+
+      List<Storage> emptyStorages = Lists.newArrayList();
+
+      List<Server> balancedServers = Lists.newArrayList();
+      balancedServers.add(Server.builder()
+              .activate(true)
+              .balancedNicId("balanced-nic-id")
+              .id("server-id")
+              .name("server-name")
+              .storages(emptyStorages)
+              .build());
+      List<Firewall> firewalls = Lists.newArrayList();
+      firewalls.add(Firewall.builder()
+              .id("firewall-id")
+              .nicId("nic-id")
+              .active(false)
+              .state(ProvisioningState.AVAILABLE)
+              .build());
+
+      LoadBalancer expected = LoadBalancer.builder()
+              .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+              .loadBalancerAlgorithm(Algorithm.ROUND_ROBIN)
+              .name("load-balancer-name")
+              .dataCenterId("datacenter-id")
+              .dataCenterVersion("datacenter-version")
+              .internetAccess(true)
+              .ip("192.168.0.1")
+              .lanId("lan-id")
+              .state(ProvisioningState.AVAILABLE)
+              .creationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
+              .lastModificationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
+              .firewalls(firewalls)
+              .balancedServers(balancedServers)
+              .build();
+
+      assertEquals(actual, expected);
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
index eb8feb9..88124e7 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
@@ -74,6 +74,8 @@ public class ServerInfoResponseHandlerTest extends BaseResponseHandlerTest<Serve
               .isNicHotUnPlug(true)
               .isDiscVirtioHotPlug(true)
               .isDiscVirtioHotUnPlug(true)
+              .activate(true)
+              .balancedNicId("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
               .storages(ImmutableList.<Storage>of(
                               Storage.builder()
                               .bootDevice(Boolean.TRUE)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
index 9f759cf..1442ba9 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
@@ -77,6 +77,8 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
               .isNicHotUnPlug(true)
               .isDiscVirtioHotPlug(true)
               .isDiscVirtioHotUnPlug(true)
+              .activate(true)
+              .balancedNicId("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
               .storages(ImmutableList.<Storage>of(
                               Storage.builder()
                               .bootDevice(Boolean.TRUE)
@@ -128,6 +130,8 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
               .isNicHotUnPlug(true)
               .isDiscVirtioHotPlug(true)
               .isDiscVirtioHotUnPlug(true)
+              .activate(true)
+              .balancedNicId("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
               .storages(ImmutableList.<Storage>of(
                               Storage.builder()
                               .bootDevice(Boolean.TRUE)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
new file mode 100644
index 0000000..14ad678
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
@@ -0,0 +1,17 @@
+<soapenv:Envelope
+  xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
+  xmlns:ws='http://ws.api.profitbricks.com/'>
+    <soapenv:Header />
+    <soapenv:Body>
+        <ws:createLoadBalancer>
+            <request>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <loadBalancerName>load-balancer-name</loadBalancerName>
+                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
+                <ip>192.168.0.1</ip>
+                <lanId>lan-id</lanId>
+                <serverIds>server-ids</serverIds>
+            </request>
+        </ws:createLoadBalancer>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
new file mode 100644
index 0000000..b699be6
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:deleteLoadBalancerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>datacenter-version</dataCenterVersion>
+      </return>
+    </ns2:deleteLoadBalancerResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
new file mode 100644
index 0000000..ee03c47
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
@@ -0,0 +1,14 @@
+<soapenv:Envelope
+  xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
+  xmlns:ws='http://ws.api.profitbricks.com/'>
+    <soapenv:Header />
+    <soapenv:Body>
+        <ws:deregisterServersOnLoadBalancer>
+			<request>
+                <serverIds>1</serverIds>
+                <serverIds>2</serverIds>
+                <loadBalancerId>load-balancer-id</loadBalancerId>
+			<request>
+        </ws:deregisterServersOnLoadBalancer>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
new file mode 100644
index 0000000..48a1ff1
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
@@ -0,0 +1,13 @@
+<soapenv:Envelope
+  xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
+  xmlns:ws='http://ws.api.profitbricks.com/'>
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:registerServersOnLoadBalancer>
+			<request>
+                <serverIds>1234</serverIds>
+                <loadBalancerId>load-balancer-id</loadBalancerId>
+			</request>
+        </ws:registerServersOnLoadBalancer>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
new file mode 100644
index 0000000..7a39dea
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
@@ -0,0 +1,15 @@
+<soapenv:Envelope
+  xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
+  xmlns:ws='http://ws.api.profitbricks.com/'>
+    <soapenv:Header />
+    <soapenv:Body>
+        <ws:updateLoadBalancer>
+            <request>
+                <loadBalancerId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</loadBalancerId>
+                <loadBalancerName>load-balancer-name</loadBalancerName>
+                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
+                <ip>192.168.0.1</ip>              
+            </request>
+        </ws:updateLoadBalancer>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
new file mode 100644
index 0000000..501e470
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getLoadBalancerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+                <loadBalancerId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</loadBalancerId>
+                <loadBalancerName>load-balancer-name</loadBalancerName>
+                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
+                <internetAccess>true</internetAccess>
+                <ip>192.168.0.1</ip>
+                <lanId>lan-id</lanId>
+                <balancedServers>
+                    <activate>true</activate>
+                    <balancedNicId>balanced-nic-id</balancedNicId>
+                    <serverId>server-id</serverId>
+                    <serverName>server-name</serverName>
+                </balancedServers>
+                <provisioningState>AVAILABLE</provisioningState>
+                <creationTime>2014-12-12T03:08:35.629Z</creationTime>
+                <lastModificationTime>2014-12-12T03:08:35.629Z</lastModificationTime>
+                <firewall>
+                    <active>false</active>
+                    <firewallId>firewall-id</firewallId>
+                    <nicId>nic-id</nicId>
+                    <provisioningState>AVAILABLE</provisioningState>
+                </firewall>
+            </return>
+        </ns2:getLoadBalancerResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
new file mode 100644
index 0000000..155a1e3
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getAllLoadBalancersResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+                <loadBalancerId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</loadBalancerId>
+                <loadBalancerName>load-1234567890-name</loadBalancerName>
+                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
+                <internetAccess>true</internetAccess>
+                <ip>192.168.0.1</ip>
+                <lanId>lan-id</lanId>
+                <balancedServers>
+                    <activate>true</activate>
+                    <balancedNicId>balanced-nic-id</balancedNicId>
+                    <serverId>server-id</serverId>
+                    <serverName>server-name</serverName>
+                </balancedServers>
+                <provisioningState>AVAILABLE</provisioningState>
+                <creationTime>2014-12-04T07:09:23.138Z</creationTime>
+                <lastModificationTime>2014-12-04T07:09:23.138Z</lastModificationTime>
+                <firewall>
+                    <active>false</active>
+                    <firewallId>firewall-id</firewallId>
+                    <nicId>nic-id</nicId>
+                    <provisioningState>AVAILABLE</provisioningState>
+                </firewall>
+            </return>
+            <return>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+                <loadBalancerId>qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy</loadBalancerId>
+                <loadBalancerName>load-balancer-name</loadBalancerName>
+                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
+                <internetAccess>false</internetAccess>
+                <ip>192.168.0.1</ip>
+                <lanId>lan-id</lanId>
+                <balancedServers>
+                    <activate>false</activate>
+                    <balancedNicId>balanced-nic-id</balancedNicId>
+                    <serverId>server-id</serverId>
+                    <serverName>server-name</serverName>
+                </balancedServers>
+                <provisioningState>AVAILABLE</provisioningState>
+                <creationTime>2014-12-04T07:09:23.138Z</creationTime>
+                <lastModificationTime>2014-12-04T07:09:23.138Z</lastModificationTime>
+                <firewall>
+                    <active>false</active>
+                    <firewallId>firewall-id</firewallId>
+                    <nicId>nic-id</nicId>
+                    <provisioningState>AVAILABLE</provisioningState>
+                </firewall>
+            </return>
+        </ns2:getAllLoadBalancersResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/resources/server/server.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server.xml b/providers/profitbricks/src/test/resources/server/server.xml
index 8fac75d..33fa824 100644
--- a/providers/profitbricks/src/test/resources/server/server.xml
+++ b/providers/profitbricks/src/test/resources/server/server.xml
@@ -12,6 +12,8 @@
                 <ram>4096</ram>
                 <internetAccess>true</internetAccess>
                 <ips>173.252.120.6</ips>
+				<balancedNicId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</balancedNicId>
+				<activate>true</activate>
                 <connectedStorages>
                     <bootDevice>true</bootDevice>
                     <busType>VIRTIO</busType>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/resources/server/servers.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/servers.xml b/providers/profitbricks/src/test/resources/server/servers.xml
index 5da090f..d38bc67 100644
--- a/providers/profitbricks/src/test/resources/server/servers.xml
+++ b/providers/profitbricks/src/test/resources/server/servers.xml
@@ -11,6 +11,8 @@
                 <ram>4096</ram>
                 <internetAccess>true</internetAccess>
                 <ips>173.252.120.6</ips>
+                <balancedNicId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</balancedNicId>
+                <activate>true</activate>
                 <connectedStorages>
                     <bootDevice>true</bootDevice>
                     <busType>VIRTIO</busType>
@@ -60,6 +62,8 @@
                 <ram>1024</ram>
                 <internetAccess>false</internetAccess>
                 <ips>202.69.181.241</ips>
+                <balancedNicId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</balancedNicId>
+                <activate>true</activate>
                 <connectedStorages>
                     <bootDevice>true</bootDevice>
                     <busType>VIRTIO</busType>


[28/35] jclouds git commit: JCLOUDS-951: Remove inheritance in ProfitBrick's AutoValue classes

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
index 027e016..a36112d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
@@ -16,24 +16,20 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import org.jclouds.profitbricks.domain.internal.ServerCommonProperties;
-
-import com.google.auto.value.AutoValue;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.profitbricks.util.Preconditions.checkCores;
+import static org.jclouds.profitbricks.util.Preconditions.checkRam;
 
 import java.util.Date;
 import java.util.List;
 
-import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.profitbricks.domain.internal.HotPluggable;
-
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Enums;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
+
+import org.jclouds.javax.annotation.Nullable;
 
 @AutoValue
-public abstract class Server implements ServerCommonProperties {
+public abstract class Server {
 
    public enum Status {
 
@@ -44,11 +40,7 @@ public abstract class Server implements ServerCommonProperties {
       }
 
       public static Status fromValue(String v) {
-         try {
-            return valueOf(v);
-         } catch (IllegalArgumentException ex) {
-            return UNRECOGNIZED;
-         }
+         return Enums.getIfPresent(Status.class, v).or(UNRECOGNIZED);
       }
    }
 
@@ -59,10 +51,15 @@ public abstract class Server implements ServerCommonProperties {
    public abstract String id();
 
    @Nullable
-   @Override
    public abstract String name();
 
    @Nullable
+   public abstract Integer cores();
+
+   @Nullable
+   public abstract Integer ram();
+
+   @Nullable
    public abstract Boolean hasInternetAccess();
 
    @Nullable
@@ -96,178 +93,129 @@ public abstract class Server implements ServerCommonProperties {
    public abstract Boolean loadBalanced();
 
    @Nullable
+   public abstract Boolean isCpuHotPlug();
+
+   @Nullable
+   public abstract Boolean isCpuHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isRamHotPlug();
+
+   @Nullable
+   public abstract Boolean isRamHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isNicHotPlug();
+
+   @Nullable
+   public abstract Boolean isNicHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isDiscVirtioHotPlug();
+
+   @Nullable
+   public abstract Boolean isDiscVirtioHotUnPlug();
+
+   @Nullable
    public abstract String hostname(); // Non-profitbricks property; Added to hold hostname parsed from image temporarily
 
-   public static Server create(DataCenter dataCenter, String id, String name, int cores, int ram,
-           Boolean hasInternetAccess, ProvisioningState state, Status status, OsType osType,
-           AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime, List<Storage> storages,
-           List<Nic> nics, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug,
-           Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug, String balancedNicId, Boolean loadBalanced,
-           String hostname) {
-      return new AutoValue_Server(isCpuHotPlug, null, isRamHotPlug, null, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
-              isDiscVirtioHotUnPlug, cores, ram, dataCenter, id, name, hasInternetAccess, state, status, osType,
-              availabilityZone, creationTime, lastModificationTime,
-              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList(),
-              nics != null ? ImmutableList.copyOf(nics) : Lists.<Nic>newArrayList(),
-              balancedNicId, loadBalanced, hostname);
+   public static Builder builder() {
+      return new AutoValue_Server.Builder()
+              .storages(ImmutableList.<Storage>of())
+              .nics(ImmutableList.<Nic>of());
    }
 
-   public static DescribingBuilder builder() {
-      return new DescribingBuilder();
-   }
+   public abstract Builder toBuilder();
 
-   public DescribingBuilder toBuilder() {
-      return builder().fromServer(this);
-   }
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-   public abstract static class Builder<B extends Builder, D extends ServerCommonProperties> extends HotPluggable.Builder<B, D> {
+      public abstract Builder dataCenter(DataCenter dataCenter);
 
-      protected String name;
-      protected int cores;
-      protected int ram;
+      public abstract Builder id(String id);
 
-      public B name(String name) {
-         this.name = name;
-         return self();
-      }
+      public abstract Builder name(String name);
 
-      public B cores(int cores) {
-         this.cores = cores;
-         return self();
-      }
+      public abstract Builder cores(Integer cores);
 
-      public B ram(int ram) {
-         this.ram = ram;
-         return self();
-      }
-   }
+      public abstract Builder ram(Integer ram);
 
-   public static class DescribingBuilder extends Builder<DescribingBuilder, Server> {
-
-      private DataCenter dataCenter;
-      private String id;
-      private ProvisioningState state;
-      private Status status;
-      private OsType osType;
-      private AvailabilityZone zone;
-      private Date creationTime;
-      private Date lastModificationTime;
-      private Boolean hasInternetAccess;
-      private List<Storage> storages;
-      private List<Nic> nics;
-      private Boolean loadBalanced;
-      private String balancedNicId;
-      private String hostname;
-
-      public DescribingBuilder dataCenter(DataCenter dataCenter) {
-         this.dataCenter = dataCenter;
-         return this;
-      }
+      public abstract Builder hasInternetAccess(Boolean internetAccess);
 
-      public DescribingBuilder id(String id) {
-         this.id = id;
-         return this;
-      }
+      public abstract Builder state(ProvisioningState state);
 
-      public DescribingBuilder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
+      public abstract Builder status(Status status);
 
-      public DescribingBuilder status(Status status) {
-         this.status = status;
-         return this;
-      }
+      public abstract Builder osType(OsType osType);
 
-      public DescribingBuilder osType(OsType osType) {
-         this.osType = osType;
-         return this;
-      }
+      public abstract Builder availabilityZone(AvailabilityZone availabilityZone);
 
-      public DescribingBuilder availabilityZone(AvailabilityZone zone) {
-         this.zone = zone;
-         return this;
-      }
+      public abstract Builder creationTime(Date creationTime);
 
-      public DescribingBuilder creationTime(Date creationTime) {
-         this.creationTime = creationTime;
-         return this;
-      }
+      public abstract Builder lastModificationTime(Date lastModificationTime);
 
-      public DescribingBuilder lastModificationTime(Date lastModificationTime) {
-         this.lastModificationTime = lastModificationTime;
-         return this;
-      }
+      public abstract Builder storages(List<Storage> storages);
 
-      public DescribingBuilder hasInternetAccess(Boolean hasInternetAccess) {
-         this.hasInternetAccess = hasInternetAccess;
-         return this;
-      }
+      public abstract Builder nics(List<Nic> nics);
 
-      public DescribingBuilder storages(List<Storage> storages) {
-         this.storages = storages;
-         return this;
-      }
+      public abstract Builder balancedNicId(String balancedNicIds);
 
-      public DescribingBuilder nics(List<Nic> nics) {
-         this.nics = nics;
-         return this;
-      }
+      public abstract Builder loadBalanced(Boolean isLoadBalanced);
 
-      public DescribingBuilder balancedNicId(String balancedNicId) {
-         this.balancedNicId = balancedNicId;
-         return this;
-      }
+      public abstract Builder isCpuHotPlug(Boolean isCpuHotPlug);
 
-      public DescribingBuilder loadBalanced(Boolean loadBalanced) {
-         this.loadBalanced = loadBalanced;
-         return this;
-      }
+      public abstract Builder isCpuHotUnPlug(Boolean isCpuHotUnPlug);
 
-      public DescribingBuilder hostname(String hostname) {
-         this.hostname = hostname;
-         return this;
-      }
+      public abstract Builder isRamHotPlug(Boolean isRamHotPlug);
 
-      @Override
-      public Server build() {
-         return Server.create(dataCenter, id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
-                 lastModificationTime, storages, nics, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug,
-                 discVirtioHotPlug, discVirtioHotUnPlug, balancedNicId, loadBalanced, hostname);
-      }
+      public abstract Builder isRamHotUnPlug(Boolean isRamHotUnPlug);
 
-      private DescribingBuilder fromServer(Server in) {
-         return this.id(in.id()).cores(in.cores()).creationTime(in.creationTime()).hasInternetAccess(in.hasInternetAccess())
-                 .isCpuHotPlug(in.isCpuHotPlug()).isDiscVirtioHotPlug(in.isDiscVirtioHotPlug())
-                 .isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug()).isNicHotPlug(in.isNicHotPlug())
-                 .isNicHotUnPlug(in.isNicHotUnPlug()).isRamHotPlug(in.isRamHotPlug())
-                 .lastModificationTime(in.lastModificationTime()).name(in.name()).osType(in.osType()).ram(in.ram())
-                 .state(in.state()).status(in.status()).storages(in.storages()).nics(in.nics()).dataCenter(in.dataCenter())
-                 .balancedNicId(balancedNicId).loadBalanced(loadBalanced).hostname(hostname);
-      }
+      public abstract Builder isNicHotPlug(Boolean isNicHotPlug);
 
-      @Override
-      public DescribingBuilder self() {
-         return this;
-      }
+      public abstract Builder isNicHotUnPlug(Boolean isNicHotUnPlug);
+
+      public abstract Builder isDiscVirtioHotPlug(Boolean isDiscVirtioHotPlug);
 
+      public abstract Builder isDiscVirtioHotUnPlug(Boolean isDiscVirtioHotUnPlug);
+
+      public abstract Builder hostname(String hostname);
+
+      abstract Server autoBuild();
+
+      public Server build() {
+         Server server = autoBuild();
+         if (server.cores() != null)
+            checkCores(server.cores());
+         if (server.ram() != null)
+            checkRam(server.ram(), server.isRamHotUnPlug());
+         return server.toBuilder()
+                 .storages(ImmutableList.copyOf(server.storages()))
+                 .nics(ImmutableList.copyOf(server.nics()))
+                 .autoBuild();
+      }
    }
 
    public static final class Request {
 
       public static CreatePayload.Builder creatingBuilder() {
-         return new CreatePayload.Builder();
+         return new AutoValue_Server_Request_CreatePayload.Builder();
       }
 
       public static UpdatePayload.Builder updatingBuilder() {
-         return new UpdatePayload.Builder();
+         return new AutoValue_Server_Request_UpdatePayload.Builder();
       }
 
       @AutoValue
-      public abstract static class CreatePayload implements ServerCommonProperties {
+      public abstract static class CreatePayload {
+
+         public abstract int cores();
+
+         public abstract int ram();
 
          public abstract String dataCenterId();
 
+         public abstract String name();
+
          @Nullable
          public abstract String bootFromStorageId();
 
@@ -286,93 +234,94 @@ public abstract class Server implements ServerCommonProperties {
          @Nullable
          public abstract OsType osType();
 
-         public static CreatePayload create(String dataCenterId, String name, int core, int ram) {
-            return create(dataCenterId, name, core, ram, "", "", null, false, null, null, null, null, null, null, null, null);
-         }
+         @Nullable
+         public abstract Boolean isCpuHotPlug();
 
-         public static CreatePayload create(String dataCenterId, String name, int cores, int ram, String bootFromStorageId,
-                 String bootFromImageId, Integer lanId, Boolean hasInternetAccess, AvailabilityZone availabilityZone,
-                 OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug,
-                 Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
-            validateCores(cores);
-            validateRam(ram, isRamHotPlug);
-            return new AutoValue_Server_Request_CreatePayload(isCpuHotPlug, null, isRamHotPlug, null, isNicHotPlug,
-                    isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug, name, cores, ram, dataCenterId,
-                    bootFromStorageId, bootFromImageId, lanId, hasInternetAccess, availabilityZone, osType);
-         }
+         @Nullable
+         public abstract Boolean isCpuHotUnPlug();
 
-         public static class Builder extends Server.Builder<Builder, CreatePayload> {
+         @Nullable
+         public abstract Boolean isRamHotPlug();
 
-            private String dataCenterId;
-            private String bootFromStorageId;
-            private String bootFromImageId;
-            private Integer lanId;
-            private Boolean hasInternetAccess;
-            private AvailabilityZone availabilityZone;
-            private OsType osType;
+         @Nullable
+         public abstract Boolean isRamHotUnPlug();
 
-            public Builder dataCenterId(String dataCenterId) {
-               this.dataCenterId = dataCenterId;
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isNicHotPlug();
 
-            public Builder dataCenterId(DataCenter dataCenter) {
-               this.dataCenterId = checkNotNull(dataCenter, "Cannot pass null datacenter").id();
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isNicHotUnPlug();
 
-            public Builder bootFromStorageId(String storageId) {
-               this.bootFromStorageId = storageId;
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isDiscVirtioHotPlug();
 
-            public Builder bootFromImageId(String image) {
-               this.bootFromImageId = image;
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isDiscVirtioHotUnPlug();
 
-            public Builder lanId(Integer lanId) {
-               this.lanId = lanId;
-               return this;
-            }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-            public Builder availabilityZone(AvailabilityZone zone) {
-               this.availabilityZone = zone;
-               return this;
-            }
+            public abstract Builder cores(int cores);
 
-            public Builder osType(OsType osType) {
-               this.osType = osType;
-               return this;
-            }
+            public abstract Builder ram(int ram);
 
-            public Builder hasInternetAccess(Boolean hasInternetAccess) {
-               this.hasInternetAccess = hasInternetAccess;
-               return this;
-            }
+            public abstract Builder dataCenterId(String dataCenterId);
 
-            @Override
-            public Builder self() {
-               return this;
-            }
+            public abstract Builder name(String name);
+
+            public abstract Builder bootFromStorageId(String bootFromStorageId);
+
+            public abstract Builder bootFromImageId(String bootFromImageId);
+
+            public abstract Builder lanId(Integer lanId);
+
+            public abstract Builder hasInternetAccess(Boolean hasInternetAccess);
+
+            public abstract Builder availabilityZone(AvailabilityZone availabilityZone);
+
+            public abstract Builder osType(OsType osType);
+
+            public abstract Builder isCpuHotPlug(Boolean isCpuHotPlug);
+
+            public abstract Builder isCpuHotUnPlug(Boolean isCpuHotUnPlug);
+
+            public abstract Builder isRamHotPlug(Boolean isRamHotPlug);
+
+            public abstract Builder isRamHotUnPlug(Boolean isRamHotUnPlug);
+
+            public abstract Builder isNicHotPlug(Boolean isNicHotPlug);
+
+            public abstract Builder isNicHotUnPlug(Boolean isNicHotUnPlug);
+
+            public abstract Builder isDiscVirtioHotPlug(Boolean isDiscVirtioHotPlug);
+
+            public abstract Builder isDiscVirtioHotUnPlug(Boolean isDiscVirtioHotUnPlug);
+
+            abstract CreatePayload autoBuild();
 
-            @Override
             public CreatePayload build() {
-               return CreatePayload.create(dataCenterId, name, cores, ram, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
-                       availabilityZone, osType, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
+               CreatePayload payload = autoBuild();
+               checkCores(payload.cores());
+               checkRam(payload.ram(), payload.isRamHotUnPlug());
+               return payload;
             }
-
          }
+
       }
 
       @AutoValue
-      public abstract static class UpdatePayload implements ServerCommonProperties {
+      public abstract static class UpdatePayload {
+
+         public abstract String id();
 
          @Nullable
-         @Override
-         public abstract String name();
+         public abstract Integer cores();
 
-         public abstract String id();
+         @Nullable
+         public abstract Integer ram();
+
+         @Nullable
+         public abstract String name();
 
          @Nullable
          public abstract String bootFromStorageId();
@@ -386,71 +335,76 @@ public abstract class Server implements ServerCommonProperties {
          @Nullable
          public abstract OsType osType();
 
-         public static UpdatePayload create(String id, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
-                 AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug,
-                 Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
-            return new AutoValue_Server_Request_UpdatePayload(isCpuHotPlug, null, isRamHotPlug, null, isNicHotPlug,
-                    isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug, cores, ram, name, id, bootFromStorageId,
-                    bootFromImageId, availabilityZone, osType);
-         }
+         @Nullable
+         public abstract Boolean isCpuHotPlug();
 
-         public static class Builder extends Server.Builder<Builder, UpdatePayload> {
+         @Nullable
+         public abstract Boolean isCpuHotUnPlug();
 
-            private String id;
-            private String bootFromStorageId;
-            private String bootFromImageId;
-            private AvailabilityZone availabilityZone;
-            private OsType osType;
+         @Nullable
+         public abstract Boolean isRamHotPlug();
 
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isRamHotUnPlug();
 
-            public Builder bootFromStorageId(String storageId) {
-               this.bootFromStorageId = storageId;
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isNicHotPlug();
 
-            public Builder bootFromImageId(String image) {
-               this.bootFromImageId = image;
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isNicHotUnPlug();
 
-            public Builder availabilityZone(AvailabilityZone zone) {
-               this.availabilityZone = zone;
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isDiscVirtioHotPlug();
 
-            public Builder osType(OsType osType) {
-               this.osType = osType;
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isDiscVirtioHotUnPlug();
 
-            @Override
-            public Builder self() {
-               return this;
-            }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-            @Override
-            public UpdatePayload build() {
-               return UpdatePayload.create(id, name, cores, ram, bootFromStorageId, bootFromImageId, availabilityZone, osType,
-                       cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
+            public abstract Builder id(String id);
 
-            }
+            public abstract Builder cores(Integer cores);
 
-         }
-      }
+            public abstract Builder ram(Integer ram);
 
-   }
+            public abstract Builder name(String name);
 
-   private static void validateCores(int cores) {
-      checkArgument(cores > 0, "Core must be atleast 1.");
-   }
+            public abstract Builder bootFromStorageId(String bootFromStorageId);
+
+            public abstract Builder bootFromImageId(String bootFromImageId);
+
+            public abstract Builder availabilityZone(AvailabilityZone availabilityZone);
+
+            public abstract Builder osType(OsType osType);
+
+            public abstract Builder isCpuHotPlug(Boolean isCpuHotPlug);
+
+            public abstract Builder isCpuHotUnPlug(Boolean isCpuHotUnPlug);
+
+            public abstract Builder isRamHotPlug(Boolean isRamHotPlug);
+
+            public abstract Builder isRamHotUnPlug(Boolean isRamHotUnPlug);
 
-   private static void validateRam(int ram, Boolean isRamHotPlug) {
-      int minRam = (isRamHotPlug == null || !isRamHotPlug) ? 256 : 1024;
-      checkArgument(ram >= minRam && ram % 256 == 0, "RAM must be multiples of 256 with minimum of 256 MB (1024 MB if ramHotPlug is enabled)");
+            public abstract Builder isNicHotPlug(Boolean isNicHotPlug);
 
+            public abstract Builder isNicHotUnPlug(Boolean isNicHotUnPlug);
+
+            public abstract Builder isDiscVirtioHotPlug(Boolean isDiscVirtioHotPlug);
+
+            public abstract Builder isDiscVirtioHotUnPlug(Boolean isDiscVirtioHotUnPlug);
+
+            abstract UpdatePayload autoBuild();
+
+            public UpdatePayload build() {
+               UpdatePayload payload = autoBuild();
+               if (payload.cores() != null)
+                  checkCores(payload.cores());
+               if (payload.ram() != null)
+                  checkRam(payload.ram(), payload.isRamHotUnPlug());
+               return payload;
+            }
+         }
+      }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
index dac8f0b..bcf9774 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
@@ -17,6 +17,7 @@
 package org.jclouds.profitbricks.domain;
 
 import com.google.auto.value.AutoValue;
+import com.google.common.base.Enums;
 
 @AutoValue
 public abstract class ServiceFault {
@@ -36,11 +37,7 @@ public abstract class ServiceFault {
       UNRECOGNIZED;
 
       public static FaultCode fromValue(String v) {
-         try {
-            return valueOf(v);
-         } catch (IllegalArgumentException ex) {
-            return UNRECOGNIZED;
-         }
+         return Enums.getIfPresent(FaultCode.class, v).or(UNRECOGNIZED);
       }
    }
 
@@ -52,44 +49,22 @@ public abstract class ServiceFault {
 
    public abstract int requestId();
 
-   public static ServiceFault create(FaultCode faultCode, int httpCode, String message, int requestId) {
-      return new AutoValue_ServiceFault(faultCode, httpCode, message, requestId);
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_ServiceFault.Builder();
    }
 
-   public static final class Builder {
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      private FaultCode faultCode;
-      private int httpCode;
-      private String message;
-      private int requestId;
-
-      public Builder faultCode(FaultCode code) {
-         this.faultCode = code;
-         return this;
-      }
+      public abstract Builder faultCode(FaultCode faultCode);
 
-      public Builder httpCode(int httpCode) {
-         this.httpCode = httpCode;
-         return this;
-      }
+      public abstract Builder httpCode(int httpCode);
 
-      public Builder message(String message) {
-         this.message = message;
-         return this;
-      }
+      public abstract Builder message(String message);
 
-      public Builder requestId(int requestId) {
-         this.requestId = requestId;
-         return this;
-      }
+      public abstract Builder requestId(int requestId);
 
-      public ServiceFault build() {
-         return create(faultCode, httpCode, message, requestId);
-      }
+      public abstract ServiceFault build();
 
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
index 60738d0..7f0be59 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
@@ -16,36 +16,37 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import java.util.Date;
+
 import com.google.auto.value.AutoValue;
 
 import org.jclouds.javax.annotation.Nullable;
 
-import java.util.Date;
-
-import org.jclouds.profitbricks.domain.internal.HotPluggable;
-import org.jclouds.profitbricks.domain.internal.Provisionable;
-
 @AutoValue
 public abstract class Snapshot implements Provisionable {
 
    @Nullable
-   @Override
    public abstract String id();
 
    @Nullable
-   @Override
    public abstract String name();
 
-   public abstract boolean bootable();
+   @Nullable
+   public abstract Float size();
 
    @Nullable
-   public abstract String description();
+   public abstract Location location();
 
    @Nullable
-   @Override
    public abstract OsType osType();
 
    @Nullable
+   public abstract Boolean isBootable();
+
+   @Nullable
+   public abstract String description();
+
+   @Nullable
    public abstract Date creationTime();
 
    @Nullable
@@ -55,89 +56,89 @@ public abstract class Snapshot implements Provisionable {
    public abstract ProvisioningState state();
 
    @Nullable
-   @Override
-   public abstract Location location();
+   public abstract Boolean isCpuHotPlug();
 
-   public static Snapshot create(String id, String name, float size, boolean bootable, String description, OsType osType,
-           Boolean cpuHotPlug, Boolean cpuHotUnPlug, Boolean discVirtioHotPlug, Boolean discVirtioHotUnPlug,
-           Boolean ramHotPlug, Boolean ramHotUnPlug, Boolean nicHotPlug, Boolean nicHotUnPlug, Date creationTime,
-           Date lastModificationTime, ProvisioningState state, Location location) {
-      return new AutoValue_Snapshot(cpuHotPlug, cpuHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug, ramHotPlug,
-              ramHotUnPlug, nicHotPlug, nicHotUnPlug, size, id, name, bootable, description, osType, creationTime,
-              lastModificationTime, state, location);
-   }
+   @Nullable
+   public abstract Boolean isCpuHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isRamHotPlug();
+
+   @Nullable
+   public abstract Boolean isRamHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isNicHotPlug();
+
+   @Nullable
+   public abstract Boolean isNicHotUnPlug();
+
+   @Nullable
+   public abstract Boolean isDiscVirtioHotPlug();
+
+   @Nullable
+   public abstract Boolean isDiscVirtioHotUnPlug();
 
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_Snapshot.Builder();
    }
 
-   public static class Builder extends Provisionable.Builder<Builder, Snapshot> {
+   public abstract Builder toBuilder();
 
-      private Date creationTime;
-      private Date lastModificationTime;
-      private ProvisioningState state;
-      private boolean bootable;
-      private String description;
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      public Builder creationTime(Date creationTime) {
-         this.creationTime = creationTime;
-         return this;
-      }
+      public abstract Builder id(String id);
 
-      public Builder lastModificationTime(Date lastModificationTime) {
-         this.lastModificationTime = lastModificationTime;
-         return this;
-      }
+      public abstract Builder name(String name);
 
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
+      public abstract Builder size(Float size);
 
-      public Builder description(String description) {
-         this.description = description;
-         return this;
-      }
+      public abstract Builder location(Location location);
 
-      public Builder isBootable(boolean bootable) {
-         this.bootable = bootable;
-         return this;
-      }
+      public abstract Builder osType(OsType osType);
 
-      private Builder fromSnapshot(Snapshot in) {
-         return this.id(in.id()).name(in.name()).size(in.size()).creationTime(in.creationTime())
-                 .lastModificationTime(in.lastModificationTime()).state(in.state()).isBootable(in.bootable())
-                 .description(in.description()).isCpuHotPlug(in.isCpuHotPlug()).isCpuHotUnPlug(in.isCpuHotUnPlug())
-                 .isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
-                 .isRamHotPlug(in.isRamHotPlug()).isRamHotUnPlug(in.isRamHotUnPlug())
-                 .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug());
-      }
+      public abstract Builder isBootable(Boolean bootable);
 
-      @Override
-      public Snapshot build() {
-         return Snapshot.create(id, name, size, bootable, description, osType, cpuHotPlug, cpuHotUnPlug,
-                 discVirtioHotPlug, discVirtioHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug,
-                 creationTime, lastModificationTime, state, location);
-      }
+      public abstract Builder description(String description);
 
-      @Override
-      public Builder self() {
-         return this;
-      }
+      public abstract Builder creationTime(Date creationTime);
+
+      public abstract Builder lastModificationTime(Date lastModificationTime);
+
+      public abstract Builder state(ProvisioningState state);
+
+      public abstract Builder isCpuHotPlug(Boolean isCpuHotPlug);
+
+      public abstract Builder isCpuHotUnPlug(Boolean isCpuHotUnPlug);
+
+      public abstract Builder isRamHotPlug(Boolean isRamHotPlug);
+
+      public abstract Builder isRamHotUnPlug(Boolean isRamHotUnPlug);
+
+      public abstract Builder isNicHotPlug(Boolean isNicHotPlug);
+
+      public abstract Builder isNicHotUnPlug(Boolean isNicHotUnPlug);
+
+      public abstract Builder isDiscVirtioHotPlug(Boolean isDiscVirtioHotPlug);
+
+      public abstract Builder isDiscVirtioHotUnPlug(Boolean isDiscVirtioHotUnPlug);
+
+      public abstract Snapshot build();
    }
 
    public static final class Request {
 
       public static CreatePayload.Builder creatingBuilder() {
-         return new CreatePayload.Builder();
+         return new AutoValue_Snapshot_Request_CreatePayload.Builder();
       }
 
       public static UpdatePayload.Builder updatingBuilder() {
-         return new UpdatePayload.Builder();
+         return new AutoValue_Snapshot_Request_UpdatePayload.Builder();
       }
 
-      public static RollbackPayload.Builder rollbackBuilder() {
-         return new RollbackPayload.Builder();
+      public static RollbackPayload createRollbackPayload(String snapshotId, String storageId) {
+         return new AutoValue_Snapshot_Request_RollbackPayload(snapshotId, storageId);
       }
 
       @AutoValue
@@ -145,147 +146,106 @@ public abstract class Snapshot implements Provisionable {
 
          public abstract String storageId();
 
-         public abstract String description();
-
          public abstract String name();
 
-         public static CreatePayload create(String storageId, String description, String name) {
-            return new AutoValue_Snapshot_Request_CreatePayload(storageId, description, name);
-         }
-
-         public static class Builder {
+         @Nullable
+         public abstract String description();
 
-            private String storageId;
-            private String description;
-            private String name;
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-            public Builder storageId(String storageId) {
-               this.storageId = storageId;
-               return this;
-            }
+            public abstract Builder storageId(String storageId);
 
-            public Builder description(String description) {
-               this.description = description;
-               return this;
-            }
+            public abstract Builder name(String name);
 
-            public Builder name(String name) {
-               this.name = name;
-               return this;
-            }
+            public abstract Builder description(String description);
 
-            public CreatePayload build() {
-               return CreatePayload.create(storageId, description, name);
-            }
+            public abstract CreatePayload build();
          }
       }
 
       @AutoValue
-      public abstract static class UpdatePayload implements HotPluggable {
+      public abstract static class UpdatePayload {
 
-         public abstract String snapshotId();
+         public abstract String id();
 
+         @Nullable
          public abstract String description();
 
+         @Nullable
          public abstract String name();
 
-         public abstract boolean bootable();
+         @Nullable
+         public abstract Boolean bootable();
 
          @Nullable
          public abstract OsType osType();
 
-         public static UpdatePayload create(String snapshotId, String description, String name, boolean bootable,
-                 OsType osType, Boolean cpuHotplug, Boolean cpuHotunplug, Boolean ramHotplug, Boolean ramHotunplug,
-                 Boolean nicHotplug, Boolean nicHotunplug, Boolean discVirtioHotplug, Boolean discVirtioHotunplug) {
-            return new AutoValue_Snapshot_Request_UpdatePayload(
-                    cpuHotplug, cpuHotunplug, ramHotplug, ramHotunplug, nicHotplug, nicHotunplug, discVirtioHotplug,
-                    discVirtioHotunplug, snapshotId, description, name, bootable, osType);
-         }
+         @Nullable
+         public abstract Boolean isCpuHotPlug();
 
-         public static class Builder extends HotPluggable.Builder<Builder, UpdatePayload> {
+         @Nullable
+         public abstract Boolean isCpuHotUnPlug();
 
-            private String snapshotId;
+         @Nullable
+         public abstract Boolean isRamHotPlug();
 
-            @Nullable
-            private String description;
+         @Nullable
+         public abstract Boolean isRamHotUnPlug();
 
-            @Nullable
-            private String name;
+         @Nullable
+         public abstract Boolean isNicHotPlug();
 
-            private boolean bootable;
+         @Nullable
+         public abstract Boolean isNicHotUnPlug();
 
-            private OsType osType;
+         @Nullable
+         public abstract Boolean isDiscVirtioHotPlug();
 
-            public Builder snapshotId(String snapshotId) {
-               this.snapshotId = snapshotId;
-               return this;
-            }
+         @Nullable
+         public abstract Boolean isDiscVirtioHotUnPlug();
 
-            public Builder description(String description) {
-               this.description = description;
-               return this;
-            }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-            public Builder name(String name) {
-               this.name = name;
-               return this;
-            }
+            public abstract Builder id(String snapshotId);
 
-            public Builder bootable(boolean bootable) {
-               this.bootable = bootable;
-               return this;
-            }
+            public abstract Builder description(String description);
 
-            public Builder osType(OsType osType) {
-               this.osType = osType;
-               return this;
-            }
+            public abstract Builder name(String name);
 
-            @Override
-            public UpdatePayload build() {
-               return UpdatePayload.create(snapshotId, description, name, bootable, osType, cpuHotPlug, cpuHotUnPlug,
-                       ramHotPlug, ramHotUnPlug, nicHotUnPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
-            }
+            public abstract Builder bootable(Boolean bootable);
 
-            @Override
-            public Builder self() {
-               return this;
-            }
-         }
+            public abstract Builder osType(OsType osType);
 
-      }
+            public abstract Builder isCpuHotPlug(Boolean isCpuHotPlug);
 
-      @AutoValue
-      public abstract static class RollbackPayload {
+            public abstract Builder isCpuHotUnPlug(Boolean isCpuHotUnPlug);
 
-         public abstract String snapshotId();
+            public abstract Builder isRamHotPlug(Boolean isRamHotPlug);
 
-         public abstract String storageId();
+            public abstract Builder isRamHotUnPlug(Boolean isRamHotUnPlug);
 
-         public static RollbackPayload create(String snapshotId, String storageId) {
-            return new AutoValue_Snapshot_Request_RollbackPayload(snapshotId, storageId);
-         }
+            public abstract Builder isNicHotPlug(Boolean isNicHotPlug);
 
-         public static class Builder {
+            public abstract Builder isNicHotUnPlug(Boolean isNicHotUnPlug);
 
-            private String snapshotId;
+            public abstract Builder isDiscVirtioHotPlug(Boolean isDiscVirtioHotPlug);
 
-            private String storageId;
+            public abstract Builder isDiscVirtioHotUnPlug(Boolean isDiscVirtioHotUnPlug);
 
-            public Builder snapshotId(String snapshotId) {
-               this.snapshotId = snapshotId;
-               return this;
-            }
+            public abstract UpdatePayload build();
+         }
 
-            public Builder storageId(String storageId) {
-               this.storageId = storageId;
-               return this;
-            }
+      }
+
+      @AutoValue
+      public abstract static class RollbackPayload {
+
+         public abstract String snapshotId();
+
+         public abstract String storageId();
 
-            public RollbackPayload build() {
-               return RollbackPayload.create(snapshotId, storageId);
-            }
-         }
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
index 21664a5..6a0e8a9 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
@@ -16,19 +16,17 @@
  */
 package org.jclouds.profitbricks.domain;
 
-import com.google.auto.value.AutoValue;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.profitbricks.util.Preconditions.checkPassword;
+import static org.jclouds.profitbricks.util.Preconditions.checkSize;
 
 import java.util.Date;
 import java.util.List;
 
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Enums;
+import com.google.common.collect.ImmutableList;
 import org.jclouds.javax.annotation.Nullable;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import static org.jclouds.profitbricks.util.Passwords.isValidPassword;
 
 @AutoValue
 public abstract class Storage {
@@ -38,11 +36,7 @@ public abstract class Storage {
       IDE, SCSI, VIRTIO, UNRECOGNIZED;
 
       public static BusType fromValue(String value) {
-         try {
-            return valueOf(value);
-         } catch (IllegalArgumentException ex) {
-            return UNRECOGNIZED;
-         }
+         return Enums.getIfPresent(BusType.class, value).or(UNRECOGNIZED);
       }
    }
 
@@ -74,92 +68,43 @@ public abstract class Storage {
    @Nullable
    public abstract Integer deviceNumber();
 
-   public static Storage create(String id, String name, float size, Date creationTime, Date lastModificationTime,
-           ProvisioningState state, List<String> serverIds, Boolean bootDevice, BusType busType, Integer deviceNumber) {
-      return new AutoValue_Storage(id, name, size, creationTime, lastModificationTime, state,
-              serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList(),
-              bootDevice, busType, deviceNumber);
-   }
-
    public static Builder builder() {
-      return new Builder();
+      return new AutoValue_Storage.Builder()
+              .serverIds(ImmutableList.<String>of());
    }
 
-   public Builder toBuilder() {
-      return builder().fromStorage(this);
-   }
+   public abstract Builder toBuilder();
 
-   public static class Builder {
-
-      private String id;
-      private String name;
-      private float size;
-      private Date creationTime;
-      private Date lastModificationTime;
-      private ProvisioningState state;
-      private List<String> serverIds;
-      private Boolean bootDevice;
-      private BusType busType;
-      private Integer deviceNumber;
-
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
+   @AutoValue.Builder
+   public abstract static class Builder {
 
-      public Builder name(String name) {
-         this.name = name;
-         return this;
-      }
+      public abstract Builder id(String id);
 
-      public Builder size(float size) {
-         this.size = size;
-         return this;
-      }
+      public abstract Builder name(String name);
 
-      public Builder creationTime(Date creationTime) {
-         this.creationTime = creationTime;
-         return this;
-      }
+      public abstract Builder size(float size);
 
-      public Builder lastModificationTime(Date lastModificationTime) {
-         this.lastModificationTime = lastModificationTime;
-         return this;
-      }
+      public abstract Builder creationTime(Date creationTime);
 
-      public Builder state(ProvisioningState state) {
-         this.state = state;
-         return this;
-      }
+      public abstract Builder lastModificationTime(Date lastModificationTime);
 
-      public Builder serverIds(List<String> serverIds) {
-         this.serverIds = serverIds;
-         return this;
-      }
+      public abstract Builder state(ProvisioningState state);
 
-      public Builder bootDevice(Boolean bootDevice) {
-         this.bootDevice = bootDevice;
-         return this;
-      }
+      public abstract Builder serverIds(List<String> serverIds);
 
-      public Builder busType(BusType busType) {
-         this.busType = busType;
-         return this;
-      }
+      public abstract Builder bootDevice(Boolean bootDevice);
 
-      public Builder deviceNumber(Integer deviceNumber) {
-         this.deviceNumber = deviceNumber;
-         return this;
-      }
+      public abstract Builder busType(BusType busType);
 
-      private Builder fromStorage(Storage in) {
-         return this.id(in.id()).name(in.name()).size(in.size()).creationTime(in.creationTime())
-                 .lastModificationTime(in.lastModificationTime()).state(in.state()).serverIds(in.serverIds())
-                 .bootDevice(in.bootDevice()).busType(in.busType()).deviceNumber(in.deviceNumber());
-      }
+      public abstract Builder deviceNumber(Integer deviceNumber);
 
-      public Storage build() {
-         return Storage.create(id, name, size, creationTime, lastModificationTime, state, serverIds, bootDevice, busType, deviceNumber);
+      abstract Storage autoBuild();
+      
+      public Storage build(){
+         Storage built = autoBuild();
+         return built.toBuilder()
+                 .serverIds(ImmutableList.copyOf(built.serverIds()))
+                 .autoBuild();
       }
 
    }
@@ -167,15 +112,15 @@ public abstract class Storage {
    public static final class Request {
 
       public static CreatePayload.Builder creatingBuilder() {
-         return new CreatePayload.Builder();
+         return new AutoValue_Storage_Request_CreatePayload.Builder();
       }
 
       public static UpdatePayload.Builder updatingBuilder() {
-         return new UpdatePayload.Builder();
+         return new AutoValue_Storage_Request_UpdatePayload.Builder();
       }
 
       public static ConnectPayload.Builder connectingBuilder() {
-         return new ConnectPayload.Builder();
+         return new AutoValue_Storage_Request_ConnectPayload.Builder();
       }
 
       @AutoValue
@@ -192,57 +137,32 @@ public abstract class Storage {
          public abstract String mountImageId();
 
          @Nullable
-         public abstract String profitBricksImagePassword();
+         public abstract String imagePassword();
 
-         public static CreatePayload create(String dataCenterId, float size, String name, String mountImageId, String imagePassword) {
-            checkSize(size);
-            checkPassword(imagePassword);
-            return new AutoValue_Storage_Request_CreatePayload(dataCenterId, size, name, mountImageId, imagePassword);
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder dataCenterId(String dataCenterId);
 
-            private String dataCenterId;
-            private float size;
-            private String name;
-            private String mountImageId;
-            private String profitBricksImagePassword;
+            public abstract Builder size(float size);
 
-            public Builder dataCenterId(String dataCenterId) {
-               this.dataCenterId = dataCenterId;
-               return this;
-            }
+            public abstract Builder name(String name);
 
-            public Builder dataCenterId(DataCenter dataCenter) {
-               this.dataCenterId = checkNotNull(dataCenter, "Cannot pass null datacenter").id();
-               return this;
-            }
+            public abstract Builder mountImageId(String mountImageId);
 
-            public Builder size(float size) {
-               this.size = size;
-               return this;
-            }
+            public abstract Builder imagePassword(String profitBricksImagePassword);
 
-            public Builder mountImageId(String mountImageId) {
-               this.mountImageId = mountImageId;
-               return this;
-            }
-
-            public Builder name(String name) {
-               this.name = name;
-               return this;
-            }
-
-            public Builder imagePassword(String password) {
-               this.profitBricksImagePassword = password;
-               return this;
-            }
+            abstract CreatePayload autoBuild();
 
             public CreatePayload build() {
-               return CreatePayload.create(dataCenterId, size, name, mountImageId, profitBricksImagePassword);
+               CreatePayload payload = autoBuild();
+               if (payload.imagePassword() != null)
+                  checkPassword(payload.imagePassword());
+               checkSize(payload.size());
+
+               return payload;
             }
          }
-
       }
 
       @AutoValue
@@ -259,40 +179,25 @@ public abstract class Storage {
          @Nullable
          public abstract String mountImageId();
 
-         public static UpdatePayload create(String id, Float size, String name, String mountImageId) {
-            checkSize(size);
-            return new AutoValue_Storage_Request_UpdatePayload(id, size, name, mountImageId);
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder id(String id);
 
-            private String id;
-            private Float size;
-            private String name;
-            private String mountImageId;
+            public abstract Builder size(Float size);
 
-            public Builder id(String id) {
-               this.id = id;
-               return this;
-            }
+            public abstract Builder name(String name);
 
-            public Builder size(float size) {
-               this.size = size;
-               return this;
-            }
-
-            public Builder name(String name) {
-               this.name = name;
-               return this;
-            }
+            public abstract Builder mountImageId(String mountImageId);
 
-            public Builder mountImageId(String mountImageId) {
-               this.mountImageId = mountImageId;
-               return this;
-            }
+            abstract UpdatePayload autoBuild();
 
             public UpdatePayload build() {
-               return UpdatePayload.create(id, size, name, mountImageId);
+               UpdatePayload payload = autoBuild();
+               if (payload.size() != null)
+                  checkSize(payload.size());
+
+               return payload;
             }
          }
       }
@@ -310,54 +215,20 @@ public abstract class Storage {
          @Nullable
          public abstract Integer deviceNumber();
 
-         public static ConnectPayload create(String storageId, String serverId, BusType busType, Integer deviceNumber) {
-            return new AutoValue_Storage_Request_ConnectPayload(storageId, serverId, busType, deviceNumber);
-         }
+         @AutoValue.Builder
+         public abstract static class Builder {
 
-         public static class Builder {
+            public abstract Builder storageId(String storageId);
 
-            private String storageId;
-            private String serverId;
-            private BusType busType;
-            private Integer deviceNumber;
+            public abstract Builder serverId(String serverId);
 
-            public Builder storageId(String storageId) {
-               this.storageId = storageId;
-               return this;
-            }
-
-            public Builder serverId(String serverId) {
-               this.serverId = serverId;
-               return this;
-            }
-
-            public Builder busType(BusType busType) {
-               this.busType = busType;
-               return this;
-            }
-
-            public Builder deviceNumber(Integer deviceNumber) {
-               this.deviceNumber = deviceNumber;
-               return this;
-            }
+            public abstract Builder busType(BusType busType);
 
-            public ConnectPayload build() {
-               return ConnectPayload.create(storageId, serverId, busType, deviceNumber);
-            }
+            public abstract Builder deviceNumber(Integer deviceNumber);
 
+            public abstract ConnectPayload build();
          }
       }
 
-      private static void checkSize(Float size) {
-         if (size != null)
-            checkArgument(size > 1, "Storage size must be > 1GB");
-      }
-
-      private static void checkPassword(String password) {
-         if (password != null)
-            checkArgument(isValidPassword(password), "Password must be between 8 and 50 characters, "
-                    + "only a-z, A-Z, 0-9 without  characters i, I, l, o, O, w, W, y, Y, z, Z and 1, 0");
-      }
    }
-
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/BaseIpBlockResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/BaseIpBlockResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/BaseIpBlockResponseHandler.java
index a4af29f..50adfe4 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/BaseIpBlockResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/BaseIpBlockResponseHandler.java
@@ -16,8 +16,10 @@
  */
 package org.jclouds.profitbricks.http.parser.ipblock;
 
-import com.google.common.collect.Lists;
 import java.util.List;
+
+import com.google.common.collect.Lists;
+
 import org.jclouds.profitbricks.domain.IpBlock;
 import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
@@ -28,7 +30,6 @@ import org.xml.sax.SAXException;
 public abstract class BaseIpBlockResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
 
    protected final PublicIpListResponseHandler publicIpListResponseHandler;
-   protected final List<IpBlock.PublicIp> publicIps = Lists.newArrayList();
    protected List<String> ips;
 
    protected IpBlock.Builder builder;
@@ -37,7 +38,7 @@ public abstract class BaseIpBlockResponseHandler<T> extends BaseProfitBricksResp
    BaseIpBlockResponseHandler(PublicIpListResponseHandler publicIpListResponseHandler) {
       this.builder = IpBlock.builder();
       this.publicIpListResponseHandler = publicIpListResponseHandler;
-      ips = Lists.newArrayList();
+      this.ips = Lists.newArrayList();
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandler.java
index 307db14..95bc81a 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandler.java
@@ -41,8 +41,8 @@ public class IpBlockResponseHandler extends BaseIpBlockResponseHandler<IpBlock>
          setPropertyOnEndTag(qName);
          if ("return".equals(qName)) {
             done = true;
-            builder.publicIps(publicIpListResponseHandler.getResult());
-            builder.ips(ips);
+            builder.publicIps(publicIpListResponseHandler.getResult())
+                    .ips(ips);
          }
          clearTextBuffer();
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
index 96256bb..b796125 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
@@ -103,7 +103,7 @@ public abstract class BaseLoadBalancerResponseHandler<T> extends BaseProfitBrick
       else if ("ip".equals(qName))
          builder.ip(textToStringValue());
       else if ("lanId".equals(qName))
-         builder.lanId(textToStringValue());
+         builder.lanId(textToIntValue());
       else if ("provisioningState".equals(qName))
          builder.state(ProvisioningState.fromValue(textToStringValue()));
       else if ("creationTime".equals(qName))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/BaseNicResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/BaseNicResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/BaseNicResponseHandler.java
index 83efca3..0b4b537 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/BaseNicResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/BaseNicResponseHandler.java
@@ -16,6 +16,9 @@
  */
 package org.jclouds.profitbricks.http.parser.nic;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import com.google.inject.Inject;
 
 import org.jclouds.profitbricks.domain.Nic;
@@ -31,11 +34,13 @@ public abstract class BaseNicResponseHandler<T> extends BaseProfitBricksResponse
 
    protected boolean useFirewallParser = false;
    protected Nic.Builder builder;
+   protected List<String> ips;
 
    @Inject
    BaseNicResponseHandler(FirewallResponseHandler firewallResponseHandler) {
       this.builder = Nic.builder();
       this.firewallResponseHandler = firewallResponseHandler;
+      this.ips = new ArrayList<String>();
    }
 
    @Override
@@ -69,7 +74,7 @@ public abstract class BaseNicResponseHandler<T> extends BaseProfitBricksResponse
       else if ("serverId".equals(qName))
          builder.serverId(textToStringValue());
       else if ("ips".equals(qName))
-         builder.ip(textToStringValue());
+         ips.add(textToStringValue());
       else if ("macAddress".equals(qName))
          builder.macAddress(textToStringValue());
       else if ("dhcpActive".equals(qName))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
index 4a3ab66..87e7f43 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
@@ -16,6 +16,8 @@
  */
 package org.jclouds.profitbricks.http.parser.nic;
 
+import java.util.ArrayList;
+
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
@@ -44,9 +46,12 @@ public class NicListResponseHandler extends BaseNicResponseHandler<List<Nic>> {
          setPropertyOnEndTag(qName);
          if ("return".equals(qName) || "nics".equals(qName)) {
             nics.add(builder
+                    .ips(ips)
                     .firewall(firewallResponseHandler.getResult())
                     .build());
             builder = Nic.builder();
+            ips = new ArrayList<String>();
+            firewallResponseHandler.reset();
          }
          clearTextBuffer();
       }
@@ -57,6 +62,7 @@ public class NicListResponseHandler extends BaseNicResponseHandler<List<Nic>> {
 
    @Override
    public void reset() {
+      this.ips = new ArrayList<String>();
       this.nics = Lists.newArrayList();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandler.java
index 690ecc1..ec4dd10 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandler.java
@@ -16,7 +16,10 @@
  */
 package org.jclouds.profitbricks.http.parser.nic;
 
+import java.util.ArrayList;
+
 import com.google.inject.Inject;
+
 import org.jclouds.profitbricks.domain.Nic;
 import org.jclouds.profitbricks.http.parser.firewall.FirewallResponseHandler;
 import org.xml.sax.SAXException;
@@ -41,7 +44,9 @@ public class NicResponseHandler extends BaseNicResponseHandler<Nic> {
          setPropertyOnEndTag(qName);
          if ("return".equals(qName)) {
             done = true;
-            builder.firewall(firewallResponseHandler.getResult());
+            builder.ips(ips)
+                    .firewall(firewallResponseHandler.getResult());
+            ips = new ArrayList<String>();
             firewallResponseHandler.reset();
          }
          clearTextBuffer();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/PublicIpListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/PublicIpListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/PublicIpListResponseHandler.java
index c68e7e6..8b01be9 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/PublicIpListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/PublicIpListResponseHandler.java
@@ -33,8 +33,10 @@ public class PublicIpListResponseHandler extends BasePublicIpResponseHandler<Lis
    public void endElement(String uri, String localName, String qName) throws SAXException {
       setPropertyOnEndTag(qName);
 
-      if ("publicIps".equals(qName))
+      if ("publicIps".equals(qName)){
          publicIps.add(builder.build());
+         this.builder = PublicIp.builder();
+      }
       clearTextBuffer();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
index 37aabd5..2185aed 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
@@ -38,7 +38,7 @@ public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksRespo
    protected final NicListResponseHandler nicListResponseHandler;
 
    protected DataCenter.Builder dataCenterBuilder;
-   protected Server.DescribingBuilder builder;
+   protected Server.Builder builder;
 
    protected final DateService dateService;
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
index 24a5daa..d39fbad 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
@@ -49,7 +49,7 @@ public class ServerListResponseHandler extends BaseServerResponseHandler<List<Se
       else {
          setPropertyOnEndTag(qName);
          if ("return".equals(qName) || "servers".equals(qName) || "balancedServers".equals(qName)) {
-            Server.DescribingBuilder sdb = null;
+            Server.Builder sdb = null;
             try {
                sdb = builder
                        .storages(storageListResponseHandler.getResult())
@@ -58,7 +58,7 @@ public class ServerListResponseHandler extends BaseServerResponseHandler<List<Se
                        // For LoadBalancer's case, there's no DataCenter (may throw NPE on #build()). 
                        .dataCenter(dataCenterBuilder.build())
                        .build());
-            } catch (NullPointerException ex) {
+            } catch (Exception ex) {
                servers.add(sdb.build());
             }
             storageListResponseHandler.reset();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/Preconditions.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/Preconditions.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/Preconditions.java
new file mode 100644
index 0000000..b15689d
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/Preconditions.java
@@ -0,0 +1,100 @@
+/*
+ * 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.util;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Strings.isNullOrEmpty;
+import static com.google.common.net.InetAddresses.isInetAddress;
+import static org.jclouds.profitbricks.util.MacAddresses.isMacAddress;
+import static org.jclouds.profitbricks.util.Passwords.isValidPassword;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.Firewall.Protocol;
+
+/**
+ * Static convenience methods for validating various ProfitBricks domain preconditions
+ */
+public final class Preconditions {
+
+   private static final Pattern INVALID_CHARS = Pattern.compile("^.*[@/\\|'`’^].*$");
+
+   public static void checkInvalidChars(String name) {
+      checkArgument(!isNullOrEmpty(name), "Name is required.");
+      checkArgument(!INVALID_CHARS.matcher(name).matches(), "Name must not contain any of: @ / \\ | ' ` ’ ^");
+   }
+
+   public static void checkIp(String ip) {
+      checkArgument(isInetAddress(ip), "IP '%s' is invalid", ip);
+   }
+
+   public static void checkIps(List<String> ips) {
+      checkNotNull(ips, "Null ip list");
+      for (String ip : ips)
+         checkIp(ip);
+   }
+
+   public static void checkPortRange(Integer portRangeStart, Integer portRangeEnd, Firewall.Protocol protocol) {
+      checkArgument(!(portRangeEnd == null ^ portRangeStart == null), "Port range must be both present or null");
+      if (portRangeEnd != null) {
+         checkArgument(protocol == Firewall.Protocol.TCP || protocol == Firewall.Protocol.UDP, "Port range can only be set for TCP or UDP");
+         checkArgument(portRangeEnd > portRangeStart, "portRangeEnd must be greater than portRangeStart");
+         checkArgument(portRangeEnd >= 1 && portRangeEnd <= 65534, "Port range end must be 1 to 65534");
+         checkArgument(portRangeStart >= 1 && portRangeStart <= 65534, "Port range start must be 1 to 65534");
+      }
+   }
+
+   public static void checkMacAddress(String macAddress) {
+      checkArgument(isMacAddress(macAddress), "MAC must match pattern 'aa:bb:cc:dd:ee:ff'");
+   }
+
+   public static void checkIcmp(Integer icmpType, Integer icmpCode, Protocol protocol) {
+      checkNotNull(protocol, "Protocol can't be null");
+      if (protocol == Protocol.ICMP) {
+         if (icmpType != null)
+            checkArgument(icmpType >= 1 && icmpType <= 254, "ICMP type must be 1 to 254");
+         if (icmpCode != null)
+            checkArgument(icmpCode >= 1 && icmpCode <= 254, "ICMP code must be 1 to 254");
+      }
+   }
+
+   public static void checkLanId(Integer id) {
+      checkArgument(id >= 0, "LAN ID must be non-negative");
+   }
+
+   public static void checkCores(Integer cores) {
+      checkArgument(cores > 0, "Number of cores must be atleast 1.");
+   }
+
+   public static void checkRam(Integer ram, Boolean isRamHotPlug) {
+      int minRam = (isRamHotPlug == null || !isRamHotPlug) ? 256 : 1024;
+      checkArgument(ram >= minRam && ram % 256 == 0, "RAM must be multiples of 256 with minimum of 256 MB "
+              + "(1024 MB if ramHotPlug is enabled)");
+   }
+
+   public static void checkSize(Float size) {
+      checkArgument(size > 1, "Storage size must be > 1GB");
+   }
+
+   public static void checkPassword(String password) {
+      checkArgument(isValidPassword(password), "Password must be between 8 and 50 characters, "
+              + "only a-z, A-Z, 0-9 without  characters i, I, l, o, O, w, W, y, Y, z, Z and 1, 0");
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
index 6c4815f..5190d6f 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
@@ -30,7 +30,7 @@ public class CreateDataCenterRequestBinderTest {
    public void testCreatePayload() {
       CreateDataCenterRequestBinder binder = new CreateDataCenterRequestBinder();
 
-      DataCenter.Request.CreatePayload payload = DataCenter.Request.CreatePayload.create("JClouds-DC", Location.DE_FKB);
+      DataCenter.Request.CreatePayload payload = DataCenter.Request.creatingPayload("JClouds-DC", Location.DE_FKB);
 
       String actual = binder.createPayload(payload);
       assertNotNull(actual, "Binder returned null payload");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
index 3f989ce..589fc69 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinderTest.java
@@ -29,7 +29,7 @@ public class UpdateDataCenterRequestBinderTest {
    public void testCreatePayload() {
       UpdateDataCenterRequestBinder binder = new UpdateDataCenterRequestBinder();
 
-      DataCenter.Request.UpdatePayload payload = DataCenter.Request.UpdatePayload.create("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "Apache-DC");
+      DataCenter.Request.UpdatePayload payload = DataCenter.Request.updatingPayload("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "Apache-DC");
 
       String actual = binder.createPayload(payload);
       assertNotNull(actual, "Binder returned null payload");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinderTest.java
index 13fb7f1..134b62f 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinderTest.java
@@ -29,7 +29,7 @@ public class AddRomDriveToServerRequestBinderTest {
 
       Drive.Request.AddRomDriveToServerPayload payload = Drive.Request.AddRomDriveToServerPayload.builder()
               .serverId("server-id")
-              .storageId("image-id")
+              .imageId("image-id")
               .deviceNumber("device-number")
               .build();
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinderTest.java
index daedc36..0e074a6 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinderTest.java
@@ -21,7 +21,8 @@ import org.jclouds.profitbricks.domain.Firewall;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
-import org.jclouds.profitbricks.domain.Firewall.Protocol;
+import com.google.common.collect.ImmutableList;
+
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "AddFirewallRuleToNicRequestBinderTest")
@@ -31,18 +32,18 @@ public class AddFirewallRuleToNicRequestBinderTest {
    public void testCreatePayload() {
       AddFirewallRuleToNicRequestBinder binder = new AddFirewallRuleToNicRequestBinder();
 
-      Firewall.Request.AddRulePayload payload = Firewall.Request.ruleAddingBuilder()
-              .nicId("nic-id")
-              .newRule()
-              .name("name")
-              .portRangeEnd(45678)
-              .portRangeStart(12345)
-              .protocol(Protocol.TCP)
-              .sourceIp("192.168.0.1")
-              .sourceMac("aa:bb:cc:dd:ee:ff")
-              .targetIp("192.168.0.2")
-              .endRule()
-              .build();
+      Firewall.Request.AddRulePayload payload = Firewall.Request.createAddRulePayload(
+              "nic-id", ImmutableList.of(
+                      Firewall.Rule.builder()
+                      .name("name")
+                      .portRangeEnd(45678)
+                      .portRangeStart(12345)
+                      .protocol(Firewall.Protocol.TCP)
+                      .sourceIp("192.168.0.1")
+                      .sourceMac("aa:bb:cc:dd:ee:ff")
+                      .targetIp("192.168.0.2")
+                      .build()
+              ));
 
       String actual = binder.createPayload(payload);
       assertNotNull(actual, "Binder returned null payload");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinderTest.java
index f959be1..4744986 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinderTest.java
@@ -16,13 +16,17 @@
  */
 package org.jclouds.profitbricks.binder.loadbalancer;
 
-import com.google.common.collect.Lists;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
 import java.util.List;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.ImmutableList;
+
 import org.testng.annotations.Test;
 import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
 
 @Test(groups = "unit", testName = "CreateLoadBalancerRequestBinderTest")
 public class CreateLoadBalancerRequestBinderTest {
@@ -34,7 +38,16 @@ public class CreateLoadBalancerRequestBinderTest {
       List<String> serverIds = Lists.newArrayList();
       serverIds.add("server-ids");
 
-      String actual = binder.createPayload(LoadBalancer.Request.CreatePayload.create("datacenter-id", "load-balancer-name", Algorithm.ROUND_ROBIN, "-ip", "lan-id", serverIds));
+      String actual = binder.createPayload(
+              LoadBalancer.Request.creatingBuilder()
+              .dataCenterId("datacenter-id")
+              .name("load-balancer-name")
+              .algorithm(Algorithm.ROUND_ROBIN)
+              .ip("10.0.0.1")
+              .lanId(2)
+              .serverIds(ImmutableList.<String>of(
+                              "server-id-1", "server-id-2"))
+              .build());
 
       assertNotNull(actual, "Binder returned null payload");
       assertEquals(expectedPayload, actual);
@@ -46,9 +59,10 @@ public class CreateLoadBalancerRequestBinderTest {
            + "                <dataCenterId>datacenter-id</dataCenterId>\n"
            + "                <loadBalancerName>load-balancer-name</loadBalancerName>\n"
            + "                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>\n"
-           + "                <ip>-ip</ip>\n"
-           + "                <lanId>lan-id</lanId>\n"
-           + "                <serverIds>server-ids</serverIds>\n"
+           + "                <ip>10.0.0.1</ip>\n"
+           + "                <lanId>2</lanId>\n"
+           + "                <serverIds>server-id-1</serverIds>\n"
+           + "                <serverIds>server-id-2</serverIds>\n"
            + "            </request>\n"
            + "        </ws:createLoadBalancer>").replaceAll("\\s+", "");
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
index dbf0271..b1fa5c3 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
@@ -33,7 +33,7 @@ public class DeregisterLoadBalancerRequestBinderTest {
       serverIds.add("1");
       serverIds.add("2");
 
-      LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request.DeregisterPayload.create(serverIds, "load-balancer-id");
+      LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request.createDeregisteringPayload("load-balancer-id", serverIds);
 
       String actual = binder.createPayload(payload);
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
index 2bbf6fd..db42403 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
@@ -33,7 +33,7 @@ public class RegisterLoadBalancerRequestBinderTest {
       serverIds.add("1");
       serverIds.add("2");
 
-      LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request.RegisterPayload.create(serverIds, "load-balancer-id");
+      LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request.createRegisteringPaylod("load-balancer-id", serverIds);
 
       String actual = binder.createPayload(payload);
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinderTest.java
index 21c08d0..b638c89 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinderTest.java
@@ -16,11 +16,14 @@
  */
 package org.jclouds.profitbricks.binder.loadbalancer;
 
-import com.google.common.collect.Lists;
-import java.util.List;
-import org.jclouds.profitbricks.domain.LoadBalancer;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "UpdateLoadBalancerRequestBinderTest")
@@ -33,8 +36,12 @@ public class UpdateLoadBalancerRequestBinderTest {
       serverIds.add("1");
       serverIds.add("2");
 
-      LoadBalancer.Request.UpdatePayload payload = LoadBalancer.Request.UpdatePayload.create("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "load-balancer-name",
-              LoadBalancer.Algorithm.ROUND_ROBIN, "ip");
+      LoadBalancer.Request.UpdatePayload payload = LoadBalancer.Request.updatingBuilder()
+              .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+              .name("load-balancer-name")
+              .algorithm(LoadBalancer.Algorithm.ROUND_ROBIN)
+              .ip("10.0.0.2")
+              .build();
 
       String actual = binder.createPayload(payload);
 
@@ -48,7 +55,7 @@ public class UpdateLoadBalancerRequestBinderTest {
            + "                <loadBalancerId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</loadBalancerId>\n"
            + "                <loadBalancerName>load-balancer-name</loadBalancerName>\n"
            + "                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>\n"
-           + "                <ip>ip</ip>              \n"
+           + "                <ip>10.0.0.2</ip>              \n"
            + "            </request>\n"
            + "        </ws:updateLoadBalancer>").replaceAll("\\s+", "");
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
index 42a1ad9..8a9c581 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
@@ -29,7 +29,11 @@ public class CreateSnapshotRequestBinderTest {
    public void testCreatePayload() {
       CreateSnapshotRequestBinder binder = new CreateSnapshotRequestBinder();
 
-      Snapshot.Request.CreatePayload payload = Snapshot.Request.CreatePayload.create("123-1233-1324", "describingthesnapshot", "snapshotname");
+      Snapshot.Request.CreatePayload payload = Snapshot.Request.creatingBuilder()
+              .storageId("123-1233-1324")
+              .name("snapshot-name")
+              .description("describing-the-snapshot")
+              .build();
 
       String actual = binder.createPayload(payload);
       assertNotNull(actual, "Binder returned null payload");
@@ -40,8 +44,8 @@ public class CreateSnapshotRequestBinderTest {
            = ("      <ws:createSnapshot>\n"
            + "<request>\n"
            + "<storageId>123-1233-1324</storageId>\n"
-           + "<description>describing the snapshot</description>\n"
-           + "<snapshotName>snapshot name</snapshotName>\n"
+           + "<description>describing-the-snapshot</description>\n"
+           + "<snapshotName>snapshot-name</snapshotName>\n"
            + "</request>\n"
            + "</ws:createSnapshot>").replaceAll("\\s+", "");
 }


[22/35] jclouds git commit: JCLOUDS-702: JClouds ProfitBricks provider - ComputeServiceAdapter

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
index 365383b..079c5c0 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
@@ -17,9 +17,9 @@
 package org.jclouds.profitbricks.http.parser.loadbalancer;
 
 import com.google.common.collect.Lists;
+
 import java.util.List;
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.Firewall;
 import org.jclouds.profitbricks.domain.LoadBalancer;
@@ -28,8 +28,12 @@ import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.domain.Storage;
 import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.date.DateService;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "LoadBalancerResponseHandlerTest")
@@ -40,8 +44,8 @@ public class LoadBalancerResponseHandlerTest extends BaseResponseHandlerTest<Loa
       return factory.create(injector.getInstance(LoadBalancerResponseHandler.class));
    }
 
-   protected DateCodecFactory createDateParser() {
-      return injector.getInstance(DateCodecFactory.class);
+   protected DateService createDateParser() {
+      return injector.getInstance(DateService.class);
    }
 
    @Test
@@ -51,13 +55,13 @@ public class LoadBalancerResponseHandlerTest extends BaseResponseHandlerTest<Loa
       LoadBalancer actual = parser.parse(payloadFromResource("/loadbalancer/loadbalancer.xml"));
       assertNotNull(actual, "Parsed content returned null");
 
-      DateCodec dateParser = createDateParser().iso8601();
+      DateService dateParser = createDateParser();
 
       List<Storage> emptyStorages = Lists.newArrayList();
 
       List<Server> balancedServers = Lists.newArrayList();
       balancedServers.add(Server.builder()
-              .activate(true)
+              .loadBalanced(true)
               .balancedNicId("balanced-nic-id")
               .id("server-id")
               .name("server-name")
@@ -73,16 +77,18 @@ public class LoadBalancerResponseHandlerTest extends BaseResponseHandlerTest<Loa
 
       LoadBalancer expected = LoadBalancer.builder()
               .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
-              .loadBalancerAlgorithm(Algorithm.ROUND_ROBIN)
+              .algorithm(Algorithm.ROUND_ROBIN)
               .name("load-balancer-name")
-              .dataCenterId("datacenter-id")
-              .dataCenterVersion("datacenter-version")
+              .dataCenter(DataCenter.builder()
+                      .id("datacenter-id")
+                      .version(4)
+                      .build())
               .internetAccess(true)
               .ip("192.168.0.1")
               .lanId("lan-id")
               .state(ProvisioningState.AVAILABLE)
-              .creationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
-              .lastModificationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:08:35.629Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:08:35.629Z"))
               .firewalls(firewalls)
               .balancedServers(balancedServers)
               .build();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
index 88124e7..5e629b9 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
@@ -19,10 +19,10 @@ package org.jclouds.profitbricks.http.parser.server;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+import org.jclouds.date.DateService;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Firewall;
 import org.jclouds.profitbricks.domain.Nic;
 import org.jclouds.profitbricks.domain.OsType;
@@ -43,8 +43,8 @@ public class ServerInfoResponseHandlerTest extends BaseResponseHandlerTest<Serve
       return factory.create(injector.getInstance(ServerInfoResponseHandler.class));
    }
 
-   protected DateCodecFactory createDateParser() {
-      return injector.getInstance(DateCodecFactory.class);
+   protected DateService createDateParser() {
+      return injector.getInstance(DateService.class);
    }
 
    @Test
@@ -54,18 +54,22 @@ public class ServerInfoResponseHandlerTest extends BaseResponseHandlerTest<Serve
       Server actual = parser.parse(payloadFromResource("/server/server.xml"));
       assertNotNull(actual, "Parsed content returned null");
 
-      DateCodec dateParser = createDateParser().iso8601();
+      DateService dateParser = createDateParser();
 
       Server expected = Server.builder()
               .id("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+              .dataCenter(DataCenter.builder()
+                      .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+                      .version(10)
+                      .build())
               .name("facebook-node")
               .cores(4)
               .ram(4096)
               .hasInternetAccess(true)
               .state(ProvisioningState.AVAILABLE)
               .status(Server.Status.RUNNING)
-              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
-              .lastModificationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:08:35.629Z"))
               .osType(OsType.LINUX)
               .availabilityZone(AvailabilityZone.AUTO)
               .isCpuHotPlug(true)
@@ -74,7 +78,7 @@ public class ServerInfoResponseHandlerTest extends BaseResponseHandlerTest<Serve
               .isNicHotUnPlug(true)
               .isDiscVirtioHotPlug(true)
               .isDiscVirtioHotUnPlug(true)
-              .activate(true)
+              .loadBalanced(true)
               .balancedNicId("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
               .storages(ImmutableList.<Storage>of(
                               Storage.builder()

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
index 1442ba9..ea5d46d 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
@@ -20,8 +20,6 @@ import com.google.common.collect.ImmutableList;
 
 import java.util.List;
 
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
 import org.jclouds.profitbricks.domain.OsType;
@@ -32,6 +30,8 @@ import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
+import org.jclouds.date.DateService;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Firewall;
 import org.jclouds.profitbricks.domain.Nic;
 import org.jclouds.profitbricks.domain.Storage;
@@ -45,8 +45,8 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
       return factory.create(injector.getInstance(ServerListResponseHandler.class));
    }
 
-   protected DateCodecFactory createDateParser() {
-      return injector.getInstance(DateCodecFactory.class);
+   protected DateService createDateParser() {
+      return injector.getInstance(DateService.class);
    }
 
    @Test
@@ -56,10 +56,15 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
       List<Server> actual = parser.parse(payloadFromResource("/server/servers.xml"));
       assertNotNull(actual, "Parsed content returned null");
 
-      DateCodec dateParser = createDateParser().iso8601();
+      DateService dateParser = createDateParser();
 
       List<Server> expected = ImmutableList.<Server>of(
               Server.builder()
+              .dataCenter(DataCenter.builder()
+                      .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+                      .version(10)
+                      .build()
+              )
               .id("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
               .name("facebook-node")
               .cores(4)
@@ -67,8 +72,8 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
               .hasInternetAccess(true)
               .state(ProvisioningState.AVAILABLE)
               .status(Server.Status.RUNNING)
-              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
-              .lastModificationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:08:35.629Z"))
               .osType(OsType.LINUX)
               .availabilityZone(AvailabilityZone.AUTO)
               .isCpuHotPlug(true)
@@ -77,7 +82,7 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
               .isNicHotUnPlug(true)
               .isDiscVirtioHotPlug(true)
               .isDiscVirtioHotUnPlug(true)
-              .activate(true)
+              .loadBalanced(true)
               .balancedNicId("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
               .storages(ImmutableList.<Storage>of(
                               Storage.builder()
@@ -113,6 +118,11 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
               )
               .build(),
               Server.builder()
+              .dataCenter(DataCenter.builder()
+                      .id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy")
+                      .version(238)
+                      .build()
+              )
               .id("asdfghjk-asdf-asdf-asdf-asdfghjklkjl")
               .name("google-node")
               .cores(1)
@@ -120,8 +130,8 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
               .hasInternetAccess(false)
               .state(ProvisioningState.AVAILABLE)
               .status(Server.Status.RUNNING)
-              .creationTime(dateParser.toDate("2014-11-12T07:01:00.441Z"))
-              .lastModificationTime(dateParser.toDate("2014-11-12T07:01:00.441Z"))
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-11-12T07:01:00.441Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-11-12T07:01:00.441Z"))
               .osType(OsType.LINUX)
               .availabilityZone(AvailabilityZone.AUTO)
               .isCpuHotPlug(true)
@@ -130,7 +140,7 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
               .isNicHotUnPlug(true)
               .isDiscVirtioHotPlug(true)
               .isDiscVirtioHotUnPlug(true)
-              .activate(true)
+              .loadBalanced(true)
               .balancedNicId("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
               .storages(ImmutableList.<Storage>of(
                               Storage.builder()

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
index 38dfa1e..f9f93d0 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
@@ -17,17 +17,20 @@
 package org.jclouds.profitbricks.http.parser.snapshot;
 
 import com.google.common.collect.Lists;
+
 import java.util.List;
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Snapshot;
 import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.date.DateService;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "SnapshotListResponseHandlerTest")
@@ -38,8 +41,8 @@ public class SnapshotListResponseHandlerTest extends BaseResponseHandlerTest<Lis
       return factory.create(injector.getInstance(SnapshotListResponseHandler.class));
    }
 
-   protected DateCodecFactory createDateParser() {
-      return injector.getInstance(DateCodecFactory.class);
+   protected DateService createDateParser() {
+      return injector.getInstance(DateService.class);
    }
 
    @Test
@@ -49,51 +52,51 @@ public class SnapshotListResponseHandlerTest extends BaseResponseHandlerTest<Lis
       List<Snapshot> actual = parser.parse(payloadFromResource("/snapshot/snapshots.xml"));
       assertNotNull(actual);
 
-      DateCodec dateParser = createDateParser().iso8601();
+      DateService dateParser = createDateParser();
 
       List<Snapshot> expected = Lists.newArrayList();
 
       expected.add(Snapshot.builder()
-	      .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
-	      .description("description")
-	      .size(1024)
-	      .name("snapshot01")
-	      .state(ProvisioningState.AVAILABLE)
-	      .bootable(true)
-	      .osType(OsType.LINUX)
-	      .cpuHotPlug(true)
-	      .cpuHotUnPlug(true)
-	      .discVirtioHotPlug(true)
-	      .discVirtioHotUnPlug(true)
-	      .ramHotPlug(true)
-	      .ramHotUnPlug(true)
-	      .nicHotPlug(true)
-	      .nicHotUnPlug(true)
-	      .location(Location.US_LAS)
-	      .creationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
-	      .lastModificationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
-	      .build());
+              .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+              .description("description")
+              .size(1024)
+              .name("snapshot01")
+              .state(ProvisioningState.AVAILABLE)
+              .isBootable(true)
+              .osType(OsType.LINUX)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(true)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(true)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .location(Location.US_LAS)
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2015-01-26T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2015-01-26T07:09:23.138Z"))
+              .build());
 
       expected.add(Snapshot.builder()
-	      .id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy")
-	      .description("description")
-	      .size(1024)
-	      .name("snapshot02")
-	      .state(ProvisioningState.AVAILABLE)
-	      .bootable(true)
-	      .osType(OsType.LINUX)
-	      .cpuHotPlug(true)
-	      .cpuHotUnPlug(true)
-	      .discVirtioHotPlug(true)
-	      .discVirtioHotUnPlug(true)
-	      .ramHotPlug(true)
-	      .ramHotUnPlug(true)
-	      .nicHotPlug(true)
-	      .nicHotUnPlug(true)
-	      .location(Location.US_LAS)
-	      .creationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
-	      .lastModificationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
-	      .build());
+              .id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy")
+              .description("description")
+              .size(1024)
+              .name("snapshot02")
+              .state(ProvisioningState.AVAILABLE)
+              .isBootable(true)
+              .osType(OsType.LINUX)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(true)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(true)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .location(Location.US_LAS)
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2015-01-26T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2015-01-26T07:09:23.138Z"))
+              .build());
 
       assertEquals(actual, expected);
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
index 9928e92..ced1814 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
@@ -16,16 +16,17 @@
  */
 package org.jclouds.profitbricks.http.parser.snapshot;
 
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Snapshot;
 import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.date.DateService;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "ServerResponseHandlerTest")
@@ -36,8 +37,8 @@ public class SnapshotResponseHandlerTest extends BaseResponseHandlerTest<Snapsho
       return factory.create(injector.getInstance(SnapshotResponseHandler.class));
    }
 
-   protected DateCodecFactory createDateParser() {
-      return injector.getInstance(DateCodecFactory.class);
+   protected DateService createDateParser() {
+      return injector.getInstance(DateService.class);
    }
 
    @Test
@@ -47,28 +48,28 @@ public class SnapshotResponseHandlerTest extends BaseResponseHandlerTest<Snapsho
       Snapshot actual = parser.parse(payloadFromResource("/snapshot/snapshot.xml"));
       assertNotNull(actual, "Parsed content returned null");
 
-      DateCodec dateParser = createDateParser().iso8601();
+      DateService dateParser = createDateParser();
 
       Snapshot expected = Snapshot.builder()
-	      .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
-	      .description("description")
-	      .size(1024)
-	      .name("snapshot01")
-	      .state(ProvisioningState.AVAILABLE)
-	      .bootable(true)
-	      .osType(OsType.LINUX)
-	      .cpuHotPlug(true)
-	      .cpuHotUnPlug(true)
-	      .discVirtioHotPlug(true)
-	      .discVirtioHotUnPlug(true)
-	      .ramHotPlug(true)
-	      .ramHotUnPlug(true)
-	      .nicHotPlug(true)
-	      .nicHotUnPlug(true)
-	      .location(Location.US_LAS)
-	      .creationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
-	      .lastModificationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
-	      .build();
+              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+              .description("description")
+              .size(1024)
+              .name("snapshot01")
+              .state(ProvisioningState.AVAILABLE)
+              .isBootable(true)
+              .osType(OsType.LINUX)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(true)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(true)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .location(Location.US_LAS)
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2015-01-26T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2015-01-26T07:09:23.138Z"))
+              .build();
 
       assertEquals(actual, expected);
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandlerTest.java
index 338b02b..411865f 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandlerTest.java
@@ -19,8 +19,7 @@ package org.jclouds.profitbricks.http.parser.storage;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+import org.jclouds.date.DateService;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Storage;
@@ -37,8 +36,8 @@ public class StorageInfoResponseHandlerTest extends BaseResponseHandlerTest<Stor
       return factory.create(injector.getInstance(StorageInfoResponseHandler.class));
    }
 
-   protected DateCodecFactory createDateParser() {
-      return injector.getInstance(DateCodecFactory.class);
+   protected DateService createDateParser() {
+      return injector.getInstance(DateService.class);
    }
 
    @Test
@@ -48,7 +47,7 @@ public class StorageInfoResponseHandlerTest extends BaseResponseHandlerTest<Stor
       Storage actual = parser.parse(payloadFromResource("/storage/storage.xml"));
       assertNotNull(actual, "Parsed content returned null");
 
-      DateCodec dateParser = createDateParser().iso8601();
+      DateService dateParser = createDateParser();
 
       Storage expected = Storage.builder()
               .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
@@ -56,8 +55,8 @@ public class StorageInfoResponseHandlerTest extends BaseResponseHandlerTest<Stor
               .name("hdd-1")
               .state(ProvisioningState.AVAILABLE)
               .serverIds(ImmutableList.<String>of("qwertyui-qwer-qwer-qwer-qwertyyuiiop"))
-              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
-              .lastModificationTime(dateParser.toDate("2014-12-12T03:14:48.316Z"))
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:14:48.316Z"))
               .build();
 
       assertEquals(actual, expected);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandlerTest.java
index 62e43fc..9ac696d 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandlerTest.java
@@ -23,8 +23,7 @@ import com.google.common.collect.ImmutableList;
 
 import java.util.List;
 
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+import org.jclouds.date.DateService;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Storage;
@@ -40,8 +39,8 @@ public class StorageListResponseHandlerTest extends BaseResponseHandlerTest<List
       return factory.create(injector.getInstance(StorageListResponseHandler.class));
    }
 
-   protected DateCodecFactory createDateParser() {
-      return injector.getInstance(DateCodecFactory.class);
+   protected DateService createDateParser() {
+      return injector.getInstance(DateService.class);
    }
 
    @Test
@@ -51,7 +50,7 @@ public class StorageListResponseHandlerTest extends BaseResponseHandlerTest<List
       List<Storage> actual = parser.parse(payloadFromResource("/storage/storages.xml"));
       assertNotNull(actual, "Parsed content returned null");
 
-      DateCodec dateParser = createDateParser().iso8601();
+      DateService dateParser = createDateParser();
 
       List<Storage> expected = ImmutableList.<Storage>of(
               Storage.builder()
@@ -60,8 +59,8 @@ public class StorageListResponseHandlerTest extends BaseResponseHandlerTest<List
               .name("hdd-1")
               .state(ProvisioningState.AVAILABLE)
               .serverIds(ImmutableList.<String>of("qwertyui-qwer-qwer-qwer-qwertyyuiiop"))
-              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
-              .lastModificationTime(dateParser.toDate("2014-12-12T03:14:48.316Z"))
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:14:48.316Z"))
               .build(),
               Storage.builder()
               .id("asfasfle-f23n-cu89-klfr-njkdsvwllkfa")
@@ -69,8 +68,8 @@ public class StorageListResponseHandlerTest extends BaseResponseHandlerTest<List
               .name("hdd-2")
               .state(ProvisioningState.INPROCESS)
               .serverIds(ImmutableList.<String>of("asdfghjk-asdf-asdf-asdf-asdfghjklkjl"))
-              .creationTime(dateParser.toDate("2014-11-04T07:09:23.138Z"))
-              .lastModificationTime(dateParser.toDate("2014-11-12T03:14:48.316Z"))
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-11-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-11-12T03:14:48.316Z"))
               .build()
       );
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/util/PasswordsTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/util/PasswordsTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/util/PasswordsTest.java
new file mode 100644
index 0000000..fc7be1f
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/util/PasswordsTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.util;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import static org.jclouds.profitbricks.util.Passwords.isValidPassword;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "PasswordsTest")
+public class PasswordsTest {
+
+   private final List<String> validPasswords = ImmutableList.of(
+           "fKVasTnNm", "84625894", "QQQQQQQQ", "qqqqqqqq", "asdfghjk"
+   );
+   private final List<String> invalidPasswords = ImmutableList.of(
+           "", "apachejclouds", "s0merand0mpassw0rd"
+   );
+
+   @Test
+   public void testPasswordValidation() {
+      for (String pwd : validPasswords)
+         assertTrue(isValidPassword(pwd), "Should've been valid: " + pwd);
+
+      for (String pwd : invalidPasswords)
+         assertFalse(isValidPassword(pwd), "Should've been invalid: " + pwd);
+   }
+
+   @Test
+   public void testGeneratorGeneratesValidPassword() {
+      final int times = 50;
+      for (int i = 0; i < times; i++) {
+         String pwd = Passwords.generate();
+         assertTrue(isValidPassword(pwd), "Failed with: " + pwd);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/datacenter/datacenter-deleted.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-deleted.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-deleted.xml
index c09858e..531ed53 100644
--- a/providers/profitbricks/src/test/resources/datacenter/datacenter-deleted.xml
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-deleted.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-   <S:Body>
-      <ns2:deleteDataCenterResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-         <return>
-            <requestId>11411363</requestId>
-         </return>
-      </ns2:deleteDataCenterResponse>
-   </S:Body>
+    <S:Body>
+        <ns2:deleteDataCenterResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>11411363</requestId>
+            </return>
+        </ns2:deleteDataCenterResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/datacenter/datacenter-not-found.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-not-found.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-not-found.xml
index 486706d..e4a9701 100644
--- a/providers/profitbricks/src/test/resources/datacenter/datacenter-not-found.xml
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-not-found.xml
@@ -1,17 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-   <S:Body>
-      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
-         <faultcode>S:Server</faultcode>
-         <faultstring>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</faultstring>
-         <detail>
-            <ns2:ProfitbricksServiceFault xmlns:ns2="http://ws.api.profitbricks.com/">
-               <faultCode>RESOURCE_NOT_FOUND</faultCode>
-               <httpCode>404</httpCode>
-               <message>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</message>
-               <requestId>11122416</requestId>
-            </ns2:ProfitbricksServiceFault>
-         </detail>
-      </S:Fault>
-   </S:Body>
+    <S:Body>
+        <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
+            <faultcode>S:Server</faultcode>
+            <faultstring>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</faultstring>
+            <detail>
+                <ns2:ProfitbricksServiceFault xmlns:ns2="http://ws.api.profitbricks.com/">
+                    <faultCode>RESOURCE_NOT_FOUND</faultCode>
+                    <httpCode>404</httpCode>
+                    <message>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</message>
+                    <requestId>11122416</requestId>
+                </ns2:ProfitbricksServiceFault>
+            </detail>
+        </S:Fault>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/datacenter/datacenter-state-inprocess.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-state-inprocess.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-state-inprocess.xml
index 77d41e3..722c653 100644
--- a/providers/profitbricks/src/test/resources/datacenter/datacenter-state-inprocess.xml
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-state-inprocess.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-   <S:Body>
-      <ns2:getDataCenterStateResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-         <return>INPROCESS</return>
-      </ns2:getDataCenterStateResponse>
-   </S:Body>
+    <S:Body>
+        <ns2:getDataCenterStateResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>INPROCESS</return>
+        </ns2:getDataCenterStateResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/datacenter/datacenter-state.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-state.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-state.xml
index 8bd56e2..3327c82 100644
--- a/providers/profitbricks/src/test/resources/datacenter/datacenter-state.xml
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-state.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-   <S:Body>
-      <ns2:getDataCenterStateResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-         <return>AVAILABLE</return>
-      </ns2:getDataCenterStateResponse>
-   </S:Body>
+    <S:Body>
+        <ns2:getDataCenterStateResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>AVAILABLE</return>
+        </ns2:getDataCenterStateResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/drives/drives-add.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/drives/drives-add.xml b/providers/profitbricks/src/test/resources/drives/drives-add.xml
index 752f8f3..52a04f5 100644
--- a/providers/profitbricks/src/test/resources/drives/drives-add.xml
+++ b/providers/profitbricks/src/test/resources/drives/drives-add.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:addRomDriveToServerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-        <dataCenterId>datacenter-id</dataCenterId>
-        <dataCenterVersion>datacenter-version</dataCenterVersion>
-      </return>
-    </ns2:addRomDriveToServerResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:addRomDriveToServerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+            </return>
+        </ns2:addRomDriveToServerResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/drives/drives-remove.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/drives/drives-remove.xml b/providers/profitbricks/src/test/resources/drives/drives-remove.xml
index ccfd400..699b359 100644
--- a/providers/profitbricks/src/test/resources/drives/drives-remove.xml
+++ b/providers/profitbricks/src/test/resources/drives/drives-remove.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:removeRomDriveFromServerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-        <dataCenterId>datacenter-id</dataCenterId>
-        <dataCenterVersion>datacenter-version</dataCenterVersion>
-      </return>
-    </ns2:removeRomDriveFromServerResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:removeRomDriveFromServerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+            </return>
+        </ns2:removeRomDriveFromServerResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/firewall/firewall-activate.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-activate.xml b/providers/profitbricks/src/test/resources/firewall/firewall-activate.xml
index 2150c6b..16e32b9 100644
--- a/providers/profitbricks/src/test/resources/firewall/firewall-activate.xml
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-activate.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:activateFirewallsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-        <dataCenterId>datacenter-id</dataCenterId>
-        <dataCenterVersion>datacenter-version</dataCenterVersion>
-      </return>
-    </ns2:activateFirewallsResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:activateFirewallsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+            </return>
+        </ns2:activateFirewallsResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/firewall/firewall-addtonic.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-addtonic.xml b/providers/profitbricks/src/test/resources/firewall/firewall-addtonic.xml
index 1267040..740c042 100644
--- a/providers/profitbricks/src/test/resources/firewall/firewall-addtonic.xml
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-addtonic.xml
@@ -1,23 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:addFirewallRulesToNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
- <return>
-    <active>active</active>
-    <firewallId>firewall-id</firewallId>
-    <firewallRules>
-      <firewallRuleId>firewall-rule-id</firewallRuleId>
-      <name>name</name>
-      <portRangeEnd>45678</portRangeEnd>
-      <portRangeStart>12345</portRangeStart>
-      <protocol>TCP</protocol>
-      <sourceIp>192.168.0.1</sourceIp>
-      <sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>
-      <targetIp>192.168.0.2</targetIp>
-    </firewallRules>
-    <nicId>nic-id</nicId>
-    <provisioningState>AVAILABLE</provisioningState>
-  </return>
-    </ns2:addFirewallRulesToNicResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:addFirewallRulesToNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <active>active</active>
+                <firewallId>firewall-id</firewallId>
+                <firewallRules>
+                    <firewallRuleId>firewall-rule-id</firewallRuleId>
+                    <name>name</name>
+                    <portRangeEnd>45678</portRangeEnd>
+                    <portRangeStart>12345</portRangeStart>
+                    <protocol>TCP</protocol>
+                    <sourceIp>192.168.0.1</sourceIp>
+                    <sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>
+                    <targetIp>192.168.0.2</targetIp>
+                </firewallRules>
+                <nicId>nic-id</nicId>
+                <provisioningState>AVAILABLE</provisioningState>
+            </return>
+        </ns2:addFirewallRulesToNicResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/firewall/firewall-deactivate.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-deactivate.xml b/providers/profitbricks/src/test/resources/firewall/firewall-deactivate.xml
index a0bca25..0adaabd 100644
--- a/providers/profitbricks/src/test/resources/firewall/firewall-deactivate.xml
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-deactivate.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:deactivateFirewallsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id1111</requestId>
-        <dataCenterId>datacenter-id</dataCenterId>
-        <dataCenterVersion>datacenter-version</dataCenterVersion>
-      </return>
-    </ns2:deactivateFirewallsResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:deactivateFirewallsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id1111</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+            </return>
+        </ns2:deactivateFirewallsResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/firewall/firewall-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-delete.xml b/providers/profitbricks/src/test/resources/firewall/firewall-delete.xml
index 2c7364f..26371a9 100644
--- a/providers/profitbricks/src/test/resources/firewall/firewall-delete.xml
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-delete.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:deleteFirewallsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-        <dataCenterId>datacenter-id</dataCenterId>
-        <dataCenterVersion>datacenter-version</dataCenterVersion>
-      </return>
-    </ns2:deleteFirewallsResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:deleteFirewallsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+            </return>
+        </ns2:deleteFirewallsResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/firewall/firewall-remove.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-remove.xml b/providers/profitbricks/src/test/resources/firewall/firewall-remove.xml
index 793bdd0..6301e6a 100644
--- a/providers/profitbricks/src/test/resources/firewall/firewall-remove.xml
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-remove.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:removeFirewallRulesResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-        <dataCenterId>datacenter-id</dataCenterId>
-        <dataCenterVersion>datacenter-version</dataCenterVersion>
-      </return>
-    </ns2:removeFirewallRulesResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:removeFirewallRulesResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+            </return>
+        </ns2:removeFirewallRulesResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/firewall/firewall.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall.xml b/providers/profitbricks/src/test/resources/firewall/firewall.xml
index 3275a70..839502c 100644
--- a/providers/profitbricks/src/test/resources/firewall/firewall.xml
+++ b/providers/profitbricks/src/test/resources/firewall/firewall.xml
@@ -1,23 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:getFirewallResponse xmlns:ns2="http://ws.api.profitbricks.com/">
- <return>
-    <active>true</active>
-    <firewallId>firewall-id</firewallId>
-    <firewallRules>
-      <firewallRuleId>firewall-rule-id</firewallRuleId>
-      <name>name</name>
-      <portRangeEnd>45678</portRangeEnd>
-      <portRangeStart>12345</portRangeStart>
-      <protocol>TCP</protocol>
-      <sourceIp>192.168.0.1</sourceIp>
-      <sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>
-      <targetIp>192.168.0.2</targetIp>
-    </firewallRules>
-    <nicId>nic-id</nicId>
-    <provisioningState>AVAILABLE</provisioningState>
-  </return>
-    </ns2:getFirewallResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:getFirewallResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <active>true</active>
+                <firewallId>firewall-id</firewallId>
+                <firewallRules>
+                    <firewallRuleId>firewall-rule-id</firewallRuleId>
+                    <name>name</name>
+                    <portRangeEnd>45678</portRangeEnd>
+                    <portRangeStart>12345</portRangeStart>
+                    <protocol>TCP</protocol>
+                    <sourceIp>192.168.0.1</sourceIp>
+                    <sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>
+                    <targetIp>192.168.0.2</targetIp>
+                </firewallRules>
+                <nicId>nic-id</nicId>
+                <provisioningState>AVAILABLE</provisioningState>
+            </return>
+        </ns2:getFirewallResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/ipblock/ipblock-addtonic.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock-addtonic.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock-addtonic.xml
index a9c1974..8496660 100644
--- a/providers/profitbricks/src/test/resources/ipblock/ipblock-addtonic.xml
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock-addtonic.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:addPublicIpToNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-        <dataCenterId>datacenter-id</dataCenterId>
-        <dataCenterVersion>datacenter-version</dataCenterVersion>
-      </return>
-    </ns2:addPublicIpToNicResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:addPublicIpToNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+            </return>
+        </ns2:addPublicIpToNicResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/ipblock/ipblock-release.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock-release.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock-release.xml
index a9f22bf..d10e675 100644
--- a/providers/profitbricks/src/test/resources/ipblock/ipblock-release.xml
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock-release.xml
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:releasePublicIpBlockResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-      </return>
-    </ns2:releasePublicIpBlockResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:releasePublicIpBlockResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+            </return>
+        </ns2:releasePublicIpBlockResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/ipblock/ipblock-removefromnic.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock-removefromnic.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock-removefromnic.xml
index a9c1974..8496660 100644
--- a/providers/profitbricks/src/test/resources/ipblock/ipblock-removefromnic.xml
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock-removefromnic.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:addPublicIpToNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-        <dataCenterId>datacenter-id</dataCenterId>
-        <dataCenterVersion>datacenter-version</dataCenterVersion>
-      </return>
-    </ns2:addPublicIpToNicResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:addPublicIpToNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+            </return>
+        </ns2:addPublicIpToNicResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
index 863e9ff..8586aaf 100644
--- a/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:reservePublicIpBlockResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-        <blockId>block-id</blockId>
-        <location>us/las</location>
-        <ips>ip</ips>
-      </return>
-    </ns2:reservePublicIpBlockResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:reservePublicIpBlockResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <blockId>block-id</blockId>
+                <location>us/las</location>
+                <ips>ip</ips>
+            </return>
+        </ns2:reservePublicIpBlockResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
index 2dd54f2..339fdfb 100644
--- a/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
@@ -1,18 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:getAllPublicIpBlocksResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <blockId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</blockId>
-        <location>us/las</location>
-        <publicIps>
-          <ip>ip</ip>
-		  <nicId>nic-id</nicId>
-        </publicIps>
-        <publicIps>
-          <ip>ip</ip>
-        </publicIps>
-      </return>
-    </ns2:getAllPublicIpBlocksResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:getAllPublicIpBlocksResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <blockId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</blockId>
+                <location>us/las</location>
+                <publicIps>
+                    <ip>ip</ip>
+                    <nicId>nic-id</nicId>
+                </publicIps>
+                <publicIps>
+                    <ip>ip</ip>
+                </publicIps>
+            </return>
+        </ns2:getAllPublicIpBlocksResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
index 14ad678..33eb41b 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
@@ -1,6 +1,6 @@
 <soapenv:Envelope
-  xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
-  xmlns:ws='http://ws.api.profitbricks.com/'>
+    xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
+    xmlns:ws='http://ws.api.profitbricks.com/'>
     <soapenv:Header />
     <soapenv:Body>
         <ws:createLoadBalancer>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
index b699be6..8396174 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-  <S:Body>
-    <ns2:deleteLoadBalancerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
-      <return>
-        <requestId>request-id</requestId>
-        <dataCenterId>datacenter-id</dataCenterId>
-        <dataCenterVersion>datacenter-version</dataCenterVersion>
-      </return>
-    </ns2:deleteLoadBalancerResponse>
-  </S:Body>
+    <S:Body>
+        <ns2:deleteLoadBalancerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>datacenter-version</dataCenterVersion>
+            </return>
+        </ns2:deleteLoadBalancerResponse>
+    </S:Body>
 </S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
index ee03c47..86ef94c 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
@@ -1,14 +1,14 @@
 <soapenv:Envelope
-  xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
-  xmlns:ws='http://ws.api.profitbricks.com/'>
+    xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
+    xmlns:ws='http://ws.api.profitbricks.com/'>
     <soapenv:Header />
     <soapenv:Body>
         <ws:deregisterServersOnLoadBalancer>
-			<request>
+            <request>
                 <serverIds>1</serverIds>
                 <serverIds>2</serverIds>
                 <loadBalancerId>load-balancer-id</loadBalancerId>
-			<request>
+                <request>
         </ws:deregisterServersOnLoadBalancer>
     </soapenv:Body>
 </soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
index 48a1ff1..a32c65a 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
@@ -1,13 +1,13 @@
 <soapenv:Envelope
-  xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
-  xmlns:ws='http://ws.api.profitbricks.com/'>
+    xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
+    xmlns:ws='http://ws.api.profitbricks.com/'>
     <soapenv:Header/>
     <soapenv:Body>
         <ws:registerServersOnLoadBalancer>
-			<request>
+            <request>
                 <serverIds>1234</serverIds>
                 <loadBalancerId>load-balancer-id</loadBalancerId>
-			</request>
+            </request>
         </ws:registerServersOnLoadBalancer>
     </soapenv:Body>
 </soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
index 7a39dea..87c1f02 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
@@ -1,6 +1,6 @@
 <soapenv:Envelope
-  xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
-  xmlns:ws='http://ws.api.profitbricks.com/'>
+    xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
+    xmlns:ws='http://ws.api.profitbricks.com/'>
     <soapenv:Header />
     <soapenv:Body>
         <ws:updateLoadBalancer>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
index 501e470..302c10e 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
@@ -4,7 +4,7 @@
         <ns2:getLoadBalancerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
             <return>
                 <dataCenterId>datacenter-id</dataCenterId>
-                <dataCenterVersion>datacenter-version</dataCenterVersion>
+                <dataCenterVersion>4</dataCenterVersion>
                 <loadBalancerId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</loadBalancerId>
                 <loadBalancerName>load-balancer-name</loadBalancerName>
                 <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
index 155a1e3..54d1949 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
@@ -4,7 +4,7 @@
         <ns2:getAllLoadBalancersResponse xmlns:ns2="http://ws.api.profitbricks.com/">
             <return>
                 <dataCenterId>datacenter-id</dataCenterId>
-                <dataCenterVersion>datacenter-version</dataCenterVersion>
+                <dataCenterVersion>4</dataCenterVersion>
                 <loadBalancerId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</loadBalancerId>
                 <loadBalancerName>load-1234567890-name</loadBalancerName>
                 <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
@@ -29,7 +29,7 @@
             </return>
             <return>
                 <dataCenterId>datacenter-id</dataCenterId>
-                <dataCenterVersion>datacenter-version</dataCenterVersion>
+                <dataCenterVersion>4</dataCenterVersion>
                 <loadBalancerId>qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy</loadBalancerId>
                 <loadBalancerName>load-balancer-name</loadBalancerName>
                 <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/server/server.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server.xml b/providers/profitbricks/src/test/resources/server/server.xml
index 33fa824..c78721f 100644
--- a/providers/profitbricks/src/test/resources/server/server.xml
+++ b/providers/profitbricks/src/test/resources/server/server.xml
@@ -12,8 +12,8 @@
                 <ram>4096</ram>
                 <internetAccess>true</internetAccess>
                 <ips>173.252.120.6</ips>
-				<balancedNicId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</balancedNicId>
-				<activate>true</activate>
+                <balancedNicId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</balancedNicId>
+                <activate>true</activate>
                 <connectedStorages>
                     <bootDevice>true</bootDevice>
                     <busType>VIRTIO</busType>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/resources/snapshot/snapshots.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/snapshot/snapshots.xml b/providers/profitbricks/src/test/resources/snapshot/snapshots.xml
index d59826a..1b3ab72 100644
--- a/providers/profitbricks/src/test/resources/snapshot/snapshots.xml
+++ b/providers/profitbricks/src/test/resources/snapshot/snapshots.xml
@@ -3,25 +3,25 @@
     <S:Body>
         <ns2:getAllSnapshotsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
             <return>
-            <snapshotId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</snapshotId>
-            <description>description</description>
-            <snapshotSize>1024</snapshotSize>
-            <snapshotName>snapshot01</snapshotName>
-            <provisioningState>AVAILABLE</provisioningState>
-            <bootable>true</bootable>
-            <osType>LINUX</osType>
-            <cpuHotPlug>true</cpuHotPlug>
-            <cpuHotUnPlug>true</cpuHotUnPlug>
-            <discVirtioHotPlug>true</discVirtioHotPlug>
-            <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
-            <ramHotPlug>true</ramHotPlug>
-            <ramHotUnPlug>true</ramHotUnPlug>
-            <nicHotPlug>true</nicHotPlug>
-            <nicHotUnPlug>true</nicHotUnPlug>
-            <creationTimestamp>2015-01-26T07:09:23.138Z</creationTimestamp>
-            <modificationTimestamp>2015-01-26T07:09:23.138Z</modificationTimestamp>
-            <location>us/las</location>
-        </return>
+                <snapshotId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</snapshotId>
+                <description>description</description>
+                <snapshotSize>1024</snapshotSize>
+                <snapshotName>snapshot01</snapshotName>
+                <provisioningState>AVAILABLE</provisioningState>
+                <bootable>true</bootable>
+                <osType>LINUX</osType>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>true</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>true</ramHotUnPlug>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <creationTimestamp>2015-01-26T07:09:23.138Z</creationTimestamp>
+                <modificationTimestamp>2015-01-26T07:09:23.138Z</modificationTimestamp>
+                <location>us/las</location>
+            </return>
             <return>
                 <snapshotId>qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy</snapshotId>
                 <description>description</description>


[05/35] jclouds git commit: JCLOUDS-702: JCloud ProfitBricks provider - Server & Image API

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
new file mode 100644
index 0000000..f5f7a20
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
@@ -0,0 +1,164 @@
+/*
+ * 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;
+
+import java.util.Date;
+import static org.testng.Assert.assertEquals;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "ServerBuilderTest" )
+public class ServerBuilderTest {
+
+   private final Boolean _isCpuHotPlug = true;
+   private final Boolean _isRamHotPlug = false;
+   private final Boolean _isNicHotPlug = true;
+   private final Boolean _isNicHotUnPlug = false;
+   private final Boolean _isDiscVirtioHotPlug = true;
+   private final Boolean _isDiscVirtioHotUnPlug = false;
+   private final int _cores = 8;
+   private final int _ram = 8 * 1024;
+   private final String _id = "some-random-server-id";
+   private final String _name = "jclouds-node";
+   private final Boolean _hasInternetAccess = true;
+   private final ProvisioningState _state = ProvisioningState.INACTIVE;
+   private final Server.Status _status = Server.Status.SHUTOFF;
+   private final OsType _osType = OsType.LINUX;
+   private final AvailabilityZone _availabilityZone = AvailabilityZone.ZONE_1;
+   private final Date _creationTime = new Date();
+   private final Date _lastModificationTime = new Date();
+
+   private final Integer _lanId = 5;
+   private final String _dataCenterId = "some-random-datacenter-id";
+   private final String _bootFromStorageId = "some-random-storage-id";
+   private final String _bootFromImageId = "some-random-image-id";
+
+   private final String _serverId = "some-random-server-id";
+
+   @Test
+   public void testAutoValueServerPropertiesSettingCorrectly() {
+      Server actual = Server.builder()
+              .availabilityZone( _availabilityZone )
+              .creationTime( _creationTime )
+              .cores( _cores )
+              .hasInternetAccess( _hasInternetAccess )
+              .id( _id )
+              .name( _name )
+              .isCpuHotPlug( _isCpuHotPlug )
+              .isDiscVirtioHotPlug( _isDiscVirtioHotPlug )
+              .isDiscVirtioHotUnPlug( _isDiscVirtioHotUnPlug )
+              .isNicHotPlug( _isNicHotPlug )
+              .isNicHotUnPlug( _isNicHotUnPlug )
+              .isRamHotPlug( _isRamHotPlug )
+              .lastModificationTime( _lastModificationTime )
+              .ram( _ram )
+              .osType( _osType )
+              .state( _state )
+              .status( _status )
+              .build();
+
+      assertEquals( actual.availabilityZone(), _availabilityZone );
+      assertEquals( actual.cores(), _cores );
+      assertEquals( actual.creationTime(), _creationTime );
+      assertEquals( actual.hasInternetAccess(), _hasInternetAccess );
+      assertEquals( actual.id(), _id );
+      assertEquals( actual.name(), _name );
+      assertEquals( actual.isCpuHotPlug(), _isCpuHotPlug );
+      assertEquals( actual.isDiscVirtioHotPlug(), _isDiscVirtioHotPlug );
+      assertEquals( actual.isDiscVirtioHotUnPlug(), _isDiscVirtioHotUnPlug );
+      assertEquals( actual.isNicHotPlug(), _isNicHotPlug );
+      assertEquals( actual.isNicHotUnPlug(), _isNicHotUnPlug );
+      assertEquals( actual.isRamHotPlug(), _isRamHotPlug );
+      assertEquals( actual.lastModificationTime(), _lastModificationTime );
+      assertEquals( actual.ram(), _ram );
+      assertEquals( actual.osType(), _osType );
+      assertEquals( actual.state(), _state );
+   }
+
+   @Test
+   public void testAutoValueServerRequestCreatePayloadPropertiesSettingCorrectly() {
+      Server.Request.CreatePayload actual = Server.Request.creatingBuilder()
+              .availabilityZone( _availabilityZone )
+              .bootFromImageId( _bootFromImageId )
+              .bootFromStorageId( _bootFromStorageId )
+              .cores( _cores )
+              .dataCenterId( _dataCenterId )
+              .hasInternetAccess( _hasInternetAccess )
+              .name( _name )
+              .isCpuHotPlug( _isCpuHotPlug )
+              .isDiscVirtioHotPlug( _isDiscVirtioHotPlug )
+              .isDiscVirtioHotUnPlug( _isDiscVirtioHotUnPlug )
+              .isNicHotPlug( _isNicHotPlug )
+              .isNicHotUnPlug( _isNicHotUnPlug )
+              .isRamHotPlug( _isRamHotPlug )
+              .lanId( _lanId )
+              .ram( _ram )
+              .osType( _osType )
+              .build();
+
+      assertEquals( actual.availabilityZone(), _availabilityZone );
+      assertEquals( actual.bootFromImageId(), _bootFromImageId );
+      assertEquals( actual.bootFromStorageId(), _bootFromStorageId );
+      assertEquals( actual.cores(), _cores );
+      assertEquals( actual.dataCenterId(), _dataCenterId );
+      assertEquals( actual.hasInternetAccess(), _hasInternetAccess );
+      assertEquals( actual.name(), _name );
+      assertEquals( actual.isCpuHotPlug(), _isCpuHotPlug );
+      assertEquals( actual.isDiscVirtioHotPlug(), _isDiscVirtioHotPlug );
+      assertEquals( actual.isDiscVirtioHotUnPlug(), _isDiscVirtioHotUnPlug );
+      assertEquals( actual.isNicHotPlug(), _isNicHotPlug );
+      assertEquals( actual.isNicHotUnPlug(), _isNicHotUnPlug );
+      assertEquals( actual.isRamHotPlug(), _isRamHotPlug );
+      assertEquals( actual.lanId(), _lanId );
+      assertEquals( actual.ram(), _ram );
+      assertEquals( actual.osType(), _osType );
+   }
+
+   @Test
+   public void testAutoValueServerRequestUpdatePayloadPropertiesSettingCorrectly() {
+      Server.Request.UpdatePayload actual = Server.Request.updatingBuilder()
+              .availabilityZone( _availabilityZone )
+              .bootFromImageId( _bootFromImageId )
+              .bootFromStorageId( _bootFromStorageId )
+              .cores( _cores )
+              .name( _name )
+              .id( _id )
+              .isCpuHotPlug( _isCpuHotPlug )
+              .isDiscVirtioHotPlug( _isDiscVirtioHotPlug )
+              .isDiscVirtioHotUnPlug( _isDiscVirtioHotUnPlug )
+              .isNicHotPlug( _isNicHotPlug )
+              .isNicHotUnPlug( _isNicHotUnPlug )
+              .isRamHotPlug( _isRamHotPlug )
+              .ram( _ram )
+              .osType( _osType )
+              .build();
+
+      assertEquals( actual.availabilityZone(), _availabilityZone );
+      assertEquals( actual.bootFromImageId(), _bootFromImageId );
+      assertEquals( actual.bootFromStorageId(), _bootFromStorageId );
+      assertEquals( actual.cores(), _cores );
+      assertEquals( actual.name(), _name );
+      assertEquals( actual.id(), _id );
+      assertEquals( actual.isCpuHotPlug(), _isCpuHotPlug );
+      assertEquals( actual.isDiscVirtioHotPlug(), _isDiscVirtioHotPlug );
+      assertEquals( actual.isDiscVirtioHotUnPlug(), _isDiscVirtioHotUnPlug );
+      assertEquals( actual.isNicHotPlug(), _isNicHotPlug );
+      assertEquals( actual.isNicHotUnPlug(), _isNicHotUnPlug );
+      assertEquals( actual.isRamHotPlug(), _isRamHotPlug );
+      assertEquals( actual.ram(), _ram );
+      assertEquals( actual.osType(), _osType );
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
index a9c093e..5c05e4d 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
@@ -51,7 +51,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
 
       try {
          List<DataCenter> dataCenters = api.getAllDataCenters();
-         assertRequestHasCommonProperties(server.takeRequest());
+         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllDataCenters/>");
          assertNotNull(dataCenters);
          assertEquals(dataCenters.size(), 2);
       } finally {
@@ -87,9 +87,10 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       DataCenterApi api = pbApi.dataCenterApi();
 
       String id = "12345678-abcd-efgh-ijkl-987654321000";
+      String content = "<ws:getDataCenter><dataCenterId>" + id + "</dataCenterId></ws:getDataCenter>";
       try {
          DataCenter dataCenter = api.getDataCenter(id);
-         assertRequestHasCommonProperties(server.takeRequest());
+         assertRequestHasCommonProperties(server.takeRequest(), content );
          assertNotNull(dataCenter);
          assertEquals(dataCenter.id(), id);
       } finally {
@@ -101,7 +102,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testGetNonExistingDataCenter() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setResponseCode(500).setBody(payloadFromResource("/fault-404.xml")));
+      server.enqueue(new MockResponse().setResponseCode(404));
 
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       DataCenterApi api = pbApi.dataCenterApi();
@@ -126,9 +127,10 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       DataCenterApi api = pbApi.dataCenterApi();
 
       String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      String content = "<ws:getDataCenterState><dataCenterId>" + id + "</dataCenterId></ws:getDataCenterState>";
       try {
          ProvisioningState state = api.getDataCenterState(id);
-         assertRequestHasCommonProperties(server.takeRequest());
+         assertRequestHasCommonProperties(server.takeRequest(), content );
          assertNotNull(state);
          assertEquals(state, ProvisioningState.AVAILABLE);
       } finally {
@@ -145,11 +147,15 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       DataCenterApi api = pbApi.dataCenterApi();
 
+      String content = "<ws:createDataCenter><request>"
+              + "<dataCenterName>JClouds-DC</dataCenterName>"
+              + "<location>de/fra</location>"
+              + "</request></ws:createDataCenter>";
       try {
          DataCenter dataCenter = api.createDataCenter(
                  DataCenter.Request.CreatePayload.create("JClouds-DC", Location.DE_FRA)
          );
-         assertRequestHasCommonProperties(server.takeRequest());
+         assertRequestHasCommonProperties(server.takeRequest(), content );
          assertNotNull(dataCenter);
          assertEquals(dataCenter.id(), "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
          assertEquals(dataCenter.version(), 1);
@@ -179,13 +185,19 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
 
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       DataCenterApi api = pbApi.dataCenterApi();
-
+      
       String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      String newName = "Apache";
+      
+      String content = "<ws:updateDataCenter><request>"
+              + "<dataCenterId>" + id + "</dataCenterId>"
+              + "<dataCenterName>" + newName + "</dataCenterName>"
+              + "</request></ws:updateDataCenter>";
       try {
          DataCenter dataCenter = api.updateDataCenter(
-                 DataCenter.Request.UpdatePayload.create(id, "Apache")
+                 DataCenter.Request.UpdatePayload.create(id, newName)
          );
-         assertRequestHasCommonProperties(server.takeRequest());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(dataCenter);
          assertEquals(dataCenter.id(), id);
          assertEquals(dataCenter.version(), 2);
@@ -204,10 +216,12 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       DataCenterApi api = pbApi.dataCenterApi();
 
       String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      
+      String content = "<ws:clearDataCenter><dataCenterId>" + id + "</dataCenterId></ws:clearDataCenter>";
       try {
          DataCenter dataCenter = api.clearDataCenter(id);
 
-         assertRequestHasCommonProperties(server.takeRequest());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(dataCenter);
          assertEquals(dataCenter.id(), id);
          assertEquals(dataCenter.version(), 3);
@@ -225,9 +239,12 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       DataCenterApi api = pbApi.dataCenterApi();
 
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      
+      String content = "<ws:deleteDataCenter><dataCenterId>" + id + "</dataCenterId></ws:deleteDataCenter>";
       try {
-         boolean result = api.deleteDataCenter("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
-         assertRequestHasCommonProperties(server.takeRequest());
+         boolean result = api.deleteDataCenter(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
          assertTrue(result);
       } finally {
          pbApi.close();
@@ -238,7 +255,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testDeleteNonExistingDataCenter() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setResponseCode(500).setBody(payloadFromResource("/fault-404.xml")));
+      server.enqueue(new MockResponse().setResponseCode( 404 ));
 
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       DataCenterApi api = pbApi.dataCenterApi();

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

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiMockTest.java
new file mode 100644
index 0000000..f1229ae
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiMockTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import java.util.List;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+
+/**
+ * Mock tests for the {@link org.jclouds.profitbricks.features.ImageApi} class
+ */
+@Test(groups = "unit", testName = "ImageApiMockTest")
+public class ImageApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetAllImages() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/image/images.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      ImageApi api = pbApi.imageApi();
+
+      try {
+         List<Image> images = api.getAllImages();
+         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllImages/>");
+         assertNotNull(images);
+         assertTrue(images.size() == 7);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllImagesReturning404() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      ImageApi api = pbApi.imageApi();
+
+      try {
+         List<Image> images = api.getAllImages();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertTrue(images.isEmpty());
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetImage() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/image/image.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      ImageApi api = pbApi.imageApi();
+
+      String id = "5ad99c9e-9166-11e4-9d74-52540066fee9";
+      
+      String content = "<ws:getImage><imageId>" + id + "</imageId></ws:getImage>";
+      try {
+         Image image = api.getImage(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(image);
+         assertEquals(image.id(), id);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+
+   }
+
+   @Test
+   public void testGetNonExistingImage() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      ImageApi api = pbApi.imageApi();
+
+      String id = "random-non-existing-id";
+      try {
+         Image image = api.getImage(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(image);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
new file mode 100644
index 0000000..3237e9c
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
@@ -0,0 +1,139 @@
+/*
+ * 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.features;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.util.Predicates2;
+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.Test;
+
+@Test( groups = "live", testName = "ServerApiLiveTest", singleThreaded = true )
+public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
+
+   private Predicate<String> waitUntilAvailable;
+   private DataCenter dataCenter;
+   private String createdServerId;
+
+   @Override
+   protected void initialize() {
+      super.initialize();
+      List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
+      assertFalse( dataCenters.isEmpty(), "Must atleast have 1 datacenter available for server testing." );
+
+      this.dataCenter = Iterables.getFirst( dataCenters, null );
+
+      this.waitUntilAvailable = Predicates2.retry(
+              new ProvisioningStatusPollingPredicate( api, ProvisioningStatusAware.SERVER, ProvisioningState.AVAILABLE ),
+              2l * 60l, 2l, TimeUnit.SECONDS );
+   }
+
+   @Test
+   public void testCreateServer() {
+      String serverId = api.serverApi().createServer(
+              Server.Request.CreatePayload.create( dataCenter.id(), "jclouds-node", 1, 1024 ) );
+
+      assertNotNull( serverId );
+      this.createdServerId = serverId;
+   }
+
+   @Test( dependsOnMethods = "testCreateServer" )
+   public void testGetServer() {
+      Server server = api.serverApi().getServer( createdServerId );
+
+      assertNotNull( server );
+      assertEquals( server.id(), createdServerId );
+   }
+
+   @Test( dependsOnMethods = "testCreateServer" )
+   public void testGetAllServers() {
+      List<Server> servers = api.serverApi().getAllServers();
+
+      assertNotNull( servers );
+      assertFalse( servers.isEmpty() );
+   }
+
+   @Test( dependsOnMethods = "testCreateServer" )
+   public void testWaitUntilAvailable() {
+      boolean available = waitUntilAvailable.apply( createdServerId );
+
+      assertTrue( available );
+   }
+
+   @Test( dependsOnMethods = "testWaitUntilAvailable" )
+   public void testUpdateServer() {
+      String requestId = api.serverApi().updateServer(
+              Server.Request.updatingBuilder()
+              .id( createdServerId )
+              .name( "apache-node" )
+              .cores( 2 )
+              .ram( 2 * 1024 )
+              .build() );
+
+      assertNotNull( requestId );
+      waitUntilAvailable.apply( createdServerId );
+
+      Server server = api.serverApi().getServer( createdServerId );
+      assertEquals( server.state(), ProvisioningState.AVAILABLE );
+   }
+
+   @Test( dependsOnMethods = "testUpdateServer" )
+   public void testStopServer() {
+      String requestId = api.serverApi().stopServer( createdServerId );
+      assertNotNull( requestId );
+
+      Predicate<String> waitUntilInactive = Predicates2.retry( new ProvisioningStatusPollingPredicate(
+              api, ProvisioningStatusAware.SERVER, ProvisioningState.INACTIVE ), 2l * 60l, 2l, TimeUnit.SECONDS );
+
+      waitUntilInactive.apply( createdServerId );
+      Server server = api.serverApi().getServer( createdServerId );
+      assertEquals( server.status(), Server.Status.SHUTOFF );
+   }
+
+   @Test( dependsOnMethods = "testStopServer" )
+   public void testStartServer() {
+      String requestId = api.serverApi().startServer( createdServerId );
+      assertNotNull( requestId );
+
+      waitUntilAvailable.apply( createdServerId );
+
+      Server server = api.serverApi().getServer( createdServerId );
+      assertEquals( server.status(), Server.Status.RUNNING );
+   }
+
+   @AfterClass( alwaysRun = true )
+   public void testDeleteServer() {
+      if ( createdServerId != null ) {
+         boolean result = api.serverApi().deleteServer( createdServerId );
+
+         assertTrue( result, "Created test server was not deleted." );
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiMockTest.java
new file mode 100644
index 0000000..d9fd478
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiMockTest.java
@@ -0,0 +1,338 @@
+/*
+ * 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.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import java.util.List;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+import org.jclouds.rest.ResourceNotFoundException;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "ServerApiMockTest" )
+public class ServerApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetAllServers() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/servers.xml" ) ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      try {
+         List<Server> servers = api.getAllServers();
+         assertRequestHasCommonProperties( server.takeRequest(), "<ws:getAllServers/>" );
+         assertNotNull( servers );
+         assertTrue( servers.size() == 2 );
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllServersReturning404() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setResponseCode( 404 ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      try {
+         List<Server> servers = api.getAllServers();
+         assertRequestHasCommonProperties( server.takeRequest() );
+         assertTrue( servers.isEmpty() );
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server.xml" ) ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      String content = "<ws:getServer><serverId>" + id + "</serverId></ws:getServer>";
+      try {
+         Server svr = api.getServer( id );
+         assertRequestHasCommonProperties( server.takeRequest(), content );
+         assertNotNull( svr );
+         assertEquals( svr.id(), id );
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetNonExistingServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setResponseCode( 404 ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      String id = "random-non-existing-id";
+      try {
+         Server srvr = api.getServer( id );
+         assertRequestHasCommonProperties( server.takeRequest() );
+         assertNull( srvr );
+
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testStartServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-start.xml" ) ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      String content = "<ws:startServer><serverId>" + id + "</serverId></ws:startServer>";
+      try {
+         String requestId = api.startServer( id );
+         assertRequestHasCommonProperties( server.takeRequest(), content );
+         assertEquals( requestId, "123456" );
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testStartNonExistingServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setResponseCode( 500 ).setBody( payloadFromResource( "/fault-404.xml" ) ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      String id = "random-non-existing-id";
+      try {
+         String requestId = api.startServer( id );
+         assertRequestHasCommonProperties( server.takeRequest() );
+         fail( "Should've failed." );
+      } catch ( ResourceNotFoundException ex ) {
+         // expected exception
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testStopServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-stop.xml" ) ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      String content = "<ws:stopServer><serverId>" + id + "</serverId></ws:stopServer>";
+      try {
+         String requestId = api.stopServer( id );
+         assertRequestHasCommonProperties( server.takeRequest(), content );
+         assertEquals( requestId, "123456" );
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testResetServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-reset.xml" ) ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      String content = "<ws:resetServer><serverId>" + id + "</serverId></ws:resetServer>";
+      try {
+         String requestId = api.resetServer( id );
+         assertRequestHasCommonProperties( server.takeRequest(), content );
+         assertEquals( requestId, "123456" );
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testCreateServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-create.xml" ) ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      String dataCenterId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      String name = "jclouds-node";
+      String imageId = "some-random-image-id";
+
+      String content = "<ws:createServer>"
+              + "<request>"
+              + "<dataCenterId>" + dataCenterId + "</dataCenterId>"
+              + "<cores>4</cores>"
+              + "<ram>4096</ram>"
+              + "<serverName>" + name + "</serverName>"
+              //              + "<bootFromStorageId></bootFromStorageId>"
+              + "<bootFromImageId>" + imageId + "</bootFromImageId>"
+              + "<internetAccess>true</internetAccess>"
+              + "<lanId>2</lanId>"
+              + "<osType>LINUX</osType>"
+              + "<availabilityZone>ZONE_1</availabilityZone>"
+              + "<cpuHotPlug>true</cpuHotPlug>"
+              + "<ramHotPlug>false</ramHotPlug>"
+              + "<nicHotPlug>true</nicHotPlug>"
+              + "<nicHotUnPlug>false</nicHotUnPlug>"
+              + "<discVirtioHotPlug>true</discVirtioHotPlug>"
+              + "<discVirtioHotUnPlug>false</discVirtioHotUnPlug>"
+              + "</request>"
+              + "</ws:createServer>";
+
+      try {
+         String serverId = api.createServer( Server.Request.creatingBuilder()
+                 .dataCenterId( dataCenterId )
+                 .name( name )
+                 .cores( 4 )
+                 .ram( 4 * 1024 )
+                 .bootFromImageId( imageId )
+                 .hasInternetAccess( Boolean.TRUE )
+                 .lanId( 2 )
+                 .osType( OsType.LINUX )
+                 .availabilityZone( AvailabilityZone.ZONE_1 )
+                 .isCpuHotPlug( Boolean.TRUE )
+                 .isRamHotPlug( Boolean.FALSE )
+                 .isNicHotPlug( Boolean.TRUE )
+                 .isNicHotUnPlug( Boolean.FALSE )
+                 .isDiscVirtioHotPlug( Boolean.TRUE )
+                 .isDiscVirtioHotUnPlug( Boolean.FALSE )
+                 .build() );
+         assertRequestHasCommonProperties( server.takeRequest(), content );
+         assertNotNull( serverId );
+         assertEquals( serverId, "qwertyui-qwer-qwer-qwer-qwertyyuiiop" );
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testUpdateServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-update.xml" ) ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      String serverId = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+      String newName = "apache-node";
+      String storageId = "some-random-storage-id";
+
+      String content = "<ws:updateServer>"
+              + "<request>"
+              + "<serverId>" + serverId + "</serverId>"
+              + "<cores>8</cores>"
+              + "<ram>8192</ram>"
+              + "<serverName>" + newName + "</serverName>"
+              + "<bootFromStorageId>" + storageId + "</bootFromStorageId>"
+//              + "<bootFromImageId>?</bootFromImageId>"
+              + "<osType>OTHER</osType>"
+              + "<availabilityZone>AUTO</availabilityZone>"
+              + "<cpuHotPlug>false</cpuHotPlug>"
+              + "<ramHotPlug>true</ramHotPlug>"
+              + "<nicHotPlug>false</nicHotPlug>"
+              + "<nicHotUnPlug>true</nicHotUnPlug>"
+              + "<discVirtioHotPlug>false</discVirtioHotPlug>"
+              + "<discVirtioHotUnPlug>true</discVirtioHotUnPlug>"
+              + "</request>"
+              + "</ws:updateServer>";
+      try {
+         String requestId = api.updateServer( Server.Request.updatingBuilder()
+                 .id( serverId )
+                 .name( newName )
+                 .cores( 8 )
+                 .ram( 8 * 1024 )
+                 .bootFromStorageId( storageId )
+                 .osType( OsType.OTHER )
+                 .availabilityZone( AvailabilityZone.AUTO )
+                 .isCpuHotPlug( false )
+                 .isRamHotPlug( true )
+                 .isNicHotPlug( false )
+                 .isNicHotUnPlug( true )
+                 .isDiscVirtioHotPlug( false )
+                 .isDiscVirtioHotUnPlug( true )
+                 .build() );
+         assertRequestHasCommonProperties( server.takeRequest(), content );
+         assertNotNull( requestId );
+         assertEquals( requestId, "102458" );
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-delete.xml" ) ) );
+
+      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ServerApi api = pbApi.serverApi();
+
+      String serverId = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+      
+      String content = "<ws:deleteServer><serverId>" + serverId + "</serverId></ws:deleteServer>";
+      try {
+         boolean result = api.deleteServer( serverId );
+         assertRequestHasCommonProperties( server.takeRequest(), content );
+         assertTrue( result );
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandlerTest.java
new file mode 100644
index 0000000..d32b656
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandlerTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser;
+
+import org.jclouds.http.functions.ParseSax;
+import static org.testng.Assert.assertEquals;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "RequestIdOnlyResponseHandlerTest" )
+public class RequestIdOnlyResponseHandlerTest extends BaseResponseHandlerTest<String> {
+
+   @Override
+   protected ParseSax<String> createParser() {
+      return factory.create( injector.getInstance( RequestIdOnlyResponseHandler.class ) );
+   }
+
+   @Test
+   public void testParseResponseFromStartServer() {
+      ParseSax<String> parser = createParser();
+
+      String requestId = parser.parse( payloadFromResource( "/server/server-start.xml" ) );
+
+      assertEquals( requestId, "123456" );
+   }
+
+   @Test
+   public void testParseResponseFromStopServer() {
+      ParseSax<String> parser = createParser();
+
+      String requestId = parser.parse( payloadFromResource( "/server/server-stop.xml" ) );
+
+      assertEquals( requestId, "123456" );
+   }
+
+   @Test
+   public void testParseResponseFromResetServer() {
+      ParseSax<String> parser = createParser();
+
+      String requestId = parser.parse( payloadFromResource( "/server/server-reset.xml" ) );
+
+      assertEquals( requestId, "123456" );
+   }
+
+   @Test
+   public void testParseResponseFromUpdateServer() {
+      ParseSax<String> parser = createParser();
+
+      String requestId = parser.parse( payloadFromResource( "/server/server-update.xml" ) );
+
+      assertEquals( requestId, "102458" );
+   }
+
+   @Test
+   public void testParseResponseFromDeleteServer() {
+      ParseSax<String> parser = createParser();
+
+      String requestId = parser.parse( payloadFromResource( "/server/server-delete.xml" ) );
+
+      assertEquals( requestId, "102459" );
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
index 66259ab..cb84841 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
@@ -40,8 +40,8 @@ public class ServiceFaultResponseHandlerTest extends BaseResponseHandlerTest<Ser
       ServiceFault expected = ServiceFault.builder()
 	      .faultCode(ServiceFault.FaultCode.RESOURCE_NOT_FOUND)
 	      .httpCode(404)
-	      .message("The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id")
-	      .requestId(11122416)
+	      .message("The requested resource could not be found. Please refer to Request Id : 16370720. [VDC-6-404] The requested resource does not exist or already deleted by the users. ResourceId random-non-existing-id")
+	      .requestId(16370720)
 	      .build();
 
       assertEquals(expected, actual);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
index f4222fb..0a3a570 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
@@ -19,7 +19,6 @@ package org.jclouds.profitbricks.http.parser.datacenter;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
-import javax.xml.parsers.ParserConfigurationException;
 
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.DataCenter;
@@ -37,7 +36,7 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
    }
 
    @Test
-   public void testParseResponseFromGetDataCenter() throws ParserConfigurationException {
+   public void testParseResponseFromGetDataCenter() {
       ParseSax<DataCenter> parser = createParser();
       DataCenter actual = parser.parse(payloadFromResource("/datacenter/datacenter.xml"));
       assertNotNull(actual, "Parsed content returned null");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandlerTest.java
new file mode 100644
index 0000000..d09f362
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandlerTest.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.image;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "ImageInfoResponseHandlerTest" )
+public class ImageInfoResponseHandlerTest extends BaseResponseHandlerTest<Image> {
+
+   @Override
+   protected ParseSax<Image> createParser() {
+      return factory.create( injector.getInstance( ImageInfoResponseHandler.class ) );
+   }
+
+   @Test
+   public void testParseResponseFromGetImage() {
+      ParseSax<Image> parser = createParser();
+      Image actual = parser.parse( payloadFromResource( "/image/image.xml" ) );
+      assertNotNull( actual, "Parsed content returned null" );
+
+      Image expected = Image.builder()
+              .isBootable( true )
+              .isCpuHotPlug( true )
+              .isCpuHotUnPlug( false )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .id( "5ad99c9e-9166-11e4-9d74-52540066fee9" )
+              .name( "Ubuntu-14.04-LTS-server-2015-01-01" )
+              .size( 2048f )
+              .type( Image.Type.HDD )
+              .location( Location.US_LAS )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .osType( OsType.LINUX )
+              .isPublic( true )
+              .isRamHotPlug( true )
+              .isRamHotUnPlug( false )
+              .isWriteable( true )
+              .build();
+
+      assertEquals( expected, actual );
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
new file mode 100644
index 0000000..0aa8f58
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.image;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "ImageListResponseHandlerTest" )
+public class ImageListResponseHandlerTest extends BaseResponseHandlerTest<List<Image>> {
+
+   @Override
+   protected ParseSax<List<Image>> createParser() {
+      return factory.create( injector.getInstance( ImageListResponseHandler.class ) );
+   }
+
+   @Test
+   public void testParseResponseFromGetAllImages() {
+      ParseSax<List<Image>> parser = createParser();
+
+      List<Image> actual = parser.parse( payloadFromResource( "/image/images.xml" ) );
+      assertNotNull( actual, "Parsed content returned null" );
+
+      List<Image> expected = ImmutableList.<Image>of(
+              Image.builder()
+              .isBootable( true )
+              .isCpuHotPlug( true )
+              .isCpuHotUnPlug( false )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .id( "e4f73936-9161-11e4-9d74-52540066fee9" )
+              .name( "Ubuntu-12.04-LTS-server-2015-01-01" )
+              .size( 2048f )
+              .type( Image.Type.HDD )
+              .location( Location.DE_FRA )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .osType( OsType.LINUX )
+              .isPublic( true )
+              .isRamHotPlug( true )
+              .isRamHotUnPlug( false )
+              .isWriteable( true )
+              .build(),
+              Image.builder()
+              .isBootable( true )
+              .isCpuHotPlug( true )
+              .isCpuHotUnPlug( false )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .id( "a984a5d3-9163-11e4-9d74-52540066fee9" )
+              .name( "Ubuntu-14.04-LTS-server-2015-01-01" )
+              .size( 2048f )
+              .type( Image.Type.HDD )
+              .location( Location.DE_FRA )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .osType( OsType.LINUX )
+              .isPublic( true )
+              .isRamHotPlug( true )
+              .isRamHotUnPlug( false )
+              .isWriteable( true )
+              .build(),
+              Image.builder()
+              .isBootable( true )
+              .isCpuHotPlug( true )
+              .isCpuHotUnPlug( false )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .id( "5f3cac96-915f-11e4-9d74-52540066fee9" )
+              .name( "Debian-jessie-prerelease-server-2015-01-01" )
+              .size( 2048f )
+              .type( Image.Type.HDD )
+              .location( Location.UNRECOGNIZED )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .osType( OsType.LINUX )
+              .isPublic( true )
+              .isRamHotPlug( true )
+              .isRamHotUnPlug( false )
+              .isWriteable( true )
+              .build(),
+              Image.builder()
+              .isBootable( true )
+              .isCpuHotPlug( true )
+              .isCpuHotUnPlug( false )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .id( "f4742db0-9160-11e4-9d74-52540066fee9" )
+              .name( "Fedora-19-server-2015-01-01" )
+              .size( 2048f )
+              .type( Image.Type.HDD )
+              .location( Location.UNRECOGNIZED )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .osType( OsType.LINUX )
+              .isPublic( true )
+              .isRamHotPlug( true )
+              .isRamHotUnPlug( false )
+              .isWriteable( true )
+              .build(),
+              Image.builder()
+              .isBootable( true )
+              .isCpuHotPlug( true )
+              .isCpuHotUnPlug( false )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .id( "86902c18-9164-11e4-9d74-52540066fee9" )
+              .name( "Ubuntu-12.04-LTS-server-2015-01-01" )
+              .size( 2048f )
+              .type( Image.Type.HDD )
+              .location( Location.UNRECOGNIZED )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .osType( OsType.LINUX )
+              .isPublic( true )
+              .isRamHotPlug( true )
+              .isRamHotUnPlug( false )
+              .isWriteable( true )
+              .build(),
+              Image.builder()
+              .isBootable( true )
+              .isCpuHotPlug( true )
+              .isCpuHotUnPlug( false )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .id( "3b48e3ff-9163-11e4-9d74-52540066fee9" )
+              .name( "Ubuntu-14.04-LTS-server-2015-01-01" )
+              .size( 2048f )
+              .type( Image.Type.HDD )
+              .location( Location.DE_FKB )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .osType( OsType.LINUX )
+              .isPublic( true )
+              .isRamHotPlug( true )
+              .isRamHotUnPlug( false )
+              .isWriteable( true )
+              .build(),
+              Image.builder()
+              .isBootable( true )
+              .isCpuHotPlug( true )
+              .isCpuHotUnPlug( false )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .id( "6ce17716-9164-11e4-9d74-52540066fee9" )
+              .name( "Ubuntu-12.04-LTS-server-2015-01-01" )
+              .size( 2048f )
+              .type( Image.Type.HDD )
+              .location( Location.US_LAS )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .osType( OsType.LINUX )
+              .isPublic( true )
+              .isRamHotPlug( true )
+              .isRamHotUnPlug( false )
+              .isWriteable( true )
+              .build()
+      );
+
+      assertEquals( expected, actual );
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandlerTest.java
new file mode 100644
index 0000000..700b1e5
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandlerTest.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.server;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "ServerIdOnlyResponseHandlerTest" )
+public class ServerIdOnlyResponseHandlerTest extends BaseResponseHandlerTest<String> {
+
+   @Override
+   protected ParseSax<String> createParser() {
+      return factory.create( injector.getInstance( ServerIdOnlyResponseHandler.class ) );
+   }
+
+   @Test
+   public void testParseResponseFromCreateServer() {
+      ParseSax<String> parser = createParser();
+
+      String serverId = parser.parse( payloadFromResource( "/server/server-create.xml" ) );
+
+      assertEquals( "qwertyui-qwer-qwer-qwer-qwertyyuiiop", serverId );
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
new file mode 100644
index 0000000..734e169
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.server;
+
+import java.text.ParseException;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "ServerInfoResponseHandlerTest" )
+public class ServerInfoResponseHandlerTest extends BaseResponseHandlerTest<Server> {
+
+   @Override
+   protected ParseSax<Server> createParser() {
+      return factory.create( injector.getInstance( ServerInfoResponseHandler.class ) );
+   }
+
+   protected DateCodecFactory createDateParser() {
+      return injector.getInstance( DateCodecFactory.class );
+   }
+
+   @Test
+   public void testParseResponseFromGetServer() throws ParseException {
+      ParseSax<Server> parser = createParser();
+
+      Server actual = parser.parse( payloadFromResource( "/server/server.xml" ) );
+      assertNotNull( actual, "Parsed content returned null" );
+
+      DateCodec dateParser = createDateParser().iso8601();
+
+      Server expected = Server.builder()
+              .id( "qwertyui-qwer-qwer-qwer-qwertyyuiiop" )
+              .name( "facebook-node" )
+              .cores( 4 )
+              .ram( 4096 )
+              .hasInternetAccess( true )
+              .state( ProvisioningState.AVAILABLE )
+              .status( Server.Status.RUNNING )
+              .creationTime( dateParser.toDate( "2014-12-04T07:09:23.138Z" ) )
+              .lastModificationTime( dateParser.toDate( "2014-12-12T03:08:35.629Z" ) )
+              .osType( OsType.LINUX )
+              .availabilityZone( AvailabilityZone.AUTO )
+              .isCpuHotPlug( true )
+              .isRamHotPlug( true )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .build();
+
+      assertEquals( actual, expected );
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
new file mode 100644
index 0000000..c9c01c6
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.server;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "ServerListResponseHandlerTest" )
+public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<Server>> {
+
+   @Override
+   protected ParseSax<List<Server>> createParser() {
+      return factory.create( injector.getInstance( ServerListResponseHandler.class ) );
+   }
+
+   protected DateCodecFactory createDateParser() {
+      return injector.getInstance( DateCodecFactory.class );
+   }
+
+   @Test
+   public void testParseResponseFromGetAllServers() {
+      ParseSax<List<Server>> parser = createParser();
+
+      List<Server> actual = parser.parse( payloadFromResource( "/server/servers.xml" ) );
+      assertNotNull( actual, "Parsed content returned null" );
+
+      DateCodec dateParser = createDateParser().iso8601();
+
+      List<Server> expected = ImmutableList.<Server>of(
+              Server.builder()
+              .id( "qwertyui-qwer-qwer-qwer-qwertyyuiiop" )
+              .name( "facebook-node" )
+              .cores( 4 )
+              .ram( 4096 )
+              .hasInternetAccess( true )
+              .state( ProvisioningState.AVAILABLE )
+              .status( Server.Status.RUNNING )
+              .creationTime( dateParser.toDate( "2014-12-04T07:09:23.138Z" ) )
+              .lastModificationTime( dateParser.toDate( "2014-12-12T03:08:35.629Z" ) )
+              .osType( OsType.LINUX )
+              .availabilityZone( AvailabilityZone.AUTO )
+              .isCpuHotPlug( true )
+              .isRamHotPlug( true )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .build(),
+              Server.builder()
+              .id( "asdfghjk-asdf-asdf-asdf-asdfghjklkjl" )
+              .name( "google-node" )
+              .cores( 1 )
+              .ram( 1024 )
+              .hasInternetAccess( false )
+              .state( ProvisioningState.AVAILABLE )
+              .status( Server.Status.RUNNING )
+              .creationTime( dateParser.toDate( "2014-11-12T07:01:00.441Z" ) )
+              .lastModificationTime( dateParser.toDate( "2014-11-12T07:01:00.441Z" ) )
+              .osType( OsType.LINUX )
+              .availabilityZone( AvailabilityZone.AUTO )
+              .isCpuHotPlug( true )
+              .isRamHotPlug( true )
+              .isNicHotPlug( true )
+              .isNicHotUnPlug( true )
+              .isDiscVirtioHotPlug( true )
+              .isDiscVirtioHotUnPlug( true )
+              .build()
+      );
+
+      assertEquals( actual, expected );
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
index 665f1bd..3e5d19a 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
@@ -46,6 +46,13 @@ public class BaseProfitBricksMockTest {
    protected static final String authHeader = BasicAuthentication.basic("username", "password");
    protected static final String provider = "profitbricks";
    protected static final String rootUrl = "/1.3";
+   
+   private static final String SOAP_PREFIX
+	   = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">"
+	   + "<soapenv:Header/>"
+	   + "<soapenv:Body>";
+
+   private static final String SOAP_SUFFIX = "</soapenv:Body></soapenv:Envelope>";
 
    private final Set<Module> modules = ImmutableSet.<Module>of();
 
@@ -70,7 +77,7 @@ public class BaseProfitBricksMockTest {
       server.play();
       return server;
    }
-
+   
    public byte[] payloadFromResource(String resource) {
       try {
          return toStringAndClose(getClass().getResourceAsStream(resource)).getBytes(Charsets.UTF_8);
@@ -78,6 +85,10 @@ public class BaseProfitBricksMockTest {
          throw Throwables.propagate(e);
       }
    }
+   
+   protected static String payloadSoapWithBody(String body){
+      return SOAP_PREFIX.concat( body ).concat( SOAP_SUFFIX );
+   }
 
    protected static void assertRequestHasCommonProperties(final RecordedRequest request) {
       assertEquals(request.getMethod(), "POST");
@@ -85,4 +96,9 @@ public class BaseProfitBricksMockTest {
       assertEquals(request.getHeader(HttpHeaders.AUTHORIZATION), authHeader);
       assertEquals(request.getHeader(HttpHeaders.ACCEPT), MediaType.TEXT_XML);
    }
+   
+   protected static void assertRequestHasCommonProperties(final RecordedRequest request, String content ){
+      assertEquals( new String( request.getBody() ), payloadSoapWithBody( content ) );
+      assertRequestHasCommonProperties( request );
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/datacenter/datacenter-not-found.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter-not-found.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter-not-found.xml
new file mode 100644
index 0000000..486706d
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter-not-found.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+   <S:Body>
+      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
+         <faultcode>S:Server</faultcode>
+         <faultstring>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</faultstring>
+         <detail>
+            <ns2:ProfitbricksServiceFault xmlns:ns2="http://ws.api.profitbricks.com/">
+               <faultCode>RESOURCE_NOT_FOUND</faultCode>
+               <httpCode>404</httpCode>
+               <message>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</message>
+               <requestId>11122416</requestId>
+            </ns2:ProfitbricksServiceFault>
+         </detail>
+      </S:Fault>
+   </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/fault-404.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/fault-404.xml b/providers/profitbricks/src/test/resources/fault-404.xml
index 486706d..430be82 100644
--- a/providers/profitbricks/src/test/resources/fault-404.xml
+++ b/providers/profitbricks/src/test/resources/fault-404.xml
@@ -1,17 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
-   <S:Body>
-      <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
-         <faultcode>S:Server</faultcode>
-         <faultstring>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</faultstring>
-         <detail>
-            <ns2:ProfitbricksServiceFault xmlns:ns2="http://ws.api.profitbricks.com/">
-               <faultCode>RESOURCE_NOT_FOUND</faultCode>
-               <httpCode>404</httpCode>
-               <message>The requested resource could not be found. Please refer to Request Id : 11122416. [VDC-6-404] The requested data center does not exist or already deleted by the users. ResourceId random-non-existing-id</message>
-               <requestId>11122416</requestId>
-            </ns2:ProfitbricksServiceFault>
-         </detail>
-      </S:Fault>
-   </S:Body>
-</S:Envelope>
\ No newline at end of file
+    <S:Body>
+        <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
+            <faultcode>S:Server</faultcode>
+            <faultstring>The requested resource could not be found. Please refer to Request Id : 16370720. [VDC-6-404] The requested resource does not exist or already deleted by the users. ResourceId random-non-existing-id</faultstring>
+            <detail>
+                <ns2:ProfitbricksServiceFault xmlns:ns2="http://ws.api.profitbricks.com/">
+                    <faultCode>RESOURCE_NOT_FOUND</faultCode>
+                    <httpCode>404</httpCode>
+                    <message>The requested resource could not be found. Please refer to Request Id : 16370720. [VDC-6-404] The requested resource does not exist or already deleted by the users. ResourceId random-non-existing-id</message>
+                    <requestId>16370720</requestId>
+                </ns2:ProfitbricksServiceFault>
+            </detail>
+        </S:Fault>
+    </S:Body>
+</S:Envelope>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/image/image-not-found.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/image/image-not-found.xml b/providers/profitbricks/src/test/resources/image/image-not-found.xml
new file mode 100644
index 0000000..98c9f3e
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/image/image-not-found.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
+            <faultcode>S:Server</faultcode>
+            <faultstring>The requested resource could not be found. Please refer to Request Id : 16361390. [VDC-6-404] The requested image does not exist or already deleted by the users. ResourceId random-non-existing-id</faultstring>
+            <detail>
+                <ns2:ProfitbricksServiceFault xmlns:ns2="http://ws.api.profitbricks.com/">
+                    <faultCode>RESOURCE_NOT_FOUND</faultCode>
+                    <httpCode>404</httpCode>
+                    <message>The requested resource could not be found. Please refer to Request Id : 16361390. [VDC-6-404] The requested image does not exist or already deleted by the users. ResourceId random-non-existing-id</message>
+                    <requestId>16361390</requestId>
+                </ns2:ProfitbricksServiceFault>
+            </detail>
+        </S:Fault>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/image/image.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/image/image.xml b/providers/profitbricks/src/test/resources/image/image.xml
new file mode 100644
index 0000000..0e56bad
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/image/image.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getImageResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <bootable>true</bootable>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>false</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <imageId>5ad99c9e-9166-11e4-9d74-52540066fee9</imageId>
+                <imageName>Ubuntu-14.04-LTS-server-2015-01-01</imageName>
+                <imageSize>2048</imageSize>
+                <imageType>HDD</imageType>
+                <location>us/las</location>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <osType>LINUX</osType>
+                <public>true</public>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>false</ramHotUnPlug>
+                <writeable>true</writeable>
+            </return>
+        </ns2:getImageResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/image/images.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/image/images.xml b/providers/profitbricks/src/test/resources/image/images.xml
new file mode 100644
index 0000000..5e09a1d
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/image/images.xml
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getAllImagesResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <bootable>true</bootable>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>false</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <imageId>e4f73936-9161-11e4-9d74-52540066fee9</imageId>
+                <imageName>Ubuntu-12.04-LTS-server-2015-01-01</imageName>
+                <imageSize>2048</imageSize>
+                <imageType>HDD</imageType>
+                <location>de/fra</location>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <osType>LINUX</osType>
+                <public>true</public>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>false</ramHotUnPlug>
+                <writeable>true</writeable>
+            </return>
+            <return>
+                <bootable>true</bootable>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>false</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <imageId>a984a5d3-9163-11e4-9d74-52540066fee9</imageId>
+                <imageName>Ubuntu-14.04-LTS-server-2015-01-01</imageName>
+                <imageSize>2048</imageSize>
+                <imageType>HDD</imageType>
+                <location>de/fra</location>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <osType>LINUX</osType>
+                <public>true</public>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>false</ramHotUnPlug>
+                <writeable>true</writeable>
+            </return>
+            <return>
+                <bootable>true</bootable>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>false</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <imageId>5f3cac96-915f-11e4-9d74-52540066fee9</imageId>
+                <imageName>Debian-jessie-prerelease-server-2015-01-01</imageName>
+                <imageSize>2048</imageSize>
+                <imageType>HDD</imageType>
+                <location>us/lasdev</location>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <osType>LINUX</osType>
+                <public>true</public>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>false</ramHotUnPlug>
+                <writeable>true</writeable>
+            </return>
+            <return>
+                <bootable>true</bootable>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>false</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <imageId>f4742db0-9160-11e4-9d74-52540066fee9</imageId>
+                <imageName>Fedora-19-server-2015-01-01</imageName>
+                <imageSize>2048</imageSize>
+                <imageType>HDD</imageType>
+                <location>us/lasdev</location>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <osType>LINUX</osType>
+                <public>true</public>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>false</ramHotUnPlug>
+                <writeable>true</writeable>
+            </return>
+            <return>
+                <bootable>true</bootable>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>false</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <imageId>86902c18-9164-11e4-9d74-52540066fee9</imageId>
+                <imageName>Ubuntu-12.04-LTS-server-2015-01-01</imageName>
+                <imageSize>2048</imageSize>
+                <imageType>HDD</imageType>
+                <location>us/lasdev</location>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <osType>LINUX</osType>
+                <public>true</public>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>false</ramHotUnPlug>
+                <writeable>true</writeable>
+            </return>
+            <return>
+                <bootable>true</bootable>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>false</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <imageId>3b48e3ff-9163-11e4-9d74-52540066fee9</imageId>
+                <imageName>Ubuntu-14.04-LTS-server-2015-01-01</imageName>
+                <imageSize>2048</imageSize>
+                <imageType>HDD</imageType>
+                <location>de/fkb</location>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <osType>LINUX</osType>
+                <public>true</public>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>false</ramHotUnPlug>
+                <writeable>true</writeable>
+            </return>
+            <return>
+                <bootable>true</bootable>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>false</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <imageId>6ce17716-9164-11e4-9d74-52540066fee9</imageId>
+                <imageName>Ubuntu-12.04-LTS-server-2015-01-01</imageName>
+                <imageSize>2048</imageSize>
+                <imageType>HDD</imageType>
+                <location>us/las</location>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <osType>LINUX</osType>
+                <public>true</public>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>false</ramHotUnPlug>
+                <writeable>true</writeable>
+            </return>
+        </ns2:getAllImagesResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/server/server-create.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server-create.xml b/providers/profitbricks/src/test/resources/server/server-create.xml
new file mode 100644
index 0000000..b0392d6
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/server/server-create.xml
@@ -0,0 +1,13 @@
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:createServerReturn>
+            <return>
+                <requestId>102457</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>2</dataCenterVersion>
+                <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>
+            </return>
+        </ws:createServerReturn>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file


[14/35] jclouds git commit: Profitbricks Snapshot api

Posted by de...@apache.org.
Profitbricks Snapshot api


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

Branch: refs/heads/master
Commit: 36d499b47ff784b6dad1fdf700fa9e84f7359b37
Parents: de2e5e0
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Mon Mar 2 18:03:54 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Sun Mar 8 21:10:20 2015 +0100

----------------------------------------------------------------------
 .../jclouds/profitbricks/ProfitBricksApi.java   |   5 +-
 .../snapshot/CreateSnapshotRequestBinder.java   |  44 ++
 .../snapshot/RollbackSnapshotRequestBinder.java |  43 ++
 .../snapshot/UpdateSnapshotRequestBinder.java   |  53 +++
 .../internal/ProvisioningStatusAware.java       |   2 +-
 .../ProvisioningStatusPollingPredicate.java     |   2 +
 .../jclouds/profitbricks/domain/Snapshot.java   | 432 +++++++++++++++++++
 .../profitbricks/features/SnapshotApi.java      |  87 ++++
 .../snapshot/BaseSnapshotResponseHandler.java   |  83 ++++
 .../snapshot/SnapshotListResponseHandler.java   |  52 +++
 .../snapshot/SnapshotResponseHandler.java       |  48 +++
 .../CreateSnapshotRequestBinderTest.java        |  47 ++
 .../RollbackSnapshotRequestBinderTest.java      |  47 ++
 .../UpdateSnapshotRequestBinderTest.java        |  60 +++
 .../ProvisioningStatusPollingPredicateTest.java |  33 ++
 .../features/SnapshotApiLiveTest.java           | 132 ++++++
 .../features/SnapshotApiMockTest.java           | 262 +++++++++++
 .../SnapshotListResponseHandlerTest.java        | 100 +++++
 .../snapshot/SnapshotResponseHandlerTest.java   |  76 ++++
 .../test/resources/snapshot/snapshot-create.xml |  11 +
 .../test/resources/snapshot/snapshot-delete.xml |  10 +
 .../resources/snapshot/snapshot-rollback.xml    |  12 +
 .../snapshot/snapshot-state-inprocess.xml       |  27 ++
 .../test/resources/snapshot/snapshot-update.xml |  10 +
 .../src/test/resources/snapshot/snapshot.xml    |  27 ++
 .../src/test/resources/snapshot/snapshots.xml   |  47 ++
 26 files changed, 1750 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
index 49d7e8c..af7a31d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -17,12 +17,12 @@
 package org.jclouds.profitbricks;
 
 import java.io.Closeable;
-
 import org.jclouds.profitbricks.features.DataCenterApi;
 import org.jclouds.profitbricks.features.FirewallApi;
 import org.jclouds.profitbricks.features.ImageApi;
 import org.jclouds.profitbricks.features.NicApi;
 import org.jclouds.profitbricks.features.ServerApi;
+import org.jclouds.profitbricks.features.SnapshotApi;
 import org.jclouds.profitbricks.features.StorageApi;
 import org.jclouds.rest.annotations.Delegate;
 
@@ -45,4 +45,7 @@ public interface ProfitBricksApi extends Closeable {
 
    @Delegate
    FirewallApi firewallApi();
+
+   @Delegate
+   SnapshotApi snapshotApi();
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinder.java
new file mode 100644
index 0000000..213a3a8
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinder.java
@@ -0,0 +1,44 @@
+/*
+ * 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.binder.snapshot;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Snapshot;
+
+import static java.lang.String.format;
+
+public class CreateSnapshotRequestBinder extends BaseProfitBricksRequestBinder<Snapshot.Request.CreatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   protected CreateSnapshotRequestBinder() {
+      super("snapshot");
+      this.requestBuilder = new StringBuilder(128);
+   }
+
+   @Override
+   protected String createPayload(Snapshot.Request.CreatePayload payload) {
+      requestBuilder.append("<ws:createSnapshot>")
+	      .append("<request>")
+	      .append(format("<storageId>%s</storageId>", payload.storageId()))
+	      .append(formatIfNotEmpty("<description>%s</description>", payload.description()))
+	      .append(formatIfNotEmpty("<snapshotName>%s</snapshotName>", payload.name()))
+	      .append("</request>")
+	      .append("</ws:createSnapshot>");
+      return requestBuilder.toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinder.java
new file mode 100644
index 0000000..a9997cb
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinder.java
@@ -0,0 +1,43 @@
+/*
+ * 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.binder.snapshot;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Snapshot;
+
+import static java.lang.String.format;
+
+public class RollbackSnapshotRequestBinder extends BaseProfitBricksRequestBinder<Snapshot.Request.RollbackPayload> {
+
+    protected final StringBuilder requestBuilder;
+
+    protected RollbackSnapshotRequestBinder() {
+        super("snapshot");
+        this.requestBuilder = new StringBuilder(128);
+    }
+
+    @Override
+    protected String createPayload(Snapshot.Request.RollbackPayload payload) {
+        requestBuilder.append("<ws:rollbackSnapshot>")
+                .append("<request>")
+                .append(format("<snapshotId>%s</snapshotId>", payload.snapshotId()))
+                .append(format("<storageId>%s</storageId>", payload.storageId()))
+                .append("</request>")
+                .append("</ws:rollbackSnapshot>");
+        return requestBuilder.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
new file mode 100644
index 0000000..e396715
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
@@ -0,0 +1,53 @@
+/*
+ * 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.binder.snapshot;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Snapshot;
+
+public class UpdateSnapshotRequestBinder extends BaseProfitBricksRequestBinder<Snapshot.Request.UpdatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   protected UpdateSnapshotRequestBinder() {
+      super("snapshot");
+      this.requestBuilder = new StringBuilder(128);
+   }
+
+   @Override
+   protected String createPayload(Snapshot.Request.UpdatePayload payload) {
+      requestBuilder.append("<ws:updateSnapshot>")
+	      .append("<request>")
+	      .append(format("<snapshotId>%s</snapshotId>", payload.snapshotId()))
+	      .append(format("<description>%s</description>", payload.description()))
+	      .append(format("<snapshotName>%s</snapshotName>", payload.name()))
+	      .append(formatIfNotEmpty("<bootable>%s</bootable>", payload.bootable()))
+	      .append(formatIfNotEmpty("<osType>%s</osType>", payload.osType()))
+	      .append(formatIfNotEmpty("<cpuHotPlug>%s</cpuHotPlug>", payload.cpuHotplug()))
+	      .append(formatIfNotEmpty("<cpuHotUnPlug>%s</cpuHotUnPlug>", payload.cpuHotunplug()))
+	      .append(formatIfNotEmpty("<ramHotPlug>%s</ramHotPlug>", payload.ramHotplug()))
+	      .append(formatIfNotEmpty("<ramHotUnPlug>%s</ramHotUnPlug>", payload.ramHotunplug()))
+	      .append(formatIfNotEmpty("<nicHotPlug>%s</nicHotPlug>", payload.nicHotplug()))
+	      .append(formatIfNotEmpty("<nicHotUnPlug>%s</nicHotUnPlug>", payload.nicHotunplug()))
+	      .append(formatIfNotEmpty("<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.discVirtioHotplug()))
+	      .append(formatIfNotEmpty("<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.discVirtioHotunplug()))
+	      .append("</request>")
+	      .append("</ws:updateSnapshot>");
+      return requestBuilder.toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
index 7a11009..bd00a3d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
@@ -23,5 +23,5 @@ package org.jclouds.profitbricks.compute.internal;
  */
 public enum ProvisioningStatusAware {
 
-   DATACENTER, SERVER, STORAGE, NIC;
+   DATACENTER, SERVER, STORAGE, NIC, SNAPSHOT;
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
index 7606cac..f38abad 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
@@ -54,6 +54,8 @@ public class ProvisioningStatusPollingPredicate implements Predicate<String> {
             return expect == api.storageApi().getStorage(input).state();
          case NIC:
             return expect == api.nicApi().getNic(input).state();
+         case SNAPSHOT:
+            return expect == api.snapshotApi().getSnapshot(input).state();
          default:
             throw new IllegalArgumentException("Unknown domain '" + domain + "'");
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
new file mode 100644
index 0000000..3182711
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
@@ -0,0 +1,432 @@
+/*
+ * 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;
+
+import com.google.auto.value.AutoValue;
+import org.jclouds.javax.annotation.Nullable;
+
+import java.util.Date;
+
+@AutoValue
+public abstract class Snapshot {
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract String name();
+
+   public abstract float size();
+
+   public abstract boolean bootable();
+
+   @Nullable
+   public abstract String description();
+
+   @Nullable
+   public abstract OsType osType();
+
+   public abstract boolean cpuHotPlug();
+
+   public abstract boolean cpuHotUnPlug();
+
+   public abstract boolean discVirtioHotPlug();
+
+   public abstract boolean discVirtioHotUnPlug();
+
+   public abstract boolean ramHotPlug();
+
+   public abstract boolean ramHotUnPlug();
+
+   public abstract boolean nicHotPlug();
+
+   public abstract boolean nicHotUnPlug();
+
+   @Nullable
+   public abstract Date creationTime();
+
+   @Nullable
+   public abstract Date lastModificationTime();
+
+   @Nullable
+   public abstract ProvisioningState state();
+
+   @Nullable
+   public abstract Location location();
+
+   public static Snapshot create(String id, String name, float size, boolean bootable, String description, OsType osType, boolean cpuHotPlug, boolean cpuHotUnPlug,
+	   boolean discVirtioHotPlug, boolean discVirtioHotUnPlug, boolean ramHotPlug, boolean ramHotUnPlug,
+	   boolean nicHotPlug, boolean nicHotUnPlug, Date creationTime, Date lastModificationTime, ProvisioningState state, Location location) {
+      return new AutoValue_Snapshot(id, name, size, bootable, description, osType, cpuHotPlug, cpuHotUnPlug,
+	      discVirtioHotPlug, discVirtioHotUnPlug, ramHotPlug, ramHotUnPlug,
+	      nicHotPlug, nicHotUnPlug, creationTime, lastModificationTime, state, location);
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+
+      private String id;
+      @Nullable
+      private String name;
+      private float size;
+      private Date creationTime;
+      private Date lastModificationTime;
+      private ProvisioningState state;
+      private boolean bootable;
+      @Nullable
+      private String description;
+      private OsType osType;
+      private boolean cpuHotPlug;
+      private boolean cpuHotUnPlug;
+      private boolean discVirtioHotPlug;
+      private boolean discVirtioHotUnPlug;
+      private boolean ramHotPlug;
+      private boolean ramHotUnPlug;
+      private boolean nicHotPlug;
+      private boolean nicHotUnPlug;
+      private Location location;
+
+      public Builder id(String id) {
+	 this.id = id;
+	 return this;
+      }
+
+      public Builder name(String name) {
+	 this.name = name;
+	 return this;
+      }
+
+      public Builder size(float size) {
+	 this.size = size;
+	 return this;
+      }
+
+      public Builder creationTime(Date creationTime) {
+	 this.creationTime = creationTime;
+	 return this;
+      }
+
+      public Builder lastModificationTime(Date lastModificationTime) {
+	 this.lastModificationTime = lastModificationTime;
+	 return this;
+      }
+
+      public Builder state(ProvisioningState state) {
+	 this.state = state;
+	 return this;
+      }
+
+      public Builder description(String description) {
+	 this.description = description;
+	 return this;
+      }
+
+      public Builder bootable(Boolean bootable) {
+	 this.bootable = bootable;
+	 return this;
+      }
+
+      public Builder osType(OsType osType) {
+	 this.osType = osType;
+	 return this;
+      }
+
+      public Builder cpuHotPlug(boolean cpuHotPlug) {
+	 this.cpuHotPlug = cpuHotPlug;
+	 return this;
+      }
+
+      public Builder cpuHotUnPlug(boolean cpuHotUnPlug) {
+	 this.cpuHotUnPlug = cpuHotUnPlug;
+	 return this;
+      }
+
+      public Builder discVirtioHotPlug(boolean discVirtioHotPlug) {
+	 this.discVirtioHotPlug = discVirtioHotPlug;
+	 return this;
+      }
+
+      public Builder discVirtioHotUnPlug(boolean discVirtioHotUnPlug) {
+	 this.discVirtioHotUnPlug = discVirtioHotUnPlug;
+	 return this;
+      }
+
+      public Builder ramHotPlug(boolean ramHotPlug) {
+	 this.ramHotPlug = ramHotPlug;
+	 return this;
+      }
+
+      public Builder ramHotUnPlug(boolean ramHotUnPlug) {
+	 this.ramHotUnPlug = ramHotUnPlug;
+	 return this;
+      }
+
+      public Builder nicHotPlug(boolean nicHotPlug) {
+	 this.nicHotPlug = nicHotPlug;
+	 return this;
+      }
+
+      public Builder nicHotUnPlug(boolean nicHotUnPlug) {
+	 this.nicHotUnPlug = nicHotUnPlug;
+	 return this;
+      }
+
+      public Builder location(Location location) {
+	 this.location = location;
+	 return this;
+      }
+
+      private Builder fromSnapshot(Snapshot in) {
+	 return this.id(in.id()).name(in.name()).size(in.size()).creationTime(in.creationTime())
+		 .lastModificationTime(in.lastModificationTime()).state(in.state()).bootable(in.bootable()).description(in.description())
+		 .cpuHotPlug(in.cpuHotPlug()).cpuHotUnPlug(in.cpuHotUnPlug()).discVirtioHotPlug(in.discVirtioHotPlug())
+		 .discVirtioHotUnPlug(in.discVirtioHotUnPlug()).ramHotPlug(in.ramHotPlug()).ramHotUnPlug(in.ramHotUnPlug())
+		 .nicHotPlug(in.nicHotPlug()).nicHotUnPlug(in.nicHotUnPlug());
+      }
+
+      public Snapshot build() {
+	 return Snapshot.create(id, name, size, bootable, description, osType, cpuHotPlug, cpuHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, creationTime, lastModificationTime, state, location);
+      }
+   }
+
+   public static final class Request {
+
+      public static CreatePayload.Builder creatingBuilder() {
+	 return new CreatePayload.Builder();
+      }
+
+      public static UpdatePayload.Builder updatingBuilder() {
+	 return new UpdatePayload.Builder();
+      }
+
+      public static RollbackPayload.Builder rollbackBuilder() {
+	 return new RollbackPayload.Builder();
+      }
+
+      @AutoValue
+      public abstract static class CreatePayload {
+
+	 public abstract String storageId();
+
+	 public abstract String description();
+
+	 public abstract String name();
+
+	 public static CreatePayload create(String storageId, String description, String name) {
+	    return new AutoValue_Snapshot_Request_CreatePayload(storageId, description, name);
+	 }
+
+	 public static class Builder {
+
+	    private String storageId;
+	    private String description;
+	    private String name;
+
+	    public Builder storageId(String storageId) {
+	       this.storageId = storageId;
+	       return this;
+	    }
+
+	    public Builder description(String description) {
+	       this.description = description;
+	       return this;
+	    }
+
+	    public Builder name(String name) {
+	       this.name = name;
+	       return this;
+	    }
+
+	    public CreatePayload build() {
+	       return CreatePayload.create(storageId, description, name);
+	    }
+	 }
+      }
+
+      @AutoValue
+      public abstract static class UpdatePayload {
+
+	 public abstract String snapshotId();
+
+	 public abstract String description();
+
+	 public abstract String name();
+
+	 public abstract boolean bootable();
+
+	 @Nullable
+	 public abstract OsType osType();
+
+	 public abstract boolean cpuHotplug();
+
+	 public abstract boolean cpuHotunplug();
+
+	 public abstract boolean ramHotplug();
+
+	 public abstract boolean ramHotunplug();
+
+	 public abstract boolean nicHotplug();
+
+	 public abstract boolean nicHotunplug();
+
+	 public abstract boolean discVirtioHotplug();
+
+	 public abstract boolean discVirtioHotunplug();
+
+	 public static UpdatePayload create(String snapshotId, String description, String name, boolean bootable, OsType osType, boolean cpuHotplug, boolean cpuHotunplug, boolean ramHotplug, boolean ramHotunplug, boolean nicHotplug, boolean nicHotunplug, boolean discVirtioHotplug, boolean discVirtioHotunplug) {
+	    return new AutoValue_Snapshot_Request_UpdatePayload(snapshotId, description, name, bootable, osType, cpuHotplug, cpuHotunplug, ramHotplug, ramHotunplug, nicHotplug, nicHotunplug, discVirtioHotplug, discVirtioHotunplug);
+	 }
+
+	 public static class Builder {
+
+	    private String snapshotId;
+
+	    @Nullable
+	    private String description;
+
+	    @Nullable
+	    private String name;
+
+	    private boolean bootable;
+
+	    private OsType osType;
+
+	    private boolean cpuHotplug;
+
+	    private boolean cpuHotunplug;
+
+	    private boolean ramHotplug;
+
+	    private boolean ramHotunplug;
+
+	    private boolean nicHotplug;
+
+	    private boolean nicHotunplug;
+
+	    private boolean discVirtioHotplug;
+
+	    private boolean discVirtioHotunplug;
+
+	    public Builder snapshotId(String snapshotId) {
+	       this.snapshotId = snapshotId;
+	       return this;
+	    }
+
+	    public Builder description(String description) {
+	       this.description = description;
+	       return this;
+	    }
+
+	    public Builder name(String name) {
+	       this.name = name;
+	       return this;
+	    }
+
+	    public Builder bootable(boolean bootable) {
+	       this.bootable = bootable;
+	       return this;
+	    }
+
+	    public Builder osType(OsType osType) {
+	       this.osType = osType;
+	       return this;
+	    }
+
+	    public Builder cpuHotplug(boolean cpuHotplug) {
+	       this.cpuHotplug = cpuHotplug;
+	       return this;
+	    }
+
+	    public Builder cpuHotunplug(boolean cpuHotunplug) {
+	       this.cpuHotunplug = cpuHotunplug;
+	       return this;
+	    }
+
+	    public Builder ramHotplug(boolean ramHotplug) {
+	       this.ramHotplug = ramHotplug;
+	       return this;
+	    }
+
+	    public Builder ramHotunplug(boolean ramHotunplug) {
+	       this.ramHotunplug = ramHotunplug;
+	       return this;
+	    }
+
+	    public Builder nicHotplug(boolean nicHotplug) {
+	       this.nicHotplug = nicHotplug;
+	       return this;
+	    }
+
+	    public Builder nicHotunplug(boolean nicHotunplug) {
+	       this.nicHotunplug = nicHotunplug;
+	       return this;
+	    }
+
+	    public Builder discVirtioHotplug(boolean discVirtioHotplug) {
+	       this.discVirtioHotplug = discVirtioHotplug;
+	       return this;
+	    }
+
+	    public Builder discVirtioHotunplug(boolean discVirtioHotunplug) {
+	       this.discVirtioHotunplug = discVirtioHotunplug;
+	       return this;
+	    }
+
+	    public UpdatePayload build() {
+	       return UpdatePayload.create(snapshotId, description, name, bootable, osType, cpuHotplug, cpuHotunplug, ramHotplug, ramHotunplug, nicHotplug, nicHotunplug, discVirtioHotplug, discVirtioHotunplug);
+	    }
+	 }
+
+      }
+
+      @AutoValue
+      public abstract static class RollbackPayload {
+
+	 public abstract String snapshotId();
+
+	 public abstract String storageId();
+
+	 public static RollbackPayload create(String snapshotId, String storageId) {
+	    return new AutoValue_Snapshot_Request_RollbackPayload(snapshotId, storageId);
+	 }
+
+	 public static class Builder {
+
+	    private String snapshotId;
+
+	    private String storageId;
+
+	    public Builder snapshotId(String snapshotId) {
+	       this.snapshotId = snapshotId;
+	       return this;
+	    }
+
+	    public Builder storageId(String storageId) {
+	       this.storageId = storageId;
+	       return this;
+	    }
+
+	    public RollbackPayload build() {
+	       return RollbackPayload.create(snapshotId, storageId);
+	    }
+	 }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/SnapshotApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/SnapshotApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/SnapshotApi.java
new file mode 100644
index 0000000..3faa386
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/SnapshotApi.java
@@ -0,0 +1,87 @@
+/*
+ * 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.features;
+
+import java.util.List;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.binder.snapshot.CreateSnapshotRequestBinder;
+import org.jclouds.profitbricks.binder.snapshot.RollbackSnapshotRequestBinder;
+import org.jclouds.profitbricks.binder.snapshot.UpdateSnapshotRequestBinder;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.snapshot.SnapshotResponseHandler;
+import org.jclouds.profitbricks.http.parser.snapshot.SnapshotListResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface SnapshotApi {
+
+   @POST
+   @Named("snapshot:getall")
+   @Payload("<ws:getAllSnapshots/>")
+   @XMLResponseParser(SnapshotListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<Snapshot> getAllSnapshots();
+
+   @POST
+   @Named("snapshot:get")
+   @Payload("<ws:getSnapshot><snapshotId>{snapshotId}</snapshotId></ws:getSnapshot>")
+   @XMLResponseParser(SnapshotResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Snapshot getSnapshot(@PayloadParam("snapshotId") String identifier);
+
+   @POST
+   @Named("snapshot:create")
+   @MapBinder(CreateSnapshotRequestBinder.class)
+   @XMLResponseParser(SnapshotResponseHandler.class)
+   Snapshot createSnapshot(@PayloadParam("snapshot") Snapshot.Request.CreatePayload payload);
+
+   @POST
+   @Named("snapshot:update")
+   @MapBinder(UpdateSnapshotRequestBinder.class)
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String updateSnapshot(@PayloadParam("snapshot") Snapshot.Request.UpdatePayload payload);
+
+   @POST
+   @Named("snapshot:delete")
+   @Payload("<ws:deleteSnapshot><snapshotId>{id}</snapshotId></ws:deleteSnapshot>")
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteSnapshot(@PayloadParam("id") String id);
+
+   @POST
+   @Named("snapshot:rollback")
+   @MapBinder(RollbackSnapshotRequestBinder.class)
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String rollbackSnapshot(@PayloadParam("snapshot") Snapshot.Request.RollbackPayload payload);
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/BaseSnapshotResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/BaseSnapshotResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/BaseSnapshotResponseHandler.java
new file mode 100644
index 0000000..0fa7fd6
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/BaseSnapshotResponseHandler.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.snapshot;
+
+import java.util.Date;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+
+public abstract class BaseSnapshotResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected Snapshot.Builder builder;
+
+   protected final DateCodec dateCodec;
+
+   BaseSnapshotResponseHandler(DateCodecFactory dateCodec) {
+      this.dateCodec = dateCodec.iso8601();
+      this.builder = Snapshot.builder();
+   }
+
+   protected final Date textToIso8601Date() {
+      return dateCodec.toDate(textToStringValue());
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("snapshotId".equals(qName))
+	 builder.id(textToStringValue());
+      else if ("snapshotName".equals(qName))
+	 builder.name(textToStringValue());
+      else if ("snapshotSize".equals(qName))
+	 builder.size(textToFloatValue());
+      else if ("osType".equals(qName))
+	 builder.osType(OsType.fromValue(textToStringValue()));
+      else if ("location".equals(qName))
+	 builder.location(Location.fromId(textToStringValue()));
+      else if ("description".equals(qName))
+	 builder.description(qName);
+      else if ("bootable".equals(qName))
+	 builder.bootable(textToBooleanValue());
+      else if ("cpuHotPlug".equals(qName))
+	 builder.cpuHotPlug(textToBooleanValue());
+      else if ("cpuHotUnPlug".equals(qName))
+	 builder.cpuHotUnPlug(textToBooleanValue());
+      else if ("ramHotPlug".equals(qName))
+	 builder.ramHotPlug(textToBooleanValue());
+      else if ("ramHotUnPlug".equals(qName))
+	 builder.ramHotUnPlug(textToBooleanValue());
+      else if ("nicHotPlug".equals(qName))
+	 builder.nicHotPlug(textToBooleanValue());
+      else if ("nicHotUnPlug".equals(qName))
+	 builder.nicHotUnPlug(textToBooleanValue());
+      else if ("discVirtioHotPlug".equals(qName))
+	 builder.discVirtioHotPlug(textToBooleanValue());
+      else if ("discVirtioHotUnPlug".equals(qName))
+	 builder.discVirtioHotUnPlug(textToBooleanValue());
+      else if ("provisioningState".equals(qName))
+	 builder.state(ProvisioningState.fromValue(textToStringValue()));
+      else if ("creationTimestamp".equals(qName))
+	 builder.creationTime(textToIso8601Date());
+      else if ("modificationTimestamp".equals(qName))
+	 builder.lastModificationTime(textToIso8601Date());
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandler.java
new file mode 100644
index 0000000..ae7a355
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandler.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.snapshot;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.xml.sax.SAXException;
+
+import java.util.List;
+import org.jclouds.date.DateCodecFactory;
+
+public class SnapshotListResponseHandler extends BaseSnapshotResponseHandler<List<Snapshot>> {
+
+   private final List<Snapshot> snapshots;
+
+   @Inject
+   SnapshotListResponseHandler(DateCodecFactory dateCodec) {
+      super(dateCodec);
+      this.snapshots = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName)) {
+	 snapshots.add(builder.build());
+	 builder = Snapshot.builder();
+      }
+      clearTextBuffer();
+   }
+
+   @Override
+   public List<Snapshot> getResult() {
+      return snapshots;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandler.java
new file mode 100644
index 0000000..84316f8
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandler.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.snapshot;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.xml.sax.SAXException;
+
+public class SnapshotResponseHandler extends BaseSnapshotResponseHandler<Snapshot> {
+
+   private boolean done = false;
+
+   @Inject
+   SnapshotResponseHandler(DateCodecFactory dateCodec) {
+      super(dateCodec);
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
+	 return;
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName))
+	 done = true;
+      clearTextBuffer();
+   }
+
+   @Override
+   public Snapshot getResult() {
+      return builder.build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
new file mode 100644
index 0000000..dda2ed6
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.binder.snapshot;
+
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+@Test(groups = "unit", testName = "CreateSnapshotRequestBinderTest")
+public class CreateSnapshotRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      CreateSnapshotRequestBinder binder = new CreateSnapshotRequestBinder();
+
+      Snapshot.Request.CreatePayload payload = Snapshot.Request.CreatePayload.create("123-1233-1324", "describingthesnapshot", "snapshotname");
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload
+	   = ("      <ws:createSnapshot>\n"
+	   + "<request>\n"
+	   + "<storageId>123-1233-1324</storageId>\n"
+	   + "<description>describing the snapshot</description>\n"
+	   + "<snapshotName>snapshot name</snapshotName>\n"
+	   + "</request>\n"
+	   + "</ws:createSnapshot>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
new file mode 100644
index 0000000..206cd79
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.binder.snapshot;
+
+import org.jclouds.profitbricks.domain.Snapshot;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "RollbackSnapshotRequestBinderTest")
+public class RollbackSnapshotRequestBinderTest {
+
+   @Test
+   public void testRollbackPayload() {
+      RollbackSnapshotRequestBinder binder = new RollbackSnapshotRequestBinder();
+
+      Snapshot.Request.RollbackPayload payload = Snapshot.Request.rollbackBuilder()
+	      .snapshotId("snapshot-id")
+	      .storageId("storage-id")
+	      .build();
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload = "<ws:rollbackSnapshot>"
+	   + "<request>"
+	   + "<snapshotId>snapshot-id</snapshotId>"
+	   + "<storageId>storage-id</storageId>"
+	   + "</request>"
+	   + "</ws:rollbackSnapshot>".replaceAll("\\s", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinderTest.java
new file mode 100644
index 0000000..3acb8e1
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinderTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.binder.snapshot;
+
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.testng.annotations.Test;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+@Test(groups = "unit", testName = "UpdateSnapshotRequestBinderTest")
+public class UpdateSnapshotRequestBinderTest {
+
+   @Test
+   public void testUpdatePayload() {
+      UpdateSnapshotRequestBinder binder = new UpdateSnapshotRequestBinder();
+
+      Snapshot.Request.UpdatePayload payload = Snapshot.Request.UpdatePayload.create("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh", "description", "snapshot-name", true, OsType.LINUX, true, true, true, true, true, true, true, true);
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+
+   }
+
+   private final String expectedPayload
+           = "<ws:updateSnapshot>"
+           + "<request>"
+           + "<snapshotId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</snapshotId>"
+           + "<description>description</description>"
+           + "<snapshotName>snapshot-name</snapshotName>"
+           + "<bootable>true</bootable>"
+           + "<osType>LINUX</osType>"
+           + "<cpuHotPlug>true</cpuHotPlug>"
+           + "<cpuHotUnPlug>true</cpuHotUnPlug>"
+           + "<ramHotPlug>true</ramHotPlug>"
+           + "<ramHotUnPlug>true</ramHotUnPlug>"
+           + "<nicHotPlug>true</nicHotPlug>"
+           + "<nicHotUnPlug>true</nicHotUnPlug>"
+           + "<discVirtioHotPlug>true</discVirtioHotPlug>"
+           + "<discVirtioHotUnPlug>true</discVirtioHotUnPlug>"
+           + "</request>"
+           + "</ws:updateSnapshot>".replaceAll("\\s", "");
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
index f69fc02..857a8ff 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
@@ -136,5 +136,38 @@ public class ProvisioningStatusPollingPredicateTest extends BaseProfitBricksMock
          server.shutdown();
       }
    }
+   
+   @Test
+   public void testSnapshotPredicate() throws Exception{
+        MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/snapshot/snapshot-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/snapshot/snapshot.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.SNAPSHOT, ProvisioningState.AVAILABLE),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+      try {
+         waitUntilAvailable.apply(id);
+         ProvisioningState finalState = pbApi.snapshotApi().getSnapshot(id).state();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertEquals(finalState, ProvisioningState.AVAILABLE);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/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
new file mode 100644
index 0000000..957555b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiLiveTest.java
@@ -0,0 +1,132 @@
+/*
+ * 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.features;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.testng.annotations.Test;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.util.Predicates2;
+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;
+
+@Test(groups = "live", testName = "SnapshotApiLiveTest", singleThreaded = true)
+public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
+
+   protected Predicate<String> snapshotWaitingPredicate;
+   private String snapshotId;
+   private String storageId;
+
+   @Override
+   protected void initialize() {
+      super.initialize();
+
+      initializeWaitPredicate();
+
+      List<Storage> storages = api.storageApi().getAllStorages();
+      assertFalse(storages.isEmpty(), "Must atleast have 1 storage available for snapshot testing.");
+
+      storageId = Iterables.getFirst(storages, null).id();
+   }
+
+   @Test
+   public void testCreateSnapshot() {
+      Snapshot snapshot = api.snapshotApi().createSnapshot(Snapshot.Request.CreatePayload.create(storageId, "my description", "test snapshot"));
+
+      assertNotNull(snapshot);
+
+      snapshotWaitingPredicate.apply(snapshot.id());
+
+      snapshotId = snapshot.id();
+   }
+
+   @Test(dependsOnMethods = "testCreateSnapshot")
+   public void testGetAllSnapshots() {
+      List<Snapshot> snapshots = api.snapshotApi().getAllSnapshots();
+
+      assertNotNull(snapshots);
+      assertTrue(snapshots.size() > 0);
+   }
+
+   @Test(dependsOnMethods = "testCreateSnapshot")
+   public void testGetSnapshot() {
+      Snapshot snapshot = api.snapshotApi().getSnapshot(snapshotId);
+
+      assertNotNull(snapshot);
+      assertEquals(snapshot.id(), snapshotId);
+   }
+
+   @Test(dependsOnMethods = "testCreateSnapshot")
+   public void testUpdateSnapshot() {
+
+      String newName = "new name";
+
+      api.snapshotApi().updateSnapshot(Snapshot.Request.updatingBuilder()
+	      .snapshotId(snapshotId)
+	      .description("new description")
+	      .name(newName)
+	      .bootable(true)
+	      .osType(OsType.LINUX)
+	      .cpuHotplug(true)
+	      .cpuHotunplug(true)
+	      .discVirtioHotplug(true)
+	      .discVirtioHotunplug(true)
+	      .nicHotplug(true)
+	      .nicHotunplug(true)
+	      .ramHotplug(true)
+	      .ramHotunplug(true)
+	      .build());
+
+      Snapshot snapshot = api.snapshotApi().getSnapshot(snapshotId);
+
+      assertNotNull(snapshot);
+      assertEquals(snapshot.name(), newName);
+   }
+
+   @Test(dependsOnMethods = "testCreateSnapshot")
+   public void testRollbackSnapshot() {
+      String result = api.snapshotApi().rollbackSnapshot(Snapshot.Request.RollbackPayload.create(snapshotId, storageId));
+
+      assertNotNull(result);
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void testDeleteSnapshot() {
+      boolean result = api.snapshotApi().deleteSnapshot(snapshotId);
+
+      assertTrue(result);
+   }
+
+   private void initializeWaitPredicate() {
+      this.snapshotWaitingPredicate = Predicates2.retry(
+	      new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.SNAPSHOT, ProvisioningState.AVAILABLE),
+	      2l * 60l, 2l, TimeUnit.SECONDS);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
new file mode 100644
index 0000000..80342b0
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
@@ -0,0 +1,262 @@
+/*
+ * 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.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import org.testng.annotations.Test;
+
+import java.util.List;
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+import org.testng.Assert;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+/**
+ * Mock tests for the {@link org.jclouds.profitbricks.features.DataCenterApi} class
+ */
+@Test(groups = "unit", testName = "SnapshotApiMockTest")
+public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetAllSnapshots() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/snapshot/snapshots.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      SnapshotApi api = pbApi.snapshotApi();
+
+      try {
+	 List<Snapshot> snapshots = api.getAllSnapshots();
+	 assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllSnapshots/>");
+	 assertNotNull(snapshots);
+	 assertEquals(snapshots.size(), 2);
+      } finally {
+	 pbApi.close();
+	 server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllSnapshotsReturning404() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      SnapshotApi api = pbApi.snapshotApi();
+
+      try {
+	 List<Snapshot> snapshots = api.getAllSnapshots();
+	 assertRequestHasCommonProperties(server.takeRequest());
+	 assertTrue(snapshots.isEmpty());
+      } finally {
+	 pbApi.close();
+	 server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetSnapshot() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/snapshot/snapshot.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      SnapshotApi api = pbApi.snapshotApi();
+
+      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+
+      String content = "<ws:getSnapshot><snapshotId>" + id + "</snapshotId></ws:getSnapshot>";
+
+      try {
+	 Snapshot snapshot = api.getSnapshot(id);
+	 assertRequestHasCommonProperties(server.takeRequest(), content);
+	 assertNotNull(snapshot);
+	 assertEquals(snapshot.id(), id);
+      } finally {
+	 pbApi.close();
+	 server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetNonExistingSnapshot() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      SnapshotApi api = pbApi.snapshotApi();
+
+      String id = "random-non-existing-id";
+      try {
+	 Snapshot snapshot = api.getSnapshot(id);
+	 assertRequestHasCommonProperties(server.takeRequest());
+	 assertNull(snapshot);
+      } finally {
+	 pbApi.close();
+	 server.shutdown();
+      }
+   }
+
+   @Test
+   public void testCreateSnapshot() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/snapshot/snapshot-create.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      SnapshotApi api = pbApi.snapshotApi();
+
+      String storageId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+
+      String content = "<ws:createSnapshot>"
+	      + "<request>"
+	      + "<storageId>" + storageId + "</storageId>"
+	      + "<description>description</description>"
+	      + "<snapshotName>snapshot-name</snapshotName>"
+	      + "</request>"
+	      + "</ws:createSnapshot>";
+
+      try {
+	 Snapshot snapshot = api.createSnapshot(
+		 Snapshot.Request.creatingBuilder()
+		 .storageId(storageId)
+		 .description("description")
+		 .name("snapshot-name")
+		 .build());
+	 assertRequestHasCommonProperties(server.takeRequest(), content);
+	 assertNotNull(snapshot.id());
+	 assertEquals(snapshot.id(), "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
+
+      } finally {
+	 pbApi.close();
+	 server.shutdown();
+      }
+   }
+
+   @Test
+   public void testUpdateSnapshot() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/snapshot/snapshot-update.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      SnapshotApi api = pbApi.snapshotApi();
+
+      String snapshotId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+
+      String content = "<ws:updateSnapshot>"
+	      + "<request>"
+	      + "<snapshotId>" + snapshotId + "</snapshotId>"
+	      + "<description>description</description>"
+	      + "<snapshotName>snapshot-name</snapshotName>"
+	      + "<bootable>false</bootable>"
+	      + "<osType>LINUX</osType>"
+	      + "<cpuHotPlug>false</cpuHotPlug>"
+	      + "<cpuHotUnPlug>false</cpuHotUnPlug>"
+	      + "<ramHotPlug>false</ramHotPlug>"
+	      + "<ramHotUnPlug>false</ramHotUnPlug>"
+	      + "<nicHotPlug>false</nicHotPlug>"
+	      + "<nicHotUnPlug>false</nicHotUnPlug>"
+	      + "<discVirtioHotPlug>false</discVirtioHotPlug>"
+	      + "<discVirtioHotUnPlug>false</discVirtioHotUnPlug>"
+	      + "</request>"
+	      + "</ws:updateSnapshot>";
+
+      try {
+	 String requestId = api.updateSnapshot(Snapshot.Request.updatingBuilder()
+		 .snapshotId(snapshotId)
+		 .name("snapshot-name")
+		 .description("description")
+		 .osType(OsType.LINUX)
+		 .build());
+	 assertRequestHasCommonProperties(server.takeRequest(), content);
+	 assertNotNull(requestId);
+      } finally {
+	 pbApi.close();
+	 server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteSnapshot() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/snapshot/snapshot-delete.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      SnapshotApi api = pbApi.snapshotApi();
+
+      String snapshotId = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+      String content = "<ws:deleteSnapshot><snapshotId>" + snapshotId + "</snapshotId></ws:deleteSnapshot>";
+
+      try {
+	 boolean result = api.deleteSnapshot(snapshotId);
+	 assertRequestHasCommonProperties(server.takeRequest(), content);
+	 assertTrue(result);
+      } finally {
+	 pbApi.close();
+	 server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteNonExistingSnapshot() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      SnapshotApi api = pbApi.snapshotApi();
+
+      String id = "random-non-existing-id";
+      try {
+	 boolean result = api.deleteSnapshot(id);
+	 assertRequestHasCommonProperties(server.takeRequest());
+	 Assert.assertFalse(result);
+      } finally {
+	 pbApi.close();
+	 server.shutdown();
+      }
+   }
+
+   @Test
+   public void testRollbackSnapshot() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/snapshot/snapshot-rollback.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      SnapshotApi api = pbApi.snapshotApi();
+
+      String snapshotId = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+      String storageId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+
+      String content = "<ws:rollbackSnapshot><request><snapshotId>" + snapshotId + "</snapshotId><storageId>" + storageId + "</storageId></request></ws:rollbackSnapshot>";
+      try {
+	 String result = api.rollbackSnapshot(Snapshot.Request.rollbackBuilder()
+		 .snapshotId(snapshotId)
+		 .storageId(storageId)
+		 .build());
+	 assertRequestHasCommonProperties(server.takeRequest(), content);
+	 assertNotNull(result);
+      } finally {
+	 pbApi.close();
+	 server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
new file mode 100644
index 0000000..38dfa1e
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.snapshot;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "SnapshotListResponseHandlerTest")
+public class SnapshotListResponseHandlerTest extends BaseResponseHandlerTest<List<Snapshot>> {
+
+   @Override
+   protected ParseSax<List<Snapshot>> createParser() {
+      return factory.create(injector.getInstance(SnapshotListResponseHandler.class));
+   }
+
+   protected DateCodecFactory createDateParser() {
+      return injector.getInstance(DateCodecFactory.class);
+   }
+
+   @Test
+   public void testParseResponseFromGetSnapshot() {
+      ParseSax<List<Snapshot>> parser = createParser();
+
+      List<Snapshot> actual = parser.parse(payloadFromResource("/snapshot/snapshots.xml"));
+      assertNotNull(actual);
+
+      DateCodec dateParser = createDateParser().iso8601();
+
+      List<Snapshot> expected = Lists.newArrayList();
+
+      expected.add(Snapshot.builder()
+	      .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+	      .description("description")
+	      .size(1024)
+	      .name("snapshot01")
+	      .state(ProvisioningState.AVAILABLE)
+	      .bootable(true)
+	      .osType(OsType.LINUX)
+	      .cpuHotPlug(true)
+	      .cpuHotUnPlug(true)
+	      .discVirtioHotPlug(true)
+	      .discVirtioHotUnPlug(true)
+	      .ramHotPlug(true)
+	      .ramHotUnPlug(true)
+	      .nicHotPlug(true)
+	      .nicHotUnPlug(true)
+	      .location(Location.US_LAS)
+	      .creationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
+	      .lastModificationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
+	      .build());
+
+      expected.add(Snapshot.builder()
+	      .id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy")
+	      .description("description")
+	      .size(1024)
+	      .name("snapshot02")
+	      .state(ProvisioningState.AVAILABLE)
+	      .bootable(true)
+	      .osType(OsType.LINUX)
+	      .cpuHotPlug(true)
+	      .cpuHotUnPlug(true)
+	      .discVirtioHotPlug(true)
+	      .discVirtioHotUnPlug(true)
+	      .ramHotPlug(true)
+	      .ramHotUnPlug(true)
+	      .nicHotPlug(true)
+	      .nicHotUnPlug(true)
+	      .location(Location.US_LAS)
+	      .creationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
+	      .lastModificationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
+	      .build());
+
+      assertEquals(actual, expected);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
new file mode 100644
index 0000000..9928e92
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.snapshot;
+
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "ServerResponseHandlerTest")
+public class SnapshotResponseHandlerTest extends BaseResponseHandlerTest<Snapshot> {
+
+   @Override
+   protected ParseSax<Snapshot> createParser() {
+      return factory.create(injector.getInstance(SnapshotResponseHandler.class));
+   }
+
+   protected DateCodecFactory createDateParser() {
+      return injector.getInstance(DateCodecFactory.class);
+   }
+
+   @Test
+   public void testParseResponseFromGetSnapshot() {
+      ParseSax<Snapshot> parser = createParser();
+
+      Snapshot actual = parser.parse(payloadFromResource("/snapshot/snapshot.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      DateCodec dateParser = createDateParser().iso8601();
+
+      Snapshot expected = Snapshot.builder()
+	      .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+	      .description("description")
+	      .size(1024)
+	      .name("snapshot01")
+	      .state(ProvisioningState.AVAILABLE)
+	      .bootable(true)
+	      .osType(OsType.LINUX)
+	      .cpuHotPlug(true)
+	      .cpuHotUnPlug(true)
+	      .discVirtioHotPlug(true)
+	      .discVirtioHotUnPlug(true)
+	      .ramHotPlug(true)
+	      .ramHotUnPlug(true)
+	      .nicHotPlug(true)
+	      .nicHotUnPlug(true)
+	      .location(Location.US_LAS)
+	      .creationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
+	      .lastModificationTime(dateParser.toDate("2015-01-26T07:09:23.138Z"))
+	      .build();
+
+      assertEquals(actual, expected);
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/resources/snapshot/snapshot-create.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/snapshot/snapshot-create.xml b/providers/profitbricks/src/test/resources/snapshot/snapshot-create.xml
new file mode 100644
index 0000000..06a537d
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/snapshot/snapshot-create.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:createSnapshotReturn xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>12345678</requestId>
+                <snapshotId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</snapshotId>
+            </return>
+        </ns2:createSnapshotReturn>
+    </S:Body>
+</S:Envelope>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/resources/snapshot/snapshot-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/snapshot/snapshot-delete.xml b/providers/profitbricks/src/test/resources/snapshot/snapshot-delete.xml
new file mode 100644
index 0000000..45bf1a3
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/snapshot/snapshot-delete.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:deleteSnapshotResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>123456789</requestId>
+            </return>
+        </ns2:deleteSnapshotResponse>
+    </S:Body>
+</S:Envelope>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/resources/snapshot/snapshot-rollback.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/snapshot/snapshot-rollback.xml b/providers/profitbricks/src/test/resources/snapshot/snapshot-rollback.xml
new file mode 100644
index 0000000..661ce21
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/snapshot/snapshot-rollback.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:rollbackSnapshotResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>1234567890</requestId>
+                <dataCenterId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</dataCenterId>
+                <dataCenterVersion>1</dataCenterVersion>
+            </return>
+        </ns2:rollbackSnapshotResponse>
+    </S:Body>
+</S:Envelope>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/resources/snapshot/snapshot-state-inprocess.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/snapshot/snapshot-state-inprocess.xml b/providers/profitbricks/src/test/resources/snapshot/snapshot-state-inprocess.xml
new file mode 100644
index 0000000..9f8acff
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/snapshot/snapshot-state-inprocess.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getSnapshotResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <snapshotId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</snapshotId>
+                <description>description</description>
+                <snapshotSize>1024</snapshotSize>
+                <snapshotName>snapshot01</snapshotName>
+                <provisioningState>INPROCESS</provisioningState>
+                <bootable>true</bootable>
+                <osType>LINUX</osType>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>true</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>true</ramHotUnPlug>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <creationTimestamp>2015-01-26T07:09:23.138Z</creationTimestamp>
+                <modificationTimestamp>2015-01-26T07:09:23.138Z</modificationTimestamp>
+                <location>us/las</location>
+            </return>
+        </ns2:getSnapshotResponse>
+    </S:Body>
+</S:Envelope>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/resources/snapshot/snapshot-update.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/snapshot/snapshot-update.xml b/providers/profitbricks/src/test/resources/snapshot/snapshot-update.xml
new file mode 100644
index 0000000..028cce0
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/snapshot/snapshot-update.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:updateSnapshotResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>12345678</requestId>
+            </return>
+        </ns2:updateSnapshotResponse>
+    </S:Body>
+</S:Envelope>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/resources/snapshot/snapshot.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/snapshot/snapshot.xml b/providers/profitbricks/src/test/resources/snapshot/snapshot.xml
new file mode 100644
index 0000000..d406be1
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/snapshot/snapshot.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getSnapshotResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <snapshotId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</snapshotId>
+                <description>description</description>
+                <snapshotSize>1024</snapshotSize>
+                <snapshotName>snapshot01</snapshotName>
+                <provisioningState>AVAILABLE</provisioningState>
+                <bootable>true</bootable>
+                <osType>LINUX</osType>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>true</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>true</ramHotUnPlug>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <creationTimestamp>2015-01-26T07:09:23.138Z</creationTimestamp>
+                <modificationTimestamp>2015-01-26T07:09:23.138Z</modificationTimestamp>
+                <location>us/las</location>
+            </return>
+        </ns2:getSnapshotResponse>
+    </S:Body>
+</S:Envelope>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/36d499b4/providers/profitbricks/src/test/resources/snapshot/snapshots.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/snapshot/snapshots.xml b/providers/profitbricks/src/test/resources/snapshot/snapshots.xml
new file mode 100644
index 0000000..d59826a
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/snapshot/snapshots.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getAllSnapshotsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+            <snapshotId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</snapshotId>
+            <description>description</description>
+            <snapshotSize>1024</snapshotSize>
+            <snapshotName>snapshot01</snapshotName>
+            <provisioningState>AVAILABLE</provisioningState>
+            <bootable>true</bootable>
+            <osType>LINUX</osType>
+            <cpuHotPlug>true</cpuHotPlug>
+            <cpuHotUnPlug>true</cpuHotUnPlug>
+            <discVirtioHotPlug>true</discVirtioHotPlug>
+            <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+            <ramHotPlug>true</ramHotPlug>
+            <ramHotUnPlug>true</ramHotUnPlug>
+            <nicHotPlug>true</nicHotPlug>
+            <nicHotUnPlug>true</nicHotUnPlug>
+            <creationTimestamp>2015-01-26T07:09:23.138Z</creationTimestamp>
+            <modificationTimestamp>2015-01-26T07:09:23.138Z</modificationTimestamp>
+            <location>us/las</location>
+        </return>
+            <return>
+                <snapshotId>qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy</snapshotId>
+                <description>description</description>
+                <snapshotSize>1024</snapshotSize>
+                <snapshotName>snapshot02</snapshotName>
+                <provisioningState>AVAILABLE</provisioningState>
+                <bootable>true</bootable>
+                <osType>LINUX</osType>
+                <cpuHotPlug>true</cpuHotPlug>
+                <cpuHotUnPlug>true</cpuHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+                <ramHotPlug>true</ramHotPlug>
+                <ramHotUnPlug>true</ramHotUnPlug>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <creationTimestamp>2015-01-26T07:09:23.138Z</creationTimestamp>
+                <modificationTimestamp>2015-01-26T07:09:23.138Z</modificationTimestamp>
+                <location>us/las</location>
+            </return>
+        </ns2:getAllSnapshotsResponse>
+    </S:Body>
+</S:Envelope>


[11/35] jclouds git commit: JCLOUDS-702: JCloud ProfitBricks provider - NIC & Firewall API

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandlerTest.java
new file mode 100644
index 0000000..a5fc74d
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandlerTest.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.firewall;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.List;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+@Test(groups = "unit", testName = "FirewallListResponseHandlerTest")
+public class FirewallListResponseHandlerTest extends BaseResponseHandlerTest<List<Firewall>> {
+
+   @Override
+   protected ParseSax<List<Firewall>> createParser() {
+      return factory.create(injector.getInstance(FirewallListResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromGetAllFirewalls() {
+      ParseSax<List<Firewall>> parser = createParser();
+      List<Firewall> actual = parser.parse(payloadFromResource("/firewall/firewalls.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      List<Firewall> expected = ImmutableList.of(
+              Firewall.builder()
+              .active(true)
+              .id("firewall-id")
+              .nicId("nic-id")
+              .state(ProvisioningState.AVAILABLE)
+              .rules(ImmutableList.of(
+                              Firewall.Rule.builder()
+                              .id("firewall-rule-id")
+                              .name("name")
+                              .portRangeEnd(45678)
+                              .portRangeStart(12345)
+                              .protocol(Firewall.Protocol.TCP)
+                              .sourceIp("192.168.0.1")
+                              .sourceMac("aa:bb:cc:dd:ee:ff")
+                              .targetIp("192.168.0.2")
+                              .build()
+                      ))
+              .build(),
+              Firewall.builder()
+              .active(true)
+              .id("firewall-id2")
+              .nicId("nic-id")
+              .state(ProvisioningState.AVAILABLE)
+              .rules(ImmutableList.of(
+                              Firewall.Rule.builder()
+                              .id("firewall-rule-id2")
+                              .name("name")
+                              .portRangeEnd(56789)
+                              .portRangeStart(23456)
+                              .protocol(Firewall.Protocol.TCP)
+                              .sourceIp("192.168.0.2")
+                              .sourceMac("aa:bb:cc:dd:ee:ff")
+                              .targetIp("192.168.0.3")
+                              .build()
+                      ))
+              .build()
+      );
+
+      assertEquals(actual, expected);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/firewall/FirewallResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/firewall/FirewallResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/firewall/FirewallResponseHandlerTest.java
new file mode 100644
index 0000000..eeb4cba
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/firewall/FirewallResponseHandlerTest.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.firewall;
+
+import java.util.List;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.profitbricks.domain.Firewall.Protocol;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+@Test(groups = "unit", testName = "FirewallResponseHandlerTest")
+public class FirewallResponseHandlerTest extends BaseResponseHandlerTest<Firewall> {
+
+   @Override
+   protected ParseSax<Firewall> createParser() {
+      return factory.create(injector.getInstance(FirewallResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromGetFirewall() {
+      ParseSax<Firewall> parser = createParser();
+      Firewall actual = parser.parse(payloadFromResource("/firewall/firewall.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+      List<Firewall.Rule> firewallRules = ImmutableList.of(
+              Firewall.Rule.builder()
+              .id("firewall-rule-id")
+              .name("name")
+              .portRangeEnd(45678)
+              .portRangeStart(12345)
+              .protocol(Protocol.TCP)
+              .sourceIp("192.168.0.1")
+              .sourceMac("aa:bb:cc:dd:ee:ff")
+              .targetIp("192.168.0.2")
+              .build());
+
+      Firewall expected = Firewall.builder()
+              .active(true)
+              .id("firewall-id")
+              .nicId("nic-id")
+              .state(ProvisioningState.AVAILABLE)
+              .rules(firewallRules)
+              .build();
+
+      assertEquals(expected, actual);
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandlerTest.java
new file mode 100644
index 0000000..ee0cac0
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandlerTest.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.nic;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "NicListResponseHandlerTest")
+public class NicListResponseHandlerTest extends BaseResponseHandlerTest<List<Nic>> {
+
+   @Override
+   protected ParseSax<List<Nic>> createParser() {
+      return factory.create(injector.getInstance(NicListResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromGetAllNic() {
+      ParseSax<List<Nic>> parser = createParser();
+      List<Nic> actual = parser.parse(payloadFromResource("/nic/nics.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      List<Nic> expected = ImmutableList.of(
+              Nic.builder()
+              .dataCenterId("datacenter-id")
+              .id("nic-id")
+              .name("nic-name")
+              .lanId(1)
+              .internetAccess(true)
+              .serverId("server-id")
+              .ip("192.168.0.1")
+              .macAddress("mac-address")
+              .firewall(
+                      Firewall.builder()
+                      .active(true)
+                      .id("firewall-id")
+                      .nicId("nic-id")
+                      .state(ProvisioningState.AVAILABLE)
+                      .build()
+              )
+              .dhcpActive(true)
+              .gatewayIp("192.168.0.0")
+              .state(ProvisioningState.AVAILABLE)
+              .build(),
+              Nic.builder()
+              .dataCenterId("datacenter-id")
+              .id("nic-id2")
+              .name("nick")
+              .lanId(1)
+              .internetAccess(false)
+              .serverId("server-id")
+              .ips(ImmutableList.of(
+                              "192.168.0.2",
+                              "192.168.0.3",
+                              "192.168.0.4"
+                      ))
+              .macAddress("mac-address")
+              .firewall(
+                      Firewall.builder()
+                      .active(false)
+                      .id("firewall-id2")
+                      .nicId("nic-id")
+                      .state(ProvisioningState.AVAILABLE)
+                      .build()
+              )
+              .dhcpActive(false)
+              .gatewayIp("192.168.0.0")
+              .state(ProvisioningState.AVAILABLE)
+              .build()
+      );
+
+      assertEquals(actual, expected);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandlerTest.java
new file mode 100644
index 0000000..a14b0d4
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandlerTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.nic;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "NicResponseHandlerTest")
+public class NicResponseHandlerTest extends BaseResponseHandlerTest<Nic> {
+
+   @Override
+   protected ParseSax<Nic> createParser() {
+      return factory.create(injector.getInstance(NicResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromGetNic() {
+      ParseSax<Nic> parser = createParser();
+      Nic actual = parser.parse(payloadFromResource("/nic/nic.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      Nic expected = Nic.builder()
+              .id("12345678-abcd-efgh-ijkl-987654321000")
+              .dataCenterId("0")
+              .name("name")
+              .lanId(1)
+              .internetAccess(true)
+              .serverId("server-id")
+              .ip("192.168.0.1")
+              .macAddress("mac-address")
+              .dhcpActive(true)
+              .gatewayIp("gateway-ip")
+              .state(ProvisioningState.AVAILABLE)
+              .firewall(
+                      Firewall.builder()
+                      .active(true)
+                      .id("firewall-id")
+                      .nicId("nic-id")
+                      .state(ProvisioningState.AVAILABLE)
+                      .build())
+              .build();
+
+      assertEquals(actual, expected);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
index b050568..eb8feb9 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
@@ -23,13 +23,18 @@ import org.jclouds.date.DateCodec;
 import org.jclouds.date.DateCodecFactory;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.Nic;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Storage;
 import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
 
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableList;
+
 @Test(groups = "unit", testName = "ServerInfoResponseHandlerTest")
 public class ServerInfoResponseHandlerTest extends BaseResponseHandlerTest<Server> {
 
@@ -69,6 +74,37 @@ public class ServerInfoResponseHandlerTest extends BaseResponseHandlerTest<Serve
               .isNicHotUnPlug(true)
               .isDiscVirtioHotPlug(true)
               .isDiscVirtioHotUnPlug(true)
+              .storages(ImmutableList.<Storage>of(
+                              Storage.builder()
+                              .bootDevice(Boolean.TRUE)
+                              .busType(Storage.BusType.VIRTIO)
+                              .deviceNumber(1)
+                              .size(40f)
+                              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+                              .name("facebook-storage")
+                              .build()
+                      )
+              )
+              .nics(ImmutableList.<Nic>of(
+                              Nic.builder()
+                              .dataCenterId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+                              .id("qwqwqwqw-wewe-erer-rtrt-tytytytytyty")
+                              .lanId(1)
+                              .internetAccess(true)
+                              .serverId("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+                              .ip("173.252.120.6")
+                              .macAddress("02:01:09:cd:f0:b0")
+                              .firewall(Firewall.builder()
+                                      .active(false)
+                                      .id("wqwqwqwq-ewew-rere-trtr-ytytytytytyt")
+                                      .nicId("qwqwqwqw-wewe-erer-rtrt-tytytytytyty")
+                                      .state(ProvisioningState.AVAILABLE)
+                                      .build())
+                              .dhcpActive(true)
+                              .gatewayIp("173.252.120.1")
+                              .state(ProvisioningState.AVAILABLE)
+                              .build()
+                      ))
               .build();
 
       assertEquals(actual, expected);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
index 09ee5bb..9f759cf 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
@@ -17,7 +17,9 @@
 package org.jclouds.profitbricks.http.parser.server;
 
 import com.google.common.collect.ImmutableList;
+
 import java.util.List;
+
 import org.jclouds.date.DateCodec;
 import org.jclouds.date.DateCodecFactory;
 import org.jclouds.http.functions.ParseSax;
@@ -26,8 +28,13 @@ import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.domain.Storage;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "ServerListResponseHandlerTest")
@@ -70,6 +77,38 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
               .isNicHotUnPlug(true)
               .isDiscVirtioHotPlug(true)
               .isDiscVirtioHotUnPlug(true)
+              .storages(ImmutableList.<Storage>of(
+                              Storage.builder()
+                              .bootDevice(Boolean.TRUE)
+                              .busType(Storage.BusType.VIRTIO)
+                              .deviceNumber(1)
+                              .size(40f)
+                              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+                              .name("facebook-storage")
+                              .build()
+                      )
+              )
+              .nics(ImmutableList.<Nic>of(
+                              Nic.builder()
+                              .dataCenterId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+                              .id("qwqwqwqw-wewe-erer-rtrt-tytytytytyty")
+                              .lanId(1)
+                              .internetAccess(true)
+                              .serverId("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+                              .ip("173.252.120.6")
+                              .macAddress("02:01:09:cd:f0:b0")
+                              .firewall(Firewall.builder()
+                                      .active(false)
+                                      .id("wqwqwqwq-ewew-rere-trtr-ytytytytytyt")
+                                      .nicId("qwqwqwqw-wewe-erer-rtrt-tytytytytyty")
+                                      .state(ProvisioningState.AVAILABLE)
+                                      .build())
+                              .dhcpActive(true)
+                              .gatewayIp("173.252.120.1")
+                              .state(ProvisioningState.AVAILABLE)
+                              .build()
+                      )
+              )
               .build(),
               Server.builder()
               .id("asdfghjk-asdf-asdf-asdf-asdfghjklkjl")
@@ -89,6 +128,38 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
               .isNicHotUnPlug(true)
               .isDiscVirtioHotPlug(true)
               .isDiscVirtioHotUnPlug(true)
+              .storages(ImmutableList.<Storage>of(
+                              Storage.builder()
+                              .bootDevice(Boolean.TRUE)
+                              .busType(Storage.BusType.VIRTIO)
+                              .deviceNumber(1)
+                              .size(5f)
+                              .id("asfasfle-f23n-cu89-klfr-njkdsvwllkfa")
+                              .name("google-disk")
+                              .build()
+                      )
+              )
+              .nics(ImmutableList.<Nic>of(
+                              Nic.builder()
+                              .dataCenterId("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy")
+                              .id("mkl45h5e-sdgb-h6rh-235r-rfweshdfhreh")
+                              .lanId(3)
+                              .internetAccess(false)
+                              .serverId("asdfghjk-asdf-asdf-asdf-asdfghjklkjl")
+                              .ip("202.69.181.241")
+                              .macAddress("02:01:9e:5e:35:1e")
+                              .firewall(Firewall.builder()
+                                      .active(false)
+                                      .id("cvvdsgbd-sdgj-eger-h56j-wet43gvsgeg4")
+                                      .nicId("mkl45h5e-sdgb-h6rh-235r-rfweshdfhreh")
+                                      .state(ProvisioningState.INPROCESS)
+                                      .build())
+                              .dhcpActive(false)
+                              .gatewayIp("202.69.181.1")
+                              .state(ProvisioningState.AVAILABLE)
+                              .build()
+                      )
+              )
               .build()
       );
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/util/MacAddressesTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/util/MacAddressesTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/util/MacAddressesTest.java
new file mode 100644
index 0000000..1f0ae7a
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/util/MacAddressesTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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.util;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import static org.jclouds.profitbricks.util.MacAddresses.isMacAddress;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "MacAddressesTest")
+public class MacAddressesTest {
+
+   private final List<String> expectedValidAddresses = ImmutableList.of(
+           "aa:bb:cc:dd:ee:ff", "11:22:33:44:55:66"
+   );
+   private final List<String> expectedInvalidAddresses = ImmutableList.of(
+           "AA:BB:CC:DD:EE:FF", "aa-bb-cc-dd-ee-ff", "", "aabbccddeeff",
+           "aa:bb:cc:dd:ff", "gg:aa:bb:cc:dd:ee"
+   );
+
+   @Test
+   public void testIsMacAddress() {
+      for (String addr : expectedValidAddresses)
+         assertTrue(isMacAddress(addr));
+
+      for (String addr : expectedInvalidAddresses)
+         assertFalse(isMacAddress(addr));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
index 9d8e20a..3df1f8b 100644
--- a/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
@@ -30,13 +30,12 @@
                         <nicId>zzzzzzzz-xxxx-cccc-vvvv-bbbbbbbbbbbb</nicId>
                         <lanId>1</lanId>
                         <internetAccess>true</internetAccess>
-                        <serverId>12345678-abcd-efgh-ijkl-987654321000</serverId>
+                        <serverId>qqqqqqqq-wwww-eeee-rrrr-tttttttttttt</serverId>
                         <ips>202.94.38.12</ips>
                         <macAddress>02:01:09:cd:f0:b0</macAddress>
                         <firewall>
                             <active>false</active>
                             <firewallId>llllllll-kkkk-jjjj-hhhh-gggggggggggg</firewallId>
-                            <firewallId>62383ec1-38c8-486b-8fa2-a3bb0a5edd97</firewallId>
                             <nicId>zzzzzzzz-xxxx-cccc-vvvv-bbbbbbbbbbbb</nicId>
                             <provisioningState>AVAILABLE</provisioningState>
                         </firewall>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/firewall/firewall-activate.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-activate.xml b/providers/profitbricks/src/test/resources/firewall/firewall-activate.xml
new file mode 100644
index 0000000..2150c6b
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-activate.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:activateFirewallsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>datacenter-version</dataCenterVersion>
+      </return>
+    </ns2:activateFirewallsResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/firewall/firewall-addtonic.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-addtonic.xml b/providers/profitbricks/src/test/resources/firewall/firewall-addtonic.xml
new file mode 100644
index 0000000..1267040
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-addtonic.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:addFirewallRulesToNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+ <return>
+    <active>active</active>
+    <firewallId>firewall-id</firewallId>
+    <firewallRules>
+      <firewallRuleId>firewall-rule-id</firewallRuleId>
+      <name>name</name>
+      <portRangeEnd>45678</portRangeEnd>
+      <portRangeStart>12345</portRangeStart>
+      <protocol>TCP</protocol>
+      <sourceIp>192.168.0.1</sourceIp>
+      <sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>
+      <targetIp>192.168.0.2</targetIp>
+    </firewallRules>
+    <nicId>nic-id</nicId>
+    <provisioningState>AVAILABLE</provisioningState>
+  </return>
+    </ns2:addFirewallRulesToNicResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/firewall/firewall-deactivate.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-deactivate.xml b/providers/profitbricks/src/test/resources/firewall/firewall-deactivate.xml
new file mode 100644
index 0000000..a0bca25
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-deactivate.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:deactivateFirewallsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id1111</requestId>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>datacenter-version</dataCenterVersion>
+      </return>
+    </ns2:deactivateFirewallsResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/firewall/firewall-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-delete.xml b/providers/profitbricks/src/test/resources/firewall/firewall-delete.xml
new file mode 100644
index 0000000..2c7364f
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-delete.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:deleteFirewallsResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>datacenter-version</dataCenterVersion>
+      </return>
+    </ns2:deleteFirewallsResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/firewall/firewall-remove.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall-remove.xml b/providers/profitbricks/src/test/resources/firewall/firewall-remove.xml
new file mode 100644
index 0000000..793bdd0
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/firewall/firewall-remove.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:removeFirewallRulesResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>datacenter-version</dataCenterVersion>
+      </return>
+    </ns2:removeFirewallRulesResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/firewall/firewall.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewall.xml b/providers/profitbricks/src/test/resources/firewall/firewall.xml
new file mode 100644
index 0000000..3275a70
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/firewall/firewall.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:getFirewallResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+ <return>
+    <active>true</active>
+    <firewallId>firewall-id</firewallId>
+    <firewallRules>
+      <firewallRuleId>firewall-rule-id</firewallRuleId>
+      <name>name</name>
+      <portRangeEnd>45678</portRangeEnd>
+      <portRangeStart>12345</portRangeStart>
+      <protocol>TCP</protocol>
+      <sourceIp>192.168.0.1</sourceIp>
+      <sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>
+      <targetIp>192.168.0.2</targetIp>
+    </firewallRules>
+    <nicId>nic-id</nicId>
+    <provisioningState>AVAILABLE</provisioningState>
+  </return>
+    </ns2:getFirewallResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/firewall/firewalls.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/firewall/firewalls.xml b/providers/profitbricks/src/test/resources/firewall/firewalls.xml
new file mode 100644
index 0000000..5803fbf
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/firewall/firewalls.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getFirewallResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <active>true</active>
+                <firewallId>firewall-id</firewallId>
+                <firewallRules>
+                    <firewallRuleId>firewall-rule-id</firewallRuleId>
+                    <name>name</name>
+                    <portRangeEnd>45678</portRangeEnd>
+                    <portRangeStart>12345</portRangeStart>
+                    <protocol>TCP</protocol>
+                    <sourceIp>192.168.0.1</sourceIp>
+                    <sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>
+                    <targetIp>192.168.0.2</targetIp>
+                </firewallRules>
+                <nicId>nic-id</nicId>
+                <provisioningState>AVAILABLE</provisioningState>
+            </return>
+            <return>
+                <active>true</active>
+                <firewallId>firewall-id2</firewallId>
+                <firewallRules>
+                    <firewallRuleId>firewall-rule-id2</firewallRuleId>
+                    <name>name</name>
+                    <portRangeEnd>56789</portRangeEnd>
+                    <portRangeStart>23456</portRangeStart>
+                    <protocol>TCP</protocol>
+                    <sourceIp>192.168.0.2</sourceIp>
+                    <sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>
+                    <targetIp>192.168.0.3</targetIp>
+                </firewallRules>
+                <nicId>nic-id</nicId>
+                <provisioningState>AVAILABLE</provisioningState>
+            </return>
+        </ns2:getFirewallResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/nic/nic-create.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nic-create.xml b/providers/profitbricks/src/test/resources/nic/nic-create.xml
new file mode 100644
index 0000000..613313b
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/nic/nic-create.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:createNicReturn xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>1</dataCenterVersion>
+                <nicId>nic-id</nicId>
+            </return>
+        </ns2:createNicReturn>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/nic/nic-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nic-delete.xml b/providers/profitbricks/src/test/resources/nic/nic-delete.xml
new file mode 100644
index 0000000..0b5cc83
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/nic/nic-delete.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" ?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:deleteNic>
+            <nicId>nic-id</nicId>
+        </ws:deleteNic>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/nic/nic-internetaccess.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nic-internetaccess.xml b/providers/profitbricks/src/test/resources/nic/nic-internetaccess.xml
new file mode 100644
index 0000000..6594894
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/nic/nic-internetaccess.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:setInternetAccess>
+            <dataCenterId>datacenter-id</dataCenterId>
+            <lanId>1</lanId>
+            <internetAccess>internet-access</internetAccess>
+        </ws:setInternetAccess>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/nic/nic-update.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nic-update.xml b/providers/profitbricks/src/test/resources/nic/nic-update.xml
new file mode 100644
index 0000000..451914c
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/nic/nic-update.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" ?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:updateNic>
+            <request>
+                <nicId>nic-id</nicId>
+                <ip>ip</ip>
+                <nicName>nic-name</nicName>
+                <dhcpActive>true</dhcpActive>
+                <lanId>1</lanId>
+            </request>
+        </ws:updateNic>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/nic/nic.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nic.xml b/providers/profitbricks/src/test/resources/nic/nic.xml
new file mode 100644
index 0000000..18adc23
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/nic/nic.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <nicId>12345678-abcd-efgh-ijkl-987654321000</nicId>
+                <dataCenterId>0</dataCenterId>
+                <dataCenterVersion>1</dataCenterVersion>
+                <lanId>1</lanId>
+                <nicName>name</nicName>
+                <internetAccess>true</internetAccess>
+                <serverId>server-id</serverId>
+                <ips>192.168.0.1</ips>
+                <macAddress>mac-address</macAddress>
+                <firewall>
+                    <active>true</active>
+                    <firewallId>firewall-id</firewallId>
+                    <nicId>nic-id</nicId>
+                    <provisioningState>AVAILABLE</provisioningState>
+                </firewall>
+                <dhcpActive>true</dhcpActive>
+                <gatewayIp>gateway-ip</gatewayIp>
+                <provisioningState>AVAILABLE</provisioningState>
+            </return>
+        </ns2:getNicResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/nic/nics.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nics.xml b/providers/profitbricks/src/test/resources/nic/nics.xml
new file mode 100644
index 0000000..10e219d
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/nic/nics.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getAllNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>12</dataCenterVersion>
+                <nicId>nic-id</nicId>
+                <nicName>nic-name</nicName>
+                <lanId>1</lanId>
+                <internetAccess>true</internetAccess>
+                <serverId>server-id</serverId>
+                <ips>192.168.0.1</ips>
+                <macAddress>mac-address</macAddress>
+                <firewall>
+                    <active>true</active>
+                    <firewallId>firewall-id</firewallId>
+                    <nicId>nic-id</nicId>
+                    <provisioningState>AVAILABLE</provisioningState>
+                </firewall>
+                <dhcpActive>true</dhcpActive>
+                <gatewayIp>192.168.0.0</gatewayIp>
+                <provisioningState>AVAILABLE</provisioningState>
+            </return>
+            <return>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>21</dataCenterVersion>
+                <nicId>nic-id2</nicId>
+                <nicName>nick</nicName>
+                <lanId>1</lanId>
+                <internetAccess>false</internetAccess>
+                <serverId>server-id</serverId>
+                <ips>192.168.0.2</ips>
+                <ips>192.168.0.3</ips>
+                <ips>192.168.0.4</ips>
+                <macAddress>mac-address</macAddress>
+                <firewall>
+                    <active>false</active>
+                    <firewallId>firewall-id2</firewallId>
+                    <nicId>nic-id</nicId>
+                    <provisioningState>AVAILABLE</provisioningState>
+                </firewall>
+                <dhcpActive>false</dhcpActive>
+                <gatewayIp>192.168.0.0</gatewayIp>
+                <provisioningState>AVAILABLE</provisioningState>
+            </return>
+        </ns2:getAllNicResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/resources/server/servers.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/servers.xml b/providers/profitbricks/src/test/resources/server/servers.xml
index 4a74b5d..5da090f 100644
--- a/providers/profitbricks/src/test/resources/server/servers.xml
+++ b/providers/profitbricks/src/test/resources/server/servers.xml
@@ -84,6 +84,7 @@
                         <provisioningState>INPROCESS</provisioningState>
                     </firewall>
                     <dhcpActive>false</dhcpActive>
+                    <gatewayIp>202.69.181.1</gatewayIp>
                     <provisioningState>AVAILABLE</provisioningState>
                 </nics>
                 <provisioningState>AVAILABLE</provisioningState>


[24/35] jclouds git commit: JCLOUDS-702: JClouds ProfitBricks provider - ComputeServiceAdapter

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/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
new file mode 100644
index 0000000..19b0e53
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksComputeProperties.java
@@ -0,0 +1,31 @@
+/*
+ * 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.config;
+
+public class ProfitBricksComputeProperties {
+
+   public static final String POLL_PREDICATE_DATACENTER = "jclouds.profitbricks.predicate.datacenter";
+
+   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";
+
+   private ProfitBricksComputeProperties() {
+      throw new AssertionError("Intentionally unimplemented");
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
index 6a3d5fa..2108bc4 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
@@ -17,20 +17,18 @@
 package org.jclouds.profitbricks.domain;
 
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.net.InetAddresses.isInetAddress;
 import static org.jclouds.profitbricks.util.MacAddresses.isMacAddress;
 
-import com.google.auto.value.AutoValue;
-
 import java.util.List;
 
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.profitbricks.domain.internal.FirewallRuleCommonProperties;
 
+import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
-import static com.google.common.net.InetAddresses.isInetAddress;
-
 @AutoValue
 public abstract class Firewall {
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
index d272e27..0987324 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
@@ -16,10 +16,12 @@
  */
 package org.jclouds.profitbricks.domain;
 
+import org.jclouds.profitbricks.domain.internal.Provisionable;
+
 import com.google.auto.value.AutoValue;
 
 @AutoValue
-public abstract class Image {
+public abstract class Image implements Provisionable {
 
    public enum Type {
 
@@ -34,46 +36,21 @@ public abstract class Image {
       }
    }
 
-   public abstract String id();
-
-   public abstract String name();
-
-   public abstract float size(); // MB
-
    public abstract Type type();
 
-   public abstract Location location();
-
-   public abstract OsType osType();
-
    public abstract boolean isPublic();
 
    public abstract boolean isWriteable();
 
    public abstract boolean isBootable();
 
-   public abstract boolean isCpuHotPlug();
-
-   public abstract boolean isCpuHotUnPlug();
-
-   public abstract boolean isRamHotPlug();
-
-   public abstract boolean isRamHotUnPlug();
-
-   public abstract boolean isNicHotPlug();
-
-   public abstract boolean isNicHotUnPlug();
-
-   public abstract boolean isDiscVirtioHotPlug();
-
-   public abstract boolean isDiscVirtioHotUnPlug();
-
    public static Image create(String id, String name, float size, Type type, Location location, OsType osType,
-           boolean isPublic, boolean isWriteable, boolean isBootable, boolean cpuHotPlug, boolean cpuHotUnPlug,
-           boolean ramHotPlug, boolean ramHotUnPlug, boolean nicHotPlug, boolean nicHotUnPlug,
-           boolean discVirtioHotPlug, boolean discVirtioHotUnPlug) {
-      return new AutoValue_Image(id, name, size, type, location, osType, isPublic, isWriteable,
-              isBootable, cpuHotPlug, cpuHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
+           boolean isPublic, Boolean isWriteable, Boolean isBootable, Boolean cpuHotPlug, Boolean cpuHotUnPlug,
+           Boolean ramHotPlug, Boolean ramHotUnPlug, Boolean nicHotPlug, Boolean nicHotUnPlug,
+           Boolean discVirtioHotPlug, Boolean discVirtioHotUnPlug) {
+      return new AutoValue_Image(cpuHotPlug, cpuHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug,
+              discVirtioHotPlug, discVirtioHotUnPlug, id, name, size, location, osType, type, isPublic, isWriteable,
+              isBootable);
    }
 
    public static Builder builder() {
@@ -84,56 +61,18 @@ public abstract class Image {
       return builder().fromImage(this);
    }
 
-   public static class Builder {
+   public static class Builder extends Provisionable.Builder<Builder, Image> {
 
-      private String id;
-      private String name;
-      private float size;
       private Type type;
-      private Location location;
-      private OsType osType;
       private boolean isPublic;
       private boolean isWriteable;
       private boolean isBootable;
-      private boolean cpuHotPlug;
-      private boolean cpuHotUnPlug;
-      private boolean ramHotPlug;
-      private boolean ramHotUnPlug;
-      private boolean nicHotPlug;
-      private boolean nicHotUnPlug;
-      private boolean discVirtioHotPlug;
-      private boolean discVirtioHotUnPlug;
-
-      public Builder id(String id) {
-         this.id = id;
-         return this;
-      }
-
-      public Builder name(String name) {
-         this.name = name;
-         return this;
-      }
-
-      public Builder size(float size) {
-         this.size = size;
-         return this;
-      }
 
       public Builder type(Type type) {
          this.type = type;
          return this;
       }
 
-      public Builder osType(OsType osType) {
-         this.osType = osType;
-         return this;
-      }
-
-      public Builder location(Location location) {
-         this.location = location;
-         return this;
-      }
-
       public Builder isPublic(boolean isPublic) {
          this.isPublic = isPublic;
          return this;
@@ -149,46 +88,7 @@ public abstract class Image {
          return this;
       }
 
-      public Builder isCpuHotPlug(boolean cpuHotPlug) {
-         this.cpuHotPlug = cpuHotPlug;
-         return this;
-      }
-
-      public Builder isCpuHotUnPlug(boolean cpuHotUnPlug) {
-         this.cpuHotUnPlug = cpuHotUnPlug;
-         return this;
-      }
-
-      public Builder isRamHotPlug(boolean ramHotPlug) {
-         this.ramHotPlug = ramHotPlug;
-         return this;
-      }
-
-      public Builder isRamHotUnPlug(boolean ramHotUnPlug) {
-         this.ramHotUnPlug = ramHotUnPlug;
-         return this;
-      }
-
-      public Builder isNicHotPlug(boolean nicHotPlug) {
-         this.nicHotPlug = nicHotPlug;
-         return this;
-      }
-
-      public Builder isNicHotUnPlug(boolean nicHotUnPlug) {
-         this.nicHotUnPlug = nicHotUnPlug;
-         return this;
-      }
-
-      public Builder isDiscVirtioHotPlug(boolean discVirtioHotPlug) {
-         this.discVirtioHotPlug = discVirtioHotPlug;
-         return this;
-      }
-
-      public Builder isDiscVirtioHotUnPlug(boolean discVirtioHotUnPlug) {
-         this.discVirtioHotUnPlug = discVirtioHotUnPlug;
-         return this;
-      }
-
+      @Override
       public Image build() {
          return Image.create(id, name, size, type, location, osType, isPublic, isWriteable, isBootable, cpuHotPlug, cpuHotUnPlug,
                  ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
@@ -199,7 +99,12 @@ public abstract class Image {
                  .isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
                  .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug()).isPublic(in.isPublic())
                  .isRamHotPlug(in.isRamHotPlug()).isRamHotUnPlug(in.isRamHotUnPlug()).isWriteable(in.isWriteable())
-                 .location(in.location()).name(in.name()).osType(in.osType()).size(in.size());
+                 .location(in.location()).name(in.name()).osType(in.osType()).size(in.size()).type(in.type());
+      }
+
+      @Override
+      public Builder self() {
+         return this;
       }
 
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
index bc118ea..843999d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
@@ -47,13 +47,10 @@ public abstract class LoadBalancer {
    public abstract String name();
 
    @Nullable
-   public abstract Algorithm loadBalancerAlgorithm();
+   public abstract Algorithm algorithm();
 
    @Nullable
-   public abstract String dataCenterId();
-
-   @Nullable
-   public abstract String dataCenterVersion();
+   public abstract DataCenter dataCenter();
 
    @Nullable
    public abstract Boolean internetAccess();
@@ -79,10 +76,11 @@ public abstract class LoadBalancer {
    @Nullable
    public abstract List<Firewall> firewalls();
 
-   public static LoadBalancer create(String id, String name, Algorithm loadBalancerAlgorithm,
-           String dataCenterId, String dataCenterVersion, boolean internetAccess,
-           String ip, String lanId, ProvisioningState state, Date creationTime, Date lastModificationTime, List<Server> balancedServers, List<Firewall> firewalls) {
-      return new AutoValue_LoadBalancer(id, name, loadBalancerAlgorithm, dataCenterId, dataCenterVersion, internetAccess, ip, lanId, state, creationTime, lastModificationTime,
+   public static LoadBalancer create(String id, String name, Algorithm algorithm, DataCenter dataCenter,
+           boolean internetAccess, String ip, String lanId, ProvisioningState state, Date creationTime,
+           Date lastModificationTime, List<Server> balancedServers, List<Firewall> firewalls) {
+      return new AutoValue_LoadBalancer(id, name, algorithm, dataCenter,
+              internetAccess, ip, lanId, state, creationTime, lastModificationTime,
               balancedServers != null ? ImmutableList.copyOf(balancedServers) : ImmutableList.<Server>of(),
               firewalls != null ? ImmutableList.copyOf(firewalls) : ImmutableList.<Firewall>of());
    }
@@ -102,11 +100,9 @@ public abstract class LoadBalancer {
 
       private String name;
 
-      private Algorithm loadBalancerAlgorithm;
-
-      private String dataCenterId;
+      private Algorithm algorithm;
 
-      private String dataCenterVersion;
+      private DataCenter dataCenter;
 
       private boolean internetAccess;
 
@@ -134,18 +130,13 @@ public abstract class LoadBalancer {
          return this;
       }
 
-      public Builder loadBalancerAlgorithm(Algorithm loadBalancerAlgorithm) {
-         this.loadBalancerAlgorithm = loadBalancerAlgorithm;
-         return this;
-      }
-
-      public Builder dataCenterId(String dataCenterId) {
-         this.dataCenterId = dataCenterId;
+      public Builder algorithm(Algorithm algorithm) {
+         this.algorithm = algorithm;
          return this;
       }
 
-      public Builder dataCenterVersion(String dataCenterVersion) {
-         this.dataCenterVersion = dataCenterVersion;
+      public Builder dataCenter(DataCenter dataCenter) {
+         this.dataCenter = dataCenter;
          return this;
       }
 
@@ -191,13 +182,16 @@ public abstract class LoadBalancer {
 
       public LoadBalancer build() {
          checkIp(ip);
-         return LoadBalancer.create(id, name, loadBalancerAlgorithm, dataCenterId, dataCenterVersion, internetAccess, ip, lanId, state, creationTime, lastModificationTime, balancedServers, firewalls);
+         return LoadBalancer.create(id, name, algorithm, dataCenter, internetAccess,
+                 ip, lanId, state, creationTime, lastModificationTime, balancedServers, firewalls);
       }
 
       public Builder fromLoadBalancer(LoadBalancer in) {
-         return this.id(in.id()).name(in.name()).loadBalancerAlgorithm(in.loadBalancerAlgorithm())
-                 .dataCenterId(in.dataCenterId()).dataCenterVersion(in.dataCenterVersion()).internetAccess(in.internetAccess())
-                 .ip(in.ip()).lanId(in.lanId()).state(in.state()).creationTime(in.creationTime()).lastModificationTime(in.lastModificationTime()).balancedServers(in.balancedServers()).firewalls(in.firewalls());
+         return this.id(in.id()).name(in.name()).algorithm(in.algorithm())
+                 .dataCenter(in.dataCenter()).internetAccess(in.internetAccess())
+                 .ip(in.ip()).lanId(in.lanId()).state(in.state()).creationTime(in.creationTime())
+                 .lastModificationTime(in.lastModificationTime()).balancedServers(in.balancedServers())
+                 .firewalls(in.firewalls());
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
index 3dd888d..52acaf2 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
@@ -18,22 +18,28 @@ package org.jclouds.profitbricks.domain;
 
 public enum Location {
 
-   DE_FKB("de/fkb"),
-   DE_FRA("de/fra"),
-   US_LAS("us/las"),
-   US_LAS_DEV("us/lasdev"),
-   UNRECOGNIZED("unknown");
+   DE_FKB("de/fkb", "Germany, Karlsruhe"),
+   DE_FRA("de/fra", "Germany, Frankfurt (M)"),
+   US_LAS("us/las", "USA, Las Vegas"),
+   US_LASDEV("us/lasdev", "USA Developer cluster"),
+   UNRECOGNIZED("unrecognized", "Unrecognized location");
 
    private final String id;
+   private final String description;
 
-   Location(String id) {
+   Location(String id, String description) {
       this.id = id;
+      this.description = description;
    }
 
-   public String value() {
+   public String getId() {
       return id;
    }
 
+   public String getDescription() {
+      return description;
+   }
+
    public static Location fromValue(String v) {
       try {
          return valueOf(v);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
index f538d9b..0f7427c 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
@@ -17,17 +17,15 @@
 package org.jclouds.profitbricks.domain;
 
 import static com.google.common.base.Preconditions.checkArgument;
-
-import com.google.auto.value.AutoValue;
+import static com.google.common.net.InetAddresses.isInetAddress;
 
 import java.util.List;
 
-import org.jclouds.javax.annotation.Nullable;
-
+import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
-import static com.google.common.net.InetAddresses.isInetAddress;
+import org.jclouds.javax.annotation.Nullable;
 
 @AutoValue
 public abstract class Nic {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
index ee1212a..027e016 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
@@ -27,6 +27,7 @@ import java.util.Date;
 import java.util.List;
 
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.profitbricks.domain.internal.HotPluggable;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
@@ -52,6 +53,9 @@ public abstract class Server implements ServerCommonProperties {
    }
 
    @Nullable
+   public abstract DataCenter dataCenter();
+
+   @Nullable
    public abstract String id();
 
    @Nullable
@@ -89,17 +93,23 @@ public abstract class Server implements ServerCommonProperties {
    public abstract String balancedNicId();
 
    @Nullable
-   public abstract Boolean activate();
-
-   public static Server create(String id, String name, int cores, int ram, Boolean hasInternetAccess, ProvisioningState state,
-           Status status, OsType osType, AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime,
-           List<Storage> storages, List<Nic> nics, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug,
-           Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug, String balancedNicId, boolean activate) {
-      return new AutoValue_Server(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug,
-              cores, ram, id, name, hasInternetAccess, state, status, osType, availabilityZone, creationTime, lastModificationTime,
-              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList(),
-              nics != null ? ImmutableList.copyOf(nics) : Lists.<Nic>newArrayList(), balancedNicId, activate);
+   public abstract Boolean loadBalanced();
 
+   @Nullable
+   public abstract String hostname(); // Non-profitbricks property; Added to hold hostname parsed from image temporarily
+
+   public static Server create(DataCenter dataCenter, String id, String name, int cores, int ram,
+           Boolean hasInternetAccess, ProvisioningState state, Status status, OsType osType,
+           AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime, List<Storage> storages,
+           List<Nic> nics, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug,
+           Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug, String balancedNicId, Boolean loadBalanced,
+           String hostname) {
+      return new AutoValue_Server(isCpuHotPlug, null, isRamHotPlug, null, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
+              isDiscVirtioHotUnPlug, cores, ram, dataCenter, id, name, hasInternetAccess, state, status, osType,
+              availabilityZone, creationTime, lastModificationTime,
+              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList(),
+              nics != null ? ImmutableList.copyOf(nics) : Lists.<Nic>newArrayList(),
+              balancedNicId, loadBalanced, hostname);
    }
 
    public static DescribingBuilder builder() {
@@ -110,17 +120,11 @@ public abstract class Server implements ServerCommonProperties {
       return builder().fromServer(this);
    }
 
-   public abstract static class Builder<B extends Builder, D extends ServerCommonProperties> {
+   public abstract static class Builder<B extends Builder, D extends ServerCommonProperties> extends HotPluggable.Builder<B, D> {
 
       protected String name;
       protected int cores;
       protected int ram;
-      protected Boolean cpuHotPlug;
-      protected Boolean ramHotPlug;
-      protected Boolean nicHotPlug;
-      protected Boolean nicHotUnPlug;
-      protected Boolean discVirtioHotPlug;
-      protected Boolean discVirtioHotUnPlug;
 
       public B name(String name) {
          this.name = name;
@@ -136,45 +140,11 @@ public abstract class Server implements ServerCommonProperties {
          this.ram = ram;
          return self();
       }
-
-      public B isCpuHotPlug(Boolean cpuHotPlug) {
-         this.cpuHotPlug = cpuHotPlug;
-         return self();
-      }
-
-      public B isRamHotPlug(Boolean ramHotPlug) {
-         this.ramHotPlug = ramHotPlug;
-         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();
    }
 
    public static class DescribingBuilder extends Builder<DescribingBuilder, Server> {
 
+      private DataCenter dataCenter;
       private String id;
       private ProvisioningState state;
       private Status status;
@@ -185,8 +155,14 @@ public abstract class Server implements ServerCommonProperties {
       private Boolean hasInternetAccess;
       private List<Storage> storages;
       private List<Nic> nics;
-      private boolean activate;
+      private Boolean loadBalanced;
       private String balancedNicId;
+      private String hostname;
+
+      public DescribingBuilder dataCenter(DataCenter dataCenter) {
+         this.dataCenter = dataCenter;
+         return this;
+      }
 
       public DescribingBuilder id(String id) {
          this.id = id;
@@ -243,16 +219,21 @@ public abstract class Server implements ServerCommonProperties {
          return this;
       }
 
-      public DescribingBuilder activate(boolean activate) {
-         this.activate = activate;
+      public DescribingBuilder loadBalanced(Boolean loadBalanced) {
+         this.loadBalanced = loadBalanced;
+         return this;
+      }
+
+      public DescribingBuilder hostname(String hostname) {
+         this.hostname = hostname;
          return this;
       }
 
       @Override
       public Server build() {
-         return Server.create(id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
+         return Server.create(dataCenter, id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
                  lastModificationTime, storages, nics, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug,
-                 discVirtioHotPlug, discVirtioHotUnPlug, balancedNicId, activate);
+                 discVirtioHotPlug, discVirtioHotUnPlug, balancedNicId, loadBalanced, hostname);
       }
 
       private DescribingBuilder fromServer(Server in) {
@@ -261,7 +242,8 @@ public abstract class Server implements ServerCommonProperties {
                  .isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug()).isNicHotPlug(in.isNicHotPlug())
                  .isNicHotUnPlug(in.isNicHotUnPlug()).isRamHotPlug(in.isRamHotPlug())
                  .lastModificationTime(in.lastModificationTime()).name(in.name()).osType(in.osType()).ram(in.ram())
-                 .state(in.state()).status(in.status()).storages(in.storages()).nics(in.nics()).balancedNicId(in.balancedNicId()).activate(in.activate());
+                 .state(in.state()).status(in.status()).storages(in.storages()).nics(in.nics()).dataCenter(in.dataCenter())
+                 .balancedNicId(balancedNicId).loadBalanced(loadBalanced).hostname(hostname);
       }
 
       @Override
@@ -308,14 +290,15 @@ public abstract class Server implements ServerCommonProperties {
             return create(dataCenterId, name, core, ram, "", "", null, false, null, null, null, null, null, null, null, null);
          }
 
-         public static CreatePayload create(String dataCenterId, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
-                 Integer lanId, Boolean hasInternetAccess, AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug,
-                 Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
+         public static CreatePayload create(String dataCenterId, String name, int cores, int ram, String bootFromStorageId,
+                 String bootFromImageId, Integer lanId, Boolean hasInternetAccess, AvailabilityZone availabilityZone,
+                 OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug,
+                 Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
             validateCores(cores);
             validateRam(ram, isRamHotPlug);
-            return new AutoValue_Server_Request_CreatePayload(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
-                    isDiscVirtioHotUnPlug, name, cores, ram, dataCenterId, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
-                    availabilityZone, osType);
+            return new AutoValue_Server_Request_CreatePayload(isCpuHotPlug, null, isRamHotPlug, null, isNicHotPlug,
+                    isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug, name, cores, ram, dataCenterId,
+                    bootFromStorageId, bootFromImageId, lanId, hasInternetAccess, availabilityZone, osType);
          }
 
          public static class Builder extends Server.Builder<Builder, CreatePayload> {
@@ -406,8 +389,9 @@ public abstract class Server implements ServerCommonProperties {
          public static UpdatePayload create(String id, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
                  AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug,
                  Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
-            return new AutoValue_Server_Request_UpdatePayload(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
-                    isDiscVirtioHotUnPlug, cores, ram, name, id, bootFromStorageId, bootFromImageId, availabilityZone, osType);
+            return new AutoValue_Server_Request_UpdatePayload(isCpuHotPlug, null, isRamHotPlug, null, isNicHotPlug,
+                    isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug, cores, ram, name, id, bootFromStorageId,
+                    bootFromImageId, availabilityZone, osType);
          }
 
          public static class Builder extends Server.Builder<Builder, UpdatePayload> {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
index 3182711..60738d0 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Snapshot.java
@@ -17,45 +17,34 @@
 package org.jclouds.profitbricks.domain;
 
 import com.google.auto.value.AutoValue;
+
 import org.jclouds.javax.annotation.Nullable;
 
 import java.util.Date;
 
+import org.jclouds.profitbricks.domain.internal.HotPluggable;
+import org.jclouds.profitbricks.domain.internal.Provisionable;
+
 @AutoValue
-public abstract class Snapshot {
+public abstract class Snapshot implements Provisionable {
 
    @Nullable
+   @Override
    public abstract String id();
 
    @Nullable
+   @Override
    public abstract String name();
 
-   public abstract float size();
-
    public abstract boolean bootable();
 
    @Nullable
    public abstract String description();
 
    @Nullable
+   @Override
    public abstract OsType osType();
 
-   public abstract boolean cpuHotPlug();
-
-   public abstract boolean cpuHotUnPlug();
-
-   public abstract boolean discVirtioHotPlug();
-
-   public abstract boolean discVirtioHotUnPlug();
-
-   public abstract boolean ramHotPlug();
-
-   public abstract boolean ramHotUnPlug();
-
-   public abstract boolean nicHotPlug();
-
-   public abstract boolean nicHotUnPlug();
-
    @Nullable
    public abstract Date creationTime();
 
@@ -66,367 +55,237 @@ public abstract class Snapshot {
    public abstract ProvisioningState state();
 
    @Nullable
+   @Override
    public abstract Location location();
 
-   public static Snapshot create(String id, String name, float size, boolean bootable, String description, OsType osType, boolean cpuHotPlug, boolean cpuHotUnPlug,
-	   boolean discVirtioHotPlug, boolean discVirtioHotUnPlug, boolean ramHotPlug, boolean ramHotUnPlug,
-	   boolean nicHotPlug, boolean nicHotUnPlug, Date creationTime, Date lastModificationTime, ProvisioningState state, Location location) {
-      return new AutoValue_Snapshot(id, name, size, bootable, description, osType, cpuHotPlug, cpuHotUnPlug,
-	      discVirtioHotPlug, discVirtioHotUnPlug, ramHotPlug, ramHotUnPlug,
-	      nicHotPlug, nicHotUnPlug, creationTime, lastModificationTime, state, location);
+   public static Snapshot create(String id, String name, float size, boolean bootable, String description, OsType osType,
+           Boolean cpuHotPlug, Boolean cpuHotUnPlug, Boolean discVirtioHotPlug, Boolean discVirtioHotUnPlug,
+           Boolean ramHotPlug, Boolean ramHotUnPlug, Boolean nicHotPlug, Boolean nicHotUnPlug, Date creationTime,
+           Date lastModificationTime, ProvisioningState state, Location location) {
+      return new AutoValue_Snapshot(cpuHotPlug, cpuHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug, ramHotPlug,
+              ramHotUnPlug, nicHotPlug, nicHotUnPlug, size, id, name, bootable, description, osType, creationTime,
+              lastModificationTime, state, location);
    }
 
    public static Builder builder() {
       return new Builder();
    }
 
-   public static class Builder {
+   public static class Builder extends Provisionable.Builder<Builder, Snapshot> {
 
-      private String id;
-      @Nullable
-      private String name;
-      private float size;
       private Date creationTime;
       private Date lastModificationTime;
       private ProvisioningState state;
       private boolean bootable;
-      @Nullable
       private String description;
-      private OsType osType;
-      private boolean cpuHotPlug;
-      private boolean cpuHotUnPlug;
-      private boolean discVirtioHotPlug;
-      private boolean discVirtioHotUnPlug;
-      private boolean ramHotPlug;
-      private boolean ramHotUnPlug;
-      private boolean nicHotPlug;
-      private boolean nicHotUnPlug;
-      private Location location;
-
-      public Builder id(String id) {
-	 this.id = id;
-	 return this;
-      }
-
-      public Builder name(String name) {
-	 this.name = name;
-	 return this;
-      }
-
-      public Builder size(float size) {
-	 this.size = size;
-	 return this;
-      }
 
       public Builder creationTime(Date creationTime) {
-	 this.creationTime = creationTime;
-	 return this;
+         this.creationTime = creationTime;
+         return this;
       }
 
       public Builder lastModificationTime(Date lastModificationTime) {
-	 this.lastModificationTime = lastModificationTime;
-	 return this;
+         this.lastModificationTime = lastModificationTime;
+         return this;
       }
 
       public Builder state(ProvisioningState state) {
-	 this.state = state;
-	 return this;
+         this.state = state;
+         return this;
       }
 
       public Builder description(String description) {
-	 this.description = description;
-	 return this;
+         this.description = description;
+         return this;
       }
 
-      public Builder bootable(Boolean bootable) {
-	 this.bootable = bootable;
-	 return this;
-      }
-
-      public Builder osType(OsType osType) {
-	 this.osType = osType;
-	 return this;
-      }
-
-      public Builder cpuHotPlug(boolean cpuHotPlug) {
-	 this.cpuHotPlug = cpuHotPlug;
-	 return this;
-      }
-
-      public Builder cpuHotUnPlug(boolean cpuHotUnPlug) {
-	 this.cpuHotUnPlug = cpuHotUnPlug;
-	 return this;
-      }
-
-      public Builder discVirtioHotPlug(boolean discVirtioHotPlug) {
-	 this.discVirtioHotPlug = discVirtioHotPlug;
-	 return this;
-      }
-
-      public Builder discVirtioHotUnPlug(boolean discVirtioHotUnPlug) {
-	 this.discVirtioHotUnPlug = discVirtioHotUnPlug;
-	 return this;
-      }
-
-      public Builder ramHotPlug(boolean ramHotPlug) {
-	 this.ramHotPlug = ramHotPlug;
-	 return this;
-      }
-
-      public Builder ramHotUnPlug(boolean ramHotUnPlug) {
-	 this.ramHotUnPlug = ramHotUnPlug;
-	 return this;
-      }
-
-      public Builder nicHotPlug(boolean nicHotPlug) {
-	 this.nicHotPlug = nicHotPlug;
-	 return this;
-      }
-
-      public Builder nicHotUnPlug(boolean nicHotUnPlug) {
-	 this.nicHotUnPlug = nicHotUnPlug;
-	 return this;
-      }
-
-      public Builder location(Location location) {
-	 this.location = location;
-	 return this;
+      public Builder isBootable(boolean bootable) {
+         this.bootable = bootable;
+         return this;
       }
 
       private Builder fromSnapshot(Snapshot in) {
-	 return this.id(in.id()).name(in.name()).size(in.size()).creationTime(in.creationTime())
-		 .lastModificationTime(in.lastModificationTime()).state(in.state()).bootable(in.bootable()).description(in.description())
-		 .cpuHotPlug(in.cpuHotPlug()).cpuHotUnPlug(in.cpuHotUnPlug()).discVirtioHotPlug(in.discVirtioHotPlug())
-		 .discVirtioHotUnPlug(in.discVirtioHotUnPlug()).ramHotPlug(in.ramHotPlug()).ramHotUnPlug(in.ramHotUnPlug())
-		 .nicHotPlug(in.nicHotPlug()).nicHotUnPlug(in.nicHotUnPlug());
+         return this.id(in.id()).name(in.name()).size(in.size()).creationTime(in.creationTime())
+                 .lastModificationTime(in.lastModificationTime()).state(in.state()).isBootable(in.bootable())
+                 .description(in.description()).isCpuHotPlug(in.isCpuHotPlug()).isCpuHotUnPlug(in.isCpuHotUnPlug())
+                 .isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
+                 .isRamHotPlug(in.isRamHotPlug()).isRamHotUnPlug(in.isRamHotUnPlug())
+                 .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug());
       }
 
+      @Override
       public Snapshot build() {
-	 return Snapshot.create(id, name, size, bootable, description, osType, cpuHotPlug, cpuHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, creationTime, lastModificationTime, state, location);
+         return Snapshot.create(id, name, size, bootable, description, osType, cpuHotPlug, cpuHotUnPlug,
+                 discVirtioHotPlug, discVirtioHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug,
+                 creationTime, lastModificationTime, state, location);
+      }
+
+      @Override
+      public Builder self() {
+         return this;
       }
    }
 
    public static final class Request {
 
       public static CreatePayload.Builder creatingBuilder() {
-	 return new CreatePayload.Builder();
+         return new CreatePayload.Builder();
       }
 
       public static UpdatePayload.Builder updatingBuilder() {
-	 return new UpdatePayload.Builder();
+         return new UpdatePayload.Builder();
       }
 
       public static RollbackPayload.Builder rollbackBuilder() {
-	 return new RollbackPayload.Builder();
+         return new RollbackPayload.Builder();
       }
 
       @AutoValue
       public abstract static class CreatePayload {
 
-	 public abstract String storageId();
+         public abstract String storageId();
 
-	 public abstract String description();
+         public abstract String description();
 
-	 public abstract String name();
+         public abstract String name();
 
-	 public static CreatePayload create(String storageId, String description, String name) {
-	    return new AutoValue_Snapshot_Request_CreatePayload(storageId, description, name);
-	 }
+         public static CreatePayload create(String storageId, String description, String name) {
+            return new AutoValue_Snapshot_Request_CreatePayload(storageId, description, name);
+         }
 
-	 public static class Builder {
+         public static class Builder {
 
-	    private String storageId;
-	    private String description;
-	    private String name;
+            private String storageId;
+            private String description;
+            private String name;
 
-	    public Builder storageId(String storageId) {
-	       this.storageId = storageId;
-	       return this;
-	    }
+            public Builder storageId(String storageId) {
+               this.storageId = storageId;
+               return this;
+            }
 
-	    public Builder description(String description) {
-	       this.description = description;
-	       return this;
-	    }
+            public Builder description(String description) {
+               this.description = description;
+               return this;
+            }
 
-	    public Builder name(String name) {
-	       this.name = name;
-	       return this;
-	    }
+            public Builder name(String name) {
+               this.name = name;
+               return this;
+            }
 
-	    public CreatePayload build() {
-	       return CreatePayload.create(storageId, description, name);
-	    }
-	 }
+            public CreatePayload build() {
+               return CreatePayload.create(storageId, description, name);
+            }
+         }
       }
 
       @AutoValue
-      public abstract static class UpdatePayload {
-
-	 public abstract String snapshotId();
-
-	 public abstract String description();
-
-	 public abstract String name();
-
-	 public abstract boolean bootable();
-
-	 @Nullable
-	 public abstract OsType osType();
-
-	 public abstract boolean cpuHotplug();
-
-	 public abstract boolean cpuHotunplug();
-
-	 public abstract boolean ramHotplug();
-
-	 public abstract boolean ramHotunplug();
-
-	 public abstract boolean nicHotplug();
-
-	 public abstract boolean nicHotunplug();
-
-	 public abstract boolean discVirtioHotplug();
-
-	 public abstract boolean discVirtioHotunplug();
-
-	 public static UpdatePayload create(String snapshotId, String description, String name, boolean bootable, OsType osType, boolean cpuHotplug, boolean cpuHotunplug, boolean ramHotplug, boolean ramHotunplug, boolean nicHotplug, boolean nicHotunplug, boolean discVirtioHotplug, boolean discVirtioHotunplug) {
-	    return new AutoValue_Snapshot_Request_UpdatePayload(snapshotId, description, name, bootable, osType, cpuHotplug, cpuHotunplug, ramHotplug, ramHotunplug, nicHotplug, nicHotunplug, discVirtioHotplug, discVirtioHotunplug);
-	 }
-
-	 public static class Builder {
-
-	    private String snapshotId;
-
-	    @Nullable
-	    private String description;
-
-	    @Nullable
-	    private String name;
-
-	    private boolean bootable;
-
-	    private OsType osType;
-
-	    private boolean cpuHotplug;
-
-	    private boolean cpuHotunplug;
-
-	    private boolean ramHotplug;
+      public abstract static class UpdatePayload implements HotPluggable {
 
-	    private boolean ramHotunplug;
+         public abstract String snapshotId();
 
-	    private boolean nicHotplug;
+         public abstract String description();
 
-	    private boolean nicHotunplug;
+         public abstract String name();
 
-	    private boolean discVirtioHotplug;
+         public abstract boolean bootable();
 
-	    private boolean discVirtioHotunplug;
+         @Nullable
+         public abstract OsType osType();
 
-	    public Builder snapshotId(String snapshotId) {
-	       this.snapshotId = snapshotId;
-	       return this;
-	    }
+         public static UpdatePayload create(String snapshotId, String description, String name, boolean bootable,
+                 OsType osType, Boolean cpuHotplug, Boolean cpuHotunplug, Boolean ramHotplug, Boolean ramHotunplug,
+                 Boolean nicHotplug, Boolean nicHotunplug, Boolean discVirtioHotplug, Boolean discVirtioHotunplug) {
+            return new AutoValue_Snapshot_Request_UpdatePayload(
+                    cpuHotplug, cpuHotunplug, ramHotplug, ramHotunplug, nicHotplug, nicHotunplug, discVirtioHotplug,
+                    discVirtioHotunplug, snapshotId, description, name, bootable, osType);
+         }
 
-	    public Builder description(String description) {
-	       this.description = description;
-	       return this;
-	    }
+         public static class Builder extends HotPluggable.Builder<Builder, UpdatePayload> {
 
-	    public Builder name(String name) {
-	       this.name = name;
-	       return this;
-	    }
+            private String snapshotId;
 
-	    public Builder bootable(boolean bootable) {
-	       this.bootable = bootable;
-	       return this;
-	    }
+            @Nullable
+            private String description;
 
-	    public Builder osType(OsType osType) {
-	       this.osType = osType;
-	       return this;
-	    }
+            @Nullable
+            private String name;
 
-	    public Builder cpuHotplug(boolean cpuHotplug) {
-	       this.cpuHotplug = cpuHotplug;
-	       return this;
-	    }
+            private boolean bootable;
 
-	    public Builder cpuHotunplug(boolean cpuHotunplug) {
-	       this.cpuHotunplug = cpuHotunplug;
-	       return this;
-	    }
+            private OsType osType;
 
-	    public Builder ramHotplug(boolean ramHotplug) {
-	       this.ramHotplug = ramHotplug;
-	       return this;
-	    }
+            public Builder snapshotId(String snapshotId) {
+               this.snapshotId = snapshotId;
+               return this;
+            }
 
-	    public Builder ramHotunplug(boolean ramHotunplug) {
-	       this.ramHotunplug = ramHotunplug;
-	       return this;
-	    }
+            public Builder description(String description) {
+               this.description = description;
+               return this;
+            }
 
-	    public Builder nicHotplug(boolean nicHotplug) {
-	       this.nicHotplug = nicHotplug;
-	       return this;
-	    }
+            public Builder name(String name) {
+               this.name = name;
+               return this;
+            }
 
-	    public Builder nicHotunplug(boolean nicHotunplug) {
-	       this.nicHotunplug = nicHotunplug;
-	       return this;
-	    }
+            public Builder bootable(boolean bootable) {
+               this.bootable = bootable;
+               return this;
+            }
 
-	    public Builder discVirtioHotplug(boolean discVirtioHotplug) {
-	       this.discVirtioHotplug = discVirtioHotplug;
-	       return this;
-	    }
+            public Builder osType(OsType osType) {
+               this.osType = osType;
+               return this;
+            }
 
-	    public Builder discVirtioHotunplug(boolean discVirtioHotunplug) {
-	       this.discVirtioHotunplug = discVirtioHotunplug;
-	       return this;
-	    }
+            @Override
+            public UpdatePayload build() {
+               return UpdatePayload.create(snapshotId, description, name, bootable, osType, cpuHotPlug, cpuHotUnPlug,
+                       ramHotPlug, ramHotUnPlug, nicHotUnPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
+            }
 
-	    public UpdatePayload build() {
-	       return UpdatePayload.create(snapshotId, description, name, bootable, osType, cpuHotplug, cpuHotunplug, ramHotplug, ramHotunplug, nicHotplug, nicHotunplug, discVirtioHotplug, discVirtioHotunplug);
-	    }
-	 }
+            @Override
+            public Builder self() {
+               return this;
+            }
+         }
 
       }
 
       @AutoValue
       public abstract static class RollbackPayload {
 
-	 public abstract String snapshotId();
+         public abstract String snapshotId();
 
-	 public abstract String storageId();
+         public abstract String storageId();
 
-	 public static RollbackPayload create(String snapshotId, String storageId) {
-	    return new AutoValue_Snapshot_Request_RollbackPayload(snapshotId, storageId);
-	 }
+         public static RollbackPayload create(String snapshotId, String storageId) {
+            return new AutoValue_Snapshot_Request_RollbackPayload(snapshotId, storageId);
+         }
 
-	 public static class Builder {
+         public static class Builder {
 
-	    private String snapshotId;
+            private String snapshotId;
 
-	    private String storageId;
+            private String storageId;
 
-	    public Builder snapshotId(String snapshotId) {
-	       this.snapshotId = snapshotId;
-	       return this;
-	    }
+            public Builder snapshotId(String snapshotId) {
+               this.snapshotId = snapshotId;
+               return this;
+            }
 
-	    public Builder storageId(String storageId) {
-	       this.storageId = storageId;
-	       return this;
-	    }
+            public Builder storageId(String storageId) {
+               this.storageId = storageId;
+               return this;
+            }
 
-	    public RollbackPayload build() {
-	       return RollbackPayload.create(snapshotId, storageId);
-	    }
-	 }
+            public RollbackPayload build() {
+               return RollbackPayload.create(snapshotId, storageId);
+            }
+         }
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
index 827217b..21664a5 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
@@ -28,6 +28,7 @@ import org.jclouds.javax.annotation.Nullable;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
+import static org.jclouds.profitbricks.util.Passwords.isValidPassword;
 
 @AutoValue
 public abstract class Storage {
@@ -194,7 +195,8 @@ public abstract class Storage {
          public abstract String profitBricksImagePassword();
 
          public static CreatePayload create(String dataCenterId, float size, String name, String mountImageId, String imagePassword) {
-            validateSize(size);
+            checkSize(size);
+            checkPassword(imagePassword);
             return new AutoValue_Storage_Request_CreatePayload(dataCenterId, size, name, mountImageId, imagePassword);
          }
 
@@ -258,7 +260,7 @@ public abstract class Storage {
          public abstract String mountImageId();
 
          public static UpdatePayload create(String id, Float size, String name, String mountImageId) {
-            validateSize(size);
+            checkSize(size);
             return new AutoValue_Storage_Request_UpdatePayload(id, size, name, mountImageId);
          }
 
@@ -346,10 +348,15 @@ public abstract class Storage {
          }
       }
 
-      private static void validateSize(Float size) {
+      private static void checkSize(Float size) {
          if (size != null)
             checkArgument(size > 1, "Storage size must be > 1GB");
+      }
 
+      private static void checkPassword(String password) {
+         if (password != null)
+            checkArgument(isValidPassword(password), "Password must be between 8 and 50 characters, "
+                    + "only a-z, A-Z, 0-9 without  characters i, I, l, o, O, w, W, y, Y, z, Z and 1, 0");
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/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
new file mode 100644
index 0000000..98faf41
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/HotPluggable.java
@@ -0,0 +1,102 @@
+/*
+ * 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/ed247e7d/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
new file mode 100644
index 0000000..b81dc3b
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/Provisionable.java
@@ -0,0 +1,67 @@
+/*
+ * 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/ed247e7d/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
index 7366fb1..382f2cf 100644
--- 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
@@ -16,30 +16,10 @@
  */
 package org.jclouds.profitbricks.domain.internal;
 
-import org.jclouds.javax.annotation.Nullable;
-
 /**
  * An interface used as common data type for {@link org.jclouds.profitbricks.domain.Server.Builder}
  */
-public interface ServerCommonProperties {
-
-   @Nullable
-   Boolean isCpuHotPlug();
-
-   @Nullable
-   Boolean isRamHotPlug();
-
-   @Nullable
-   Boolean isNicHotPlug();
-
-   @Nullable
-   Boolean isNicHotUnPlug();
-
-   @Nullable
-   Boolean isDiscVirtioHotPlug();
-
-   @Nullable
-   Boolean isDiscVirtioHotUnPlug();
+public interface ServerCommonProperties extends HotPluggable {
 
    String name();
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
index cbac54a..3d37183 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
@@ -80,7 +80,7 @@ public interface LoadBalancerApi {
    @POST
    @Named("loadbalancer:delete")
    @Payload("<ws:deleteLoadBalancer><loadBalancerId>{id}</loadBalancerId></ws:deleteLoadBalancer>")
-   boolean deleteLoadbalancer(@PayloadParam("id") String id);
+   boolean deleteLoadBalancer(@PayloadParam("id") String id);
 
    @POST
    @Named("loadbalancer:update")

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
index b654801..df0d3e0 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
@@ -16,15 +16,15 @@
  */
 package org.jclouds.profitbricks.http.parser.firewall;
 
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-
 import java.util.List;
 
 import org.jclouds.profitbricks.domain.Firewall;
 import org.jclouds.profitbricks.http.parser.firewall.rule.FirewallRuleListResponseHandler;
 import org.xml.sax.SAXException;
 
+import com.google.inject.Inject;
+import com.google.common.collect.Lists;
+
 public class FirewallListResponseHandler extends BaseFirewallResponseHandler<List<Firewall>> {
 
    private List<Firewall> firewalls;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
index 6a0b419..3ef85b3 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
@@ -16,15 +16,15 @@
  */
 package org.jclouds.profitbricks.http.parser.ipblock;
 
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-
 import java.util.List;
 
 import org.jclouds.profitbricks.domain.IpBlock;
 import org.jclouds.profitbricks.http.parser.publicip.PublicIpListResponseHandler;
 import org.xml.sax.SAXException;
 
+import com.google.inject.Inject;
+import com.google.common.collect.Lists;
+
 public class IpBlockListResponseHandler extends BaseIpBlockResponseHandler<List<IpBlock>> {
 
    private final List<IpBlock> ipBlocks;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
index e093977..96256bb 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
@@ -16,9 +16,12 @@
  */
 package org.jclouds.profitbricks.http.parser.loadbalancer;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.util.Date;
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+
+import org.jclouds.date.DateService;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
 import org.jclouds.profitbricks.domain.ProvisioningState;
@@ -34,23 +37,23 @@ public abstract class BaseLoadBalancerResponseHandler<T> extends BaseProfitBrick
    protected final FirewallListResponseHandler firewallListResponseHandler;
 
    protected LoadBalancer.Builder builder;
-   protected final DateCodec dateCodec;
+   protected DataCenter.Builder dataCenterBuilder;
+
+   protected final DateService dateService;
 
    protected boolean useBalancedServerParser = false;
    protected boolean useFirewallParser = false;
 
-   protected BaseLoadBalancerResponseHandler(DateCodecFactory dateCodec,
+   protected BaseLoadBalancerResponseHandler(DateService dateService,
            ServerListResponseHandler balancedServerResponseHandler, FirewallListResponseHandler firewallResponseHandler) {
 
-      if (dateCodec == null)
-         throw new NullPointerException("DateCodecFactory cannot be null");
-      if (balancedServerResponseHandler == null)
-         throw new NullPointerException("BalancedServerResponseHandler cannot be null");
-      if (firewallResponseHandler == null)
-         throw new NullPointerException("FirewallListResponseHandler cannot be null");
+      checkNotNull(dateService, "DateService cannot be null");
+      checkNotNull(balancedServerResponseHandler, "BalancedServerResponseHandler cannot be null");
+      checkNotNull(firewallResponseHandler, "FirewallListResponseHandler cannot be null");
 
-      this.dateCodec = dateCodec.iso8601();
+      this.dateService = dateService;
       this.builder = LoadBalancer.builder();
+      this.dataCenterBuilder = DataCenter.builder();
 
       this.balancedServerResponseHandler = balancedServerResponseHandler;
       this.firewallListResponseHandler = firewallResponseHandler;
@@ -80,7 +83,7 @@ public abstract class BaseLoadBalancerResponseHandler<T> extends BaseProfitBrick
    }
 
    protected final Date textToIso8601Date() {
-      return dateCodec.toDate(textToStringValue());
+      return dateService.iso8601DateOrSecondsDateParse(textToStringValue());
    }
 
    @Override
@@ -90,11 +93,11 @@ public abstract class BaseLoadBalancerResponseHandler<T> extends BaseProfitBrick
       else if ("loadBalancerName".equals(qName))
          builder.name(textToStringValue());
       else if ("loadBalancerAlgorithm".equals(qName))
-         builder.loadBalancerAlgorithm(Algorithm.fromValue(textToStringValue()));
+         builder.algorithm(Algorithm.fromValue(textToStringValue()));
       else if ("dataCenterId".equals(qName))
-         builder.dataCenterId(textToStringValue());
+         dataCenterBuilder.id(textToStringValue());
       else if ("dataCenterVersion".equals(qName))
-         builder.dataCenterVersion(textToStringValue());
+         dataCenterBuilder.version(textToIntValue());
       else if ("internetAccess".equals(qName))
          builder.internetAccess(textToBooleanValue());
       else if ("ip".equals(qName))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
index 50c1bea..9c60d33 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
@@ -21,7 +21,8 @@ import com.google.inject.Inject;
 
 import java.util.List;
 
-import org.jclouds.date.DateCodecFactory;
+import org.jclouds.date.DateService;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.jclouds.profitbricks.http.parser.firewall.FirewallListResponseHandler;
 import org.jclouds.profitbricks.http.parser.server.ServerListResponseHandler;
@@ -32,40 +33,46 @@ public class LoadBalancerListResponseHandler extends BaseLoadBalancerResponseHan
    private final List<LoadBalancer> loadBalancers;
 
    @Inject
-   LoadBalancerListResponseHandler(DateCodecFactory dateCodec, ServerListResponseHandler balancedServerResponseHandler, FirewallListResponseHandler firewallListResponseHandler) {
-      super(dateCodec, balancedServerResponseHandler, firewallListResponseHandler);
+   LoadBalancerListResponseHandler(DateService dateService, ServerListResponseHandler balancedServerResponseHandler, FirewallListResponseHandler firewallListResponseHandler) {
+      super(dateService, balancedServerResponseHandler, firewallListResponseHandler);
       this.loadBalancers = Lists.newArrayList();
    }
 
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
-      if (useBalancedServerParser) {
+      if (useBalancedServerParser)
          balancedServerResponseHandler.endElement(uri, localName, qName);
-      } else if (useFirewallParser) {
+      else if (useFirewallParser)
          firewallListResponseHandler.endElement(uri, localName, qName);
-      } else {
+      else {
          setPropertyOnEndTag(qName);
          if ("return".equals(qName)) {
             loadBalancers.add(builder
+                    .dataCenter(dataCenterBuilder.build())
                     .firewalls(firewallListResponseHandler.getResult())
                     .balancedServers(balancedServerResponseHandler.getResult())
                     .build());
 
             balancedServerResponseHandler.reset();
             firewallListResponseHandler.reset();
+
             builder = LoadBalancer.builder();
          }
          clearTextBuffer();
       }
-      if ("firewall".equals(qName)) {
+      if ("firewall".equals(qName))
          useFirewallParser = false;
-      } else if ("balancedServers".equals(qName)) {
+      else if ("balancedServers".equals(qName))
          useBalancedServerParser = false;
-      }
 
    }
 
    @Override
+   public void reset() {
+      this.dataCenterBuilder = DataCenter.builder();
+   }
+
+   @Override
    public List<LoadBalancer> getResult() {
       return loadBalancers;
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandler.java
index 8c79512..4a17535 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandler.java
@@ -17,7 +17,8 @@
 package org.jclouds.profitbricks.http.parser.loadbalancer;
 
 import com.google.inject.Inject;
-import org.jclouds.date.DateCodecFactory;
+
+import org.jclouds.date.DateService;
 import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.jclouds.profitbricks.http.parser.firewall.FirewallListResponseHandler;
 import org.jclouds.profitbricks.http.parser.server.ServerListResponseHandler;
@@ -28,8 +29,9 @@ public class LoadBalancerResponseHandler extends BaseLoadBalancerResponseHandler
    private boolean done = false;
 
    @Inject
-   LoadBalancerResponseHandler(DateCodecFactory dateCodec, ServerListResponseHandler serverListResponseHandler, FirewallListResponseHandler firewallListResponseHandler) {
-      super(dateCodec, serverListResponseHandler, firewallListResponseHandler);
+   LoadBalancerResponseHandler(DateService dateService, ServerListResponseHandler serverListResponseHandler,
+           FirewallListResponseHandler firewallListResponseHandler) {
+      super(dateService, serverListResponseHandler, firewallListResponseHandler);
    }
 
    @Override
@@ -45,8 +47,9 @@ public class LoadBalancerResponseHandler extends BaseLoadBalancerResponseHandler
          setPropertyOnEndTag(qName);
          if ("return".equals(qName)) {
             done = true;
-            builder.balancedServers(balancedServerResponseHandler.getResult());
-            builder.firewalls(firewallListResponseHandler.getResult());
+            builder.dataCenter(dataCenterBuilder.build())
+                    .balancedServers(balancedServerResponseHandler.getResult())
+                    .firewalls(firewallListResponseHandler.getResult());
          }
          clearTextBuffer();
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
index 60fb4bf..37aabd5 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
@@ -16,10 +16,13 @@
  */
 package org.jclouds.profitbricks.http.parser.server;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.util.Date;
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+
+import org.jclouds.date.DateService;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
@@ -31,29 +34,28 @@ import org.xml.sax.SAXException;
 
 public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
 
-   protected StorageListResponseHandler storageListResponseHandler;
-   protected NicListResponseHandler nicListResponseHandler;
+   protected final StorageListResponseHandler storageListResponseHandler;
+   protected final NicListResponseHandler nicListResponseHandler;
 
+   protected DataCenter.Builder dataCenterBuilder;
    protected Server.DescribingBuilder builder;
 
-   protected final DateCodec dateCodec;
+   protected final DateService dateService;
 
    protected boolean useStorageParser = false;
    protected boolean useNicParser = false;
 
-   BaseServerResponseHandler(DateCodecFactory dateCodec, StorageListResponseHandler storageListResponseHandler,
+   BaseServerResponseHandler(DateService dateService, StorageListResponseHandler storageListResponseHandler,
            NicListResponseHandler nicListResponseHandler) {
-      if (dateCodec == null)
-         throw new NullPointerException("DateCodecFactory cannot be null");
-      if (storageListResponseHandler == null)
-         throw new NullPointerException("StorageListResponseHandler cannot be null");
-      if (nicListResponseHandler == null)
-         throw new NullPointerException("NicListResponseHandler cannot be null");
-
-      this.dateCodec = dateCodec.iso8601();
+      checkNotNull(dateService, "DateService cannot be null");
+      checkNotNull(storageListResponseHandler, "StorageListResponseHandler cannot be null");
+      checkNotNull(nicListResponseHandler, "NicListResponseHandler cannot be null");
+
+      this.dateService = dateService;
       this.storageListResponseHandler = storageListResponseHandler;
       this.nicListResponseHandler = nicListResponseHandler;
       this.builder = Server.builder();
+      this.dataCenterBuilder = DataCenter.builder();
    }
 
    @Override
@@ -82,12 +84,16 @@ public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksRespo
    }
 
    protected final Date textToIso8601Date() {
-      return dateCodec.toDate(textToStringValue());
+      return dateService.iso8601DateOrSecondsDateParse(textToStringValue());
    }
 
    @Override
    protected void setPropertyOnEndTag(String qName) {
-      if ("serverId".equals(qName))
+      if ("dataCenterId".equals(qName))
+         dataCenterBuilder.id(textToStringValue());
+      else if ("dataCenterVersion".equals(qName))
+         dataCenterBuilder.version(textToIntValue());
+      else if ("serverId".equals(qName))
          builder.id(textToStringValue());
       else if ("serverName".equals(qName))
          builder.name(textToStringValue());
@@ -122,7 +128,7 @@ public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksRespo
       else if ("discVirtioHotUnPlug".equals(qName))
          builder.isDiscVirtioHotUnPlug(textToBooleanValue());
       else if ("activate".equals(qName))
-         builder.activate(textToBooleanValue());
+         builder.loadBalanced(textToBooleanValue());
       else if ("balancedNicId".equals(qName))
          builder.balancedNicId(textToStringValue());
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
index 68ee696..016e164 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
@@ -18,7 +18,7 @@ package org.jclouds.profitbricks.http.parser.server;
 
 import com.google.inject.Inject;
 
-import org.jclouds.date.DateCodecFactory;
+import org.jclouds.date.DateService;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.http.parser.nic.NicListResponseHandler;
 import org.jclouds.profitbricks.http.parser.storage.StorageListResponseHandler;
@@ -29,9 +29,9 @@ public class ServerInfoResponseHandler extends BaseServerResponseHandler<Server>
    private boolean done = false;
 
    @Inject
-   ServerInfoResponseHandler(DateCodecFactory dateCodec, StorageListResponseHandler storageListResponseHandler,
+   ServerInfoResponseHandler(DateService dateService, StorageListResponseHandler storageListResponseHandler,
            NicListResponseHandler nicListResponseHandler) {
-      super(dateCodec, storageListResponseHandler, nicListResponseHandler);
+      super(dateService, storageListResponseHandler, nicListResponseHandler);
    }
 
    @Override
@@ -48,6 +48,7 @@ public class ServerInfoResponseHandler extends BaseServerResponseHandler<Server>
          if ("return".equals(qName)) {
             done = true;
             builder
+                    .dataCenter(dataCenterBuilder.build())
                     .storages(storageListResponseHandler.getResult())
                     .nics(nicListResponseHandler.getResult());
          }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
index 362e378..24a5daa 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
@@ -21,7 +21,8 @@ import com.google.inject.Inject;
 
 import java.util.List;
 
-import org.jclouds.date.DateCodecFactory;
+import org.jclouds.date.DateService;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.http.parser.nic.NicListResponseHandler;
 import org.jclouds.profitbricks.http.parser.storage.StorageListResponseHandler;
@@ -32,9 +33,9 @@ public class ServerListResponseHandler extends BaseServerResponseHandler<List<Se
    private List<Server> servers;
 
    @Inject
-   ServerListResponseHandler(DateCodecFactory dateCodec, StorageListResponseHandler storageListResponseHandler,
+   ServerListResponseHandler(DateService dateService, StorageListResponseHandler storageListResponseHandler,
            NicListResponseHandler nicListResponseHandler) {
-      super(dateCodec, storageListResponseHandler, nicListResponseHandler);
+      super(dateService, storageListResponseHandler, nicListResponseHandler);
       this.servers = Lists.newArrayList();
    }
 
@@ -48,10 +49,18 @@ public class ServerListResponseHandler extends BaseServerResponseHandler<List<Se
       else {
          setPropertyOnEndTag(qName);
          if ("return".equals(qName) || "servers".equals(qName) || "balancedServers".equals(qName)) {
-            servers.add(builder
-                    .storages(storageListResponseHandler.getResult())
-                    .nics(nicListResponseHandler.getResult())
-                    .build());
+            Server.DescribingBuilder sdb = null;
+            try {
+               sdb = builder
+                       .storages(storageListResponseHandler.getResult())
+                       .nics(nicListResponseHandler.getResult());
+               servers.add(sdb
+                       // For LoadBalancer's case, there's no DataCenter (may throw NPE on #build()). 
+                       .dataCenter(dataCenterBuilder.build())
+                       .build());
+            } catch (NullPointerException ex) {
+               servers.add(sdb.build());
+            }
             storageListResponseHandler.reset();
             nicListResponseHandler.reset();
 
@@ -69,6 +78,7 @@ public class ServerListResponseHandler extends BaseServerResponseHandler<List<Se
    @Override
    public void reset() {
       this.servers = Lists.newArrayList();
+      this.dataCenterBuilder = DataCenter.builder();
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/BaseSnapshotResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/BaseSnapshotResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/BaseSnapshotResponseHandler.java
index 0fa7fd6..aa27199 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/BaseSnapshotResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/BaseSnapshotResponseHandler.java
@@ -17,8 +17,8 @@
 package org.jclouds.profitbricks.http.parser.snapshot;
 
 import java.util.Date;
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+
+import org.jclouds.date.DateService;
 import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
@@ -29,55 +29,55 @@ public abstract class BaseSnapshotResponseHandler<T> extends BaseProfitBricksRes
 
    protected Snapshot.Builder builder;
 
-   protected final DateCodec dateCodec;
+   protected final DateService dateService;
 
-   BaseSnapshotResponseHandler(DateCodecFactory dateCodec) {
-      this.dateCodec = dateCodec.iso8601();
+   BaseSnapshotResponseHandler(DateService dateService) {
+      this.dateService = dateService;
       this.builder = Snapshot.builder();
    }
 
    protected final Date textToIso8601Date() {
-      return dateCodec.toDate(textToStringValue());
+      return dateService.iso8601DateOrSecondsDateParse(textToStringValue());
    }
 
    @Override
    protected void setPropertyOnEndTag(String qName) {
       if ("snapshotId".equals(qName))
-	 builder.id(textToStringValue());
+         builder.id(textToStringValue());
       else if ("snapshotName".equals(qName))
-	 builder.name(textToStringValue());
+         builder.name(textToStringValue());
       else if ("snapshotSize".equals(qName))
-	 builder.size(textToFloatValue());
+         builder.size(textToFloatValue());
       else if ("osType".equals(qName))
-	 builder.osType(OsType.fromValue(textToStringValue()));
+         builder.osType(OsType.fromValue(textToStringValue()));
       else if ("location".equals(qName))
-	 builder.location(Location.fromId(textToStringValue()));
+         builder.location(Location.fromId(textToStringValue()));
       else if ("description".equals(qName))
-	 builder.description(qName);
+         builder.description(qName);
       else if ("bootable".equals(qName))
-	 builder.bootable(textToBooleanValue());
+         builder.isBootable(textToBooleanValue());
       else if ("cpuHotPlug".equals(qName))
-	 builder.cpuHotPlug(textToBooleanValue());
+         builder.isCpuHotPlug(textToBooleanValue());
       else if ("cpuHotUnPlug".equals(qName))
-	 builder.cpuHotUnPlug(textToBooleanValue());
+         builder.isCpuHotUnPlug(textToBooleanValue());
       else if ("ramHotPlug".equals(qName))
-	 builder.ramHotPlug(textToBooleanValue());
+         builder.isRamHotPlug(textToBooleanValue());
       else if ("ramHotUnPlug".equals(qName))
-	 builder.ramHotUnPlug(textToBooleanValue());
+         builder.isRamHotUnPlug(textToBooleanValue());
       else if ("nicHotPlug".equals(qName))
-	 builder.nicHotPlug(textToBooleanValue());
+         builder.isNicHotPlug(textToBooleanValue());
       else if ("nicHotUnPlug".equals(qName))
-	 builder.nicHotUnPlug(textToBooleanValue());
+         builder.isNicHotUnPlug(textToBooleanValue());
       else if ("discVirtioHotPlug".equals(qName))
-	 builder.discVirtioHotPlug(textToBooleanValue());
+         builder.isDiscVirtioHotPlug(textToBooleanValue());
       else if ("discVirtioHotUnPlug".equals(qName))
-	 builder.discVirtioHotUnPlug(textToBooleanValue());
+         builder.isDiscVirtioHotUnPlug(textToBooleanValue());
       else if ("provisioningState".equals(qName))
-	 builder.state(ProvisioningState.fromValue(textToStringValue()));
+         builder.state(ProvisioningState.fromValue(textToStringValue()));
       else if ("creationTimestamp".equals(qName))
-	 builder.creationTime(textToIso8601Date());
+         builder.creationTime(textToIso8601Date());
       else if ("modificationTimestamp".equals(qName))
-	 builder.lastModificationTime(textToIso8601Date());
+         builder.lastModificationTime(textToIso8601Date());
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandler.java
index ae7a355..27e8583 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandler.java
@@ -18,19 +18,21 @@ package org.jclouds.profitbricks.http.parser.snapshot;
 
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
+
 import org.jclouds.profitbricks.domain.Snapshot;
 import org.xml.sax.SAXException;
 
 import java.util.List;
-import org.jclouds.date.DateCodecFactory;
+
+import org.jclouds.date.DateService;
 
 public class SnapshotListResponseHandler extends BaseSnapshotResponseHandler<List<Snapshot>> {
 
    private final List<Snapshot> snapshots;
 
    @Inject
-   SnapshotListResponseHandler(DateCodecFactory dateCodec) {
-      super(dateCodec);
+   SnapshotListResponseHandler(DateService dateService) {
+      super(dateService);
       this.snapshots = Lists.newArrayList();
    }
 
@@ -38,8 +40,8 @@ public class SnapshotListResponseHandler extends BaseSnapshotResponseHandler<Lis
    public void endElement(String uri, String localName, String qName) throws SAXException {
       setPropertyOnEndTag(qName);
       if ("return".equals(qName)) {
-	 snapshots.add(builder.build());
-	 builder = Snapshot.builder();
+         snapshots.add(builder.build());
+         builder = Snapshot.builder();
       }
       clearTextBuffer();
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandler.java
index 84316f8..c57e385 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandler.java
@@ -17,7 +17,8 @@
 package org.jclouds.profitbricks.http.parser.snapshot;
 
 import com.google.inject.Inject;
-import org.jclouds.date.DateCodecFactory;
+
+import org.jclouds.date.DateService;
 import org.jclouds.profitbricks.domain.Snapshot;
 import org.xml.sax.SAXException;
 
@@ -26,17 +27,17 @@ public class SnapshotResponseHandler extends BaseSnapshotResponseHandler<Snapsho
    private boolean done = false;
 
    @Inject
-   SnapshotResponseHandler(DateCodecFactory dateCodec) {
-      super(dateCodec);
+   SnapshotResponseHandler(DateService dateService) {
+      super(dateService);
    }
 
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
       if (done)
-	 return;
+         return;
       setPropertyOnEndTag(qName);
       if ("return".equals(qName))
-	 done = true;
+         done = true;
       clearTextBuffer();
    }
 


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

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
index e7c2eda..12670cd 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
@@ -16,45 +16,46 @@
  */
 package org.jclouds.profitbricks.features;
 
-import com.google.common.collect.Iterables;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
 import java.util.List;
+
+import com.google.common.collect.Iterables;
+
 import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.IpBlock;
-import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.domain.Nic;
-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", singleThreaded = true)
+@Test(groups = "live", testName = "IpBlockApiLiveTest")
 public class IpBlockApiLiveTest extends BaseProfitBricksLiveTest {
 
-   private String nicid;
-   private IpBlock newIpBlock;
-
-   @Override
-   public void initialize() {
-      super.initialize();
-
-      List<Nic> nics = api.nicApi().getAllNics();
+   private DataCenter dataCenter;
+   private Nic nic;
 
-      assertFalse(nics.isEmpty(), "At least one NIC is requred to test IpBlocks");
-
-      Nic nic = Iterables.getFirst(nics, null);
+   private IpBlock newIpBlock;
 
-      nicid = nic.id();
+   @BeforeClass
+   public void setupTest() {
+      dataCenter = findOrCreateDataCenter("ipBlockApiLiveTest" + System.currentTimeMillis());
+      nic = findOrCreateNic(dataCenter);
    }
 
    @Test
    public void testReservePublicIpBlock() {
-      newIpBlock = api.ipBlockApi().reservePublicIpBlock("2", Location.US_LAS.getId());
+      assertDataCenterAvailable(dataCenter);
+      newIpBlock = api.ipBlockApi().reservePublicIpBlock(1, testLocation);
 
       assertNotNull(newIpBlock);
-      assertNotNull(newIpBlock.ips());
       assertFalse(newIpBlock.ips().isEmpty());
    }
 
-   @Test
+   @Test(dependsOnMethods = "testReservePublicIpBlock")
    public void testGetAllIpBlocks() {
       List<IpBlock> ipBlocks = api.ipBlockApi().getAllIpBlock();
 
@@ -71,22 +72,40 @@ public class IpBlockApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test(dependsOnMethods = "testReservePublicIpBlock")
    public void testAddPublicIpToNic() {
-      String requestId = api.ipBlockApi().addPublicIpToNic(newIpBlock.ips().get(0), nicid);
+      assertDataCenterAvailable(dataCenter);
+      String ipToAdd = Iterables.getFirst(newIpBlock.ips(), null);
+      String requestId = api.ipBlockApi().addPublicIpToNic(
+              ipToAdd, nic.id());
 
       assertNotNull(requestId);
+      assertDataCenterAvailable(dataCenter);
+      List<String> ips = api.nicApi().getNic(nic.id()).ips();
+      assertTrue(ips.contains(ipToAdd), "NIC didn't contain added public ip");
    }
 
    @Test(dependsOnMethods = "testAddPublicIpToNic")
    public void testRemovePublicIpFromNic() {
-      String requestId = api.ipBlockApi().removePublicIpFromNic(newIpBlock.ips().get(0), nicid);
+      assertDataCenterAvailable(dataCenter);
+      String ipToRemove = Iterables.getFirst(newIpBlock.ips(), null);
+      String requestId = api.ipBlockApi().removePublicIpFromNic(
+              ipToRemove, nic.id());
 
       assertNotNull(requestId);
+      assertDataCenterAvailable(dataCenter);
+      List<String> ips = api.nicApi().getNic(nic.id()).ips();
+      assertFalse(ips.contains(ipToRemove), "NIC still contains removed public ip");
    }
 
    @Test(dependsOnMethods = "testRemovePublicIpFromNic")
    public void testReleasePublicIpBlock() {
+      assertDataCenterAvailable(dataCenter);
       String requestId = api.ipBlockApi().releasePublicIpBlock(newIpBlock.id());
 
       assertNotNull(requestId);
    }
+
+   @AfterClass(alwaysRun = true)
+   public void cleanUp() {
+      destroyDataCenter(dataCenter);
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
index e948e76..234f163 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
@@ -119,12 +119,12 @@ public class IpBlockApiMockTest extends BaseProfitBricksMockTest {
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       IpBlockApi api = pbApi.ipBlockApi();
 
-      String blockSize = "2";
+      int blockSize = 2;
       Location location = Location.US_LAS;
 
       String content = "<ws:reservePublicIpBlock><request><blockSize>" + blockSize + "</blockSize><location>" + location.getId() + "</location></request></ws:reservePublicIpBlock>";
       try {
-         IpBlock ipBlock = api.reservePublicIpBlock(blockSize, location.getId());
+         IpBlock ipBlock = api.reservePublicIpBlock(blockSize, location);
          assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(ipBlock);
       } finally {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiLiveTest.java
index e293e1c..0780f78 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiLiveTest.java
@@ -16,61 +16,58 @@
  */
 package org.jclouds.profitbricks.features;
 
+import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
 
 import java.util.List;
+import java.util.Objects;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
-import org.assertj.core.util.Lists;
 import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
 import org.jclouds.profitbricks.domain.Server;
-import org.testng.Assert;
 import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "LoadBalancerApiLiveTest")
 public class LoadBalancerApiLiveTest extends BaseProfitBricksLiveTest {
 
-   private String dataCenterId;
-   private String loadBalancerId;
-   private String serverId;
-
-   @Override
-   protected void initialize() {
-      super.initialize();
-      List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
-      assertFalse(dataCenters.isEmpty(), "At least 1 datacenter has to be available for loadbalancer testing.");
-
-      dataCenterId = Iterables.getFirst(dataCenters, null).id();
+   private DataCenter dataCenter;
+   private Server server;
 
-      List<Server> servers = api.serverApi().getAllServers();
-      assertFalse(servers.isEmpty(), "At least 1 server has to be available for loadbalancer testing.");
+   private String loadBalancerId;
 
-      serverId = Iterables.getFirst(servers, null).id();
+   @BeforeClass
+   public void setupTest() {
+      dataCenter = findOrCreateDataCenter("loadBalancerApiLiveTest" + System.currentTimeMillis());
+      server = findOrCreateServer(dataCenter);
    }
 
    @Test
    public void testCreateLoadBalancer() {
-      List<String> serverIds = com.google.common.collect.Lists.newArrayList();
-      serverIds.add("server-ids");
-
-      LoadBalancer.Request.CreatePayload payload = LoadBalancer.Request.creatingBuilder()
-              .dataCenterId(dataCenterId)
+      assertDataCenterAvailable(dataCenter);
+      String createdId = api.loadBalancerApi().createLoadBalancer(
+              LoadBalancer.Request.creatingBuilder()
+              .dataCenterId(dataCenter.id())
               .name("testName")
               .algorithm(Algorithm.ROUND_ROBIN)
-              .ip("0.0.0.1")
+              .ip("192.168.0.200")
               .lanId(1)
-              .serverIds(serverIds)
-              .build();
-
-      String requestId = api.loadBalancerApi().createLoadBalancer(payload);
+              .build()
+      );
 
-      assertNotNull(requestId);
+      assertNotNull(createdId);
+      assertDataCenterAvailable(dataCenter);
+      this.loadBalancerId = createdId;
    }
 
    @Test(dependsOnMethods = "testCreateLoadBalancer")
@@ -85,50 +82,76 @@ public class LoadBalancerApiLiveTest extends BaseProfitBricksLiveTest {
       LoadBalancer loadBalancer = api.loadBalancerApi().getLoadBalancer(loadBalancerId);
 
       assertNotNull(loadBalancer);
+      assertEquals(loadBalancer.id(), loadBalancerId);
    }
 
-   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   @Test(dependsOnMethods = "testGetLoadBalancer")
    public void testRegisterLoadBalancer() {
-      List<String> serverIds = Lists.newArrayList();
-      serverIds.add(serverId);
-
-      LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request
-              .createRegisteringPaylod(loadBalancerId, serverIds);
-
-      LoadBalancer loadBalancer = api.loadBalancerApi().registerLoadBalancer(payload);
+      assertDataCenterAvailable(dataCenter);
+      LoadBalancer loadBalancer = api.loadBalancerApi().registerLoadBalancer(
+              LoadBalancer.Request
+              .createRegisteringPaylod(loadBalancerId, ImmutableList.of(server.id()))
+      );
 
       assertNotNull(loadBalancer);
+      assertDataCenterAvailable(dataCenter);
+      Optional<Server> balancedServer = Iterables.tryFind(loadBalancer.balancedServers(), new Predicate<Server>() {
+
+         @Override
+         public boolean apply(Server t) {
+            return Objects.equals(t.id(), server.id());
+         }
+      });
+      assertTrue(balancedServer.isPresent(), "Server input wasn't registered to loadbalancer");
    }
 
    @Test(dependsOnMethods = "testRegisterLoadBalancer")
    public void testDeregisterLoadBalancer() {
-      List<String> serverIds = Lists.newArrayList();
-      serverIds.add(serverId);
-
-      LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request
-              .createDeregisteringPayload(loadBalancerId, serverIds);
-
-      LoadBalancer loadBalancer = api.loadBalancerApi().deregisterLoadBalancer(payload);
+      assertDataCenterAvailable(dataCenter);
+      String requestId = api.loadBalancerApi().deregisterLoadBalancer(
+              LoadBalancer.Request
+              .createDeregisteringPayload(loadBalancerId, ImmutableList.of(server.id()))
+      );
 
-      assertNotNull(loadBalancer);
+      assertNotNull(requestId);
+      assertDataCenterAvailable(dataCenter);
+      LoadBalancer loadBalancer = api.loadBalancerApi().getLoadBalancer(loadBalancerId);
+      Optional<Server> balancedServer = Iterables.tryFind(loadBalancer.balancedServers(), new Predicate<Server>() {
+
+         @Override
+         public boolean apply(Server t) {
+            return Objects.equals(t.id(), loadBalancerId);
+         }
+      });
+      assertFalse(balancedServer.isPresent(), "Server input wasn't deregistered from loadbalancer");
    }
 
-   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   @Test(dependsOnMethods = "testDeregisterLoadBalancer")
    public void testUpdateLoadBalancer() {
-      LoadBalancer.Request.UpdatePayload payload = LoadBalancer.Request.updatingBuilder()
+      assertDataCenterAvailable(dataCenter);
+      String newName = "whatever";
+      String requestId = api.loadBalancerApi().updateLoadBalancer(
+              LoadBalancer.Request.updatingBuilder()
               .id(loadBalancerId)
-              .name("whatever")
-              .build();
-
-      LoadBalancer loadBalancer = api.loadBalancerApi().updateLoadBalancer(payload);
+              .name(newName)
+              .build()
+      );
 
-      assertNotNull(loadBalancer);
+      assertNotNull(requestId);
+      assertDataCenterAvailable(dataCenter);
+      LoadBalancer loadBalancer = api.loadBalancerApi().getLoadBalancer(loadBalancerId);
+      assertEquals(loadBalancer.name(), newName);
    }
 
-   @AfterClass(alwaysRun = true)
+   @Test(dependsOnMethods = "testUpdateLoadBalancer")
    public void testDeleteLoadBalancer() {
+      assertDataCenterAvailable(dataCenter);
       boolean result = api.loadBalancerApi().deleteLoadBalancer(loadBalancerId);
+      assertTrue(result, "Test load balancer wasn't deleted");
+   }
 
-      Assert.assertTrue(result);
+   @AfterClass(alwaysRun = true)
+   public void cleanUp() {
+      destroyDataCenter(dataCenter);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiMockTest.java
index c4f26aa..e4e8fd7 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiMockTest.java
@@ -23,9 +23,11 @@ import static org.testng.AssertJUnit.assertTrue;
 
 import java.util.List;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.squareup.okhttp.mockwebserver.MockResponse;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
+
 import org.jclouds.profitbricks.ProfitBricksApi;
 import org.jclouds.profitbricks.domain.LoadBalancer;
 import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
@@ -142,7 +144,7 @@ public class LoadBalancerApiMockTest extends BaseProfitBricksMockTest {
       try {
          List<String> serverIds = Lists.newArrayList();
          serverIds.add("server-ids");
-         String requestId = api.createLoadBalancer(LoadBalancer.Request.creatingBuilder()
+         String loadBalancerId = api.createLoadBalancer(LoadBalancer.Request.creatingBuilder()
                  .dataCenterId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee")
                  .name("load-balancer-name")
                  .algorithm(Algorithm.ROUND_ROBIN)
@@ -152,7 +154,7 @@ public class LoadBalancerApiMockTest extends BaseProfitBricksMockTest {
                  .build());
 
          assertRequestHasCommonProperties(server.takeRequest(), content);
-
+         assertEquals(loadBalancerId, "1234-1234-1234-1234");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -162,7 +164,7 @@ public class LoadBalancerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testUpdateLoadBalancer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-create.xml")));
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-update.xml")));
 
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       LoadBalancerApi api = pbApi.loadBalancerApi();
@@ -187,10 +189,10 @@ public class LoadBalancerApiMockTest extends BaseProfitBricksMockTest {
                  .ip("192.168.0.1")
                  .build();
 
-         LoadBalancer loadBalancer = api.updateLoadBalancer(toUpdate);
+         String requestId = api.updateLoadBalancer(toUpdate);
 
          assertRequestHasCommonProperties(server.takeRequest(), content);
-         assertNotNull(loadBalancer);
+         assertEquals(requestId, "request-id");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -207,11 +209,9 @@ public class LoadBalancerApiMockTest extends BaseProfitBricksMockTest {
       LoadBalancerApi api = pbApi.loadBalancerApi();
 
       String content = "<ws:registerServersOnLoadBalancer>"
-              + "<request>"
               + "<loadBalancerId>1234</loadBalancerId>"
               + "<serverIds>1</serverIds>"
               + "<serverIds>2</serverIds>"
-              + "</request>"
               + "</ws:registerServersOnLoadBalancer>";
 
       try {
@@ -225,6 +225,7 @@ public class LoadBalancerApiMockTest extends BaseProfitBricksMockTest {
 
          assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(loadBalancer);
+         assertEquals(loadBalancer.id(), "load-balancer-id");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -234,31 +235,25 @@ public class LoadBalancerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testDeregisterLoadBalancer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-update.xml")));
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-deregister.xml")));
 
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       LoadBalancerApi api = pbApi.loadBalancerApi();
 
       String content = "<ws:deregisterServersOnLoadBalancer>"
-              + "<request>"
               + "<serverIds>1</serverIds>"
               + "<serverIds>2</serverIds>"
               + "<loadBalancerId>load-balancer-id</loadBalancerId>"
-              + "</request>"
               + "</ws:deregisterServersOnLoadBalancer>";
 
       try {
-         List<String> serverIds = Lists.newArrayList();
-         serverIds.add("1");
-         serverIds.add("2");
-
          LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request
-                 .createDeregisteringPayload("load-balancer-id", serverIds);
+                 .createDeregisteringPayload("load-balancer-id", ImmutableList.of("1", "2"));
 
-         LoadBalancer loadBalancer = api.deregisterLoadBalancer(payload);
+         String requestId = api.deregisterLoadBalancer(payload);
 
          assertRequestHasCommonProperties(server.takeRequest(), content);
-         assertNotNull(loadBalancer);
+         assertEquals(requestId, "request-id");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -268,7 +263,7 @@ public class LoadBalancerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testDeleteLoadBalancer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-register.xml")));
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-delete.xml")));
 
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       LoadBalancerApi api = pbApi.loadBalancerApi();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiLiveTest.java
index fbbef8b..5253d1f 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiLiveTest.java
@@ -17,68 +17,47 @@
 package org.jclouds.profitbricks.features;
 
 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 com.google.common.collect.Iterables;
-
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Nic;
-import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
-import org.jclouds.util.Predicates2;
-
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
+import org.testng.annotations.BeforeClass;
 
-import com.google.common.base.Predicate;
-
-@Test(groups = "live", testName = "NicApiLiveTest", singleThreaded = true)
+@Test(groups = "live", testName = "NicApiLiveTest")
 public class NicApiLiveTest extends BaseProfitBricksLiveTest {
 
-   private Predicate<String> waitUntilAvailable;
+   private DataCenter dataCenter;
    private Server server;
-   private Nic createdNic;
 
-   @Override
-   protected void initialize() {
-      super.initialize();
-      List<Server> servers = api.serverApi().getAllServers();
-      assertFalse(servers.isEmpty(), "Must atleast have 1 server available for NIC testing.");
+   private String createdNicId;
 
-      this.server = Iterables.tryFind(servers, new Predicate<Server>() {
-
-         @Override
-         public boolean apply(Server input) {
-            return input.state() == ProvisioningState.AVAILABLE;
-         }
-      }).orNull();
-
-      this.waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.NIC, ProvisioningState.AVAILABLE),
-              2l * 60l, 2l, TimeUnit.SECONDS);
+   @BeforeClass
+   public void setupTest() {
+      dataCenter = findOrCreateDataCenter("nicApiLiveTest-" + System.currentTimeMillis());
+      server = findOrCreateServer(dataCenter);
    }
 
    @Test
    public void testCreateNic() {
-      Nic.Request.CreatePayload payload = Nic.Request.creatingBuilder()
+      assertDataCenterAvailable(dataCenter);
+      String nicId = api.nicApi().createNic(Nic.Request.creatingBuilder()
               .name("name nr1")
               .dhcpActive(true)
               .serverId(server.id())
               .lanId(1)
-              .build();
+              .build());
 
-      Nic nic = api.nicApi().createNic(payload);
-      assertNotNull(nic);
+      assertNotNull(nicId);
+      assertDataCenterAvailable(dataCenter);
 
-      waitUntilAvailable.apply(nic.id());
-      this.createdNic = nic;
+      this.createdNicId = nicId;
    }
 
    @Test(dependsOnMethods = "testCreateNic")
@@ -90,47 +69,56 @@ public class NicApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test(dependsOnMethods = "testCreateNic")
    public void testGetNic() {
-      Nic nic = api.nicApi().getNic(createdNic.id());
+      Nic nic = api.nicApi().getNic(createdNicId);
 
       assertNotNull(nic);
-      assertEquals(nic.id(), createdNic.id());
+      assertEquals(nic.id(), createdNicId);
    }
 
-   @Test(dependsOnMethods = "testCreateNic")
+   @Test(dependsOnMethods = "testGetNic")
    public void testUpdateNic() {
-      Nic.Request.UpdatePayload payload = Nic.Request.updatingBuilder()
+      assertDataCenterAvailable(dataCenter);
+      String newName = "name nr2";
+      String requestId = api.nicApi().updateNic(
+              Nic.Request.updatingBuilder()
               .name("name nr2")
-              .id(createdNic.id())
-              .build();
-
-      Nic updatedNic = api.nicApi().updateNic(payload);
-      assertNotNull(updatedNic);
-      waitUntilAvailable.apply(payload.id());
+              .id(createdNicId)
+              .build()
+      );
 
-      updatedNic = api.nicApi().getNic(payload.id());
+      assertNotNull(requestId);
+      assertDataCenterAvailable(dataCenter);
 
-      assertEquals(updatedNic.name(), payload.name());
+      Nic nic = api.nicApi().getNic(createdNicId);
+      assertEquals(nic.name(), newName);
    }
 
    @Test(dependsOnMethods = "testUpdateNic")
    public void testSetInternetAccess() {
+      assertDataCenterAvailable(dataCenter);
 
-      Nic.Request.SetInternetAccessPayload payload = Nic.Request.setInternetAccessBuilder()
-              .dataCenterId(createdNic.dataCenterId())
+      String requestId = api.nicApi().setInternetAccess(Nic.Request.setInternetAccessBuilder()
+              .dataCenterId(dataCenter.id())
               .lanId(1)
               .internetAccess(true)
-              .build();
+              .build()
+      );
+      assertDataCenterAvailable(dataCenter);
+      assertNotNull(requestId);
 
-      Nic result = api.nicApi().setInternetAccess(payload);
-      assertNotNull(result);
+      Nic nic = api.nicApi().getNic(createdNicId);
+      assertTrue(nic.internetAccess(), "Expected nic to have internet access");
    }
 
-   @AfterClass(alwaysRun = true)
+   @Test(dependsOnMethods = "testSetInternetAccess")
    public void testDeleteNic() {
-      if (createdNic != null) {
-         boolean result = api.nicApi().deleteNic(createdNic.id());
+      assertDataCenterAvailable(dataCenter);
+      boolean result = api.nicApi().deleteNic(createdNicId);
+      assertTrue(result, "Created test NIC was not deleted.");
+   }
 
-         assertTrue(result, "Created test NIC was not deleted.");
-      }
+   @AfterClass(alwaysRun = true)
+   public void cleanUp() {
+      destroyDataCenter(dataCenter);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
index 2129b25..940efa7 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
@@ -16,17 +16,20 @@
  */
 package org.jclouds.profitbricks.features;
 
-import com.squareup.okhttp.mockwebserver.MockResponse;
-import com.squareup.okhttp.mockwebserver.MockWebServer;
-import java.util.List;
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.domain.Nic;
-import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
+
+import java.util.List;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "NicApiMockTest")
@@ -111,7 +114,7 @@ public class NicApiMockTest extends BaseProfitBricksMockTest {
               + "</ws:createNic>";
 
       try {
-         Nic nic = api.createNic(
+         String nicId = api.createNic(
                  Nic.Request.creatingBuilder()
                  .ip("192.168.0.1")
                  .name("nic-name")
@@ -121,7 +124,7 @@ public class NicApiMockTest extends BaseProfitBricksMockTest {
                  .build());
 
          assertRequestHasCommonProperties(server.takeRequest(), content);
-         assertNotNull(nic.id());
+         assertNotNull(nicId);
 
       } finally {
          pbApi.close();
@@ -147,7 +150,7 @@ public class NicApiMockTest extends BaseProfitBricksMockTest {
               + "</request>"
               + "</ws:updateNic>";
       try {
-         Nic nic = api.updateNic(Nic.Request.updatingBuilder()
+         String requestId = api.updateNic(Nic.Request.updatingBuilder()
                  .id("nic-id")
                  .ip("10.0.0.1")
                  .name("nic-name")
@@ -155,7 +158,7 @@ public class NicApiMockTest extends BaseProfitBricksMockTest {
                  .lanId(1)
                  .build());
          assertRequestHasCommonProperties(server.takeRequest(), content);
-         assertNotNull(nic);
+         assertEquals(requestId, "request-id");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -176,13 +179,13 @@ public class NicApiMockTest extends BaseProfitBricksMockTest {
               + "<internetAccess>true</internetAccess>"
               + "</ws:setInternetAccess>";
       try {
-         Nic nic = api.setInternetAccess(Nic.Request.setInternetAccessBuilder()
+         String requestId = api.setInternetAccess(Nic.Request.setInternetAccessBuilder()
                  .dataCenterId("datacenter-id")
                  .lanId(1)
                  .internetAccess(true)
                  .build());
          assertRequestHasCommonProperties(server.takeRequest(), content);
-         assertNotNull(nic);
+         assertEquals(requestId, "request-id");
       } finally {
          pbApi.close();
          server.shutdown();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
index 6ceffcd..be1a60c 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
@@ -16,46 +16,35 @@
  */
 package org.jclouds.profitbricks.features;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
 import java.util.List;
-import java.util.concurrent.TimeUnit;
+
 import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
-import org.jclouds.util.Predicates2;
-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", singleThreaded = true)
+@Test(groups = "live", testName = "ServerApiLiveTest")
 public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
 
-   private Predicate<String> waitUntilAvailable;
    private DataCenter dataCenter;
    private String createdServerId;
 
-   @Override
-   protected void initialize() {
-      super.initialize();
-      List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
-      assertFalse(dataCenters.isEmpty(), "Must atleast have 1 datacenter available for server testing.");
-
-      this.dataCenter = Iterables.getFirst(dataCenters, null);
-
-      this.waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.SERVER, ProvisioningState.AVAILABLE),
-              2l * 60l, 2l, TimeUnit.SECONDS);
+   @BeforeClass
+   public void setupTest() {
+      dataCenter = findOrCreateDataCenter("serverApiLiveTest-" + System.currentTimeMillis());
    }
 
    @Test
    public void testCreateServer() {
+      assertDataCenterAvailable(dataCenter);
       String serverId = api.serverApi().createServer(
               Server.Request.creatingBuilder()
               .dataCenterId(dataCenter.id())
@@ -65,6 +54,9 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
               .build());
 
       assertNotNull(serverId);
+      assertDataCenterAvailable(dataCenter);
+      assertNodeRunning(serverId);
+
       this.createdServerId = serverId;
    }
 
@@ -84,15 +76,9 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
       assertFalse(servers.isEmpty());
    }
 
-   @Test(dependsOnMethods = "testCreateServer")
-   public void testWaitUntilAvailable() {
-      boolean available = waitUntilAvailable.apply(createdServerId);
-
-      assertTrue(available);
-   }
-
-   @Test(dependsOnMethods = "testWaitUntilAvailable")
+   @Test(dependsOnMethods = "testGetServer")
    public void testUpdateServer() {
+      assertDataCenterAvailable(dataCenter);
       String requestId = api.serverApi().updateServer(
               Server.Request.updatingBuilder()
               .id(createdServerId)
@@ -102,7 +88,7 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
               .build());
 
       assertNotNull(requestId);
-      waitUntilAvailable.apply(createdServerId);
+      assertDataCenterAvailable(dataCenter);
 
       Server server = api.serverApi().getServer(createdServerId);
       assertEquals(server.state(), ProvisioningState.AVAILABLE);
@@ -112,11 +98,8 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    public void testStopServer() {
       String requestId = api.serverApi().stopServer(createdServerId);
       assertNotNull(requestId);
+      assertNodeSuspended(createdServerId);
 
-      Predicate<String> waitUntilInactive = Predicates2.retry(new ProvisioningStatusPollingPredicate(
-              api, ProvisioningStatusAware.SERVER, ProvisioningState.INACTIVE), 2l * 60l, 2l, TimeUnit.SECONDS);
-
-      waitUntilInactive.apply(createdServerId);
       Server server = api.serverApi().getServer(createdServerId);
       assertEquals(server.status(), Server.Status.SHUTOFF);
    }
@@ -125,20 +108,22 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    public void testStartServer() {
       String requestId = api.serverApi().startServer(createdServerId);
       assertNotNull(requestId);
-
-      waitUntilAvailable.apply(createdServerId);
+      assertNodeRunning(createdServerId);
 
       Server server = api.serverApi().getServer(createdServerId);
       assertEquals(server.status(), Server.Status.RUNNING);
    }
 
-   @AfterClass(alwaysRun = true)
+   @Test(dependsOnMethods = "testStartServer")
    public void testDeleteServer() {
-      if (createdServerId != null) {
-         boolean result = api.serverApi().deleteServer(createdServerId);
+      assertDataCenterAvailable(dataCenter);
+      boolean result = api.serverApi().deleteServer(createdServerId);
+      assertTrue(result, "Created test server was not deleted.");
+   }
 
-         assertTrue(result, "Created test server was not deleted.");
-      }
+   @AfterClass(alwaysRun = true)
+   public void cleanUp() {
+      destroyDataCenter(dataCenter);
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/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 500d218..10a3f38 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
@@ -16,59 +16,78 @@
  */
 package org.jclouds.profitbricks.features;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.List;
+
 import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.Snapshot;
+import org.jclouds.profitbricks.domain.Storage;
 import org.testng.annotations.Test;
-
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.profitbricks.domain.Storage;
-import org.jclouds.util.Predicates2;
-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;
 
-@Test(groups = "live", testName = "SnapshotApiLiveTest", singleThreaded = true)
-public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
-
-   protected Predicate<String> snapshotWaitingPredicate;
-   private String snapshotId;
-   private String storageId;
-
-   @Override
-   protected void initialize() {
-      super.initialize();
-
-      initializeWaitPredicate();
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.FluentIterable;
 
-      List<Storage> storages = api.storageApi().getAllStorages();
-      assertFalse(storages.isEmpty(), "Must atleast have 1 storage available for snapshot testing.");
+@Test(groups = "live", testName = "SnapshotApiLiveTest")
+public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
 
-      storageId = Iterables.getFirst(storages, null).id();
+   private DataCenter dataCenter;
+   private Storage storage;
+
+   private String createdSnapshotId;
+
+   @BeforeClass
+   public void setupTest() {
+      dataCenter = findOrCreateDataCenter("snapshotApiLiveTest-" + System.currentTimeMillis());
+      storage = FluentIterable.from(dataCenter.storages()).firstMatch(new Predicate<Storage>() {
+
+         @Override
+         public boolean apply(Storage input) {
+            return input.state() == ProvisioningState.AVAILABLE
+                    && input.size() <= 10f;
+         }
+      }).or(new Supplier<Storage>() {
+
+         @Override
+         public Storage get() {
+            StorageApi storageApi = api.storageApi();
+            String name = String.format("server-%d", dataCenter.servers().size());
+            String createdStorageId = storageApi.createStorage(
+                    Storage.Request.creatingBuilder()
+                    .dataCenterId(dataCenter.id())
+                    .name(name)
+                    .size(2f)
+                    .build()
+            );
+            assertDataCenterAvailable(dataCenter);
+
+            return storageApi.getStorage(createdStorageId);
+         }
+      });
    }
 
    @Test
    public void testCreateSnapshot() {
-      Snapshot snapshot = api.snapshotApi().createSnapshot(Snapshot.Request.creatingBuilder()
-              .storageId(storageId)
+      assertDataCenterAvailable(dataCenter);
+      Snapshot snapshot = api.snapshotApi().createSnapshot(
+              Snapshot.Request.creatingBuilder()
+              .storageId(storage.id())
               .description("my description")
               .name("test snapshot")
               .build());
 
       assertNotNull(snapshot);
+      assertSnapshotAvailable(snapshot.id());
 
-      snapshotWaitingPredicate.apply(snapshot.id());
-
-      snapshotId = snapshot.id();
+      createdSnapshotId = snapshot.id();
    }
 
    @Test(dependsOnMethods = "testCreateSnapshot")
@@ -81,20 +100,22 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test(dependsOnMethods = "testCreateSnapshot")
    public void testGetSnapshot() {
-      Snapshot snapshot = api.snapshotApi().getSnapshot(snapshotId);
+      Snapshot snapshot = api.snapshotApi().getSnapshot(createdSnapshotId);
 
       assertNotNull(snapshot);
-      assertEquals(snapshot.id(), snapshotId);
+      assertEquals(snapshot.id(), createdSnapshotId);
    }
 
-   @Test(dependsOnMethods = "testCreateSnapshot")
+   @Test(dependsOnMethods = "testGetSnapshot")
    public void testUpdateSnapshot() {
-
+      assertSnapshotAvailable(createdSnapshotId);
       String newName = "new name";
+      String newDescription = "new description";
 
-      api.snapshotApi().updateSnapshot(Snapshot.Request.updatingBuilder()
-              .id(snapshotId)
-              .description("new description")
+      String requestId = api.snapshotApi().updateSnapshot(
+              Snapshot.Request.updatingBuilder()
+              .id(createdSnapshotId)
+              .description(newDescription)
               .name(newName)
               .bootable(true)
               .osType(OsType.LINUX)
@@ -107,30 +128,26 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
               .isRamHotPlug(true)
               .isRamHotUnPlug(true)
               .build());
-
-      Snapshot snapshot = api.snapshotApi().getSnapshot(snapshotId);
-
-      assertNotNull(snapshot);
-      assertEquals(snapshot.name(), newName);
+      assertNotNull(requestId);
    }
 
-   @Test(dependsOnMethods = "testCreateSnapshot")
+   @Test(dependsOnMethods = "testUpdateSnapshot")
    public void testRollbackSnapshot() {
-      String result = api.snapshotApi().rollbackSnapshot(Snapshot.Request.createRollbackPayload(snapshotId, storageId));
-
-      assertNotNull(result);
+      assertSnapshotAvailable(createdSnapshotId);
+      String requestid = api.snapshotApi().rollbackSnapshot(
+              Snapshot.Request.createRollbackPayload(createdSnapshotId, storage.id()));
+      assertNotNull(requestid);
    }
 
-   @AfterClass(alwaysRun = true)
+   @Test(dependsOnMethods = "testRollbackSnapshot", alwaysRun = true)
    public void testDeleteSnapshot() {
-      boolean result = api.snapshotApi().deleteSnapshot(snapshotId);
-
-      assertTrue(result);
+      assertSnapshotAvailable(createdSnapshotId);
+      boolean result = api.snapshotApi().deleteSnapshot(createdSnapshotId);
+      assertTrue(result, "Created snapshot wasn't deleted");
    }
 
-   private void initializeWaitPredicate() {
-      this.snapshotWaitingPredicate = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.SNAPSHOT, ProvisioningState.AVAILABLE),
-              2l * 60l, 2l, TimeUnit.SECONDS);
+   @AfterClass(alwaysRun = true)
+   public void cleanUp() {
+      destroyDataCenter(dataCenter);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
index 08ffba2..cdaac80 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
@@ -22,44 +22,28 @@ 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.compute.internal.ProvisioningStatusAware;
-import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
 import org.jclouds.profitbricks.domain.DataCenter;
-import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.domain.Storage;
 import org.jclouds.rest.InsufficientResourcesException;
-import org.jclouds.util.Predicates2;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
+import org.testng.annotations.BeforeClass;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-
-@Test(groups = "live", testName = "StorageApiLiveTest", singleThreaded = true)
+@Test(groups = "live", testName = "StorageApiLiveTest")
 public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
 
-   private Predicate<String> waitUntilAvailable;
    private DataCenter dataCenter;
    private Server server;
-   private String createdStorageId;
-
-   @Override
-   protected void initialize() {
-      super.initialize();
-      List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
-      assertFalse(dataCenters.isEmpty(), "Must atleast have 1 datacenter available for storage testing.");
 
-      dataCenter = Iterables.getFirst(dataCenters, null);
-      if (dataCenter != null)
-         dataCenter = api.dataCenterApi().getDataCenter(dataCenter.id()); // fetch individual to load more properties
+   private String createdStorageId;
 
-      this.waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.STORAGE, ProvisioningState.AVAILABLE),
-              6l * 60l, 2l, TimeUnit.SECONDS);
+   @BeforeClass
+   public void setupTest() {
+      dataCenter = findOrCreateDataCenter("storageApiLiveTest" + System.currentTimeMillis());
+      server = findOrCreateServer(dataCenter);
    }
 
    @Test(expectedExceptions = InsufficientResourcesException.class)
@@ -74,6 +58,7 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test
    public void testCreateStorage() {
+      assertDataCenterAvailable(dataCenter);
       String storageId = api.storageApi().createStorage(
               Storage.Request.creatingBuilder()
               .dataCenterId(dataCenter.id())
@@ -82,6 +67,8 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
               .build());
 
       assertNotNull(storageId);
+      assertDataCenterAvailable(dataCenter);
+
       createdStorageId = storageId;
    }
 
@@ -102,14 +89,8 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
    }
 
    @Test(dependsOnMethods = "testCreateStorage")
-   public void testWaitUntilAvailable() {
-      boolean available = waitUntilAvailable.apply(createdStorageId);
-
-      assertTrue(available);
-   }
-
-   @Test(dependsOnMethods = "testWaitUntilAvailable")
    public void testUpdateStorage() {
+      assertDataCenterAvailable(dataCenter);
       String requestId = api.storageApi().updateStorage(
               Storage.Request.updatingBuilder()
               .id(createdStorageId)
@@ -118,7 +99,7 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
               .build());
 
       assertNotNull(requestId);
-      waitUntilAvailable.apply(createdStorageId);
+      assertDataCenterAvailable(dataCenter);
 
       Storage storage = api.storageApi().getStorage(createdStorageId);
       assertEquals(storage.size(), 5f);
@@ -127,9 +108,7 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test(dependsOnMethods = "testUpdateStorage")
    public void testConnectStorage() {
-      server = Iterables.getFirst(dataCenter.servers(), null);
-      assertNotNull(server, "No server to attach to.");
-
+      assertDataCenterAvailable(dataCenter);
       String requestId = api.storageApi().connectStorageToServer(
               Storage.Request.connectingBuilder()
               .storageId(createdStorageId)
@@ -138,7 +117,7 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
       );
 
       assertNotNull(requestId);
-      waitUntilAvailable.apply(createdStorageId);
+      assertDataCenterAvailable(dataCenter);
 
       Storage storage = api.storageApi().getStorage(createdStorageId);
       assertTrue(storage.serverIds().contains(server.id()));
@@ -146,22 +125,26 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test(dependsOnMethods = "testConnectStorage")
    public void testDisconnectStorage() {
+      assertDataCenterAvailable(dataCenter);
       String requestId = api.storageApi()
               .disconnectStorageFromServer(createdStorageId, server.id());
 
       assertNotNull(requestId);
-      waitUntilAvailable.apply(createdStorageId);
+      assertDataCenterAvailable(dataCenter);
 
       Storage storage = api.storageApi().getStorage(createdStorageId);
       assertFalse(storage.serverIds().contains(server.id()));
    }
 
-   @AfterClass(alwaysRun = true)
+   @Test(dependsOnMethods = "testDisconnectStorage")
    public void testDeleteStorage() {
-      if (createdStorageId != null) {
-         boolean result = api.storageApi().deleteStorage(createdStorageId);
+      assertDataCenterAvailable(dataCenter);
+      boolean result = api.storageApi().deleteStorage(createdStorageId);
+      assertTrue(result, "Created test storage was not deleted");
+   }
 
-         assertTrue(result, "Created test storage was not delete.");
-      }
+   @AfterClass(alwaysRun = true)
+   public void cleanUp() {
+      destroyDataCenter(dataCenter);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandlerTest.java
new file mode 100644
index 0000000..9aa18ef
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandlerTest.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.loadbalancer;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "LoadBalancerIdOnlyResponseHandlerTest")
+public class LoadBalancerIdOnlyResponseHandlerTest extends BaseResponseHandlerTest<String> {
+
+   @Override
+   protected ParseSax<String> createParser() {
+      return factory.create(injector.getInstance(LoadBalancerIdOnlyResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromCreateLoadBalancer() {
+      ParseSax<String> parser = createParser();
+
+      String loadBalancerId = parser.parse(payloadFromResource("/loadbalancer/loadbalancer-create.xml"));
+
+      assertEquals("1234-1234-1234-1234", loadBalancerId);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandlerTest.java
new file mode 100644
index 0000000..23b9c4c
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandlerTest.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.nic;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "NicIdOnlyResponseHandlerTest")
+public class NicIdOnlyResponseHandlerTest extends BaseResponseHandlerTest<String> {
+
+   @Override
+   protected ParseSax<String> createParser() {
+      return factory.create(injector.getInstance(NicIdOnlyResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromCreateNic() {
+      ParseSax<String> parser = createParser();
+      String nicId = parser.parse(payloadFromResource("/nic/nic-create.xml"));
+      assertEquals("nic-id", nicId);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
index 5c1afb0..58b97c1 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
@@ -1,17 +1,13 @@
-<soapenv:Envelope
-    xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
-    xmlns:ws='http://ws.api.profitbricks.com/'>
-    <soapenv:Header />
-    <soapenv:Body>
-        <ws:createLoadBalancer>
-            <request>
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:createLoadBalancerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
                 <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
-                <loadBalancerName>load-balancer-name</loadBalancerName>
-                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
-                <ip>192.168.0.1</ip>
-                <lanId>1</lanId>
-                <serverIds>server-ids</serverIds>
-            </request>
-        </ws:createLoadBalancer>
-    </soapenv:Body>
-</soapenv:Envelope>
\ No newline at end of file
+                <dataCenterVersion>10</dataCenterVersion>
+                <loadBalancerId>1234-1234-1234-1234</loadBalancerId>
+            </return>
+        </ns2:createLoadBalancerResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
index 86ef94c..b149be8 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-deregister.xml
@@ -1,14 +1,12 @@
-<soapenv:Envelope
-    xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
-    xmlns:ws='http://ws.api.profitbricks.com/'>
-    <soapenv:Header />
-    <soapenv:Body>
-        <ws:deregisterServersOnLoadBalancer>
-            <request>
-                <serverIds>1</serverIds>
-                <serverIds>2</serverIds>
-                <loadBalancerId>load-balancer-id</loadBalancerId>
-                <request>
-        </ws:deregisterServersOnLoadBalancer>
-    </soapenv:Body>
-</soapenv:Envelope>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:deregisterServersOnLoadBalancerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>10</dataCenterVersion>
+            </return>
+        </ns2:deregisterServersOnLoadBalancerResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
index a32c65a..c338883 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-register.xml
@@ -1,13 +1,19 @@
-<soapenv:Envelope
-    xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
-    xmlns:ws='http://ws.api.profitbricks.com/'>
-    <soapenv:Header/>
-    <soapenv:Body>
-        <ws:registerServersOnLoadBalancer>
-            <request>
-                <serverIds>1234</serverIds>
-                <loadBalancerId>load-balancer-id</loadBalancerId>
-            </request>
-        </ws:registerServersOnLoadBalancer>
-    </soapenv:Body>
-</soapenv:Envelope>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:registerServersOnLoadBalancerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>4</dataCenterVersion>
+        <loadBalancerId>load-balancer-id</loadBalancerId>
+        <lanId>1</lanId>
+        <balancedServers>
+          <activate>true</activate>
+          <balancedNicId>balanced-nic-id</balancedNicId>
+          <serverId>server-id</serverId>
+          <serverName>server-name</serverName>
+        </balancedServers>
+      </return>
+    </ns2:registerServersOnLoadBalancerResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
index 87c1f02..0da544d 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-update.xml
@@ -1,15 +1,12 @@
-<soapenv:Envelope
-    xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'
-    xmlns:ws='http://ws.api.profitbricks.com/'>
-    <soapenv:Header />
-    <soapenv:Body>
-        <ws:updateLoadBalancer>
-            <request>
-                <loadBalancerId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</loadBalancerId>
-                <loadBalancerName>load-balancer-name</loadBalancerName>
-                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
-                <ip>192.168.0.1</ip>              
-            </request>
-        </ws:updateLoadBalancer>
-    </soapenv:Body>
-</soapenv:Envelope>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:updateLoadBalancerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>10</dataCenterVersion>
+            </return>
+        </ns2:updateLoadBalancerResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/resources/logback-test.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/logback-test.xml b/providers/profitbricks/src/test/resources/logback-test.xml
new file mode 100644
index 0000000..902e5cd
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/logback-test.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0"?>
+<configuration scan="false">
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%m%n</pattern>
+        </encoder>
+    </appender>
+
+    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="COMPUTEFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-compute.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <appender name="SSHFILE" class="ch.qos.logback.core.FileAppender">
+        <file>target/test-data/jclouds-ssh.log</file>
+
+        <encoder>
+            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
+        </encoder>
+    </appender>
+
+    <root>
+        <level value="info" />
+    </root>
+
+    <logger name="org.jclouds">
+        <level value="DEBUG" />
+        <appender-ref ref="FILE" />
+    </logger>
+
+    <logger name="jclouds.compute">
+        <level value="DEBUG" />
+        <appender-ref ref="COMPUTEFILE" />
+    </logger>
+
+    <logger name="jclouds.wire">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.headers">
+        <level value="DEBUG" />
+        <appender-ref ref="WIREFILE" />
+    </logger>
+
+    <logger name="jclouds.ssh">
+        <level value="DEBUG" />
+        <appender-ref ref="SSHFILE" />
+    </logger>
+
+    <logger name="net.schmizz">
+        <level value="DEBUG" />
+        <appender-ref ref="SSHFILE" />
+    </logger>
+</configuration>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/resources/nic/nic-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nic-delete.xml b/providers/profitbricks/src/test/resources/nic/nic-delete.xml
index 0b5cc83..281bd09 100644
--- a/providers/profitbricks/src/test/resources/nic/nic-delete.xml
+++ b/providers/profitbricks/src/test/resources/nic/nic-delete.xml
@@ -1,9 +1,12 @@
-<?xml version="1.0" ?>
-<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
-    <soapenv:Header/>
-    <soapenv:Body>
-        <ws:deleteNic>
-            <nicId>nic-id</nicId>
-        </ws:deleteNic>
-    </soapenv:Body>
-</soapenv:Envelope>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+   <S:Body>
+      <ns2:deleteNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+         <return>
+            <requestId>request-id</requestId>
+            <dataCenterId>datacenter-id</dataCenterId>
+            <dataCenterVersion>datacenter-version</dataCenterVersion>
+         </return>
+      </ns2:deleteNicResponse>
+   </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/resources/nic/nic-internetaccess.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nic-internetaccess.xml b/providers/profitbricks/src/test/resources/nic/nic-internetaccess.xml
index 6594894..3468ee4 100644
--- a/providers/profitbricks/src/test/resources/nic/nic-internetaccess.xml
+++ b/providers/profitbricks/src/test/resources/nic/nic-internetaccess.xml
@@ -1,11 +1,12 @@
-<?xml version="1.0" ?>
-<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
-    <soapenv:Header/>
-    <soapenv:Body>
-        <ws:setInternetAccess>
-            <dataCenterId>datacenter-id</dataCenterId>
-            <lanId>1</lanId>
-            <internetAccess>internet-access</internetAccess>
-        </ws:setInternetAccess>
-    </soapenv:Body>
-</soapenv:Envelope>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:setInternetAccessResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>request-id</requestId>
+                <dataCenterId>datacenter-id</dataCenterId>
+                <dataCenterVersion>8</dataCenterVersion>
+            </return>
+        </ns2:setInternetAccessResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/resources/nic/nic-update.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nic-update.xml b/providers/profitbricks/src/test/resources/nic/nic-update.xml
index 451914c..70ce539 100644
--- a/providers/profitbricks/src/test/resources/nic/nic-update.xml
+++ b/providers/profitbricks/src/test/resources/nic/nic-update.xml
@@ -1,15 +1,12 @@
-<?xml version="1.0" ?>
-<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
-    <soapenv:Header/>
-    <soapenv:Body>
-        <ws:updateNic>
-            <request>
-                <nicId>nic-id</nicId>
-                <ip>ip</ip>
-                <nicName>nic-name</nicName>
-                <dhcpActive>true</dhcpActive>
-                <lanId>1</lanId>
-            </request>
-        </ws:updateNic>
-    </soapenv:Body>
-</soapenv:Envelope>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+   <S:Body>
+      <ns2:updateNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+         <return>
+            <requestId>request-id</requestId>
+            <dataCenterId>datacenter-id</dataCenterId>
+            <dataCenterVersion>2</dataCenterVersion>
+         </return>
+      </ns2:updateNicResponse>
+   </S:Body>
+</S:Envelope>
\ No newline at end of file


[10/35] jclouds git commit: JCLOUDS-702: JClouds ProfitBricks provider - Storage API

Posted by de...@apache.org.
JCLOUDS-702: JClouds ProfitBricks provider - Storage API


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

Branch: refs/heads/master
Commit: 2a219a994869ebf6012371d4188f23bbdebd3bcf
Parents: ee24ddb
Author: Reijhanniel Jearl Campos <de...@gmail.com>
Authored: Thu Feb 5 21:45:03 2015 +0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Thu Feb 5 14:53:10 2015 +0100

----------------------------------------------------------------------
 .../jclouds/profitbricks/ProfitBricksApi.java   |   4 +
 .../profitbricks/ProfitBricksApiMetadata.java   |  30 +-
 .../ProfitBricksProviderMetadata.java           |  18 +-
 .../binder/BaseProfitBricksRequestBinder.java   |   6 +-
 .../CreateDataCenterRequestBinder.java          |  10 +-
 .../server/CreateServerRequestBinder.java       |  46 +--
 .../server/UpdateServerRequestBinder.java       |  42 +--
 .../ConnectStorageToServerRequestBinder.java    |  45 +++
 .../storage/CreateStorageRequestBinder.java     |  46 +++
 .../storage/UpdateStorageRequestBinder.java     |  47 +++
 .../internal/ProvisioningStatusAware.java       |   2 +-
 .../ProvisioningStatusPollingPredicate.java     |   9 +-
 .../config/ProfitBricksHttpApiModule.java       |   8 +-
 .../profitbricks/domain/AvailabilityZone.java   |   6 +-
 .../jclouds/profitbricks/domain/DataCenter.java |  94 +++--
 .../jclouds/profitbricks/domain/Location.java   |   8 +-
 .../profitbricks/domain/ProvisioningState.java  |   4 +-
 .../org/jclouds/profitbricks/domain/Server.java | 160 +++++----
 .../profitbricks/domain/ServiceFault.java       |  28 +-
 .../jclouds/profitbricks/domain/Storage.java    | 355 +++++++++++++++++++
 .../profitbricks/features/DataCenterApi.java    |  12 +-
 .../profitbricks/features/ServerApi.java        |  74 ++--
 .../profitbricks/features/StorageApi.java       | 136 +++++++
 .../handlers/ProfitBricksHttpErrorHandler.java  |  53 +--
 ...usFromPayloadHttpCommandExecutorService.java |  94 +++--
 .../ProfitBricksSoapMessageEnvelope.java        |   6 +-
 .../parser/BaseProfitBricksResponseHandler.java |  21 +-
 .../parser/RequestIdOnlyResponseHandler.java    |  14 +-
 .../parser/ServiceFaultResponseHandler.java     |  19 +-
 .../BaseDataCenterResponseHandler.java          |  11 +-
 .../DataCenterInfoResponseHandler.java          |  74 +++-
 .../DataCenterListResponseHandler.java          |  16 +-
 .../parser/image/BaseImageResponseHandler.java  |   7 +-
 .../parser/image/ImageInfoResponseHandler.java  |   6 +-
 .../parser/image/ImageListResponseHandler.java  |   8 +-
 .../server/BaseServerResponseHandler.java       |  85 +++--
 .../server/ServerIdOnlyResponseHandler.java     |  14 +-
 .../server/ServerInfoResponseHandler.java       |  12 +-
 .../server/ServerListResponseHandler.java       |  12 +-
 .../GetProvisioningStateResponseHandler.java    |   9 +-
 .../storage/BaseStorageResponseHandler.java     |  83 +++++
 .../storage/StorageIdOnlyResponseHandler.java   |  46 +++
 .../storage/StorageInfoResponseHandler.java     |  50 +++
 .../storage/StorageListResponseHandler.java     |  54 +++
 .../profitbricks/BaseProfitBricksLiveTest.java  |   4 +-
 .../CreateDataCenterRequestBinderTest.java      |  12 +-
 .../UpdateDataCenterRequestBinderTest.java      |  12 +-
 .../server/CreateServerRequestBinderTest.java   |  46 +--
 .../server/UpdateServerRequestBinderTest.java   |  40 +--
 ...ConnectStorageToServerRequestBinderTest.java |  55 +++
 .../storage/CreateStorageRequestBinderTest.java |  56 +++
 .../storage/UpdateStorageRequestBinderTest.java |  53 +++
 .../ProvisioningStatusPollingPredicateTest.java |  68 +++-
 .../profitbricks/domain/ServerBuilderTest.java  | 190 +++++-----
 .../features/DataCenterApiMockTest.java         |  19 +-
 .../profitbricks/features/ImageApiMockTest.java |   2 +-
 .../features/ServerApiLiveTest.java             |  90 ++---
 .../features/ServerApiMockTest.java             | 209 ++++++-----
 .../features/StorageApiLiveTest.java            | 167 +++++++++
 .../features/StorageApiMockTest.java            | 285 +++++++++++++++
 ...omPayloadHttpCommandExecutorServiceTest.java |  45 +++
 .../ProfitBricksSoapMessageEnvelopeTest.java    |   6 +-
 .../http/parser/BaseResponseHandlerTest.java    |   4 +-
 .../RequestIdOnlyResponseHandlerTest.java       |  24 +-
 .../parser/ServiceFaultResponseHandlerTest.java |  10 +-
 .../DataCenterInfoResponseHandlerTest.java      |  61 +++-
 .../DataCenterListResponseHandlerTest.java      |   4 +-
 .../image/ImageInfoResponseHandlerTest.java     |  44 +--
 .../image/ImageListResponseHandlerTest.java     | 248 ++++++-------
 .../server/ServerIdOnlyResponseHandlerTest.java |   8 +-
 .../server/ServerInfoResponseHandlerTest.java   |  55 +--
 .../server/ServerListResponseHandlerTest.java   |  80 ++---
 ...GetProvisioningStateResponseHandlerTest.java | 114 +++---
 .../StorageIdOnlyResponseHandlerTest.java       |  42 +++
 .../storage/StorageInfoResponseHandlerTest.java |  66 ++++
 .../storage/StorageListResponseHandlerTest.java |  80 +++++
 .../internal/BaseProfitBricksMockTest.java      |  24 +-
 .../test/resources/datacenter/datacenter.xml    |   2 +-
 .../src/test/resources/fault-404.xml            |   2 +-
 .../src/test/resources/fault-413.xml            |  17 +
 .../src/test/resources/maintenance-503.html     |  67 ++++
 .../resources/server/server-state-inprocess.xml |  28 ++
 .../test/resources/storage/storage-connect.xml  |  13 +
 .../test/resources/storage/storage-create.xml   |  14 +
 .../test/resources/storage/storage-delete.xml   |  13 +
 .../resources/storage/storage-disconnect.xml    |  13 +
 .../storage/storage-state-inprocess.xml         |  23 ++
 .../test/resources/storage/storage-update.xml   |  13 +
 .../src/test/resources/storage/storage.xml      |  23 ++
 .../src/test/resources/storage/storages.xml     |  37 ++
 90 files changed, 3279 insertions(+), 1093 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
index 7ab121a..4cfe6e8 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -21,6 +21,7 @@ import java.io.Closeable;
 import org.jclouds.profitbricks.features.DataCenterApi;
 import org.jclouds.profitbricks.features.ImageApi;
 import org.jclouds.profitbricks.features.ServerApi;
+import org.jclouds.profitbricks.features.StorageApi;
 import org.jclouds.rest.annotations.Delegate;
 
 public interface ProfitBricksApi extends Closeable {
@@ -33,4 +34,7 @@ public interface ProfitBricksApi extends Closeable {
 
    @Delegate
    ServerApi serverApi();
+
+   @Delegate
+   StorageApi storageApi();
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
index f51dc5b..205b246 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
@@ -53,29 +53,29 @@ public class ProfitBricksApiMetadata extends BaseHttpApiMetadata<ProfitBricksApi
    public static class Builder extends BaseHttpApiMetadata.Builder<ProfitBricksApi, Builder> {
 
       protected Builder() {
-	 id("profitbricks")
-		 .name("ProfitBricks API")
-		 .identityName("API Username")
-		 .credentialName("API Password")
-		 .documentation(URI.create("https://www.profitbricks.com/sites/default/files/profitbricks_api_1_3.pdf"))
-		 .defaultEndpoint("https://api.profitbricks.com/1.3")
-		 .version("1.3")
-		 // .view(ComputeServiceContext.class)
-		 .defaultProperties(ProfitBricksApiMetadata.defaultProperties())
-		 .defaultModules(ImmutableSet.<Class<? extends Module>>of(
-				 ProfitBricksHttpApiModule.class,
-				 ProfitBricksHttpCommandExecutorServiceModule.class
-			 ));
+         id("profitbricks")
+                 .name("ProfitBricks API")
+                 .identityName("API Username")
+                 .credentialName("API Password")
+                 .documentation(URI.create("https://www.profitbricks.com/sites/default/files/profitbricks_api_1_3.pdf"))
+                 .defaultEndpoint("https://api.profitbricks.com/1.3")
+                 .version("1.3")
+                 // .view(ComputeServiceContext.class)
+                 .defaultProperties(ProfitBricksApiMetadata.defaultProperties())
+                 .defaultModules(ImmutableSet.<Class<? extends Module>>of(
+                                 ProfitBricksHttpApiModule.class,
+                                 ProfitBricksHttpCommandExecutorServiceModule.class
+                         ));
       }
 
       @Override
       public ProfitBricksApiMetadata build() {
-	 return new ProfitBricksApiMetadata(this);
+         return new ProfitBricksApiMetadata(this);
       }
 
       @Override
       protected Builder self() {
-	 return this;
+         return this;
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/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 d66ed15..9ecfbc1 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
@@ -44,23 +44,23 @@ public class ProfitBricksProviderMetadata extends BaseProviderMetadata {
    public static class Builder extends BaseProviderMetadata.Builder {
 
       protected Builder() {
-	 id("profitbricks")
-		 .name("ProfitBricks Cloud Compute 2.0")
-		 .homepage(URI.create("http://www.profitbricks.com"))
-		 .console(URI.create("https://my.profitbricks.com/dashboard/dcdr2/"))
-		 .linkedServices("profitbricks")
-		 .apiMetadata(new ProfitBricksApiMetadata());
+         id("profitbricks")
+                 .name("ProfitBricks Cloud Compute 2.0")
+                 .homepage(URI.create("http://www.profitbricks.com"))
+                 .console(URI.create("https://my.profitbricks.com/dashboard/dcdr2/"))
+                 .linkedServices("profitbricks")
+                 .apiMetadata(new ProfitBricksApiMetadata());
       }
 
       @Override
       public ProfitBricksProviderMetadata build() {
-	 return new ProfitBricksProviderMetadata(this);
+         return new ProfitBricksProviderMetadata(this);
       }
 
       @Override
       public Builder fromProviderMetadata(ProviderMetadata in) {
-	 super.fromProviderMetadata(in);
-	 return this;
+         super.fromProviderMetadata(in);
+         return this;
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
index 8c2d36b..2b842ff 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
@@ -55,11 +55,11 @@ public abstract class BaseProfitBricksRequestBinder<T> implements MapBinder {
 
    protected abstract String createPayload(T payload);
 
-   protected String formatIfNotEmpty(String pattern, Object param) {
-      return Strings.isNullOrEmpty(nullableToString( param )) ? "" : String.format(pattern, param);
+   protected static String formatIfNotEmpty(String pattern, Object param) {
+      return Strings.isNullOrEmpty(nullableToString(param)) ? "" : String.format(pattern, param);
    }
 
-   protected String nullableToString(Object object) {
+   protected static String nullableToString(Object object) {
       return object == null ? "" : object.toString();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
index 8696c0e..8a07b0a 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
@@ -33,11 +33,11 @@ public class CreateDataCenterRequestBinder extends BaseProfitBricksRequestBinder
    @Override
    protected String createPayload(DataCenter.Request.CreatePayload payload) {
       requestBuilder.append("<ws:createDataCenter>")
-	      .append("<request>")
-	      .append(format("<dataCenterName>%s</dataCenterName>", payload.name()))
-	      .append(format("<location>%s</location>", payload.location().value()))
-	      .append("</request>")
-	      .append("</ws:createDataCenter>");
+              .append("<request>")
+              .append(format("<dataCenterName>%s</dataCenterName>", payload.name()))
+              .append(format("<location>%s</location>", payload.location().value()))
+              .append("</request>")
+              .append("</ws:createDataCenter>");
       return requestBuilder.toString();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
index 4acf33b..b836ceb 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
@@ -25,32 +25,32 @@ public class CreateServerRequestBinder extends BaseProfitBricksRequestBinder<Ser
    protected final StringBuilder requestBuilder;
 
    CreateServerRequestBinder() {
-      super( "server" );
-      this.requestBuilder = new StringBuilder( 128 * 4 );
+      super("server");
+      this.requestBuilder = new StringBuilder(128 * 4);
    }
 
    @Override
-   protected String createPayload( Server.Request.CreatePayload payload ) {
-      requestBuilder.append( "<ws:createServer>" )
-              .append( "<request>" )
-              .append( format( "<dataCenterId>%s</dataCenterId>", payload.dataCenterId() ) )
-              .append( format( "<cores>%s</cores>", payload.cores() ) )
-              .append( format( "<ram>%s</ram>", payload.ram() ) )
-              .append( formatIfNotEmpty( "<serverName>%s</serverName>", payload.name() ) )
-              .append( formatIfNotEmpty( "<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId() ) )
-              .append( formatIfNotEmpty( "<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId() ) )
-              .append( formatIfNotEmpty( "<internetAccess>%s</internetAccess>", payload.hasInternetAccess() ) )
-              .append( formatIfNotEmpty( "<lanId>%s</lanId>", payload.lanId() ) )
-              .append( formatIfNotEmpty( "<osType>%s</osType>", payload.osType() ) )
-              .append( formatIfNotEmpty( "<availabilityZone>%s</availabilityZone>", payload.availabilityZone() ) )
-              .append( formatIfNotEmpty( "<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug() ) )
-              .append( formatIfNotEmpty( "<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug() ) )
-              .append( formatIfNotEmpty( "<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug() ) )
-              .append( formatIfNotEmpty( "<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug() ) )
-              .append( formatIfNotEmpty( "<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug() ) )
-              .append( formatIfNotEmpty( "<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug() ) )
-              .append( "</request>" )
-              .append( "</ws:createServer>" );
+   protected String createPayload(Server.Request.CreatePayload payload) {
+      requestBuilder.append("<ws:createServer>")
+              .append("<request>")
+              .append(format("<dataCenterId>%s</dataCenterId>", payload.dataCenterId()))
+              .append(format("<cores>%s</cores>", payload.cores()))
+              .append(format("<ram>%s</ram>", payload.ram()))
+              .append(formatIfNotEmpty("<serverName>%s</serverName>", payload.name()))
+              .append(formatIfNotEmpty("<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId()))
+              .append(formatIfNotEmpty("<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId()))
+              .append(formatIfNotEmpty("<internetAccess>%s</internetAccess>", payload.hasInternetAccess()))
+              .append(formatIfNotEmpty("<lanId>%s</lanId>", payload.lanId()))
+              .append(formatIfNotEmpty("<osType>%s</osType>", payload.osType()))
+              .append(formatIfNotEmpty("<availabilityZone>%s</availabilityZone>", payload.availabilityZone()))
+              .append(formatIfNotEmpty("<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug()))
+              .append(formatIfNotEmpty("<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug()))
+              .append(formatIfNotEmpty("<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug()))
+              .append(formatIfNotEmpty("<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug()))
+              .append("</request>")
+              .append("</ws:createServer>");
       return requestBuilder.toString();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
index d051b88..c12ae21 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
@@ -25,31 +25,31 @@ public class UpdateServerRequestBinder extends BaseProfitBricksRequestBinder<Ser
    protected final StringBuilder requestBuilder;
 
    UpdateServerRequestBinder() {
-      super( "server" );
-      this.requestBuilder = new StringBuilder( 128 * 4 );
+      super("server");
+      this.requestBuilder = new StringBuilder(128 * 4);
 
    }
 
    @Override
-   protected String createPayload( Server.Request.UpdatePayload payload ) {
-      requestBuilder.append( "<ws:updateServer>" )
-              .append( "<request>" )
-              .append( format( "<serverId>%s</serverId>", payload.id() ) )
-              .append( format( "<cores>%s</cores>", payload.cores() ) )
-              .append( format( "<ram>%s</ram>", payload.ram() ) )
-              .append( formatIfNotEmpty( "<serverName>%s</serverName>", payload.name() ) )
-              .append( formatIfNotEmpty( "<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId() ) )
-              .append( formatIfNotEmpty( "<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId() ) )
-              .append( formatIfNotEmpty( "<osType>%s</osType>", payload.osType() ) )
-              .append( formatIfNotEmpty( "<availabilityZone>%s</availabilityZone>", payload.availabilityZone() ) )
-              .append( formatIfNotEmpty( "<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug() ) )
-              .append( formatIfNotEmpty( "<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug() ) )
-              .append( formatIfNotEmpty( "<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug() ) )
-              .append( formatIfNotEmpty( "<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug() ) )
-              .append( formatIfNotEmpty( "<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug() ) )
-              .append( formatIfNotEmpty( "<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug() ) )
-              .append( "</request>" )
-              .append( "</ws:updateServer>" );
+   protected String createPayload(Server.Request.UpdatePayload payload) {
+      requestBuilder.append("<ws:updateServer>")
+              .append("<request>")
+              .append(format("<serverId>%s</serverId>", payload.id()))
+              .append(format("<cores>%s</cores>", payload.cores()))
+              .append(format("<ram>%s</ram>", payload.ram()))
+              .append(formatIfNotEmpty("<serverName>%s</serverName>", payload.name()))
+              .append(formatIfNotEmpty("<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId()))
+              .append(formatIfNotEmpty("<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId()))
+              .append(formatIfNotEmpty("<osType>%s</osType>", payload.osType()))
+              .append(formatIfNotEmpty("<availabilityZone>%s</availabilityZone>", payload.availabilityZone()))
+              .append(formatIfNotEmpty("<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug()))
+              .append(formatIfNotEmpty("<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug()))
+              .append(formatIfNotEmpty("<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug()))
+              .append(formatIfNotEmpty("<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug()))
+              .append("</request>")
+              .append("</ws:updateServer>");
       return requestBuilder.toString();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java
new file mode 100644
index 0000000..2c2e08d
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/ConnectStorageToServerRequestBinder.java
@@ -0,0 +1,45 @@
+/*
+ * 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.binder.storage;
+
+import static java.lang.String.format;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Storage;
+
+public class ConnectStorageToServerRequestBinder extends BaseProfitBricksRequestBinder<Storage.Request.ConnectPayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   ConnectStorageToServerRequestBinder() {
+      super("storage");
+      this.requestBuilder = new StringBuilder(128 * 2);
+   }
+
+   @Override
+   protected String createPayload(Storage.Request.ConnectPayload payload) {
+      requestBuilder.append("<ws:connectStorageToServer>")
+              .append("<request>")
+              .append(format("<storageId>%s</storageId>", payload.storageId()))
+              .append(format("<serverId>%s</serverId>", payload.serverId()))
+              .append(formatIfNotEmpty("<busType>%s</busType>", payload.busType()))
+              .append(formatIfNotEmpty("<deviceNumber>%s</deviceNumber>", payload.deviceNumber()))
+              .append("</request>")
+              .append("</ws:connectStorageToServer>");
+      return requestBuilder.toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
new file mode 100644
index 0000000..acfb6f3
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/CreateStorageRequestBinder.java
@@ -0,0 +1,46 @@
+/*
+ * 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.binder.storage;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Storage;
+
+public class CreateStorageRequestBinder extends BaseProfitBricksRequestBinder<Storage.Request.CreatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   CreateStorageRequestBinder() {
+      super("storage");
+      this.requestBuilder = new StringBuilder(128 * 2);
+   }
+
+   @Override
+   protected String createPayload(Storage.Request.CreatePayload payload) {
+      requestBuilder.append("<ws:createStorage>")
+              .append("<request>")
+              .append(format("<dataCenterId>%s</dataCenterId>", payload.dataCenterId()))
+              .append(formatIfNotEmpty("<storageName>%s</storageName>", payload.name()))
+              .append(format("<size>%.0f</size>", payload.size()))
+              .append(formatIfNotEmpty("<mountImageId>%s</mountImageId>", payload.mountImageId()))
+              .append(formatIfNotEmpty("<profitBricksImagePassword>%s</profitBricksImagePassword>", payload.profitBricksImagePassword()))
+              .append("</request>")
+              .append("</ws:createStorage>");
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java
new file mode 100644
index 0000000..9a80b83
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/storage/UpdateStorageRequestBinder.java
@@ -0,0 +1,47 @@
+/*
+ * 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.binder.storage;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Storage;
+
+public class UpdateStorageRequestBinder extends BaseProfitBricksRequestBinder<Storage.Request.UpdatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   UpdateStorageRequestBinder() {
+      super("storage");
+      this.requestBuilder = new StringBuilder(128 * 2);
+   }
+
+   @Override
+   protected String createPayload(Storage.Request.UpdatePayload payload) {
+      requestBuilder
+              .append("<ws:updateStorage>")
+              .append("<request>")
+              .append(format("<storageId>%s</storageId>", payload.id()))
+              .append(formatIfNotEmpty("<size>%.0f</size>", payload.size()))
+              .append(formatIfNotEmpty("<storageName>%s</storageName>", payload.name()))
+              .append(formatIfNotEmpty("<mountImageId>%s</mountImageId>", payload.mountImageId()))
+              .append("</request>")
+              .append("</ws:updateStorage>");
+
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
index 5056243..f573eb0 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
@@ -23,5 +23,5 @@ package org.jclouds.profitbricks.compute.internal;
  */
 public enum ProvisioningStatusAware {
 
-   DATACENTER, SERVER;
+   DATACENTER, SERVER, STORAGE;
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
index 73db33f..8a8a787 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
@@ -26,9 +26,8 @@ import com.google.common.base.Predicate;
 /**
  * A custom predicate for waiting until a virtual resource satisfies the given expected status
  * <p>
- * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some
- * cases, the API user gets blocked from further requests, and will then need to contact tech support for api lock
- * release.
+ * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some cases, the API user gets
+ * blocked from further requests, and will then need to contact tech support for api lock release.
  */
 public class ProvisioningStatusPollingPredicate implements Predicate<String> {
 
@@ -49,7 +48,9 @@ public class ProvisioningStatusPollingPredicate implements Predicate<String> {
          case DATACENTER:
             return expect == api.dataCenterApi().getDataCenterState(input);
          case SERVER:
-            return expect == api.serverApi().getServer( input ).state();
+            return expect == api.serverApi().getServer(input).state();
+         case STORAGE:
+            return expect == api.storageApi().getStorage(input).state();
          default:
             throw new IllegalArgumentException("Unknown domain '" + domain + "'");
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
index 57728be..f95b1b3 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
@@ -55,14 +55,14 @@ public class ProfitBricksHttpApiModule extends HttpApiModule<ProfitBricksApi> {
 
       @Override
       protected void configure() {
-	 install(new SSLModule());
-	 bind(HttpCommandExecutorService.class).to(ResponseStatusFromPayloadHttpCommandExecutorService.class)
-		 .in(Scopes.SINGLETON);
+         install(new SSLModule());
+         bind(HttpCommandExecutorService.class).to(ResponseStatusFromPayloadHttpCommandExecutorService.class)
+                 .in(Scopes.SINGLETON);
       }
 
       @Provides
       public ParseSax<ServiceFault> serviceFaultParser(ParseSax.Factory factory, Injector injector) {
-	 return factory.create(injector.getInstance(ServiceFaultResponseHandler.class));
+         return factory.create(injector.getInstance(ServiceFaultResponseHandler.class));
       }
 
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
index b582d69..97cac69 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
@@ -24,10 +24,10 @@ public enum AvailabilityZone {
       return name();
    }
 
-   public static AvailabilityZone fromValue( String v ) {
+   public static AvailabilityZone fromValue(String v) {
       try {
-         return valueOf( v );
-      } catch ( Exception ex ) {
+         return valueOf(v);
+      } catch (Exception ex) {
          return UNRECOGNIZED;
       }
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
index d5f9893..a24d84b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
@@ -19,30 +19,43 @@ package org.jclouds.profitbricks.domain;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Strings.isNullOrEmpty;
 
+import java.util.List;
 import java.util.regex.Pattern;
 
 import org.jclouds.javax.annotation.Nullable;
 
 import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 
 @AutoValue
 public abstract class DataCenter {
 
    public abstract String id();
 
-   @Nullable public abstract String name();
+   @Nullable
+   public abstract String name();
 
    public abstract int version();
 
-   @Nullable public abstract ProvisioningState state();
+   @Nullable
+   public abstract ProvisioningState state();
 
-   @Nullable public abstract Location location();
+   @Nullable
+   public abstract Location location();
 
-//   @Nullable public abstract List<Server> servers();
-//   @Nullable public abstract List<Storage> storages();
+   @Nullable
+   public abstract List<Server> servers();
+
+   @Nullable
+   public abstract List<Storage> storages();
 //   @Nullable public abstract List<LoadBalancer> loadBalancers();
-   public static DataCenter create(String id, String name, int version, ProvisioningState state, Location location) {
-      return new AutoValue_DataCenter(id, name, version, state, location);
+
+   public static DataCenter create(String id, String name, int version, ProvisioningState state, Location location, List<Server> servers,
+           List<Storage> storages) {
+      return new AutoValue_DataCenter(id, name, version, state, location,
+              servers != null ? ImmutableList.copyOf(servers) : Lists.<Server>newArrayList(),
+              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList());
    }
 
    public static Builder builder() {
@@ -60,76 +73,87 @@ public abstract class DataCenter {
       private ProvisioningState state;
       private Location location;
       private int version;
-//      private List<Server> servers;
-//      private List<Storage> storage;
+      private List<Server> servers;
+      private List<Storage> storages;
 //      private List<LoadBalancer> loadBalancer;
 
       public Builder id(String id) {
-	 this.id = id;
-	 return this;
+         this.id = id;
+         return this;
       }
 
       public Builder name(String name) {
-	 this.name = name;
-	 return this;
+         this.name = name;
+         return this;
       }
 
       public Builder state(ProvisioningState state) {
-	 this.state = state;
-	 return this;
+         this.state = state;
+         return this;
       }
 
       public Builder location(Location location) {
-	 this.location = location;
-	 return this;
+         this.location = location;
+         return this;
       }
 
       public Builder version(int version) {
-	 this.version = version;
-	 return this;
+         this.version = version;
+         return this;
+      }
+
+      public Builder servers(List<Server> servers) {
+         this.servers = servers;
+         return this;
+      }
+
+      public Builder storages(List<Storage> storages) {
+         this.storages = storages;
+         return this;
       }
 
       public DataCenter build() {
-	 return DataCenter.create(id, name, version, state, location);
+         return DataCenter.create(id, name, version, state, location, servers, storages);
       }
 
       public Builder fromDataCenter(DataCenter in) {
-	 return this.id(in.id()).name(in.name()).version(in.version()).state(in.state()).location(in.location());
+         return this.id(in.id()).name(in.name()).version(in.version()).state(in.state()).location(in.location()).servers(in.servers())
+                 .storages(in.storages());
       }
    }
 
    public static final class Request {
-      
+
       @AutoValue
       public abstract static class CreatePayload {
 
-	 public abstract String name();
+         public abstract String name();
 
-	 public abstract Location location();
+         public abstract Location location();
 
-	 public static CreatePayload create(String name, Location location) {
+         public static CreatePayload create(String name, Location location) {
             checkInvalidChars(name);
-	    return new AutoValue_DataCenter_Request_CreatePayload(name, location);
-	 }
+            return new AutoValue_DataCenter_Request_CreatePayload(name, location);
+         }
 
       }
 
       @AutoValue
       public abstract static class UpdatePayload {
 
-	 public abstract String id();
+         public abstract String id();
 
-	 public abstract String name();
+         public abstract String name();
 
-	 public static UpdatePayload create(String id, String name) {
+         public static UpdatePayload create(String id, String name) {
             checkInvalidChars(name);
-	    return new AutoValue_DataCenter_Request_UpdatePayload(id, name);
-	 }
+            return new AutoValue_DataCenter_Request_UpdatePayload(id, name);
+         }
       }
-      
+
       private static final Pattern INVALID_CHARS = Pattern.compile("^.*[@/\\|'`’^].*$");
-      
-      private static void checkInvalidChars(String name){
+
+      private static void checkInvalidChars(String name) {
          checkArgument(!isNullOrEmpty(name), "Name is required.");
          checkArgument(!INVALID_CHARS.matcher(name).matches(), "Name must not contain any of: @ / \\ | ' ` ’ ^");
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
index 969629a..0354bf4 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
@@ -35,16 +35,16 @@ public enum Location {
 
    public static Location fromValue(String v) {
       try {
-	 return valueOf(v);
+         return valueOf(v);
       } catch (IllegalArgumentException ex) {
-	 return UNRECOGNIZED;
+         return UNRECOGNIZED;
       }
    }
 
    public static Location fromId(String id) {
       for (Location location : values())
-	 if (location.id.equals(id))
-	    return location;
+         if (location.id.equals(id))
+            return location;
       return UNRECOGNIZED;
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
index 2a9e0b6..833e979 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
@@ -22,9 +22,9 @@ public enum ProvisioningState {
 
    public static ProvisioningState fromValue(String value) {
       try {
-	 return valueOf(value);
+         return valueOf(value);
       } catch (IllegalArgumentException e) {
-	 return UNRECOGNIZED;
+         return UNRECOGNIZED;
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
index 703eb59..6149cfd 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
@@ -17,12 +17,20 @@
 package org.jclouds.profitbricks.domain;
 
 import org.jclouds.profitbricks.domain.internal.ServerCommonProperties;
+
 import com.google.auto.value.AutoValue;
+
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.util.Date;
+import java.util.List;
+
 import org.jclouds.javax.annotation.Nullable;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
 @AutoValue
 public abstract class Server implements ServerCommonProperties {
 
@@ -34,10 +42,10 @@ public abstract class Server implements ServerCommonProperties {
          return name();
       }
 
-      public static Status fromValue( String v ) {
+      public static Status fromValue(String v) {
          try {
-            return valueOf( v );
-         } catch ( IllegalArgumentException ex ) {
+            return valueOf(v);
+         } catch (IllegalArgumentException ex) {
             return UNRECOGNIZED;
          }
       }
@@ -70,13 +78,17 @@ public abstract class Server implements ServerCommonProperties {
    @Nullable
    public abstract Date lastModificationTime();
 
-//   public abstract List<Storage> storages();
-//   public abstract List<Nic> storages();
-   public static Server create( String id, String name, int cores, int ram, Boolean hasInternetAccess, ProvisioningState state,
-           Status status, OsType osType, AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime, Boolean isCpuHotPlug,
-           Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
-      return new AutoValue_Server( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug,
-              cores, ram, id, name, hasInternetAccess, state, status, osType, availabilityZone, creationTime, lastModificationTime );
+   @Nullable
+   public abstract List<Storage> storages();
+
+//   public abstract List<Nic> nics();
+   public static Server create(String id, String name, int cores, int ram, Boolean hasInternetAccess, ProvisioningState state,
+           Status status, OsType osType, AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime,
+           List<Storage> storages, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug,
+           Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
+      return new AutoValue_Server(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug,
+              cores, ram, id, name, hasInternetAccess, state, status, osType, availabilityZone, creationTime, lastModificationTime,
+              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList());
 
    }
 
@@ -85,7 +97,7 @@ public abstract class Server implements ServerCommonProperties {
    }
 
    public DescribingBuilder toBuilder() {
-      return builder().fromServer( this );
+      return builder().fromServer(this);
    }
 
    public abstract static class Builder<B extends Builder, D extends ServerCommonProperties> {
@@ -100,48 +112,48 @@ public abstract class Server implements ServerCommonProperties {
       protected Boolean discVirtioHotPlug;
       protected Boolean discVirtioHotUnPlug;
 
-      public B name( String name ) {
+      public B name(String name) {
          this.name = name;
          return self();
       }
 
-      public B cores( int cores ) {
+      public B cores(int cores) {
          this.cores = cores;
          return self();
       }
 
-      public B ram( int ram ) {
+      public B ram(int ram) {
          this.ram = ram;
          return self();
       }
 
-      public B isCpuHotPlug( Boolean cpuHotPlug ) {
+      public B isCpuHotPlug(Boolean cpuHotPlug) {
          this.cpuHotPlug = cpuHotPlug;
          return self();
       }
 
-      public B isRamHotPlug( Boolean ramHotPlug ) {
+      public B isRamHotPlug(Boolean ramHotPlug) {
          this.ramHotPlug = ramHotPlug;
          return self();
 
       }
 
-      public B isNicHotPlug( Boolean nicHotPlug ) {
+      public B isNicHotPlug(Boolean nicHotPlug) {
          this.nicHotPlug = nicHotPlug;
          return self();
       }
 
-      public B isNicHotUnPlug( Boolean nicHotUnPlug ) {
+      public B isNicHotUnPlug(Boolean nicHotUnPlug) {
          this.nicHotUnPlug = nicHotUnPlug;
          return self();
       }
 
-      public B isDiscVirtioHotPlug( Boolean discVirtioHotPlug ) {
+      public B isDiscVirtioHotPlug(Boolean discVirtioHotPlug) {
          this.discVirtioHotPlug = discVirtioHotPlug;
          return self();
       }
 
-      public B isDiscVirtioHotUnPlug( Boolean discVirtioHotUnPlug ) {
+      public B isDiscVirtioHotUnPlug(Boolean discVirtioHotUnPlug) {
          this.discVirtioHotUnPlug = discVirtioHotUnPlug;
          return self();
       }
@@ -161,59 +173,65 @@ public abstract class Server implements ServerCommonProperties {
       private Date creationTime;
       private Date lastModificationTime;
       private Boolean hasInternetAccess;
+      private List<Storage> storages;
 
-      public DescribingBuilder id( String id ) {
+      public DescribingBuilder id(String id) {
          this.id = id;
          return this;
       }
 
-      public DescribingBuilder state( ProvisioningState state ) {
+      public DescribingBuilder state(ProvisioningState state) {
          this.state = state;
          return this;
       }
 
-      public DescribingBuilder status( Status status ) {
+      public DescribingBuilder status(Status status) {
          this.status = status;
          return this;
       }
 
-      public DescribingBuilder osType( OsType osType ) {
+      public DescribingBuilder osType(OsType osType) {
          this.osType = osType;
          return this;
       }
 
-      public DescribingBuilder availabilityZone( AvailabilityZone zone ) {
+      public DescribingBuilder availabilityZone(AvailabilityZone zone) {
          this.zone = zone;
          return this;
       }
 
-      public DescribingBuilder creationTime( Date creationTime ) {
+      public DescribingBuilder creationTime(Date creationTime) {
          this.creationTime = creationTime;
          return this;
       }
 
-      public DescribingBuilder lastModificationTime( Date lastModificationTime ) {
+      public DescribingBuilder lastModificationTime(Date lastModificationTime) {
          this.lastModificationTime = lastModificationTime;
          return this;
       }
 
-      public DescribingBuilder hasInternetAccess( Boolean hasInternetAccess ) {
+      public DescribingBuilder hasInternetAccess(Boolean hasInternetAccess) {
          this.hasInternetAccess = hasInternetAccess;
          return this;
       }
 
+      public DescribingBuilder storages(List<Storage> storages) {
+         this.storages = storages;
+         return this;
+      }
+
       @Override
       public Server build() {
-         return Server.create( id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
-                 lastModificationTime, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+         return Server.create(id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
+                 lastModificationTime, storages, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
       }
 
-      private DescribingBuilder fromServer( Server in ) {
-         return this.id( in.id() ).cores( in.cores() ).creationTime( in.creationTime() ).hasInternetAccess( in.hasInternetAccess() )
-                 .isCpuHotPlug( in.isCpuHotPlug() ).isDiscVirtioHotPlug( in.isDiscVirtioHotPlug() ).isDiscVirtioHotUnPlug( in.isDiscVirtioHotUnPlug() )
-                 .isNicHotPlug( in.isNicHotPlug() ).isNicHotUnPlug( in.isNicHotUnPlug() ).isRamHotPlug( in.isRamHotPlug() )
-                 .lastModificationTime( in.lastModificationTime() ).name( in.name() ).osType( in.osType() ).ram( in.ram() ).state( in.state() )
-                 .status( in.status() );
+      private DescribingBuilder fromServer(Server in) {
+         return this.id(in.id()).cores(in.cores()).creationTime(in.creationTime()).hasInternetAccess(in.hasInternetAccess())
+                 .isCpuHotPlug(in.isCpuHotPlug()).isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
+                 .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug()).isRamHotPlug(in.isRamHotPlug())
+                 .lastModificationTime(in.lastModificationTime()).name(in.name()).osType(in.osType()).ram(in.ram()).state(in.state())
+                 .status(in.status()).storages(in.storages());
       }
 
       @Override
@@ -256,18 +274,18 @@ public abstract class Server implements ServerCommonProperties {
          @Nullable
          public abstract OsType osType();
 
-         public static CreatePayload create( String dataCenterId, String name, int core, int ram ) {
-            return create( dataCenterId, name, core, ram, "", "", null, false, null, null, null, null, null, null, null, null );
+         public static CreatePayload create(String dataCenterId, String name, int core, int ram) {
+            return create(dataCenterId, name, core, ram, "", "", null, false, null, null, null, null, null, null, null, null);
          }
 
-         public static CreatePayload create( String dataCenterId, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
+         public static CreatePayload create(String dataCenterId, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
                  Integer lanId, Boolean hasInternetAccess, AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug,
-                 Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
-            validateCores( cores );
-            validateRam( ram, isRamHotPlug );
-            return new AutoValue_Server_Request_CreatePayload( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
+                 Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
+            validateCores(cores);
+            validateRam(ram, isRamHotPlug);
+            return new AutoValue_Server_Request_CreatePayload(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
                     isDiscVirtioHotUnPlug, name, cores, ram, dataCenterId, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
-                    availabilityZone, osType );
+                    availabilityZone, osType);
          }
 
          public static class Builder extends Server.Builder<Builder, CreatePayload> {
@@ -280,42 +298,42 @@ public abstract class Server implements ServerCommonProperties {
             private AvailabilityZone availabilityZone;
             private OsType osType;
 
-            public Builder dataCenterId( String dataCenterId ) {
+            public Builder dataCenterId(String dataCenterId) {
                this.dataCenterId = dataCenterId;
                return this;
             }
 
-            public Builder dataCenterId( DataCenter dataCenter ) {
-               this.dataCenterId = checkNotNull( dataCenter, "Cannot pass null datacenter" ).id();
+            public Builder dataCenterId(DataCenter dataCenter) {
+               this.dataCenterId = checkNotNull(dataCenter, "Cannot pass null datacenter").id();
                return this;
             }
 
-            public Builder bootFromStorageId( String storageId ) {
+            public Builder bootFromStorageId(String storageId) {
                this.bootFromStorageId = storageId;
                return this;
             }
 
-            public Builder bootFromImageId( String image ) {
+            public Builder bootFromImageId(String image) {
                this.bootFromImageId = image;
                return this;
             }
 
-            public Builder lanId( Integer lanId ) {
+            public Builder lanId(Integer lanId) {
                this.lanId = lanId;
                return this;
             }
 
-            public Builder availabilityZone( AvailabilityZone zone ) {
+            public Builder availabilityZone(AvailabilityZone zone) {
                this.availabilityZone = zone;
                return this;
             }
 
-            public Builder osType( OsType osType ) {
+            public Builder osType(OsType osType) {
                this.osType = osType;
                return this;
             }
 
-            public Builder hasInternetAccess( Boolean hasInternetAccess ) {
+            public Builder hasInternetAccess(Boolean hasInternetAccess) {
                this.hasInternetAccess = hasInternetAccess;
                return this;
             }
@@ -327,8 +345,8 @@ public abstract class Server implements ServerCommonProperties {
 
             @Override
             public CreatePayload build() {
-               return CreatePayload.create( dataCenterId, name, cores, ram, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
-                       availabilityZone, osType, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+               return CreatePayload.create(dataCenterId, name, cores, ram, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
+                       availabilityZone, osType, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
             }
 
          }
@@ -355,11 +373,11 @@ public abstract class Server implements ServerCommonProperties {
          @Nullable
          public abstract OsType osType();
 
-         public static UpdatePayload create( String id, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
+         public static UpdatePayload create(String id, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
                  AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug,
-                 Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
-            return new AutoValue_Server_Request_UpdatePayload( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
-                    isDiscVirtioHotUnPlug, cores, ram, name, id, bootFromStorageId, bootFromImageId, availabilityZone, osType );
+                 Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
+            return new AutoValue_Server_Request_UpdatePayload(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
+                    isDiscVirtioHotUnPlug, cores, ram, name, id, bootFromStorageId, bootFromImageId, availabilityZone, osType);
          }
 
          public static class Builder extends Server.Builder<Builder, UpdatePayload> {
@@ -370,27 +388,27 @@ public abstract class Server implements ServerCommonProperties {
             private AvailabilityZone availabilityZone;
             private OsType osType;
 
-            public Builder id( String id ) {
+            public Builder id(String id) {
                this.id = id;
                return this;
             }
 
-            public Builder bootFromStorageId( String storageId ) {
+            public Builder bootFromStorageId(String storageId) {
                this.bootFromStorageId = storageId;
                return this;
             }
 
-            public Builder bootFromImageId( String image ) {
+            public Builder bootFromImageId(String image) {
                this.bootFromImageId = image;
                return this;
             }
 
-            public Builder availabilityZone( AvailabilityZone zone ) {
+            public Builder availabilityZone(AvailabilityZone zone) {
                this.availabilityZone = zone;
                return this;
             }
 
-            public Builder osType( OsType osType ) {
+            public Builder osType(OsType osType) {
                this.osType = osType;
                return this;
             }
@@ -402,8 +420,8 @@ public abstract class Server implements ServerCommonProperties {
 
             @Override
             public UpdatePayload build() {
-               return UpdatePayload.create( id, name, cores, ram, bootFromStorageId, bootFromImageId, availabilityZone, osType,
-                       cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+               return UpdatePayload.create(id, name, cores, ram, bootFromStorageId, bootFromImageId, availabilityZone, osType,
+                       cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
 
             }
 
@@ -412,13 +430,13 @@ public abstract class Server implements ServerCommonProperties {
 
    }
 
-   private static void validateCores( int cores ) {
-      checkArgument( cores > 0, "Core must be atleast 1." );
+   private static void validateCores(int cores) {
+      checkArgument(cores > 0, "Core must be atleast 1.");
    }
 
-   private static void validateRam( int ram, Boolean isRamHotPlug ) {
-      int minRam = ( isRamHotPlug == null || !isRamHotPlug ) ? 256 : 1024;
-      checkArgument( ram >= minRam && ram % 256 == 0, "RAM must be multiples of 256 with minimum of 256 MB (1024 MB if ramHotPlug is enabled)" );
+   private static void validateRam(int ram, Boolean isRamHotPlug) {
+      int minRam = (isRamHotPlug == null || !isRamHotPlug) ? 256 : 1024;
+      checkArgument(ram >= minRam && ram % 256 == 0, "RAM must be multiples of 256 with minimum of 256 MB (1024 MB if ramHotPlug is enabled)");
 
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
index 0e1303e..dac8f0b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
@@ -36,11 +36,11 @@ public abstract class ServiceFault {
       UNRECOGNIZED;
 
       public static FaultCode fromValue(String v) {
-	 try {
-	    return valueOf(v);
-	 } catch (IllegalArgumentException ex) {
-	    return UNRECOGNIZED;
-	 }
+         try {
+            return valueOf(v);
+         } catch (IllegalArgumentException ex) {
+            return UNRECOGNIZED;
+         }
       }
    }
 
@@ -68,27 +68,27 @@ public abstract class ServiceFault {
       private int requestId;
 
       public Builder faultCode(FaultCode code) {
-	 this.faultCode = code;
-	 return this;
+         this.faultCode = code;
+         return this;
       }
 
       public Builder httpCode(int httpCode) {
-	 this.httpCode = httpCode;
-	 return this;
+         this.httpCode = httpCode;
+         return this;
       }
 
       public Builder message(String message) {
-	 this.message = message;
-	 return this;
+         this.message = message;
+         return this;
       }
 
       public Builder requestId(int requestId) {
-	 this.requestId = requestId;
-	 return this;
+         this.requestId = requestId;
+         return this;
       }
 
       public ServiceFault build() {
-	 return create(faultCode, httpCode, message, requestId);
+         return create(faultCode, httpCode, message, requestId);
       }
 
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
new file mode 100644
index 0000000..6dcaf25
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
@@ -0,0 +1,355 @@
+/*
+ * 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;
+
+import com.google.auto.value.AutoValue;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Date;
+import java.util.List;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
+@AutoValue
+public abstract class Storage {
+
+   public enum BusType {
+
+      IDE, SCSI, VIRTIO, UNRECOGNIZED;
+
+      public static BusType fromValue(String value) {
+         try {
+            return valueOf(value);
+         } catch (IllegalArgumentException ex) {
+            return UNRECOGNIZED;
+         }
+      }
+   }
+
+   public abstract String id();
+
+   @Nullable
+   public abstract String name();
+
+   public abstract float size(); // GB
+
+   @Nullable
+   public abstract Date creationTime();
+
+   @Nullable
+   public abstract Date lastModificationTime();
+
+   public abstract ProvisioningState state();
+
+   @Nullable
+   public abstract List<String> serverIds();
+
+   @Nullable
+   public abstract Boolean bootDevice();
+
+   @Nullable
+   public abstract BusType busType();
+
+   @Nullable
+   public abstract Integer deviceNumber();
+
+   public static Storage create(String id, String name, float size, Date creationTime, Date lastModificationTime,
+           ProvisioningState state, List<String> serverIds, Boolean bootDevice, BusType busType, Integer deviceNumber) {
+      return new AutoValue_Storage(id, name, size, creationTime, lastModificationTime, state,
+              serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList(),
+              bootDevice, busType, deviceNumber);
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return builder().fromStorage(this);
+   }
+
+   public static class Builder {
+
+      private String id;
+      private String name;
+      private float size;
+      private Date creationTime;
+      private Date lastModificationTime;
+      private ProvisioningState state;
+      private List<String> serverIds;
+      private Boolean bootDevice;
+      private BusType busType;
+      private Integer deviceNumber;
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder size(float size) {
+         this.size = size;
+         return this;
+      }
+
+      public Builder creationTime(Date creationTime) {
+         this.creationTime = creationTime;
+         return this;
+      }
+
+      public Builder lastModificationTime(Date lastModificationTime) {
+         this.lastModificationTime = lastModificationTime;
+         return this;
+      }
+
+      public Builder state(ProvisioningState state) {
+         this.state = state;
+         return this;
+      }
+
+      public Builder serverIds(List<String> serverIds) {
+         this.serverIds = serverIds;
+         return this;
+      }
+
+      public Builder bootDevice(Boolean bootDevice) {
+         this.bootDevice = bootDevice;
+         return this;
+      }
+
+      public Builder busType(BusType busType) {
+         this.busType = busType;
+         return this;
+      }
+
+      public Builder deviceNumber(Integer deviceNumber) {
+         this.deviceNumber = deviceNumber;
+         return this;
+      }
+
+      private Builder fromStorage(Storage in) {
+         return this.id(in.id()).name(in.name()).size(in.size()).creationTime(in.creationTime())
+                 .lastModificationTime(in.lastModificationTime()).state(in.state()).serverIds(in.serverIds())
+                 .bootDevice(in.bootDevice()).busType(in.busType()).deviceNumber(in.deviceNumber());
+      }
+
+      public Storage build() {
+         return Storage.create(id, name, size, creationTime, lastModificationTime, state, serverIds, bootDevice, busType, deviceNumber);
+      }
+
+   }
+
+   public static final class Request {
+
+      public static CreatePayload.Builder creatingBuilder() {
+         return new CreatePayload.Builder();
+      }
+
+      public static UpdatePayload.Builder updatingBuilder() {
+         return new UpdatePayload.Builder();
+      }
+
+      public static ConnectPayload.Builder connectingBuilder() {
+         return new ConnectPayload.Builder();
+      }
+
+      @AutoValue
+      public abstract static class CreatePayload {
+
+         public abstract String dataCenterId();
+
+         public abstract float size();
+
+         @Nullable
+         public abstract String name();
+
+         @Nullable
+         public abstract String mountImageId();
+
+         @Nullable
+         public abstract String profitBricksImagePassword();
+
+         public static CreatePayload create(String dataCenterId, float size, String name, String mountImageId, String imagePassword) {
+            validateSize(size);
+            return new AutoValue_Storage_Request_CreatePayload(dataCenterId, size, name, mountImageId, imagePassword);
+         }
+
+         public static class Builder {
+
+            private String dataCenterId;
+            private float size;
+            private String name;
+            private String mountImageId;
+            private String profitBricksImagePassword;
+
+            public Builder dataCenterId(String dataCenterId) {
+               this.dataCenterId = dataCenterId;
+               return this;
+            }
+
+            public Builder dataCenterId(DataCenter dataCenter) {
+               this.dataCenterId = checkNotNull(dataCenter, "Cannot pass null datacenter").id();
+               return this;
+            }
+
+            public Builder size(float size) {
+               this.size = size;
+               return this;
+            }
+
+            public Builder mountImageId(String mountImageId) {
+               this.mountImageId = mountImageId;
+               return this;
+            }
+
+            public Builder name(String name) {
+               this.name = name;
+               return this;
+            }
+
+            public Builder imagePassword(String password) {
+               this.profitBricksImagePassword = password;
+               return this;
+            }
+
+            public CreatePayload build() {
+               return CreatePayload.create(dataCenterId, size, name, mountImageId, profitBricksImagePassword);
+            }
+         }
+
+      }
+
+      @AutoValue
+      public abstract static class UpdatePayload {
+
+         public abstract String id();
+
+         @Nullable
+         public abstract Float size();
+
+         @Nullable
+         public abstract String name();
+
+         @Nullable
+         public abstract String mountImageId();
+
+         public static UpdatePayload create(String id, Float size, String name, String mountImageId) {
+            validateSize(size);
+            return new AutoValue_Storage_Request_UpdatePayload(id, size, name, mountImageId);
+         }
+
+         public static class Builder {
+
+            private String id;
+            private Float size;
+            private String name;
+            private String mountImageId;
+
+            public Builder id(String id) {
+               this.id = id;
+               return this;
+            }
+
+            public Builder size(float size) {
+               this.size = size;
+               return this;
+            }
+
+            public Builder name(String name) {
+               this.name = name;
+               return this;
+            }
+
+            public Builder mountImageId(String mountImageId) {
+               this.mountImageId = mountImageId;
+               return this;
+            }
+
+            public UpdatePayload build() {
+               return UpdatePayload.create(id, size, name, mountImageId);
+            }
+         }
+      }
+
+      @AutoValue
+      public abstract static class ConnectPayload {
+
+         public abstract String storageId();
+
+         public abstract String serverId();
+
+         @Nullable
+         public abstract BusType busType();
+
+         @Nullable
+         public abstract Integer deviceNumber();
+
+         public static ConnectPayload create(String storageId, String serverId, BusType busType, Integer deviceNumber) {
+            return new AutoValue_Storage_Request_ConnectPayload(storageId, serverId, busType, deviceNumber);
+         }
+
+         public static class Builder {
+
+            private String storageId;
+            private String serverId;
+            private BusType busType;
+            private Integer deviceNumber;
+
+            public Builder storageId(String storageId) {
+               this.storageId = storageId;
+               return this;
+            }
+
+            public Builder serverId(String serverId) {
+               this.serverId = serverId;
+               return this;
+            }
+
+            public Builder busType(BusType busType) {
+               this.busType = busType;
+               return this;
+            }
+
+            public Builder deviceNumber(Integer deviceNumber) {
+               this.deviceNumber = deviceNumber;
+               return this;
+            }
+
+            public ConnectPayload build() {
+               return ConnectPayload.create(storageId, serverId, busType, deviceNumber);
+            }
+
+         }
+      }
+
+      private static void validateSize(Float size) {
+         if (size != null)
+            checkArgument(size > 1, "Storage size must be > 1GB");
+
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
index f660730..a9c6143 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
@@ -58,8 +58,7 @@ public interface DataCenterApi {
 
    /**
     * @param identifier Data Center identifier
-    * @return Returns information about an existing virtual data center's state and configuration or <code>null</code>
-    * if it doesn't exist.
+    * @return Returns information about an existing virtual data center's state and configuration or <code>null</code> if it doesn't exist.
     */
    @POST
    @Named("datacenter:get")
@@ -69,8 +68,8 @@ public interface DataCenterApi {
    DataCenter getDataCenter(@PayloadParam("id") String identifier);
 
    /**
-    * This is a lightweight function for polling the current provisioning state of the Virtual Data Center. It is
-    * recommended to use this function for large Virtual Data Centers to query request results.
+    * This is a lightweight function for polling the current provisioning state of the Virtual Data Center. It is recommended to use this
+    * function for large Virtual Data Centers to query request results.
     * <p>
     * @param identifier Data Center identifier
     */
@@ -119,9 +118,8 @@ public interface DataCenterApi {
    DataCenter clearDataCenter(@PayloadParam("id") String identifier);
 
    /**
-    * Deletes an Virtual Data Center. If a previous request on the target data center is still in progress, the data
-    * center is going to be deleted after this request has been completed. Once a Data Center has been deleted, no
-    * further request can be performed on it.
+    * Deletes an Virtual Data Center. If a previous request on the target data center is still in progress, the data center is going to be
+    * deleted after this request has been completed. Once a Data Center has been deleted, no further request can be performed on it.
     * <p>
     * @param identifier Identifier of the virtual data center
     * @return Returns a boolean indicating whether delete operation was made

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
index 1fa89b3..34445da 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
@@ -39,19 +39,19 @@ import org.jclouds.rest.annotations.PayloadParam;
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.annotations.XMLResponseParser;
 
-@RequestFilters( { BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class } )
-@Consumes( MediaType.TEXT_XML )
-@Produces( MediaType.TEXT_XML )
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
 public interface ServerApi {
 
    /**
     * @return Returns information about all virtual server, such as configuration, provisioning status, power status, etc.
     */
    @POST
-   @Named( "server:getall" )
-   @Payload( "<ws:getAllServers/>" )
-   @XMLResponseParser( ServerListResponseHandler.class )
-   @Fallback( Fallbacks.EmptyListOnNotFoundOr404.class )
+   @Named("server:getall")
+   @Payload("<ws:getAllServers/>")
+   @XMLResponseParser(ServerListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
    List<Server> getAllServers();
 
    /**
@@ -59,11 +59,11 @@ public interface ServerApi {
     * @return Returns information about a virtual server, such as configuration, provisioning status, power status, etc.
     */
    @POST
-   @Named( "server:get" )
-   @Payload( "<ws:getServer><serverId>{id}</serverId></ws:getServer>" )
-   @XMLResponseParser( ServerInfoResponseHandler.class )
-   @Fallback( Fallbacks.NullOnNotFoundOr404.class )
-   Server getServer( @PayloadParam( "id" ) String identifier );
+   @Named("server:get")
+   @Payload("<ws:getServer><serverId>{id}</serverId></ws:getServer>")
+   @XMLResponseParser(ServerInfoResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Server getServer(@PayloadParam("id") String identifier);
 
    /**
     * Starts an existing virtual server
@@ -77,10 +77,10 @@ public interface ServerApi {
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:start" )
-   @Payload( "<ws:startServer><serverId>{id}</serverId></ws:startServer>" )
-   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
-   String startServer( @PayloadParam( "id" ) String id );
+   @Named("server:start")
+   @Payload("<ws:startServer><serverId>{id}</serverId></ws:startServer>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String startServer(@PayloadParam("id") String id);
 
    /**
     *
@@ -99,10 +99,10 @@ public interface ServerApi {
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:stop" )
-   @Payload( "<ws:stopServer><serverId>{id}</serverId></ws:stopServer>" )
-   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
-   String stopServer( @PayloadParam( "id" ) String id );
+   @Named("server:stop")
+   @Payload("<ws:stopServer><serverId>{id}</serverId></ws:stopServer>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String stopServer(@PayloadParam("id") String id);
 
    /**
     * Resets an existing virtual server (POWER CYCLE).
@@ -119,10 +119,10 @@ public interface ServerApi {
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:reset" )
-   @Payload( "<ws:resetServer><serverId>{id}</serverId></ws:resetServer>" )
-   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
-   String resetServer( @PayloadParam( "id" ) String id );
+   @Named("server:reset")
+   @Payload("<ws:resetServer><serverId>{id}</serverId></ws:resetServer>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String resetServer(@PayloadParam("id") String id);
 
    /**
     * Creates a Virtual Server within an existing data center. Parameters can be specified to set up a boot device and connect the server to
@@ -132,22 +132,22 @@ public interface ServerApi {
     * @return serverId of the created server
     */
    @POST
-   @Named( "server:create" )
-   @MapBinder( CreateServerRequestBinder.class )
-   @XMLResponseParser( ServerIdOnlyResponseHandler.class )
-   String createServer( @PayloadParam( "server" ) Server.Request.CreatePayload payload );
+   @Named("server:create")
+   @MapBinder(CreateServerRequestBinder.class)
+   @XMLResponseParser(ServerIdOnlyResponseHandler.class)
+   String createServer(@PayloadParam("server") Server.Request.CreatePayload payload);
 
    /**
     * Updates parameters of an existing virtual server device.
     *
-    * @param payload Paylaod
+    * @param payload Payload
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:update" )
-   @MapBinder( UpdateServerRequestBinder.class )
-   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
-   String updateServer( @PayloadParam( "server" ) Server.Request.UpdatePayload payload );
+   @Named("server:update")
+   @MapBinder(UpdateServerRequestBinder.class)
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String updateServer(@PayloadParam("server") Server.Request.UpdatePayload payload);
 
    /**
     * Deletes an existing Virtual Server.
@@ -156,9 +156,9 @@ public interface ServerApi {
     * @return Identifier of current request
     */
    @POST
-   @Named( "server:delete" )
-   @Payload( "<ws:deleteServer><serverId>{id}</serverId></ws:deleteServer>" )
-   @Fallback( Fallbacks.FalseOnNotFoundOr404.class )
-   boolean deleteServer( @PayloadParam( "id" ) String id );
+   @Named("server:delete")
+   @Payload("<ws:deleteServer><serverId>{id}</serverId></ws:deleteServer>")
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteServer(@PayloadParam("id") String id);
 
 }


[26/35] jclouds git commit: JCLOUDS-951: Remove inheritance in ProfitBrick's AutoValue classes

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/resources/nic/nics.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nics.xml b/providers/profitbricks/src/test/resources/nic/nics.xml
index 10e219d..89b92ea 100644
--- a/providers/profitbricks/src/test/resources/nic/nics.xml
+++ b/providers/profitbricks/src/test/resources/nic/nics.xml
@@ -11,7 +11,7 @@
                 <internetAccess>true</internetAccess>
                 <serverId>server-id</serverId>
                 <ips>192.168.0.1</ips>
-                <macAddress>mac-address</macAddress>
+                <macAddress>aa:bb:cc:dd:ee:f1</macAddress>
                 <firewall>
                     <active>true</active>
                     <firewallId>firewall-id</firewallId>
@@ -33,7 +33,7 @@
                 <ips>192.168.0.2</ips>
                 <ips>192.168.0.3</ips>
                 <ips>192.168.0.4</ips>
-                <macAddress>mac-address</macAddress>
+                <macAddress>aa:bb:cc:dd:ee:f2</macAddress>
                 <firewall>
                     <active>false</active>
                     <firewallId>firewall-id2</firewallId>


[08/35] jclouds git commit: JCLOUDS-702: JClouds ProfitBricks provider - Storage API

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
index f5f7a20..c04f65c 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
@@ -20,7 +20,7 @@ import java.util.Date;
 import static org.testng.Assert.assertEquals;
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "ServerBuilderTest" )
+@Test(groups = "unit", testName = "ServerBuilderTest")
 public class ServerBuilderTest {
 
    private final Boolean _isCpuHotPlug = true;
@@ -46,119 +46,117 @@ public class ServerBuilderTest {
    private final String _bootFromStorageId = "some-random-storage-id";
    private final String _bootFromImageId = "some-random-image-id";
 
-   private final String _serverId = "some-random-server-id";
-
    @Test
    public void testAutoValueServerPropertiesSettingCorrectly() {
       Server actual = Server.builder()
-              .availabilityZone( _availabilityZone )
-              .creationTime( _creationTime )
-              .cores( _cores )
-              .hasInternetAccess( _hasInternetAccess )
-              .id( _id )
-              .name( _name )
-              .isCpuHotPlug( _isCpuHotPlug )
-              .isDiscVirtioHotPlug( _isDiscVirtioHotPlug )
-              .isDiscVirtioHotUnPlug( _isDiscVirtioHotUnPlug )
-              .isNicHotPlug( _isNicHotPlug )
-              .isNicHotUnPlug( _isNicHotUnPlug )
-              .isRamHotPlug( _isRamHotPlug )
-              .lastModificationTime( _lastModificationTime )
-              .ram( _ram )
-              .osType( _osType )
-              .state( _state )
-              .status( _status )
+              .availabilityZone(_availabilityZone)
+              .creationTime(_creationTime)
+              .cores(_cores)
+              .hasInternetAccess(_hasInternetAccess)
+              .id(_id)
+              .name(_name)
+              .isCpuHotPlug(_isCpuHotPlug)
+              .isDiscVirtioHotPlug(_isDiscVirtioHotPlug)
+              .isDiscVirtioHotUnPlug(_isDiscVirtioHotUnPlug)
+              .isNicHotPlug(_isNicHotPlug)
+              .isNicHotUnPlug(_isNicHotUnPlug)
+              .isRamHotPlug(_isRamHotPlug)
+              .lastModificationTime(_lastModificationTime)
+              .ram(_ram)
+              .osType(_osType)
+              .state(_state)
+              .status(_status)
               .build();
 
-      assertEquals( actual.availabilityZone(), _availabilityZone );
-      assertEquals( actual.cores(), _cores );
-      assertEquals( actual.creationTime(), _creationTime );
-      assertEquals( actual.hasInternetAccess(), _hasInternetAccess );
-      assertEquals( actual.id(), _id );
-      assertEquals( actual.name(), _name );
-      assertEquals( actual.isCpuHotPlug(), _isCpuHotPlug );
-      assertEquals( actual.isDiscVirtioHotPlug(), _isDiscVirtioHotPlug );
-      assertEquals( actual.isDiscVirtioHotUnPlug(), _isDiscVirtioHotUnPlug );
-      assertEquals( actual.isNicHotPlug(), _isNicHotPlug );
-      assertEquals( actual.isNicHotUnPlug(), _isNicHotUnPlug );
-      assertEquals( actual.isRamHotPlug(), _isRamHotPlug );
-      assertEquals( actual.lastModificationTime(), _lastModificationTime );
-      assertEquals( actual.ram(), _ram );
-      assertEquals( actual.osType(), _osType );
-      assertEquals( actual.state(), _state );
+      assertEquals(actual.availabilityZone(), _availabilityZone);
+      assertEquals(actual.cores(), _cores);
+      assertEquals(actual.creationTime(), _creationTime);
+      assertEquals(actual.hasInternetAccess(), _hasInternetAccess);
+      assertEquals(actual.id(), _id);
+      assertEquals(actual.name(), _name);
+      assertEquals(actual.isCpuHotPlug(), _isCpuHotPlug);
+      assertEquals(actual.isDiscVirtioHotPlug(), _isDiscVirtioHotPlug);
+      assertEquals(actual.isDiscVirtioHotUnPlug(), _isDiscVirtioHotUnPlug);
+      assertEquals(actual.isNicHotPlug(), _isNicHotPlug);
+      assertEquals(actual.isNicHotUnPlug(), _isNicHotUnPlug);
+      assertEquals(actual.isRamHotPlug(), _isRamHotPlug);
+      assertEquals(actual.lastModificationTime(), _lastModificationTime);
+      assertEquals(actual.ram(), _ram);
+      assertEquals(actual.osType(), _osType);
+      assertEquals(actual.state(), _state);
    }
 
    @Test
    public void testAutoValueServerRequestCreatePayloadPropertiesSettingCorrectly() {
       Server.Request.CreatePayload actual = Server.Request.creatingBuilder()
-              .availabilityZone( _availabilityZone )
-              .bootFromImageId( _bootFromImageId )
-              .bootFromStorageId( _bootFromStorageId )
-              .cores( _cores )
-              .dataCenterId( _dataCenterId )
-              .hasInternetAccess( _hasInternetAccess )
-              .name( _name )
-              .isCpuHotPlug( _isCpuHotPlug )
-              .isDiscVirtioHotPlug( _isDiscVirtioHotPlug )
-              .isDiscVirtioHotUnPlug( _isDiscVirtioHotUnPlug )
-              .isNicHotPlug( _isNicHotPlug )
-              .isNicHotUnPlug( _isNicHotUnPlug )
-              .isRamHotPlug( _isRamHotPlug )
-              .lanId( _lanId )
-              .ram( _ram )
-              .osType( _osType )
+              .availabilityZone(_availabilityZone)
+              .bootFromImageId(_bootFromImageId)
+              .bootFromStorageId(_bootFromStorageId)
+              .cores(_cores)
+              .dataCenterId(_dataCenterId)
+              .hasInternetAccess(_hasInternetAccess)
+              .name(_name)
+              .isCpuHotPlug(_isCpuHotPlug)
+              .isDiscVirtioHotPlug(_isDiscVirtioHotPlug)
+              .isDiscVirtioHotUnPlug(_isDiscVirtioHotUnPlug)
+              .isNicHotPlug(_isNicHotPlug)
+              .isNicHotUnPlug(_isNicHotUnPlug)
+              .isRamHotPlug(_isRamHotPlug)
+              .lanId(_lanId)
+              .ram(_ram)
+              .osType(_osType)
               .build();
 
-      assertEquals( actual.availabilityZone(), _availabilityZone );
-      assertEquals( actual.bootFromImageId(), _bootFromImageId );
-      assertEquals( actual.bootFromStorageId(), _bootFromStorageId );
-      assertEquals( actual.cores(), _cores );
-      assertEquals( actual.dataCenterId(), _dataCenterId );
-      assertEquals( actual.hasInternetAccess(), _hasInternetAccess );
-      assertEquals( actual.name(), _name );
-      assertEquals( actual.isCpuHotPlug(), _isCpuHotPlug );
-      assertEquals( actual.isDiscVirtioHotPlug(), _isDiscVirtioHotPlug );
-      assertEquals( actual.isDiscVirtioHotUnPlug(), _isDiscVirtioHotUnPlug );
-      assertEquals( actual.isNicHotPlug(), _isNicHotPlug );
-      assertEquals( actual.isNicHotUnPlug(), _isNicHotUnPlug );
-      assertEquals( actual.isRamHotPlug(), _isRamHotPlug );
-      assertEquals( actual.lanId(), _lanId );
-      assertEquals( actual.ram(), _ram );
-      assertEquals( actual.osType(), _osType );
+      assertEquals(actual.availabilityZone(), _availabilityZone);
+      assertEquals(actual.bootFromImageId(), _bootFromImageId);
+      assertEquals(actual.bootFromStorageId(), _bootFromStorageId);
+      assertEquals(actual.cores(), _cores);
+      assertEquals(actual.dataCenterId(), _dataCenterId);
+      assertEquals(actual.hasInternetAccess(), _hasInternetAccess);
+      assertEquals(actual.name(), _name);
+      assertEquals(actual.isCpuHotPlug(), _isCpuHotPlug);
+      assertEquals(actual.isDiscVirtioHotPlug(), _isDiscVirtioHotPlug);
+      assertEquals(actual.isDiscVirtioHotUnPlug(), _isDiscVirtioHotUnPlug);
+      assertEquals(actual.isNicHotPlug(), _isNicHotPlug);
+      assertEquals(actual.isNicHotUnPlug(), _isNicHotUnPlug);
+      assertEquals(actual.isRamHotPlug(), _isRamHotPlug);
+      assertEquals(actual.lanId(), _lanId);
+      assertEquals(actual.ram(), _ram);
+      assertEquals(actual.osType(), _osType);
    }
 
    @Test
    public void testAutoValueServerRequestUpdatePayloadPropertiesSettingCorrectly() {
       Server.Request.UpdatePayload actual = Server.Request.updatingBuilder()
-              .availabilityZone( _availabilityZone )
-              .bootFromImageId( _bootFromImageId )
-              .bootFromStorageId( _bootFromStorageId )
-              .cores( _cores )
-              .name( _name )
-              .id( _id )
-              .isCpuHotPlug( _isCpuHotPlug )
-              .isDiscVirtioHotPlug( _isDiscVirtioHotPlug )
-              .isDiscVirtioHotUnPlug( _isDiscVirtioHotUnPlug )
-              .isNicHotPlug( _isNicHotPlug )
-              .isNicHotUnPlug( _isNicHotUnPlug )
-              .isRamHotPlug( _isRamHotPlug )
-              .ram( _ram )
-              .osType( _osType )
+              .availabilityZone(_availabilityZone)
+              .bootFromImageId(_bootFromImageId)
+              .bootFromStorageId(_bootFromStorageId)
+              .cores(_cores)
+              .name(_name)
+              .id(_id)
+              .isCpuHotPlug(_isCpuHotPlug)
+              .isDiscVirtioHotPlug(_isDiscVirtioHotPlug)
+              .isDiscVirtioHotUnPlug(_isDiscVirtioHotUnPlug)
+              .isNicHotPlug(_isNicHotPlug)
+              .isNicHotUnPlug(_isNicHotUnPlug)
+              .isRamHotPlug(_isRamHotPlug)
+              .ram(_ram)
+              .osType(_osType)
               .build();
 
-      assertEquals( actual.availabilityZone(), _availabilityZone );
-      assertEquals( actual.bootFromImageId(), _bootFromImageId );
-      assertEquals( actual.bootFromStorageId(), _bootFromStorageId );
-      assertEquals( actual.cores(), _cores );
-      assertEquals( actual.name(), _name );
-      assertEquals( actual.id(), _id );
-      assertEquals( actual.isCpuHotPlug(), _isCpuHotPlug );
-      assertEquals( actual.isDiscVirtioHotPlug(), _isDiscVirtioHotPlug );
-      assertEquals( actual.isDiscVirtioHotUnPlug(), _isDiscVirtioHotUnPlug );
-      assertEquals( actual.isNicHotPlug(), _isNicHotPlug );
-      assertEquals( actual.isNicHotUnPlug(), _isNicHotUnPlug );
-      assertEquals( actual.isRamHotPlug(), _isRamHotPlug );
-      assertEquals( actual.ram(), _ram );
-      assertEquals( actual.osType(), _osType );
+      assertEquals(actual.availabilityZone(), _availabilityZone);
+      assertEquals(actual.bootFromImageId(), _bootFromImageId);
+      assertEquals(actual.bootFromStorageId(), _bootFromStorageId);
+      assertEquals(actual.cores(), _cores);
+      assertEquals(actual.name(), _name);
+      assertEquals(actual.id(), _id);
+      assertEquals(actual.isCpuHotPlug(), _isCpuHotPlug);
+      assertEquals(actual.isDiscVirtioHotPlug(), _isDiscVirtioHotPlug);
+      assertEquals(actual.isDiscVirtioHotUnPlug(), _isDiscVirtioHotUnPlug);
+      assertEquals(actual.isNicHotPlug(), _isNicHotPlug);
+      assertEquals(actual.isNicHotUnPlug(), _isNicHotUnPlug);
+      assertEquals(actual.isRamHotPlug(), _isRamHotPlug);
+      assertEquals(actual.ram(), _ram);
+      assertEquals(actual.osType(), _osType);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
index 5c05e4d..586487b 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
@@ -90,7 +90,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       String content = "<ws:getDataCenter><dataCenterId>" + id + "</dataCenterId></ws:getDataCenter>";
       try {
          DataCenter dataCenter = api.getDataCenter(id);
-         assertRequestHasCommonProperties(server.takeRequest(), content );
+         assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(dataCenter);
          assertEquals(dataCenter.id(), id);
       } finally {
@@ -130,7 +130,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       String content = "<ws:getDataCenterState><dataCenterId>" + id + "</dataCenterId></ws:getDataCenterState>";
       try {
          ProvisioningState state = api.getDataCenterState(id);
-         assertRequestHasCommonProperties(server.takeRequest(), content );
+         assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(state);
          assertEquals(state, ProvisioningState.AVAILABLE);
       } finally {
@@ -155,7 +155,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
          DataCenter dataCenter = api.createDataCenter(
                  DataCenter.Request.CreatePayload.create("JClouds-DC", Location.DE_FRA)
          );
-         assertRequestHasCommonProperties(server.takeRequest(), content );
+         assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(dataCenter);
          assertEquals(dataCenter.id(), "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
          assertEquals(dataCenter.version(), 1);
@@ -168,14 +168,13 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testCreateDataCenterWithIllegalArguments() throws Exception {
       String[] names = {"JCl@ouds", "JC|ouds", "^clouds", ""};
-      for (String name : names) {
+      for (String name : names)
          try {
             DataCenter.Request.CreatePayload.create(name, Location.US_LAS);
             fail("Should have failed for name: ".concat(name));
          } catch (IllegalArgumentException ex) {
             // expected exception
          }
-      }
    }
 
    @Test
@@ -185,10 +184,10 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
 
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       DataCenterApi api = pbApi.dataCenterApi();
-      
+
       String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
       String newName = "Apache";
-      
+
       String content = "<ws:updateDataCenter><request>"
               + "<dataCenterId>" + id + "</dataCenterId>"
               + "<dataCenterName>" + newName + "</dataCenterName>"
@@ -216,7 +215,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       DataCenterApi api = pbApi.dataCenterApi();
 
       String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
-      
+
       String content = "<ws:clearDataCenter><dataCenterId>" + id + "</dataCenterId></ws:clearDataCenter>";
       try {
          DataCenter dataCenter = api.clearDataCenter(id);
@@ -240,7 +239,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       DataCenterApi api = pbApi.dataCenterApi();
 
       String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
-      
+
       String content = "<ws:deleteDataCenter><dataCenterId>" + id + "</dataCenterId></ws:deleteDataCenter>";
       try {
          boolean result = api.deleteDataCenter(id);
@@ -255,7 +254,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testDeleteNonExistingDataCenter() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setResponseCode( 404 ));
+      server.enqueue(new MockResponse().setResponseCode(404));
 
       ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       DataCenterApi api = pbApi.dataCenterApi();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiMockTest.java
index f1229ae..6e97541 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ImageApiMockTest.java
@@ -81,7 +81,7 @@ public class ImageApiMockTest extends BaseProfitBricksMockTest {
       ImageApi api = pbApi.imageApi();
 
       String id = "5ad99c9e-9166-11e4-9d74-52540066fee9";
-      
+
       String content = "<ws:getImage><imageId>" + id + "</imageId></ws:getImage>";
       try {
          Image image = api.getImage(id);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
index 3237e9c..e7b1b9c 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
@@ -34,7 +34,7 @@ import static org.testng.Assert.assertTrue;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
 
-@Test( groups = "live", testName = "ServerApiLiveTest", singleThreaded = true )
+@Test(groups = "live", testName = "ServerApiLiveTest", singleThreaded = true)
 public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
 
    private Predicate<String> waitUntilAvailable;
@@ -45,94 +45,94 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    protected void initialize() {
       super.initialize();
       List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
-      assertFalse( dataCenters.isEmpty(), "Must atleast have 1 datacenter available for server testing." );
+      assertFalse(dataCenters.isEmpty(), "Must atleast have 1 datacenter available for server testing.");
 
-      this.dataCenter = Iterables.getFirst( dataCenters, null );
+      this.dataCenter = Iterables.getFirst(dataCenters, null);
 
       this.waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate( api, ProvisioningStatusAware.SERVER, ProvisioningState.AVAILABLE ),
-              2l * 60l, 2l, TimeUnit.SECONDS );
+              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.SERVER, ProvisioningState.AVAILABLE),
+              2l * 60l, 2l, TimeUnit.SECONDS);
    }
 
    @Test
    public void testCreateServer() {
       String serverId = api.serverApi().createServer(
-              Server.Request.CreatePayload.create( dataCenter.id(), "jclouds-node", 1, 1024 ) );
+              Server.Request.CreatePayload.create(dataCenter.id(), "jclouds-node", 1, 1024));
 
-      assertNotNull( serverId );
+      assertNotNull(serverId);
       this.createdServerId = serverId;
    }
 
-   @Test( dependsOnMethods = "testCreateServer" )
+   @Test(dependsOnMethods = "testCreateServer")
    public void testGetServer() {
-      Server server = api.serverApi().getServer( createdServerId );
+      Server server = api.serverApi().getServer(createdServerId);
 
-      assertNotNull( server );
-      assertEquals( server.id(), createdServerId );
+      assertNotNull(server);
+      assertEquals(server.id(), createdServerId);
    }
 
-   @Test( dependsOnMethods = "testCreateServer" )
+   @Test(dependsOnMethods = "testCreateServer")
    public void testGetAllServers() {
       List<Server> servers = api.serverApi().getAllServers();
 
-      assertNotNull( servers );
-      assertFalse( servers.isEmpty() );
+      assertNotNull(servers);
+      assertFalse(servers.isEmpty());
    }
 
-   @Test( dependsOnMethods = "testCreateServer" )
+   @Test(dependsOnMethods = "testCreateServer")
    public void testWaitUntilAvailable() {
-      boolean available = waitUntilAvailable.apply( createdServerId );
+      boolean available = waitUntilAvailable.apply(createdServerId);
 
-      assertTrue( available );
+      assertTrue(available);
    }
 
-   @Test( dependsOnMethods = "testWaitUntilAvailable" )
+   @Test(dependsOnMethods = "testWaitUntilAvailable")
    public void testUpdateServer() {
       String requestId = api.serverApi().updateServer(
               Server.Request.updatingBuilder()
-              .id( createdServerId )
-              .name( "apache-node" )
-              .cores( 2 )
-              .ram( 2 * 1024 )
-              .build() );
+              .id(createdServerId)
+              .name("apache-node")
+              .cores(2)
+              .ram(2 * 1024)
+              .build());
 
-      assertNotNull( requestId );
-      waitUntilAvailable.apply( createdServerId );
+      assertNotNull(requestId);
+      waitUntilAvailable.apply(createdServerId);
 
-      Server server = api.serverApi().getServer( createdServerId );
-      assertEquals( server.state(), ProvisioningState.AVAILABLE );
+      Server server = api.serverApi().getServer(createdServerId);
+      assertEquals(server.state(), ProvisioningState.AVAILABLE);
    }
 
-   @Test( dependsOnMethods = "testUpdateServer" )
+   @Test(dependsOnMethods = "testUpdateServer")
    public void testStopServer() {
-      String requestId = api.serverApi().stopServer( createdServerId );
-      assertNotNull( requestId );
+      String requestId = api.serverApi().stopServer(createdServerId);
+      assertNotNull(requestId);
 
-      Predicate<String> waitUntilInactive = Predicates2.retry( new ProvisioningStatusPollingPredicate(
-              api, ProvisioningStatusAware.SERVER, ProvisioningState.INACTIVE ), 2l * 60l, 2l, TimeUnit.SECONDS );
+      Predicate<String> waitUntilInactive = Predicates2.retry(new ProvisioningStatusPollingPredicate(
+              api, ProvisioningStatusAware.SERVER, ProvisioningState.INACTIVE), 2l * 60l, 2l, TimeUnit.SECONDS);
 
-      waitUntilInactive.apply( createdServerId );
-      Server server = api.serverApi().getServer( createdServerId );
-      assertEquals( server.status(), Server.Status.SHUTOFF );
+      waitUntilInactive.apply(createdServerId);
+      Server server = api.serverApi().getServer(createdServerId);
+      assertEquals(server.status(), Server.Status.SHUTOFF);
    }
 
-   @Test( dependsOnMethods = "testStopServer" )
+   @Test(dependsOnMethods = "testStopServer")
    public void testStartServer() {
-      String requestId = api.serverApi().startServer( createdServerId );
-      assertNotNull( requestId );
+      String requestId = api.serverApi().startServer(createdServerId);
+      assertNotNull(requestId);
 
-      waitUntilAvailable.apply( createdServerId );
+      waitUntilAvailable.apply(createdServerId);
 
-      Server server = api.serverApi().getServer( createdServerId );
-      assertEquals( server.status(), Server.Status.RUNNING );
+      Server server = api.serverApi().getServer(createdServerId);
+      assertEquals(server.status(), Server.Status.RUNNING);
    }
 
-   @AfterClass( alwaysRun = true )
+   @AfterClass(alwaysRun = true)
    public void testDeleteServer() {
-      if ( createdServerId != null ) {
-         boolean result = api.serverApi().deleteServer( createdServerId );
+      if (createdServerId != null) {
+         boolean result = api.serverApi().deleteServer(createdServerId);
 
-         assertTrue( result, "Created test server was not deleted." );
+         assertTrue(result, "Created test server was not deleted.");
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiMockTest.java
index d9fd478..47738b8 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiMockTest.java
@@ -16,39 +16,45 @@
  */
 package org.jclouds.profitbricks.features;
 
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+
 import com.squareup.okhttp.mockwebserver.MockResponse;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
+
 import java.util.List;
+
 import org.jclouds.profitbricks.ProfitBricksApi;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
-import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
 import org.jclouds.rest.ResourceNotFoundException;
+
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
+
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "ServerApiMockTest" )
+@Test(groups = "unit", testName = "ServerApiMockTest")
 public class ServerApiMockTest extends BaseProfitBricksMockTest {
 
    @Test
    public void testGetAllServers() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/servers.xml" ) ) );
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/server/servers.xml")));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       try {
          List<Server> servers = api.getAllServers();
-         assertRequestHasCommonProperties( server.takeRequest(), "<ws:getAllServers/>" );
-         assertNotNull( servers );
-         assertTrue( servers.size() == 2 );
+         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllServers/>");
+         assertNotNull(servers);
+         assertTrue(servers.size() == 2);
       } finally {
          pbApi.close();
          server.shutdown();
@@ -58,15 +64,15 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testGetAllServersReturning404() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setResponseCode( 404 ) );
+      server.enqueue(new MockResponse().setResponseCode(404));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       try {
          List<Server> servers = api.getAllServers();
-         assertRequestHasCommonProperties( server.takeRequest() );
-         assertTrue( servers.isEmpty() );
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertTrue(servers.isEmpty());
       } finally {
          pbApi.close();
          server.shutdown();
@@ -76,19 +82,19 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testGetServer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server.xml" ) ) );
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/server/server.xml")));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
 
       String content = "<ws:getServer><serverId>" + id + "</serverId></ws:getServer>";
       try {
-         Server svr = api.getServer( id );
-         assertRequestHasCommonProperties( server.takeRequest(), content );
-         assertNotNull( svr );
-         assertEquals( svr.id(), id );
+         Server svr = api.getServer(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(svr);
+         assertEquals(svr.id(), id);
       } finally {
          pbApi.close();
          server.shutdown();
@@ -98,16 +104,16 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testGetNonExistingServer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setResponseCode( 404 ) );
+      server.enqueue(new MockResponse().setResponseCode(404));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       String id = "random-non-existing-id";
       try {
-         Server srvr = api.getServer( id );
-         assertRequestHasCommonProperties( server.takeRequest() );
-         assertNull( srvr );
+         Server srvr = api.getServer(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(srvr);
 
       } finally {
          pbApi.close();
@@ -118,18 +124,18 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testStartServer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-start.xml" ) ) );
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/server/server-start.xml")));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
 
       String content = "<ws:startServer><serverId>" + id + "</serverId></ws:startServer>";
       try {
-         String requestId = api.startServer( id );
-         assertRequestHasCommonProperties( server.takeRequest(), content );
-         assertEquals( requestId, "123456" );
+         String requestId = api.startServer(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertEquals(requestId, "123456");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -139,17 +145,17 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testStartNonExistingServer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setResponseCode( 500 ).setBody( payloadFromResource( "/fault-404.xml" ) ) );
+      server.enqueue(new MockResponse().setResponseCode(500).setBody(payloadFromResource("/fault-404.xml")));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       String id = "random-non-existing-id";
       try {
-         String requestId = api.startServer( id );
-         assertRequestHasCommonProperties( server.takeRequest() );
-         fail( "Should've failed." );
-      } catch ( ResourceNotFoundException ex ) {
+         String requestId = api.startServer(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         fail("Should've failed.");
+      } catch (ResourceNotFoundException ex) {
          // expected exception
       } finally {
          pbApi.close();
@@ -160,18 +166,18 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testStopServer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-stop.xml" ) ) );
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/server/server-stop.xml")));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
 
       String content = "<ws:stopServer><serverId>" + id + "</serverId></ws:stopServer>";
       try {
-         String requestId = api.stopServer( id );
-         assertRequestHasCommonProperties( server.takeRequest(), content );
-         assertEquals( requestId, "123456" );
+         String requestId = api.stopServer(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertEquals(requestId, "123456");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -181,18 +187,18 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testResetServer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-reset.xml" ) ) );
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/server/server-reset.xml")));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
 
       String content = "<ws:resetServer><serverId>" + id + "</serverId></ws:resetServer>";
       try {
-         String requestId = api.resetServer( id );
-         assertRequestHasCommonProperties( server.takeRequest(), content );
-         assertEquals( requestId, "123456" );
+         String requestId = api.resetServer(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertEquals(requestId, "123456");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -202,9 +208,9 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testCreateServer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-create.xml" ) ) );
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/server/server-create.xml")));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       String dataCenterId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
@@ -233,26 +239,26 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
               + "</ws:createServer>";
 
       try {
-         String serverId = api.createServer( Server.Request.creatingBuilder()
-                 .dataCenterId( dataCenterId )
-                 .name( name )
-                 .cores( 4 )
-                 .ram( 4 * 1024 )
-                 .bootFromImageId( imageId )
-                 .hasInternetAccess( Boolean.TRUE )
-                 .lanId( 2 )
-                 .osType( OsType.LINUX )
-                 .availabilityZone( AvailabilityZone.ZONE_1 )
-                 .isCpuHotPlug( Boolean.TRUE )
-                 .isRamHotPlug( Boolean.FALSE )
-                 .isNicHotPlug( Boolean.TRUE )
-                 .isNicHotUnPlug( Boolean.FALSE )
-                 .isDiscVirtioHotPlug( Boolean.TRUE )
-                 .isDiscVirtioHotUnPlug( Boolean.FALSE )
-                 .build() );
-         assertRequestHasCommonProperties( server.takeRequest(), content );
-         assertNotNull( serverId );
-         assertEquals( serverId, "qwertyui-qwer-qwer-qwer-qwertyyuiiop" );
+         String serverId = api.createServer(Server.Request.creatingBuilder()
+                 .dataCenterId(dataCenterId)
+                 .name(name)
+                 .cores(4)
+                 .ram(4 * 1024)
+                 .bootFromImageId(imageId)
+                 .hasInternetAccess(Boolean.TRUE)
+                 .lanId(2)
+                 .osType(OsType.LINUX)
+                 .availabilityZone(AvailabilityZone.ZONE_1)
+                 .isCpuHotPlug(Boolean.TRUE)
+                 .isRamHotPlug(Boolean.FALSE)
+                 .isNicHotPlug(Boolean.TRUE)
+                 .isNicHotUnPlug(Boolean.FALSE)
+                 .isDiscVirtioHotPlug(Boolean.TRUE)
+                 .isDiscVirtioHotUnPlug(Boolean.FALSE)
+                 .build());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(serverId);
+         assertEquals(serverId, "qwertyui-qwer-qwer-qwer-qwertyyuiiop");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -262,9 +268,9 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testUpdateServer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-update.xml" ) ) );
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/server/server-update.xml")));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       String serverId = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
@@ -278,7 +284,7 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
               + "<ram>8192</ram>"
               + "<serverName>" + newName + "</serverName>"
               + "<bootFromStorageId>" + storageId + "</bootFromStorageId>"
-//              + "<bootFromImageId>?</bootFromImageId>"
+              //              + "<bootFromImageId>?</bootFromImageId>"
               + "<osType>OTHER</osType>"
               + "<availabilityZone>AUTO</availabilityZone>"
               + "<cpuHotPlug>false</cpuHotPlug>"
@@ -290,24 +296,24 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
               + "</request>"
               + "</ws:updateServer>";
       try {
-         String requestId = api.updateServer( Server.Request.updatingBuilder()
-                 .id( serverId )
-                 .name( newName )
-                 .cores( 8 )
-                 .ram( 8 * 1024 )
-                 .bootFromStorageId( storageId )
-                 .osType( OsType.OTHER )
-                 .availabilityZone( AvailabilityZone.AUTO )
-                 .isCpuHotPlug( false )
-                 .isRamHotPlug( true )
-                 .isNicHotPlug( false )
-                 .isNicHotUnPlug( true )
-                 .isDiscVirtioHotPlug( false )
-                 .isDiscVirtioHotUnPlug( true )
-                 .build() );
-         assertRequestHasCommonProperties( server.takeRequest(), content );
-         assertNotNull( requestId );
-         assertEquals( requestId, "102458" );
+         String requestId = api.updateServer(Server.Request.updatingBuilder()
+                 .id(serverId)
+                 .name(newName)
+                 .cores(8)
+                 .ram(8 * 1024)
+                 .bootFromStorageId(storageId)
+                 .osType(OsType.OTHER)
+                 .availabilityZone(AvailabilityZone.AUTO)
+                 .isCpuHotPlug(false)
+                 .isRamHotPlug(true)
+                 .isNicHotPlug(false)
+                 .isNicHotUnPlug(true)
+                 .isDiscVirtioHotPlug(false)
+                 .isDiscVirtioHotUnPlug(true)
+                 .build());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(requestId);
+         assertEquals(requestId, "102458");
       } finally {
          pbApi.close();
          server.shutdown();
@@ -317,22 +323,41 @@ public class ServerApiMockTest extends BaseProfitBricksMockTest {
    @Test
    public void testDeleteServer() throws Exception {
       MockWebServer server = mockWebServer();
-      server.enqueue( new MockResponse().setBody( payloadFromResource( "/server/server-delete.xml" ) ) );
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/server/server-delete.xml")));
 
-      ProfitBricksApi pbApi = api( server.getUrl( rootUrl ) );
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
       ServerApi api = pbApi.serverApi();
 
       String serverId = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
-      
+
       String content = "<ws:deleteServer><serverId>" + serverId + "</serverId></ws:deleteServer>";
       try {
-         boolean result = api.deleteServer( serverId );
-         assertRequestHasCommonProperties( server.takeRequest(), content );
-         assertTrue( result );
+         boolean result = api.deleteServer(serverId);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(result);
       } finally {
          pbApi.close();
          server.shutdown();
       }
 
    }
+
+   @Test
+   public void testDeleteNonExistingServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      ServerApi api = pbApi.serverApi();
+
+      String id = "random-non-existing-id";
+      try {
+         boolean result = api.deleteServer(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertFalse(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
new file mode 100644
index 0000000..6295701
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
@@ -0,0 +1,167 @@
+/*
+ * 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.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.rest.InsufficientResourcesException;
+import org.jclouds.util.Predicates2;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+@Test(groups = "live", testName = "StorageApiLiveTest", singleThreaded = true)
+public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
+
+   private Predicate<String> waitUntilAvailable;
+   private DataCenter dataCenter;
+   private Server server;
+   private String createdStorageId;
+
+   @Override
+   protected void initialize() {
+      super.initialize();
+      List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
+      assertFalse(dataCenters.isEmpty(), "Must atleast have 1 datacenter available for storage testing.");
+
+      dataCenter = Iterables.getFirst(dataCenters, null);
+      if (dataCenter != null)
+         dataCenter = api.dataCenterApi().getDataCenter(dataCenter.id()); // fetch individual to load more properties
+
+      this.waitUntilAvailable = Predicates2.retry(
+              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.STORAGE, ProvisioningState.AVAILABLE),
+              6l * 60l, 2l, TimeUnit.SECONDS);
+   }
+
+   @Test(expectedExceptions = InsufficientResourcesException.class)
+   public void testUberStorage() {
+      api.storageApi().createStorage(
+              Storage.Request.creatingBuilder()
+              .dataCenterId(dataCenter)
+              .name("Uber Storage")
+              .size(9999999f)
+              .build());
+   }
+
+   @Test
+   public void testCreateStorage() {
+      String storageId = api.storageApi().createStorage(
+              Storage.Request.creatingBuilder()
+              .dataCenterId(dataCenter)
+              .name("hdd-1")
+              .size(2f)
+              .build());
+
+      assertNotNull(storageId);
+      createdStorageId = storageId;
+   }
+
+   @Test(dependsOnMethods = "testCreateStorage")
+   public void testGetStorage() {
+      Storage storage = api.storageApi().getStorage(createdStorageId);
+
+      assertNotNull(storage);
+      assertEquals(storage.id(), createdStorageId);
+   }
+
+   @Test(dependsOnMethods = "testCreateStorage")
+   public void testGetAllStorages() {
+      List<Storage> storages = api.storageApi().getAllStorages();
+
+      assertNotNull(storages);
+      assertFalse(storages.isEmpty());
+   }
+
+   @Test(dependsOnMethods = "testCreateStorage")
+   public void testWaitUntilAvailable() {
+      boolean available = waitUntilAvailable.apply(createdStorageId);
+
+      assertTrue(available);
+   }
+
+   @Test(dependsOnMethods = "testWaitUntilAvailable")
+   public void testUpdateStorage() {
+      String requestId = api.storageApi().updateStorage(
+              Storage.Request.updatingBuilder()
+              .id(createdStorageId)
+              .name("hdd-2")
+              .size(5l)
+              .build());
+
+      assertNotNull(requestId);
+      waitUntilAvailable.apply(createdStorageId);
+
+      Storage storage = api.storageApi().getStorage(createdStorageId);
+      assertEquals(storage.size(), 5f);
+      assertEquals(storage.name(), "hdd-2");
+   }
+
+   @Test(dependsOnMethods = "testUpdateStorage")
+   public void testConnectStorage() {
+      server = Iterables.getFirst(dataCenter.servers(), null);
+      assertNotNull(server, "No server to attach to.");
+
+      String requestId = api.storageApi().connectStorageToServer(
+              Storage.Request.connectingBuilder()
+              .storageId(createdStorageId)
+              .serverId(server.id())
+              .build()
+      );
+
+      assertNotNull(requestId);
+      waitUntilAvailable.apply(createdStorageId);
+
+      Storage storage = api.storageApi().getStorage(createdStorageId);
+      assertTrue(storage.serverIds().contains(server.id()));
+   }
+
+   @Test(dependsOnMethods = "testConnectStorage")
+   public void testDisconnectStorage() {
+      String requestId = api.storageApi()
+              .disconnectStorageFromServer(createdStorageId, server.id());
+
+      assertNotNull(requestId);
+      waitUntilAvailable.apply(createdStorageId);
+
+      Storage storage = api.storageApi().getStorage(createdStorageId);
+      assertFalse(storage.serverIds().contains(server.id()));
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void testDeleteStorage() {
+      if (createdStorageId != null) {
+         boolean result = api.storageApi().deleteStorage(createdStorageId);
+
+         assertTrue(result, "Created test storage was not delete.");
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiMockTest.java
new file mode 100644
index 0000000..10a4a49
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiMockTest.java
@@ -0,0 +1,285 @@
+/*
+ * 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.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.List;
+
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import org.testng.annotations.Test;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+@Test(groups = "unit", testName = "StorageApiMockTest")
+public class StorageApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetAllStorages() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/storage/storages.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      try {
+         List<Storage> storages = api.getAllStorages();
+         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllStorages/>");
+         assertNotNull(storages);
+         assertTrue(storages.size() == 2);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllStoragesReturning404() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      try {
+         List<Storage> storages = api.getAllStorages();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertTrue(storages.isEmpty());
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetStorage() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/storage/storage.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+
+      String content = "<ws:getStorage><storageId>" + id + "</storageId></ws:getStorage>";
+      try {
+         Storage storage = api.getStorage(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(storage);
+         assertEquals(storage.id(), id);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetNonExistingStorage() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      String id = "random-non-existing-id";
+      try {
+         Storage storage = api.getStorage(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(storage);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testConnectStorageToServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/storage/storage-connect.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      String storageId = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+      String serverId = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      String content = "<ws:connectStorageToServer><request>"
+              + "<storageId>" + storageId + "</storageId>"
+              + "<serverId>" + serverId + "</serverId>"
+              + "<busType>VIRTIO</busType>"
+              + "<deviceNumber>2</deviceNumber>"
+              + "</request></ws:connectStorageToServer>";
+      try {
+         String requestId = api.connectStorageToServer(
+                 Storage.Request.connectingBuilder()
+                 .serverId(serverId)
+                 .storageId(storageId)
+                 .busType(Storage.BusType.VIRTIO)
+                 .deviceNumber(2)
+                 .build()
+         );
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertEquals(requestId, "16463317");
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDisconnectStorageFromServer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/storage/storage-disconnect.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      String storageId = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+      String serverId = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      String content = "<ws:disconnectStorageFromServer>"
+              + "<storageId>" + storageId + "</storageId>"
+              + "<serverId>" + serverId + "</serverId>"
+              + "</ws:disconnectStorageFromServer>";
+
+      try {
+         String requestId = api.disconnectStorageFromServer(storageId, serverId);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertEquals(requestId, "16463318");
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testCreateStorage() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/storage/storage-create.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      String dataCenterId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      String imageId = "f0a59a5c-7940-11e4-8053-52540066fee9";
+
+      String content = "<ws:createStorage><request>"
+              + "<dataCenterId>" + dataCenterId + "</dataCenterId>"
+              + "<storageName>hdd-1</storageName>" + "<size>80</size>"
+              + "<mountImageId>" + imageId + "</mountImageId>"
+              + "<profitBricksImagePassword>qqqqqqqqq</profitBricksImagePassword>"
+              + "</request></ws:createStorage>";
+      try {
+         String storageId = api.createStorage(
+                 Storage.Request.creatingBuilder()
+                 .dataCenterId(dataCenterId)
+                 .name("hdd-1")
+                 .size(80f)
+                 .mountImageId(imageId)
+                 .imagePassword("qqqqqqqqq")
+                 .build());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(storageId);
+         assertEquals(storageId, "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh");
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testUpdateStorage() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/storage/storage-update.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      String storageId = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+      String imageId = "f4742db0-9160-11e4-9d74-52540066fee9";
+
+      String content = "<ws:updateStorage><request>"
+              + "<storageId>" + storageId + "</storageId>"
+              + "<size>20</size><storageName>hdd-2</storageName>"
+              + "<mountImageId>" + imageId + "</mountImageId>"
+              + "</request></ws:updateStorage>";
+      try {
+         String requestId = api.updateStorage(
+                 Storage.Request.updatingBuilder()
+                 .id(storageId)
+                 .size(20f)
+                 .name("hdd-2")
+                 .mountImageId(imageId)
+                 .build());
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(requestId);
+         assertEquals(requestId, "1234568");
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteStorage() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/storage/storage-delete.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      String storageId = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+
+      String content = "<ws:deleteStorage><storageId>" + storageId + "</storageId></ws:deleteStorage>";
+
+      try {
+         boolean result = api.deleteStorage(storageId);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteNonExistingStorage() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      StorageApi api = pbApi.storageApi();
+
+      String id = "random-non-existing-id";
+      try {
+         boolean result = api.deleteStorage(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertFalse(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
index 9198840..8658e2d 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
@@ -20,12 +20,16 @@ import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWeb
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
+import org.jclouds.http.HttpResponseException;
 import org.jclouds.profitbricks.ProfitBricksApi;
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.features.DataCenterApi;
+import org.jclouds.profitbricks.features.ServerApi;
 import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
 import org.jclouds.rest.AuthorizationException;
+import org.jclouds.rest.InsufficientResourcesException;
 import org.jclouds.rest.ResourceNotFoundException;
 import org.testng.annotations.Test;
 
@@ -38,6 +42,8 @@ import com.squareup.okhttp.mockwebserver.MockWebServer;
 @Test(groups = "unit", testName = "ResponseStatusFromPayloadHttpCommandExecutorServiceTest")
 public class ResponseStatusFromPayloadHttpCommandExecutorServiceTest extends BaseProfitBricksMockTest {
 
+   private final int MAX_RETRIES = 5;
+
    @Test
    public void testNotFound() throws Exception {
       MockWebServer server = mockWebServer();
@@ -95,4 +101,43 @@ public class ResponseStatusFromPayloadHttpCommandExecutorServiceTest extends Bas
          server.shutdown();
       }
    }
+
+   @Test
+   public void testOverLimitSettings() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(503).setBody(payloadFromResource("/fault-413.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl("/"));
+      ServerApi api = pbApi.serverApi();
+
+      try {
+         api.createServer(Server.Request.CreatePayload.create("some-datacenter-id", "node1", 99, 12800));
+         fail("Request should have failed.");
+      } catch (Exception ex) {
+         assertTrue(ex instanceof InsufficientResourcesException, "Exception should be InsufficientResourcesException");
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testServiceUnderMaintenance() throws Exception {
+      MockWebServer server = mockWebServer();
+      for (int i = 0; i <= MAX_RETRIES; i++)  // jclouds retries 5 times
+         server.enqueue(new MockResponse().setResponseCode(503).setBody(payloadFromResource("/maintenance-503.html")));
+
+      ProfitBricksApi pbApi = api(server.getUrl("/"));
+      DataCenterApi api = pbApi.dataCenterApi();
+
+      try {
+         api.clearDataCenter("some-datacenter-id");
+         fail("Request should have failed.");
+      } catch (Exception ex) {
+         assertTrue(ex instanceof HttpResponseException, "Exception should be HttpResponseException");
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/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 e6b692b..7413d01 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
@@ -28,9 +28,9 @@ import org.testng.annotations.Test;
 public class ProfitBricksSoapMessageEnvelopeTest {
 
    private final String SOAP_PREFIX
-	   = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">"
-	   + "<soapenv:Header/>"
-	   + "<soapenv:Body>";
+           = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">"
+           + "<soapenv:Header/>"
+           + "<soapenv:Body>";
    private final String SOAP_SUFFIX = "</soapenv:Body></soapenv:Envelope>";
    private final String endpoint = "https://api.profitbricks.com/1.3";
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/BaseResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/BaseResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/BaseResponseHandlerTest.java
index 23bdbc9..d481735 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/BaseResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/BaseResponseHandlerTest.java
@@ -47,9 +47,9 @@ public abstract class BaseResponseHandlerTest<T> {
 
    protected String payloadFromResource(String resource) {
       try {
-	 return toStringAndClose(getClass().getResourceAsStream(resource));
+         return toStringAndClose(getClass().getResourceAsStream(resource));
       } catch (IOException e) {
-	 throw Throwables.propagate(e);
+         throw Throwables.propagate(e);
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandlerTest.java
index d32b656..3ea9ed8 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandlerTest.java
@@ -20,57 +20,57 @@ import org.jclouds.http.functions.ParseSax;
 import static org.testng.Assert.assertEquals;
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "RequestIdOnlyResponseHandlerTest" )
+@Test(groups = "unit", testName = "RequestIdOnlyResponseHandlerTest")
 public class RequestIdOnlyResponseHandlerTest extends BaseResponseHandlerTest<String> {
 
    @Override
    protected ParseSax<String> createParser() {
-      return factory.create( injector.getInstance( RequestIdOnlyResponseHandler.class ) );
+      return factory.create(injector.getInstance(RequestIdOnlyResponseHandler.class));
    }
 
    @Test
    public void testParseResponseFromStartServer() {
       ParseSax<String> parser = createParser();
 
-      String requestId = parser.parse( payloadFromResource( "/server/server-start.xml" ) );
+      String requestId = parser.parse(payloadFromResource("/server/server-start.xml"));
 
-      assertEquals( requestId, "123456" );
+      assertEquals(requestId, "123456");
    }
 
    @Test
    public void testParseResponseFromStopServer() {
       ParseSax<String> parser = createParser();
 
-      String requestId = parser.parse( payloadFromResource( "/server/server-stop.xml" ) );
+      String requestId = parser.parse(payloadFromResource("/server/server-stop.xml"));
 
-      assertEquals( requestId, "123456" );
+      assertEquals(requestId, "123456");
    }
 
    @Test
    public void testParseResponseFromResetServer() {
       ParseSax<String> parser = createParser();
 
-      String requestId = parser.parse( payloadFromResource( "/server/server-reset.xml" ) );
+      String requestId = parser.parse(payloadFromResource("/server/server-reset.xml"));
 
-      assertEquals( requestId, "123456" );
+      assertEquals(requestId, "123456");
    }
 
    @Test
    public void testParseResponseFromUpdateServer() {
       ParseSax<String> parser = createParser();
 
-      String requestId = parser.parse( payloadFromResource( "/server/server-update.xml" ) );
+      String requestId = parser.parse(payloadFromResource("/server/server-update.xml"));
 
-      assertEquals( requestId, "102458" );
+      assertEquals(requestId, "102458");
    }
 
    @Test
    public void testParseResponseFromDeleteServer() {
       ParseSax<String> parser = createParser();
 
-      String requestId = parser.parse( payloadFromResource( "/server/server-delete.xml" ) );
+      String requestId = parser.parse(payloadFromResource("/server/server-delete.xml"));
 
-      assertEquals( requestId, "102459" );
+      assertEquals(requestId, "102459");
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
index cb84841..2b54dd5 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandlerTest.java
@@ -38,11 +38,11 @@ public class ServiceFaultResponseHandlerTest extends BaseResponseHandlerTest<Ser
       assertNotNull(actual, "Parsed content returned null");
 
       ServiceFault expected = ServiceFault.builder()
-	      .faultCode(ServiceFault.FaultCode.RESOURCE_NOT_FOUND)
-	      .httpCode(404)
-	      .message("The requested resource could not be found. Please refer to Request Id : 16370720. [VDC-6-404] The requested resource does not exist or already deleted by the users. ResourceId random-non-existing-id")
-	      .requestId(16370720)
-	      .build();
+              .faultCode(ServiceFault.FaultCode.RESOURCE_NOT_FOUND)
+              .httpCode(404)
+              .message("The requested resource could not be found. Please refer to Request Id : 16370720. [VDC-6-404] The requested resource does not exist or already deleted by the users. ResourceId random-non-existing-id")
+              .requestId(16370720)
+              .build();
 
       assertEquals(expected, actual);
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
index 0a3a570..f9827b3 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
@@ -19,14 +19,21 @@ package org.jclouds.profitbricks.http.parser.datacenter;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
-
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
 import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.AvailabilityZone;
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Storage;
 import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableList;
+
 @Test(groups = "unit", testName = "DataCenterInfoResponseHandlerTest")
 public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<DataCenter> {
 
@@ -35,19 +42,57 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
       return factory.create(injector.getInstance(DataCenterInfoResponseHandler.class));
    }
 
+   protected DateCodecFactory createDateParser() {
+      return injector.getInstance(DateCodecFactory.class);
+   }
+
    @Test
    public void testParseResponseFromGetDataCenter() {
       ParseSax<DataCenter> parser = createParser();
+
       DataCenter actual = parser.parse(payloadFromResource("/datacenter/datacenter.xml"));
       assertNotNull(actual, "Parsed content returned null");
 
+      DateCodec dateParser = createDateParser().iso8601();
+
       DataCenter expected = DataCenter.builder()
-	      .id("12345678-abcd-efgh-ijkl-987654321000")
-	      .version(10)
-	      .name("JClouds-DC")
-	      .state(ProvisioningState.AVAILABLE)
-	      .location(Location.US_LAS)
-	      .build();
-      assertEquals(expected, actual);
+              .id("12345678-abcd-efgh-ijkl-987654321000")
+              .version(10)
+              .name("JClouds-DC")
+              .state(ProvisioningState.AVAILABLE)
+              .location(Location.US_LAS)
+              .servers(ImmutableList.<Server>of(
+                              Server.builder()
+                              .id("12345678-abcd-efgh-ijkl-987654321000")
+                              .name("jnode1")
+                              .cores(4)
+                              .ram(4096)
+                              .hasInternetAccess(true)
+                              .state(ProvisioningState.AVAILABLE)
+                              .status(Server.Status.RUNNING)
+                              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+                              .lastModificationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
+                              .osType(OsType.LINUX)
+                              .availabilityZone(AvailabilityZone.AUTO)
+                              .isCpuHotPlug(true)
+                              .isRamHotPlug(true)
+                              .isNicHotPlug(true)
+                              .isNicHotUnPlug(true)
+                              .isDiscVirtioHotPlug(true)
+                              .isDiscVirtioHotUnPlug(true)
+                              .build()
+                      ))
+              .storages(ImmutableList.<Storage>of(
+                              Storage.builder()
+                              .id("ssssssss-aaaa-ffff-gggg-hhhhhhhhhhhh")
+                              .size(40)
+                              .name("jnode1-disk1")
+                              .state(ProvisioningState.AVAILABLE)
+                              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+                              .lastModificationTime(dateParser.toDate("2014-12-12T03:14:48.316Z"))
+                              .build()
+                      ))
+              .build();
+      assertEquals(actual, expected);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandlerTest.java
index b957b52..7e738ae 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandlerTest.java
@@ -45,8 +45,8 @@ public class DataCenterListResponseHandlerTest extends BaseResponseHandlerTest<L
       assertNotNull(actual, "Parsed content returned null");
 
       List<DataCenter> expected = ImmutableList.<DataCenter>of(
-	      DataCenter.builder().id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee").name("JClouds-DC").version(10).state(ProvisioningState.AVAILABLE).build(),
-	      DataCenter.builder().id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy").name("Random DC").version(238).state(ProvisioningState.INPROCESS).build()
+              DataCenter.builder().id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee").name("JClouds-DC").version(10).state(ProvisioningState.AVAILABLE).build(),
+              DataCenter.builder().id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy").name("Random DC").version(238).state(ProvisioningState.INPROCESS).build()
       );
       assertEquals(expected, actual);
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandlerTest.java
index d09f362..fb2e33d 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandlerTest.java
@@ -25,41 +25,41 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "ImageInfoResponseHandlerTest" )
+@Test(groups = "unit", testName = "ImageInfoResponseHandlerTest")
 public class ImageInfoResponseHandlerTest extends BaseResponseHandlerTest<Image> {
 
    @Override
    protected ParseSax<Image> createParser() {
-      return factory.create( injector.getInstance( ImageInfoResponseHandler.class ) );
+      return factory.create(injector.getInstance(ImageInfoResponseHandler.class));
    }
 
    @Test
    public void testParseResponseFromGetImage() {
       ParseSax<Image> parser = createParser();
-      Image actual = parser.parse( payloadFromResource( "/image/image.xml" ) );
-      assertNotNull( actual, "Parsed content returned null" );
+      Image actual = parser.parse(payloadFromResource("/image/image.xml"));
+      assertNotNull(actual, "Parsed content returned null");
 
       Image expected = Image.builder()
-              .isBootable( true )
-              .isCpuHotPlug( true )
-              .isCpuHotUnPlug( false )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
-              .id( "5ad99c9e-9166-11e4-9d74-52540066fee9" )
-              .name( "Ubuntu-14.04-LTS-server-2015-01-01" )
-              .size( 2048f )
-              .type( Image.Type.HDD )
-              .location( Location.US_LAS )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .osType( OsType.LINUX )
-              .isPublic( true )
-              .isRamHotPlug( true )
-              .isRamHotUnPlug( false )
-              .isWriteable( true )
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("5ad99c9e-9166-11e4-9d74-52540066fee9")
+              .name("Ubuntu-14.04-LTS-server-2015-01-01")
+              .size(2048f)
+              .type(Image.Type.HDD)
+              .location(Location.US_LAS)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isPublic(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .isWriteable(true)
               .build();
 
-      assertEquals( expected, actual );
+      assertEquals(expected, actual);
    }
 
 }


[25/35] jclouds git commit: JCLOUDS-702: JClouds ProfitBricks provider - ComputeServiceAdapter

Posted by de...@apache.org.
JCLOUDS-702: JClouds ProfitBricks provider - ComputeServiceAdapter


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

Branch: refs/heads/master
Commit: ed247e7dea753daa94c8f0b228804f6947b694e7
Parents: cd91e00
Author: Reijhanniel Jearl Campos <rj...@toro.io>
Authored: Mon Jun 29 11:13:21 2015 +0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Jun 30 12:42:51 2015 +0200

----------------------------------------------------------------------
 providers/profitbricks/README.md                |  63 +++
 providers/profitbricks/pom.xml                  |   1 -
 .../profitbricks/ProfitBricksApiMetadata.java   |   7 +-
 .../ProfitBricksProviderMetadata.java           |  25 +-
 .../CreateDataCenterRequestBinder.java          |   2 +-
 .../CreateLoadBalancerRequestBinder.java        |   3 +-
 .../DeregisterLoadBalancerRequestBinder.java    |   3 +-
 .../RegisterLoadBalancerRequestBinder.java      |   3 +-
 .../snapshot/CreateSnapshotRequestBinder.java   |  12 +-
 .../snapshot/RollbackSnapshotRequestBinder.java |  30 +-
 .../snapshot/UpdateSnapshotRequestBinder.java   |  32 +-
 .../ProfitBricksComputeServiceAdapter.java      | 488 +++++++++++++++++++
 .../compute/concurrent/ProvisioningJob.java     |  62 +++
 .../compute/concurrent/ProvisioningManager.java |  88 ++++
 ...ProfitBricksComputeServiceContextModule.java | 147 ++++++
 .../compute/function/DataCenterToLocation.java  |  54 ++
 .../compute/function/LocationToLocation.java    |  47 ++
 .../compute/function/ProvisionableToImage.java  | 215 ++++++++
 .../compute/function/ServerToNodeMetadata.java  | 180 +++++++
 .../compute/function/StorageToVolume.java       |  47 ++
 .../ProvisioningStatusPollingPredicate.java     |  32 +-
 .../config/ProfitBricksComputeProperties.java   |  31 ++
 .../jclouds/profitbricks/domain/Firewall.java   |   6 +-
 .../org/jclouds/profitbricks/domain/Image.java  | 129 +----
 .../profitbricks/domain/LoadBalancer.java       |  46 +-
 .../jclouds/profitbricks/domain/Location.java   |  20 +-
 .../org/jclouds/profitbricks/domain/Nic.java    |   8 +-
 .../org/jclouds/profitbricks/domain/Server.java | 116 ++---
 .../jclouds/profitbricks/domain/Snapshot.java   | 429 ++++++----------
 .../jclouds/profitbricks/domain/Storage.java    |  13 +-
 .../domain/internal/HotPluggable.java           | 102 ++++
 .../domain/internal/Provisionable.java          |  67 +++
 .../domain/internal/ServerCommonProperties.java |  22 +-
 .../profitbricks/features/LoadBalancerApi.java  |   2 +-
 .../firewall/FirewallListResponseHandler.java   |   6 +-
 .../ipblock/IpBlockListResponseHandler.java     |   6 +-
 .../BaseLoadBalancerResponseHandler.java        |  33 +-
 .../LoadBalancerListResponseHandler.java        |  25 +-
 .../LoadBalancerResponseHandler.java            |  13 +-
 .../server/BaseServerResponseHandler.java       |  40 +-
 .../server/ServerInfoResponseHandler.java       |   7 +-
 .../server/ServerListResponseHandler.java       |  24 +-
 .../snapshot/BaseSnapshotResponseHandler.java   |  48 +-
 .../snapshot/SnapshotListResponseHandler.java   |  12 +-
 .../snapshot/SnapshotResponseHandler.java       |  11 +-
 .../storage/BaseStorageResponseHandler.java     |  12 +-
 .../storage/StorageInfoResponseHandler.java     |   7 +-
 .../storage/StorageListResponseHandler.java     |  12 +-
 .../jclouds/profitbricks/util/Passwords.java    |  64 +++
 .../CreateSnapshotRequestBinderTest.java        |  14 +-
 .../RollbackSnapshotRequestBinderTest.java      |  16 +-
 ...ofitBricksComputeServiceAdapterLiveTest.java |  74 +++
 .../ProfitBricksTemplateBuilderLiveTest.java    |  37 ++
 .../concurrent/ProvisioningManagerTest.java     | 118 +++++
 .../function/DataCenterToLocationTest.java      |  77 +++
 .../function/LocationToLocationTest.java        |  62 +++
 .../function/ProvisionableToImageTest.java      | 260 ++++++++++
 .../function/ServerToNodeMetadataTest.java      | 184 +++++++
 .../compute/function/StorageToVolumeTest.java   |  61 +++
 .../ProvisioningStatusPollingPredicateTest.java |   6 +-
 .../features/DrivesApiLiveTest.java             |   9 +-
 .../features/FirewallApiLiveTest.java           |   2 +-
 .../features/IpBlockApiLiveTest.java            |   2 +-
 .../features/IpBlockApiMockTest.java            |   4 +-
 .../features/LoadbalancerApiLiveTest.java       |   2 +-
 .../features/LoadbalancerApiMockTest.java       |   2 +-
 .../features/SnapshotApiLiveTest.java           |  32 +-
 .../features/SnapshotApiMockTest.java           | 174 +++----
 .../DataCenterInfoResponseHandlerTest.java      |  22 +-
 .../image/ImageListResponseHandlerTest.java     |   6 +-
 .../LoadBalancerListResponseHandlerTest.java    |  75 ++-
 .../LoadBalancerResponseHandlerTest.java        |  28 +-
 .../server/ServerInfoResponseHandlerTest.java   |  20 +-
 .../server/ServerListResponseHandlerTest.java   |  32 +-
 .../SnapshotListResponseHandlerTest.java        |  89 ++--
 .../snapshot/SnapshotResponseHandlerTest.java   |  49 +-
 .../storage/StorageInfoResponseHandlerTest.java |  13 +-
 .../storage/StorageListResponseHandlerTest.java |  17 +-
 .../profitbricks/util/PasswordsTest.java        |  53 ++
 .../resources/datacenter/datacenter-deleted.xml |  14 +-
 .../datacenter/datacenter-not-found.xml         |  28 +-
 .../datacenter/datacenter-state-inprocess.xml   |  10 +-
 .../resources/datacenter/datacenter-state.xml   |  10 +-
 .../src/test/resources/drives/drives-add.xml    |  18 +-
 .../src/test/resources/drives/drives-remove.xml |  18 +-
 .../resources/firewall/firewall-activate.xml    |  18 +-
 .../resources/firewall/firewall-addtonic.xml    |  40 +-
 .../resources/firewall/firewall-deactivate.xml  |  18 +-
 .../test/resources/firewall/firewall-delete.xml |  18 +-
 .../test/resources/firewall/firewall-remove.xml |  18 +-
 .../src/test/resources/firewall/firewall.xml    |  40 +-
 .../test/resources/ipblock/ipblock-addtonic.xml |  18 +-
 .../test/resources/ipblock/ipblock-release.xml  |  14 +-
 .../resources/ipblock/ipblock-removefromnic.xml |  18 +-
 .../test/resources/ipblock/ipblock-reserve.xml  |  20 +-
 .../src/test/resources/ipblock/ipblock.xml      |  30 +-
 .../loadbalancer/loadbalancer-create.xml        |   4 +-
 .../loadbalancer/loadbalancer-delete.xml        |  18 +-
 .../loadbalancer/loadbalancer-deregister.xml    |   8 +-
 .../loadbalancer/loadbalancer-register.xml      |   8 +-
 .../loadbalancer/loadbalancer-update.xml        |   4 +-
 .../resources/loadbalancer/loadbalancer.xml     |   2 +-
 .../resources/loadbalancer/loadbalancers.xml    |   4 +-
 .../src/test/resources/server/server.xml        |   4 +-
 .../src/test/resources/snapshot/snapshots.xml   |  38 +-
 105 files changed, 3643 insertions(+), 1189 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/README.md
----------------------------------------------------------------------
diff --git a/providers/profitbricks/README.md b/providers/profitbricks/README.md
new file mode 100644
index 0000000..09c367a
--- /dev/null
+++ b/providers/profitbricks/README.md
@@ -0,0 +1,63 @@
+# jclouds ProfitBricks
+
+## Terms
+Like any cloud provider, ProfitBricks has its own set of terms in cloud computing. To abstract this into jclouds' Compute interface, these terms were associated:
+
+- Node - composite instance of `Server` and `Storage`
+- Image - both *user-uploaded* and *provided* `Images`; and `Snapshots`
+- Location - `DataCenters` and `Region` (Las Vegas, Frankfurt, etc.)
+- Hardware - number of cores, RAM size and storage size
+
+## Getting Started
+
+Assuming that there's **atleast one** datacenter existing in your account, the provider needs only an *identity* (your ProfitBricks email), and *credentials* (password) to provision a `Node`, by using a ProfitBricks-provided ubuntu-12.04 image as a template. 
+
+```java
+ComputeService compute = ContextBuilder.newBuilder( "profitbricks" )
+					.credentials( "profitbricks email", "password" )
+					.buildView( ComputeServiceContext.class )
+					.getComputeService();
+```
+
+
+This works well; however, we won't be able to use jclouds' ability to execute *scripts* on a remote node. This is because, ProfitBricks' default images require users to change passwords upon first log in.
+
+To enable jclouds to execute script, we need to use a custom image. The easiest way to do this is via ProfitBricks snapshot:
+
+-  Go to your [DCD](https://my.profitbricks.com/dashboard/).
+-  Provision a server + storage, and connect it to the internet. Upon success, you will receive an email containing the credentials needed to login to your server.
+-  Login to your server, and change the password, as requested.
+
+```
+~ ssh root@<remote-ip>
+...
+Changing password for root.
+(current) UNIX password: 
+Enter new UNIX password: 
+Retype new UNIX password: 
+~ root@ubuntu:~# exit
+
+```
+
+- Go back to the DCD, and *make a snapshot* of the storage. Put a descriptive name.
+- Configure jclouds to use this *snapshot*.
+
+```java 
+Template template = compute.templateBuilder()
+	.imageNameMatches( "<ideally-unique-snapshot-name>" )
+	.options( compute.templateOptions()
+				.overrideLoginUser( "root" ) // unless you changed the user
+				.overrideLoginPassword( "<changed-password>" ))
+	// more options, as you need
+	.build();
+	
+compute.createNodesInGroup( "cluster1", 1, template );
+```
+> If no `locationId` is specified in the template, jclouds will look for a `DataCenter` that is of same scope as the `Image`.
+
+
+## Limitations
+
+- There's no direct way of specifying arbitrary number of cores, RAM size, and storage size via the compute interface, at least until after [JCLOUDS-482](https://issues.apache.org/jira/browse/JCLOUDS-482) is resolved. The adapter uses a predefined list hardware profiles instead.
+
+> Take note that these features are still accessible by *unwraping* the ProfitBricks API, but this'll reduce portability of your code. See [Concepts](https://jclouds.apache.org/start/concepts/).
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/pom.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/pom.xml b/providers/profitbricks/pom.xml
index 84f49b4..9311e48 100644
--- a/providers/profitbricks/pom.xml
+++ b/providers/profitbricks/pom.xml
@@ -36,7 +36,6 @@
         <test.profitbricks.identity>FIXME</test.profitbricks.identity>
         <test.profitbricks.credential>FIXME</test.profitbricks.credential>
         <test.profitbricks.api-version>1.3</test.profitbricks.api-version>
-        <test.profitbricks.template />
         <jclouds.osgi.export>org.jclouds.profitbricks*;version="${project.version}"</jclouds.osgi.export>
         <jclouds.osgi.import>
             org.jclouds.labs*;version="${project.version}",

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
index 205b246..2973f4a 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
@@ -19,8 +19,10 @@ package org.jclouds.profitbricks;
 import java.net.URI;
 import java.util.Properties;
 
+import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule;
 import org.jclouds.profitbricks.config.ProfitBricksHttpApiModule;
 import org.jclouds.apis.ApiMetadata;
+import org.jclouds.compute.ComputeServiceContext;
 import org.jclouds.profitbricks.config.ProfitBricksHttpApiModule.ProfitBricksHttpCommandExecutorServiceModule;
 import org.jclouds.rest.internal.BaseHttpApiMetadata;
 
@@ -60,11 +62,12 @@ public class ProfitBricksApiMetadata extends BaseHttpApiMetadata<ProfitBricksApi
                  .documentation(URI.create("https://www.profitbricks.com/sites/default/files/profitbricks_api_1_3.pdf"))
                  .defaultEndpoint("https://api.profitbricks.com/1.3")
                  .version("1.3")
-                 // .view(ComputeServiceContext.class)
+                 .view(ComputeServiceContext.class)
                  .defaultProperties(ProfitBricksApiMetadata.defaultProperties())
                  .defaultModules(ImmutableSet.<Class<? extends Module>>of(
                                  ProfitBricksHttpApiModule.class,
-                                 ProfitBricksHttpCommandExecutorServiceModule.class
+                                 ProfitBricksHttpCommandExecutorServiceModule.class,
+                                 ProfitBricksComputeServiceContextModule.class
                          ));
       }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/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 9ecfbc1..ed6c556 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
@@ -16,8 +16,17 @@
  */
 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.profitbricks.config.ProfitBricksComputeProperties.POLL_MAX_PERIOD;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_TIMEOUT;
+
 import com.google.auto.service.AutoService;
+
 import java.net.URI;
+import java.util.Properties;
+
 import org.jclouds.providers.ProviderMetadata;
 import org.jclouds.providers.internal.BaseProviderMetadata;
 
@@ -41,6 +50,19 @@ public class ProfitBricksProviderMetadata extends BaseProviderMetadata {
       return new Builder();
    }
 
+   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);
+
+      return properties;
+   }
+
    public static class Builder extends BaseProviderMetadata.Builder {
 
       protected Builder() {
@@ -49,7 +71,8 @@ public class ProfitBricksProviderMetadata extends BaseProviderMetadata {
                  .homepage(URI.create("http://www.profitbricks.com"))
                  .console(URI.create("https://my.profitbricks.com/dashboard/dcdr2/"))
                  .linkedServices("profitbricks")
-                 .apiMetadata(new ProfitBricksApiMetadata());
+                 .apiMetadata(new ProfitBricksApiMetadata())
+                 .defaultProperties(ProfitBricksProviderMetadata.defaultProperties());
       }
 
       @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
index 8a07b0a..1873f31 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
@@ -35,7 +35,7 @@ public class CreateDataCenterRequestBinder extends BaseProfitBricksRequestBinder
       requestBuilder.append("<ws:createDataCenter>")
               .append("<request>")
               .append(format("<dataCenterName>%s</dataCenterName>", payload.name()))
-              .append(format("<location>%s</location>", payload.location().value()))
+              .append(format("<location>%s</location>", payload.location().getId()))
               .append("</request>")
               .append("</ws:createDataCenter>");
       return requestBuilder.toString();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
index 23e121e..90eb93f 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
@@ -39,9 +39,8 @@ public class CreateLoadBalancerRequestBinder extends BaseProfitBricksRequestBind
               .append(format("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.loadBalancerAlgorithm()))
               .append(format("<ip>%s</ip>", payload.ip()))
               .append(format("<lanId>%s</lanId>", payload.lanId()));
-      for (String serverId : payload.serverIds()) {
+      for (String serverId : payload.serverIds())
          requestBuilder.append(format("<serverIds>%s</serverIds>", serverId));
-      }
       requestBuilder
               .append("</request>")
               .append("</ws:createLoadBalancer>");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
index 92f2868..ba237c4 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
@@ -33,9 +33,8 @@ public class DeregisterLoadBalancerRequestBinder extends BaseProfitBricksRequest
    protected String createPayload(LoadBalancer.Request.DeregisterPayload payload) {
       requestBuilder.append("<ws:deregisterServersOnLoadBalancer>")
               .append("<request>");
-      for (String s : payload.serverIds()) {
+      for (String s : payload.serverIds())
          requestBuilder.append(format("<serverIds>%s</serverIds>", s));
-      }
       requestBuilder.append(format("<loadBalancerId>%s</loadBalancerId>", payload.id()))
               .append("</request>")
               .append("</ws:deregisterServersOnLoadBalancer>");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
index 2e437f0..21f1d84 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
@@ -35,9 +35,8 @@ public class RegisterLoadBalancerRequestBinder extends BaseProfitBricksRequestBi
               .append("<ws:registerServersOnLoadBalancer>").append("<request>")
               .append(format("<loadBalancerId>%s</loadBalancerId>", payload.id()));
 
-      for (String s : payload.serverIds()) {
+      for (String s : payload.serverIds())
          requestBuilder.append(format("<serverIds>%s</serverIds>", s));
-      }
       requestBuilder
               .append("</request>")
               .append("</ws:registerServersOnLoadBalancer>");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinder.java
index 213a3a8..5ec4644 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinder.java
@@ -33,12 +33,12 @@ public class CreateSnapshotRequestBinder extends BaseProfitBricksRequestBinder<S
    @Override
    protected String createPayload(Snapshot.Request.CreatePayload payload) {
       requestBuilder.append("<ws:createSnapshot>")
-	      .append("<request>")
-	      .append(format("<storageId>%s</storageId>", payload.storageId()))
-	      .append(formatIfNotEmpty("<description>%s</description>", payload.description()))
-	      .append(formatIfNotEmpty("<snapshotName>%s</snapshotName>", payload.name()))
-	      .append("</request>")
-	      .append("</ws:createSnapshot>");
+              .append("<request>")
+              .append(format("<storageId>%s</storageId>", payload.storageId()))
+              .append(formatIfNotEmpty("<description>%s</description>", payload.description()))
+              .append(formatIfNotEmpty("<snapshotName>%s</snapshotName>", payload.name()))
+              .append("</request>")
+              .append("</ws:createSnapshot>");
       return requestBuilder.toString();
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinder.java
index a9997cb..5099324 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinder.java
@@ -23,21 +23,21 @@ import static java.lang.String.format;
 
 public class RollbackSnapshotRequestBinder extends BaseProfitBricksRequestBinder<Snapshot.Request.RollbackPayload> {
 
-    protected final StringBuilder requestBuilder;
+   protected final StringBuilder requestBuilder;
 
-    protected RollbackSnapshotRequestBinder() {
-        super("snapshot");
-        this.requestBuilder = new StringBuilder(128);
-    }
+   protected RollbackSnapshotRequestBinder() {
+      super("snapshot");
+      this.requestBuilder = new StringBuilder(128);
+   }
 
-    @Override
-    protected String createPayload(Snapshot.Request.RollbackPayload payload) {
-        requestBuilder.append("<ws:rollbackSnapshot>")
-                .append("<request>")
-                .append(format("<snapshotId>%s</snapshotId>", payload.snapshotId()))
-                .append(format("<storageId>%s</storageId>", payload.storageId()))
-                .append("</request>")
-                .append("</ws:rollbackSnapshot>");
-        return requestBuilder.toString();
-    }
+   @Override
+   protected String createPayload(Snapshot.Request.RollbackPayload payload) {
+      requestBuilder.append("<ws:rollbackSnapshot>")
+              .append("<request>")
+              .append(format("<snapshotId>%s</snapshotId>", payload.snapshotId()))
+              .append(format("<storageId>%s</storageId>", payload.storageId()))
+              .append("</request>")
+              .append("</ws:rollbackSnapshot>");
+      return requestBuilder.toString();
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
index e396715..df1b7cd 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinder.java
@@ -32,22 +32,22 @@ public class UpdateSnapshotRequestBinder extends BaseProfitBricksRequestBinder<S
    @Override
    protected String createPayload(Snapshot.Request.UpdatePayload payload) {
       requestBuilder.append("<ws:updateSnapshot>")
-	      .append("<request>")
-	      .append(format("<snapshotId>%s</snapshotId>", payload.snapshotId()))
-	      .append(format("<description>%s</description>", payload.description()))
-	      .append(format("<snapshotName>%s</snapshotName>", payload.name()))
-	      .append(formatIfNotEmpty("<bootable>%s</bootable>", payload.bootable()))
-	      .append(formatIfNotEmpty("<osType>%s</osType>", payload.osType()))
-	      .append(formatIfNotEmpty("<cpuHotPlug>%s</cpuHotPlug>", payload.cpuHotplug()))
-	      .append(formatIfNotEmpty("<cpuHotUnPlug>%s</cpuHotUnPlug>", payload.cpuHotunplug()))
-	      .append(formatIfNotEmpty("<ramHotPlug>%s</ramHotPlug>", payload.ramHotplug()))
-	      .append(formatIfNotEmpty("<ramHotUnPlug>%s</ramHotUnPlug>", payload.ramHotunplug()))
-	      .append(formatIfNotEmpty("<nicHotPlug>%s</nicHotPlug>", payload.nicHotplug()))
-	      .append(formatIfNotEmpty("<nicHotUnPlug>%s</nicHotUnPlug>", payload.nicHotunplug()))
-	      .append(formatIfNotEmpty("<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.discVirtioHotplug()))
-	      .append(formatIfNotEmpty("<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.discVirtioHotunplug()))
-	      .append("</request>")
-	      .append("</ws:updateSnapshot>");
+              .append("<request>")
+              .append(format("<snapshotId>%s</snapshotId>", payload.snapshotId()))
+              .append(format("<description>%s</description>", payload.description()))
+              .append(format("<snapshotName>%s</snapshotName>", payload.name()))
+              .append(formatIfNotEmpty("<bootable>%s</bootable>", payload.bootable()))
+              .append(formatIfNotEmpty("<osType>%s</osType>", payload.osType()))
+              .append(formatIfNotEmpty("<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug()))
+              .append(formatIfNotEmpty("<cpuHotUnPlug>%s</cpuHotUnPlug>", payload.isCpuHotUnPlug()))
+              .append(formatIfNotEmpty("<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug()))
+              .append(formatIfNotEmpty("<ramHotUnPlug>%s</ramHotUnPlug>", payload.isRamHotUnPlug()))
+              .append(formatIfNotEmpty("<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug()))
+              .append(formatIfNotEmpty("<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug()))
+              .append(formatIfNotEmpty("<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug()))
+              .append("</request>")
+              .append("</ws:updateSnapshot>");
       return requestBuilder.toString();
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/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
new file mode 100644
index 0000000..add3fb9
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapter.java
@@ -0,0 +1,488 @@
+/*
+ * 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.base.Strings.isNullOrEmpty;
+import static com.google.common.collect.Iterables.transform;
+import static com.google.common.util.concurrent.Futures.allAsList;
+import static com.google.common.util.concurrent.Futures.getUnchecked;
+import static java.lang.String.format;
+import static org.jclouds.Constants.PROPERTY_USER_THREADS;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
+
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import javax.annotation.Resource;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.compute.ComputeServiceAdapter;
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.HardwareBuilder;
+import org.jclouds.compute.domain.Processor;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.domain.Volume;
+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.LoginCredentials;
+import org.jclouds.logging.Logger;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Storage;
+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.domain.Snapshot;
+import org.jclouds.profitbricks.domain.internal.Provisionable;
+import org.jclouds.profitbricks.util.Passwords;
+import org.jclouds.rest.ResourceNotFoundException;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.inject.Inject;
+
+@Singleton
+public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<Server, Hardware, Provisionable, DataCenter> {
+
+   @Resource
+   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
+   protected Logger logger = Logger.NULL;
+
+   private final ProfitBricksApi api;
+   private final Predicate<String> waitDcUntilAvailable;
+   private final ListeningExecutorService executorService;
+   private final ProvisioningJob.Factory jobFactory;
+   private final ProvisioningManager provisioningManager;
+
+   private static final Integer DEFAULT_LAN_ID = 1;
+
+   @Inject
+   ProfitBricksComputeServiceAdapter(ProfitBricksApi api,
+           @Named(POLL_PREDICATE_DATACENTER) Predicate<String> waitDcUntilAvailable,
+           @Named(PROPERTY_USER_THREADS) ListeningExecutorService executorService,
+           ProvisioningJob.Factory jobFactory,
+           ProvisioningManager provisioningManager) {
+      this.api = api;
+      this.waitDcUntilAvailable = waitDcUntilAvailable;
+      this.executorService = executorService;
+      this.jobFactory = jobFactory;
+      this.provisioningManager = provisioningManager;
+   }
+
+   @Override
+   public NodeAndInitialCredentials<Server> createNodeWithGroupEncodedIntoName(String group, String name, Template template) {
+      final String dataCenterId = template.getLocation().getId();
+      Hardware hardware = template.getHardware();
+
+      TemplateOptions options = template.getOptions();
+      final String loginUser = isNullOrEmpty(options.getLoginUser()) ? "root" : options.getLoginUser();
+      final String password = options.hasLoginPassword() ? options.getLoginPassword() : Passwords.generate();
+
+      final org.jclouds.compute.domain.Image image = template.getImage();
+
+      // provision all storages based on hardware
+      List<? extends Volume> volumes = hardware.getVolumes();
+      List<String> storageIds = Lists.newArrayListWithExpectedSize(volumes.size());
+
+      int i = 1;
+      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)
+                    .name(format("%s-disk-%d", name, i++))
+                    .size(volume.getSize())
+                    .build();
+
+            String storageId = (String) provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
+
+               @Override
+               public Object get() {
+                  return api.storageApi().createStorage(request);
+               }
+            }));
+
+            storageIds.add(storageId);
+            logger.trace(">> provisioning complete for storage. returned id='%s'", storageId);
+         } catch (Exception ex) {
+            if (i - 1 == 1) // if first storage (one with image) provisioning fails; stop method
+               throw Throwables.propagate(ex);
+            logger.warn(ex, ">> failed to provision storage. skipping..");
+         }
+
+      int lanId = DEFAULT_LAN_ID;
+      if (options.getNetworks() != null)
+         try {
+            String networkId = Iterables.get(options.getNetworks(), 0);
+            lanId = Integer.valueOf(networkId);
+         } catch (Exception ex) {
+            logger.warn("no valid network id found from options. using default id='%d'", DEFAULT_LAN_ID);
+         }
+
+      Double cores = ComputeServiceUtils.getCores(hardware);
+
+      // provision server and connect boot storage (first provisioned)
+      String serverId = null;
+      try {
+         String storageBootDeviceId = Iterables.get(storageIds, 0); // must have atleast 1
+         final Server.Request.CreatePayload serverRequest = Server.Request.creatingBuilder()
+                 .dataCenterId(dataCenterId)
+                 .name(name)
+                 .bootFromStorageId(storageBootDeviceId)
+                 .cores(cores.intValue())
+                 .ram(hardware.getRam())
+                 .availabilityZone(AvailabilityZone.AUTO)
+                 .hasInternetAccess(true)
+                 .lanId(lanId)
+                 .build();
+         logger.trace("<< provisioning server '%s'", serverRequest);
+
+         serverId = (String) provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
+
+            @Override
+            public Object get() {
+               return api.serverApi().createServer(serverRequest);
+            }
+         }));
+         logger.trace(">> provisioning complete for server. returned id='%s'", serverId);
+
+      } catch (Exception ex) {
+         logger.error(ex, ">> failed to provision server. rollbacking..");
+         destroyStorages(storageIds, dataCenterId);
+         throw Throwables.propagate(ex);
+      }
+
+      // connect the rest of storages to server; delete if fails
+      final int storageCount = storageIds.size();
+      for (int j = 1; j < storageCount; j++) { // skip first; already connected
+         String storageId = storageIds.get(j);
+         try {
+            logger.trace("<< connecting storage '%s' to server '%s'", storageId, serverId);
+            final Storage.Request.ConnectPayload request = Storage.Request.connectingBuilder()
+                    .storageId(storageId)
+                    .serverId(serverId)
+                    .build();
+
+            provisioningManager.provision(jobFactory.create(group, new Supplier<Object>() {
+
+               @Override
+               public Object get() {
+                  return api.storageApi().connectStorageToServer(request);
+               }
+            }));
+
+            logger.trace(">> storage connected.");
+         } catch (Exception ex) {
+            // delete unconnected storage
+            logger.warn(ex, ">> failed to connect storage '%s'. deleting..", storageId);
+            destroyStorage(storageId, dataCenterId);
+         }
+      }
+
+      // Last paranoid check
+      waitDcUntilAvailable.apply(dataCenterId);
+
+      LoginCredentials serverCredentials = LoginCredentials.builder()
+              .user(loginUser)
+              .password(password)
+              .build();
+
+      Server server = getNode(serverId);
+
+      return new NodeAndInitialCredentials<Server>(server, serverId, serverCredentials);
+   }
+
+   @Override
+   public Iterable<Hardware> listHardwareProfiles() {
+      // Max [cores=48] [disk size per storage=2048GB] [ram=200704 MB]
+      List<Hardware> hardwares = Lists.newArrayList();
+      for (int core = 1; core <= 48; core++)
+         for (int ram : new int[]{1024, 2 * 1024, 4 * 1024, 8 * 1024,
+            10 * 1024, 16 * 1024, 24 * 1024, 28 * 1024, 32 * 1024})
+            for (float size : new float[]{10, 20, 30, 50, 80, 100, 150, 200, 250, 500}) {
+               String id = String.format("cpu=%d,ram=%s,disk=%f", core, ram, size);
+               hardwares.add(new HardwareBuilder()
+                       .ids(id)
+                       .ram(ram)
+                       .hypervisor("kvm")
+                       .name(id)
+                       .processor(new Processor(core, 1d))
+                       .volume(new VolumeImpl(size, true, true))
+                       .build());
+            }
+      return hardwares;
+   }
+
+   @Override
+   public Iterable<Provisionable> listImages() {
+      // fetch images..
+      ListenableFuture<List<Image>> images = executorService.submit(new Callable<List<Image>>() {
+
+         @Override
+         public List<Image> call() throws Exception {
+            logger.trace("<< fetching images..");
+            // Filter HDD types only, since JClouds doesn't have a concept of "CD-ROM" anyway
+            Iterable<Image> filteredImages = Iterables.filter(api.imageApi().getAllImages(), new Predicate<Image>() {
+
+               @Override
+               public boolean apply(Image image) {
+                  return image.type() == Image.Type.HDD;
+               }
+            });
+            logger.trace(">> images fetched.");
+
+            return ImmutableList.copyOf(filteredImages);
+         }
+
+      });
+      // and snapshots at the same time
+      ListenableFuture<List<Snapshot>> snapshots = executorService.submit(new Callable<List<Snapshot>>() {
+
+         @Override
+         public List<Snapshot> call() throws Exception {
+            logger.trace("<< fetching snapshots");
+            List<Snapshot> remoteSnapshots = api.snapshotApi().getAllSnapshots();
+            logger.trace(">> snapshots feched.");
+
+            return remoteSnapshots;
+         }
+
+      });
+
+      return Iterables.concat(getUnchecked(images), getUnchecked(snapshots));
+   }
+
+   @Override
+   public Provisionable getImage(String id) {
+      // try search images
+      logger.trace("<< searching for image with id=%s", id);
+      Image image = api.imageApi().getImage(id);
+      if (image != null) {
+         logger.trace(">> found image [%s].", image.name());
+         return image;
+      }
+      // try search snapshots
+      logger.trace("<< not found from images. searching for snapshot with id=%s", id);
+      Snapshot snapshot = api.snapshotApi().getSnapshot(id);
+      if (snapshot != null) {
+         logger.trace(">> found snapshot [%s]", snapshot.name());
+         return snapshot;
+      }
+      throw new ResourceNotFoundException("No image/snapshot with id '" + id + "' was found");
+   }
+
+   @Override
+   public Iterable<DataCenter> listLocations() {
+      logger.trace("<< fetching datacenters..");
+      final DataCenterApi dcApi = api.dataCenterApi();
+
+      // Fetch all datacenters
+      ListenableFuture<List<DataCenter>> futures = allAsList(transform(dcApi.getAllDataCenters(),
+              new Function<DataCenter, ListenableFuture<DataCenter>>() {
+
+                 @Override
+                 public ListenableFuture<DataCenter> apply(final DataCenter input) {
+                    // Fetch more details in parallel
+                    return executorService.submit(new Callable<DataCenter>() {
+                       @Override
+                       public DataCenter call() throws Exception {
+                          logger.trace("<< fetching datacenter with id [%s]", input.id());
+                          return dcApi.getDataCenter(input.id());
+                       }
+
+                    });
+                 }
+              }));
+
+      return getUnchecked(futures);
+   }
+
+   @Override
+   public Server getNode(String id) {
+      logger.trace("<< searching for server with id=%s", id);
+
+      Server server = api.serverApi().getServer(id);
+      if (server != null)
+         logger.trace(">> found server [%s]", server.name());
+      return server;
+   }
+
+   @Override
+   public void destroyNode(String nodeId) {
+      ServerApi serverApi = api.serverApi();
+      Server server = serverApi.getServer(nodeId);
+      if (server != null) {
+         String dataCenterId = server.dataCenter().id();
+         for (Storage storage : server.storages())
+            destroyStorage(storage.id(), dataCenterId);
+
+         try {
+            destroyServer(nodeId, dataCenterId);
+         } catch (Exception ex) {
+            logger.warn(ex, ">> failed to delete server with id=%s", nodeId);
+         }
+      }
+   }
+
+   @Override
+   public void rebootNode(final String id) {
+      // Fail pre-emptively if not found
+      final Server node = getRequiredNode(id);
+      final DataCenter dataCenter = node.dataCenter();
+      provisioningManager.provision(jobFactory.create(dataCenter.id(), new Supplier<Object>() {
+
+         @Override
+         public Object get() {
+            api.serverApi().resetServer(id);
+
+            return node;
+         }
+      }));
+   }
+
+   @Override
+   public void resumeNode(final String id) {
+      final Server node = getRequiredNode(id);
+      if (node.status() == Server.Status.RUNNING)
+         return;
+
+      final DataCenter dataCenter = node.dataCenter();
+      provisioningManager.provision(jobFactory.create(dataCenter.id(), new Supplier<Object>() {
+
+         @Override
+         public Object get() {
+            api.serverApi().startServer(id);
+
+            return node;
+         }
+      }));
+   }
+
+   @Override
+   public void suspendNode(final String id) {
+      final Server node = getRequiredNode(id);
+      // Intentionally didn't include SHUTDOWN (only achieved via UI; soft-shutdown). 
+      // A SHUTOFF server is no longer billed, so we execute method for all other status
+      if (node.status() == Server.Status.SHUTOFF)
+         return;
+
+      final DataCenter dataCenter = node.dataCenter();
+      provisioningManager.provision(jobFactory.create(dataCenter.id(), new Supplier<Object>() {
+
+         @Override
+         public Object get() {
+            api.serverApi().stopServer(id);
+
+            return node;
+         }
+      }));
+   }
+
+   @Override
+   public Iterable<Server> listNodes() {
+      logger.trace(">> fetching all servers..");
+      List<Server> servers = api.serverApi().getAllServers();
+      logger.trace(">> servers fetched.");
+      return servers;
+   }
+
+   @Override
+   public Iterable<Server> listNodesByIds(final Iterable<String> ids) {
+      // Only fetch the requested nodes. Do it in parallel.
+      ListenableFuture<List<Server>> futures = allAsList(transform(ids,
+              new Function<String, ListenableFuture<Server>>() {
+
+                 @Override
+                 public ListenableFuture<Server> apply(final String input) {
+                    return executorService.submit(new Callable<Server>() {
+
+                       @Override
+                       public Server call() throws Exception {
+                          return getNode(input);
+                       }
+                    });
+                 }
+              }));
+
+      return getUnchecked(futures);
+   }
+
+   private void destroyServer(final String serverId, final String dataCenterId) {
+      try {
+         logger.trace("<< deleting server with id=%s", serverId);
+         provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
+
+            @Override
+            public Object get() {
+               api.serverApi().deleteServer(serverId);
+
+               return serverId;
+            }
+         }));
+         logger.trace(">> server '%s' deleted.", serverId);
+      } catch (Exception ex) {
+         logger.warn(ex, ">> failed to delete server with id=%s", serverId);
+      }
+   }
+
+   private void destroyStorages(List<String> storageIds, String dataCenterId) {
+      for (String storageId : storageIds)
+         destroyStorage(storageId, dataCenterId);
+   }
+
+   private void destroyStorage(final String storageId, final String dataCenterId) {
+      try {
+         logger.trace("<< deleting storage with id=%s", storageId);
+         provisioningManager.provision(jobFactory.create(dataCenterId, new Supplier<Object>() {
+
+            @Override
+            public Object get() {
+               api.storageApi().deleteStorage(storageId);
+
+               return storageId;
+            }
+         }));
+         logger.trace(">> storage '%s' deleted.", storageId);
+      } catch (Exception ex) {
+         logger.warn(ex, ">> failed to delete storage with id=%s", storageId);
+      }
+   }
+
+   private Server getRequiredNode(String nodeId) {
+      Server node = getNode(nodeId);
+      if (node == null)
+         throw new ResourceNotFoundException("Node with id'" + nodeId + "' was not found.");
+      return node;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningJob.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningJob.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningJob.java
new file mode 100644
index 0000000..7da7d3c
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningJob.java
@@ -0,0 +1,62 @@
+/*
+ * 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.concurrent;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
+
+import java.util.concurrent.Callable;
+
+import javax.inject.Named;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
+
+public class ProvisioningJob implements Callable {
+
+   public interface Factory {
+
+      ProvisioningJob create(String group, Supplier<Object> operation);
+   }
+
+   private final Predicate<String> waitDataCenterUntilReady;
+   private final String group;
+   private final Supplier<Object> operation;
+
+   @Inject
+   ProvisioningJob(@Named(POLL_PREDICATE_DATACENTER) Predicate<String> waitDataCenterUntilReady,
+           @Assisted String group, @Assisted Supplier<Object> operation) {
+      this.waitDataCenterUntilReady = waitDataCenterUntilReady;
+      this.group = checkNotNull(group, "group cannot be null");
+      this.operation = checkNotNull(operation, "operation cannot be null");
+   }
+
+   @Override
+   public Object call() throws Exception {
+      waitDataCenterUntilReady.apply(group);
+      Object obj = operation.get();
+      waitDataCenterUntilReady.apply(group);
+
+      return obj;
+   }
+
+   public String getGroup() {
+      return group;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManager.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManager.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManager.java
new file mode 100644
index 0000000..820cafe
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManager.java
@@ -0,0 +1,88 @@
+/*
+ * 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.concurrent;
+
+import static com.google.common.util.concurrent.Futures.getUnchecked;
+import static com.google.common.util.concurrent.MoreExecutors.listeningDecorator;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.annotation.Resource;
+
+import org.jclouds.concurrent.config.WithSubmissionTrace;
+import org.jclouds.logging.Logger;
+
+import com.google.common.util.concurrent.ListeningExecutorService;
+
+/**
+ * Delegates {@link Job} to single-threaded executor services based on it's group.
+ *
+ */
+public final class ProvisioningManager implements Closeable {
+
+   @Resource
+   private Logger logger = Logger.NULL;
+
+   private final Map<String, ListeningExecutorService> workers
+           = new ConcurrentHashMap<String, ListeningExecutorService>(1);
+
+   private final AtomicBoolean terminated = new AtomicBoolean(false);
+
+   public Object provision(ProvisioningJob job) {
+      if (terminated.get()) {
+         logger.warn("Job(%s) submitted but the provisioning manager is already closed", job);
+         return null;
+      }
+
+      logger.debug("Job(%s) submitted to group '%s'", job, job.getGroup());
+      ListeningExecutorService workerGroup = getWorkerGroup(job.getGroup());
+      return getUnchecked(workerGroup.submit(job));
+   }
+
+   protected ListeningExecutorService newExecutorService() {
+      return WithSubmissionTrace.wrap(listeningDecorator(Executors.newSingleThreadExecutor()));
+   }
+
+   private void newWorkerGroupIfAbsent(String name) {
+      if (!workers.containsKey(name))
+         workers.put(name, newExecutorService());
+   }
+
+   private ListeningExecutorService getWorkerGroup(String name) {
+      newWorkerGroupIfAbsent(name);
+      return workers.get(name);
+   }
+
+   @Override
+   public void close() throws IOException {
+      terminated.set(true); // Do not allow to enqueue more jobs
+      Collection<ListeningExecutorService> executors = workers.values();
+      for (ListeningExecutorService executor : executors) {
+         List<Runnable> runnables = executor.shutdownNow();
+         if (!runnables.isEmpty())
+            logger.warn("when shutting down executor %s, runnables outstanding: %s", executor, runnables);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/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
new file mode 100644
index 0000000..d260caf
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/config/ProfitBricksComputeServiceContextModule.java
@@ -0,0 +1,147 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.compute.config;
+
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PERIOD;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_MAX_PERIOD;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_TIMEOUT;
+
+import java.util.concurrent.TimeUnit;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.compute.ComputeServiceAdapter;
+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.Volume;
+import org.jclouds.domain.Location;
+import org.jclouds.functions.IdentityFunction;
+import org.jclouds.lifecycle.Closer;
+import org.jclouds.location.suppliers.ImplicitLocationSupplier;
+import org.jclouds.location.suppliers.implicit.OnlyLocationOrFirstZone;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.compute.ProfitBricksComputeServiceAdapter;
+import org.jclouds.profitbricks.compute.concurrent.ProvisioningJob;
+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.function.DataCenterToLocation;
+import org.jclouds.profitbricks.compute.function.LocationToLocation;
+import org.jclouds.profitbricks.compute.function.ProvisionableToImage;
+import org.jclouds.profitbricks.compute.function.ServerToNodeMetadata;
+import org.jclouds.profitbricks.compute.function.StorageToVolume;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.internal.Provisionable;
+import org.jclouds.util.Predicates2;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.inject.Inject;
+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> {
+
+   @Override
+   protected void configure() {
+      super.configure();
+
+      install(new LocationsFromComputeServiceAdapterModule<Server, Hardware, Provisionable, DataCenter>() {
+      });
+
+      install(new FactoryModuleBuilder().build(ProvisioningJob.Factory.class));
+
+      bind(ImplicitLocationSupplier.class).to(OnlyLocationOrFirstZone.class).in(Singleton.class);
+
+      bind(new TypeLiteral<ComputeServiceAdapter<Server, Hardware, Provisionable, DataCenter>>() {
+      }).to(ProfitBricksComputeServiceAdapter.class);
+
+      bind(new TypeLiteral<Function<org.jclouds.profitbricks.domain.Location, Location>>() {
+      }).to(LocationToLocation.class);
+
+      bind(new TypeLiteral<Function<DataCenter, Location>>() {
+      }).to(DataCenterToLocation.class);
+
+      bind(new TypeLiteral<Function<Server, NodeMetadata>>() {
+      }).to(ServerToNodeMetadata.class);
+
+      bind(new TypeLiteral<Function<Provisionable, Image>>() {
+      }).to(ProvisionableToImage.class);
+
+      bind(new TypeLiteral<Function<Storage, Volume>>() {
+      }).to(StorageToVolume.class);
+
+      bind(new TypeLiteral<Function<Hardware, Hardware>>() {
+      }).to(Class.class.cast(IdentityFunction.class));
+   }
+
+   @Provides
+   @Singleton
+   @Named(POLL_PREDICATE_DATACENTER)
+   Predicate<String> provideWaitDataCenterUntilAvailablePredicate(
+           final ProfitBricksApi api, ComputeConstants constants) {
+      return Predicates2.retry(new ProvisioningStatusPollingPredicate(
+              api, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE),
+              constants.pollTimeout(), constants.pollPeriod(), constants.pollMaxPeriod(), TimeUnit.SECONDS);
+   }
+
+   @Provides
+   @Singleton
+   ProvisioningManager provideProvisioningManager(Closer closer) {
+      ProvisioningManager provisioningManager = new ProvisioningManager();
+      closer.addToClose(provisioningManager);
+
+      return provisioningManager;
+   }
+
+   @Singleton
+   public static class ComputeConstants {
+
+      @Inject
+      @Named(POLL_TIMEOUT)
+      private String pollTimeout;
+
+      @Inject
+      @Named(POLL_PERIOD)
+      private String pollPeriod;
+
+      @Inject
+      @Named(POLL_MAX_PERIOD)
+      private String pollMaxPeriod;
+
+      public long pollTimeout() {
+         return Long.parseLong(pollTimeout);
+      }
+
+      public long pollPeriod() {
+         return Long.parseLong(pollPeriod);
+      }
+
+      public long pollMaxPeriod() {
+         return Long.parseLong(pollMaxPeriod);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/DataCenterToLocation.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/DataCenterToLocation.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/DataCenterToLocation.java
new file mode 100644
index 0000000..93fb3a0
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/DataCenterToLocation.java
@@ -0,0 +1,54 @@
+/*
+ * 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.function;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.profitbricks.domain.DataCenter;
+
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableMap;
+import com.google.inject.Inject;
+
+public class DataCenterToLocation implements Function<DataCenter, Location> {
+
+   private final Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion;
+
+   @Inject
+   DataCenterToLocation(Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion) {
+      this.fnRegion = fnRegion;
+   }
+
+   @Override
+   public Location apply(DataCenter dataCenter) {
+      checkNotNull(dataCenter, "Null dataCenter");
+
+      LocationBuilder builder = new LocationBuilder()
+              .id(dataCenter.id())
+              .description(dataCenter.name())
+              .scope(LocationScope.ZONE)
+              .metadata(ImmutableMap.<String, Object>of(
+                              "version", dataCenter.version(),
+                              "state", dataCenter.state()));
+      if (dataCenter.location() != null)
+         builder.parent(fnRegion.apply(dataCenter.location()));
+      return builder.build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/LocationToLocation.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/LocationToLocation.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/LocationToLocation.java
new file mode 100644
index 0000000..999069b
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/LocationToLocation.java
@@ -0,0 +1,47 @@
+/*
+ * 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.function;
+
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.location.suppliers.all.JustProvider;
+import org.jclouds.profitbricks.domain.Location;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+import com.google.inject.Inject;
+
+public class LocationToLocation implements Function<Location, org.jclouds.domain.Location> {
+
+   private final JustProvider justProvider;
+
+   @Inject
+   LocationToLocation(JustProvider justProvider) {
+      this.justProvider = justProvider;
+   }
+
+   @Override
+   public org.jclouds.domain.Location apply(Location in) {
+      return new LocationBuilder()
+              .id(in.getId())
+              .description(in.getDescription())
+              .scope(LocationScope.REGION)
+              .parent(Iterables.getOnlyElement(justProvider.get()))
+              .build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/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
new file mode 100644
index 0000000..c5fcd78
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ProvisionableToImage.java
@@ -0,0 +1,215 @@
+/*
+ * 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.function;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.regex.Pattern;
+
+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.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.jclouds.profitbricks.domain.internal.Provisionable;
+
+import com.google.common.base.Function;
+import com.google.common.base.Strings;
+import com.google.inject.Inject;
+
+public class ProvisionableToImage implements Function<Provisionable, Image> {
+
+   private final ImageToImage fnImageToImage;
+   private final SnapshotToImage fnSnapshotToImage;
+
+   @Inject
+   ProvisionableToImage(Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion) {
+      this.fnImageToImage = new ImageToImage(fnRegion);
+      this.fnSnapshotToImage = new SnapshotToImage(fnRegion);
+   }
+
+   @Override
+   public Image apply(Provisionable input) {
+      checkNotNull(input, "Cannot convert null input");
+
+      if (input instanceof org.jclouds.profitbricks.domain.Image)
+         return fnImageToImage.apply((org.jclouds.profitbricks.domain.Image) input);
+
+      else if (input instanceof Snapshot)
+         return fnSnapshotToImage.apply((Snapshot) input);
+
+      else
+         throw new UnsupportedOperationException("No implementation found for provisionable of concrete type '"
+                 + input.getClass().getCanonicalName() + "'");
+   }
+
+   private static OsFamily mapOsFamily(OsType osType) {
+      if (osType == null)
+         return OsFamily.UNRECOGNIZED;
+      switch (osType) {
+         case WINDOWS:
+            return OsFamily.WINDOWS;
+         case LINUX:
+            return OsFamily.LINUX;
+         case UNRECOGNIZED:
+         case OTHER:
+         default:
+            return OsFamily.UNRECOGNIZED;
+      }
+   }
+
+   private static class ImageToImage implements Function<org.jclouds.profitbricks.domain.Image, Image> {
+
+      private static final Pattern HAS_NUMBERS = Pattern.compile(".*\\d+.*");
+
+      private final Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion;
+
+      ImageToImage(Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion) {
+         this.fnRegion = fnRegion;
+      }
+
+      @Override
+      public Image apply(org.jclouds.profitbricks.domain.Image from) {
+         String desc = from.name();
+         OsFamily osFamily = parseOsFamily(desc, from.osType());
+
+         OperatingSystem os = OperatingSystem.builder()
+                 .description(osFamily.value())
+                 .family(osFamily)
+                 .version(parseVersion(desc))
+                 .is64Bit(is64Bit(desc, from.type()))
+                 .build();
+
+         return new ImageBuilder()
+                 .ids(from.id())
+                 .name(desc)
+                 .location(fnRegion.apply(from.location()))
+                 .status(Image.Status.AVAILABLE)
+                 .operatingSystem(os)
+                 .build();
+      }
+
+      private OsFamily parseOsFamily(String from, OsType fallbackValue) {
+         if (from != null)
+            try {
+               // ProfitBricks images names are usually in format:
+               // [osType]-[version]-[subversion]-..-[date-created]
+               String desc = from.toUpperCase().split("-")[0];
+               OsFamily osFamily = OsFamily.fromValue(desc);
+               checkArgument(osFamily != OsFamily.UNRECOGNIZED);
+
+               return osFamily;
+            } catch (Exception ex) {
+               // do nothing
+            }
+         return mapOsFamily(fallbackValue);
+      }
+
+      private String parseVersion(String from) {
+         if (from != null) {
+            String[] split = from.toLowerCase().split("-");
+            if (split.length >= 2) {
+               int i = 1; // usually on second token
+               String version = split[i];
+               while (!HAS_NUMBERS.matcher(version).matches())
+                  version = split[++i];
+               return version;
+            }
+         }
+         return "";
+      }
+
+      private boolean is64Bit(String from, org.jclouds.profitbricks.domain.Image.Type type) {
+         switch (type) {
+            case CDROM:
+               if (!Strings.isNullOrEmpty(from))
+                  return from.matches("x86_64|amd64");
+            case HDD: // HDD provided by ProfitBricks are always 64-bit
+            default:
+               return true;
+         }
+      }
+   }
+
+   private static class SnapshotToImage implements Function<Snapshot, Image> {
+
+      private final Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion;
+
+      SnapshotToImage(Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion) {
+         this.fnRegion = fnRegion;
+      }
+
+      @Override
+      public Image apply(Snapshot from) {
+         String textToParse = from.name() + from.description();
+         OsFamily osFamily = parseOsFamily(textToParse, from.osType());
+
+         OperatingSystem os = OperatingSystem.builder()
+                 .description(osFamily.value())
+                 .family(osFamily)
+                 .is64Bit(true)
+                 .version("00.00")
+                 .build();
+
+         return new ImageBuilder()
+                 .ids(from.id())
+                 .name(from.name())
+                 .description(from.description())
+                 .location(fnRegion.apply(from.location()))
+                 .status(mapStatus(from.state()))
+                 .operatingSystem(os)
+                 .build();
+      }
+
+      private OsFamily parseOsFamily(String text, OsType fallbackValue) {
+         if (text != null)
+            try {
+               // Attempt parsing OsFamily by scanning name and description
+               // @see ProfitBricksComputeServiceAdapter#L190
+               OsFamily[] families = OsFamily.values();
+               for (OsFamily family : families)
+                  if (text.contains(family.value()))
+                     return family;
+            } catch (Exception ex) {
+               // do nothing
+            }
+         return mapOsFamily(fallbackValue);
+      }
+
+      static Image.Status mapStatus(ProvisioningState state) {
+         if (state == null)
+            return Image.Status.UNRECOGNIZED;
+         switch (state) {
+            case AVAILABLE:
+               return Image.Status.AVAILABLE;
+            case DELETED:
+               return Image.Status.DELETED;
+            case ERROR:
+               return Image.Status.ERROR;
+            case INACTIVE:
+            case INPROCESS:
+               return Image.Status.PENDING;
+            default:
+               return Image.Status.UNRECOGNIZED;
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
new file mode 100644
index 0000000..9a8d551
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
@@ -0,0 +1,180 @@
+/*
+ * 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.function;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Predicates.not;
+import static org.jclouds.profitbricks.domain.OsType.LINUX;
+import static org.jclouds.profitbricks.domain.OsType.WINDOWS;
+import static org.jclouds.profitbricks.domain.Server.Status.BLOCKED;
+import static org.jclouds.profitbricks.domain.Server.Status.CRASHED;
+import static org.jclouds.profitbricks.domain.Server.Status.PAUSED;
+import static org.jclouds.profitbricks.domain.Server.Status.RUNNING;
+import static org.jclouds.profitbricks.domain.Server.Status.SHUTDOWN;
+import static org.jclouds.profitbricks.domain.Server.Status.SHUTOFF;
+
+import java.util.List;
+import java.util.Set;
+
+import org.jclouds.compute.domain.Hardware;
+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.domain.Location;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.util.InetAddresses2.IsPrivateIPAddress;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+
+import org.jclouds.collect.Memoized;
+import org.jclouds.compute.functions.GroupNamingConvention;
+
+public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
+
+   private final Function<Storage, Volume> fnVolume;
+   private final Supplier<Set<? extends Location>> locationSupply;
+   private final Function<List<Nic>, List<String>> fnCollectIps;
+
+   private final GroupNamingConvention groupNamingConvention;
+
+   @Inject
+   ServerToNodeMetadata(Function<Storage, Volume> fnVolume,
+           @Memoized Supplier<Set<? extends Location>> locationsSupply,
+           GroupNamingConvention.Factory groupNamingConvention) {
+      this.fnVolume = fnVolume;
+      this.locationSupply = locationsSupply;
+      this.groupNamingConvention = groupNamingConvention.createWithoutPrefix();
+      this.fnCollectIps = new Function<List<Nic>, List<String>>() {
+
+         @Override
+         public List<String> apply(List<Nic> in) {
+            List<String> ips = Lists.newArrayListWithExpectedSize(in.size());
+            for (Nic nic : in)
+               ips.addAll(nic.ips());
+            return ips;
+         }
+      };
+   }
+
+   @Override
+   public NodeMetadata apply(final Server server) {
+      checkNotNull(server, "Null server");
+
+      // Map fetched dataCenterId with actual populated object
+      Location location = null;
+      if (server.dataCenter() != null)
+         location = Iterables.find(locationSupply.get(), new Predicate<Location>() {
+
+            @Override
+            public boolean apply(Location t) {
+               return t.getId().equals(server.dataCenter().id());
+            }
+         });
+
+      float size = 0f;
+      List<Volume> volumes = Lists.newArrayList();
+      List<Storage> storages = server.storages();
+      if (storages != null)
+         for (Storage storage : storages) {
+            size += storage.size();
+            volumes.add(fnVolume.apply(storage));
+         }
+
+      // Build hardware
+      String id = String.format("cpu=%d,ram=%d,disk=%.0f", server.cores(), server.ram(), size);
+      Hardware hardware = new HardwareBuilder()
+              .ids(id)
+              .name(id)
+              .ram(server.ram())
+              .processor(new Processor(server.cores(), 1d))
+              .hypervisor("kvm")
+              .volumes(volumes)
+              .location(location)
+              .build();
+
+      // Collect ips
+      List<String> addresses = fnCollectIps.apply(server.nics());
+
+      // Build node
+      NodeMetadataBuilder nodeBuilder = new NodeMetadataBuilder();
+      nodeBuilder.ids(server.id())
+              .group(groupNamingConvention.extractGroup(server.name()))
+              .hostname(server.hostname())
+              .name(server.name())
+              .backendStatus(server.state().toString())
+              .status(mapStatus(server.status()))
+              .hardware(hardware)
+              .operatingSystem(mapOsType(server.osType()))
+              .location(location)
+              .privateAddresses(Iterables.filter(addresses, IsPrivateIPAddress.INSTANCE))
+              .publicAddresses(Iterables.filter(addresses, not(IsPrivateIPAddress.INSTANCE)));
+
+      return nodeBuilder.build();
+   }
+
+   static NodeMetadata.Status mapStatus(Server.Status status) {
+      if (status == null)
+         return NodeMetadata.Status.UNRECOGNIZED;
+      switch (status) {
+         case SHUTDOWN:
+         case SHUTOFF:
+         case PAUSED:
+            return NodeMetadata.Status.SUSPENDED;
+         case RUNNING:
+            return NodeMetadata.Status.RUNNING;
+         case BLOCKED:
+            return NodeMetadata.Status.PENDING;
+         case CRASHED:
+            return NodeMetadata.Status.ERROR;
+         default:
+            return NodeMetadata.Status.UNRECOGNIZED;
+      }
+   }
+
+   static OperatingSystem mapOsType(OsType osType) {
+      if (osType != null)
+         switch (osType) {
+            case WINDOWS:
+               return OperatingSystem.builder()
+                       .description(OsFamily.WINDOWS.value())
+                       .family(OsFamily.WINDOWS)
+                       .build();
+            case LINUX:
+               return OperatingSystem.builder()
+                       .description(OsFamily.LINUX.value())
+                       .family(OsFamily.LINUX)
+                       .build();
+         }
+      return OperatingSystem.builder()
+              .description(OsFamily.UNRECOGNIZED.value())
+              .family(OsFamily.UNRECOGNIZED)
+              .build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/StorageToVolume.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/StorageToVolume.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/StorageToVolume.java
new file mode 100644
index 0000000..5557bca
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/StorageToVolume.java
@@ -0,0 +1,47 @@
+/*
+ * 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.function;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.compute.domain.Volume;
+import org.jclouds.compute.domain.VolumeBuilder;
+import org.jclouds.profitbricks.domain.Storage;
+
+import com.google.common.base.Function;
+
+public class StorageToVolume implements Function<Storage, Volume> {
+
+   @Override
+   public Volume apply(Storage storage) {
+      checkNotNull(storage, "Null storage");
+
+      String device = "";
+      if (storage.deviceNumber() != null)
+         device = storage.deviceNumber().toString();
+
+      return new VolumeBuilder()
+              .id(storage.id())
+              .size(storage.size())
+              .bootDevice(storage.bootDevice())
+              .device(device)
+              .durable(true)
+              .type(Volume.Type.LOCAL)
+              .build();
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
index f38abad..41c3e93 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
@@ -22,6 +22,7 @@ import org.jclouds.profitbricks.ProfitBricksApi;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 
 import com.google.common.base.Predicate;
+import org.jclouds.rest.ResourceNotFoundException;
 
 /**
  * A custom predicate for waiting until a virtual resource satisfies the given expected status
@@ -45,19 +46,24 @@ public class ProvisioningStatusPollingPredicate implements Predicate<String> {
    @Override
    public boolean apply(String input) {
       checkNotNull(input, "Virtual item id can't be null.");
-      switch (domain) {
-         case DATACENTER:
-            return expect == api.dataCenterApi().getDataCenterState(input);
-         case SERVER:
-            return expect == api.serverApi().getServer(input).state();
-         case STORAGE:
-            return expect == api.storageApi().getStorage(input).state();
-         case NIC:
-            return expect == api.nicApi().getNic(input).state();
-         case SNAPSHOT:
-            return expect == api.snapshotApi().getSnapshot(input).state();
-         default:
-            throw new IllegalArgumentException("Unknown domain '" + domain + "'");
+      try {
+         switch (domain) {
+            case DATACENTER:
+               return expect == api.dataCenterApi().getDataCenterState(input);
+            case SERVER:
+               return expect == api.serverApi().getServer(input).state();
+            case STORAGE:
+               return expect == api.storageApi().getStorage(input).state();
+            case NIC:
+               return expect == api.nicApi().getNic(input).state();
+            case SNAPSHOT:
+               return expect == api.snapshotApi().getSnapshot(input).state();
+            default:
+               throw new IllegalArgumentException("Unknown domain '" + domain + "'");
+         }
+      } catch (ResourceNotFoundException ex) {
+         // After provisioning, a node might still not be "fetchable" via API
+         return false;
       }
    }
 


[12/35] jclouds git commit: JCLOUDS-702: JCloud ProfitBricks provider - NIC & Firewall API

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallResponseHandler.java
new file mode 100644
index 0000000..dae5191
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallResponseHandler.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.firewall;
+
+import com.google.inject.Inject;
+
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.http.parser.firewall.rule.FirewallRuleListResponseHandler;
+import org.xml.sax.SAXException;
+
+public class FirewallResponseHandler extends BaseFirewallResponseHandler<Firewall> {
+
+   private boolean done = false;
+
+   @Inject
+   FirewallResponseHandler(FirewallRuleListResponseHandler firewallRuleListResponseHandler) {
+      super(firewallRuleListResponseHandler);
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
+         return;
+
+      if (useFirewallRuleParser)
+         firewallRuleListResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName)) {
+            done = true;
+            builder.rules(firewallRuleListResponseHandler.getResult());
+         }
+         clearTextBuffer();
+      }
+
+      if ("firewallRules".equals(qName))
+         useFirewallRuleParser = false;
+   }
+
+   @Override
+   public void reset() {
+      this.builder = Firewall.builder();
+   }
+
+   @Override
+   public Firewall getResult() {
+      return builder.build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/rule/BaseFirewallRuleResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/rule/BaseFirewallRuleResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/rule/BaseFirewallRuleResponseHandler.java
new file mode 100644
index 0000000..9461f46
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/rule/BaseFirewallRuleResponseHandler.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.firewall.rule;
+
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.Firewall.Protocol;
+
+import com.google.inject.Inject;
+
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+
+public abstract class BaseFirewallRuleResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected Firewall.Rule.Builder builder;
+
+   @Inject
+   BaseFirewallRuleResponseHandler() {
+      this.builder = Firewall.Rule.builder();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("firewallRuleId".equals(qName))
+         builder.id(textToStringValue());
+      else if ("name".equals(qName))
+         builder.name(textToStringValue());
+      else if ("portRangeEnd".equals(qName))
+         builder.portRangeEnd(textToIntValue());
+      else if ("portRangeStart".equals(qName))
+         builder.portRangeStart(textToIntValue());
+      else if ("protocol".equals(qName))
+         builder.protocol(Protocol.fromValue(textToStringValue()));
+      else if ("sourceIp".equals(qName))
+         builder.sourceIp(textToStringValue());
+      else if ("sourceMac".equals(qName))
+         builder.sourceMac(textToStringValue());
+      else if ("targetIp".equals(qName))
+         builder.targetIp(textToStringValue());
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/rule/FirewallRuleListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/rule/FirewallRuleListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/rule/FirewallRuleListResponseHandler.java
new file mode 100644
index 0000000..3085839
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/rule/FirewallRuleListResponseHandler.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.firewall.rule;
+
+import java.util.List;
+
+import org.jclouds.profitbricks.domain.Firewall.Rule;
+import org.xml.sax.SAXException;
+
+import com.google.common.collect.Lists;
+
+public class FirewallRuleListResponseHandler extends BaseFirewallRuleResponseHandler<List<Rule>> {
+
+   private List<Rule> rules;
+
+   FirewallRuleListResponseHandler() {
+      this.rules = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+
+      if ("firewallRules".equals(qName))
+         rules.add(builder.build());
+      clearTextBuffer();
+
+   }
+
+   @Override
+   public void reset() {
+      this.rules = Lists.newArrayList();
+   }
+
+   @Override
+   public List<Rule> getResult() {
+      return rules;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/BaseNicResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/BaseNicResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/BaseNicResponseHandler.java
new file mode 100644
index 0000000..83efca3
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/BaseNicResponseHandler.java
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.nic;
+
+import com.google.inject.Inject;
+
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.jclouds.profitbricks.http.parser.firewall.FirewallResponseHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public abstract class BaseNicResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected final FirewallResponseHandler firewallResponseHandler;
+
+   protected boolean useFirewallParser = false;
+   protected Nic.Builder builder;
+
+   @Inject
+   BaseNicResponseHandler(FirewallResponseHandler firewallResponseHandler) {
+      this.builder = Nic.builder();
+      this.firewallResponseHandler = firewallResponseHandler;
+   }
+
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+      if ("firewall".equals(qName))
+         useFirewallParser = true;
+      if (useFirewallParser)
+         firewallResponseHandler.startElement(uri, localName, qName, attributes);
+   }
+
+   @Override
+   public void characters(char[] ch, int start, int length) {
+      if (useFirewallParser)
+         firewallResponseHandler.characters(ch, start, length);
+      else
+         super.characters(ch, start, length);
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("dataCenterId".equals(qName))
+         builder.dataCenterId(textToStringValue());
+      else if ("nicName".equals(qName))
+         builder.name(textToStringValue());
+      else if ("nicId".equals(qName))
+         builder.id(textToStringValue());
+      else if ("lanId".equals(qName))
+         builder.lanId(textToIntValue());
+      else if ("internetAccess".equals(qName))
+         builder.internetAccess(textToBooleanValue());
+      else if ("serverId".equals(qName))
+         builder.serverId(textToStringValue());
+      else if ("ips".equals(qName))
+         builder.ip(textToStringValue());
+      else if ("macAddress".equals(qName))
+         builder.macAddress(textToStringValue());
+      else if ("dhcpActive".equals(qName))
+         builder.dhcpActive(textToBooleanValue());
+      else if ("gatewayIp".equals(qName))
+         builder.gatewayIp(textToStringValue());
+      else if ("provisioningState".equals(qName))
+         builder.state(ProvisioningState.fromValue(textToStringValue()));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
new file mode 100644
index 0000000..3d17c97
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandler.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.nic;
+
+import autovalue.shaded.com.google.common.common.collect.Lists;
+import com.google.inject.Inject;
+import org.jclouds.profitbricks.domain.Nic;
+import org.xml.sax.SAXException;
+
+import java.util.List;
+import org.jclouds.profitbricks.http.parser.firewall.FirewallResponseHandler;
+
+public class NicListResponseHandler extends BaseNicResponseHandler<List<Nic>> {
+
+   private List<Nic> nics;
+
+   @Inject
+   public NicListResponseHandler(FirewallResponseHandler firewallResponseHandler) {
+      super(firewallResponseHandler);
+      this.nics = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (useFirewallParser)
+         firewallResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName) || "nics".equals(qName)) {
+            nics.add(builder
+                    .firewall(firewallResponseHandler.getResult())
+                    .build());
+            builder = Nic.builder();
+         }
+         clearTextBuffer();
+      }
+
+      if ("firewall".equals(qName))
+         useFirewallParser = false;
+   }
+
+   @Override
+   public void reset() {
+      this.nics = Lists.newArrayList();
+   }
+
+   @Override
+   public List<Nic> getResult() {
+      return nics;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandler.java
new file mode 100644
index 0000000..690ecc1
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandler.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.jclouds.profitbricks.http.parser.nic;
+
+import com.google.inject.Inject;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.http.parser.firewall.FirewallResponseHandler;
+import org.xml.sax.SAXException;
+
+public class NicResponseHandler extends BaseNicResponseHandler<Nic> {
+
+   private boolean done = false;
+
+   @Inject
+   public NicResponseHandler(FirewallResponseHandler firewallResponseHandler) {
+      super(firewallResponseHandler);
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
+         return;
+
+      if (useFirewallParser)
+         firewallResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName)) {
+            done = true;
+            builder.firewall(firewallResponseHandler.getResult());
+            firewallResponseHandler.reset();
+         }
+         clearTextBuffer();
+      }
+
+      if ("firewall".equals(qName))
+         useFirewallParser = false;
+   }
+
+   @Override
+   public Nic getResult() {
+      return builder.build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
index 356d218..69a34b1 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
@@ -28,19 +28,57 @@ import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.jclouds.profitbricks.http.parser.nic.NicListResponseHandler;
+import org.jclouds.profitbricks.http.parser.storage.StorageListResponseHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
 
 public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
 
+   protected final StorageListResponseHandler storageListResponseHandler;
+   protected final NicListResponseHandler nicListResponseHandler;
+
    protected Server.DescribingBuilder builder;
 
    protected final DateCodec dateCodec;
 
+   protected boolean useStorageParser = false;
+   protected boolean useNicParser = false;
+
    @Inject
-   BaseServerResponseHandler(DateCodecFactory dateCodec) {
+   BaseServerResponseHandler(DateCodecFactory dateCodec, StorageListResponseHandler storageListResponseHandler,
+           NicListResponseHandler nicListResponseHandler) {
       this.dateCodec = dateCodec.iso8601();
+      this.storageListResponseHandler = storageListResponseHandler;
+      this.nicListResponseHandler = nicListResponseHandler;
       this.builder = Server.builder();
    }
 
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+      if ("connectedStorages".equals(qName))
+         useStorageParser = true;
+      else if ("nics".equals(qName))
+         useNicParser = true;
+
+      if (useStorageParser)
+         storageListResponseHandler.startElement(uri, localName, qName, attributes);
+      else if (useNicParser)
+         nicListResponseHandler.startElement(uri, localName, qName, attributes);
+      else
+         super.startElement(uri, localName, qName, attributes);
+   }
+
+   @Override
+   public void characters(char[] ch, int start, int length) {
+      if (useStorageParser)
+         storageListResponseHandler.characters(ch, start, length);
+      else if (useNicParser)
+         nicListResponseHandler.characters(ch, start, length);
+      else
+         super.characters(ch, start, length);
+   }
+
    protected final Date textToIso8601Date() {
       return dateCodec.toDate(textToStringValue());
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
index 3dc6e6e..68ee696 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
@@ -17,8 +17,11 @@
 package org.jclouds.profitbricks.http.parser.server;
 
 import com.google.inject.Inject;
+
 import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.http.parser.nic.NicListResponseHandler;
+import org.jclouds.profitbricks.http.parser.storage.StorageListResponseHandler;
 import org.xml.sax.SAXException;
 
 public class ServerInfoResponseHandler extends BaseServerResponseHandler<Server> {
@@ -26,18 +29,35 @@ public class ServerInfoResponseHandler extends BaseServerResponseHandler<Server>
    private boolean done = false;
 
    @Inject
-   ServerInfoResponseHandler(DateCodecFactory dateCodec) {
-      super(dateCodec);
+   ServerInfoResponseHandler(DateCodecFactory dateCodec, StorageListResponseHandler storageListResponseHandler,
+           NicListResponseHandler nicListResponseHandler) {
+      super(dateCodec, storageListResponseHandler, nicListResponseHandler);
    }
 
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
       if (done)
          return;
-      setPropertyOnEndTag(qName);
-      if ("return".equals(qName))
-         done = true;
-      clearTextBuffer();
+
+      if (useStorageParser)
+         storageListResponseHandler.endElement(uri, localName, qName);
+      else if (useNicParser)
+         nicListResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName)) {
+            done = true;
+            builder
+                    .storages(storageListResponseHandler.getResult())
+                    .nics(nicListResponseHandler.getResult());
+         }
+         clearTextBuffer();
+      }
+
+      if ("connectedStorages".equals(qName))
+         useStorageParser = false;
+      else if ("nics".equals(qName))
+         useNicParser = false;
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
index f0fcd3f..d7d50ab 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
@@ -18,29 +18,57 @@ package org.jclouds.profitbricks.http.parser.server;
 
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
+
 import java.util.List;
+
 import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.http.parser.nic.NicListResponseHandler;
+import org.jclouds.profitbricks.http.parser.storage.StorageListResponseHandler;
 import org.xml.sax.SAXException;
 
 public class ServerListResponseHandler extends BaseServerResponseHandler<List<Server>> {
 
-   private final List<Server> servers;
+   private List<Server> servers;
 
    @Inject
-   ServerListResponseHandler(DateCodecFactory dateCodec) {
-      super(dateCodec);
+   ServerListResponseHandler(DateCodecFactory dateCodec, StorageListResponseHandler storageListResponseHandler,
+           NicListResponseHandler nicListResponseHandler) {
+      super(dateCodec, storageListResponseHandler, nicListResponseHandler);
       this.servers = Lists.newArrayList();
    }
 
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
-      setPropertyOnEndTag(qName);
-      if ("return".equals(qName)) {
-         servers.add(builder.build());
-         builder = Server.builder();
+
+      if (useStorageParser)
+         storageListResponseHandler.endElement(uri, localName, qName);
+      else if (useNicParser)
+         nicListResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName) || "servers".equals(qName)) {
+            servers.add(builder
+                    .storages(storageListResponseHandler.getResult())
+                    .nics(nicListResponseHandler.getResult())
+                    .build());
+            storageListResponseHandler.reset();
+            nicListResponseHandler.reset();
+
+            builder = Server.builder();
+         }
+         clearTextBuffer();
       }
-      clearTextBuffer();
+
+      if ("connectedStorages".equals(qName))
+         useStorageParser = false;
+      else if ("nics".equals(qName))
+         useNicParser = false;
+   }
+
+   @Override
+   public void reset() {
+      this.servers = Lists.newArrayList();
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
index fe5e3fa..d590c80 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
@@ -25,7 +25,7 @@ import org.xml.sax.SAXException;
 
 public class StorageListResponseHandler extends BaseStorageResponseHandler<List<Storage>> {
 
-   private final List<Storage> storages;
+   private List<Storage> storages;
 
    @Inject
    StorageListResponseHandler(DateCodecFactory dateCodec) {
@@ -36,7 +36,7 @@ public class StorageListResponseHandler extends BaseStorageResponseHandler<List<
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
       setPropertyOnEndTag(qName);
-      if ("return".equals(qName)) {
+      if ("return".equals(qName) || "connectedStorages".equals(qName) || "storages".equals(qName)) {
          storages.add(builder
                  .serverIds(serverIds)
                  .build());
@@ -47,6 +47,11 @@ public class StorageListResponseHandler extends BaseStorageResponseHandler<List<
    }
 
    @Override
+   public void reset() {
+      this.storages = Lists.newArrayList();
+   }
+
+   @Override
    public List<Storage> getResult() {
       return storages;
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/MacAddresses.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/MacAddresses.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/MacAddresses.java
new file mode 100644
index 0000000..5725e4b
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/MacAddresses.java
@@ -0,0 +1,29 @@
+/*
+ * 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.util;
+
+import java.util.regex.Pattern;
+
+public class MacAddresses {
+
+   private static final String MAC_ADDR_FORMAT = "^([0-9a-f]{2}[:]){5}([0-9a-f]{2})$";
+   private static final Pattern MAC_ADDR_PATTERN = Pattern.compile(MAC_ADDR_FORMAT);
+
+   public static boolean isMacAddress(String in) {
+      return MAC_ADDR_PATTERN.matcher(in).matches();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinderTest.java
new file mode 100644
index 0000000..daedc36
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinderTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.binder.firewall;
+
+import org.jclouds.profitbricks.domain.Firewall;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.profitbricks.domain.Firewall.Protocol;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "AddFirewallRuleToNicRequestBinderTest")
+public class AddFirewallRuleToNicRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      AddFirewallRuleToNicRequestBinder binder = new AddFirewallRuleToNicRequestBinder();
+
+      Firewall.Request.AddRulePayload payload = Firewall.Request.ruleAddingBuilder()
+              .nicId("nic-id")
+              .newRule()
+              .name("name")
+              .portRangeEnd(45678)
+              .portRangeStart(12345)
+              .protocol(Protocol.TCP)
+              .sourceIp("192.168.0.1")
+              .sourceMac("aa:bb:cc:dd:ee:ff")
+              .targetIp("192.168.0.2")
+              .endRule()
+              .build();
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload = ("  <ws:addFirewallRulesToNic>\n"
+           + "        <nicId>nic-id</nicId>\n"
+           + "            <request>\n"
+           + "                <name>name</name>\n"
+           + "                <portRangeEnd>45678</portRangeEnd>\n"
+           + "                <portRangeStart>12345</portRangeStart>\n"
+           + "                <protocol>TCP</protocol>\n"
+           + "                <sourceIp>192.168.0.1</sourceIp>\n"
+           + "                <sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>\n"
+           + "                <targetIp>192.168.0.2</targetIp>\n"
+           + "            </request>\n"
+           + "        </ws:addFirewallRulesToNic>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/FirewallBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/FirewallBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/FirewallBinderTest.java
new file mode 100644
index 0000000..e32b788
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/firewall/FirewallBinderTest.java
@@ -0,0 +1,131 @@
+/*
+ * 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.binder.firewall;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.List;
+
+import org.jclouds.profitbricks.binder.firewall.FirewallBinder.ActivateFirewallRequestBinder;
+import org.jclouds.profitbricks.binder.firewall.FirewallBinder.DeactivateFirewallRequestBinder;
+import org.jclouds.profitbricks.binder.firewall.FirewallBinder.DeleteFirewallRequestBinder;
+import org.jclouds.profitbricks.binder.firewall.FirewallBinder.RemoveFirewallRuleRequestBinder;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+@Test(groups = "unit", testName = "FirewallBinderTest")
+public class FirewallBinderTest {
+
+   @Test
+   public void testActivateFirewallBindPayload() {
+      ActivateFirewallRequestBinder binder = new ActivateFirewallRequestBinder();
+
+      List<String> payload = ImmutableList.of(
+              "firewall-id-1",
+              "firewall-id-2",
+              "firewall-id-3",
+              "firewall-id-4"
+      );
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+
+      String expected = ("<ws:activateFirewalls>\n"
+              + "         <firewallIds>firewall-id-1</firewallIds>\n"
+              + "         <firewallIds>firewall-id-2</firewallIds>\n"
+              + "         <firewallIds>firewall-id-3</firewallIds>\n"
+              + "         <firewallIds>firewall-id-4</firewallIds>\n"
+              + "      </ws:activateFirewalls>").replaceAll("\\s+", "");
+
+      assertEquals(actual, expected);
+   }
+
+   @Test
+   public void testDeactivateFirewallBindPayload() {
+      DeactivateFirewallRequestBinder binder = new DeactivateFirewallRequestBinder();
+
+      List<String> payload = ImmutableList.of(
+              "firewall-id-1",
+              "firewall-id-2",
+              "firewall-id-3",
+              "firewall-id-4"
+      );
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+
+      String expected = ("<ws:deactivateFirewalls>\n"
+              + "         <firewallIds>firewall-id-1</firewallIds>\n"
+              + "         <firewallIds>firewall-id-2</firewallIds>\n"
+              + "         <firewallIds>firewall-id-3</firewallIds>\n"
+              + "         <firewallIds>firewall-id-4</firewallIds>\n"
+              + "      </ws:deactivateFirewalls>").replaceAll("\\s+", "");
+
+      assertEquals(actual, expected);
+   }
+
+   @Test
+   public void testDeleteFirewallBindPayload() {
+      DeleteFirewallRequestBinder binder = new DeleteFirewallRequestBinder();
+
+      List<String> payload = ImmutableList.of(
+              "firewall-id-1",
+              "firewall-id-2",
+              "firewall-id-3",
+              "firewall-id-4"
+      );
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+
+      String expected = ("<ws:deleteFirewalls>\n"
+              + "         <firewallIds>firewall-id-1</firewallIds>\n"
+              + "         <firewallIds>firewall-id-2</firewallIds>\n"
+              + "         <firewallIds>firewall-id-3</firewallIds>\n"
+              + "         <firewallIds>firewall-id-4</firewallIds>\n"
+              + "      </ws:deleteFirewalls>").replaceAll("\\s+", "");
+
+      assertEquals(actual, expected);
+   }
+
+   @Test
+   public void testRemoveFirewallRuleBindPayload() {
+      RemoveFirewallRuleRequestBinder binder = new RemoveFirewallRuleRequestBinder();
+
+      List<String> payload = ImmutableList.of(
+              "firewall-rule-id-1",
+              "firewall-rule-id-2",
+              "firewall-rule-id-3",
+              "firewall-rule-id-4"
+      );
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+
+      String expected = ("<ws:removeFirewallRules>\n"
+              + "         <firewallRuleIds>firewall-rule-id-1</firewallRuleIds>\n"
+              + "         <firewallRuleIds>firewall-rule-id-2</firewallRuleIds>\n"
+              + "         <firewallRuleIds>firewall-rule-id-3</firewallRuleIds>\n"
+              + "         <firewallRuleIds>firewall-rule-id-4</firewallRuleIds>\n"
+              + "      </ws:removeFirewallRules>").replaceAll("\\s+", "");
+
+      assertEquals(actual, expected);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/CreateNicRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/CreateNicRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/CreateNicRequestBinderTest.java
new file mode 100644
index 0000000..8e2630d
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/CreateNicRequestBinderTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.binder.nic;
+
+import org.jclouds.profitbricks.domain.Nic;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "CreateNicRequestBinderTest")
+public class CreateNicRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      CreateNicRequestBinder binder = new CreateNicRequestBinder();
+
+      Nic.Request.CreatePayload payload = Nic.Request.creatingBuilder()
+              .ip("192.168.0.1")
+              .name("nic-name")
+              .dhcpActive(true)
+              .serverId("server-id")
+              .lanId(1)
+              .build();
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload = ("<ws:createNic>\n"
+           + "            <request>\n"
+           + "                <ip>192.168.0.1</ip>\n"
+           + "                <nicName>nic-name</nicName>\n"
+           + "                <dhcpActive>true</dhcpActive>\n"
+           + "                <serverId>server-id</serverId>\n"
+           + "                <lanId>1</lanId>\n"
+           + "            </request>\n"
+           + "        </ws:createNic>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/SetInternetAccessBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/SetInternetAccessBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/SetInternetAccessBinderTest.java
new file mode 100644
index 0000000..c499c73
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/SetInternetAccessBinderTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.binder.nic;
+
+import org.jclouds.profitbricks.domain.Nic;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "SetInternetAccessBinderTest")
+public class SetInternetAccessBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      SetInternetAccessBinder binder = new SetInternetAccessBinder();
+
+      Nic.Request.SetInternetAccessPayload payload = Nic.Request.setInternetAccessBuilder()
+              .dataCenterId("datacenter-id")
+              .internetAccess(true)
+              .lanId(1)
+              .build();
+
+      String actual = binder.createPayload(payload);
+
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload = (" <ws:setInternetAccess>\n"
+           + "                <dataCenterId>datacenter-id</dataCenterId>\n"
+           + "                <lanId>1</lanId>\n"
+           + "                <internetAccess>true</internetAccess>\n"
+           + "        </ws:setInternetAccess>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/UpdateNicRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/UpdateNicRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/UpdateNicRequestBinderTest.java
new file mode 100644
index 0000000..298fea7
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/nic/UpdateNicRequestBinderTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.binder.nic;
+
+import org.jclouds.profitbricks.domain.Nic;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "UpdateNicRequestBinderTest")
+public class UpdateNicRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      UpdateNicRequestBinder binder = new UpdateNicRequestBinder();
+
+      Nic.Request.UpdatePayload payload = Nic.Request.updatingBuilder()
+              .id("nic-id")
+              .ip("192.168.0.1")
+              .name("nic-name")
+              .dhcpActive(true)
+              .lanId(1)
+              .build();
+
+      String actual = binder.createPayload(payload);
+
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload = (" <ws:updateNic>\n"
+           + "            <request>\n"
+           + "                <nicId>nic-id</nicId>\n"
+           + "                <ip>192.168.0.1</ip>\n"
+           + "                <nicName>nic-name</nicName>\n"
+           + "                <dhcpActive>true</dhcpActive>\n"
+           + "                <lanId>1</lanId>\n"
+           + "            </request>\n"
+           + "        </ws:updateNic>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/FirewallRuleBuilderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/FirewallRuleBuilderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/FirewallRuleBuilderTest.java
new file mode 100644
index 0000000..af29eae
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/FirewallRuleBuilderTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "FirewallRuleBuilderTest")
+public class FirewallRuleBuilderTest {
+
+   private final String _name = "rule-name";
+   private final Integer _portRangeEnd = 45678;
+   private final Integer _portRangeStart = 12345;
+   private final Firewall.Protocol _protocol = Firewall.Protocol.TCP;
+   private final String _sourceIp = "192.168.0.1";
+   private final String _sourceMac = "aa:bb:cc:dd:ee:ff";
+   private final String _targetIp = "192.168.0.2";
+
+   private final Integer _icmpType = 2;
+   private final Integer _icmpCode = 24;
+
+   @Test
+   public void testAutoValueFirewallRulePropertiesSettingCorrectly() {
+      Firewall.Rule actual = Firewall.Rule.builder()
+              .name(_name)
+              .portRangeEnd(_portRangeEnd)
+              .portRangeStart(_portRangeStart)
+              .protocol(_protocol)
+              .sourceIp(_sourceIp)
+              .sourceMac(_sourceMac)
+              .targetIp(_targetIp)
+              .build();
+
+      assertEquals(actual.name(), _name);
+      assertEquals(actual.portRangeEnd(), _portRangeEnd);
+      assertEquals(actual.portRangeStart(), _portRangeStart);
+      assertEquals(actual.protocol(), _protocol);
+      assertEquals(actual.sourceIp(), _sourceIp);
+      assertEquals(actual.sourceMac(), _sourceMac);
+      assertEquals(actual.targetIp(), _targetIp);
+   }
+
+   @Test
+   public void testAutoValueFirewallRuleWithIcmpPropertiesSettingCorrectly() {
+      Firewall.RuleWithIcmp actual = Firewall.RuleWithIcmp.builder()
+              .name(_name)
+              .icmpCode(_icmpCode)
+              .icmpType(_icmpType)
+              .protocol(Firewall.Protocol.ICMP)
+              .sourceIp(_sourceIp)
+              .sourceMac(_sourceMac)
+              .targetIp(_targetIp)
+              .build();
+
+      assertEquals(actual.name(), _name);
+      assertNull(actual.portRangeEnd());
+      assertNull(actual.portRangeStart());
+      assertEquals(actual.protocol(), Firewall.Protocol.ICMP);
+      assertEquals(actual.sourceIp(), _sourceIp);
+      assertEquals(actual.sourceMac(), _sourceMac);
+      assertEquals(actual.targetIp(), _targetIp);
+      assertEquals(actual.icmpCode(), _icmpCode);
+      assertEquals(actual.icmpType(), _icmpType);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
new file mode 100644
index 0000000..78e7dbd
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
@@ -0,0 +1,146 @@
+/*
+ * 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.features;
+
+import com.google.common.collect.Iterables;
+
+import java.util.List;
+
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.Nic;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.Firewall.Protocol;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.util.Predicates2;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+
+import autovalue.shaded.com.google.common.common.collect.ImmutableList;
+
+@Test(groups = "live", testName = "FirewallApiLiveTest", singleThreaded = true)
+public class FirewallApiLiveTest extends BaseProfitBricksLiveTest {
+
+   private Predicate<String> waitUntilAvailable;
+   private Nic nic;
+
+   private Firewall createdFirewall;
+   private Firewall.Rule createdFirewallRule;
+
+   @Override
+   protected void initialize() {
+      super.initialize();
+      List<Nic> nics = api.nicApi().getAllNics();
+      assertFalse(nics.isEmpty(), "Must atleast have 1 NIC available for firewall testing.");
+
+      this.nic = Iterables.tryFind(nics, new Predicate<Nic>() {
+
+         @Override
+         public boolean apply(Nic input) {
+            return input.state() == ProvisioningState.AVAILABLE;
+         }
+      }).orNull();
+
+      assertNotNull(nic, "No available NIC for firewall testing was found.");
+
+      this.waitUntilAvailable = Predicates2.retry(
+              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.NIC, ProvisioningState.AVAILABLE),
+              2l * 60l, 2l, TimeUnit.SECONDS);
+   }
+
+   @Test
+   public void testAddFirewallRuleToNic() {
+      Firewall firewall = api.firewallApi().addFirewallRuleToNic(
+              Firewall.Request.ruleAddingBuilder()
+              .nicId(nic.id())
+              .newRule()
+              .name("test-rule-tcp")
+              .protocol(Protocol.TCP)
+              .endRule()
+              .build());
+
+      assertNotNull(firewall);
+      assertNotNull(firewall.rules());
+
+      waitUntilAvailable.apply(nic.id());
+      createdFirewall = firewall;
+      createdFirewallRule = Iterables.getOnlyElement(firewall.rules());
+   }
+
+   @Test(dependsOnMethods = "testAddFirewallRuleToNic")
+   public void testGetAllFirewalls() {
+      List<Firewall> firewalls = api.firewallApi().getAllFirewalls();
+
+      assertNotNull(firewalls);
+      assertFalse(firewalls.isEmpty());
+   }
+
+   @Test(dependsOnMethods = "testAddFirewallRuleToNic")
+   public void testGetFirewall() {
+      Firewall firewall = api.firewallApi().getFirewall(createdFirewall.id());
+
+      assertNotNull(firewall);
+      assertEquals(createdFirewall.id(), firewall.id());
+   }
+
+   @Test(dependsOnMethods = "testAddFirewallRuleToNic")
+   public void testActivateFirewall() {
+      boolean result = api.firewallApi().activateFirewall(ImmutableList.of(createdFirewall.id()));
+
+      waitUntilAvailable.apply(nic.id());
+
+      assertTrue(result);
+   }
+
+   @Test(dependsOnMethods = "testActivateFirewall")
+   void testDeactivateFirewall() {
+      boolean result = api.firewallApi().deactivateFirewall(ImmutableList.of(createdFirewall.id()));
+
+      waitUntilAvailable.apply(nic.id());
+
+      assertTrue(result);
+   }
+
+   @Test(dependsOnMethods = "testActivateFirewall")
+   void testRemoveFirewallRule() {
+      boolean result = api.firewallApi().removeFirewallRules(ImmutableList.of(createdFirewallRule.id()));
+
+      waitUntilAvailable.apply(nic.id());
+
+      assertTrue(result);
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void testDeleteFirewall() {
+      if (createdFirewall != null) {
+         boolean result = api.firewallApi().deleteFirewall(ImmutableList.of(createdFirewall.id()));
+
+         assertTrue(result, "Created firewall was not deleted.");
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiMockTest.java
new file mode 100644
index 0000000..17ec324
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiMockTest.java
@@ -0,0 +1,324 @@
+/*
+ * 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.features;
+
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+import java.util.List;
+
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.Firewall.Protocol;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+@Test(groups = "live", testName = "FirewallApiMockTest", singleThreaded = true)
+public class FirewallApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetAllFirewalls() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/firewall/firewalls.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      FirewallApi api = pbApi.firewallApi();
+
+      try {
+         List<Firewall> firewalls = api.getAllFirewalls();
+         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllFirewalls/>");
+         assertNotNull(firewalls);
+         assertEquals(firewalls.size(), 2);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/firewall/firewall.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      FirewallApi api = pbApi.firewallApi();
+
+      String id = "firewall-id";
+      String firewallruleid = "firewall-rule-id";
+
+      String content = "<ws:getFirewall><firewallId>" + id + "</firewallId></ws:getFirewall>";
+
+      try {
+         Firewall firewall = api.getFirewall(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(firewall);
+         assertEquals(firewall.id(), id);
+         assertFalse(firewall.rules().isEmpty());
+         assertEquals(firewall.rules().get(0).id(), firewallruleid);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetNonExistingFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String id = "firewall-id";
+
+      try {
+         Firewall firewall = api.getFirewall(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(firewall);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testAddFirewallRuleToNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/firewall/firewall-addtonic.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String content = "<ws:addFirewallRulesToNic>"
+              + "<nicId>nic-id</nicId>"
+              + "<request>"
+              + "<name>name</name>"
+              + "<portRangeEnd>45678</portRangeEnd>"
+              + "<portRangeStart>12345</portRangeStart>"
+              + "<protocol>TCP</protocol>"
+              + "<sourceIp>192.168.0.1</sourceIp>"
+              + "<sourceMac>aa:bb:cc:dd:ee:ff</sourceMac>"
+              + "<targetIp>192.168.0.2</targetIp>"
+              + "</request>"
+              + "</ws:addFirewallRulesToNic>";
+      try {
+         Firewall.Request.AddRulePayload payload = Firewall.Request.ruleAddingBuilder()
+                 .nicId("nic-id")
+                 .newRule()
+                 .name("name")
+                 .portRangeEnd(45678)
+                 .portRangeStart(12345)
+                 .protocol(Protocol.TCP)
+                 .sourceIp("192.168.0.1")
+                 .sourceMac("aa:bb:cc:dd:ee:ff")
+                 .targetIp("192.168.0.2")
+                 .endRule()
+                 .build();
+         Firewall response = api.addFirewallRuleToNic(payload);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(response);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testRemoveFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/firewall/firewall-remove.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String firewallId = "12345";
+      String content = "<ws:removeFirewallRules>"
+              + "<firewallRuleIds>" + firewallId + "</firewallRuleIds>"
+              + "</ws:removeFirewallRules>";
+
+      try {
+         boolean result = api.removeFirewallRules(ImmutableList.of(firewallId));
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testRemoveNonExitingFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String firewallRuleId = "12345";
+
+      try {
+         boolean result = api.removeFirewallRules(ImmutableList.of(firewallRuleId));
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertFalse(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testActivateFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/firewall/firewall-activate.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String firewallId = "12345";
+      String content = "<ws:activateFirewalls>"
+              + "<firewallIds>" + firewallId + "</firewallIds>"
+              + "</ws:activateFirewalls>";
+
+      try {
+         boolean result = api.activateFirewall(ImmutableList.of(firewallId));
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testActivateNonExitingFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String firewallId = "12345";
+
+      try {
+         boolean result = api.activateFirewall(ImmutableList.of(firewallId));
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertFalse(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeactivateFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/firewall/firewall-deactivate.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String firewallId = "12345";
+      String content = "<ws:deactivateFirewalls>"
+              + "<firewallIds>" + firewallId + "</firewallIds>"
+              + "</ws:deactivateFirewalls>";
+
+      try {
+         boolean result = api.deactivateFirewall(ImmutableList.of(firewallId));
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeactivateNonExitingFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String firewallId = "12345";
+
+      try {
+         boolean result = api.deactivateFirewall(ImmutableList.of(firewallId));
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertFalse(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/firewall/firewall-delete.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String firewallId = "12345";
+      String content = "<ws:deleteFirewalls>"
+              + "<firewallIds>" + firewallId + "</firewallIds>"
+              + "</ws:deleteFirewalls>";
+
+      try {
+         boolean result = api.deleteFirewall(ImmutableList.of(firewallId));
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteNonExitingFirewall() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      FirewallApi api = pbApi.firewallApi();
+
+      String firewallId = "12345";
+
+      try {
+         boolean result = api.deleteFirewall(ImmutableList.of(firewallId));
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertFalse(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiLiveTest.java
new file mode 100644
index 0000000..fbbef8b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiLiveTest.java
@@ -0,0 +1,136 @@
+/*
+ * 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.features;
+
+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 com.google.common.collect.Iterables;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.util.Predicates2;
+
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+
+@Test(groups = "live", testName = "NicApiLiveTest", singleThreaded = true)
+public class NicApiLiveTest extends BaseProfitBricksLiveTest {
+
+   private Predicate<String> waitUntilAvailable;
+   private Server server;
+   private Nic createdNic;
+
+   @Override
+   protected void initialize() {
+      super.initialize();
+      List<Server> servers = api.serverApi().getAllServers();
+      assertFalse(servers.isEmpty(), "Must atleast have 1 server available for NIC testing.");
+
+      this.server = Iterables.tryFind(servers, new Predicate<Server>() {
+
+         @Override
+         public boolean apply(Server input) {
+            return input.state() == ProvisioningState.AVAILABLE;
+         }
+      }).orNull();
+
+      this.waitUntilAvailable = Predicates2.retry(
+              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.NIC, ProvisioningState.AVAILABLE),
+              2l * 60l, 2l, TimeUnit.SECONDS);
+   }
+
+   @Test
+   public void testCreateNic() {
+      Nic.Request.CreatePayload payload = Nic.Request.creatingBuilder()
+              .name("name nr1")
+              .dhcpActive(true)
+              .serverId(server.id())
+              .lanId(1)
+              .build();
+
+      Nic nic = api.nicApi().createNic(payload);
+      assertNotNull(nic);
+
+      waitUntilAvailable.apply(nic.id());
+      this.createdNic = nic;
+   }
+
+   @Test(dependsOnMethods = "testCreateNic")
+   public void testGetAllNics() {
+      List<Nic> nics = api.nicApi().getAllNics();
+
+      assertNotNull(nics);
+   }
+
+   @Test(dependsOnMethods = "testCreateNic")
+   public void testGetNic() {
+      Nic nic = api.nicApi().getNic(createdNic.id());
+
+      assertNotNull(nic);
+      assertEquals(nic.id(), createdNic.id());
+   }
+
+   @Test(dependsOnMethods = "testCreateNic")
+   public void testUpdateNic() {
+      Nic.Request.UpdatePayload payload = Nic.Request.updatingBuilder()
+              .name("name nr2")
+              .id(createdNic.id())
+              .build();
+
+      Nic updatedNic = api.nicApi().updateNic(payload);
+      assertNotNull(updatedNic);
+      waitUntilAvailable.apply(payload.id());
+
+      updatedNic = api.nicApi().getNic(payload.id());
+
+      assertEquals(updatedNic.name(), payload.name());
+   }
+
+   @Test(dependsOnMethods = "testUpdateNic")
+   public void testSetInternetAccess() {
+
+      Nic.Request.SetInternetAccessPayload payload = Nic.Request.setInternetAccessBuilder()
+              .dataCenterId(createdNic.dataCenterId())
+              .lanId(1)
+              .internetAccess(true)
+              .build();
+
+      Nic result = api.nicApi().setInternetAccess(payload);
+      assertNotNull(result);
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void testDeleteNic() {
+      if (createdNic != null) {
+         boolean result = api.nicApi().deleteNic(createdNic.id());
+
+         assertTrue(result, "Created test NIC was not deleted.");
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
new file mode 100644
index 0000000..0e01e2c
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
@@ -0,0 +1,222 @@
+/*
+ * 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.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import java.util.List;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "NicApiMockTest")
+
+public class NicApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/nic/nic.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      NicApi api = pbApi.nicApi();
+
+      String id = "12345678-abcd-efgh-ijkl-987654321000";
+
+      String content = "<ws:getNic><nicId>" + id + "</nicId></ws:getNic>";
+      try {
+         Nic nic = api.getNic(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(nic);
+         assertEquals(nic.id(), id);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetNonExistingNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      NicApi api = pbApi.nicApi();
+
+      String id = "nonexisting-nic-id";
+
+      try {
+         Nic nic = api.getNic(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(nic);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/nic/nics.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      NicApi api = pbApi.nicApi();
+      try {
+         List<Nic> nics = api.getAllNics();
+         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllNic/>");
+         assertNotNull(nics);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testCreateNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/nic/nic-create.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      NicApi api = pbApi.nicApi();
+
+      String content = "<ws:createNic>"
+              + "<request>"
+              + "<ip>192.168.0.1</ip>"
+              + "<nicName>nic-name</nicName>"
+              + "<dhcpActive>true</dhcpActive>"
+              + "<serverId>server-id</serverId>"
+              + "<lanId>1</lanId>"
+              + "</request>"
+              + "</ws:createNic>";
+
+      try {
+         Nic nic = api.createNic(
+                 Nic.Request.creatingBuilder()
+                 .ip("192.168.0.1")
+                 .name("nic-name")
+                 .dhcpActive(true)
+                 .lanId(1)
+                 .serverId("server-id")
+                 .build());
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(nic.id());
+
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testUpdateNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/nic/nic-update.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      NicApi api = pbApi.nicApi();
+
+      String content = "<ws:updateNic>"
+              + "<request>"
+              + "<nicId>nic-id</nicId>"
+              + "<ip>ip</ip>"
+              + "<nicName>nic-name</nicName>"
+              + "<dhcpActive>true</dhcpActive>"
+              + "<lanId>1</lanId>"
+              + "</request>"
+              + "</ws:updateNic>";
+      try {
+         Nic nic = api.updateNic(Nic.Request.UpdatePayload.create("nic-id", "ip", "nic-name", true, 1));
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testSetInternetAccess() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/nic/nic-internetaccess.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      NicApi api = pbApi.nicApi();
+
+      String content = "<ws:setInternetAccess>"
+              + "<dataCenterId>datacenter-id</dataCenterId>"
+              + "<lanId>1</lanId>"
+              + "<internetAccess>true</internetAccess>"
+              + "</ws:setInternetAccess>";
+      try {
+         Nic nic = api.setInternetAccess(Nic.Request.SetInternetAccessPayload.create("datacenter-id", 1, true));
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/nic/nic-delete.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      NicApi api = pbApi.nicApi();
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+
+      String content = "<ws:deleteNic><nicId>" + id + "</nicId></ws:deleteNic>";
+
+      try {
+         boolean result = api.deleteNic(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteNonExistingNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      NicApi api = pbApi.nicApi();
+
+      String id = "nonexisting-nic-id";
+
+      try {
+         boolean result = api.deleteNic(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertFalse(result);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
index f9827b3..e2ee87e 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
@@ -24,7 +24,9 @@ import org.jclouds.date.DateCodecFactory;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
 import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Firewall;
 import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.Nic;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
@@ -63,7 +65,7 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
               .location(Location.US_LAS)
               .servers(ImmutableList.<Server>of(
                               Server.builder()
-                              .id("12345678-abcd-efgh-ijkl-987654321000")
+                              .id("qqqqqqqq-wwww-eeee-rrrr-tttttttttttt")
                               .name("jnode1")
                               .cores(4)
                               .ram(4096)
@@ -80,8 +82,43 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
                               .isNicHotUnPlug(true)
                               .isDiscVirtioHotPlug(true)
                               .isDiscVirtioHotUnPlug(true)
+                              .storages(ImmutableList.<Storage>of(
+                                              Storage.builder()
+                                              .bootDevice(Boolean.TRUE)
+                                              .id("ssssssss-aaaa-ffff-gggg-hhhhhhhhhhhh")
+                                              .busType(Storage.BusType.VIRTIO)
+                                              .deviceNumber(1)
+                                              .size(40f)
+                                              .name("jnode1-disk1")
+                                              .build()
+                                      )
+                              )
+                              .nics(ImmutableList.<Nic>of(
+                                              Nic.builder()
+                                              .dataCenterId("12345678-abcd-efgh-ijkl-987654321000")
+                                              .id("zzzzzzzz-xxxx-cccc-vvvv-bbbbbbbbbbbb")
+                                              .lanId(1)
+                                              .internetAccess(true)
+                                              .serverId("qqqqqqqq-wwww-eeee-rrrr-tttttttttttt")
+                                              .ip("202.94.38.12")
+                                              .macAddress("02:01:09:cd:f0:b0")
+                                              .firewall(
+                                                      Firewall.builder()
+                                                      .active(false)
+                                                      .id("llllllll-kkkk-jjjj-hhhh-gggggggggggg")
+                                                      .nicId("zzzzzzzz-xxxx-cccc-vvvv-bbbbbbbbbbbb")
+                                                      .state(ProvisioningState.AVAILABLE)
+                                                      .build()
+                                              )
+                                              .dhcpActive(true)
+                                              .gatewayIp("202.94.38.1")
+                                              .state(ProvisioningState.AVAILABLE)
+                                              .build()
+                                      )
+                              )
                               .build()
-                      ))
+                      )
+              )
               .storages(ImmutableList.<Storage>of(
                               Storage.builder()
                               .id("ssssssss-aaaa-ffff-gggg-hhhhhhhhhhhh")
@@ -90,6 +127,9 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
                               .state(ProvisioningState.AVAILABLE)
                               .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
                               .lastModificationTime(dateParser.toDate("2014-12-12T03:14:48.316Z"))
+                              .serverIds(ImmutableList.of(
+                                              "qqqqqqqq-wwww-eeee-rrrr-tttttttttttt"
+                                      ))
                               .build()
                       ))
               .build();


[13/35] jclouds git commit: JCLOUDS-702: JCloud ProfitBricks provider - NIC & Firewall API

Posted by de...@apache.org.
JCLOUDS-702: JCloud ProfitBricks provider - NIC & Firewall API


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

Branch: refs/heads/master
Commit: de2e5e01b58b3859f7ea78e8c4d282fe735ca71a
Parents: 2a219a9
Author: Reijhanniel Jearl Campos <de...@gmail.com>
Authored: Wed Feb 25 23:27:42 2015 +0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Thu Feb 26 15:49:16 2015 +0100

----------------------------------------------------------------------
 .../jclouds/profitbricks/ProfitBricksApi.java   |   8 +
 .../AddFirewallRuleToNicRequestBinder.java      |  53 +++
 .../binder/firewall/FirewallBinder.java         |  95 +++++
 .../binder/nic/CreateNicRequestBinder.java      |  46 +++
 .../binder/nic/SetInternetAccessBinder.java     |  42 ++
 .../binder/nic/UpdateNicRequestBinder.java      |  46 +++
 .../internal/ProvisioningStatusAware.java       |   2 +-
 .../ProvisioningStatusPollingPredicate.java     |   7 +-
 .../jclouds/profitbricks/domain/Firewall.java   | 366 ++++++++++++++++++
 .../org/jclouds/profitbricks/domain/Nic.java    | 379 +++++++++++++++++++
 .../org/jclouds/profitbricks/domain/Server.java |  29 +-
 .../jclouds/profitbricks/domain/Storage.java    |   1 +
 .../internal/FirewallRuleCommonProperties.java  |  44 +++
 .../profitbricks/features/DataCenterApi.java    |  12 +-
 .../profitbricks/features/FirewallApi.java      |  93 +++++
 .../jclouds/profitbricks/features/NicApi.java   |  84 ++++
 .../profitbricks/features/ServerApi.java        |  20 +-
 .../profitbricks/features/StorageApi.java       |  11 +-
 ...usFromPayloadHttpCommandExecutorService.java |  76 ++--
 .../parser/BaseProfitBricksResponseHandler.java |   4 +
 .../DataCenterInfoResponseHandler.java          |  54 ++-
 .../firewall/BaseFirewallResponseHandler.java   |  69 ++++
 .../firewall/FirewallListResponseHandler.java   |  64 ++++
 .../firewall/FirewallResponseHandler.java       |  63 +++
 .../rule/BaseFirewallRuleResponseHandler.java   |  54 +++
 .../rule/FirewallRuleListResponseHandler.java   |  54 +++
 .../http/parser/nic/BaseNicResponseHandler.java |  82 ++++
 .../http/parser/nic/NicListResponseHandler.java |  65 ++++
 .../http/parser/nic/NicResponseHandler.java     |  58 +++
 .../server/BaseServerResponseHandler.java       |  40 +-
 .../server/ServerInfoResponseHandler.java       |  32 +-
 .../server/ServerListResponseHandler.java       |  44 ++-
 .../storage/StorageListResponseHandler.java     |   9 +-
 .../jclouds/profitbricks/util/MacAddresses.java |  29 ++
 .../AddFirewallRuleToNicRequestBinderTest.java  |  64 ++++
 .../binder/firewall/FirewallBinderTest.java     | 131 +++++++
 .../binder/nic/CreateNicRequestBinderTest.java  |  53 +++
 .../binder/nic/SetInternetAccessBinderTest.java |  48 +++
 .../binder/nic/UpdateNicRequestBinderTest.java  |  54 +++
 .../domain/FirewallRuleBuilderTest.java         |  82 ++++
 .../features/FirewallApiLiveTest.java           | 146 +++++++
 .../features/FirewallApiMockTest.java           | 324 ++++++++++++++++
 .../profitbricks/features/NicApiLiveTest.java   | 136 +++++++
 .../profitbricks/features/NicApiMockTest.java   | 222 +++++++++++
 .../DataCenterInfoResponseHandlerTest.java      |  44 ++-
 .../FirewallListResponseHandlerTest.java        |  87 +++++
 .../firewall/FirewallResponseHandlerTest.java   |  71 ++++
 .../parser/nic/NicListResponseHandlerTest.java  |  95 +++++
 .../http/parser/nic/NicResponseHandlerTest.java |  66 ++++
 .../server/ServerInfoResponseHandlerTest.java   |  36 ++
 .../server/ServerListResponseHandlerTest.java   |  71 ++++
 .../profitbricks/util/MacAddressesTest.java     |  45 +++
 .../test/resources/datacenter/datacenter.xml    |   3 +-
 .../resources/firewall/firewall-activate.xml    |  12 +
 .../resources/firewall/firewall-addtonic.xml    |  23 ++
 .../resources/firewall/firewall-deactivate.xml  |  12 +
 .../test/resources/firewall/firewall-delete.xml |  12 +
 .../test/resources/firewall/firewall-remove.xml |  12 +
 .../src/test/resources/firewall/firewall.xml    |  23 ++
 .../src/test/resources/firewall/firewalls.xml   |  39 ++
 .../src/test/resources/nic/nic-create.xml       |  13 +
 .../src/test/resources/nic/nic-delete.xml       |   9 +
 .../test/resources/nic/nic-internetaccess.xml   |  11 +
 .../src/test/resources/nic/nic-update.xml       |  15 +
 .../profitbricks/src/test/resources/nic/nic.xml |  27 ++
 .../src/test/resources/nic/nics.xml             |  49 +++
 .../src/test/resources/server/servers.xml       |   1 +
 67 files changed, 4052 insertions(+), 119 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
index 4cfe6e8..49d7e8c 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -19,7 +19,9 @@ package org.jclouds.profitbricks;
 import java.io.Closeable;
 
 import org.jclouds.profitbricks.features.DataCenterApi;
+import org.jclouds.profitbricks.features.FirewallApi;
 import org.jclouds.profitbricks.features.ImageApi;
+import org.jclouds.profitbricks.features.NicApi;
 import org.jclouds.profitbricks.features.ServerApi;
 import org.jclouds.profitbricks.features.StorageApi;
 import org.jclouds.rest.annotations.Delegate;
@@ -37,4 +39,10 @@ public interface ProfitBricksApi extends Closeable {
 
    @Delegate
    StorageApi storageApi();
+
+   @Delegate
+   NicApi nicApi();
+
+   @Delegate
+   FirewallApi firewallApi();
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
new file mode 100644
index 0000000..9bdbf76
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/AddFirewallRuleToNicRequestBinder.java
@@ -0,0 +1,53 @@
+/*
+ * 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.binder.firewall;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Firewall;
+import static java.lang.String.format;
+
+public class AddFirewallRuleToNicRequestBinder extends BaseProfitBricksRequestBinder<Firewall.Request.AddRulePayload> {
+
+   private final StringBuilder requestBuilder;
+
+   AddFirewallRuleToNicRequestBinder() {
+      super("firewall");
+      this.requestBuilder = new StringBuilder(128);
+   }
+
+   @Override
+   protected String createPayload(Firewall.Request.AddRulePayload payload) {
+      requestBuilder.append("<ws:addFirewallRulesToNic>")
+              .append(format("<nicId>%s</nicId>", payload.nicId()));
+      for (Firewall.RuleWithIcmp rule : payload.rules())
+         requestBuilder
+                 .append("<request>")
+                 .append(formatIfNotEmpty("<icmpCode>%s</icmpCode>", rule.icmpCode()))
+                 .append(formatIfNotEmpty("<icmpType>%s</icmpType>", rule.icmpType()))
+                 .append(formatIfNotEmpty("<name>%s</name>", rule.name()))
+                 .append(formatIfNotEmpty("<portRangeEnd>%s</portRangeEnd>", rule.portRangeEnd()))
+                 .append(formatIfNotEmpty("<portRangeStart>%s</portRangeStart>", rule.portRangeStart()))
+                 .append(formatIfNotEmpty("<protocol>%s</protocol>", rule.protocol()))
+                 .append(formatIfNotEmpty("<sourceIp>%s</sourceIp>", rule.sourceIp()))
+                 .append(formatIfNotEmpty("<sourceMac>%s</sourceMac>", rule.sourceMac()))
+                 .append(formatIfNotEmpty("<targetIp>%s</targetIp>", rule.targetIp()))
+                 .append("</request>");
+      requestBuilder.append("</ws:addFirewallRulesToNic>");
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/FirewallBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/FirewallBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/FirewallBinder.java
new file mode 100644
index 0000000..a1f03c2
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/firewall/FirewallBinder.java
@@ -0,0 +1,95 @@
+/*
+ * 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.binder.firewall;
+
+import static java.lang.String.format;
+
+import java.util.List;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+
+import com.google.common.base.Strings;
+
+public abstract class FirewallBinder extends BaseProfitBricksRequestBinder<List<String>> {
+
+   protected final StringBuilder requestBuilder;
+
+   FirewallBinder() {
+      super("ids");
+      this.requestBuilder = new StringBuilder(128);
+   }
+
+   protected void bindListWithTag(List<String> ids, String tag) {
+      if (ids == null || ids.isEmpty() || Strings.isNullOrEmpty(tag))
+         return;
+      for (String id : ids)
+         requestBuilder.append(format("<%s>%s</%s>", tag, id, tag));
+   }
+
+   public static class ActivateFirewallRequestBinder extends FirewallBinder {
+
+      @Override
+      protected String createPayload(List<String> payload) {
+         requestBuilder.append("<ws:activateFirewalls>");
+         bindListWithTag(payload, "firewallIds");
+         requestBuilder.append("</ws:activateFirewalls>");
+
+         return requestBuilder.toString();
+      }
+
+   }
+
+   public static class DeactivateFirewallRequestBinder extends FirewallBinder {
+
+      @Override
+      protected String createPayload(List<String> payload) {
+         requestBuilder.append("<ws:deactivateFirewalls>");
+         bindListWithTag(payload, "firewallIds");
+         requestBuilder.append("</ws:deactivateFirewalls>");
+
+         return requestBuilder.toString();
+      }
+
+   }
+
+   public static class DeleteFirewallRequestBinder extends FirewallBinder {
+
+      @Override
+      protected String createPayload(List<String> payload) {
+         requestBuilder.append("<ws:deleteFirewalls>");
+         bindListWithTag(payload, "firewallIds");
+         requestBuilder.append("</ws:deleteFirewalls>");
+
+         return requestBuilder.toString();
+      }
+
+   }
+
+   public static class RemoveFirewallRuleRequestBinder extends FirewallBinder {
+
+      @Override
+      protected String createPayload(List<String> payload) {
+         requestBuilder.append("<ws:removeFirewallRules>");
+         bindListWithTag(payload, "firewallRuleIds");
+         requestBuilder.append("</ws:removeFirewallRules>");
+
+         return requestBuilder.toString();
+      }
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/CreateNicRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/CreateNicRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/CreateNicRequestBinder.java
new file mode 100644
index 0000000..f7dbdb3
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/CreateNicRequestBinder.java
@@ -0,0 +1,46 @@
+/*
+ * 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.binder.nic;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Nic;
+
+public class CreateNicRequestBinder extends BaseProfitBricksRequestBinder<Nic.Request.CreatePayload> {
+
+   private final StringBuilder requestBuilder;
+
+   CreateNicRequestBinder() {
+      super("nic");
+      this.requestBuilder = new StringBuilder(128 * 2);
+   }
+
+   @Override
+   protected String createPayload(Nic.Request.CreatePayload payload) {
+      requestBuilder.append("<ws:createNic>")
+              .append("<request>")
+              .append(formatIfNotEmpty("<ip>%s</ip>", payload.ip()))
+              .append(formatIfNotEmpty("<nicName>%s</nicName>", payload.name()))
+              .append(formatIfNotEmpty("<dhcpActive>%s</dhcpActive>", payload.dhcpActive()))
+              .append(format("<serverId>%s</serverId>", payload.serverId()))
+              .append(format("<lanId>%s</lanId>", payload.lanId()))
+              .append("</request>")
+              .append("</ws:createNic>");
+      return requestBuilder.toString();
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/SetInternetAccessBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/SetInternetAccessBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/SetInternetAccessBinder.java
new file mode 100644
index 0000000..acdc809
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/SetInternetAccessBinder.java
@@ -0,0 +1,42 @@
+/*
+ * 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.binder.nic;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Nic;
+
+import static java.lang.String.format;
+
+public class SetInternetAccessBinder extends BaseProfitBricksRequestBinder<Nic.Request.SetInternetAccessPayload> {
+
+   private final StringBuilder requestBuilder;
+
+   SetInternetAccessBinder() {
+      super("nic");
+      this.requestBuilder = new StringBuilder(128);
+   }
+
+   @Override
+   protected String createPayload(Nic.Request.SetInternetAccessPayload payload) {
+      requestBuilder.append("<ws:setInternetAccess>")
+              .append(format("<dataCenterId>%s</dataCenterId>", payload.dataCenterId()))
+              .append(format("<lanId>%s</lanId>", payload.lanId()))
+              .append(format("<internetAccess>%s</internetAccess>", payload.internetAccess()))
+              .append("</ws:setInternetAccess>");
+      return requestBuilder.toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/UpdateNicRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/UpdateNicRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/UpdateNicRequestBinder.java
new file mode 100644
index 0000000..f1e9d83
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/nic/UpdateNicRequestBinder.java
@@ -0,0 +1,46 @@
+/*
+ * 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.binder.nic;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Nic;
+
+import static java.lang.String.format;
+
+public class UpdateNicRequestBinder extends BaseProfitBricksRequestBinder<Nic.Request.UpdatePayload> {
+
+   private final StringBuilder requestBuilder;
+
+   UpdateNicRequestBinder() {
+      super("nic");
+      this.requestBuilder = new StringBuilder(128 * 2);
+   }
+
+   @Override
+   protected String createPayload(Nic.Request.UpdatePayload payload) {
+      requestBuilder.append("<ws:updateNic>")
+              .append("<request>")
+              .append(format("<nicId>%s</nicId>", payload.id()))
+              .append(formatIfNotEmpty("<ip>%s</ip>", payload.ip()))
+              .append(formatIfNotEmpty("<nicName>%s</nicName>", payload.name()))
+              .append(formatIfNotEmpty("<dhcpActive>%s</dhcpActive>", payload.dhcpActive()))
+              .append(formatIfNotEmpty("<lanId>%s</lanId>", payload.lanId()))
+              .append("</request>")
+              .append("</ws:updateNic>");
+      return requestBuilder.toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
index f573eb0..7a11009 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
@@ -23,5 +23,5 @@ package org.jclouds.profitbricks.compute.internal;
  */
 public enum ProvisioningStatusAware {
 
-   DATACENTER, SERVER, STORAGE;
+   DATACENTER, SERVER, STORAGE, NIC;
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
index 8a8a787..7606cac 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
@@ -26,8 +26,9 @@ import com.google.common.base.Predicate;
 /**
  * A custom predicate for waiting until a virtual resource satisfies the given expected status
  * <p>
- * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some cases, the API user gets
- * blocked from further requests, and will then need to contact tech support for api lock release.
+ * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some
+ * cases, the API user gets blocked from further requests, and will then need to contact tech support for api lock
+ * release.
  */
 public class ProvisioningStatusPollingPredicate implements Predicate<String> {
 
@@ -51,6 +52,8 @@ public class ProvisioningStatusPollingPredicate implements Predicate<String> {
             return expect == api.serverApi().getServer(input).state();
          case STORAGE:
             return expect == api.storageApi().getStorage(input).state();
+         case NIC:
+            return expect == api.nicApi().getNic(input).state();
          default:
             throw new IllegalArgumentException("Unknown domain '" + domain + "'");
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
new file mode 100644
index 0000000..626a4b1
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Firewall.java
@@ -0,0 +1,366 @@
+/*
+ * 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;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.jclouds.profitbricks.util.MacAddresses.isMacAddress;
+
+import com.google.auto.value.AutoValue;
+
+import java.util.List;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.profitbricks.domain.internal.FirewallRuleCommonProperties;
+
+import com.google.common.collect.ImmutableList;
+
+import autovalue.shaded.com.google.common.common.collect.Lists;
+import static com.google.common.net.InetAddresses.isInetAddress;
+
+@AutoValue
+public abstract class Firewall {
+
+   public enum Protocol {
+
+      TCP, UDP, ICMP, ANY, UNRECOGNIZED;
+
+      public static Protocol fromValue(String value) {
+         try {
+            return valueOf(value);
+         } catch (IllegalArgumentException e) {
+            return UNRECOGNIZED;
+         }
+      }
+   }
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract String nicId();
+
+   public abstract boolean active();
+
+   @Nullable
+   public abstract ProvisioningState state();
+
+   @Nullable
+   public abstract List<Rule> rules();
+
+   public static Firewall create(String id, String nicId, boolean active, ProvisioningState provisioningState,
+           List<Rule> rules) {
+      return new AutoValue_Firewall(id, nicId, active, provisioningState,
+              rules != null ? ImmutableList.copyOf(rules) : ImmutableList.<Rule>of());
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static final class Request {
+
+      public static AddRulePayload.Builder ruleAddingBuilder() {
+         return new AddRulePayload.Builder();
+      }
+
+      @AutoValue
+      public abstract static class AddRulePayload {
+
+         public abstract String nicId();
+
+         public abstract List<RuleWithIcmp> rules();
+
+         public static AddRulePayload create(String nicId, List<RuleWithIcmp> rules) {
+            return new AutoValue_Firewall_Request_AddRulePayload(nicId, rules);
+         }
+
+         public static class Builder {
+
+            private String nicId;
+            private List<RuleWithIcmp> rules = Lists.newArrayList();
+
+            public Builder nicId(String nicId) {
+               this.nicId = nicId;
+               return this;
+            }
+
+            public Builder rules(List<RuleWithIcmp> rules) {
+               this.rules = rules;
+               return this;
+            }
+
+            public RuleWithIcmp.Builder newRule() {
+               return new RuleWithIcmp.Builder(this);
+            }
+
+            public Builder addRule(RuleWithIcmp rule) {
+               this.rules.add(rule);
+               return this;
+            }
+
+            public AddRulePayload build() {
+               return AddRulePayload.create(nicId, rules);
+            }
+         }
+      }
+   }
+
+   public static class Builder {
+
+      private String id;
+      private String nicId;
+      private boolean active;
+
+      private ProvisioningState state;
+      private List<Rule> rules;
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder nicId(String nicId) {
+         this.nicId = nicId;
+         return this;
+      }
+
+      public Builder active(boolean active) {
+         this.active = active;
+         return this;
+      }
+
+      public Builder state(ProvisioningState state) {
+         this.state = state;
+         return this;
+      }
+
+      public Builder rules(List<Rule> firewallRules) {
+         this.rules = firewallRules;
+         return this;
+      }
+
+      public Builder fromFirewall(Firewall in) {
+         return this.id(in.id()).nicId(in.nicId()).active(in.active()).state(in.state())
+                 .rules(in.rules());
+      }
+
+      public Firewall build() {
+         return Firewall.create(id, nicId, active, state, rules);
+      }
+   }
+
+   public abstract static class RuleBuilder<B extends RuleBuilder, D extends FirewallRuleCommonProperties> {
+
+      protected String name;
+      protected Integer portRangeEnd;
+      protected Integer portRangeStart;
+      protected Protocol protocol;
+      protected String sourceIp;
+      protected String sourceMac;
+      protected String targetIp;
+
+      public B name(String name) {
+         this.name = name;
+         return self();
+      }
+
+      public B portRangeEnd(Integer portRangeEnd) {
+         this.portRangeEnd = portRangeEnd;
+         return self();
+      }
+
+      public B portRangeStart(Integer portRangeStart) {
+         this.portRangeStart = portRangeStart;
+         return self();
+      }
+
+      public B protocol(Protocol protocol) {
+         this.protocol = protocol;
+         return self();
+      }
+
+      public B sourceIp(String sourceIp) {
+         this.sourceIp = sourceIp;
+         return self();
+      }
+
+      public B sourceMac(String sourceMac) {
+         this.sourceMac = sourceMac;
+         return self();
+      }
+
+      public B targetIp(String targetIp) {
+         this.targetIp = targetIp;
+         return self();
+      }
+
+      public abstract B self();
+
+      public abstract D build();
+
+      protected void checkPortRange() {
+         checkArgument(!(portRangeEnd == null ^ portRangeStart == null), "Port range must be both present or null");
+         if (portRangeEnd != null) {
+            checkArgument(protocol == Protocol.TCP || protocol == Protocol.UDP, "Port range can only be set for TCP or UDP");
+            checkArgument(portRangeEnd > portRangeStart, "portRangeEnd must be greater than portRangeStart");
+            checkArgument(portRangeEnd >= 1 && portRangeEnd <= 65534, "Port range end must be 1 to 65534");
+            checkArgument(portRangeStart >= 1 && portRangeStart <= 65534, "Port range start must be 1 to 65534");
+         }
+      }
+
+      protected void checkMac() {
+         if (sourceMac != null)
+            checkArgument(isMacAddress(sourceMac), "Source MAC must match pattern 'aa:bb:cc:dd:ee:ff'");
+      }
+
+      protected void checkIp() {
+         if (sourceIp != null)
+            checkArgument(isInetAddress(sourceIp), "Source IP is invalid");
+         if (targetIp != null)
+            checkArgument(isInetAddress(targetIp), "Target IP is invalid");
+      }
+
+      protected void checkFields() {
+         checkMac();
+         checkPortRange();
+         checkIp();
+      }
+
+   }
+
+   @AutoValue
+   public abstract static class Rule implements FirewallRuleCommonProperties {
+
+      @Nullable
+      public abstract String id();
+
+      public static Rule create(String id, String name, Integer portRangeEnd, Integer portRangeStart,
+              Protocol protocol, String sourceIp, String sourceMac, String targetIp) {
+         return new AutoValue_Firewall_Rule(name, portRangeEnd, portRangeStart, protocol, sourceIp, sourceMac,
+                 targetIp, id);
+      }
+
+      public static Builder builder() {
+         return new Builder();
+      }
+
+      public static class Builder extends RuleBuilder<Builder, Rule> {
+
+         private String id;
+
+         public Builder id(String id) {
+            this.id = id;
+            return self();
+         }
+
+         @Override
+         public Builder self() {
+            return this;
+         }
+
+         @Override
+         public Rule build() {
+            checkFields();
+            return Rule.create(id, name, portRangeEnd, portRangeStart, protocol, sourceIp, sourceMac, targetIp);
+         }
+
+      }
+   }
+
+   @AutoValue
+   public abstract static class RuleWithIcmp implements FirewallRuleCommonProperties {
+
+      @Nullable
+      public abstract Integer icmpCode();
+
+      @Nullable
+      public abstract Integer icmpType();
+
+      public static RuleWithIcmp create(Integer icmpCode, Integer icmpType, String name, Integer portRangeEnd,
+              Integer portRangeStart, Protocol protocol, String sourceIp, String sourceMac, String targetIp) {
+         return new AutoValue_Firewall_RuleWithIcmp(name, portRangeEnd, portRangeStart, protocol, sourceIp, sourceMac,
+                 targetIp, icmpCode, icmpType);
+      }
+
+      public static Builder builder() {
+         return new Builder();
+      }
+
+      public static class Builder extends RuleBuilder<Builder, RuleWithIcmp> {
+
+         private Request.AddRulePayload.Builder parentBuilder;
+
+         private Integer icmpCode;
+         private Integer icmpType;
+
+         public Builder() {
+
+         }
+
+         private Builder(Request.AddRulePayload.Builder parentBuilder) {
+            this.parentBuilder = parentBuilder;
+         }
+
+         public Builder nextRule() {
+            this.parentBuilder.addRule(build());
+            return new Builder(parentBuilder);
+         }
+
+         public Request.AddRulePayload.Builder endRule() {
+            this.parentBuilder.addRule(build());
+            return parentBuilder;
+         }
+
+         public Builder icmpCode(Integer icmpCode) {
+            this.icmpCode = icmpCode;
+            return this;
+         }
+
+         public Builder icmpType(Integer icmpType) {
+            this.icmpType = icmpType;
+            return this;
+         }
+
+         @Override
+         public Builder self() {
+            return this;
+         }
+
+         @Override
+         public RuleWithIcmp build() {
+            checkFields();
+            return RuleWithIcmp.create(icmpCode, icmpType, name, portRangeEnd, portRangeStart, protocol,
+                    sourceIp, sourceMac, targetIp);
+         }
+
+         @Override
+         protected void checkFields() {
+            super.checkFields();
+            checkIcmp();
+         }
+
+         private void checkIcmp() {
+            if (icmpCode != null)
+               checkArgument(icmpCode >= 1 && icmpCode <= 254, "ICMP code must be 1 to 254");
+            if (icmpType != null)
+               checkArgument(icmpType >= 1 && icmpType <= 254, "ICMP type must be 1 to 254");
+            if (icmpCode != null || icmpType != null)
+               checkArgument(protocol == Protocol.ICMP, "ICMP code and types can only be set for ICMP protocol");
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
new file mode 100644
index 0000000..fc0de67
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Nic.java
@@ -0,0 +1,379 @@
+/*
+ * 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;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import autovalue.shaded.com.google.common.common.collect.Lists;
+
+import com.google.auto.value.AutoValue;
+
+import java.util.List;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.common.collect.ImmutableList;
+import static com.google.common.net.InetAddresses.isInetAddress;
+
+@AutoValue
+public abstract class Nic {
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract String name();
+
+   @Nullable
+   public abstract String dataCenterId();
+
+   public abstract int lanId();
+
+   public abstract boolean internetAccess();
+
+   @Nullable
+   public abstract String serverId();
+
+   @Nullable
+   public abstract List<String> ips();
+
+   @Nullable
+   public abstract String macAddress();
+
+   @Nullable
+   public abstract Firewall firewalls();
+
+   public abstract boolean dhcpActive();
+
+   @Nullable
+   public abstract String gatewayIp();
+
+   @Nullable
+   public abstract ProvisioningState state();
+
+   public static Nic create(String id, String name, String dataCenterId, int lanId, boolean internetAccess,
+           String serverId, List<String> ips, String macAddress, Firewall firewall, boolean dhcpActive,
+           String gatewayIp, ProvisioningState state) {
+      return new AutoValue_Nic(id, name, dataCenterId, lanId, internetAccess, serverId,
+              ips != null ? ImmutableList.copyOf(ips) : ImmutableList.<String>of(), macAddress,
+              firewall, dhcpActive, gatewayIp, state);
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return builder().fromNic(this);
+   }
+
+   private static void checkIp(String ip) {
+      if (ip != null)
+         checkArgument(isInetAddress(ip), "Invalid IP");
+   }
+
+   private static void checkIps(List<String> ips) {
+      for (String ip : ips)
+         checkIp(ip);
+   }
+
+   public static class Builder {
+
+      public String id;
+
+      public String name;
+
+      public String dataCenterId;
+
+      public int lanId;
+
+      public boolean internetAccess;
+
+      public String serverId;
+
+      @Nullable
+      public List<String> ips;
+
+      public String macAddress;
+
+      public Firewall firewall;
+
+      public boolean dhcpActive;
+
+      public String gatewayIp;
+
+      public ProvisioningState state;
+
+      public Builder() {
+         this.ips = Lists.newArrayList();
+      }
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder dataCenterId(String dataCenterId) {
+         this.dataCenterId = dataCenterId;
+         return this;
+      }
+
+      public Builder lanId(int lanId) {
+         this.lanId = lanId;
+         return this;
+      }
+
+      public Builder internetAccess(boolean internetAccess) {
+         this.internetAccess = internetAccess;
+         return this;
+      }
+
+      public Builder serverId(String serverId) {
+         this.serverId = serverId;
+         return this;
+      }
+
+      public Builder ips(List<String> ips) {
+         this.ips = ips;
+         return this;
+      }
+
+      public Builder ip(String ip) {
+         this.ips.add(ip);
+         return this;
+      }
+
+      public Builder macAddress(String macAddress) {
+         this.macAddress = macAddress;
+         return this;
+      }
+
+      public Builder dhcpActive(boolean dhcpActive) {
+         this.dhcpActive = dhcpActive;
+         return this;
+      }
+
+      public Builder gatewayIp(String gatewayIp) {
+         this.gatewayIp = gatewayIp;
+         return this;
+      }
+
+      public Builder state(ProvisioningState state) {
+         this.state = state;
+         return this;
+      }
+
+      public Builder firewall(Firewall firewall) {
+         this.firewall = firewall;
+         return this;
+      }
+
+      public Nic build() {
+         checkIps(ips);
+         return Nic.create(id, name, dataCenterId, lanId, internetAccess, serverId, ips,
+                 macAddress, firewall, dhcpActive, gatewayIp, state);
+      }
+
+      private Builder fromNic(Nic in) {
+         return this.id(in.id()).name(in.name()).lanId(in.lanId()).internetAccess(in.internetAccess())
+                 .serverId(in.serverId()).ips(in.ips()).macAddress(in.macAddress()).dhcpActive(in.dhcpActive())
+                 .gatewayIp(in.gatewayIp()).dataCenterId(dataCenterId);
+      }
+   }
+
+   public static final class Request {
+
+      public static CreatePayload.Builder creatingBuilder() {
+         return new CreatePayload.Builder();
+      }
+
+      public static UpdatePayload.Builder updatingBuilder() {
+         return new UpdatePayload.Builder();
+      }
+
+      public static SetInternetAccessPayload.Builder setInternetAccessBuilder() {
+         return new SetInternetAccessPayload.Builder();
+      }
+
+      @AutoValue
+      public abstract static class CreatePayload {
+
+         @Nullable
+         public abstract String ip();
+
+         @Nullable
+         public abstract String name();
+
+         @Nullable
+         public abstract Boolean dhcpActive();
+
+         public abstract String serverId();
+
+         public abstract int lanId();
+
+         public static CreatePayload create(String ip, String name, Boolean dhcpActive, String serverId, int lanId) {
+            return new AutoValue_Nic_Request_CreatePayload(ip, name, dhcpActive, serverId, lanId);
+         }
+
+         public static class Builder {
+
+            private String ip;
+            private String name;
+            private Boolean dhcpActive;
+            private String serverId;
+            private int lanId;
+
+            public Builder ip(String ip) {
+               this.ip = ip;
+               return this;
+            }
+
+            public Builder name(String name) {
+               this.name = name;
+               return this;
+            }
+
+            public Builder dhcpActive(Boolean dhcpActive) {
+               this.dhcpActive = dhcpActive;
+               return this;
+            }
+
+            public Builder serverId(String serverId) {
+               this.serverId = serverId;
+               return this;
+            }
+
+            public Builder lanId(int lanId) {
+               this.lanId = lanId;
+               return this;
+            }
+
+            public CreatePayload build() {
+               checkIp(ip);
+               return CreatePayload.create(ip, name, dhcpActive, serverId, lanId);
+            }
+
+         }
+
+      }
+
+      @AutoValue
+      public abstract static class UpdatePayload {
+
+         public abstract String id();
+
+         @Nullable
+         public abstract String ip();
+
+         @Nullable
+         public abstract String name();
+
+         @Nullable
+         public abstract Boolean dhcpActive();
+
+         public abstract int lanId();
+
+         public static UpdatePayload create(String id, String ip, String name, Boolean dhcpActive, int lanId) {
+            return new AutoValue_Nic_Request_UpdatePayload(id, ip, name, dhcpActive, lanId);
+         }
+
+         public static class Builder {
+
+            private String id;
+            private String ip;
+            private String name;
+            private Boolean dhcpActive;
+            private int lanId;
+
+            public Builder ip(String ip) {
+               this.ip = ip;
+               return this;
+            }
+
+            public Builder name(String name) {
+               this.name = name;
+               return this;
+            }
+
+            public Builder dhcpActive(Boolean dhcpActive) {
+               this.dhcpActive = dhcpActive;
+               return this;
+            }
+
+            public Builder lanId(int lanId) {
+               this.lanId = lanId;
+               return this;
+            }
+
+            public Builder id(String id) {
+               this.id = id;
+               return this;
+            }
+
+            public UpdatePayload build() {
+               checkIp(ip);
+               return UpdatePayload.create(id, ip, name, dhcpActive, lanId);
+            }
+         }
+      }
+
+      @AutoValue
+      public abstract static class SetInternetAccessPayload {
+
+         public abstract String dataCenterId();
+
+         public abstract int lanId();
+
+         public abstract boolean internetAccess();
+
+         public static SetInternetAccessPayload create(String dataCenterId, int lanId, boolean internetAccess) {
+            return new AutoValue_Nic_Request_SetInternetAccessPayload(dataCenterId, lanId, internetAccess);
+         }
+
+         public static class Builder {
+
+            public String dataCenterId;
+            public int lanId;
+            public boolean internetAccess;
+
+            public Builder dataCenterId(String dataCenterId) {
+               this.dataCenterId = dataCenterId;
+               return this;
+            }
+
+            public Builder lanId(int lanId) {
+               this.lanId = lanId;
+               return this;
+            }
+
+            public Builder internetAccess(boolean internetAccess) {
+               this.internetAccess = internetAccess;
+               return this;
+            }
+
+            public SetInternetAccessPayload build() {
+               return SetInternetAccessPayload.create(dataCenterId, lanId, internetAccess);
+            }
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
index 6149cfd..1074fcd 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
@@ -81,14 +81,17 @@ public abstract class Server implements ServerCommonProperties {
    @Nullable
    public abstract List<Storage> storages();
 
-//   public abstract List<Nic> nics();
+   @Nullable
+   public abstract List<Nic> nics();
+
    public static Server create(String id, String name, int cores, int ram, Boolean hasInternetAccess, ProvisioningState state,
            Status status, OsType osType, AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime,
-           List<Storage> storages, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug,
-           Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
+           List<Storage> storages, List<Nic> nics, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug,
+           Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
       return new AutoValue_Server(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug,
               cores, ram, id, name, hasInternetAccess, state, status, osType, availabilityZone, creationTime, lastModificationTime,
-              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList());
+              storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList(),
+              nics != null ? ImmutableList.copyOf(nics) : Lists.<Nic>newArrayList());
 
    }
 
@@ -174,6 +177,7 @@ public abstract class Server implements ServerCommonProperties {
       private Date lastModificationTime;
       private Boolean hasInternetAccess;
       private List<Storage> storages;
+      private List<Nic> nics;
 
       public DescribingBuilder id(String id) {
          this.id = id;
@@ -220,18 +224,25 @@ public abstract class Server implements ServerCommonProperties {
          return this;
       }
 
+      public DescribingBuilder nics(List<Nic> nics) {
+         this.nics = nics;
+         return this;
+      }
+
       @Override
       public Server build() {
          return Server.create(id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
-                 lastModificationTime, storages, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
+                 lastModificationTime, storages, nics, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug,
+                 discVirtioHotPlug, discVirtioHotUnPlug);
       }
 
       private DescribingBuilder fromServer(Server in) {
          return this.id(in.id()).cores(in.cores()).creationTime(in.creationTime()).hasInternetAccess(in.hasInternetAccess())
-                 .isCpuHotPlug(in.isCpuHotPlug()).isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
-                 .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug()).isRamHotPlug(in.isRamHotPlug())
-                 .lastModificationTime(in.lastModificationTime()).name(in.name()).osType(in.osType()).ram(in.ram()).state(in.state())
-                 .status(in.status()).storages(in.storages());
+                 .isCpuHotPlug(in.isCpuHotPlug()).isDiscVirtioHotPlug(in.isDiscVirtioHotPlug())
+                 .isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug()).isNicHotPlug(in.isNicHotPlug())
+                 .isNicHotUnPlug(in.isNicHotUnPlug()).isRamHotPlug(in.isRamHotPlug())
+                 .lastModificationTime(in.lastModificationTime()).name(in.name()).osType(in.osType()).ram(in.ram())
+                 .state(in.state()).status(in.status()).storages(in.storages()).nics(in.nics());
       }
 
       @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
index 6dcaf25..827217b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Storage.java
@@ -58,6 +58,7 @@ public abstract class Storage {
    @Nullable
    public abstract Date lastModificationTime();
 
+   @Nullable
    public abstract ProvisioningState state();
 
    @Nullable

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/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
new file mode 100644
index 0000000..c607e38
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/FirewallRuleCommonProperties.java
@@ -0,0 +1,44 @@
+/*
+ * 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/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
index a9c6143..f660730 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
@@ -58,7 +58,8 @@ public interface DataCenterApi {
 
    /**
     * @param identifier Data Center identifier
-    * @return Returns information about an existing virtual data center's state and configuration or <code>null</code> if it doesn't exist.
+    * @return Returns information about an existing virtual data center's state and configuration or <code>null</code>
+    * if it doesn't exist.
     */
    @POST
    @Named("datacenter:get")
@@ -68,8 +69,8 @@ public interface DataCenterApi {
    DataCenter getDataCenter(@PayloadParam("id") String identifier);
 
    /**
-    * This is a lightweight function for polling the current provisioning state of the Virtual Data Center. It is recommended to use this
-    * function for large Virtual Data Centers to query request results.
+    * This is a lightweight function for polling the current provisioning state of the Virtual Data Center. It is
+    * recommended to use this function for large Virtual Data Centers to query request results.
     * <p>
     * @param identifier Data Center identifier
     */
@@ -118,8 +119,9 @@ public interface DataCenterApi {
    DataCenter clearDataCenter(@PayloadParam("id") String identifier);
 
    /**
-    * Deletes an Virtual Data Center. If a previous request on the target data center is still in progress, the data center is going to be
-    * deleted after this request has been completed. Once a Data Center has been deleted, no further request can be performed on it.
+    * Deletes an Virtual Data Center. If a previous request on the target data center is still in progress, the data
+    * center is going to be deleted after this request has been completed. Once a Data Center has been deleted, no
+    * further request can be performed on it.
     * <p>
     * @param identifier Identifier of the virtual data center
     * @return Returns a boolean indicating whether delete operation was made

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/FirewallApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/FirewallApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/FirewallApi.java
new file mode 100644
index 0000000..f0aefb9
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/FirewallApi.java
@@ -0,0 +1,93 @@
+/*
+ * 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.features;
+
+import java.util.List;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.binder.firewall.AddFirewallRuleToNicRequestBinder;
+import org.jclouds.profitbricks.binder.firewall.FirewallBinder.ActivateFirewallRequestBinder;
+import org.jclouds.profitbricks.binder.firewall.FirewallBinder.DeactivateFirewallRequestBinder;
+import org.jclouds.profitbricks.binder.firewall.FirewallBinder.DeleteFirewallRequestBinder;
+import org.jclouds.profitbricks.binder.firewall.FirewallBinder.RemoveFirewallRuleRequestBinder;
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.firewall.FirewallListResponseHandler;
+import org.jclouds.profitbricks.http.parser.firewall.FirewallResponseHandler;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+import org.jclouds.rest.annotations.Fallback;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface FirewallApi {
+
+   @POST
+   @Named("firewall:get")
+   @Payload("<ws:getFirewall><firewallId>{id}</firewallId></ws:getFirewall>")
+   @XMLResponseParser(FirewallResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Firewall getFirewall(@PayloadParam("id") String identifier);
+
+   @POST
+   @Named("firewall:getall")
+   @Payload("<ws:getAllFirewalls/>")
+   @XMLResponseParser(FirewallListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<Firewall> getAllFirewalls();
+
+   @POST
+   @Named("firewall:addrule")
+   @MapBinder(AddFirewallRuleToNicRequestBinder.class)
+   @XMLResponseParser(FirewallResponseHandler.class)
+   Firewall addFirewallRuleToNic(@PayloadParam("firewall") Firewall.Request.AddRulePayload payload);
+
+   @POST
+   @Named("firewall:removerule")
+   @MapBinder(RemoveFirewallRuleRequestBinder.class)
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean removeFirewallRules(@PayloadParam("ids") List<String> firewallRuleIds);
+
+   @POST
+   @Named("firewall:activate")
+   @MapBinder(ActivateFirewallRequestBinder.class)
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean activateFirewall(@PayloadParam("ids") List<String> firewallIds);
+
+   @POST
+   @Named("firewall:activate")
+   @MapBinder(DeactivateFirewallRequestBinder.class)
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deactivateFirewall(@PayloadParam("ids") List<String> firewallIds);
+
+   @POST
+   @Named("firewall:activate")
+   @MapBinder(DeleteFirewallRequestBinder.class)
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteFirewall(@PayloadParam("ids") List<String> firewallIds);
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java
new file mode 100644
index 0000000..57e425f
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/NicApi.java
@@ -0,0 +1,84 @@
+/*
+ * 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.features;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.binder.nic.CreateNicRequestBinder;
+import org.jclouds.profitbricks.binder.nic.SetInternetAccessBinder;
+import org.jclouds.profitbricks.binder.nic.UpdateNicRequestBinder;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.nic.NicListResponseHandler;
+import org.jclouds.profitbricks.http.parser.nic.NicResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.PayloadParam;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.POST;
+import java.util.List;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface NicApi {
+
+   @POST
+   @Named("nics:getall")
+   @Payload("<ws:getAllNic/>")
+   @XMLResponseParser(NicListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<Nic> getAllNics();
+
+   @POST
+   @Named("nic:create")
+   @MapBinder(CreateNicRequestBinder.class)
+   @XMLResponseParser(NicResponseHandler.class)
+   Nic createNic(@PayloadParam("nic") Nic.Request.CreatePayload payload);
+
+   @POST
+   @Named("nic:get")
+   @Payload("<ws:getNic><nicId>{id}</nicId></ws:getNic>")
+   @XMLResponseParser(NicResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Nic getNic(@PayloadParam("id") String identifier);
+
+   @POST
+   @Named("nic:update")
+   @MapBinder(UpdateNicRequestBinder.class)
+   @XMLResponseParser(NicResponseHandler.class)
+   Nic updateNic(@PayloadParam("nic") Nic.Request.UpdatePayload payload);
+
+   @POST
+   @Named("nic:setInternetAccess")
+   @MapBinder(SetInternetAccessBinder.class)
+   @XMLResponseParser(NicResponseHandler.class)
+   Nic setInternetAccess(@PayloadParam("nic") Nic.Request.SetInternetAccessPayload payload);
+
+   @POST
+   @Named("nic:delete")
+   @Payload("<ws:deleteNic><nicId>{id}</nicId></ws:deleteNic>")
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteNic(@PayloadParam("id") String id);
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
index 34445da..344797d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
@@ -45,7 +45,8 @@ import org.jclouds.rest.annotations.XMLResponseParser;
 public interface ServerApi {
 
    /**
-    * @return Returns information about all virtual server, such as configuration, provisioning status, power status, etc.
+    * @return Returns information about all virtual server, such as configuration, provisioning status, power status,
+    * etc.
     */
    @POST
    @Named("server:getall")
@@ -88,12 +89,13 @@ public interface ServerApi {
     * <ul>
     * <li>Server will be forcefully powered off. Any unsaved data may be lost! </li>
     * <li>Billing for this server will be stopped </li>
-    * <li>When restarting the server a new public IP gets assigned, alternatively, you can reserve IP addresses, see reservation of public
-    * IP blocks</li>
+    * <li>When restarting the server a new public IP gets assigned, alternatively, you can reserve IP addresses, see
+    * reservation of public IP blocks</li>
     * </ul>
     *
-    * A graceful stop of a server is not possible through the ProfitBricks API. We recommend to access and execute the command on the
-    * virtual server directly. Once the server was shutdown you still can use the "stopServer" method that will stop billing.
+    * A graceful stop of a server is not possible through the ProfitBricks API. We recommend to access and execute the
+    * command on the virtual server directly. Once the server was shutdown you still can use the "stopServer" method
+    * that will stop billing.
     *
     * @param id Identifier of the target virtual server
     * @return Identifier of current request
@@ -112,8 +114,8 @@ public interface ServerApi {
     * </ul>
     * <b>Graceful REBOOT</b>
     *
-    * A graceful reboot of a server is not possible through the ProfitBricks API. We recommend to access and execute the command on the
-    * virtual server directly.
+    * A graceful reboot of a server is not possible through the ProfitBricks API. We recommend to access and execute the
+    * command on the virtual server directly.
     *
     * @param id Identifier of the target virtual server
     * @return Identifier of current request
@@ -125,8 +127,8 @@ public interface ServerApi {
    String resetServer(@PayloadParam("id") String id);
 
    /**
-    * Creates a Virtual Server within an existing data center. Parameters can be specified to set up a boot device and connect the server to
-    * an existing LAN or the Internet.
+    * Creates a Virtual Server within an existing data center. Parameters can be specified to set up a boot device and
+    * connect the server to an existing LAN or the Internet.
     *
     * @param payload Payload
     * @return serverId of the created server

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/StorageApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/StorageApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/StorageApi.java
index f5d3577..0589af6 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/StorageApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/StorageApi.java
@@ -71,8 +71,8 @@ public interface StorageApi {
    Storage getStorage(@PayloadParam("id") String id);
 
    /**
-    * Creates a virtual storage within an existing virtual data center. Additional parameters can be specified, e.g. for assigning a HDD
-    * image to the storage.
+    * Creates a virtual storage within an existing virtual data center. Additional parameters can be specified, e.g. for
+    * assigning a HDD image to the storage.
     *
     * @param payload Payload
     * @return storageId of the created storage
@@ -84,9 +84,10 @@ public interface StorageApi {
    String createStorage(@PayloadParam("storage") Storage.Request.CreatePayload payload);
 
    /**
-    * Updates parameters of an existing virtual storage device. It is possible to increase the storage size without reboot of an already
-    * provisioned storage. The additional capacity is not added to any partition. You have to partition the storage afterwards. Vice versa,
-    * it is not possible to decrease the storage size of an already provisioned storage.
+    * Updates parameters of an existing virtual storage device. It is possible to increase the storage size without
+    * reboot of an already provisioned storage. The additional capacity is not added to any partition. You have to
+    * partition the storage afterwards. Vice versa, it is not possible to decrease the storage size of an already
+    * provisioned storage.
     *
     * @param payload Payload
     * @return Identifier of current request

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
index b818d3d..00ca238 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
@@ -64,10 +64,10 @@ public class ResponseStatusFromPayloadHttpCommandExecutorService extends JavaUrl
 
    @Inject
    ResponseStatusFromPayloadHttpCommandExecutorService(HttpUtils utils, ContentMetadataCodec contentMetadataCodec,
-	   DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler,
-	   DelegatingErrorHandler errorHandler, HttpWire wire, @Named("untrusted") HostnameVerifier verifier,
-	   @Named("untrusted") Supplier<SSLContext> untrustedSSLContextProvider, Function<URI, Proxy> proxyForURI,
-	   ParseSax<ServiceFault> faultHandler) {
+           DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler,
+           DelegatingErrorHandler errorHandler, HttpWire wire, @Named("untrusted") HostnameVerifier verifier,
+           @Named("untrusted") Supplier<SSLContext> untrustedSSLContextProvider, Function<URI, Proxy> proxyForURI,
+           ParseSax<ServiceFault> faultHandler) {
       super(utils, contentMetadataCodec, retryHandler, ioRetryHandler, errorHandler, wire, verifier, untrustedSSLContextProvider, proxyForURI);
       this.faultHandler = faultHandler;
    }
@@ -78,39 +78,39 @@ public class ResponseStatusFromPayloadHttpCommandExecutorService extends JavaUrl
       HttpResponse.Builder<?> responseBuilder = originalResponse.toBuilder();
 
       if (hasServerError(originalResponse) && hasPayload(originalResponse)) {
-	 // As we need to read the response body to determine if there are errors, but we may need to process the body
-	 // again later in the response parsers if everything is OK, we buffer the body into an InputStream we can reset
-	 InputStream in = null;
-	 InputStream originalInputStream = originalResponse.getPayload().openStream();
-
-	 if (originalInputStream instanceof ByteArrayInputStream)
-	    in = originalInputStream;
-	 else
-	    try {
-	       in = new ByteArrayInputStream(ByteStreams.toByteArray(originalInputStream));
-	    } finally {
-	       closeQuietly(originalInputStream);
-	    }
-	 try {
-	    if (isSoapPayload(in)) {
-	       ServiceFault fault = faultHandler.parse(in);
-	       if (fault != null)
-		  responseBuilder
-			  .statusCode(fault.httpCode())
-			  .message(fault.message());
-	    }
-	 } catch (Exception ex) {
-	    // ignore
-	 } finally {
-	    // Reset the input stream and set the payload, so it can be read again
-	    // by the response and error parsers
-	    if (in != null) {
-	       in.reset();
-	       Payload payload = Payloads.newInputStreamPayload(in);
-	       contentMetadataCodec.fromHeaders(payload.getContentMetadata(), originalResponse.getHeaders());
-	       responseBuilder.payload(payload);
-	    }
-	 }
+         // As we need to read the response body to determine if there are errors, but we may need to process the body
+         // again later in the response parsers if everything is OK, we buffer the body into an InputStream we can reset
+         InputStream in = null;
+         InputStream originalInputStream = originalResponse.getPayload().openStream();
+
+         if (originalInputStream instanceof ByteArrayInputStream)
+            in = originalInputStream;
+         else
+            try {
+               in = new ByteArrayInputStream(ByteStreams.toByteArray(originalInputStream));
+            } finally {
+               closeQuietly(originalInputStream);
+            }
+         try {
+            if (isSoapPayload(in)) {
+               ServiceFault fault = faultHandler.parse(in);
+               if (fault != null)
+                  responseBuilder
+                          .statusCode(fault.httpCode())
+                          .message(fault.message());
+            }
+         } catch (Exception ex) {
+            // ignore
+         } finally {
+            // Reset the input stream and set the payload, so it can be read again
+            // by the response and error parsers
+            if (in != null) {
+               in.reset();
+               Payload payload = Payloads.newInputStreamPayload(in);
+               contentMetadataCodec.fromHeaders(payload.getContentMetadata(), originalResponse.getHeaders());
+               responseBuilder.payload(payload);
+            }
+         }
       }
 
       return responseBuilder.build();
@@ -131,7 +131,7 @@ public class ResponseStatusFromPayloadHttpCommandExecutorService extends JavaUrl
 
       is.read(bytes, 0, size);
       for (int i = 0; i < size;)
-	 chars[i] = (char) (bytes[i++] & 0xff);
+         chars[i] = (char) (bytes[i++] & 0xff);
 
       is.reset(); // throws premature end of file w/o this
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
index 6a9933f..3520b37 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
@@ -56,6 +56,10 @@ public abstract class BaseProfitBricksResponseHandler<T> extends ParseSax.Handle
       strBuilder.setLength(0);
    }
 
+   public void reset() {
+
+   }
+
    @Override
    public abstract void endElement(String uri, String localName, String qName) throws SAXException;
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
index d44c880..3e833e5 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
@@ -16,37 +16,29 @@
  */
 package org.jclouds.profitbricks.http.parser.datacenter;
 
-import java.util.List;
-
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Location;
 import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.profitbricks.domain.Server;
-import org.jclouds.profitbricks.domain.Storage;
-import org.jclouds.profitbricks.http.parser.server.ServerInfoResponseHandler;
-import org.jclouds.profitbricks.http.parser.storage.StorageInfoResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerListResponseHandler;
+import org.jclouds.profitbricks.http.parser.storage.StorageListResponseHandler;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
-import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
 public class DataCenterInfoResponseHandler extends BaseDataCenterResponseHandler<DataCenter> {
 
-   private final ServerInfoResponseHandler serverInfoResponseHandler;
-   private final StorageInfoResponseHandler storageInfoResponseHandler;
-
-   private final List<Server> servers = Lists.newArrayList();
-   private final List<Storage> storages = Lists.newArrayList();
+   private final ServerListResponseHandler serverListResponseHandler;
+   private final StorageListResponseHandler storageListResponseHandler;
 
    private boolean done = false;
    private boolean useServerParser = false;
    private boolean useStorageParser = false;
 
    @Inject
-   DataCenterInfoResponseHandler(ServerInfoResponseHandler serverInfoResponseHandler, StorageInfoResponseHandler storageInforResponseHandler) {
-      this.serverInfoResponseHandler = serverInfoResponseHandler;
-      this.storageInfoResponseHandler = storageInforResponseHandler;
+   DataCenterInfoResponseHandler(ServerListResponseHandler serverListResponseHandler, StorageListResponseHandler storageListResponseHandler) {
+      this.serverListResponseHandler = serverListResponseHandler;
+      this.storageListResponseHandler = storageListResponseHandler;
    }
 
    @Override
@@ -55,6 +47,13 @@ public class DataCenterInfoResponseHandler extends BaseDataCenterResponseHandler
          useServerParser = true;
       else if ("storages".equals(qName))
          useStorageParser = true;
+
+      if (useServerParser)
+         serverListResponseHandler.startElement(uri, localName, qName, attributes);
+      else if (useStorageParser)
+         storageListResponseHandler.startElement(uri, localName, qName, attributes);
+      else
+         super.startElement(uri, localName, qName, attributes);
    }
 
    @Override
@@ -71,9 +70,9 @@ public class DataCenterInfoResponseHandler extends BaseDataCenterResponseHandler
    @Override
    public void characters(char[] ch, int start, int length) {
       if (useServerParser)
-         serverInfoResponseHandler.characters(ch, start, length);
+         serverListResponseHandler.characters(ch, start, length);
       else if (useStorageParser)
-         storageInfoResponseHandler.characters(ch, start, length);
+         storageListResponseHandler.characters(ch, start, length);
       else
          super.characters(ch, start, length);
    }
@@ -83,27 +82,24 @@ public class DataCenterInfoResponseHandler extends BaseDataCenterResponseHandler
       if (done)
          return;
 
-      if ("servers".equals(qName)) {
-         useServerParser = false;
-         servers.add(serverInfoResponseHandler.getResult());
-      } else if ("storages".equals(qName)) {
-         useStorageParser = false;
-         storages.add(storageInfoResponseHandler.getResult());
-      }
-
       if (useServerParser)
-         serverInfoResponseHandler.endElement(uri, localName, qName);
+         serverListResponseHandler.endElement(uri, localName, qName);
       else if (useStorageParser)
-         storageInfoResponseHandler.endElement(uri, localName, qName);
+         storageListResponseHandler.endElement(uri, localName, qName);
       else {
          setPropertyOnEndTag(qName);
          if ("return".equals(qName)) {
             done = true;
-            builder.servers(servers);
-            builder.storages(storages);
+            builder.servers(serverListResponseHandler.getResult());
+            builder.storages(storageListResponseHandler.getResult());
          }
          clearTextBuffer();
       }
+
+      if ("servers".equals(qName))
+         useServerParser = false;
+      else if ("storages".equals(qName))
+         useStorageParser = false;
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/BaseFirewallResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/BaseFirewallResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/BaseFirewallResponseHandler.java
new file mode 100644
index 0000000..310156b
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/BaseFirewallResponseHandler.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.firewall;
+
+import com.google.inject.Inject;
+
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.jclouds.profitbricks.http.parser.firewall.rule.FirewallRuleListResponseHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public abstract class BaseFirewallResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected final FirewallRuleListResponseHandler firewallRuleListResponseHandler;
+
+   protected boolean useFirewallRuleParser = false;
+   protected Firewall.Builder builder;
+
+   @Inject
+   BaseFirewallResponseHandler(FirewallRuleListResponseHandler firewallRuleListResponseHandler) {
+      this.builder = Firewall.builder();
+      this.firewallRuleListResponseHandler = firewallRuleListResponseHandler;
+   }
+
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+      if ("firewallRules".equals(qName))
+         useFirewallRuleParser = true;
+
+      if (useFirewallRuleParser)
+         firewallRuleListResponseHandler.startElement(uri, localName, qName, attributes);
+   }
+
+   @Override
+   public void characters(char[] ch, int start, int length) {
+      if (useFirewallRuleParser)
+         firewallRuleListResponseHandler.characters(ch, start, length);
+      else
+         super.characters(ch, start, length);
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("firewallId".equals(qName))
+         builder.id(textToStringValue());
+      else if ("active".equals(qName))
+         builder.active(textToBooleanValue());
+      else if ("nicId".equals(qName))
+         builder.nicId(textToStringValue());
+      else if ("provisioningState".equals(qName))
+         builder.state(ProvisioningState.fromValue(textToStringValue()));
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/de2e5e01/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
new file mode 100644
index 0000000..6d8b292
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.firewall;
+
+import autovalue.shaded.com.google.common.common.collect.Lists;
+
+import com.google.inject.Inject;
+
+import java.util.List;
+
+import org.jclouds.profitbricks.domain.Firewall;
+import org.jclouds.profitbricks.http.parser.firewall.rule.FirewallRuleListResponseHandler;
+import org.xml.sax.SAXException;
+
+public class FirewallListResponseHandler extends BaseFirewallResponseHandler<List<Firewall>> {
+
+   private final List<Firewall> firewalls;
+
+   @Inject
+   FirewallListResponseHandler(FirewallRuleListResponseHandler firewallRuleListResponseHandler) {
+      super(firewallRuleListResponseHandler);
+      this.firewalls = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (useFirewallRuleParser)
+         firewallRuleListResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName)) {
+            firewalls.add(builder
+                    .rules(firewallRuleListResponseHandler.getResult())
+                    .build());
+            firewallRuleListResponseHandler.reset();
+            builder = Firewall.builder();
+         }
+         clearTextBuffer();
+      }
+
+      if ("firewallRules".equals(qName))
+         useFirewallRuleParser = false;
+   }
+
+   @Override
+   public List<Firewall> getResult() {
+      return firewalls;
+   }
+
+}


[15/35] jclouds git commit: Profitbricks IpBlock API

Posted by de...@apache.org.
Profitbricks IpBlock API

Conflicts:
	profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java


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

Branch: refs/heads/master
Commit: af93f3b68f9c19ac504719b702d0425eb1583f46
Parents: 36d499b
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Tue Mar 3 22:46:34 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Sun Mar 8 21:15:43 2015 +0100

----------------------------------------------------------------------
 .../jclouds/profitbricks/ProfitBricksApi.java   |   5 +
 .../jclouds/profitbricks/domain/IpBlock.java    | 125 ++++++++++++
 .../profitbricks/features/IpBlockApi.java       |  80 ++++++++
 .../ipblock/BaseIpBlockResponseHandler.java     |  68 +++++++
 .../ipblock/IpBlockListResponseHandler.java     |  62 ++++++
 .../parser/ipblock/IpBlockResponseHandler.java  |  64 ++++++
 .../publicip/BasePublicIpResponseHandler.java   |  38 ++++
 .../publicip/PublicIpListResponseHandler.java   |  51 +++++
 .../features/IpBlockApiLiveTest.java            |  92 +++++++++
 .../features/IpBlockApiMockTest.java            | 200 +++++++++++++++++++
 .../ipblock/IpBlockListResponseHandlerTest.java |  77 +++++++
 .../ipblock/IpBlockResponseHandlerTest.java     |  63 ++++++
 .../test/resources/ipblock/ipblock-addtonic.xml |  12 ++
 .../test/resources/ipblock/ipblock-release.xml  |  10 +
 .../resources/ipblock/ipblock-removefromnic.xml |  12 ++
 .../test/resources/ipblock/ipblock-reserve.xml  |  13 ++
 .../src/test/resources/ipblock/ipblock.xml      |  18 ++
 .../src/test/resources/ipblock/ipblocks.xml     |  30 +++
 18 files changed, 1020 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
index af7a31d..34309bf 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -20,6 +20,7 @@ import java.io.Closeable;
 import org.jclouds.profitbricks.features.DataCenterApi;
 import org.jclouds.profitbricks.features.FirewallApi;
 import org.jclouds.profitbricks.features.ImageApi;
+import org.jclouds.profitbricks.features.IpBlockApi;
 import org.jclouds.profitbricks.features.NicApi;
 import org.jclouds.profitbricks.features.ServerApi;
 import org.jclouds.profitbricks.features.SnapshotApi;
@@ -48,4 +49,8 @@ public interface ProfitBricksApi extends Closeable {
 
    @Delegate
    SnapshotApi snapshotApi();
+
+   @Delegate
+   IpBlockApi ipBlockApi();
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
new file mode 100644
index 0000000..47741ff
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/IpBlock.java
@@ -0,0 +1,125 @@
+/*
+ * 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;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.jclouds.javax.annotation.Nullable;
+
+@AutoValue
+public abstract class IpBlock {
+
+   public abstract String id();
+
+   public abstract Location location();
+
+   public abstract List<PublicIp> publicIps();
+
+   public abstract List<String> ips();
+
+   public static IpBlock create(String id, Location location, List<PublicIp> publicIps, List<String> ips) {
+      return new AutoValue_IpBlock(id, location, publicIps, ips != null ? ImmutableList.copyOf(ips) : ImmutableList.<String>of());
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static final class Builder {
+
+      private String id;
+      private Location location;
+      private List<PublicIp> publicIps;
+      private List<String> ips;
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder location(Location location) {
+         this.location = location;
+         return this;
+      }
+
+      public Builder publicIps(List<PublicIp> publicIps) {
+         this.publicIps = publicIps;
+         return this;
+      }
+
+      public Builder ips(List<String> ips) {
+         this.ips = ips;
+         return this;
+      }
+
+      public IpBlock build() {
+         return IpBlock.create(id, location, publicIps, ips);
+      }
+
+      public Builder fromIpBlock(IpBlock in) {
+         return this.id(in.id()).location(in.location()).publicIps(in.publicIps()).ips(in.ips());
+      }
+
+   }
+
+   @AutoValue
+   public abstract static class PublicIp {
+
+      public abstract String ip();
+
+      @Nullable
+      public abstract String nicId();
+
+      public static PublicIp create(String ip, String nicId) {
+         return new AutoValue_IpBlock_PublicIp(ip, nicId);
+      }
+
+      public static Builder builder() {
+         return new Builder();
+      }
+
+      public Builder toBuilder() {
+         return builder().fromPublicIp(this);
+      }
+
+      public static final class Builder {
+
+         private String ip;
+         private String nicId;
+
+         public Builder ip(String ip) {
+            this.ip = ip;
+            return this;
+         }
+
+         public Builder nicId(String nicId) {
+            this.nicId = nicId;
+            return this;
+         }
+
+         public PublicIp build() {
+            return PublicIp.create(ip, nicId);
+         }
+
+         public Builder fromPublicIp(PublicIp in) {
+            return this.ip(in.ip()).nicId(in.nicId());
+         }
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java
new file mode 100644
index 0000000..a81293e
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/IpBlockApi.java
@@ -0,0 +1,80 @@
+/*
+ * 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.features;
+
+import java.util.List;
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.jclouds.Fallbacks;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.ipblock.IpBlockListResponseHandler;
+import org.jclouds.profitbricks.http.parser.ipblock.IpBlockResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface IpBlockApi {
+
+   @POST
+   @Named("publicipblock:get")
+   @Payload("<ws:getPublicIpBlock><blockId>{id}</blockId></ws:getPublicIpBlock>")
+   @XMLResponseParser(IpBlockResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   IpBlock getIpBlock(@PayloadParam("id") String identifier);
+
+   @POST
+   @Named("publicipblock:getall")
+   @Payload("<ws:getAllPublicIpBlocks />")
+   @XMLResponseParser(IpBlockListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<IpBlock> getAllIpBlock();
+
+   @POST
+   @Named("publicipblock:reserve")
+   @Payload("<ws:reservePublicIpBlock><request><blockSize>{blockSize}</blockSize><location>{location}</location></request></ws:reservePublicIpBlock>")
+   @XMLResponseParser(IpBlockResponseHandler.class)
+   IpBlock reservePublicIpBlock(@PayloadParam("blockSize") String blockSize, @PayloadParam("location") String location);
+
+   @POST
+   @Named("publicipblock:addip")
+   @Payload("<ws:addPublicIpToNic><ip>{ip}</ip><nicId>{nicid}</nicId></ws:addPublicIpToNic>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String addPublicIpToNic(@PayloadParam("ip") String ip, @PayloadParam("nicid") String nicid);
+
+   @POST
+   @Named("publicipblock:removeip")
+   @Payload("<ws:removePublicIpFromNic><ip>{ip}</ip><nicId>{nicid}</nicId></ws:removePublicIpFromNic>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String removePublicIpFromNic(@PayloadParam("ip") String ip, @PayloadParam("nicid") String nicid);
+
+   @POST
+   @Named("publicipblock:releaseblock")
+   @Payload("<ws:releasePublicIpBlock><blockId>{blockid}</blockId></ws:releasePublicIpBlock>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String releasePublicIpBlock(@PayloadParam("blockid") String blockid);
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/BaseIpBlockResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/BaseIpBlockResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/BaseIpBlockResponseHandler.java
new file mode 100644
index 0000000..a4af29f
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/BaseIpBlockResponseHandler.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.ipblock;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.jclouds.profitbricks.http.parser.publicip.PublicIpListResponseHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public abstract class BaseIpBlockResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected final PublicIpListResponseHandler publicIpListResponseHandler;
+   protected final List<IpBlock.PublicIp> publicIps = Lists.newArrayList();
+   protected List<String> ips;
+
+   protected IpBlock.Builder builder;
+   protected boolean usePublicIpListParser = false;
+
+   BaseIpBlockResponseHandler(PublicIpListResponseHandler publicIpListResponseHandler) {
+      this.builder = IpBlock.builder();
+      this.publicIpListResponseHandler = publicIpListResponseHandler;
+      ips = Lists.newArrayList();
+   }
+
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+      if ("publicIps".equals(qName))
+         usePublicIpListParser = true;
+      if (usePublicIpListParser)
+         publicIpListResponseHandler.startElement(uri, localName, qName, attributes);
+   }
+
+   @Override
+   public void characters(char[] ch, int start, int length) {
+      if (usePublicIpListParser)
+         publicIpListResponseHandler.characters(ch, start, length);
+      else
+         super.characters(ch, start, length);
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("blockId".equals(qName))
+         builder.id(textToStringValue());
+      else if ("location".equals(qName))
+         builder.location(Location.fromId(textToStringValue()));
+      else if ("ips".equals(qName))
+         ips.add(textToStringValue());
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
new file mode 100644
index 0000000..c56f0ea
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandler.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.ipblock;
+
+import autovalue.shaded.com.google.common.common.collect.Lists;
+import com.google.inject.Inject;
+import java.util.List;
+import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.http.parser.publicip.PublicIpListResponseHandler;
+import org.xml.sax.SAXException;
+
+public class IpBlockListResponseHandler extends BaseIpBlockResponseHandler<List<IpBlock>> {
+
+   private final List<IpBlock> ipBlocks;
+
+   @Inject
+   IpBlockListResponseHandler(PublicIpListResponseHandler publicIpListResponseHandler) {
+      super(publicIpListResponseHandler);
+      ipBlocks = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (usePublicIpListParser)
+         publicIpListResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName)) {
+            ipBlocks.add(builder
+                    .publicIps(publicIpListResponseHandler.getResult())
+                    .build());
+            publicIpListResponseHandler.reset();
+            builder = IpBlock.builder();
+         }
+         clearTextBuffer();
+      }
+
+      if ("publicIps".equals(qName))
+         usePublicIpListParser = false;
+
+   }
+
+   @Override
+   public List<IpBlock> getResult() {
+      return ipBlocks;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandler.java
new file mode 100644
index 0000000..307db14
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandler.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.ipblock;
+
+import com.google.inject.Inject;
+import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.http.parser.publicip.PublicIpListResponseHandler;
+import org.xml.sax.SAXException;
+
+public class IpBlockResponseHandler extends BaseIpBlockResponseHandler<IpBlock> {
+
+   private boolean done = false;
+
+   @Inject
+   IpBlockResponseHandler(PublicIpListResponseHandler publicIpListResponseHandler) {
+      super(publicIpListResponseHandler);
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
+         return;
+
+      if (usePublicIpListParser)
+         publicIpListResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName)) {
+            done = true;
+            builder.publicIps(publicIpListResponseHandler.getResult());
+            builder.ips(ips);
+         }
+         clearTextBuffer();
+      }
+
+      if ("publicIps".equals(qName))
+         usePublicIpListParser = false;
+   }
+
+   @Override
+   public void reset() {
+      this.builder = IpBlock.builder();
+   }
+
+   @Override
+   public IpBlock getResult() {
+      return builder.build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/BasePublicIpResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/BasePublicIpResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/BasePublicIpResponseHandler.java
new file mode 100644
index 0000000..8561aad
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/BasePublicIpResponseHandler.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.publicip;
+
+import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+
+public abstract class BasePublicIpResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected IpBlock.PublicIp.Builder builder;
+
+   BasePublicIpResponseHandler() {
+      this.builder = IpBlock.PublicIp.builder();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("ip".equals(qName))
+         builder.ip(textToStringValue());
+      else if ("nicId".equals(qName))
+         builder.nicId(textToStringValue());
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/PublicIpListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/PublicIpListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/PublicIpListResponseHandler.java
new file mode 100644
index 0000000..c68e7e6
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/publicip/PublicIpListResponseHandler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.publicip;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.jclouds.profitbricks.domain.IpBlock.PublicIp;
+import org.xml.sax.SAXException;
+
+public class PublicIpListResponseHandler extends BasePublicIpResponseHandler<List<PublicIp>> {
+
+   private List<PublicIp> publicIps;
+
+   PublicIpListResponseHandler() {
+      this.publicIps = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+
+      if ("publicIps".equals(qName))
+         publicIps.add(builder.build());
+      clearTextBuffer();
+   }
+
+   @Override
+   public void reset() {
+      this.publicIps = Lists.newArrayList();
+   }
+
+   @Override
+   public List<PublicIp> getResult() {
+      return publicIps;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
new file mode 100644
index 0000000..227cfc7
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.features;
+
+import com.google.common.collect.Iterables;
+import java.util.List;
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.Nic;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", testName = "IpBlockApiLiveTest", singleThreaded = true)
+public class IpBlockApiLiveTest extends BaseProfitBricksLiveTest {
+
+   private String nicid;
+   private IpBlock newIpBlock;
+
+   @Override
+   public void initialize() {
+      super.initialize();
+
+      List<Nic> nics = api.nicApi().getAllNics();
+
+      assertFalse(nics.isEmpty(), "At least one NIC is requred to test IpBlocks");
+
+      Nic nic = Iterables.getFirst(nics, null);
+
+      nicid = nic.id();
+   }
+
+   @Test
+   public void testReservePublicIpBlock() {
+      newIpBlock = api.ipBlockApi().reservePublicIpBlock("2", Location.US_LAS.value());
+
+      assertNotNull(newIpBlock);
+      assertNotNull(newIpBlock.ips());
+      assertFalse(newIpBlock.ips().isEmpty());
+   }
+
+   @Test
+   public void testGetAllIpBlocks() {
+      List<IpBlock> ipBlocks = api.ipBlockApi().getAllIpBlock();
+
+      assertNotNull(ipBlocks);
+      assertFalse(ipBlocks.isEmpty());
+   }
+
+   @Test(dependsOnMethods = "testReservePublicIpBlock")
+   public void testGetOneIpBlock() {
+      IpBlock ipBlock = api.ipBlockApi().getIpBlock(newIpBlock.id());
+
+      assertNotNull(ipBlock);
+   }
+
+   @Test(dependsOnMethods = "testReservePublicIpBlock")
+   public void testAddPublicIpToNic() {
+      String requestId = api.ipBlockApi().addPublicIpToNic(newIpBlock.ips().get(0), nicid);
+
+      assertNotNull(requestId);
+   }
+
+   @Test(dependsOnMethods = "testAddPublicIpToNic")
+   public void testRemovePublicIpFromNic() {
+      String requestId = api.ipBlockApi().removePublicIpFromNic(newIpBlock.ips().get(0), nicid);
+
+      assertNotNull(requestId);
+   }
+
+   @Test(dependsOnMethods = "testRemovePublicIpFromNic")
+   public void testReleasePublicIpBlock() {
+      String requestId = api.ipBlockApi().releasePublicIpBlock(newIpBlock.id());
+
+      assertNotNull(requestId);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
new file mode 100644
index 0000000..b0d3356
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
@@ -0,0 +1,200 @@
+/*
+ * 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.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import java.util.List;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "IpBlockApiMockTest")
+public class IpBlockApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetOneIpBlock() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/ipblock/ipblock.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      IpBlockApi api = pbApi.ipBlockApi();
+
+      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      String content = "<ws:getPublicIpBlock><blockId>" + id + "</blockId></ws:getPublicIpBlock>";
+
+      try {
+         IpBlock ipBlock = api.getIpBlock(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(ipBlock);
+         assertEquals(ipBlock.id(), id);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetNonExisingIpBlock() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      IpBlockApi api = pbApi.ipBlockApi();
+
+      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      try {
+         IpBlock ipBlock = api.getIpBlock(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(ipBlock);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllIpBlock() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/ipblock/ipblocks.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      IpBlockApi api = pbApi.ipBlockApi();
+
+      try {
+         List<IpBlock> ipBlocks = api.getAllIpBlock();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNotNull(ipBlocks);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllIpBlockReturning404() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      IpBlockApi api = pbApi.ipBlockApi();
+
+      try {
+         List<IpBlock> ipBlocks = api.getAllIpBlock();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertTrue(ipBlocks.isEmpty());
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testReservePublicIpBlock() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/ipblock/ipblock-reserve.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      IpBlockApi api = pbApi.ipBlockApi();
+
+      String blockSize = "2";
+      Location location = Location.US_LAS;
+
+      String content = "<ws:reservePublicIpBlock><request><blockSize>" + blockSize + "</blockSize><location>" + location.value() + "</location></request></ws:reservePublicIpBlock>";
+      try {
+         IpBlock ipBlock = api.reservePublicIpBlock(blockSize, location.value());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(ipBlock);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testAddPublicIpToNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/ipblock/ipblock-addtonic.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      IpBlockApi api = pbApi.ipBlockApi();
+
+      String ip = "2";
+      String nicid = "nicid";
+
+      String content = "<ws:addPublicIpToNic><ip>" + ip + "</ip><nicId>" + nicid + "</nicId></ws:addPublicIpToNic>";
+      try {
+         String requestId = api.addPublicIpToNic(ip, nicid);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(requestId);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testRemovePublicIpFromNic() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/ipblock/ipblock-removefromnic.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      IpBlockApi api = pbApi.ipBlockApi();
+
+      String ip = "2";
+      String nicid = "nicid";
+
+      String content = "<ws:removePublicIpFromNic><ip>" + ip + "</ip><nicId>" + nicid + "</nicId></ws:removePublicIpFromNic>";
+      try {
+         String requestId = api.removePublicIpFromNic(ip, nicid);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(requestId);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testReleasePublicIpBlock() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/ipblock/ipblock-release.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      IpBlockApi api = pbApi.ipBlockApi();
+
+      String blockid = "2";
+
+      String content = "<ws:releasePublicIpBlock><blockId>" + blockid + "</blockId></ws:releasePublicIpBlock>";
+      try {
+         String requestId = api.releasePublicIpBlock(blockid);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(requestId);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandlerTest.java
new file mode 100644
index 0000000..49dbaba
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandlerTest.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.ipblock;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.IpBlock.PublicIp;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "IpBlockListResponseHandlerTest")
+public class IpBlockListResponseHandlerTest extends BaseResponseHandlerTest<List<IpBlock>> {
+
+   @Override
+   protected ParseSax<List<IpBlock>> createParser() {
+      return factory.create(injector.getInstance(IpBlockListResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromGetAllIpBlock() {
+      ParseSax<List<IpBlock>> parser = createParser();
+
+      List<IpBlock> actual = parser.parse(payloadFromResource("/ipblock/ipblocks.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      List<IpBlock> expected = ImmutableList.<IpBlock>of(
+              IpBlock.builder()
+              .id("block-id")
+              .location(Location.US_LAS)
+              .publicIps(ImmutableList.<PublicIp>of(
+                              PublicIp.builder()
+                              .ip("1.1")
+                              .nicId("nic-id")
+                              .build(),
+                              PublicIp.builder()
+                              .ip("1.2")
+                              .nicId("nic-id")
+                              .build()))
+              .build(),
+              IpBlock.builder()
+              .id("block-id")
+              .location(Location.US_LAS)
+              .publicIps(ImmutableList.<PublicIp>of(
+                              PublicIp.builder()
+                              .ip("2.1")
+                              .nicId("nic-id")
+                              .build(),
+                              PublicIp.builder()
+                              .ip("2.2")
+                              .nicId("nic-id")
+                              .build()))
+              .build()
+      );
+
+      assertEquals(actual, expected);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandlerTest.java
new file mode 100644
index 0000000..54f48dc
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandlerTest.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.ipblock;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.IpBlock;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.IpBlock.PublicIp;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "IpBlockResponseHandlerTest")
+public class IpBlockResponseHandlerTest extends BaseResponseHandlerTest<IpBlock> {
+
+   @Override
+   protected ParseSax<IpBlock> createParser() {
+      return factory.create(injector.getInstance(IpBlockResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromGetIpBlock() {
+      ParseSax<IpBlock> parser = createParser();
+
+      IpBlock actual = parser.parse(payloadFromResource("/ipblock/ipblock.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+      List<String> emptyIpList = Lists.newArrayList();
+
+      IpBlock expected = IpBlock.builder()
+              .id("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+              .location(Location.US_LAS)
+              .publicIps(ImmutableList.<PublicIp>of(
+                              PublicIp.builder()
+                              .ip("ip")
+                              .nicId("nic-id")
+                              .build(),
+                              PublicIp.builder()
+                              .ip("ip")
+                              .nicId("nic-id")
+                              .build()))
+              .ips(emptyIpList)
+              .build();
+      assertEquals(actual, expected);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/resources/ipblock/ipblock-addtonic.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock-addtonic.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock-addtonic.xml
new file mode 100644
index 0000000..a9c1974
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock-addtonic.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:addPublicIpToNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>datacenter-version</dataCenterVersion>
+      </return>
+    </ns2:addPublicIpToNicResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/resources/ipblock/ipblock-release.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock-release.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock-release.xml
new file mode 100644
index 0000000..a9f22bf
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock-release.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:releasePublicIpBlockResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+      </return>
+    </ns2:releasePublicIpBlockResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/resources/ipblock/ipblock-removefromnic.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock-removefromnic.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock-removefromnic.xml
new file mode 100644
index 0000000..a9c1974
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock-removefromnic.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:addPublicIpToNicResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>datacenter-version</dataCenterVersion>
+      </return>
+    </ns2:addPublicIpToNicResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
new file mode 100644
index 0000000..863e9ff
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:reservePublicIpBlockResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+        <blockId>block-id</blockId>
+        <location>us/las</location>
+        <ips>ip</ips>
+      </return>
+    </ns2:reservePublicIpBlockResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
new file mode 100644
index 0000000..2dd54f2
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:getAllPublicIpBlocksResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <blockId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</blockId>
+        <location>us/las</location>
+        <publicIps>
+          <ip>ip</ip>
+		  <nicId>nic-id</nicId>
+        </publicIps>
+        <publicIps>
+          <ip>ip</ip>
+        </publicIps>
+      </return>
+    </ns2:getAllPublicIpBlocksResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/af93f3b6/providers/profitbricks/src/test/resources/ipblock/ipblocks.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblocks.xml b/providers/profitbricks/src/test/resources/ipblock/ipblocks.xml
new file mode 100644
index 0000000..4e436e1
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblocks.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getAllPublicIpBlocksResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <blockId>block-id</blockId>
+                <location>us/las</location>
+                <publicIps>
+                    <ip>1.1</ip>
+                    <nicId>nic-id</nicId>      
+                </publicIps>
+                <publicIps>
+                    <ip>1.2</ip>
+                    <nicId>nic-id</nicId>
+                </publicIps>
+            </return>
+            <return>
+                <blockId>block-id</blockId>
+                <location>us/las</location>
+                <publicIps>
+                    <ip>2.1</ip>
+                </publicIps>
+                <publicIps>
+                    <ip>2.2</ip>
+                    <nicId>nic-id</nicId>
+                </publicIps>
+            </return>
+        </ns2:getAllPublicIpBlocksResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file


[34/35] jclouds git commit: Merge remote-tracking branch 'jclouds-labs-profitbricks-local/promote-profitbricks-moved' into promoted-profitbricks

Posted by de...@apache.org.
Merge remote-tracking branch 'jclouds-labs-profitbricks-local/promote-profitbricks-moved' into promoted-profitbricks


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

Branch: refs/heads/master
Commit: 1af52159c9e0edca03ecfcbad3a1f0d0957cc335
Parents: e0ab5d8 7202e05
Author: Reijhanniel Jearl Campos <de...@apache.org>
Authored: Fri Feb 19 22:04:55 2016 +0800
Committer: Reijhanniel Jearl Campos <de...@apache.org>
Committed: Fri Feb 19 22:04:55 2016 +0800

----------------------------------------------------------------------
 providers/profitbricks/README.md                |  61 +++
 providers/profitbricks/pom.xml                  | 151 ++++++
 .../jclouds/profitbricks/ProfitBricksApi.java   |  64 +++
 .../profitbricks/ProfitBricksApiMetadata.java   |  85 ++++
 .../ProfitBricksProviderMetadata.java           | 114 +++++
 .../binder/BaseProfitBricksRequestBinder.java   |  75 +++
 .../CreateDataCenterRequestBinder.java          |  44 ++
 .../UpdateDataCenterRequestBinder.java          |  44 ++
 .../drive/AddRomDriveToServerRequestBinder.java |  45 ++
 .../AddFirewallRuleToNicRequestBinder.java      |  53 ++
 .../binder/firewall/FirewallBinder.java         |  95 ++++
 .../CreateLoadBalancerRequestBinder.java        |  50 ++
 .../DeregisterLoadBalancerRequestBinder.java    |  42 ++
 .../RegisterLoadBalancerRequestBinder.java      |  44 ++
 .../UpdateLoadBalancerRequestBinder.java        |  44 ++
 .../binder/nic/CreateNicRequestBinder.java      |  46 ++
 .../binder/nic/SetInternetAccessBinder.java     |  42 ++
 .../binder/nic/UpdateNicRequestBinder.java      |  46 ++
 .../server/CreateServerRequestBinder.java       |  57 +++
 .../server/UpdateServerRequestBinder.java       |  56 +++
 .../snapshot/CreateSnapshotRequestBinder.java   |  44 ++
 .../snapshot/RollbackSnapshotRequestBinder.java |  43 ++
 .../snapshot/UpdateSnapshotRequestBinder.java   |  53 ++
 .../ConnectStorageToServerRequestBinder.java    |  45 ++
 .../storage/CreateStorageRequestBinder.java     |  46 ++
 .../storage/UpdateStorageRequestBinder.java     |  47 ++
 .../ProfitBricksComputeServiceAdapter.java      | 483 +++++++++++++++++++
 .../compute/concurrent/ProvisioningJob.java     |  62 +++
 .../compute/concurrent/ProvisioningManager.java |  88 ++++
 ...ProfitBricksComputeServiceContextModule.java | 223 +++++++++
 .../compute/function/ProvisionableToImage.java  | 241 +++++++++
 .../compute/function/ServerToNodeMetadata.java  | 168 +++++++
 .../compute/function/StorageToVolume.java       |  47 ++
 .../strategy/AssignDataCenterToTemplate.java    | 110 +++++
 .../strategy/TemplateWithDataCenter.java        | 107 ++++
 .../config/ProfitBricksComputeProperties.java   |  32 ++
 .../config/ProfitBricksHttpApiModule.java       |  70 +++
 .../profitbricks/domain/AvailabilityZone.java   |  32 ++
 .../jclouds/profitbricks/domain/DataCenter.java | 121 +++++
 .../org/jclouds/profitbricks/domain/Drive.java  |  55 +++
 .../jclouds/profitbricks/domain/Firewall.java   | 188 ++++++++
 .../org/jclouds/profitbricks/domain/Image.java  | 128 +++++
 .../jclouds/profitbricks/domain/IpBlock.java    | 103 ++++
 .../profitbricks/domain/LoadBalancer.java       | 257 ++++++++++
 .../jclouds/profitbricks/domain/Location.java   |  60 +++
 .../org/jclouds/profitbricks/domain/Nic.java    | 248 ++++++++++
 .../org/jclouds/profitbricks/domain/OsType.java |  28 ++
 .../profitbricks/domain/Provisionable.java      |  35 ++
 .../profitbricks/domain/ProvisioningState.java  |  28 ++
 .../org/jclouds/profitbricks/domain/Server.java | 410 ++++++++++++++++
 .../profitbricks/domain/ServiceFault.java       |  70 +++
 .../jclouds/profitbricks/domain/Snapshot.java   | 251 ++++++++++
 .../jclouds/profitbricks/domain/Storage.java    | 234 +++++++++
 .../profitbricks/features/DataCenterApi.java    | 134 +++++
 .../profitbricks/features/DrivesApi.java        |  51 ++
 .../profitbricks/features/FirewallApi.java      |  93 ++++
 .../jclouds/profitbricks/features/ImageApi.java |  65 +++
 .../profitbricks/features/IpBlockApi.java       |  83 ++++
 .../profitbricks/features/LoadBalancerApi.java  |  93 ++++
 .../jclouds/profitbricks/features/NicApi.java   |  88 ++++
 .../profitbricks/features/ServerApi.java        | 166 +++++++
 .../profitbricks/features/SnapshotApi.java      |  87 ++++
 .../profitbricks/features/StorageApi.java       | 137 ++++++
 .../handlers/ProfitBricksHttpErrorHandler.java  |  75 +++
 ...usFromPayloadHttpCommandExecutorService.java | 140 ++++++
 .../ProfitBricksSoapMessageEnvelope.java        |  59 +++
 .../parser/BaseProfitBricksResponseHandler.java |  68 +++
 .../parser/RequestIdOnlyResponseHandler.java    |  45 ++
 .../parser/ServiceFaultResponseHandler.java     |  58 +++
 .../BaseDataCenterResponseHandler.java          |  38 ++
 .../DataCenterInfoResponseHandler.java          | 110 +++++
 .../DataCenterListResponseHandler.java          |  61 +++
 .../firewall/BaseFirewallResponseHandler.java   |  69 +++
 .../firewall/FirewallListResponseHandler.java   |  68 +++
 .../firewall/FirewallResponseHandler.java       |  63 +++
 .../rule/BaseFirewallRuleResponseHandler.java   |  54 +++
 .../rule/FirewallRuleListResponseHandler.java   |  54 +++
 .../parser/image/BaseImageResponseHandler.java  |  71 +++
 .../parser/image/ImageInfoResponseHandler.java  |  44 ++
 .../parser/image/ImageListResponseHandler.java  |  49 ++
 .../ipblock/BaseIpBlockResponseHandler.java     |  69 +++
 .../ipblock/IpBlockListResponseHandler.java     |  64 +++
 .../parser/ipblock/IpBlockResponseHandler.java  |  64 +++
 .../BaseLoadBalancerResponseHandler.java        | 114 +++++
 .../LoadBalancerIdOnlyResponseHandler.java      |  51 ++
 .../LoadBalancerListResponseHandler.java        |  79 +++
 .../LoadBalancerResponseHandler.java            |  68 +++
 .../http/parser/nic/BaseNicResponseHandler.java |  87 ++++
 .../parser/nic/NicIdOnlyResponseHandler.java    |  51 ++
 .../http/parser/nic/NicListResponseHandler.java |  73 +++
 .../http/parser/nic/NicResponseHandler.java     |  63 +++
 .../publicip/BasePublicIpResponseHandler.java   |  38 ++
 .../publicip/PublicIpListResponseHandler.java   |  53 ++
 .../server/BaseServerResponseHandler.java       | 136 ++++++
 .../server/ServerIdOnlyResponseHandler.java     |  51 ++
 .../server/ServerInfoResponseHandler.java       |  69 +++
 .../server/ServerListResponseHandler.java       |  89 ++++
 .../snapshot/BaseSnapshotResponseHandler.java   |  83 ++++
 .../snapshot/SnapshotListResponseHandler.java   |  54 +++
 .../snapshot/SnapshotResponseHandler.java       |  49 ++
 .../GetProvisioningStateResponseHandler.java    |  47 ++
 .../storage/BaseStorageResponseHandler.java     |  81 ++++
 .../storage/StorageIdOnlyResponseHandler.java   |  46 ++
 .../storage/StorageInfoResponseHandler.java     |  51 ++
 .../storage/StorageListResponseHandler.java     |  61 +++
 .../jclouds/profitbricks/util/MacAddresses.java |  29 ++
 .../jclouds/profitbricks/util/Passwords.java    |  64 +++
 .../profitbricks/util/Preconditions.java        | 100 ++++
 .../profitbricks/BaseProfitBricksLiveTest.java  | 186 +++++++
 .../ProfitBricksProviderMetadataTest.java       |  29 ++
 .../CreateDataCenterRequestBinderTest.java      |  47 ++
 .../UpdateDataCenterRequestBinderTest.java      |  46 ++
 .../AddRomDriveToServerRequestBinderTest.java   |  49 ++
 .../AddFirewallRuleToNicRequestBinderTest.java  |  65 +++
 .../binder/firewall/FirewallBinderTest.java     | 131 +++++
 .../CreateLoadBalancerRequestBinderTest.java    |  68 +++
 ...DeregisterLoadBalancerRequestBinderTest.java |  47 ++
 .../RegisterLoadBalancerRequestBinderTest.java  |  46 ++
 .../UpdateLoadBalancerRequestBinderTest.java    |  61 +++
 .../binder/nic/CreateNicRequestBinderTest.java  |  53 ++
 .../binder/nic/SetInternetAccessBinderTest.java |  48 ++
 .../binder/nic/UpdateNicRequestBinderTest.java  |  54 +++
 .../server/CreateServerRequestBinderTest.java   |  65 +++
 .../server/UpdateServerRequestBinderTest.java   |  64 +++
 .../CreateSnapshotRequestBinderTest.java        |  51 ++
 .../RollbackSnapshotRequestBinderTest.java      |  44 ++
 .../UpdateSnapshotRequestBinderTest.java        |  74 +++
 ...ConnectStorageToServerRequestBinderTest.java |  55 +++
 .../storage/CreateStorageRequestBinderTest.java |  56 +++
 .../storage/UpdateStorageRequestBinderTest.java |  53 ++
 .../ProfitBricksComputeServiceLiveTest.java     |  73 +++
 .../ProfitBricksTemplateBuilderLiveTest.java    | 103 ++++
 .../concurrent/ProvisioningManagerTest.java     | 118 +++++
 .../compute/config/StatusPredicateTest.java     | 145 ++++++
 .../function/ProvisionableToImageTest.java      | 271 +++++++++++
 .../function/ServerToNodeMetadataTest.java      | 204 ++++++++
 .../compute/function/StorageToVolumeTest.java   |  61 +++
 .../domain/FirewallRuleBuilderTest.java         |  82 ++++
 .../profitbricks/domain/ServerBuilderTest.java  | 162 +++++++
 .../features/DataCenterApiLiveTest.java         | 123 +++++
 .../features/DataCenterApiMockTest.java         | 271 +++++++++++
 .../features/DrivesApiLiveTest.java             |  77 +++
 .../features/DrivesApiMockTest.java             |  81 ++++
 .../features/FirewallApiLiveTest.java           | 139 ++++++
 .../features/FirewallApiMockTest.java           | 324 +++++++++++++
 .../profitbricks/features/ImageApiLiveTest.java |  62 +++
 .../profitbricks/features/ImageApiMockTest.java | 116 +++++
 .../features/IpBlockApiLiveTest.java            | 111 +++++
 .../features/IpBlockApiMockTest.java            | 200 ++++++++
 .../features/LoadBalancerApiLiveTest.java       | 157 ++++++
 .../features/LoadBalancerApiMockTest.java       | 285 +++++++++++
 .../profitbricks/features/NicApiLiveTest.java   | 124 +++++
 .../profitbricks/features/NicApiMockTest.java   | 237 +++++++++
 .../features/ServerApiLiveTest.java             | 129 +++++
 .../features/ServerApiMockTest.java             | 363 ++++++++++++++
 .../features/SnapshotApiLiveTest.java           | 168 +++++++
 .../features/SnapshotApiMockTest.java           | 268 ++++++++++
 .../features/StorageApiLiveTest.java            | 150 ++++++
 .../features/StorageApiMockTest.java            | 285 +++++++++++
 ...omPayloadHttpCommandExecutorServiceTest.java | 149 ++++++
 .../ProfitBricksSoapMessageEnvelopeTest.java    |  57 +++
 .../http/parser/BaseResponseHandlerTest.java    |  61 +++
 .../RequestIdOnlyResponseHandlerTest.java       |  76 +++
 .../parser/ServiceFaultResponseHandlerTest.java |  49 ++
 .../DataCenterInfoResponseHandlerTest.java      | 142 ++++++
 .../DataCenterListResponseHandlerTest.java      |  53 ++
 .../FirewallListResponseHandlerTest.java        |  87 ++++
 .../firewall/FirewallResponseHandlerTest.java   |  71 +++
 .../image/ImageInfoResponseHandlerTest.java     |  65 +++
 .../image/ImageListResponseHandlerTest.java     | 183 +++++++
 .../ipblock/IpBlockListResponseHandlerTest.java |  76 +++
 .../ipblock/IpBlockResponseHandlerTest.java     |  62 +++
 .../LoadBalancerIdOnlyResponseHandlerTest.java  |  41 ++
 .../LoadBalancerListResponseHandlerTest.java    | 124 +++++
 .../LoadBalancerResponseHandlerTest.java        |  99 ++++
 .../nic/NicIdOnlyResponseHandlerTest.java       |  40 ++
 .../parser/nic/NicListResponseHandlerTest.java  |  95 ++++
 .../http/parser/nic/NicResponseHandlerTest.java |  68 +++
 .../server/ServerIdOnlyResponseHandlerTest.java |  40 ++
 .../server/ServerInfoResponseHandlerTest.java   | 119 +++++
 .../server/ServerListResponseHandlerTest.java   | 182 +++++++
 .../SnapshotListResponseHandlerTest.java        | 103 ++++
 .../snapshot/SnapshotResponseHandlerTest.java   |  77 +++
 ...GetProvisioningStateResponseHandlerTest.java | 110 +++++
 .../StorageIdOnlyResponseHandlerTest.java       |  42 ++
 .../storage/StorageInfoResponseHandlerTest.java |  65 +++
 .../storage/StorageListResponseHandlerTest.java |  79 +++
 .../internal/BaseProfitBricksMockTest.java      | 104 ++++
 .../profitbricks/util/MacAddressesTest.java     |  45 ++
 .../profitbricks/util/PasswordsTest.java        |  53 ++
 .../resources/datacenter/datacenter-cleared.xml |  12 +
 .../resources/datacenter/datacenter-created.xml |  13 +
 .../resources/datacenter/datacenter-deleted.xml |  10 +
 .../datacenter/datacenter-not-found.xml         |  17 +
 .../datacenter/datacenter-state-inprocess.xml   |   8 +
 .../resources/datacenter/datacenter-state.xml   |   8 +
 .../resources/datacenter/datacenter-updated.xml |  12 +
 .../test/resources/datacenter/datacenter.xml    |  79 +++
 .../test/resources/datacenter/datacenters.xml   |  19 +
 .../src/test/resources/drives/drives-add.xml    |  12 +
 .../src/test/resources/drives/drives-remove.xml |  12 +
 .../src/test/resources/fault-400.xml            |  17 +
 .../src/test/resources/fault-401.html           |  43 ++
 .../src/test/resources/fault-404.xml            |  17 +
 .../src/test/resources/fault-413.xml            |  17 +
 .../resources/firewall/firewall-activate.xml    |  12 +
 .../resources/firewall/firewall-addtonic.xml    |  23 +
 .../resources/firewall/firewall-deactivate.xml  |  12 +
 .../test/resources/firewall/firewall-delete.xml |  12 +
 .../test/resources/firewall/firewall-remove.xml |  12 +
 .../src/test/resources/firewall/firewall.xml    |  23 +
 .../src/test/resources/firewall/firewalls.xml   |  39 ++
 .../test/resources/image/image-not-found.xml    |  17 +
 .../src/test/resources/image/image.xml          |  26 +
 .../src/test/resources/image/images.xml         | 140 ++++++
 .../test/resources/ipblock/ipblock-addtonic.xml |  12 +
 .../test/resources/ipblock/ipblock-release.xml  |  10 +
 .../resources/ipblock/ipblock-removefromnic.xml |  12 +
 .../test/resources/ipblock/ipblock-reserve.xml  |  13 +
 .../src/test/resources/ipblock/ipblock.xml      |  18 +
 .../src/test/resources/ipblock/ipblocks.xml     |  30 ++
 .../loadbalancer/loadbalancer-create.xml        |  13 +
 .../loadbalancer/loadbalancer-delete.xml        |  12 +
 .../loadbalancer/loadbalancer-deregister.xml    |  12 +
 .../loadbalancer/loadbalancer-register.xml      |  19 +
 .../loadbalancer/loadbalancer-update.xml        |  12 +
 .../resources/loadbalancer/loadbalancer.xml     |  32 ++
 .../resources/loadbalancer/loadbalancers.xml    |  57 +++
 .../src/test/resources/logback-test.xml         |  74 +++
 .../src/test/resources/maintenance-503.html     |  67 +++
 .../src/test/resources/nic/nic-create.xml       |  13 +
 .../src/test/resources/nic/nic-delete.xml       |  12 +
 .../test/resources/nic/nic-internetaccess.xml   |  12 +
 .../src/test/resources/nic/nic-update.xml       |  12 +
 .../profitbricks/src/test/resources/nic/nic.xml |  27 ++
 .../src/test/resources/nic/nics.xml             |  49 ++
 .../src/test/resources/server/server-create.xml |  13 +
 .../src/test/resources/server/server-delete.xml |  13 +
 .../src/test/resources/server/server-reset.xml  |  11 +
 .../src/test/resources/server/server-start.xml  |  11 +
 .../resources/server/server-state-inprocess.xml |  28 ++
 .../src/test/resources/server/server-stop.xml   |  11 +
 .../src/test/resources/server/server-update.xml |  13 +
 .../src/test/resources/server/server.xml        |  59 +++
 .../src/test/resources/server/servers.xml       | 109 +++++
 .../test/resources/snapshot/snapshot-create.xml |  11 +
 .../test/resources/snapshot/snapshot-delete.xml |  10 +
 .../resources/snapshot/snapshot-rollback.xml    |  12 +
 .../snapshot/snapshot-state-inprocess.xml       |  27 ++
 .../test/resources/snapshot/snapshot-update.xml |  10 +
 .../src/test/resources/snapshot/snapshot.xml    |  27 ++
 .../src/test/resources/snapshot/snapshots.xml   |  47 ++
 .../test/resources/storage/storage-connect.xml  |  13 +
 .../test/resources/storage/storage-create.xml   |  14 +
 .../test/resources/storage/storage-delete.xml   |  13 +
 .../resources/storage/storage-disconnect.xml    |  13 +
 .../storage/storage-state-inprocess.xml         |  23 +
 .../test/resources/storage/storage-update.xml   |  13 +
 .../src/test/resources/storage/storage.xml      |  23 +
 .../src/test/resources/storage/storages.xml     |  37 ++
 260 files changed, 20011 insertions(+)
----------------------------------------------------------------------



[33/35] jclouds git commit: Refactored locations to not rely on existing DataCenters

Posted by de...@apache.org.
Refactored locations to not rely on existing DataCenters


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

Branch: refs/heads/master
Commit: 7202e0557f620c272feaca3e9a49b6e45a77a791
Parents: 235b4b9
Author: Ignasi Barrera <na...@apache.org>
Authored: Wed Feb 17 15:53:30 2016 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Thu Feb 18 10:48:00 2016 +0100

----------------------------------------------------------------------
 providers/profitbricks/README.md                |   4 +-
 .../ProfitBricksProviderMetadata.java           |  20 +++-
 .../ProfitBricksComputeServiceAdapter.java      |  52 +++------
 .../ProfitBricksTemplateBuilderImpl.java        | 101 -----------------
 ...ProfitBricksComputeServiceContextModule.java |  34 ++----
 .../compute/function/DataCenterToLocation.java  |  54 ---------
 .../compute/function/LocationToLocation.java    |  47 --------
 .../compute/function/ProvisionableToImage.java  |  29 +++--
 .../compute/function/ServerToNodeMetadata.java  |  42 +++----
 .../strategy/AssignDataCenterToTemplate.java    | 110 +++++++++++++++++++
 .../strategy/TemplateWithDataCenter.java        | 107 ++++++++++++++++++
 .../ProfitBricksComputeServiceLiveTest.java     |  77 +------------
 .../function/DataCenterToLocationTest.java      |  77 -------------
 .../function/LocationToLocationTest.java        |  62 -----------
 .../function/ProvisionableToImageTest.java      |  52 +++++----
 .../function/ServerToNodeMetadataTest.java      |  68 ++++++++----
 16 files changed, 375 insertions(+), 561 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/providers/profitbricks/README.md
----------------------------------------------------------------------
diff --git a/providers/profitbricks/README.md b/providers/profitbricks/README.md
index 09c367a..67db8dd 100644
--- a/providers/profitbricks/README.md
+++ b/providers/profitbricks/README.md
@@ -53,11 +53,9 @@ Template template = compute.templateBuilder()
 	
 compute.createNodesInGroup( "cluster1", 1, template );
 ```
-> If no `locationId` is specified in the template, jclouds will look for a `DataCenter` that is of same scope as the `Image`.
-
 
 ## Limitations
 
 - There's no direct way of specifying arbitrary number of cores, RAM size, and storage size via the compute interface, at least until after [JCLOUDS-482](https://issues.apache.org/jira/browse/JCLOUDS-482) is resolved. The adapter uses a predefined list hardware profiles instead.
 
-> Take note that these features are still accessible by *unwraping* the ProfitBricks API, but this'll reduce portability of your code. See [Concepts](https://jclouds.apache.org/start/concepts/).
\ No newline at end of file
+> Take note that these features are still accessible by *unwraping* the ProfitBricks API, but this'll reduce portability of your code. See [Concepts](https://jclouds.apache.org/start/concepts/).

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/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 ec7fc9a..ba8b9d4 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
@@ -20,18 +20,23 @@ import static org.jclouds.Constants.PROPERTY_SO_TIMEOUT;
 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.location.reference.LocationConstants.ISO3166_CODES;
+import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGION;
+import static org.jclouds.location.reference.LocationConstants.PROPERTY_REGIONS;
+import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONE;
+import static org.jclouds.location.reference.LocationConstants.PROPERTY_ZONES;
 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.TIMEOUT_DATACENTER_AVAILABLE;
 
-import com.google.auto.service.AutoService;
-
 import java.net.URI;
 import java.util.Properties;
 
 import org.jclouds.providers.ProviderMetadata;
 import org.jclouds.providers.internal.BaseProviderMetadata;
 
+import com.google.auto.service.AutoService;
+
 @AutoService(ProviderMetadata.class)
 public class ProfitBricksProviderMetadata extends BaseProviderMetadata {
 
@@ -54,6 +59,16 @@ public class ProfitBricksProviderMetadata extends BaseProviderMetadata {
 
    public static Properties defaultProperties() {
       Properties properties = ProfitBricksApiMetadata.defaultProperties();
+      
+      properties.setProperty(PROPERTY_REGIONS, "de,us");
+      properties.setProperty(PROPERTY_REGION + ".de.zones", "de/fkb,de/fra");
+      properties.setProperty(PROPERTY_REGION + ".us.zones", "us/las,us/lasdev");
+      properties.setProperty(PROPERTY_ZONES, "de/fkb,de/fra,us/las,us/lasdev");
+      properties.setProperty(PROPERTY_ZONE + ".de/fkb." + ISO3166_CODES, "DE-BW");
+      properties.setProperty(PROPERTY_ZONE + ".de/fra." + ISO3166_CODES, "DE-HE");
+      properties.setProperty(PROPERTY_ZONE + ".us/las." + ISO3166_CODES, "US-NV");
+      properties.setProperty(PROPERTY_ZONE + ".us/lasdebv." + ISO3166_CODES, "US-NV");
+      
       properties.put(TIMEOUT_DATACENTER_AVAILABLE, 30L * 60L); // 30 minutes
       properties.put(POLL_INITIAL_PERIOD, 5L);
       properties.put(POLL_MAX_PERIOD, 60L);
@@ -79,6 +94,7 @@ public class ProfitBricksProviderMetadata extends BaseProviderMetadata {
                  .name("ProfitBricks Cloud Compute 2.0")
                  .homepage(URI.create("http://www.profitbricks.com"))
                  .console(URI.create("https://my.profitbricks.com/dashboard/dcdr2/"))
+                 .iso3166Codes("DE-BW", "DE-HE", "US-NV")
                  .linkedServices("profitbricks")
                  .apiMetadata(new ProfitBricksApiMetadata())
                  .defaultProperties(ProfitBricksProviderMetadata.defaultProperties());

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/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 68a7097..fe02c41 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
@@ -47,18 +47,18 @@ import org.jclouds.domain.LocationScope;
 import org.jclouds.domain.LoginCredentials;
 import org.jclouds.logging.Logger;
 import org.jclouds.profitbricks.ProfitBricksApi;
+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.compute.strategy.TemplateWithDataCenter;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
 import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.domain.Provisionable;
 import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Snapshot;
 import org.jclouds.profitbricks.domain.Storage;
-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;
 import org.jclouds.rest.ResourceNotFoundException;
 
@@ -74,7 +74,7 @@ import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.inject.Inject;
 
 @Singleton
-public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<Server, Hardware, Provisionable, DataCenter> {
+public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<Server, Hardware, Provisionable, Location> {
 
    @Resource
    @Named(ComputeServiceConstants.COMPUTE_LOGGER)
@@ -100,12 +100,16 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<
       this.jobFactory = jobFactory;
       this.provisioningManager = provisioningManager;
    }
-
+   
    @Override
    public NodeAndInitialCredentials<Server> createNodeWithGroupEncodedIntoName(String group, String name, Template template) {
-      Location location = template.getLocation();
-      checkArgument(location.getScope() == LocationScope.ZONE, "Template must use a ZONE-scoped location");
-      final String dataCenterId = location.getId();
+      checkArgument(template instanceof TemplateWithDataCenter, "This implementation requires a TemplateWithDataCenter");
+      return createNodeWithGroupEncodedIntoName(group, name, TemplateWithDataCenter.class.cast(template));
+   }
+
+   protected NodeAndInitialCredentials<Server> createNodeWithGroupEncodedIntoName(String group, String name, TemplateWithDataCenter template) {
+      checkArgument(template.getLocation().getScope() == LocationScope.ZONE, "Template must use a ZONE-scoped location");
+      final String dataCenterId = template.getDataCenter().id();
 
       Hardware hardware = template.getHardware();
 
@@ -314,29 +318,9 @@ public class ProfitBricksComputeServiceAdapter implements ComputeServiceAdapter<
    }
 
    @Override
-   public Iterable<DataCenter> listLocations() {
-      logger.trace("<< fetching datacenters..");
-      final DataCenterApi dcApi = api.dataCenterApi();
-
-      // Fetch all datacenters
-      ListenableFuture<List<DataCenter>> futures = allAsList(transform(dcApi.getAllDataCenters(),
-              new Function<DataCenter, ListenableFuture<DataCenter>>() {
-
-                 @Override
-                 public ListenableFuture<DataCenter> apply(final DataCenter input) {
-                    // Fetch more details in parallel
-                    return executorService.submit(new Callable<DataCenter>() {
-                       @Override
-                       public DataCenter call() throws Exception {
-                          logger.trace("<< fetching datacenter with id [%s]", input.id());
-                          return dcApi.getDataCenter(input.id());
-                       }
-
-                    });
-                 }
-              }));
-
-      return getUnchecked(futures);
+   public Iterable<Location> listLocations() {
+      // Will never be called
+      throw new UnsupportedOperationException("Locations are configured in jclouds properties");
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/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
deleted file mode 100644
index a1967f8..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderImpl.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.profitbricks.compute;
-
-import 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/7202e055/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 629fadc..abc732d 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
@@ -36,8 +36,8 @@ 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.compute.strategy.CreateNodesInGroupThenAddToSet;
 import org.jclouds.domain.Location;
 import org.jclouds.functions.IdentityFunction;
 import org.jclouds.lifecycle.Closer;
@@ -47,50 +47,40 @@ import org.jclouds.profitbricks.ProfitBricksApi;
 import org.jclouds.profitbricks.compute.ProfitBricksComputeServiceAdapter;
 import org.jclouds.profitbricks.compute.concurrent.ProvisioningJob;
 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;
 import org.jclouds.profitbricks.compute.function.ServerToNodeMetadata;
 import org.jclouds.profitbricks.compute.function.StorageToVolume;
-import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.compute.strategy.AssignDataCenterToTemplate;
 import org.jclouds.profitbricks.domain.Provisionable;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Storage;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.inject.Inject;
 import com.google.inject.Provides;
+import com.google.inject.Scopes;
 import com.google.inject.TypeLiteral;
 import com.google.inject.assistedinject.FactoryModuleBuilder;
 
 
 public class ProfitBricksComputeServiceContextModule extends
-        ComputeServiceAdapterContextModule<Server, Hardware, Provisionable, DataCenter> {
+        ComputeServiceAdapterContextModule<Server, Hardware, Provisionable, Location> {
 
+   @SuppressWarnings("unchecked")
    @Override
    protected void configure() {
       super.configure();
 
-      install(new LocationsFromComputeServiceAdapterModule<Server, Hardware, Provisionable, DataCenter>() {
-      });
-
       install(new FactoryModuleBuilder().build(ProvisioningJob.Factory.class));
 
-      bind(ImplicitLocationSupplier.class).to(OnlyLocationOrFirstZone.class).in(Singleton.class);
+      bind(ImplicitLocationSupplier.class).to(OnlyLocationOrFirstZone.class).in(Scopes.SINGLETON);
 
-      bind(new TypeLiteral<TemplateBuilder>(){}).to(ProfitBricksTemplateBuilderImpl.class);
-      
-      bind(new TypeLiteral<ComputeServiceAdapter<Server, Hardware, Provisionable, DataCenter>>() {
-      }).to(ProfitBricksComputeServiceAdapter.class);
+      bind(CreateNodesInGroupThenAddToSet.class).to(AssignDataCenterToTemplate.class).in(Scopes.SINGLETON);
 
-      bind(new TypeLiteral<Function<org.jclouds.profitbricks.domain.Location, Location>>() {
-      }).to(LocationToLocation.class);
-
-      bind(new TypeLiteral<Function<DataCenter, Location>>() {
-      }).to(DataCenterToLocation.class);
+      bind(new TypeLiteral<ComputeServiceAdapter<Server, Hardware, Provisionable, Location>>() {
+      }).to(ProfitBricksComputeServiceAdapter.class);
 
       bind(new TypeLiteral<Function<Server, NodeMetadata>>() {
       }).to(ServerToNodeMetadata.class);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/DataCenterToLocation.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/DataCenterToLocation.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/DataCenterToLocation.java
deleted file mode 100644
index 93fb3a0..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/DataCenterToLocation.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.profitbricks.compute.function;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import org.jclouds.domain.Location;
-import org.jclouds.domain.LocationBuilder;
-import org.jclouds.domain.LocationScope;
-import org.jclouds.profitbricks.domain.DataCenter;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableMap;
-import com.google.inject.Inject;
-
-public class DataCenterToLocation implements Function<DataCenter, Location> {
-
-   private final Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion;
-
-   @Inject
-   DataCenterToLocation(Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion) {
-      this.fnRegion = fnRegion;
-   }
-
-   @Override
-   public Location apply(DataCenter dataCenter) {
-      checkNotNull(dataCenter, "Null dataCenter");
-
-      LocationBuilder builder = new LocationBuilder()
-              .id(dataCenter.id())
-              .description(dataCenter.name())
-              .scope(LocationScope.ZONE)
-              .metadata(ImmutableMap.<String, Object>of(
-                              "version", dataCenter.version(),
-                              "state", dataCenter.state()));
-      if (dataCenter.location() != null)
-         builder.parent(fnRegion.apply(dataCenter.location()));
-      return builder.build();
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/LocationToLocation.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/LocationToLocation.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/LocationToLocation.java
deleted file mode 100644
index 999069b..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/LocationToLocation.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.profitbricks.compute.function;
-
-import org.jclouds.domain.LocationBuilder;
-import org.jclouds.domain.LocationScope;
-import org.jclouds.location.suppliers.all.JustProvider;
-import org.jclouds.profitbricks.domain.Location;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.inject.Inject;
-
-public class LocationToLocation implements Function<Location, org.jclouds.domain.Location> {
-
-   private final JustProvider justProvider;
-
-   @Inject
-   LocationToLocation(JustProvider justProvider) {
-      this.justProvider = justProvider;
-   }
-
-   @Override
-   public org.jclouds.domain.Location apply(Location in) {
-      return new LocationBuilder()
-              .id(in.getId())
-              .description(in.getDescription())
-              .scope(LocationScope.REGION)
-              .parent(Iterables.getOnlyElement(justProvider.get()))
-              .build();
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/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 4d0f511..5b27370 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
@@ -18,9 +18,13 @@ package org.jclouds.profitbricks.compute.function;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.find;
+import static org.jclouds.location.predicates.LocationPredicates.idEquals;
 
+import java.util.Set;
 import java.util.regex.Pattern;
 
+import org.jclouds.collect.Memoized;
 import org.jclouds.compute.domain.Image;
 import org.jclouds.compute.domain.ImageBuilder;
 import org.jclouds.compute.domain.OperatingSystem;
@@ -33,6 +37,7 @@ import org.jclouds.profitbricks.domain.Provisionable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Strings;
+import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 
@@ -44,9 +49,9 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
    private final SnapshotToImage fnSnapshotToImage;
 
    @Inject
-   ProvisionableToImage(Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion) {
-      this.fnImageToImage = new ImageToImage(fnRegion);
-      this.fnSnapshotToImage = new SnapshotToImage(fnRegion);
+   ProvisionableToImage(@Memoized Supplier<Set<? extends Location>> locations) {
+      this.fnImageToImage = new ImageToImage(locations);
+      this.fnSnapshotToImage = new SnapshotToImage(locations);
    }
 
    @Override
@@ -83,16 +88,17 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
 
       private static final Pattern HAS_NUMBERS = Pattern.compile(".*\\d+.*");
 
-      private final Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion;
+      private final Supplier<Set<? extends Location>> locations;
 
-      ImageToImage(Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion) {
-         this.fnRegion = fnRegion;
+      ImageToImage(Supplier<Set<? extends Location>> locations) {
+         this.locations = locations;
       }
 
       @Override
       public Image apply(org.jclouds.profitbricks.domain.Image from) {
          String desc = from.name();
          OsFamily osFamily = parseOsFamily(desc, from.osType());
+         Location location = find(locations.get(), idEquals(from.location().getId()));
 
          OperatingSystem os = OperatingSystem.builder()
                  .description(osFamily.value())
@@ -104,7 +110,7 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
          return addTypeMetadata(new ImageBuilder()
                  .ids(from.id())
                  .name(desc)
-                 .location(fnRegion.apply(from.location()))
+                 .location(location)
                  .status(Image.Status.AVAILABLE)
                  .operatingSystem(os))
                  .build();
@@ -159,16 +165,17 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
 
    private static class SnapshotToImage implements ImageFunction<Snapshot> {
 
-      private final Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion;
+      private final Supplier<Set<? extends Location>> locations;
 
-      SnapshotToImage(Function<org.jclouds.profitbricks.domain.Location, Location> fnRegion) {
-         this.fnRegion = fnRegion;
+      SnapshotToImage(Supplier<Set<? extends Location>> locations) {
+         this.locations = locations;
       }
 
       @Override
       public Image apply(Snapshot from) {
          String textToParse = from.name() + from.description();
          OsFamily osFamily = parseOsFamily(textToParse, from.osType());
+         Location location = find(locations.get(), idEquals(from.location().getId()));
 
          OperatingSystem os = OperatingSystem.builder()
                  .description(osFamily.value())
@@ -181,7 +188,7 @@ public class ProvisionableToImage implements Function<Provisionable, Image> {
                  .ids(from.id())
                  .name(from.name())
                  .description(from.description())
-                 .location(fnRegion.apply(from.location()))
+                 .location(location)
                  .status(mapStatus(from.state()))
                  .operatingSystem(os))
                  .build();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
index 9a8d551..9831c6f 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadata.java
@@ -18,18 +18,13 @@ package org.jclouds.profitbricks.compute.function;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Predicates.not;
-import static org.jclouds.profitbricks.domain.OsType.LINUX;
-import static org.jclouds.profitbricks.domain.OsType.WINDOWS;
-import static org.jclouds.profitbricks.domain.Server.Status.BLOCKED;
-import static org.jclouds.profitbricks.domain.Server.Status.CRASHED;
-import static org.jclouds.profitbricks.domain.Server.Status.PAUSED;
-import static org.jclouds.profitbricks.domain.Server.Status.RUNNING;
-import static org.jclouds.profitbricks.domain.Server.Status.SHUTDOWN;
-import static org.jclouds.profitbricks.domain.Server.Status.SHUTOFF;
+import static com.google.common.collect.Iterables.find;
+import static org.jclouds.location.predicates.LocationPredicates.idEquals;
 
 import java.util.List;
 import java.util.Set;
 
+import org.jclouds.collect.Memoized;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.HardwareBuilder;
 import org.jclouds.compute.domain.NodeMetadata;
@@ -38,7 +33,10 @@ 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.functions.GroupNamingConvention;
 import org.jclouds.domain.Location;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.jclouds.profitbricks.domain.Nic;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.Server;
@@ -46,32 +44,30 @@ import org.jclouds.profitbricks.domain.Storage;
 import org.jclouds.util.InetAddresses2.IsPrivateIPAddress;
 
 import com.google.common.base.Function;
-import com.google.common.base.Predicate;
 import com.google.common.base.Supplier;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
-import org.jclouds.collect.Memoized;
-import org.jclouds.compute.functions.GroupNamingConvention;
-
 public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
 
    private final Function<Storage, Volume> fnVolume;
-   private final Supplier<Set<? extends Location>> locationSupply;
+   private final Supplier<Set<? extends Location>> locations;
    private final Function<List<Nic>, List<String>> fnCollectIps;
+   private final ProfitBricksApi api;
 
    private final GroupNamingConvention groupNamingConvention;
 
    @Inject
    ServerToNodeMetadata(Function<Storage, Volume> fnVolume,
-           @Memoized Supplier<Set<? extends Location>> locationsSupply,
+           @Memoized Supplier<Set<? extends Location>> locations,
+           ProfitBricksApi api,
            GroupNamingConvention.Factory groupNamingConvention) {
       this.fnVolume = fnVolume;
-      this.locationSupply = locationsSupply;
+      this.locations = locations;
+      this.api = api;
       this.groupNamingConvention = groupNamingConvention.createWithoutPrefix();
       this.fnCollectIps = new Function<List<Nic>, List<String>>() {
-
          @Override
          public List<String> apply(List<Nic> in) {
             List<String> ips = Lists.newArrayListWithExpectedSize(in.size());
@@ -85,17 +81,9 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
    @Override
    public NodeMetadata apply(final Server server) {
       checkNotNull(server, "Null server");
-
-      // Map fetched dataCenterId with actual populated object
-      Location location = null;
-      if (server.dataCenter() != null)
-         location = Iterables.find(locationSupply.get(), new Predicate<Location>() {
-
-            @Override
-            public boolean apply(Location t) {
-               return t.getId().equals(server.dataCenter().id());
-            }
-         });
+      // Location is not populated in the datacenter on a server response
+      DataCenter dataCenter = api.dataCenterApi().getDataCenter(server.dataCenter().id());
+      Location location = find(locations.get(), idEquals(dataCenter.location().getId()));
 
       float size = 0f;
       List<Volume> volumes = Lists.newArrayList();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/AssignDataCenterToTemplate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/AssignDataCenterToTemplate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/AssignDataCenterToTemplate.java
new file mode 100644
index 0000000..f7db219
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/AssignDataCenterToTemplate.java
@@ -0,0 +1,110 @@
+/*
+ * 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.strategy;
+
+import static com.google.common.collect.Iterables.find;
+import static org.jclouds.Constants.PROPERTY_USER_THREADS;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
+
+import java.util.Map;
+import java.util.Set;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.compute.config.CustomizationResponse;
+import org.jclouds.compute.domain.NodeMetadata;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.functions.GroupNamingConvention;
+import org.jclouds.compute.reference.ComputeServiceConstants;
+import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
+import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap;
+import org.jclouds.compute.strategy.ListNodesStrategy;
+import org.jclouds.compute.strategy.impl.CreateNodesWithGroupEncodedIntoNameThenAddToSet;
+import org.jclouds.logging.Logger;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Location;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Multimap;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ListeningExecutorService;
+
+/**
+ * Attempts to find a valid datacenter in the configured location where the
+ * servers will be deployed. If no datacenter is found, one will be created.
+ */
+@Beta
+@Singleton
+public class AssignDataCenterToTemplate extends CreateNodesWithGroupEncodedIntoNameThenAddToSet {
+
+   @Resource
+   @Named(ComputeServiceConstants.COMPUTE_LOGGER)
+   protected Logger logger = Logger.NULL;
+
+   private final ProfitBricksApi api;
+   private final Predicate<String> waitDcUntilAvailable;
+
+   @Inject
+   protected AssignDataCenterToTemplate(
+         CreateNodeWithGroupEncodedIntoName addNodeWithGroupStrategy,
+         ListNodesStrategy listNodesStrategy,
+         GroupNamingConvention.Factory namingConvention,
+         @Named(PROPERTY_USER_THREADS) ListeningExecutorService userExecutor,
+         CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory,
+         ProfitBricksApi api, @Named(POLL_PREDICATE_DATACENTER) Predicate<String> waitDcUntilAvailable) {
+      super(addNodeWithGroupStrategy, listNodesStrategy, namingConvention, userExecutor,
+            customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory);
+      this.api = api;
+      this.waitDcUntilAvailable = waitDcUntilAvailable;
+   }
+
+   @Override
+   public Map<?, ListenableFuture<Void>> execute(String group, int count, final Template template,
+         Set<NodeMetadata> goodNodes, Map<NodeMetadata, Exception> badNodes,
+         Multimap<NodeMetadata, CustomizationResponse> customizationResponses) {
+
+      logger.info(">> looking for a datacenter in %s", template.getLocation().getId());
+
+      // Try to find an existing datacenter in the selected location
+      DataCenter dataCenter = find(api.dataCenterApi().getAllDataCenters(), new Predicate<DataCenter>() {
+         @Override
+         public boolean apply(DataCenter input) {
+            // The location field is not populated when getting the list of datacenters
+            DataCenter details = api.dataCenterApi().getDataCenter(input.id());
+            return details != null && template.getLocation().getId().equals(details.location().getId());
+         }
+      }, null);
+
+      if (dataCenter == null) {
+         String name = namingConvention.create().sharedNameForGroup(group);
+         logger.info(">> no datacenter was found. Creating a new one named %s in %s...", name, template.getLocation()
+               .getId());
+         dataCenter = api.dataCenterApi().createDataCenter(
+               DataCenter.Request.creatingPayload(name, Location.fromId(template.getLocation().getId())));
+         waitDcUntilAvailable.apply(dataCenter.id());
+      }
+
+      return super.execute(group, count, new TemplateWithDataCenter(template, dataCenter), goodNodes, badNodes,
+            customizationResponses);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/TemplateWithDataCenter.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/TemplateWithDataCenter.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/TemplateWithDataCenter.java
new file mode 100644
index 0000000..dd689d5
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/strategy/TemplateWithDataCenter.java
@@ -0,0 +1,107 @@
+/*
+ * 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.strategy;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.compute.domain.Hardware;
+import org.jclouds.compute.domain.Image;
+import org.jclouds.compute.domain.Template;
+import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.domain.Location;
+import org.jclouds.profitbricks.domain.DataCenter;
+
+import com.google.common.annotations.Beta;
+
+/**
+ * Extends the default {@link Template} object to provide the {@link DataCenter}
+ * where the nodes must be created.
+ */
+@Beta
+public class TemplateWithDataCenter implements Template {
+
+   private final Template delegate;
+
+   private final DataCenter dataCenter;
+
+   // For internal use only
+   TemplateWithDataCenter(Template delegate, DataCenter dataCenter) {
+      this.delegate = checkNotNull(delegate, "delegate cannot be null");
+      this.dataCenter = checkNotNull(dataCenter, "dataCenter cannot be null");
+   }
+
+   public DataCenter getDataCenter() {
+      return dataCenter;
+   }
+
+   public Template clone() {
+      return new TemplateWithDataCenter(delegate.clone(), dataCenter);
+   }
+
+   public Hardware getHardware() {
+      return delegate.getHardware();
+   }
+
+   public Image getImage() {
+      return delegate.getImage();
+   }
+
+   public Location getLocation() {
+      return delegate.getLocation();
+   }
+
+   public TemplateOptions getOptions() {
+      return delegate.getOptions();
+   }
+
+   @Override
+   public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((dataCenter == null) ? 0 : dataCenter.hashCode());
+      result = prime * result + ((delegate == null) ? 0 : delegate.hashCode());
+      return result;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      TemplateWithDataCenter other = (TemplateWithDataCenter) obj;
+      if (dataCenter == null) {
+         if (other.dataCenter != null)
+            return false;
+      } else if (!dataCenter.equals(other.dataCenter))
+         return false;
+      if (delegate == null) {
+         if (other.delegate != null)
+            return false;
+      } else if (!delegate.equals(other.delegate))
+         return false;
+      return true;
+   }
+
+   @Override
+   public String toString() {
+      return delegate.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/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 dcb1edc..0061090 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
@@ -16,94 +16,25 @@
  */
 package org.jclouds.profitbricks.compute;
 
-import static org.jclouds.profitbricks.BaseProfitBricksLiveTest.testLocation;
-import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
-
-import java.util.Objects;
-
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import com.google.common.collect.FluentIterable;
-
+import org.jclouds.compute.domain.ExecResponse;
 import org.jclouds.compute.domain.NodeMetadata;
-import org.testng.annotations.Test;
-
 import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
+import org.jclouds.logging.config.LoggingModule;
+import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
 import org.jclouds.sshj.config.SshjSshClientModule;
+import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-import com.google.inject.Key;
 import com.google.inject.Module;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Names;
-
-import org.jclouds.compute.domain.ExecResponse;
-import org.jclouds.logging.config.LoggingModule;
-import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.domain.DataCenter;
-import org.jclouds.profitbricks.features.DataCenterApi;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
 
 @Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceLiveTest")
 public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTest {
 
-   private static final String TEST_DC_NAME = "computeServiceLiveTest-" + System.currentTimeMillis();
-
-   private DataCenter dataCenter;
-
    public ProfitBricksComputeServiceLiveTest() {
       provider = "profitbricks";
    }
 
-   @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());
-         }
-      });
-   }
-
-   @AfterClass(groups = {"integration", "live"}, alwaysRun = true)
-   @Override
-   protected void tearDownContext() {
-      super.tearDownContext();
-      if (dataCenter != null)
-         getDataCenterApi().deleteDataCenter(dataCenter.id());
-   }
-
-   private Predicate<String> getDataCenterPredicate() {
-      return client.getContext().utils().injector().getInstance(Key.get(new TypeLiteral<Predicate<String>>() {
-      }, Names.named(POLL_PREDICATE_DATACENTER)));
-   }
-
-   private DataCenterApi getDataCenterApi() {
-      return client.getContext().unwrapApi(ProfitBricksApi.class).dataCenterApi();
-   }
-
    @Override
    protected Module getSshModule() {
       return new SshjSshClientModule();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/DataCenterToLocationTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/DataCenterToLocationTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/DataCenterToLocationTest.java
deleted file mode 100644
index 7dcf69c..0000000
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/DataCenterToLocationTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.profitbricks.compute.function;
-
-import static org.testng.Assert.assertEquals;
-
-import java.net.URI;
-
-import org.jclouds.domain.Location;
-import org.jclouds.domain.LocationBuilder;
-import org.jclouds.domain.LocationScope;
-import org.jclouds.location.suppliers.all.JustProvider;
-import org.jclouds.profitbricks.ProfitBricksProviderMetadata;
-import org.jclouds.profitbricks.domain.DataCenter;
-import org.jclouds.profitbricks.domain.ProvisioningState;
-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 = "DataCenterToLocationTest")
-public class DataCenterToLocationTest {
-
-   private DataCenterToLocation fnLocation;
-   private LocationToLocation fnRegion;
-
-   @BeforeTest
-   public void setup() {
-      ProfitBricksProviderMetadata metadata = new ProfitBricksProviderMetadata();
-      JustProvider justProvider = new JustProvider(metadata.getId(), Suppliers.<URI>ofInstance(
-              URI.create(metadata.getEndpoint())), ImmutableSet.<String>of());
-      this.fnRegion = new LocationToLocation(justProvider);
-      this.fnLocation = new DataCenterToLocation(fnRegion);
-   }
-
-   @Test
-   public void testDataCenterToLocation() {
-      DataCenter dataCenter = DataCenter.builder()
-              .id("12345678-abcd-efgh-ijkl-987654321000")
-              .version(10)
-              .name("JClouds-DC")
-              .state(ProvisioningState.AVAILABLE)
-              .location(org.jclouds.profitbricks.domain.Location.DE_FRA)
-              .build();
-
-      Location actual = fnLocation.apply(dataCenter);
-
-      Location expected = new LocationBuilder()
-              .id(dataCenter.id())
-              .description(dataCenter.name())
-              .scope(LocationScope.ZONE)
-              .metadata(ImmutableMap.<String, Object>of(
-                              "version", dataCenter.version(),
-                              "state", dataCenter.state()))
-              .parent(fnRegion.apply(org.jclouds.profitbricks.domain.Location.DE_FRA))
-              .build();
-
-      assertEquals(actual, expected);
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/LocationToLocationTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/LocationToLocationTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/LocationToLocationTest.java
deleted file mode 100644
index 3967cf5..0000000
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/LocationToLocationTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.profitbricks.compute.function;
-
-import static org.testng.Assert.assertEquals;
-
-import java.net.URI;
-
-import org.jclouds.domain.LocationBuilder;
-import org.jclouds.domain.LocationScope;
-import org.jclouds.location.suppliers.all.JustProvider;
-import org.jclouds.profitbricks.ProfitBricksProviderMetadata;
-import org.jclouds.profitbricks.domain.Location;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-import com.google.common.base.Suppliers;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-
-@Test(groups = "unit", testName = "LocationToLocationTest")
-public class LocationToLocationTest {
-
-   private LocationToLocation fnRegion;
-   private JustProvider justProvider;
-
-   @BeforeTest
-   public void setup() {
-      ProfitBricksProviderMetadata metadata = new ProfitBricksProviderMetadata();
-      this.justProvider = new JustProvider(metadata.getId(), Suppliers.<URI>ofInstance(
-              URI.create(metadata.getEndpoint())), ImmutableSet.<String>of());
-      this.fnRegion = new LocationToLocation(justProvider);
-   }
-
-   @Test
-   public void testLocationToLocation() {
-      Location[] locations = Location.values();
-      for (Location loc : locations) {
-         org.jclouds.domain.Location actual = fnRegion.apply(loc);
-         org.jclouds.domain.Location expected = new LocationBuilder()
-                 .id(loc.getId()).description(loc.getDescription()).scope(LocationScope.REGION)
-                 .parent(Iterables.getOnlyElement(justProvider.get())).build();
-
-         assertEquals(actual, expected);
-      }
-
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/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 f27b302..ddecc83 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
@@ -16,18 +16,20 @@
  */
 package org.jclouds.profitbricks.compute.function;
 
+import static org.jclouds.profitbricks.domain.Location.US_LAS;
 import static org.testng.Assert.assertEquals;
 
-import java.net.URI;
+import java.util.Calendar;
 import java.util.Date;
+import java.util.Set;
 
 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.location.suppliers.all.JustProvider;
-import org.jclouds.profitbricks.ProfitBricksProviderMetadata;
-import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
 import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Snapshot;
@@ -42,15 +44,13 @@ import com.google.common.collect.ImmutableSet;
 public class ProvisionableToImageTest {
 
    private ProvisionableToImage fnImage;
-   private LocationToLocation fnRegion;
+   
+   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() {
-      ProfitBricksProviderMetadata metadata = new ProfitBricksProviderMetadata();
-      JustProvider justProvider = new JustProvider(metadata.getId(), Suppliers.<URI>ofInstance(
-              URI.create(metadata.getEndpoint())), ImmutableSet.<String>of());
-      this.fnRegion = new LocationToLocation(justProvider);
-      this.fnImage = new ProvisionableToImage(fnRegion);
+      this.fnImage = new ProvisionableToImage(Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet.of(location)));
    }
 
    @Test
@@ -66,7 +66,7 @@ public class ProvisionableToImageTest {
               .name("Ubuntu-14.04-LTS-server-2015-01-01")
               .size(2048f)
               .type(org.jclouds.profitbricks.domain.Image.Type.HDD)
-              .location(Location.US_LAS)
+              .location(US_LAS)
               .isNicHotPlug(true)
               .isNicHotUnPlug(true)
               .osType(OsType.LINUX)
@@ -81,7 +81,7 @@ public class ProvisionableToImageTest {
       Image expected = new ImageBuilder()
               .ids(image.id())
               .name(image.name())
-              .location(fnRegion.apply(Location.US_LAS))
+              .location(location)
               .status(Image.Status.AVAILABLE)
               .operatingSystem(OperatingSystem.builder()
                       .description("UBUNTU")
@@ -103,7 +103,7 @@ public class ProvisionableToImageTest {
               .name("Fedora-19-server-2015-01-01")
               .size(2048f)
               .type(org.jclouds.profitbricks.domain.Image.Type.HDD)
-              .location(Location.DE_FRA)
+              .location(US_LAS)
               .osType(OsType.LINUX)
               .build();
 
@@ -112,7 +112,7 @@ public class ProvisionableToImageTest {
       Image expected1 = new ImageBuilder()
               .ids(image1.id())
               .name(image1.name())
-              .location(fnRegion.apply(image1.location()))
+              .location(location)
               .status(Image.Status.AVAILABLE)
               .operatingSystem(OperatingSystem.builder()
                       .description("FEDORA")
@@ -131,7 +131,7 @@ public class ProvisionableToImageTest {
               .name("clearos-community-6.5.0-x86_64.iso")
               .size(2048f)
               .type(org.jclouds.profitbricks.domain.Image.Type.CDROM)
-              .location(Location.DE_FKB)
+              .location(US_LAS)
               .osType(OsType.LINUX)
               .build();
 
@@ -140,7 +140,7 @@ public class ProvisionableToImageTest {
       Image expected2 = new ImageBuilder()
               .ids(image2.id())
               .name(image2.name())
-              .location(fnRegion.apply(image2.location()))
+              .location(location)
               .status(Image.Status.AVAILABLE)
               .operatingSystem(OperatingSystem.builder()
                       .description("UNRECOGNIZED")
@@ -159,7 +159,7 @@ public class ProvisionableToImageTest {
               .name("windows-2008-r2-server-setup.iso")
               .size(2048f)
               .type(org.jclouds.profitbricks.domain.Image.Type.CDROM)
-              .location(Location.US_LASDEV)
+              .location(US_LAS)
               .osType(OsType.WINDOWS)
               .build();
 
@@ -168,7 +168,7 @@ public class ProvisionableToImageTest {
       Image expected3 = new ImageBuilder()
               .ids(image3.id())
               .name(image3.name())
-              .location(fnRegion.apply(image3.location()))
+              .location(location)
               .status(Image.Status.AVAILABLE)
               .operatingSystem(OperatingSystem.builder()
                       .description("WINDOWS")
@@ -185,6 +185,10 @@ public class ProvisionableToImageTest {
 
    @Test
    public void testSnapshotToImage() {
+      Calendar calendar = Calendar.getInstance();
+      calendar.set(2015, 4, 13);
+      Date date = calendar.getTime();
+      
       Snapshot snapshot1 = Snapshot.builder()
               .isBootable(true)
               .isCpuHotPlug(true)
@@ -195,13 +199,13 @@ public class ProvisionableToImageTest {
               .name("placeholder-snapshot-04/13/2015")
               .description("Created from \"placeholder\" in Data Center \"sbx-computeservice\"")
               .size(2048f)
-              .location(Location.US_LAS)
+              .location(US_LAS)
               .isNicHotPlug(true)
               .isNicHotUnPlug(true)
               .osType(OsType.LINUX)
               .isRamHotPlug(true)
               .isRamHotUnPlug(false)
-              .creationTime(new Date(2015, 4, 13))
+              .creationTime(date)
               .lastModificationTime(new Date())
               .state(ProvisioningState.AVAILABLE)
               .build();
@@ -211,7 +215,7 @@ public class ProvisionableToImageTest {
       Image expected1 = new ImageBuilder()
               .ids(snapshot1.id())
               .name(snapshot1.name())
-              .location(fnRegion.apply(Location.US_LAS))
+              .location(location)
               .status(Image.Status.AVAILABLE)
               .operatingSystem(OperatingSystem.builder()
                       .description(snapshot1.description())
@@ -233,13 +237,13 @@ public class ProvisionableToImageTest {
               .name("jclouds-ubuntu14.10-template")
               .description("Created from \"jclouds-ubuntu14.10 Storage\" in Data Center \"jclouds-computeservice\"")
               .size(10240f)
-              .location(Location.DE_FKB)
+              .location(US_LAS)
               .isNicHotPlug(true)
               .isNicHotUnPlug(true)
               .osType(OsType.LINUX)
               .isRamHotPlug(true)
               .isRamHotUnPlug(false)
-              .creationTime(new Date(2015, 4, 13))
+              .creationTime(date)
               .lastModificationTime(new Date())
               .state(ProvisioningState.INPROCESS)
               .build();
@@ -249,7 +253,7 @@ public class ProvisionableToImageTest {
       Image expected2 = new ImageBuilder()
               .ids(snapshot2.id())
               .name(snapshot2.name())
-              .location(fnRegion.apply(Location.DE_FKB))
+              .location(location)
               .status(Image.Status.PENDING)
               .operatingSystem(OperatingSystem.builder()
                       .description("ubuntu")

http://git-wip-us.apache.org/repos/asf/jclouds/blob/7202e055/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
index 7f1da39..60f43ec 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
@@ -16,11 +16,16 @@
  */
 package org.jclouds.profitbricks.compute.function;
 
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
+import static org.jclouds.profitbricks.domain.Location.DE_FRA;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
 import java.util.Set;
 
+import org.easymock.EasyMock;
 import org.jclouds.compute.domain.HardwareBuilder;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.domain.NodeMetadataBuilder;
@@ -33,6 +38,7 @@ import org.jclouds.compute.functions.GroupNamingConvention;
 import org.jclouds.domain.Location;
 import org.jclouds.domain.LocationBuilder;
 import org.jclouds.domain.LocationScope;
+import org.jclouds.profitbricks.ProfitBricksApi;
 import org.jclouds.profitbricks.ProfitBricksApiMetadata;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
 import org.jclouds.profitbricks.domain.DataCenter;
@@ -41,12 +47,13 @@ import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.domain.Storage;
-import org.testng.annotations.BeforeTest;
+import org.jclouds.profitbricks.features.DataCenterApi;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 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;
@@ -56,25 +63,25 @@ import com.google.inject.name.Names;
 public class ServerToNodeMetadataTest {
 
    private ServerToNodeMetadata fnNodeMetadata;
+   
+   private ProfitBricksApi api;
+   
+   private DataCenterApi dataCenterApi;
 
-   @BeforeTest
+   @BeforeMethod
    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("12345678-abcd-efgh-ijkl-987654321000")
-                    .description("JClouds-DC")
-                    .scope(LocationScope.REGION)
-                    .metadata(ImmutableMap.<String, Object>of(
-                                    "version", "10",
-                                    "state", "AVAILABLE"))
+                    .id("de/fra")
+                    .description("de/fra")
+                    .scope(LocationScope.ZONE)
                     .parent(new LocationBuilder()
-                            .id("de/fra")
-                            .description("Germany, Frankfurt (M)")
-                            .scope(LocationScope.PROVIDER)
+                            .id("de")
+                            .description("de")
+                            .scope(LocationScope.REGION)
                             .build())
                     .build());
          }
@@ -86,15 +93,31 @@ public class ServerToNodeMetadataTest {
             Names.bindProperties(binder(), new ProfitBricksApiMetadata().getDefaultProperties());
          }
       }).getInstance(GroupNamingConvention.Factory.class);
+      
+      dataCenterApi = EasyMock.createMock(DataCenterApi.class);
+      api = EasyMock.createMock(ProfitBricksApi.class);
+
+      expect(dataCenterApi.getDataCenter("mock")).andReturn(
+            DataCenter.builder().id("mock").version(10).location(DE_FRA).build());
+      expect(api.dataCenterApi()).andReturn(dataCenterApi);
+      
+      replay(dataCenterApi, api);
 
-      this.fnNodeMetadata = new ServerToNodeMetadata(new StorageToVolume(), locationsSupply, namingConvention);
+      this.fnNodeMetadata = new ServerToNodeMetadata(new StorageToVolume(), locationsSupply, api, namingConvention);
+   }
+   
+   @AfterMethod
+   public void tearDown() {
+      verify(api, dataCenterApi);
    }
 
    @Test
    public void testServerToNodeMetadata() {
       Server server = Server.builder()
               .dataCenter(DataCenter.builder()
-                      .id("12345678-abcd-efgh-ijkl-987654321000").version(10)
+                      .id("mock")
+                      .version(10)
+                      .location(org.jclouds.profitbricks.domain.Location.DE_FRA)
                       .build())
               .id("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
               .name("mock-facebook-node")
@@ -164,16 +187,13 @@ public class ServerToNodeMetadataTest {
                       .family(OsFamily.LINUX)
                       .build())
               .location(new LocationBuilder()
-                      .id("12345678-abcd-efgh-ijkl-987654321000")
-                      .description("JClouds-DC")
-                      .scope(LocationScope.REGION)
-                      .metadata(ImmutableMap.<String, Object>of(
-                                      "version", "10",
-                                      "state", "AVAILABLE"))
+                      .id("de/fra")
+                      .description("de/fra")
+                      .scope(LocationScope.ZONE)
                       .parent(new LocationBuilder()
-                              .id("de/fra")
-                              .description("Germany, Frankfurt (M)")
-                              .scope(LocationScope.PROVIDER)
+                              .id("de")
+                              .description("de")
+                              .scope(LocationScope.REGION)
                               .build())
                       .build())
               .publicAddresses(ImmutableList.<String>of("173.252.120.6"))


[27/35] jclouds git commit: JCLOUDS-951: Remove inheritance in ProfitBrick's AutoValue classes

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
index e1ba061..87a043c 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
@@ -28,10 +28,7 @@ public class RollbackSnapshotRequestBinderTest {
    public void testRollbackPayload() {
       RollbackSnapshotRequestBinder binder = new RollbackSnapshotRequestBinder();
 
-      Snapshot.Request.RollbackPayload payload = Snapshot.Request.rollbackBuilder()
-              .snapshotId("snapshot-id")
-              .storageId("storage-id")
-              .build();
+      Snapshot.Request.RollbackPayload payload = Snapshot.Request.createRollbackPayload("snapshot-id", "storage-id");
 
       String actual = binder.createPayload(payload);
       assertNotNull(actual, "Binder returned null payload");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinderTest.java
index 3acb8e1..1809a1c 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/UpdateSnapshotRequestBinderTest.java
@@ -30,7 +30,21 @@ public class UpdateSnapshotRequestBinderTest {
    public void testUpdatePayload() {
       UpdateSnapshotRequestBinder binder = new UpdateSnapshotRequestBinder();
 
-      Snapshot.Request.UpdatePayload payload = Snapshot.Request.UpdatePayload.create("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh", "description", "snapshot-name", true, OsType.LINUX, true, true, true, true, true, true, true, true);
+      Snapshot.Request.UpdatePayload payload = Snapshot.Request.updatingBuilder()
+              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+              .description("description")
+              .name("snapshot-name")
+              .bootable(true)
+              .osType(OsType.LINUX)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(true)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .build();
 
       String actual = binder.createPayload(payload);
       assertNotNull(actual, "Binder returned null payload");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
index 5fba62b..7f1da39 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
@@ -130,7 +130,7 @@ public class ServerToNodeMetadataTest {
                               .internetAccess(true)
                               .serverId("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
                               .macAddress("02:01:09:cd:f0:b0")
-                              .ip("173.252.120.6")
+                              .ips( ImmutableList.<String>of("173.252.120.6"))
                               .build()
                       )
               )

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/FirewallRuleBuilderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/FirewallRuleBuilderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/FirewallRuleBuilderTest.java
index af29eae..6f43604 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/FirewallRuleBuilderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/FirewallRuleBuilderTest.java
@@ -58,7 +58,7 @@ public class FirewallRuleBuilderTest {
 
    @Test
    public void testAutoValueFirewallRuleWithIcmpPropertiesSettingCorrectly() {
-      Firewall.RuleWithIcmp actual = Firewall.RuleWithIcmp.builder()
+      Firewall.Rule actual = Firewall.Rule.builder()
               .name(_name)
               .icmpCode(_icmpCode)
               .icmpType(_icmpType)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
index c04f65c..6cad856 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/domain/ServerBuilderTest.java
@@ -29,8 +29,8 @@ public class ServerBuilderTest {
    private final Boolean _isNicHotUnPlug = false;
    private final Boolean _isDiscVirtioHotPlug = true;
    private final Boolean _isDiscVirtioHotUnPlug = false;
-   private final int _cores = 8;
-   private final int _ram = 8 * 1024;
+   private final Integer _cores = 8;
+   private final Integer _ram = 8 * 1024;
    private final String _id = "some-random-server-id";
    private final String _name = "jclouds-node";
    private final Boolean _hasInternetAccess = true;
@@ -110,7 +110,7 @@ public class ServerBuilderTest {
       assertEquals(actual.availabilityZone(), _availabilityZone);
       assertEquals(actual.bootFromImageId(), _bootFromImageId);
       assertEquals(actual.bootFromStorageId(), _bootFromStorageId);
-      assertEquals(actual.cores(), _cores);
+      assertEquals(actual.cores(), _cores.intValue());
       assertEquals(actual.dataCenterId(), _dataCenterId);
       assertEquals(actual.hasInternetAccess(), _hasInternetAccess);
       assertEquals(actual.name(), _name);
@@ -121,7 +121,7 @@ public class ServerBuilderTest {
       assertEquals(actual.isNicHotUnPlug(), _isNicHotUnPlug);
       assertEquals(actual.isRamHotPlug(), _isRamHotPlug);
       assertEquals(actual.lanId(), _lanId);
-      assertEquals(actual.ram(), _ram);
+      assertEquals(actual.ram(), _ram.intValue());
       assertEquals(actual.osType(), _osType);
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
index 36191ca..6bcf053 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiLiveTest.java
@@ -41,7 +41,7 @@ public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest {
    @Test
    public void testCreateDataCenter() {
       DataCenter dc = api.dataCenterApi().createDataCenter(
-              DataCenter.Request.CreatePayload.create("JClouds", Location.DE_FKB)
+              DataCenter.Request.creatingPayload("JClouds", Location.DE_FKB)
       );
 
       assertNotNull(dc);
@@ -83,7 +83,7 @@ public class DataCenterApiLiveTest extends BaseProfitBricksLiveTest {
 
       final String newName = "Apache";
       DataCenter dataCenter = api.dataCenterApi().updateDataCenter(
-              DataCenter.Request.UpdatePayload.create(dcId, newName)
+              DataCenter.Request.updatingPayload(dcId, newName)
       );
 
       assertNotNull(dataCenter);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
index 586487b..262d34a 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DataCenterApiMockTest.java
@@ -153,7 +153,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
               + "</request></ws:createDataCenter>";
       try {
          DataCenter dataCenter = api.createDataCenter(
-                 DataCenter.Request.CreatePayload.create("JClouds-DC", Location.DE_FRA)
+                 DataCenter.Request.creatingPayload("JClouds-DC", Location.DE_FRA)
          );
          assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(dataCenter);
@@ -170,7 +170,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
       String[] names = {"JCl@ouds", "JC|ouds", "^clouds", ""};
       for (String name : names)
          try {
-            DataCenter.Request.CreatePayload.create(name, Location.US_LAS);
+            DataCenter.Request.creatingPayload(name, Location.US_LAS);
             fail("Should have failed for name: ".concat(name));
          } catch (IllegalArgumentException ex) {
             // expected exception
@@ -194,7 +194,7 @@ public class DataCenterApiMockTest extends BaseProfitBricksMockTest {
               + "</request></ws:updateDataCenter>";
       try {
          DataCenter dataCenter = api.updateDataCenter(
-                 DataCenter.Request.UpdatePayload.create(id, newName)
+                 DataCenter.Request.updatingPayload(id, newName)
          );
          assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(dataCenter);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
index 8e84746..2f3c767 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
@@ -60,7 +60,7 @@ public class DrivesApiLiveTest extends BaseProfitBricksLiveTest {
    public void addRomDriveToServerTest() {
       String requestId = api.drivesApi().addRomDriveToServer(Drive.Request.AddRomDriveToServerPayload.builder()
               .serverId(serverId)
-              .storageId("05cadf29-6c12-11e4-beeb-52540066fee9")
+              .imageId("05cadf29-6c12-11e4-beeb-52540066fee9")
               .deviceNumber("0")
               .build());
       assertNotNull(requestId);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiMockTest.java
index d55676d..38cdcf0 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiMockTest.java
@@ -46,7 +46,7 @@ public class DrivesApiMockTest extends BaseProfitBricksMockTest {
       try {
          String requestId = api.addRomDriveToServer(Drive.Request.AddRomDriveToServerPayload.builder()
                  .serverId("server-id")
-                 .storageId("image-id")
+                 .imageId("image-id")
                  .deviceNumber("device-number")
                  .build());
          assertRequestHasCommonProperties(server.takeRequest(), content);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
index ddf94d4..772667a 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
@@ -75,13 +75,13 @@ public class FirewallApiLiveTest extends BaseProfitBricksLiveTest {
    @Test
    public void testAddFirewallRuleToNic() {
       Firewall firewall = api.firewallApi().addFirewallRuleToNic(
-              Firewall.Request.ruleAddingBuilder()
-              .nicId(nic.id())
-              .newRule()
-              .name("test-rule-tcp")
-              .protocol(Protocol.TCP)
-              .endRule()
-              .build());
+              Firewall.Request.createAddRulePayload(nic.id(), ImmutableList.of(
+                              Firewall.Rule.builder()
+                              .name("test-rule-tcp")
+                              .protocol(Protocol.TCP)
+                              .build()
+                      ))
+      );
 
       assertNotNull(firewall);
       assertNotNull(firewall.rules());

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiMockTest.java
index 17ec324..d9531cb 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiMockTest.java
@@ -128,18 +128,18 @@ public class FirewallApiMockTest extends BaseProfitBricksMockTest {
               + "</request>"
               + "</ws:addFirewallRulesToNic>";
       try {
-         Firewall.Request.AddRulePayload payload = Firewall.Request.ruleAddingBuilder()
-                 .nicId("nic-id")
-                 .newRule()
-                 .name("name")
-                 .portRangeEnd(45678)
-                 .portRangeStart(12345)
-                 .protocol(Protocol.TCP)
-                 .sourceIp("192.168.0.1")
-                 .sourceMac("aa:bb:cc:dd:ee:ff")
-                 .targetIp("192.168.0.2")
-                 .endRule()
-                 .build();
+         Firewall.Request.AddRulePayload payload = Firewall.Request.createAddRulePayload(
+                 "nic-id", ImmutableList.of(
+                         Firewall.Rule.builder()
+                         .name("name")
+                         .portRangeEnd(45678)
+                         .portRangeStart(12345)
+                         .protocol(Protocol.TCP)
+                         .sourceIp("192.168.0.1")
+                         .sourceMac("aa:bb:cc:dd:ee:ff")
+                         .targetIp("192.168.0.2")
+                         .build()
+                 ));
          Firewall response = api.addFirewallRuleToNic(payload);
 
          assertRequestHasCommonProperties(server.takeRequest(), content);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiLiveTest.java
new file mode 100644
index 0000000..e293e1c
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiLiveTest.java
@@ -0,0 +1,134 @@
+/*
+ * 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.features;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.List;
+
+import com.google.common.collect.Iterables;
+
+import org.assertj.core.util.Lists;
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
+import org.jclouds.profitbricks.domain.Server;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "LoadBalancerApiLiveTest")
+public class LoadBalancerApiLiveTest extends BaseProfitBricksLiveTest {
+
+   private String dataCenterId;
+   private String loadBalancerId;
+   private String serverId;
+
+   @Override
+   protected void initialize() {
+      super.initialize();
+      List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
+      assertFalse(dataCenters.isEmpty(), "At least 1 datacenter has to be available for loadbalancer testing.");
+
+      dataCenterId = Iterables.getFirst(dataCenters, null).id();
+
+      List<Server> servers = api.serverApi().getAllServers();
+      assertFalse(servers.isEmpty(), "At least 1 server has to be available for loadbalancer testing.");
+
+      serverId = Iterables.getFirst(servers, null).id();
+   }
+
+   @Test
+   public void testCreateLoadBalancer() {
+      List<String> serverIds = com.google.common.collect.Lists.newArrayList();
+      serverIds.add("server-ids");
+
+      LoadBalancer.Request.CreatePayload payload = LoadBalancer.Request.creatingBuilder()
+              .dataCenterId(dataCenterId)
+              .name("testName")
+              .algorithm(Algorithm.ROUND_ROBIN)
+              .ip("0.0.0.1")
+              .lanId(1)
+              .serverIds(serverIds)
+              .build();
+
+      String requestId = api.loadBalancerApi().createLoadBalancer(payload);
+
+      assertNotNull(requestId);
+   }
+
+   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   public void testGetAllLoadBalancers() {
+      List<LoadBalancer> loadBalancers = api.loadBalancerApi().getAllLoadBalancers();
+
+      assertFalse(loadBalancers.isEmpty());
+   }
+
+   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   public void testGetLoadBalancer() {
+      LoadBalancer loadBalancer = api.loadBalancerApi().getLoadBalancer(loadBalancerId);
+
+      assertNotNull(loadBalancer);
+   }
+
+   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   public void testRegisterLoadBalancer() {
+      List<String> serverIds = Lists.newArrayList();
+      serverIds.add(serverId);
+
+      LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request
+              .createRegisteringPaylod(loadBalancerId, serverIds);
+
+      LoadBalancer loadBalancer = api.loadBalancerApi().registerLoadBalancer(payload);
+
+      assertNotNull(loadBalancer);
+   }
+
+   @Test(dependsOnMethods = "testRegisterLoadBalancer")
+   public void testDeregisterLoadBalancer() {
+      List<String> serverIds = Lists.newArrayList();
+      serverIds.add(serverId);
+
+      LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request
+              .createDeregisteringPayload(loadBalancerId, serverIds);
+
+      LoadBalancer loadBalancer = api.loadBalancerApi().deregisterLoadBalancer(payload);
+
+      assertNotNull(loadBalancer);
+   }
+
+   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   public void testUpdateLoadBalancer() {
+      LoadBalancer.Request.UpdatePayload payload = LoadBalancer.Request.updatingBuilder()
+              .id(loadBalancerId)
+              .name("whatever")
+              .build();
+
+      LoadBalancer loadBalancer = api.loadBalancerApi().updateLoadBalancer(payload);
+
+      assertNotNull(loadBalancer);
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void testDeleteLoadBalancer() {
+      boolean result = api.loadBalancerApi().deleteLoadBalancer(loadBalancerId);
+
+      Assert.assertTrue(result);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiMockTest.java
new file mode 100644
index 0000000..c4f26aa
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadBalancerApiMockTest.java
@@ -0,0 +1,290 @@
+/*
+ * 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.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.AssertJUnit.assertTrue;
+
+import java.util.List;
+
+import com.google.common.collect.Lists;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "LoadBalancerApiMockTest")
+public class LoadBalancerApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetAllLoadBalancers() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancers.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      try {
+         List<LoadBalancer> loadBalancerList = api.getAllLoadBalancers();
+
+         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllLoadBalancers/>");
+         assertNotNull(loadBalancerList);
+         assertTrue(loadBalancerList.size() == 2);
+
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllLoadBalancersReturning404() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      try {
+         List<LoadBalancer> loadBalancerList = api.getAllLoadBalancers();
+
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertTrue(loadBalancerList.isEmpty());
+
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+
+      String content = "<ws:getLoadBalancer><loadBalancerId>" + id + "</loadBalancerId></ws:getLoadBalancer>";
+      try {
+         LoadBalancer loadBalancer = api.getLoadBalancer(id);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(loadBalancer);
+         assertEquals(loadBalancer.id(), id);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetNonExistingLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String id = "random-non-existing-id";
+
+      try {
+         LoadBalancer loadBalancer = api.getLoadBalancer(id);
+
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(loadBalancer);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testCreateLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-create.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String content = "<ws:createLoadBalancer>"
+              + "<request>"
+              + "<dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee</dataCenterId>"
+              + "<loadBalancerName>load-balancer-name</loadBalancerName>"
+              + "<loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>"
+              + "<ip>192.168.0.1</ip>"
+              + "<lanId>3</lanId>"
+              + "<serverIds>server-ids</serverIds>"
+              + "</request>"
+              + "</ws:createLoadBalancer>";
+
+      try {
+         List<String> serverIds = Lists.newArrayList();
+         serverIds.add("server-ids");
+         String requestId = api.createLoadBalancer(LoadBalancer.Request.creatingBuilder()
+                 .dataCenterId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee")
+                 .name("load-balancer-name")
+                 .algorithm(Algorithm.ROUND_ROBIN)
+                 .ip("192.168.0.1")
+                 .lanId(3)
+                 .serverIds(serverIds)
+                 .build());
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testUpdateLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-create.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      String newName = "Apache";
+
+      String content = "<ws:updateLoadBalancer>"
+              + "<request>"
+              + "<loadBalancerId>" + id + "</loadBalancerId>"
+              + "<loadBalancerName>load-balancer-name</loadBalancerName>"
+              + "<loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>"
+              + "<ip>192.168.0.1</ip>"
+              + "</request>"
+              + "</ws:updateLoadBalancer>";
+
+      try {
+         LoadBalancer.Request.UpdatePayload toUpdate = LoadBalancer.Request.updatingBuilder()
+                 .id(id)
+                 .name("load-balancer-name")
+                 .algorithm(Algorithm.ROUND_ROBIN)
+                 .ip("192.168.0.1")
+                 .build();
+
+         LoadBalancer loadBalancer = api.updateLoadBalancer(toUpdate);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(loadBalancer);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+
+   }
+
+   @Test
+   public void testRegisterLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-register.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String content = "<ws:registerServersOnLoadBalancer>"
+              + "<request>"
+              + "<loadBalancerId>1234</loadBalancerId>"
+              + "<serverIds>1</serverIds>"
+              + "<serverIds>2</serverIds>"
+              + "</request>"
+              + "</ws:registerServersOnLoadBalancer>";
+
+      try {
+         List<String> serverIds = Lists.newArrayList();
+         serverIds.add("1");
+         serverIds.add("2");
+         LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request
+                 .createRegisteringPaylod("1234", serverIds);
+
+         LoadBalancer loadBalancer = api.registerLoadBalancer(payload);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(loadBalancer);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeregisterLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-update.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String content = "<ws:deregisterServersOnLoadBalancer>"
+              + "<request>"
+              + "<serverIds>1</serverIds>"
+              + "<serverIds>2</serverIds>"
+              + "<loadBalancerId>load-balancer-id</loadBalancerId>"
+              + "</request>"
+              + "</ws:deregisterServersOnLoadBalancer>";
+
+      try {
+         List<String> serverIds = Lists.newArrayList();
+         serverIds.add("1");
+         serverIds.add("2");
+
+         LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request
+                 .createDeregisteringPayload("load-balancer-id", serverIds);
+
+         LoadBalancer loadBalancer = api.deregisterLoadBalancer(payload);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(loadBalancer);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-register.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String loadBalancerId = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      String content = "<ws:deleteLoadBalancer><loadBalancerId>" + loadBalancerId + "</loadBalancerId></ws:deleteLoadBalancer>";
+
+      try {
+         boolean done = api.deleteLoadBalancer(loadBalancerId);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(done);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
deleted file mode 100644
index d5e64cf..0000000
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
+++ /dev/null
@@ -1,135 +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.features;
-
-import com.google.common.collect.Iterables;
-import java.util.List;
-import org.assertj.core.util.Lists;
-import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
-import org.jclouds.profitbricks.domain.DataCenter;
-import org.jclouds.profitbricks.domain.LoadBalancer;
-import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
-import org.jclouds.profitbricks.domain.Server;
-import org.testng.Assert;
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.Test;
-
-@Test(groups = "unit", testName = "LoadbalancerApiLiveTest")
-public class LoadbalancerApiLiveTest extends BaseProfitBricksLiveTest {
-
-   private String dataCenterId;
-   private String loadBalancerID;
-   private String serverId;
-
-   @Override
-   protected void initialize() {
-      super.initialize();
-      List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
-      assertFalse(dataCenters.isEmpty(), "At least 1 datacenter has to be available for loadbalancer testing.");
-
-      dataCenterId = Iterables.getFirst(dataCenters, null).id();
-
-      List<Server> servers = api.serverApi().getAllServers();
-      assertFalse(servers.isEmpty(), "At least 1 server has to be available for loadbalancer testing.");
-
-      serverId = Iterables.getFirst(servers, null).id();
-   }
-
-   @Test
-   public void testCreateLoadBalancer() {
-      List<String> serverIds = com.google.common.collect.Lists.newArrayList();
-      serverIds.add("server-ids");
-
-      LoadBalancer.Request.CreatePayload payload = LoadBalancer.Request.creatingBuilder()
-              .dataCenterId(dataCenterId)
-              .loadBalancerName("testName")
-              .loadBalancerAlgorithm(Algorithm.ROUND_ROBIN)
-              .ip("0.0.0.1")
-              .lanId("1")
-              .serverIds(serverIds)
-              .build();
-
-      String requestId = api.loadBalancerApi().createLoadBalancer(payload);
-
-      assertNotNull(requestId);
-   }
-
-   @Test(dependsOnMethods = "testCreateLoadBalancer")
-   public void testGetAllLoadBalancers() {
-      List<LoadBalancer> loadBalancers = api.loadBalancerApi().getAllLoadBalancers();
-
-      assertFalse(loadBalancers.isEmpty());
-   }
-
-   @Test(dependsOnMethods = "testCreateLoadBalancer")
-   public void testGetLoadBalancer() {
-      LoadBalancer loadBalancer = api.loadBalancerApi().getLoadBalancer(loadBalancerID);
-
-      assertNotNull(loadBalancer);
-   }
-
-   @Test(dependsOnMethods = "testCreateLoadBalancer")
-   public void testRegisterLoadBalancer() {
-      List<String> serverIds = Lists.newArrayList();
-      serverIds.add(serverId);
-
-      LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request.registerBuilder()
-              .id(loadBalancerID)
-              .serverIds(serverIds)
-              .build();
-
-      LoadBalancer loadBalancer = api.loadBalancerApi().registerLoadBalancer(payload);
-
-      assertNotNull(loadBalancer);
-   }
-
-   @Test(dependsOnMethods = "testRegisterLoadBalancer")
-   public void testDeregisterLoadBalancer() {
-      List<String> serverIds = Lists.newArrayList();
-      serverIds.add(serverId);
-
-      LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request.deregisterBuilder()
-              .id(loadBalancerID)
-              .serverIds(serverIds)
-              .build();
-
-      LoadBalancer loadBalancer = api.loadBalancerApi().deregisterLoadBalancer(payload);
-
-      assertNotNull(loadBalancer);
-   }
-
-   @Test(dependsOnMethods = "testCreateLoadBalancer")
-   public void testUpdateLoadBalancer() {
-      LoadBalancer.Request.UpdatePayload payload = LoadBalancer.Request.updatingBuilder()
-              .id(loadBalancerID)
-              .loadBalancerName("whatever")
-              .build();
-
-      LoadBalancer loadBalancer = api.loadBalancerApi().updateLoadBalancer(payload);
-
-      assertNotNull(loadBalancer);
-   }
-
-   @AfterClass(alwaysRun = true)
-   public void testDeleteLoadBalancer() {
-      boolean result = api.loadBalancerApi().deleteLoadBalancer(loadBalancerID);
-
-      Assert.assertTrue(result);
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
deleted file mode 100644
index 1271244..0000000
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
+++ /dev/null
@@ -1,285 +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.features;
-
-import com.google.common.collect.Lists;
-import com.squareup.okhttp.mockwebserver.MockResponse;
-import com.squareup.okhttp.mockwebserver.MockWebServer;
-import java.util.List;
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.domain.LoadBalancer;
-import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
-import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.AssertJUnit.assertTrue;
-import org.testng.annotations.Test;
-
-@Test(groups = "unit", testName = "LoadbalancerApiMockTest")
-public class LoadbalancerApiMockTest extends BaseProfitBricksMockTest {
-
-   @Test
-   public void testGetAllLoadBalancers() throws Exception {
-      MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancers.xml")));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-      LoadBalancerApi api = pbApi.loadBalancerApi();
-
-      try {
-         List<LoadBalancer> loadBalancerList = api.getAllLoadBalancers();
-
-         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllLoadBalancers/>");
-         assertNotNull(loadBalancerList);
-         assertTrue(loadBalancerList.size() == 2);
-
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testGetAllLoadBalancersReturning404() throws Exception {
-      MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-      LoadBalancerApi api = pbApi.loadBalancerApi();
-
-      try {
-         List<LoadBalancer> loadBalancerList = api.getAllLoadBalancers();
-
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertTrue(loadBalancerList.isEmpty());
-
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testGetLoadBalancer() throws Exception {
-      MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer.xml")));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-      LoadBalancerApi api = pbApi.loadBalancerApi();
-
-      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
-
-      String content = "<ws:getLoadBalancer><loadBalancerId>" + id + "</loadBalancerId></ws:getLoadBalancer>";
-      try {
-         LoadBalancer loadBalancer = api.getLoadBalancer(id);
-
-         assertRequestHasCommonProperties(server.takeRequest(), content);
-         assertNotNull(loadBalancer);
-         assertEquals(loadBalancer.id(), id);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testGetNonExistingLoadBalancer() throws Exception {
-      MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setResponseCode(404));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-      LoadBalancerApi api = pbApi.loadBalancerApi();
-
-      String id = "random-non-existing-id";
-
-      try {
-         LoadBalancer loadBalancer = api.getLoadBalancer(id);
-
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertNull(loadBalancer);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testCreateLoadBalancer() throws Exception {
-      MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-create.xml")));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-      LoadBalancerApi api = pbApi.loadBalancerApi();
-
-      String content = "<ws:createLoadBalancer>"
-              + "<request>"
-              + "<dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee</dataCenterId>"
-              + "<loadBalancerName>load-balancer-name</loadBalancerName>"
-              + "<loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>"
-              + "<ip>192.168.0.1</ip>"
-              + "<lanId>lan-id</lanId>"
-              + "<serverIds>server-ids</serverIds>"
-              + "</request>"
-              + "</ws:createLoadBalancer>";
-
-      try {
-         List<String> serverIds = Lists.newArrayList();
-         serverIds.add("server-ids");
-         String requestId = api.createLoadBalancer(LoadBalancer.Request.creatingBuilder()
-                 .dataCenterId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee")
-                 .loadBalancerName("load-balancer-name")
-                 .loadBalancerAlgorithm(Algorithm.ROUND_ROBIN)
-                 .ip("192.168.0.1")
-                 .lanId("lan-id")
-                 .serverIds(serverIds)
-                 .build());
-
-         assertRequestHasCommonProperties(server.takeRequest(), content);
-
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testUpdateLoadBalancer() throws Exception {
-      MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-create.xml")));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-      LoadBalancerApi api = pbApi.loadBalancerApi();
-
-      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
-      String newName = "Apache";
-
-      String content = "<ws:updateLoadBalancer>"
-              + "<request>"
-              + "<loadBalancerId>" + id + "</loadBalancerId>"
-              + "<loadBalancerName>load-balancer-name</loadBalancerName>"
-              + "<loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>"
-              + "<ip>192.168.0.1</ip>"
-              + "</request>"
-              + "</ws:updateLoadBalancer>";
-
-      try {
-         LoadBalancer.Request.UpdatePayload toUpdate = LoadBalancer.Request.updatingBuilder()
-                 .id(id)
-                 .loadBalancerName("load-balancer-name")
-                 .loadBalancerAlgorithm(Algorithm.ROUND_ROBIN)
-                 .ip("192.168.0.1")
-                 .build();
-
-         LoadBalancer loadBalancer = api.updateLoadBalancer(toUpdate);
-
-         assertRequestHasCommonProperties(server.takeRequest(), content);
-         assertNotNull(loadBalancer);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-
-   }
-
-   @Test
-   public void testRegisterLoadBalancer() throws Exception {
-      MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-register.xml")));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-      LoadBalancerApi api = pbApi.loadBalancerApi();
-
-      String content = "<ws:registerServersOnLoadBalancer>"
-              + "<request>"
-              + "<loadBalancerId>1234</loadBalancerId>"
-              + "<serverIds>1</serverIds>"
-              + "<serverIds>2</serverIds>"
-              + "</request>"
-              + "</ws:registerServersOnLoadBalancer>";
-
-      try {
-         List<String> serverIds = Lists.newArrayList();
-         serverIds.add("1");
-         serverIds.add("2");
-         LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request.registerBuilder()
-                 .id("1234")
-                 .serverIds(serverIds)
-                 .build();
-
-         LoadBalancer loadbalancer = api.registerLoadBalancer(payload);
-
-         assertRequestHasCommonProperties(server.takeRequest(), content);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testDeregisterLoadBalancer() throws Exception {
-      MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-update.xml")));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-      LoadBalancerApi api = pbApi.loadBalancerApi();
-
-      String content = "<ws:deregisterServersOnLoadBalancer>"
-              + "<request>"
-              + "<serverIds>1</serverIds>"
-              + "<serverIds>2</serverIds>"
-              + "<loadBalancerId>load-balancer-id</loadBalancerId>"
-              + "</request>"
-              + "</ws:deregisterServersOnLoadBalancer>";
-
-      try {
-         List<String> serverIds = Lists.newArrayList();
-         serverIds.add("1");
-         serverIds.add("2");
-         LoadBalancer loadbalancer = api.deregisterLoadBalancer(LoadBalancer.Request.DeregisterPayload.create(serverIds, "load-balancer-id"));
-
-         assertRequestHasCommonProperties(server.takeRequest(), content);
-         assertNotNull(loadbalancer);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testDeleteLoadBalancer() throws Exception {
-      MockWebServer server = mockWebServer();
-      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-register.xml")));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-      LoadBalancerApi api = pbApi.loadBalancerApi();
-
-      String loadBalancerId = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
-
-      String content = "<ws:deleteLoadBalancer><loadBalancerId>" + loadBalancerId + "</loadBalancerId></ws:deleteLoadBalancer>";
-
-      try {
-         boolean done = api.deleteLoadBalancer(loadBalancerId);
-
-         assertRequestHasCommonProperties(server.takeRequest(), content);
-         assertTrue(done);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
index 0e01e2c..2129b25 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/NicApiMockTest.java
@@ -140,15 +140,22 @@ public class NicApiMockTest extends BaseProfitBricksMockTest {
       String content = "<ws:updateNic>"
               + "<request>"
               + "<nicId>nic-id</nicId>"
-              + "<ip>ip</ip>"
+              + "<ip>10.0.0.1</ip>"
               + "<nicName>nic-name</nicName>"
               + "<dhcpActive>true</dhcpActive>"
               + "<lanId>1</lanId>"
               + "</request>"
               + "</ws:updateNic>";
       try {
-         Nic nic = api.updateNic(Nic.Request.UpdatePayload.create("nic-id", "ip", "nic-name", true, 1));
+         Nic nic = api.updateNic(Nic.Request.updatingBuilder()
+                 .id("nic-id")
+                 .ip("10.0.0.1")
+                 .name("nic-name")
+                 .dhcpActive(true)
+                 .lanId(1)
+                 .build());
          assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(nic);
       } finally {
          pbApi.close();
          server.shutdown();
@@ -169,8 +176,13 @@ public class NicApiMockTest extends BaseProfitBricksMockTest {
               + "<internetAccess>true</internetAccess>"
               + "</ws:setInternetAccess>";
       try {
-         Nic nic = api.setInternetAccess(Nic.Request.SetInternetAccessPayload.create("datacenter-id", 1, true));
+         Nic nic = api.setInternetAccess(Nic.Request.setInternetAccessBuilder()
+                 .dataCenterId("datacenter-id")
+                 .lanId(1)
+                 .internetAccess(true)
+                 .build());
          assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(nic);
       } finally {
          pbApi.close();
          server.shutdown();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
index e7b1b9c..6ceffcd 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/ServerApiLiveTest.java
@@ -57,7 +57,12 @@ public class ServerApiLiveTest extends BaseProfitBricksLiveTest {
    @Test
    public void testCreateServer() {
       String serverId = api.serverApi().createServer(
-              Server.Request.CreatePayload.create(dataCenter.id(), "jclouds-node", 1, 1024));
+              Server.Request.creatingBuilder()
+              .dataCenterId(dataCenter.id())
+              .name("jclouds-node")
+              .cores(1)
+              .ram(1024)
+              .build());
 
       assertNotNull(serverId);
       this.createdServerId = serverId;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/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 6c50f2a..500d218 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
@@ -58,7 +58,11 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test
    public void testCreateSnapshot() {
-      Snapshot snapshot = api.snapshotApi().createSnapshot(Snapshot.Request.CreatePayload.create(storageId, "my description", "test snapshot"));
+      Snapshot snapshot = api.snapshotApi().createSnapshot(Snapshot.Request.creatingBuilder()
+              .storageId(storageId)
+              .description("my description")
+              .name("test snapshot")
+              .build());
 
       assertNotNull(snapshot);
 
@@ -89,7 +93,7 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
       String newName = "new name";
 
       api.snapshotApi().updateSnapshot(Snapshot.Request.updatingBuilder()
-              .snapshotId(snapshotId)
+              .id(snapshotId)
               .description("new description")
               .name(newName)
               .bootable(true)
@@ -112,7 +116,7 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test(dependsOnMethods = "testCreateSnapshot")
    public void testRollbackSnapshot() {
-      String result = api.snapshotApi().rollbackSnapshot(Snapshot.Request.RollbackPayload.create(snapshotId, storageId));
+      String result = api.snapshotApi().rollbackSnapshot(Snapshot.Request.createRollbackPayload(snapshotId, storageId));
 
       assertNotNull(result);
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
index 528f893..9574e76 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
@@ -182,9 +182,10 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
 
       try {
          String requestId = api.updateSnapshot(Snapshot.Request.updatingBuilder()
-                 .snapshotId(snapshotId)
-                 .name("snapshot-name")
+                 .id(snapshotId)
                  .description("description")
+                 .name("snapshot-name")
+                 .bootable(false)
                  .osType(OsType.LINUX)
                  .isCpuHotPlug(false)
                  .isCpuHotUnPlug(false)
@@ -256,10 +257,7 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
 
       String content = "<ws:rollbackSnapshot><request><snapshotId>" + snapshotId + "</snapshotId><storageId>" + storageId + "</storageId></request></ws:rollbackSnapshot>";
       try {
-         String result = api.rollbackSnapshot(Snapshot.Request.rollbackBuilder()
-                 .snapshotId(snapshotId)
-                 .storageId(storageId)
-                 .build());
+         String result = api.rollbackSnapshot(Snapshot.Request.createRollbackPayload(snapshotId, storageId));
          assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(result);
       } finally {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
index 6295701..08ffba2 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/StorageApiLiveTest.java
@@ -66,7 +66,7 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
    public void testUberStorage() {
       api.storageApi().createStorage(
               Storage.Request.creatingBuilder()
-              .dataCenterId(dataCenter)
+              .dataCenterId(dataCenter.id())
               .name("Uber Storage")
               .size(9999999f)
               .build());
@@ -76,7 +76,7 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
    public void testCreateStorage() {
       String storageId = api.storageApi().createStorage(
               Storage.Request.creatingBuilder()
-              .dataCenterId(dataCenter)
+              .dataCenterId(dataCenter.id())
               .name("hdd-1")
               .size(2f)
               .build());
@@ -114,7 +114,7 @@ public class StorageApiLiveTest extends BaseProfitBricksLiveTest {
               Storage.Request.updatingBuilder()
               .id(createdStorageId)
               .name("hdd-2")
-              .size(5l)
+              .size(5f)
               .build());
 
       assertNotNull(requestId);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
index 8658e2d..bb92109 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorServiceTest.java
@@ -73,7 +73,7 @@ public class ResponseStatusFromPayloadHttpCommandExecutorServiceTest extends Bas
       DataCenterApi api = pbApi.dataCenterApi();
 
       try {
-         api.createDataCenter(DataCenter.Request.CreatePayload.create("D@tacenter", Location.DE_FKB));
+         api.createDataCenter(DataCenter.Request.creatingPayload("D@tacenter", Location.DE_FKB));
          fail("Request should have failed");
       } catch (Exception ex) {
          assertTrue(ex instanceof IllegalArgumentException, "Exception should be an IllegalArgumentException");
@@ -111,7 +111,13 @@ public class ResponseStatusFromPayloadHttpCommandExecutorServiceTest extends Bas
       ServerApi api = pbApi.serverApi();
 
       try {
-         api.createServer(Server.Request.CreatePayload.create("some-datacenter-id", "node1", 99, 12800));
+         api.createServer(
+                 Server.Request.creatingBuilder()
+                 .dataCenterId("some-datacenter-id")
+                 .name("node1")
+                 .cores(99)
+                 .ram(12800)
+                 .build());
          fail("Request should have failed.");
       } catch (Exception ex) {
          assertTrue(ex instanceof InsufficientResourcesException, "Exception should be InsufficientResourcesException");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
index 16b2504..3cb15a5 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
@@ -104,7 +104,7 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
                                               .lanId(1)
                                               .internetAccess(true)
                                               .serverId("qqqqqqqq-wwww-eeee-rrrr-tttttttttttt")
-                                              .ip("202.94.38.12")
+                                              .ips(ImmutableList.of("202.94.38.12"))
                                               .macAddress("02:01:09:cd:f0:b0")
                                               .firewall(
                                                       Firewall.builder()

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandlerTest.java
index 49dbaba..1bd3518 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockListResponseHandlerTest.java
@@ -44,29 +44,28 @@ public class IpBlockListResponseHandlerTest extends BaseResponseHandlerTest<List
 
       List<IpBlock> expected = ImmutableList.<IpBlock>of(
               IpBlock.builder()
-              .id("block-id")
+              .id("block-id-1")
               .location(Location.US_LAS)
               .publicIps(ImmutableList.<PublicIp>of(
                               PublicIp.builder()
-                              .ip("1.1")
-                              .nicId("nic-id")
+                              .ip("10.0.0.2")
+                              .nicId("nic-id-1")
                               .build(),
                               PublicIp.builder()
-                              .ip("1.2")
-                              .nicId("nic-id")
+                              .ip("10.0.0.3")
+                              .nicId("nic-id-2")
                               .build()))
               .build(),
               IpBlock.builder()
-              .id("block-id")
+              .id("block-id-2")
               .location(Location.US_LAS)
               .publicIps(ImmutableList.<PublicIp>of(
                               PublicIp.builder()
-                              .ip("2.1")
-                              .nicId("nic-id")
+                              .ip("10.0.0.4")
                               .build(),
                               PublicIp.builder()
-                              .ip("2.2")
-                              .nicId("nic-id")
+                              .ip("10.0.0.5")
+                              .nicId("nic-id-4")
                               .build()))
               .build()
       );

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandlerTest.java
index 54f48dc..053f0ae 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/ipblock/IpBlockResponseHandlerTest.java
@@ -49,12 +49,11 @@ public class IpBlockResponseHandlerTest extends BaseResponseHandlerTest<IpBlock>
               .location(Location.US_LAS)
               .publicIps(ImmutableList.<PublicIp>of(
                               PublicIp.builder()
-                              .ip("ip")
+                              .ip("10.0.0.2")
                               .nicId("nic-id")
                               .build(),
                               PublicIp.builder()
-                              .ip("ip")
-                              .nicId("nic-id")
+                              .ip("10.0.0.3")
                               .build()))
               .ips(emptyIpList)
               .build();

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
index eedfa50..3c9e082 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
@@ -67,7 +67,7 @@ public class LoadBalancerListResponseHandlerTest extends BaseResponseHandlerTest
                       .build())
               .internetAccess(true)
               .ip("192.168.0.1")
-              .lanId("lan-id")
+              .lanId(1)
               .state(ProvisioningState.AVAILABLE)
               .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
               .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
@@ -97,7 +97,7 @@ public class LoadBalancerListResponseHandlerTest extends BaseResponseHandlerTest
                       .build())
               .internetAccess(false)
               .ip("192.168.0.1")
-              .lanId("lan-id")
+              .lanId(2)
               .state(ProvisioningState.AVAILABLE)
               .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
               .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
index 079c5c0..0971e21 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandlerTest.java
@@ -85,7 +85,7 @@ public class LoadBalancerResponseHandlerTest extends BaseResponseHandlerTest<Loa
                       .build())
               .internetAccess(true)
               .ip("192.168.0.1")
-              .lanId("lan-id")
+              .lanId(2)
               .state(ProvisioningState.AVAILABLE)
               .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:08:35.629Z"))
               .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:08:35.629Z"))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandlerTest.java
index ee0cac0..aa1975d 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicListResponseHandlerTest.java
@@ -49,8 +49,8 @@ public class NicListResponseHandlerTest extends BaseResponseHandlerTest<List<Nic
               .lanId(1)
               .internetAccess(true)
               .serverId("server-id")
-              .ip("192.168.0.1")
-              .macAddress("mac-address")
+              .ips(ImmutableList.of("192.168.0.1"))
+              .macAddress("aa:bb:cc:dd:ee:f1")
               .firewall(
                       Firewall.builder()
                       .active(true)
@@ -75,7 +75,7 @@ public class NicListResponseHandlerTest extends BaseResponseHandlerTest<List<Nic
                               "192.168.0.3",
                               "192.168.0.4"
                       ))
-              .macAddress("mac-address")
+              .macAddress("aa:bb:cc:dd:ee:f2")
               .firewall(
                       Firewall.builder()
                       .active(false)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandlerTest.java
index a14b0d4..3797ca0 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/nic/NicResponseHandlerTest.java
@@ -19,6 +19,8 @@ package org.jclouds.profitbricks.http.parser.nic;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
+import com.google.common.collect.ImmutableList;
+
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.Firewall;
 import org.jclouds.profitbricks.domain.Nic;
@@ -47,10 +49,10 @@ public class NicResponseHandlerTest extends BaseResponseHandlerTest<Nic> {
               .lanId(1)
               .internetAccess(true)
               .serverId("server-id")
-              .ip("192.168.0.1")
-              .macAddress("mac-address")
+              .ips(ImmutableList.of("192.168.0.1"))
+              .macAddress("aa:bb:cc:dd:ee:ff")
               .dhcpActive(true)
-              .gatewayIp("gateway-ip")
+              .gatewayIp("10.0.0.1")
               .state(ProvisioningState.AVAILABLE)
               .firewall(
                       Firewall.builder()

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
index 5e629b9..03fb3da 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
@@ -98,7 +98,7 @@ public class ServerInfoResponseHandlerTest extends BaseResponseHandlerTest<Serve
                               .lanId(1)
                               .internetAccess(true)
                               .serverId("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
-                              .ip("173.252.120.6")
+                              .ips(ImmutableList.of("173.252.120.6"))
                               .macAddress("02:01:09:cd:f0:b0")
                               .firewall(Firewall.builder()
                                       .active(false)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
index ea5d46d..95c7923 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
@@ -102,7 +102,7 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
                               .lanId(1)
                               .internetAccess(true)
                               .serverId("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
-                              .ip("173.252.120.6")
+                              .ips(ImmutableList.of("173.252.120.6"))
                               .macAddress("02:01:09:cd:f0:b0")
                               .firewall(Firewall.builder()
                                       .active(false)
@@ -160,7 +160,7 @@ public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<
                               .lanId(3)
                               .internetAccess(false)
                               .serverId("asdfghjk-asdf-asdf-asdf-asdfghjklkjl")
-                              .ip("202.69.181.241")
+                              .ips(ImmutableList.of("202.69.181.241"))
                               .macAddress("02:01:9e:5e:35:1e")
                               .firewall(Firewall.builder()
                                       .active(false)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
index f9f93d0..37cdb96 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotListResponseHandlerTest.java
@@ -59,7 +59,7 @@ public class SnapshotListResponseHandlerTest extends BaseResponseHandlerTest<Lis
       expected.add(Snapshot.builder()
               .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
               .description("description")
-              .size(1024)
+              .size(1024f)
               .name("snapshot01")
               .state(ProvisioningState.AVAILABLE)
               .isBootable(true)
@@ -80,7 +80,7 @@ public class SnapshotListResponseHandlerTest extends BaseResponseHandlerTest<Lis
       expected.add(Snapshot.builder()
               .id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy")
               .description("description")
-              .size(1024)
+              .size(1024f)
               .name("snapshot02")
               .state(ProvisioningState.AVAILABLE)
               .isBootable(true)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
index ced1814..1a73c9f 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/snapshot/SnapshotResponseHandlerTest.java
@@ -53,7 +53,7 @@ public class SnapshotResponseHandlerTest extends BaseResponseHandlerTest<Snapsho
       Snapshot expected = Snapshot.builder()
               .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
               .description("description")
-              .size(1024)
+              .size(1024f)
               .name("snapshot01")
               .state(ProvisioningState.AVAILABLE)
               .isBootable(true)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
index 8586aaf..89d14f7 100644
--- a/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock-reserve.xml
@@ -6,7 +6,7 @@
                 <requestId>request-id</requestId>
                 <blockId>block-id</blockId>
                 <location>us/las</location>
-                <ips>ip</ips>
+                <ips>10.0.0.1</ips>
             </return>
         </ns2:reservePublicIpBlockResponse>
     </S:Body>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblock.xml b/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
index 339fdfb..0b22915 100644
--- a/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblock.xml
@@ -6,11 +6,11 @@
                 <blockId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</blockId>
                 <location>us/las</location>
                 <publicIps>
-                    <ip>ip</ip>
+                    <ip>10.0.0.2</ip>
                     <nicId>nic-id</nicId>
                 </publicIps>
                 <publicIps>
-                    <ip>ip</ip>
+                    <ip>10.0.0.3</ip>
                 </publicIps>
             </return>
         </ns2:getAllPublicIpBlocksResponse>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/resources/ipblock/ipblocks.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/ipblock/ipblocks.xml b/providers/profitbricks/src/test/resources/ipblock/ipblocks.xml
index 4e436e1..44ea788 100644
--- a/providers/profitbricks/src/test/resources/ipblock/ipblocks.xml
+++ b/providers/profitbricks/src/test/resources/ipblock/ipblocks.xml
@@ -3,26 +3,26 @@
     <S:Body>
         <ns2:getAllPublicIpBlocksResponse xmlns:ns2="http://ws.api.profitbricks.com/">
             <return>
-                <blockId>block-id</blockId>
+                <blockId>block-id-1</blockId>
                 <location>us/las</location>
                 <publicIps>
-                    <ip>1.1</ip>
-                    <nicId>nic-id</nicId>      
+                    <ip>10.0.0.2</ip>
+                    <nicId>nic-id-1</nicId>      
                 </publicIps>
                 <publicIps>
-                    <ip>1.2</ip>
-                    <nicId>nic-id</nicId>
+                    <ip>10.0.0.3</ip>
+                    <nicId>nic-id-2</nicId>
                 </publicIps>
             </return>
             <return>
-                <blockId>block-id</blockId>
+                <blockId>block-id-2</blockId>
                 <location>us/las</location>
                 <publicIps>
-                    <ip>2.1</ip>
+                    <ip>10.0.0.4</ip>
                 </publicIps>
                 <publicIps>
-                    <ip>2.2</ip>
-                    <nicId>nic-id</nicId>
+                    <ip>10.0.0.5</ip>
+                    <nicId>nic-id-4</nicId>
                 </publicIps>
             </return>
         </ns2:getAllPublicIpBlocksResponse>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
index 33eb41b..5c1afb0 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-create.xml
@@ -9,7 +9,7 @@
                 <loadBalancerName>load-balancer-name</loadBalancerName>
                 <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
                 <ip>192.168.0.1</ip>
-                <lanId>lan-id</lanId>
+                <lanId>1</lanId>
                 <serverIds>server-ids</serverIds>
             </request>
         </ws:createLoadBalancer>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
index 8396174..29e24aa 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer-delete.xml
@@ -5,7 +5,7 @@
             <return>
                 <requestId>request-id</requestId>
                 <dataCenterId>datacenter-id</dataCenterId>
-                <dataCenterVersion>datacenter-version</dataCenterVersion>
+                <dataCenterVersion>123</dataCenterVersion>
             </return>
         </ns2:deleteLoadBalancerResponse>
     </S:Body>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
index 302c10e..6388113 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancer.xml
@@ -10,7 +10,7 @@
                 <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
                 <internetAccess>true</internetAccess>
                 <ip>192.168.0.1</ip>
-                <lanId>lan-id</lanId>
+                <lanId>2</lanId>
                 <balancedServers>
                     <activate>true</activate>
                     <balancedNicId>balanced-nic-id</balancedNicId>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
index 54d1949..afe2573 100644
--- a/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
+++ b/providers/profitbricks/src/test/resources/loadbalancer/loadbalancers.xml
@@ -10,7 +10,7 @@
                 <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
                 <internetAccess>true</internetAccess>
                 <ip>192.168.0.1</ip>
-                <lanId>lan-id</lanId>
+                <lanId>1</lanId>
                 <balancedServers>
                     <activate>true</activate>
                     <balancedNicId>balanced-nic-id</balancedNicId>
@@ -35,7 +35,7 @@
                 <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>
                 <internetAccess>false</internetAccess>
                 <ip>192.168.0.1</ip>
-                <lanId>lan-id</lanId>
+                <lanId>2</lanId>
                 <balancedServers>
                     <activate>false</activate>
                     <balancedNicId>balanced-nic-id</balancedNicId>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/5e82bbfa/providers/profitbricks/src/test/resources/nic/nic.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/nic/nic.xml b/providers/profitbricks/src/test/resources/nic/nic.xml
index 18adc23..e460384 100644
--- a/providers/profitbricks/src/test/resources/nic/nic.xml
+++ b/providers/profitbricks/src/test/resources/nic/nic.xml
@@ -11,7 +11,7 @@
                 <internetAccess>true</internetAccess>
                 <serverId>server-id</serverId>
                 <ips>192.168.0.1</ips>
-                <macAddress>mac-address</macAddress>
+                <macAddress>aa:bb:cc:dd:ee:ff</macAddress>
                 <firewall>
                     <active>true</active>
                     <firewallId>firewall-id</firewallId>
@@ -19,7 +19,7 @@
                     <provisioningState>AVAILABLE</provisioningState>
                 </firewall>
                 <dhcpActive>true</dhcpActive>
-                <gatewayIp>gateway-ip</gatewayIp>
+                <gatewayIp>10.0.0.1</gatewayIp>
                 <provisioningState>AVAILABLE</provisioningState>
             </return>
         </ns2:getNicResponse>


[03/35] jclouds git commit: Add missing dependency to profitbricks

Posted by de...@apache.org.
Add missing dependency to profitbricks


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

Branch: refs/heads/master
Commit: 8206d19a81b2afc8b8d24f654121772570236410
Parents: cb45048
Author: Ignasi Barrera <na...@apache.org>
Authored: Mon Jan 19 10:32:36 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Jan 19 10:32:36 2015 +0100

----------------------------------------------------------------------
 providers/profitbricks/pom.xml | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/8206d19a/providers/profitbricks/pom.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/pom.xml b/providers/profitbricks/pom.xml
index ab0003d..b48e589 100644
--- a/providers/profitbricks/pom.xml
+++ b/providers/profitbricks/pom.xml
@@ -61,6 +61,11 @@
             <artifactId>auto-value</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>com.google.auto.service</groupId>
+            <artifactId>auto-service</artifactId>
+            <scope>provided</scope>
+        </dependency>
         <!-- Test dependencies -->
         <dependency>
             <groupId>org.apache.jclouds</groupId>


[16/35] jclouds git commit: Profitbricks Drives API

Posted by de...@apache.org.
Profitbricks Drives API

Conflicts:
	profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java


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

Branch: refs/heads/master
Commit: f58675e93de13f85156eb3ef520d9dfc636294ed
Parents: af93f3b
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Tue Mar 3 23:04:46 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Sun Mar 8 21:20:23 2015 +0100

----------------------------------------------------------------------
 .../jclouds/profitbricks/ProfitBricksApi.java   |  3 +
 .../drive/AddRomDriveToServerRequestBinder.java | 45 +++++++++++
 .../org/jclouds/profitbricks/domain/Drive.java  | 70 +++++++++++++++++
 .../jclouds/profitbricks/domain/Location.java   |  1 +
 .../profitbricks/features/DrivesApi.java        | 51 ++++++++++++
 .../AddRomDriveToServerRequestBinderTest.java   | 49 ++++++++++++
 .../features/DrivesApiLiveTest.java             | 72 +++++++++++++++++
 .../features/DrivesApiMockTest.java             | 81 ++++++++++++++++++++
 .../image/ImageListResponseHandlerTest.java     |  6 +-
 .../src/test/resources/drives/drives-add.xml    | 12 +++
 .../src/test/resources/drives/drives-remove.xml | 12 +++
 11 files changed, 399 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
index 34309bf..12da7ea 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -18,6 +18,7 @@ package org.jclouds.profitbricks;
 
 import java.io.Closeable;
 import org.jclouds.profitbricks.features.DataCenterApi;
+import org.jclouds.profitbricks.features.DrivesApi;
 import org.jclouds.profitbricks.features.FirewallApi;
 import org.jclouds.profitbricks.features.ImageApi;
 import org.jclouds.profitbricks.features.IpBlockApi;
@@ -53,4 +54,6 @@ public interface ProfitBricksApi extends Closeable {
    @Delegate
    IpBlockApi ipBlockApi();
 
+   @Delegate
+   DrivesApi drivesApi();
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinder.java
new file mode 100644
index 0000000..3a931ab
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinder.java
@@ -0,0 +1,45 @@
+/*
+ * 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.binder.drive;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Drive;
+
+public class AddRomDriveToServerRequestBinder extends BaseProfitBricksRequestBinder<Drive.Request.AddRomDriveToServerPayload> {
+
+   private final StringBuilder requestBuilder;
+
+   AddRomDriveToServerRequestBinder() {
+      super("payload");
+      this.requestBuilder = new StringBuilder(128);
+   }
+
+   @Override
+   protected String createPayload(Drive.Request.AddRomDriveToServerPayload payload) {
+      requestBuilder.append("<ws:addRomDriveToServer>")
+              .append("<request>")
+              .append(format("<imageId>%s</imageId>", payload.imageId()))
+              .append(format("<serverId>%s</serverId>", payload.serverId()))
+              .append(formatIfNotEmpty("<deviceNumber>%s</deviceNumber>", payload.deviceNumber()))
+              .append("</request>")
+              .append("</ws:addRomDriveToServer>");
+
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
new file mode 100644
index 0000000..08add2a
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Drive.java
@@ -0,0 +1,70 @@
+/*
+ * 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;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class Drive {
+
+   public static final class Request {
+
+      @AutoValue
+      public abstract static class AddRomDriveToServerPayload {
+
+         public abstract String serverId();
+
+         public abstract String imageId();
+
+         public abstract String deviceNumber();
+
+         public static AddRomDriveToServerPayload create(String serverId, String storageId, String deviceNumber) {
+            return new AutoValue_Drive_Request_AddRomDriveToServerPayload(serverId, storageId, deviceNumber);
+         }
+
+         public static Builder builder() {
+            return new Builder();
+         }
+
+         public static class Builder {
+
+            private String serverId;
+            private String imageId;
+            private String deviceNumber;
+
+            public Builder serverId(String serverId) {
+               this.serverId = serverId;
+               return this;
+            }
+
+            public Builder storageId(String storageId) {
+               this.imageId = storageId;
+               return this;
+            }
+
+            public Builder deviceNumber(String deviceNumber) {
+               this.deviceNumber = deviceNumber;
+               return this;
+            }
+
+            public AddRomDriveToServerPayload build() {
+               return AddRomDriveToServerPayload.create(serverId, imageId, deviceNumber);
+            }
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
index 0354bf4..3dd888d 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
@@ -21,6 +21,7 @@ public enum Location {
    DE_FKB("de/fkb"),
    DE_FRA("de/fra"),
    US_LAS("us/las"),
+   US_LAS_DEV("us/lasdev"),
    UNRECOGNIZED("unknown");
 
    private final String id;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DrivesApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DrivesApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DrivesApi.java
new file mode 100644
index 0000000..70f70a0
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DrivesApi.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.features;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.binder.drive.AddRomDriveToServerRequestBinder;
+import org.jclouds.profitbricks.domain.Drive;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface DrivesApi {
+
+   @POST
+   @Named("drives:add")
+   @MapBinder(AddRomDriveToServerRequestBinder.class)
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String addRomDriveToServer(@PayloadParam("payload") Drive.Request.AddRomDriveToServerPayload payload);
+
+   @POST
+   @Named("drives:remove")
+   @Payload("<ws:removeRomDriveFromServer><imageId>{imageid}</imageId><serverId>{serverid}</serverId></ws:removeRomDriveFromServer>")
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String removeRomDriveFromServer(@PayloadParam("imageid") String imageid, @PayloadParam("serverid") String serverid);
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinderTest.java
new file mode 100644
index 0000000..13fb7f1
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/drive/AddRomDriveToServerRequestBinderTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.binder.drive;
+
+import org.jclouds.profitbricks.domain.Drive;
+import static org.testng.Assert.assertEquals;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "AddRomDriveToServerRequestBinderTest")
+public class AddRomDriveToServerRequestBinderTest {
+
+   @Test
+   public void testAddRomDriveToServerPayload() {
+      AddRomDriveToServerRequestBinder binder = new AddRomDriveToServerRequestBinder();
+
+      Drive.Request.AddRomDriveToServerPayload payload = Drive.Request.AddRomDriveToServerPayload.builder()
+              .serverId("server-id")
+              .storageId("image-id")
+              .deviceNumber("device-number")
+              .build();
+
+      String actual = binder.createPayload(payload);
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload
+           = ("   <ws:addRomDriveToServer>"
+           + "    <request>"
+           + "       <imageId>image-id</imageId>"
+           + "       <serverId>server-id</serverId>"
+           + "       <deviceNumber>device-number</deviceNumber>"
+           + "    </request>"
+           + " </ws:addRomDriveToServer>").replaceAll("\\s+", "");
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
new file mode 100644
index 0000000..aacc314
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.features;
+
+import autovalue.shaded.com.google.common.common.collect.Iterables;
+import java.util.List;
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.Drive;
+import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.domain.Server;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", testName = "DrivesApiLiveTest", singleThreaded = true)
+public class DrivesApiLiveTest extends BaseProfitBricksLiveTest {
+
+   public String serverId;
+   public String imageId;
+
+   @Override
+   protected void initialize() {
+      super.initialize();
+
+      List<Server> servers = api.serverApi().getAllServers();
+      assertFalse(servers.isEmpty(), "At least one server is required to run drives test.");
+
+      Server server = Iterables.getFirst(servers, null);
+      assertNotNull(server);
+
+      this.serverId = server.id();
+
+      List<Image> images = api.imageApi().getAllImages();
+      assertFalse(images.isEmpty(), "At least one image is required to run drives test.");
+
+      Image image = Iterables.getFirst(images, null);
+      assertNotNull(image);
+
+      this.imageId = image.id();
+   }
+
+   @Test
+   public void addRomDriveToServerTest() {
+      String requestId = api.drivesApi().addRomDriveToServer(Drive.Request.AddRomDriveToServerPayload.builder()
+              .serverId(serverId)
+              .storageId("05cadf29-6c12-11e4-beeb-52540066fee9")
+              .deviceNumber("0")
+              .build());
+      assertNotNull(requestId);
+   }
+
+   @Test (dependsOnMethods = "addRomDriveToServerTest")
+   public void removeRomDriveFromServerTest() {
+      String requestId = api.drivesApi().removeRomDriveFromServer(imageId, serverId);
+
+      assertNotNull(requestId);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiMockTest.java
new file mode 100644
index 0000000..d55676d
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiMockTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.Drive;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "DrivesApiMockTest")
+public class DrivesApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void addRomDriveToServerTest() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/drives/drives-add.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DrivesApi api = pbApi.drivesApi();
+
+      String content = "<ws:addRomDriveToServer>"
+              + "<request>"
+              + "<imageId>image-id</imageId>"
+              + "<serverId>server-id</serverId>"
+              + "<deviceNumber>device-number</deviceNumber>"
+              + "</request>"
+              + "</ws:addRomDriveToServer>";
+      try {
+         String requestId = api.addRomDriveToServer(Drive.Request.AddRomDriveToServerPayload.builder()
+                 .serverId("server-id")
+                 .storageId("image-id")
+                 .deviceNumber("device-number")
+                 .build());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(requestId);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void removeRomDriveFromServerTest() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/drives/drives-remove.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      DrivesApi api = pbApi.drivesApi();
+
+      String content = "<ws:removeRomDriveFromServer>"
+              + "<imageId>image-id</imageId>"
+              + "<serverId>server-id</serverId>"
+              + "</ws:removeRomDriveFromServer>";
+      try {
+         String requestId = api.removeRomDriveFromServer("image-id", "server-id");
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(requestId);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
index 4827138..7d0cb88 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
@@ -91,7 +91,7 @@ public class ImageListResponseHandlerTest extends BaseResponseHandlerTest<List<I
               .name("Debian-jessie-prerelease-server-2015-01-01")
               .size(2048f)
               .type(Image.Type.HDD)
-              .location(Location.UNRECOGNIZED)
+              .location(Location.US_LAS_DEV)
               .isNicHotPlug(true)
               .isNicHotUnPlug(true)
               .osType(OsType.LINUX)
@@ -110,7 +110,7 @@ public class ImageListResponseHandlerTest extends BaseResponseHandlerTest<List<I
               .name("Fedora-19-server-2015-01-01")
               .size(2048f)
               .type(Image.Type.HDD)
-              .location(Location.UNRECOGNIZED)
+              .location(Location.US_LAS_DEV)
               .isNicHotPlug(true)
               .isNicHotUnPlug(true)
               .osType(OsType.LINUX)
@@ -129,7 +129,7 @@ public class ImageListResponseHandlerTest extends BaseResponseHandlerTest<List<I
               .name("Ubuntu-12.04-LTS-server-2015-01-01")
               .size(2048f)
               .type(Image.Type.HDD)
-              .location(Location.UNRECOGNIZED)
+              .location(Location.US_LAS_DEV)
               .isNicHotPlug(true)
               .isNicHotUnPlug(true)
               .osType(OsType.LINUX)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/test/resources/drives/drives-add.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/drives/drives-add.xml b/providers/profitbricks/src/test/resources/drives/drives-add.xml
new file mode 100644
index 0000000..752f8f3
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/drives/drives-add.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:addRomDriveToServerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>datacenter-version</dataCenterVersion>
+      </return>
+    </ns2:addRomDriveToServerResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/f58675e9/providers/profitbricks/src/test/resources/drives/drives-remove.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/drives/drives-remove.xml b/providers/profitbricks/src/test/resources/drives/drives-remove.xml
new file mode 100644
index 0000000..ccfd400
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/drives/drives-remove.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+  <S:Body>
+    <ns2:removeRomDriveFromServerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+      <return>
+        <requestId>request-id</requestId>
+        <dataCenterId>datacenter-id</dataCenterId>
+        <dataCenterVersion>datacenter-version</dataCenterVersion>
+      </return>
+    </ns2:removeRomDriveFromServerResponse>
+  </S:Body>
+</S:Envelope>
\ No newline at end of file


[07/35] jclouds git commit: JCLOUDS-702: JClouds ProfitBricks provider - Storage API

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
index 0aa8f58..4827138 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
@@ -27,157 +27,157 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "ImageListResponseHandlerTest" )
+@Test(groups = "unit", testName = "ImageListResponseHandlerTest")
 public class ImageListResponseHandlerTest extends BaseResponseHandlerTest<List<Image>> {
 
    @Override
    protected ParseSax<List<Image>> createParser() {
-      return factory.create( injector.getInstance( ImageListResponseHandler.class ) );
+      return factory.create(injector.getInstance(ImageListResponseHandler.class));
    }
 
    @Test
    public void testParseResponseFromGetAllImages() {
       ParseSax<List<Image>> parser = createParser();
 
-      List<Image> actual = parser.parse( payloadFromResource( "/image/images.xml" ) );
-      assertNotNull( actual, "Parsed content returned null" );
+      List<Image> actual = parser.parse(payloadFromResource("/image/images.xml"));
+      assertNotNull(actual, "Parsed content returned null");
 
       List<Image> expected = ImmutableList.<Image>of(
               Image.builder()
-              .isBootable( true )
-              .isCpuHotPlug( true )
-              .isCpuHotUnPlug( false )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
-              .id( "e4f73936-9161-11e4-9d74-52540066fee9" )
-              .name( "Ubuntu-12.04-LTS-server-2015-01-01" )
-              .size( 2048f )
-              .type( Image.Type.HDD )
-              .location( Location.DE_FRA )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .osType( OsType.LINUX )
-              .isPublic( true )
-              .isRamHotPlug( true )
-              .isRamHotUnPlug( false )
-              .isWriteable( true )
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("e4f73936-9161-11e4-9d74-52540066fee9")
+              .name("Ubuntu-12.04-LTS-server-2015-01-01")
+              .size(2048f)
+              .type(Image.Type.HDD)
+              .location(Location.DE_FRA)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isPublic(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .isWriteable(true)
               .build(),
               Image.builder()
-              .isBootable( true )
-              .isCpuHotPlug( true )
-              .isCpuHotUnPlug( false )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
-              .id( "a984a5d3-9163-11e4-9d74-52540066fee9" )
-              .name( "Ubuntu-14.04-LTS-server-2015-01-01" )
-              .size( 2048f )
-              .type( Image.Type.HDD )
-              .location( Location.DE_FRA )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .osType( OsType.LINUX )
-              .isPublic( true )
-              .isRamHotPlug( true )
-              .isRamHotUnPlug( false )
-              .isWriteable( true )
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("a984a5d3-9163-11e4-9d74-52540066fee9")
+              .name("Ubuntu-14.04-LTS-server-2015-01-01")
+              .size(2048f)
+              .type(Image.Type.HDD)
+              .location(Location.DE_FRA)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isPublic(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .isWriteable(true)
               .build(),
               Image.builder()
-              .isBootable( true )
-              .isCpuHotPlug( true )
-              .isCpuHotUnPlug( false )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
-              .id( "5f3cac96-915f-11e4-9d74-52540066fee9" )
-              .name( "Debian-jessie-prerelease-server-2015-01-01" )
-              .size( 2048f )
-              .type( Image.Type.HDD )
-              .location( Location.UNRECOGNIZED )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .osType( OsType.LINUX )
-              .isPublic( true )
-              .isRamHotPlug( true )
-              .isRamHotUnPlug( false )
-              .isWriteable( true )
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("5f3cac96-915f-11e4-9d74-52540066fee9")
+              .name("Debian-jessie-prerelease-server-2015-01-01")
+              .size(2048f)
+              .type(Image.Type.HDD)
+              .location(Location.UNRECOGNIZED)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isPublic(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .isWriteable(true)
               .build(),
               Image.builder()
-              .isBootable( true )
-              .isCpuHotPlug( true )
-              .isCpuHotUnPlug( false )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
-              .id( "f4742db0-9160-11e4-9d74-52540066fee9" )
-              .name( "Fedora-19-server-2015-01-01" )
-              .size( 2048f )
-              .type( Image.Type.HDD )
-              .location( Location.UNRECOGNIZED )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .osType( OsType.LINUX )
-              .isPublic( true )
-              .isRamHotPlug( true )
-              .isRamHotUnPlug( false )
-              .isWriteable( true )
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("f4742db0-9160-11e4-9d74-52540066fee9")
+              .name("Fedora-19-server-2015-01-01")
+              .size(2048f)
+              .type(Image.Type.HDD)
+              .location(Location.UNRECOGNIZED)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isPublic(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .isWriteable(true)
               .build(),
               Image.builder()
-              .isBootable( true )
-              .isCpuHotPlug( true )
-              .isCpuHotUnPlug( false )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
-              .id( "86902c18-9164-11e4-9d74-52540066fee9" )
-              .name( "Ubuntu-12.04-LTS-server-2015-01-01" )
-              .size( 2048f )
-              .type( Image.Type.HDD )
-              .location( Location.UNRECOGNIZED )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .osType( OsType.LINUX )
-              .isPublic( true )
-              .isRamHotPlug( true )
-              .isRamHotUnPlug( false )
-              .isWriteable( true )
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("86902c18-9164-11e4-9d74-52540066fee9")
+              .name("Ubuntu-12.04-LTS-server-2015-01-01")
+              .size(2048f)
+              .type(Image.Type.HDD)
+              .location(Location.UNRECOGNIZED)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isPublic(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .isWriteable(true)
               .build(),
               Image.builder()
-              .isBootable( true )
-              .isCpuHotPlug( true )
-              .isCpuHotUnPlug( false )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
-              .id( "3b48e3ff-9163-11e4-9d74-52540066fee9" )
-              .name( "Ubuntu-14.04-LTS-server-2015-01-01" )
-              .size( 2048f )
-              .type( Image.Type.HDD )
-              .location( Location.DE_FKB )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .osType( OsType.LINUX )
-              .isPublic( true )
-              .isRamHotPlug( true )
-              .isRamHotUnPlug( false )
-              .isWriteable( true )
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("3b48e3ff-9163-11e4-9d74-52540066fee9")
+              .name("Ubuntu-14.04-LTS-server-2015-01-01")
+              .size(2048f)
+              .type(Image.Type.HDD)
+              .location(Location.DE_FKB)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isPublic(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .isWriteable(true)
               .build(),
               Image.builder()
-              .isBootable( true )
-              .isCpuHotPlug( true )
-              .isCpuHotUnPlug( false )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
-              .id( "6ce17716-9164-11e4-9d74-52540066fee9" )
-              .name( "Ubuntu-12.04-LTS-server-2015-01-01" )
-              .size( 2048f )
-              .type( Image.Type.HDD )
-              .location( Location.US_LAS )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .osType( OsType.LINUX )
-              .isPublic( true )
-              .isRamHotPlug( true )
-              .isRamHotUnPlug( false )
-              .isWriteable( true )
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("6ce17716-9164-11e4-9d74-52540066fee9")
+              .name("Ubuntu-12.04-LTS-server-2015-01-01")
+              .size(2048f)
+              .type(Image.Type.HDD)
+              .location(Location.US_LAS)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isPublic(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .isWriteable(true)
               .build()
       );
 
-      assertEquals( expected, actual );
+      assertEquals(expected, actual);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandlerTest.java
index 700b1e5..19bc29d 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandlerTest.java
@@ -21,20 +21,20 @@ import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
 import static org.testng.Assert.assertEquals;
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "ServerIdOnlyResponseHandlerTest" )
+@Test(groups = "unit", testName = "ServerIdOnlyResponseHandlerTest")
 public class ServerIdOnlyResponseHandlerTest extends BaseResponseHandlerTest<String> {
 
    @Override
    protected ParseSax<String> createParser() {
-      return factory.create( injector.getInstance( ServerIdOnlyResponseHandler.class ) );
+      return factory.create(injector.getInstance(ServerIdOnlyResponseHandler.class));
    }
 
    @Test
    public void testParseResponseFromCreateServer() {
       ParseSax<String> parser = createParser();
 
-      String serverId = parser.parse( payloadFromResource( "/server/server-create.xml" ) );
+      String serverId = parser.parse(payloadFromResource("/server/server-create.xml"));
 
-      assertEquals( "qwertyui-qwer-qwer-qwer-qwertyyuiiop", serverId );
+      assertEquals("qwertyui-qwer-qwer-qwer-qwertyyuiiop", serverId);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
index 734e169..b050568 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandlerTest.java
@@ -16,7 +16,9 @@
  */
 package org.jclouds.profitbricks.http.parser.server;
 
-import java.text.ParseException;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
 import org.jclouds.date.DateCodec;
 import org.jclouds.date.DateCodecFactory;
 import org.jclouds.http.functions.ParseSax;
@@ -25,52 +27,51 @@ import org.jclouds.profitbricks.domain.OsType;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
+
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "ServerInfoResponseHandlerTest" )
+@Test(groups = "unit", testName = "ServerInfoResponseHandlerTest")
 public class ServerInfoResponseHandlerTest extends BaseResponseHandlerTest<Server> {
 
    @Override
    protected ParseSax<Server> createParser() {
-      return factory.create( injector.getInstance( ServerInfoResponseHandler.class ) );
+      return factory.create(injector.getInstance(ServerInfoResponseHandler.class));
    }
 
    protected DateCodecFactory createDateParser() {
-      return injector.getInstance( DateCodecFactory.class );
+      return injector.getInstance(DateCodecFactory.class);
    }
 
    @Test
-   public void testParseResponseFromGetServer() throws ParseException {
+   public void testParseResponseFromGetServer() {
       ParseSax<Server> parser = createParser();
 
-      Server actual = parser.parse( payloadFromResource( "/server/server.xml" ) );
-      assertNotNull( actual, "Parsed content returned null" );
+      Server actual = parser.parse(payloadFromResource("/server/server.xml"));
+      assertNotNull(actual, "Parsed content returned null");
 
       DateCodec dateParser = createDateParser().iso8601();
 
       Server expected = Server.builder()
-              .id( "qwertyui-qwer-qwer-qwer-qwertyyuiiop" )
-              .name( "facebook-node" )
-              .cores( 4 )
-              .ram( 4096 )
-              .hasInternetAccess( true )
-              .state( ProvisioningState.AVAILABLE )
-              .status( Server.Status.RUNNING )
-              .creationTime( dateParser.toDate( "2014-12-04T07:09:23.138Z" ) )
-              .lastModificationTime( dateParser.toDate( "2014-12-12T03:08:35.629Z" ) )
-              .osType( OsType.LINUX )
-              .availabilityZone( AvailabilityZone.AUTO )
-              .isCpuHotPlug( true )
-              .isRamHotPlug( true )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
+              .id("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+              .name("facebook-node")
+              .cores(4)
+              .ram(4096)
+              .hasInternetAccess(true)
+              .state(ProvisioningState.AVAILABLE)
+              .status(Server.Status.RUNNING)
+              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
+              .osType(OsType.LINUX)
+              .availabilityZone(AvailabilityZone.AUTO)
+              .isCpuHotPlug(true)
+              .isRamHotPlug(true)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
               .build();
 
-      assertEquals( actual, expected );
+      assertEquals(actual, expected);
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
index c9c01c6..09ee5bb 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandlerTest.java
@@ -30,68 +30,68 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import org.testng.annotations.Test;
 
-@Test( groups = "unit", testName = "ServerListResponseHandlerTest" )
+@Test(groups = "unit", testName = "ServerListResponseHandlerTest")
 public class ServerListResponseHandlerTest extends BaseResponseHandlerTest<List<Server>> {
 
    @Override
    protected ParseSax<List<Server>> createParser() {
-      return factory.create( injector.getInstance( ServerListResponseHandler.class ) );
+      return factory.create(injector.getInstance(ServerListResponseHandler.class));
    }
 
    protected DateCodecFactory createDateParser() {
-      return injector.getInstance( DateCodecFactory.class );
+      return injector.getInstance(DateCodecFactory.class);
    }
 
    @Test
    public void testParseResponseFromGetAllServers() {
       ParseSax<List<Server>> parser = createParser();
 
-      List<Server> actual = parser.parse( payloadFromResource( "/server/servers.xml" ) );
-      assertNotNull( actual, "Parsed content returned null" );
+      List<Server> actual = parser.parse(payloadFromResource("/server/servers.xml"));
+      assertNotNull(actual, "Parsed content returned null");
 
       DateCodec dateParser = createDateParser().iso8601();
 
       List<Server> expected = ImmutableList.<Server>of(
               Server.builder()
-              .id( "qwertyui-qwer-qwer-qwer-qwertyyuiiop" )
-              .name( "facebook-node" )
-              .cores( 4 )
-              .ram( 4096 )
-              .hasInternetAccess( true )
-              .state( ProvisioningState.AVAILABLE )
-              .status( Server.Status.RUNNING )
-              .creationTime( dateParser.toDate( "2014-12-04T07:09:23.138Z" ) )
-              .lastModificationTime( dateParser.toDate( "2014-12-12T03:08:35.629Z" ) )
-              .osType( OsType.LINUX )
-              .availabilityZone( AvailabilityZone.AUTO )
-              .isCpuHotPlug( true )
-              .isRamHotPlug( true )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
+              .id("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+              .name("facebook-node")
+              .cores(4)
+              .ram(4096)
+              .hasInternetAccess(true)
+              .state(ProvisioningState.AVAILABLE)
+              .status(Server.Status.RUNNING)
+              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
+              .osType(OsType.LINUX)
+              .availabilityZone(AvailabilityZone.AUTO)
+              .isCpuHotPlug(true)
+              .isRamHotPlug(true)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
               .build(),
               Server.builder()
-              .id( "asdfghjk-asdf-asdf-asdf-asdfghjklkjl" )
-              .name( "google-node" )
-              .cores( 1 )
-              .ram( 1024 )
-              .hasInternetAccess( false )
-              .state( ProvisioningState.AVAILABLE )
-              .status( Server.Status.RUNNING )
-              .creationTime( dateParser.toDate( "2014-11-12T07:01:00.441Z" ) )
-              .lastModificationTime( dateParser.toDate( "2014-11-12T07:01:00.441Z" ) )
-              .osType( OsType.LINUX )
-              .availabilityZone( AvailabilityZone.AUTO )
-              .isCpuHotPlug( true )
-              .isRamHotPlug( true )
-              .isNicHotPlug( true )
-              .isNicHotUnPlug( true )
-              .isDiscVirtioHotPlug( true )
-              .isDiscVirtioHotUnPlug( true )
+              .id("asdfghjk-asdf-asdf-asdf-asdfghjklkjl")
+              .name("google-node")
+              .cores(1)
+              .ram(1024)
+              .hasInternetAccess(false)
+              .state(ProvisioningState.AVAILABLE)
+              .status(Server.Status.RUNNING)
+              .creationTime(dateParser.toDate("2014-11-12T07:01:00.441Z"))
+              .lastModificationTime(dateParser.toDate("2014-11-12T07:01:00.441Z"))
+              .osType(OsType.LINUX)
+              .availabilityZone(AvailabilityZone.AUTO)
+              .isCpuHotPlug(true)
+              .isRamHotPlug(true)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
               .build()
       );
 
-      assertEquals( actual, expected );
+      assertEquals(actual, expected);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandlerTest.java
index 0f9822b..3bd2755 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandlerTest.java
@@ -40,70 +40,70 @@ public class GetProvisioningStateResponseHandlerTest extends BaseResponseHandler
       ParseSax<ProvisioningState> parser = createParser();
 
       for (Map.Entry<ProvisioningState, String> pair : sampleResponses.entrySet()) {
-	 ProvisioningState actual = parser.parse(pair.getValue());
-	 assertNotNull(actual, "Parsed content returned null");
+         ProvisioningState actual = parser.parse(pair.getValue());
+         assertNotNull(actual, "Parsed content returned null");
 
-	 assertEquals(pair.getKey(), actual);
+         assertEquals(pair.getKey(), actual);
       }
 
    }
 
    private final Map<ProvisioningState, String> sampleResponses = new LinkedHashMap<ProvisioningState, String>() {
       {
-	 put(ProvisioningState.INACTIVE,
-		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
-		 + "   <soapenv:Header/>\n"
-		 + "   <soapenv:Body>\n"
-		 + "      <ws:getDataCenterStateResponse>\n"
-		 + "         <return>INACTIVE</return>\n"
-		 + "      </ws:getDataCenterStateResponse>\n"
-		 + "   </soapenv:Body>\n"
-		 + "</soapenv:Envelope>");
-	 put(ProvisioningState.INPROCESS,
-		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
-		 + "   <soapenv:Header/>\n"
-		 + "   <soapenv:Body>\n"
-		 + "      <ws:getDataCenterStateResponse>\n"
-		 + "         <return>INPROCESS</return>\n"
-		 + "      </ws:getDataCenterStateResponse>\n"
-		 + "   </soapenv:Body>\n"
-		 + "</soapenv:Envelope>");
-	 put(ProvisioningState.AVAILABLE,
-		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
-		 + "   <soapenv:Header/>\n"
-		 + "   <soapenv:Body>\n"
-		 + "      <ws:getDataCenterStateResponse>\n"
-		 + "         <return>AVAILABLE</return>\n"
-		 + "      </ws:getDataCenterStateResponse>\n"
-		 + "   </soapenv:Body>\n"
-		 + "</soapenv:Envelope>");
-	 put(ProvisioningState.DELETED,
-		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
-		 + "   <soapenv:Header/>\n"
-		 + "   <soapenv:Body>\n"
-		 + "      <ws:getDataCenterStateResponse>\n"
-		 + "         <return>DELETED</return>\n"
-		 + "      </ws:getDataCenterStateResponse>\n"
-		 + "   </soapenv:Body>\n"
-		 + "</soapenv:Envelope>");
-	 put(ProvisioningState.ERROR,
-		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
-		 + "   <soapenv:Header/>\n"
-		 + "   <soapenv:Body>\n"
-		 + "      <ws:getDataCenterStateResponse>\n"
-		 + "         <return>ERROR</return>\n"
-		 + "      </ws:getDataCenterStateResponse>\n"
-		 + "   </soapenv:Body>\n"
-		 + "</soapenv:Envelope>");
-	 put(ProvisioningState.UNRECOGNIZED,
-		 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
-		 + "   <soapenv:Header/>\n"
-		 + "   <soapenv:Body>\n"
-		 + "      <ws:getDataCenterStateResponse>\n"
-		 + "         <return>MEH</return>\n"
-		 + "      </ws:getDataCenterStateResponse>\n"
-		 + "   </soapenv:Body>\n"
-		 + "</soapenv:Envelope>");
+         put(ProvisioningState.INACTIVE,
+                 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+                 + "   <soapenv:Header/>\n"
+                 + "   <soapenv:Body>\n"
+                 + "      <ws:getDataCenterStateResponse>\n"
+                 + "         <return>INACTIVE</return>\n"
+                 + "      </ws:getDataCenterStateResponse>\n"
+                 + "   </soapenv:Body>\n"
+                 + "</soapenv:Envelope>");
+         put(ProvisioningState.INPROCESS,
+                 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+                 + "   <soapenv:Header/>\n"
+                 + "   <soapenv:Body>\n"
+                 + "      <ws:getDataCenterStateResponse>\n"
+                 + "         <return>INPROCESS</return>\n"
+                 + "      </ws:getDataCenterStateResponse>\n"
+                 + "   </soapenv:Body>\n"
+                 + "</soapenv:Envelope>");
+         put(ProvisioningState.AVAILABLE,
+                 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+                 + "   <soapenv:Header/>\n"
+                 + "   <soapenv:Body>\n"
+                 + "      <ws:getDataCenterStateResponse>\n"
+                 + "         <return>AVAILABLE</return>\n"
+                 + "      </ws:getDataCenterStateResponse>\n"
+                 + "   </soapenv:Body>\n"
+                 + "</soapenv:Envelope>");
+         put(ProvisioningState.DELETED,
+                 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+                 + "   <soapenv:Header/>\n"
+                 + "   <soapenv:Body>\n"
+                 + "      <ws:getDataCenterStateResponse>\n"
+                 + "         <return>DELETED</return>\n"
+                 + "      </ws:getDataCenterStateResponse>\n"
+                 + "   </soapenv:Body>\n"
+                 + "</soapenv:Envelope>");
+         put(ProvisioningState.ERROR,
+                 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+                 + "   <soapenv:Header/>\n"
+                 + "   <soapenv:Body>\n"
+                 + "      <ws:getDataCenterStateResponse>\n"
+                 + "         <return>ERROR</return>\n"
+                 + "      </ws:getDataCenterStateResponse>\n"
+                 + "   </soapenv:Body>\n"
+                 + "</soapenv:Envelope>");
+         put(ProvisioningState.UNRECOGNIZED,
+                 "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">\n"
+                 + "   <soapenv:Header/>\n"
+                 + "   <soapenv:Body>\n"
+                 + "      <ws:getDataCenterStateResponse>\n"
+                 + "         <return>MEH</return>\n"
+                 + "      </ws:getDataCenterStateResponse>\n"
+                 + "   </soapenv:Body>\n"
+                 + "</soapenv:Envelope>");
       }
    };
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageIdOnlyResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageIdOnlyResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageIdOnlyResponseHandlerTest.java
new file mode 100644
index 0000000..def23b6
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageIdOnlyResponseHandlerTest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.storage;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "StorageIdOnlyResponseHandlerTest")
+public class StorageIdOnlyResponseHandlerTest extends BaseResponseHandlerTest<String> {
+
+   @Override
+   protected ParseSax<String> createParser() {
+      return factory.create(injector.getInstance(StorageIdOnlyResponseHandler.class));
+   }
+
+   @Test
+   public void testParseResponseFromCreateStorage() {
+      ParseSax<String> parser = createParser();
+
+      String storageId = parser.parse(payloadFromResource("/storage/storage-create.xml"));
+
+      assertEquals("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh", storageId);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandlerTest.java
new file mode 100644
index 0000000..338b02b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandlerTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.storage;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+@Test(groups = "unit", testName = "StorageInfoResponseHandlerTest")
+public class StorageInfoResponseHandlerTest extends BaseResponseHandlerTest<Storage> {
+
+   @Override
+   protected ParseSax<Storage> createParser() {
+      return factory.create(injector.getInstance(StorageInfoResponseHandler.class));
+   }
+
+   protected DateCodecFactory createDateParser() {
+      return injector.getInstance(DateCodecFactory.class);
+   }
+
+   @Test
+   public void testParseResponseFromGetStorage() {
+      ParseSax<Storage> parser = createParser();
+
+      Storage actual = parser.parse(payloadFromResource("/storage/storage.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      DateCodec dateParser = createDateParser().iso8601();
+
+      Storage expected = Storage.builder()
+              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+              .size(40)
+              .name("hdd-1")
+              .state(ProvisioningState.AVAILABLE)
+              .serverIds(ImmutableList.<String>of("qwertyui-qwer-qwer-qwer-qwertyyuiiop"))
+              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.toDate("2014-12-12T03:14:48.316Z"))
+              .build();
+
+      assertEquals(actual, expected);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandlerTest.java
new file mode 100644
index 0000000..62e43fc
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandlerTest.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.storage;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import com.google.common.collect.ImmutableList;
+
+import java.util.List;
+
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Storage;
+import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "StorageListResponseHandlerTest")
+public class StorageListResponseHandlerTest extends BaseResponseHandlerTest<List<Storage>> {
+
+   @Override
+   protected ParseSax<List<Storage>> createParser() {
+      return factory.create(injector.getInstance(StorageListResponseHandler.class));
+   }
+
+   protected DateCodecFactory createDateParser() {
+      return injector.getInstance(DateCodecFactory.class);
+   }
+
+   @Test
+   public void testParseResponseFromGetAllStorages() {
+      ParseSax<List<Storage>> parser = createParser();
+
+      List<Storage> actual = parser.parse(payloadFromResource("/storage/storages.xml"));
+      assertNotNull(actual, "Parsed content returned null");
+
+      DateCodec dateParser = createDateParser().iso8601();
+
+      List<Storage> expected = ImmutableList.<Storage>of(
+              Storage.builder()
+              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+              .size(40f)
+              .name("hdd-1")
+              .state(ProvisioningState.AVAILABLE)
+              .serverIds(ImmutableList.<String>of("qwertyui-qwer-qwer-qwer-qwertyyuiiop"))
+              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.toDate("2014-12-12T03:14:48.316Z"))
+              .build(),
+              Storage.builder()
+              .id("asfasfle-f23n-cu89-klfr-njkdsvwllkfa")
+              .size(100f)
+              .name("hdd-2")
+              .state(ProvisioningState.INPROCESS)
+              .serverIds(ImmutableList.<String>of("asdfghjk-asdf-asdf-asdf-asdfghjklkjl"))
+              .creationTime(dateParser.toDate("2014-11-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.toDate("2014-11-12T03:14:48.316Z"))
+              .build()
+      );
+
+      assertEquals(actual, expected);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
index 3e5d19a..d5883a6 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/internal/BaseProfitBricksMockTest.java
@@ -46,11 +46,11 @@ public class BaseProfitBricksMockTest {
    protected static final String authHeader = BasicAuthentication.basic("username", "password");
    protected static final String provider = "profitbricks";
    protected static final String rootUrl = "/1.3";
-   
+
    private static final String SOAP_PREFIX
-	   = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">"
-	   + "<soapenv:Header/>"
-	   + "<soapenv:Body>";
+           = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">"
+           + "<soapenv:Header/>"
+           + "<soapenv:Body>";
 
    private static final String SOAP_SUFFIX = "</soapenv:Body></soapenv:Envelope>";
 
@@ -77,7 +77,7 @@ public class BaseProfitBricksMockTest {
       server.play();
       return server;
    }
-   
+
    public byte[] payloadFromResource(String resource) {
       try {
          return toStringAndClose(getClass().getResourceAsStream(resource)).getBytes(Charsets.UTF_8);
@@ -85,9 +85,9 @@ public class BaseProfitBricksMockTest {
          throw Throwables.propagate(e);
       }
    }
-   
-   protected static String payloadSoapWithBody(String body){
-      return SOAP_PREFIX.concat( body ).concat( SOAP_SUFFIX );
+
+   protected static String payloadSoapWithBody(String body) {
+      return SOAP_PREFIX.concat(body).concat(SOAP_SUFFIX);
    }
 
    protected static void assertRequestHasCommonProperties(final RecordedRequest request) {
@@ -96,9 +96,9 @@ public class BaseProfitBricksMockTest {
       assertEquals(request.getHeader(HttpHeaders.AUTHORIZATION), authHeader);
       assertEquals(request.getHeader(HttpHeaders.ACCEPT), MediaType.TEXT_XML);
    }
-   
-   protected static void assertRequestHasCommonProperties(final RecordedRequest request, String content ){
-      assertEquals( new String( request.getBody() ), payloadSoapWithBody( content ) );
-      assertRequestHasCommonProperties( request );
+
+   protected static void assertRequestHasCommonProperties(final RecordedRequest request, String content) {
+      assertEquals(new String(request.getBody()), payloadSoapWithBody(content));
+      assertRequestHasCommonProperties(request);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/datacenter/datacenter.xml b/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
index 2911c81..9d8e20a 100644
--- a/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
+++ b/providers/profitbricks/src/test/resources/datacenter/datacenter.xml
@@ -33,7 +33,7 @@
                         <serverId>12345678-abcd-efgh-ijkl-987654321000</serverId>
                         <ips>202.94.38.12</ips>
                         <macAddress>02:01:09:cd:f0:b0</macAddress>
-                        <firewall>`
+                        <firewall>
                             <active>false</active>
                             <firewallId>llllllll-kkkk-jjjj-hhhh-gggggggggggg</firewallId>
                             <firewallId>62383ec1-38c8-486b-8fa2-a3bb0a5edd97</firewallId>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/fault-404.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/fault-404.xml b/providers/profitbricks/src/test/resources/fault-404.xml
index 430be82..1875102 100644
--- a/providers/profitbricks/src/test/resources/fault-404.xml
+++ b/providers/profitbricks/src/test/resources/fault-404.xml
@@ -14,4 +14,4 @@
             </detail>
         </S:Fault>
     </S:Body>
-</S:Envelope>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/fault-413.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/fault-413.xml b/providers/profitbricks/src/test/resources/fault-413.xml
new file mode 100644
index 0000000..b4d5f79
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/fault-413.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
+            <faultcode>S:Server</faultcode>
+            <faultstring>New request exceeds the current capacity settings of this user contract.  Please refer to Request Id : 16503940. [VDC-5-1020] Server  has 12,800 MiB configured RAM. Your personal limit is 10,240 MiB per server.</faultstring>
+            <detail>
+                <ns2:ProfitbricksServiceFault xmlns:ns2="http://ws.api.profitbricks.com/">
+                    <faultCode>OVER_LIMIT_SETTING</faultCode>
+                    <httpCode>413</httpCode>
+                    <message>New request exceeds the current capacity settings of this user contract.  Please refer to Request Id : 16503940. [VDC-5-1020] Server  has 12,800 MiB configured RAM. Your personal limit is 10,240 MiB per server.</message>
+                    <requestId>16503940</requestId>
+                </ns2:ProfitbricksServiceFault>
+            </detail>
+        </S:Fault>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/maintenance-503.html
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/maintenance-503.html b/providers/profitbricks/src/test/resources/maintenance-503.html
new file mode 100644
index 0000000..bbc1b1f
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/maintenance-503.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta lang="en" http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+        <title>Profitbricks | Maintenance</title>
+        <link rel="stylesheet" type="text/css" href="css/style.css" />
+        <link rel="stylesheet" type="text/css" href="css/content.css" />
+        <link rel="stylesheet" type="text/css" href="css/recent_additions.css" />
+        <link rel="shortcut icon" href="https://my.profitbricks.com/errorpages/favicon.ico" type="image/x-icon" />
+    </head>
+
+    <body>
+        <div class="head1 h_bg"></div>
+        <div class="head2 h_bg"></div>
+        <div class="head3 h_bg"></div>
+
+        <div id="wrapper">
+            <div class="wrapper_inner">
+
+                <div id="header">
+                    <a id="logo" href="#"><img alt="Profitbricks" src="img/logo.png" /></a>
+                </div>
+
+                <div id="main">
+                    <div id="right" style="min-height: 550px;">
+                        <div class="article msg">
+                            <h1>Maintenance</h1>
+                            <img width="49" height="49" title="" alt="message error" src="Profitbricks%20%7C%20Maintenance_files/msg_error.png" class="msg_sign" style="margin: 10px;" />
+                            <div class="container" style="margin:20px 80px !important;">
+                                <div class="bigmargin">
+                                    <h2>Dear ProfitBricks users,</h2>
+                                    <p>actually we are carrying out maintenance work right now.</p>
+                                    <p>For urgent matters please contact:<br /><a href="mailto:support@profitbricks.com">support@profitbricks.com</a>.</p>
+                                    <br />
+                                    <p>We ask for your understanding and your patience.</p>
+                                    <p>Your ProfitBricks Team</p>
+                                </div>
+
+                                <div class="bigmargin">
+                                    <h2>Sehr geehrte(r) ProfitBricks Nutzerin/Nutzer,</h2>
+                                    <p>zur Zeit führen wir Wartungsarbeiten durch.</p>
+                                    <p>Bei dringenden Angelegenheiten wenden Sie sich bitte an:<br />
+                                        <a href="mailto:support@profitbricks.com">support@profitbricks.com</a>
+                                    </p>
+                                    <br />
+                                    <p>Wir bitten Sie um Ihr Verständnis und um etwas Geduld.</p>
+                                    <p>Ihr ProfitBricks Team</p>
+                                </div>
+
+                            </div>
+                        </div>
+                    </div>
+                    <br class="clear" />
+                </div>
+
+            </div>
+        </div>
+
+        <div id="footer">
+            <div class="bottom">
+                <div class="inner">
+                </div>
+            </div>
+        </div>
+
+    </body>
+</html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/server/server-state-inprocess.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server-state-inprocess.xml b/providers/profitbricks/src/test/resources/server/server-state-inprocess.xml
new file mode 100644
index 0000000..122191a
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/server/server-state-inprocess.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getServerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>16577212</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>22</dataCenterVersion>
+                <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>
+                <cores>1</cores>
+                <ram>512</ram>
+                <internetAccess>false</internetAccess>
+                <provisioningState>INPROCESS</provisioningState>
+                <virtualMachineState>NOSTATE</virtualMachineState>
+                <creationTime>2015-01-29T00:37:49.096Z</creationTime>
+                <lastModificationTime>2015-01-29T00:37:49.096Z</lastModificationTime>
+                <osType>UNKNOWN</osType>
+                <availabilityZone>AUTO</availabilityZone>
+                <cpuHotPlug>false</cpuHotPlug>
+                <ramHotPlug>false</ramHotPlug>
+                <nicHotPlug>false</nicHotPlug>
+                <nicHotUnPlug>false</nicHotUnPlug>
+                <discVirtioHotPlug>false</discVirtioHotPlug>
+                <discVirtioHotUnPlug>false</discVirtioHotUnPlug>
+            </return>
+        </ns2:getServerResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/storage/storage-connect.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/storage/storage-connect.xml b/providers/profitbricks/src/test/resources/storage/storage-connect.xml
new file mode 100644
index 0000000..79673e2
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/storage/storage-connect.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:connectStorageToServerResponse>
+            <return>
+                <requestId>16463317</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>49</dataCenterVersion>
+            </return>
+        </ws:connectStorageToServerResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/storage/storage-create.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/storage/storage-create.xml b/providers/profitbricks/src/test/resources/storage/storage-create.xml
new file mode 100644
index 0000000..3e1d1f3
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/storage/storage-create.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:createStorageReturn>
+            <return>
+                <requestId>1234567</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>45</dataCenterVersion>
+                <storageId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</storageId>
+            </return>
+        </ws:createStorageReturn>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/storage/storage-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/storage/storage-delete.xml b/providers/profitbricks/src/test/resources/storage/storage-delete.xml
new file mode 100644
index 0000000..a973126
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/storage/storage-delete.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:deleteStorageResponse>
+            <return>
+                <requestId>12345679</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>47</dataCenterVersion>
+            </return>
+        </ws:deleteStorageResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/storage/storage-disconnect.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/storage/storage-disconnect.xml b/providers/profitbricks/src/test/resources/storage/storage-disconnect.xml
new file mode 100644
index 0000000..8726fe2
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/storage/storage-disconnect.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:disconnectStorageFromServerResponse>
+            <return>
+                <requestId>16463318</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>50</dataCenterVersion>
+            </return>
+        </ws:disconnectStorageFromServerResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/storage/storage-state-inprocess.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/storage/storage-state-inprocess.xml b/providers/profitbricks/src/test/resources/storage/storage-state-inprocess.xml
new file mode 100644
index 0000000..85c4717
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/storage/storage-state-inprocess.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getStorageResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>16463316</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>49</dataCenterVersion>
+                <storageId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</storageId>
+                <size>40</size>
+                <storageName>hdd-1</storageName>
+                <mountImage>
+                    <imageId>f0a59a5c-7940-11e4-8053-52540066fee9</imageId>
+                    <imageName>Ubuntu-14.04-LTS-server-2014-12-01</imageName>
+                </mountImage>
+                <serverIds>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverIds>
+                <provisioningState>INPROCESS</provisioningState>
+                <creationTime>2014-12-04T07:09:23.138Z</creationTime>
+                <lastModificationTime>2014-12-12T03:14:48.316Z</lastModificationTime>
+            </return>
+        </ns2:getStorageResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/storage/storage-update.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/storage/storage-update.xml b/providers/profitbricks/src/test/resources/storage/storage-update.xml
new file mode 100644
index 0000000..ff71f32
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/storage/storage-update.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:updateStorageResponse>
+            <return>
+                <requestId>1234568</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>46</dataCenterVersion>
+            </return>
+        </ws:updateStorageResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/storage/storage.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/storage/storage.xml b/providers/profitbricks/src/test/resources/storage/storage.xml
new file mode 100644
index 0000000..fe4dfc5
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/storage/storage.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getStorageResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>16463316</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>49</dataCenterVersion>
+                <storageId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</storageId>
+                <size>40</size>
+                <storageName>hdd-1</storageName>
+                <mountImage>
+                    <imageId>f0a59a5c-7940-11e4-8053-52540066fee9</imageId>
+                    <imageName>Ubuntu-14.04-LTS-server-2014-12-01</imageName>
+                </mountImage>
+                <serverIds>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverIds>
+                <provisioningState>AVAILABLE</provisioningState>
+                <creationTime>2014-12-04T07:09:23.138Z</creationTime>
+                <lastModificationTime>2014-12-12T03:14:48.316Z</lastModificationTime>
+            </return>
+        </ns2:getStorageResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/2a219a99/providers/profitbricks/src/test/resources/storage/storages.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/storage/storages.xml b/providers/profitbricks/src/test/resources/storage/storages.xml
new file mode 100644
index 0000000..a732861
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/storage/storages.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getAllStoragesResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>49</dataCenterVersion>
+                <storageId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</storageId>
+                <size>40</size>
+                <storageName>hdd-1</storageName>
+                <mountImage>
+                    <imageId>f0a59a5c-7940-11e4-8053-52540066fee9</imageId>
+                    <imageName>Ubuntu-14.04-LTS-server-2014-12-01</imageName>
+                </mountImage>
+                <serverIds>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverIds>
+                <provisioningState>AVAILABLE</provisioningState>
+                <creationTime>2014-12-04T07:09:23.138Z</creationTime>
+                <lastModificationTime>2014-12-12T03:14:48.316Z</lastModificationTime>
+            </return>
+            <return>
+                <dataCenterId>qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy</dataCenterId>
+                <dataCenterVersion>238</dataCenterVersion>
+                <storageId>asfasfle-f23n-cu89-klfr-njkdsvwllkfa</storageId>
+                <size>100</size>
+                <storageName>hdd-2</storageName>
+                <mountImage>
+                    <imageId>f4742db0-9160-11e4-9d74-52540066fee9</imageId>
+                    <imageName>Fedora-19-server-2015-01-01</imageName>
+                </mountImage>
+                <serverIds>asdfghjk-asdf-asdf-asdf-asdfghjklkjl</serverIds>
+                <provisioningState>INPROCESS</provisioningState>
+                <creationTime>2014-11-04T07:09:23.138Z</creationTime>
+                <lastModificationTime>2014-11-12T03:14:48.316Z</lastModificationTime>
+            </return>
+        </ns2:getAllStoragesResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file


[02/35] jclouds git commit: JCLOUDS-702: JCloud ProfitBricks provider implementation

Posted by de...@apache.org.
JCLOUDS-702: JCloud ProfitBricks provider implementation


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

Branch: refs/heads/master
Commit: cb45048a680b9788bf3ef1ef6964da5533d4eabe
Parents: 
Author: Reijhanniel Jearl Campos <de...@gmail.com>
Authored: Sat Jan 10 11:08:09 2015 +0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Jan 12 10:00:19 2015 +0100

----------------------------------------------------------------------
 providers/profitbricks/pom.xml                  | 147 +++++++++++
 .../jclouds/profitbricks/ProfitBricksApi.java   |  28 ++
 .../profitbricks/ProfitBricksApiMetadata.java   |  82 ++++++
 .../ProfitBricksProviderMetadata.java           |  66 +++++
 .../binder/BaseProfitBricksRequestBinder.java   |  75 ++++++
 .../CreateDataCenterRequestBinder.java          |  44 ++++
 .../UpdateDataCenterRequestBinder.java          |  44 ++++
 .../internal/ProvisioningStatusAware.java       |  27 ++
 .../ProvisioningStatusPollingPredicate.java     |  56 ++++
 .../config/ProfitBricksHttpApiModule.java       |  70 +++++
 .../jclouds/profitbricks/domain/DataCenter.java | 137 ++++++++++
 .../jclouds/profitbricks/domain/Location.java   |  50 ++++
 .../profitbricks/domain/ProvisioningState.java  |  30 +++
 .../profitbricks/domain/ServiceFault.java       |  95 +++++++
 .../profitbricks/features/DataCenterApi.java    | 134 ++++++++++
 .../handlers/ProfitBricksHttpErrorHandler.java  |  70 +++++
 ...usFromPayloadHttpCommandExecutorService.java | 122 +++++++++
 .../ProfitBricksSoapMessageEnvelope.java        |  59 +++++
 .../parser/BaseProfitBricksResponseHandler.java |  69 +++++
 .../parser/ServiceFaultResponseHandler.java     |  63 +++++
 .../BaseDataCenterResponseHandler.java          |  43 ++++
 .../DataCenterInfoResponseHandler.java          |  62 +++++
 .../DataCenterListResponseHandler.java          |  65 +++++
 .../GetProvisioningStateResponseHandler.java    |  52 ++++
 .../profitbricks/BaseProfitBricksLiveTest.java  |  45 ++++
 .../ProfitBricksProviderMetadataTest.java       |  29 +++
 .../CreateDataCenterRequestBinderTest.java      |  47 ++++
 .../UpdateDataCenterRequestBinderTest.java      |  46 ++++
 .../ProvisioningStatusPollingPredicateTest.java |  74 ++++++
 .../features/DataCenterApiLiveTest.java         | 127 +++++++++
 .../features/DataCenterApiMockTest.java         | 255 +++++++++++++++++++
 ...omPayloadHttpCommandExecutorServiceTest.java |  98 +++++++
 .../ProfitBricksSoapMessageEnvelopeTest.java    |  57 +++++
 .../http/parser/BaseResponseHandlerTest.java    |  61 +++++
 .../parser/ServiceFaultResponseHandlerTest.java |  49 ++++
 .../DataCenterInfoResponseHandlerTest.java      |  54 ++++
 .../DataCenterListResponseHandlerTest.java      |  53 ++++
 ...GetProvisioningStateResponseHandlerTest.java | 110 ++++++++
 .../internal/BaseProfitBricksMockTest.java      |  88 +++++++
 .../resources/datacenter/datacenter-cleared.xml |  12 +
 .../resources/datacenter/datacenter-created.xml |  13 +
 .../resources/datacenter/datacenter-deleted.xml |  10 +
 .../datacenter/datacenter-state-inprocess.xml   |   8 +
 .../resources/datacenter/datacenter-state.xml   |   8 +
 .../resources/datacenter/datacenter-updated.xml |  12 +
 .../test/resources/datacenter/datacenter.xml    |  80 ++++++
 .../test/resources/datacenter/datacenters.xml   |  19 ++
 .../src/test/resources/fault-400.xml            |  17 ++
 .../src/test/resources/fault-401.html           |  43 ++++
 .../src/test/resources/fault-404.xml            |  17 ++
 50 files changed, 3122 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/pom.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/pom.xml b/providers/profitbricks/pom.xml
new file mode 100644
index 0000000..ab0003d
--- /dev/null
+++ b/providers/profitbricks/pom.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.jclouds.labs</groupId>
+        <artifactId>jclouds-labs</artifactId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+  
+    <!-- TODO: when out of labs, switch to org.jclouds.api -->
+    <artifactId>profitbricks</artifactId>
+    <name>jclouds ProfitBricks api</name>
+    <description>jclouds components to access an implementation of ProfitBricks</description>
+    <packaging>bundle</packaging>
+
+    <properties>
+        <test.profitbricks.endpoint>https://api.profitbricks.com/1.3</test.profitbricks.endpoint>
+        <test.profitbricks.identity>FIXME</test.profitbricks.identity>
+        <test.profitbricks.credential>FIXME</test.profitbricks.credential>
+        <test.profitbricks.api-version>1.3</test.profitbricks.api-version>
+        <test.profitbricks.template />
+        <jclouds.osgi.export>org.jclouds.profitbricks*;version="${project.version}"</jclouds.osgi.export>
+        <jclouds.osgi.import>
+            org.jclouds.labs*;version="${project.version}",
+            org.jclouds*;version="${jclouds.version}",
+            *
+        </jclouds.osgi.import>
+    </properties>
+  
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-core</artifactId>
+            <version>${jclouds.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-compute</artifactId>
+            <version>${jclouds.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.auto.value</groupId>
+            <artifactId>auto-value</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <!-- Test dependencies -->
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-core</artifactId>
+            <version>${jclouds.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-compute</artifactId>
+            <version>${jclouds.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds.driver</groupId>
+            <artifactId>jclouds-sshj</artifactId>
+            <version>${jclouds.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp</groupId>
+            <artifactId>mockwebserver</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <!-- Already provided by jclouds-sshj -->
+                <exclusion>
+                    <groupId>org.bouncycastle</groupId>
+                    <artifactId>bcprov-jdk15on</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds.driver</groupId>
+            <artifactId>jclouds-slf4j</artifactId>
+            <version>${jclouds.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+  
+    <profiles>
+        <profile>
+            <id>live</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>integration</id>
+                                <phase>integration-test</phase>
+                                <goals>
+                                    <goal>test</goal>
+                                </goals>
+                                <configuration>
+                                    <threadCount>1</threadCount>
+                                    <systemPropertyVariables>
+                                        <test.profitbricks.endpoint>${test.profitbricks.endpoint}</test.profitbricks.endpoint>
+                                        <test.profitbricks.identity>${test.profitbricks.identity}</test.profitbricks.identity>
+                                        <test.profitbricks.credential>${test.profitbricks.credential}</test.profitbricks.credential>
+                                        <test.profitbricks.api-version>${test.profitbricks.api-version}</test.profitbricks.api-version>
+                                        <test.profitbricks.template>${test.profitbricks.template}</test.profitbricks.template>
+                                    </systemPropertyVariables>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
new file mode 100644
index 0000000..d1cb1e1
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+import java.io.Closeable;
+
+import org.jclouds.profitbricks.features.DataCenterApi;
+import org.jclouds.rest.annotations.Delegate;
+
+public interface ProfitBricksApi extends Closeable {
+
+   @Delegate
+   DataCenterApi dataCenterApi();
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
new file mode 100644
index 0000000..f51dc5b
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApiMetadata.java
@@ -0,0 +1,82 @@
+/*
+ * 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;
+
+import java.net.URI;
+import java.util.Properties;
+
+import org.jclouds.profitbricks.config.ProfitBricksHttpApiModule;
+import org.jclouds.apis.ApiMetadata;
+import org.jclouds.profitbricks.config.ProfitBricksHttpApiModule.ProfitBricksHttpCommandExecutorServiceModule;
+import org.jclouds.rest.internal.BaseHttpApiMetadata;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
+
+/**
+ * Implementation of {@link ApiMetadata} for ProfitBricks API.
+ */
+public class ProfitBricksApiMetadata extends BaseHttpApiMetadata<ProfitBricksApi> {
+
+   public ProfitBricksApiMetadata() {
+      this(new Builder());
+   }
+
+   @Override
+   public Builder toBuilder() {
+      return new Builder().fromApiMetadata(this);
+   }
+
+   protected ProfitBricksApiMetadata(Builder builder) {
+      super(builder);
+   }
+
+   public static Properties defaultProperties() {
+      Properties properties = BaseHttpApiMetadata.defaultProperties();
+      return properties;
+   }
+
+   public static class Builder extends BaseHttpApiMetadata.Builder<ProfitBricksApi, Builder> {
+
+      protected Builder() {
+	 id("profitbricks")
+		 .name("ProfitBricks API")
+		 .identityName("API Username")
+		 .credentialName("API Password")
+		 .documentation(URI.create("https://www.profitbricks.com/sites/default/files/profitbricks_api_1_3.pdf"))
+		 .defaultEndpoint("https://api.profitbricks.com/1.3")
+		 .version("1.3")
+		 // .view(ComputeServiceContext.class)
+		 .defaultProperties(ProfitBricksApiMetadata.defaultProperties())
+		 .defaultModules(ImmutableSet.<Class<? extends Module>>of(
+				 ProfitBricksHttpApiModule.class,
+				 ProfitBricksHttpCommandExecutorServiceModule.class
+			 ));
+      }
+
+      @Override
+      public ProfitBricksApiMetadata build() {
+	 return new ProfitBricksApiMetadata(this);
+      }
+
+      @Override
+      protected Builder self() {
+	 return this;
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/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
new file mode 100644
index 0000000..d66ed15
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksProviderMetadata.java
@@ -0,0 +1,66 @@
+/*
+ * 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;
+
+import com.google.auto.service.AutoService;
+import java.net.URI;
+import org.jclouds.providers.ProviderMetadata;
+import org.jclouds.providers.internal.BaseProviderMetadata;
+
+@AutoService(ProviderMetadata.class)
+public class ProfitBricksProviderMetadata extends BaseProviderMetadata {
+
+   public ProfitBricksProviderMetadata(Builder builder) {
+      super(builder);
+   }
+
+   public ProfitBricksProviderMetadata() {
+      super(builder());
+   }
+
+   @Override
+   public Builder toBuilder() {
+      return builder().fromProviderMetadata(this);
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder extends BaseProviderMetadata.Builder {
+
+      protected Builder() {
+	 id("profitbricks")
+		 .name("ProfitBricks Cloud Compute 2.0")
+		 .homepage(URI.create("http://www.profitbricks.com"))
+		 .console(URI.create("https://my.profitbricks.com/dashboard/dcdr2/"))
+		 .linkedServices("profitbricks")
+		 .apiMetadata(new ProfitBricksApiMetadata());
+      }
+
+      @Override
+      public ProfitBricksProviderMetadata build() {
+	 return new ProfitBricksProviderMetadata(this);
+      }
+
+      @Override
+      public Builder fromProviderMetadata(ProviderMetadata in) {
+	 super.fromProviderMetadata(in);
+	 return this;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
new file mode 100644
index 0000000..af85c5e
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
@@ -0,0 +1,75 @@
+/*
+ * 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.binder;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Map;
+
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.rest.MapBinder;
+
+import com.google.common.base.Strings;
+
+import org.jclouds.io.MutableContentMetadata;
+import org.jclouds.io.payloads.BaseMutableContentMetadata;
+
+public abstract class BaseProfitBricksRequestBinder<T> implements MapBinder {
+
+   protected final String paramName;
+
+   protected BaseProfitBricksRequestBinder(String paramName) {
+      this.paramName = checkNotNull(paramName, "Initialize 'paramName' in constructor");
+   }
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) {
+      checkNotNull(request, "request");
+
+      Object obj = checkNotNull(postParams.get(paramName), "Param '%s' cannot be null.", paramName);
+      T payload = (T) obj;
+
+      return createRequest(request, createPayload(payload));
+   }
+
+   @Override
+   public <R extends HttpRequest> R bindToRequest(R request, Object input) {
+      throw new UnsupportedOperationException("Not supported yet.");
+   }
+
+   protected abstract String createPayload(T payload);
+
+   protected String formatIfNotEmpty(String pattern, Object param) {
+      return Strings.isNullOrEmpty(param.toString()) ? "" : String.format(pattern, param);
+   }
+
+   protected String nullableToString(Object object) {
+      return object == null ? "" : object.toString();
+   }
+
+   protected <R extends HttpRequest> R createRequest(R fromRequest, String payload) {
+      MutableContentMetadata metadata = new BaseMutableContentMetadata();
+      metadata.setContentType(MediaType.TEXT_XML);
+      metadata.setContentLength(Long.valueOf(payload.getBytes().length));
+
+      fromRequest.setPayload(payload);
+      fromRequest.getPayload().setContentMetadata(metadata);
+      return fromRequest;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
new file mode 100644
index 0000000..8696c0e
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinder.java
@@ -0,0 +1,44 @@
+/*
+ * 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.binder.datacenter;
+
+import static java.lang.String.format;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.DataCenter;
+
+public class CreateDataCenterRequestBinder extends BaseProfitBricksRequestBinder<DataCenter.Request.CreatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   CreateDataCenterRequestBinder() {
+      super("dataCenter");
+      this.requestBuilder = new StringBuilder(128);
+   }
+
+   @Override
+   protected String createPayload(DataCenter.Request.CreatePayload payload) {
+      requestBuilder.append("<ws:createDataCenter>")
+	      .append("<request>")
+	      .append(format("<dataCenterName>%s</dataCenterName>", payload.name()))
+	      .append(format("<location>%s</location>", payload.location().value()))
+	      .append("</request>")
+	      .append("</ws:createDataCenter>");
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinder.java
new file mode 100644
index 0000000..920e9bf
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/datacenter/UpdateDataCenterRequestBinder.java
@@ -0,0 +1,44 @@
+/*
+ * 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.binder.datacenter;
+
+import static java.lang.String.format;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.DataCenter;
+
+public class UpdateDataCenterRequestBinder extends BaseProfitBricksRequestBinder<DataCenter.Request.UpdatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   UpdateDataCenterRequestBinder() {
+      super("dataCenter");
+      this.requestBuilder = new StringBuilder(128);
+   }
+
+   @Override
+   protected String createPayload(DataCenter.Request.UpdatePayload payload) {
+      requestBuilder.append("<ws:updateDataCenter>")
+              .append("<request>")
+              .append(format("<dataCenterId>%s</dataCenterId>", payload.id()))
+              .append(format("<dataCenterName>%s</dataCenterName>", payload.name()))
+              .append("</request>")
+              .append("</ws:updateDataCenter>");
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
new file mode 100644
index 0000000..84f7128
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.compute.internal;
+
+/**
+ * An enumeration of ProfitBricks domain classes containing a property 'ProvisioningState'.
+ *
+ * @see ProvisioningStatusPollingPredicate
+ */
+public enum ProvisioningStatusAware {
+
+   DATACENTER;
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
new file mode 100644
index 0000000..d8a7521
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.compute.internal;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+
+import com.google.common.base.Predicate;
+
+/**
+ * A custom predicate for waiting until a virtual resource satisfies the given expected status
+ * <p>
+ * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some
+ * cases, the API user gets blocked from further requests, and will then need to contact tech support for api lock
+ * release.
+ */
+public class ProvisioningStatusPollingPredicate implements Predicate<String> {
+
+   private final ProfitBricksApi api;
+   private final ProvisioningStatusAware domain;
+   private final ProvisioningState expect;
+
+   public ProvisioningStatusPollingPredicate(ProfitBricksApi api, ProvisioningStatusAware domain, ProvisioningState expect) {
+      this.api = checkNotNull(api, "API null");
+      this.expect = checkNotNull(expect, "Expected state null");
+      this.domain = checkNotNull(domain, "Domain null");
+   }
+
+   @Override
+   public boolean apply(String input) {
+      checkNotNull(input, "Virtual item id can't be null.");
+      switch (domain) {
+         case DATACENTER:
+            return expect == api.dataCenterApi().getDataCenterState(input);
+         default:
+            throw new IllegalArgumentException("Unknown domain '" + domain + "'");
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
new file mode 100644
index 0000000..57728be
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/config/ProfitBricksHttpApiModule.java
@@ -0,0 +1,70 @@
+/*
+ * 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.config;
+
+import org.jclouds.http.HttpCommandExecutorService;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.handlers.ProfitBricksHttpErrorHandler;
+import org.jclouds.http.HttpErrorHandler;
+import org.jclouds.http.annotation.ClientError;
+import org.jclouds.http.annotation.Redirection;
+import org.jclouds.http.annotation.ServerError;
+import org.jclouds.http.config.ConfiguresHttpCommandExecutorService;
+import org.jclouds.http.config.SSLModule;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.profitbricks.domain.ServiceFault;
+import org.jclouds.profitbricks.http.ResponseStatusFromPayloadHttpCommandExecutorService;
+import org.jclouds.profitbricks.http.parser.ServiceFaultResponseHandler;
+import org.jclouds.rest.ConfiguresHttpApi;
+import org.jclouds.rest.config.HttpApiModule;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Injector;
+import com.google.inject.Provides;
+import com.google.inject.Scopes;
+
+/**
+ * Configures the ProfitBricks connection.
+ */
+@ConfiguresHttpApi
+public class ProfitBricksHttpApiModule extends HttpApiModule<ProfitBricksApi> {
+
+   @Override
+   protected void bindErrorHandlers() {
+      bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ProfitBricksHttpErrorHandler.class);
+      bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(ProfitBricksHttpErrorHandler.class);
+      bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ProfitBricksHttpErrorHandler.class);
+   }
+
+   @ConfiguresHttpCommandExecutorService
+   public static class ProfitBricksHttpCommandExecutorServiceModule extends AbstractModule {
+
+      @Override
+      protected void configure() {
+	 install(new SSLModule());
+	 bind(HttpCommandExecutorService.class).to(ResponseStatusFromPayloadHttpCommandExecutorService.class)
+		 .in(Scopes.SINGLETON);
+      }
+
+      @Provides
+      public ParseSax<ServiceFault> serviceFaultParser(ParseSax.Factory factory, Injector injector) {
+	 return factory.create(injector.getInstance(ServiceFaultResponseHandler.class));
+      }
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
new file mode 100644
index 0000000..d5f9893
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/DataCenter.java
@@ -0,0 +1,137 @@
+/*
+ * 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;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Strings.isNullOrEmpty;
+
+import java.util.regex.Pattern;
+
+import org.jclouds.javax.annotation.Nullable;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class DataCenter {
+
+   public abstract String id();
+
+   @Nullable public abstract String name();
+
+   public abstract int version();
+
+   @Nullable public abstract ProvisioningState state();
+
+   @Nullable public abstract Location location();
+
+//   @Nullable public abstract List<Server> servers();
+//   @Nullable public abstract List<Storage> storages();
+//   @Nullable public abstract List<LoadBalancer> loadBalancers();
+   public static DataCenter create(String id, String name, int version, ProvisioningState state, Location location) {
+      return new AutoValue_DataCenter(id, name, version, state, location);
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return builder().fromDataCenter(this);
+   }
+
+   public static final class Builder {
+
+      private String id;
+      private String name;
+      private ProvisioningState state;
+      private Location location;
+      private int version;
+//      private List<Server> servers;
+//      private List<Storage> storage;
+//      private List<LoadBalancer> loadBalancer;
+
+      public Builder id(String id) {
+	 this.id = id;
+	 return this;
+      }
+
+      public Builder name(String name) {
+	 this.name = name;
+	 return this;
+      }
+
+      public Builder state(ProvisioningState state) {
+	 this.state = state;
+	 return this;
+      }
+
+      public Builder location(Location location) {
+	 this.location = location;
+	 return this;
+      }
+
+      public Builder version(int version) {
+	 this.version = version;
+	 return this;
+      }
+
+      public DataCenter build() {
+	 return DataCenter.create(id, name, version, state, location);
+      }
+
+      public Builder fromDataCenter(DataCenter in) {
+	 return this.id(in.id()).name(in.name()).version(in.version()).state(in.state()).location(in.location());
+      }
+   }
+
+   public static final class Request {
+      
+      @AutoValue
+      public abstract static class CreatePayload {
+
+	 public abstract String name();
+
+	 public abstract Location location();
+
+	 public static CreatePayload create(String name, Location location) {
+            checkInvalidChars(name);
+	    return new AutoValue_DataCenter_Request_CreatePayload(name, location);
+	 }
+
+      }
+
+      @AutoValue
+      public abstract static class UpdatePayload {
+
+	 public abstract String id();
+
+	 public abstract String name();
+
+	 public static UpdatePayload create(String id, String name) {
+            checkInvalidChars(name);
+	    return new AutoValue_DataCenter_Request_UpdatePayload(id, name);
+	 }
+      }
+      
+      private static final Pattern INVALID_CHARS = Pattern.compile("^.*[@/\\|'`’^].*$");
+      
+      private static void checkInvalidChars(String name){
+         checkArgument(!isNullOrEmpty(name), "Name is required.");
+         checkArgument(!INVALID_CHARS.matcher(name).matches(), "Name must not contain any of: @ / \\ | ' ` ’ ^");
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
new file mode 100644
index 0000000..969629a
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Location.java
@@ -0,0 +1,50 @@
+/*
+ * 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;
+
+public enum Location {
+
+   DE_FKB("de/fkb"),
+   DE_FRA("de/fra"),
+   US_LAS("us/las"),
+   UNRECOGNIZED("unknown");
+
+   private final String id;
+
+   Location(String id) {
+      this.id = id;
+   }
+
+   public String value() {
+      return id;
+   }
+
+   public static Location fromValue(String v) {
+      try {
+	 return valueOf(v);
+      } catch (IllegalArgumentException ex) {
+	 return UNRECOGNIZED;
+      }
+   }
+
+   public static Location fromId(String id) {
+      for (Location location : values())
+	 if (location.id.equals(id))
+	    return location;
+      return UNRECOGNIZED;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
new file mode 100644
index 0000000..2a9e0b6
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ProvisioningState.java
@@ -0,0 +1,30 @@
+/*
+ * 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;
+
+public enum ProvisioningState {
+
+   INACTIVE, INPROCESS, AVAILABLE, DELETED, ERROR, UNRECOGNIZED;
+
+   public static ProvisioningState fromValue(String value) {
+      try {
+	 return valueOf(value);
+      } catch (IllegalArgumentException e) {
+	 return UNRECOGNIZED;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
new file mode 100644
index 0000000..0e1303e
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/ServiceFault.java
@@ -0,0 +1,95 @@
+/*
+ * 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;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class ServiceFault {
+
+   public enum FaultCode {
+
+      BAD_REQUEST,
+      UNEXPECTED,
+      UNAUTHORIZED,
+      RESOURCE_NOT_FOUND,
+      RESOURCE_DELETED,
+      PROVISIONING_IN_PROCESS,
+      PROVISIONING_NO_CHANGES,
+      OVER_LIMIT_SETTING,
+      SERVER_EXCEED_CAPACITY,
+      SERVICE_UNAVAILABLE,
+      UNRECOGNIZED;
+
+      public static FaultCode fromValue(String v) {
+	 try {
+	    return valueOf(v);
+	 } catch (IllegalArgumentException ex) {
+	    return UNRECOGNIZED;
+	 }
+      }
+   }
+
+   public abstract FaultCode faultCode();
+
+   public abstract int httpCode();
+
+   public abstract String message();
+
+   public abstract int requestId();
+
+   public static ServiceFault create(FaultCode faultCode, int httpCode, String message, int requestId) {
+      return new AutoValue_ServiceFault(faultCode, httpCode, message, requestId);
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static final class Builder {
+
+      private FaultCode faultCode;
+      private int httpCode;
+      private String message;
+      private int requestId;
+
+      public Builder faultCode(FaultCode code) {
+	 this.faultCode = code;
+	 return this;
+      }
+
+      public Builder httpCode(int httpCode) {
+	 this.httpCode = httpCode;
+	 return this;
+      }
+
+      public Builder message(String message) {
+	 this.message = message;
+	 return this;
+      }
+
+      public Builder requestId(int requestId) {
+	 this.requestId = requestId;
+	 return this;
+      }
+
+      public ServiceFault build() {
+	 return create(faultCode, httpCode, message, requestId);
+      }
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
new file mode 100644
index 0000000..f660730
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/DataCenterApi.java
@@ -0,0 +1,134 @@
+/*
+ * 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.features;
+
+import java.util.List;
+import javax.inject.Named;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.binder.datacenter.CreateDataCenterRequestBinder;
+import org.jclouds.profitbricks.binder.datacenter.UpdateDataCenterRequestBinder;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.datacenter.DataCenterInfoResponseHandler;
+import org.jclouds.profitbricks.http.parser.datacenter.DataCenterListResponseHandler;
+import org.jclouds.profitbricks.http.parser.state.GetProvisioningStateResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface DataCenterApi {
+
+   /**
+    * @return Returns a list of all Virtual Data Centers created by the user, including ID, name and version number.
+    */
+   @POST
+   @Named("datacenter:getall")
+   @Payload("<ws:getAllDataCenters/>")
+   @XMLResponseParser(DataCenterListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<DataCenter> getAllDataCenters();
+
+   /**
+    * @param identifier Data Center identifier
+    * @return Returns information about an existing virtual data center's state and configuration or <code>null</code>
+    * if it doesn't exist.
+    */
+   @POST
+   @Named("datacenter:get")
+   @Payload("<ws:getDataCenter><dataCenterId>{id}</dataCenterId></ws:getDataCenter>")
+   @XMLResponseParser(DataCenterInfoResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   DataCenter getDataCenter(@PayloadParam("id") String identifier);
+
+   /**
+    * This is a lightweight function for polling the current provisioning state of the Virtual Data Center. It is
+    * recommended to use this function for large Virtual Data Centers to query request results.
+    * <p>
+    * @param identifier Data Center identifier
+    */
+   @POST
+   @Named("datacenter:getstate")
+   @Payload("<ws:getDataCenterState><dataCenterId>{id}</dataCenterId></ws:getDataCenterState>")
+   @XMLResponseParser(GetProvisioningStateResponseHandler.class)
+   ProvisioningState getDataCenterState(@PayloadParam("id") String identifier);
+
+   /**
+    * Creates and saves a new, empty Virtual Data Center. Returns its identifier for further reference.
+    * <p>
+    * <b>Note: </b>Data center names cannot start with or contain (@, /, \, |, ‘’, ‘)
+    * <p>
+    * @param createRequest VDC payload containing dataCenterName, region
+    * @return Response containing requestId, dataCenterId, version, and location
+    */
+   @POST
+   @Named("datacenter:create")
+   @MapBinder(CreateDataCenterRequestBinder.class)
+   @XMLResponseParser(DataCenterInfoResponseHandler.class)
+   DataCenter createDataCenter(@PayloadParam("dataCenter") DataCenter.Request.CreatePayload createRequest);
+
+   /**
+    * Updates the information associated to an existing Virtual Data Center.
+    * <p>
+    * @param updateRequest VDC payload containing dataCenterId, and name
+    * @return Response containing requestId, dataCenterId, version
+    */
+   @POST
+   @Named("datacenter:update")
+   @MapBinder(UpdateDataCenterRequestBinder.class)
+   @XMLResponseParser(DataCenterInfoResponseHandler.class)
+   DataCenter updateDataCenter(@PayloadParam("dataCenter") DataCenter.Request.UpdatePayload updateRequest);
+
+   /**
+    * Removes all components from an existing Virtual Data Center.
+    * <p>
+    * @param identifier Identifier of the virtual data center
+    * @return Response containing requestId, dataCenterId, version
+    */
+   @POST
+   @Named("datacenter:clear")
+   @Payload("<ws:clearDataCenter><dataCenterId>{id}</dataCenterId></ws:clearDataCenter>")
+   @XMLResponseParser(DataCenterInfoResponseHandler.class)
+   DataCenter clearDataCenter(@PayloadParam("id") String identifier);
+
+   /**
+    * Deletes an Virtual Data Center. If a previous request on the target data center is still in progress, the data
+    * center is going to be deleted after this request has been completed. Once a Data Center has been deleted, no
+    * further request can be performed on it.
+    * <p>
+    * @param identifier Identifier of the virtual data center
+    * @return Returns a boolean indicating whether delete operation was made
+    */
+   @POST
+   @Named("datacenter:delete")
+   @Payload("<ws:deleteDataCenter><dataCenterId>{id}</dataCenterId></ws:deleteDataCenter>")
+   @Fallback(Fallbacks.FalseOnNotFoundOr404.class)
+   boolean deleteDataCenter(@PayloadParam("id") String identifier);
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/handlers/ProfitBricksHttpErrorHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/handlers/ProfitBricksHttpErrorHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/handlers/ProfitBricksHttpErrorHandler.java
new file mode 100644
index 0000000..6453327
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/handlers/ProfitBricksHttpErrorHandler.java
@@ -0,0 +1,70 @@
+/*
+ * 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.handlers;
+
+import static org.jclouds.util.Closeables2.closeQuietly;
+
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpCommand;
+import org.jclouds.http.HttpErrorHandler;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.rest.AuthorizationException;
+import org.jclouds.rest.InsufficientResourcesException;
+import org.jclouds.rest.ResourceNotFoundException;
+
+/**
+ * Parse ProfitBricks API errors and set the appropriate exception.
+ *
+ * @see org.jclouds.profitbricks.http.ResponseStatusFromPayloadHttpCommandExecutorService
+ *
+ */
+@Singleton
+public class ProfitBricksHttpErrorHandler implements HttpErrorHandler {
+
+   @Override
+   public void handleError(final HttpCommand command, final HttpResponse response) {
+      Exception exception = null;
+      try {
+	 switch (response.getStatusCode()) {
+	    case 400:
+	    case 405:
+	       exception = new IllegalArgumentException(response.getMessage(), exception);
+	       break;
+	    case 401:
+	       exception = new AuthorizationException(response.getMessage(), exception);
+	       break;
+	    case 402:
+	    case 409:
+	       exception = new IllegalStateException(response.getMessage(), exception);
+	       break;
+	    case 404:
+	    case 410:
+	       if (!command.getCurrentRequest().getMethod().equals("DELETE"))
+		  exception = new ResourceNotFoundException(response.getMessage(), exception);
+	       break;
+	    case 413:
+	    case 503:
+	       exception = new InsufficientResourcesException(response.getMessage(), exception);
+	       break;
+	 }
+      } finally {
+	 closeQuietly(response.getPayload());
+	 command.setException(exception);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
new file mode 100644
index 0000000..78b0c8b
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/ResponseStatusFromPayloadHttpCommandExecutorService.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http;
+
+import static org.jclouds.util.Closeables2.closeQuietly;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.Proxy;
+import java.net.URI;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.HttpUtils;
+import org.jclouds.http.IOExceptionRetryHandler;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.http.handlers.DelegatingErrorHandler;
+import org.jclouds.http.handlers.DelegatingRetryHandler;
+import org.jclouds.http.internal.HttpWire;
+import org.jclouds.http.internal.JavaUrlHttpCommandExecutorService;
+import org.jclouds.io.ContentMetadataCodec;
+import org.jclouds.io.Payload;
+import org.jclouds.io.Payloads;
+import org.jclouds.profitbricks.domain.ServiceFault;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.io.ByteStreams;
+import com.google.inject.Inject;
+
+/**
+ * Custom implementation of the HTTP driver to read actual http status and message from SOAP Fault.
+ * <br/>
+ * ProfitBricks API errors are always returned with 500 HTTP code. This class parses and reads the SOAP response to map the actual http code
+ * and message
+ */
+@Singleton
+public class ResponseStatusFromPayloadHttpCommandExecutorService extends JavaUrlHttpCommandExecutorService {
+
+   private final ParseSax<ServiceFault> faultHandler;
+
+   @Inject
+   ResponseStatusFromPayloadHttpCommandExecutorService(HttpUtils utils, ContentMetadataCodec contentMetadataCodec,
+           DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler,
+           DelegatingErrorHandler errorHandler, HttpWire wire, @Named("untrusted") HostnameVerifier verifier,
+           @Named("untrusted") Supplier<SSLContext> untrustedSSLContextProvider, Function<URI, Proxy> proxyForURI,
+           ParseSax<ServiceFault> faultHandler) {
+      super(utils, contentMetadataCodec, retryHandler, ioRetryHandler, errorHandler, wire, verifier, untrustedSSLContextProvider, proxyForURI);
+      this.faultHandler = faultHandler;
+   }
+
+   @Override
+   protected HttpResponse invoke(HttpURLConnection connection) throws IOException, InterruptedException {
+      HttpResponse originalResponse = super.invoke(connection);
+      HttpResponse.Builder<?> responseBuilder = originalResponse.toBuilder();
+
+      if (hasPayload(originalResponse) && hasServerError(originalResponse)) {
+         // As we need to read the response body to determine if there are errors, but we may need to process the body
+         // again later in the response parsers if everything is OK, we buffer the body into an InputStream we can reset
+         InputStream in = null;
+         InputStream originalInputStream = originalResponse.getPayload().openStream();
+         if (originalInputStream instanceof ByteArrayInputStream)
+            in = originalInputStream;
+         else
+            try {
+               in = new ByteArrayInputStream(ByteStreams.toByteArray(originalInputStream));
+            } finally {
+               closeQuietly(originalInputStream);
+            }
+
+         try {
+            ServiceFault fault = faultHandler.parse(in);
+            if (fault != null)
+               responseBuilder
+                       .statusCode(fault.httpCode())
+                       .message(fault.message());
+         } catch (Exception ex) {
+            // ignore
+         } finally {
+            // Reset the input stream and set the payload, so it can be read again
+            // by the response and error parsers
+            if (in != null) {
+               in.reset();
+               Payload payload = Payloads.newInputStreamPayload(in);
+               contentMetadataCodec.fromHeaders(payload.getContentMetadata(), originalResponse.getHeaders());
+               responseBuilder.payload(payload);
+            }
+         }
+      }
+
+      return responseBuilder.build();
+   }
+
+   private static boolean hasServerError(final HttpResponse response) {
+      return response.getStatusCode() >= 500;
+   }
+
+   private static boolean hasPayload(final HttpResponse response) {
+      return response.getPayload() != null && response.getPayload().getRawContent() != null;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/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
new file mode 100644
index 0000000..fce8e21
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/filters/ProfitBricksSoapMessageEnvelope.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.filters;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.http.HttpException;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpRequestFilter;
+import org.jclouds.http.HttpUtils;
+import org.jclouds.io.ContentMetadata;
+import org.jclouds.io.Payload;
+import org.jclouds.io.Payloads;
+
+/**
+ * Filters {@link HttpRequest} request and wraps request body into SOAP envelope.
+ */
+public class ProfitBricksSoapMessageEnvelope implements HttpRequestFilter {
+
+   private final String SOAP_PREFIX
+	   = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.api.profitbricks.com/\">"
+	   + "<soapenv:Header/>"
+	   + "<soapenv:Body>";
+
+   private final String SOAP_SUFFIX = "</soapenv:Body></soapenv:Envelope>";
+
+   @Override
+   public HttpRequest filter(HttpRequest request) throws HttpException {
+      checkNotNull(request.getPayload(), "HTTP Request must contain payload message.");
+      return createSoapRequest(request);
+   }
+
+   private HttpRequest createSoapRequest(HttpRequest request) {
+      Payload oldPayload = request.getPayload();
+      ContentMetadata oldMetadata = oldPayload.getContentMetadata();
+
+      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
+
+      return request.toBuilder().payload(newPayload).build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
new file mode 100644
index 0000000..9e66159
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Date;
+
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.http.functions.ParseSax;
+import org.xml.sax.SAXException;
+
+public abstract class BaseProfitBricksResponseHandler<T> extends ParseSax.HandlerForGeneratedRequestWithResult<T> {
+
+   protected final DateCodec dateCodec;
+
+   private final StringBuilder strBuilder;
+
+   public BaseProfitBricksResponseHandler(DateCodecFactory dateCodec) {
+      this.dateCodec = checkNotNull(checkNotNull(dateCodec, "dateCodecFactory null").iso8601(), "iso8601 date codec null");
+      this.strBuilder = new StringBuilder();
+   }
+
+   @Override
+   public void characters(char ch[], int start, int length) {
+      strBuilder.append(ch, start, length);
+   }
+
+   protected final Date textToIso8601Date() {
+      return dateCodec.toDate(textToStringValue());
+   }
+
+   protected String textToStringValue() {
+      return strBuilder.toString().trim();
+   }
+
+   protected int textToIntValue() {
+      return Integer.parseInt(textToStringValue());
+   }
+
+   protected boolean textToBooleanValue() {
+      return Boolean.parseBoolean(textToStringValue());
+   }
+
+   protected void clearTextBuffer() {
+      strBuilder.setLength(0);
+   }
+
+   @Override
+   public abstract void endElement(String uri, String localName, String qName) throws SAXException;
+
+   protected abstract void setPropertyOnEndTag(String qName);
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandler.java
new file mode 100644
index 0000000..c6a504b
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/ServiceFaultResponseHandler.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser;
+
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.ServiceFault;
+import org.xml.sax.SAXException;
+
+import com.google.inject.Inject;
+
+public class ServiceFaultResponseHandler extends BaseProfitBricksResponseHandler<ServiceFault> {
+
+   private final ServiceFault.Builder builder;
+   private boolean done = false;
+
+   @Inject
+   ServiceFaultResponseHandler(DateCodecFactory dateCodec) {
+      super(dateCodec);
+      this.builder = ServiceFault.builder();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("faultCode".equals(qName))
+	 builder.faultCode(ServiceFault.FaultCode.fromValue(textToStringValue()));
+      else if ("httpCode".equals(qName))
+	 builder.httpCode(textToIntValue());
+      else if ("message".equals(qName))
+	 builder.message(textToStringValue());
+      else if ("requestId".equals(qName))
+	 builder.requestId(textToIntValue());
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
+	 return;
+      setPropertyOnEndTag(qName);
+      if ("detail".equals(qName))
+	 done = true;
+      clearTextBuffer();
+   }
+
+   @Override
+   public ServiceFault getResult() {
+      return builder.build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/BaseDataCenterResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/BaseDataCenterResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/BaseDataCenterResponseHandler.java
new file mode 100644
index 0000000..409131f
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/BaseDataCenterResponseHandler.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.datacenter;
+
+import javax.inject.Inject;
+
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+
+public abstract class BaseDataCenterResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected DataCenter.Builder builder;
+
+   @Inject
+   BaseDataCenterResponseHandler(DateCodecFactory dateCodecFactory) {
+      super(dateCodecFactory);
+      this.builder = DataCenter.builder();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("dataCenterId".equals(qName))
+	 builder.id(textToStringValue());
+      else if ("dataCenterVersion".equals(qName))
+	 builder.version(textToIntValue());
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
new file mode 100644
index 0000000..5b3aadd
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandler.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.datacenter;
+
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.xml.sax.SAXException;
+
+import com.google.inject.Inject;
+
+public class DataCenterInfoResponseHandler extends BaseDataCenterResponseHandler<DataCenter> {
+
+   private boolean done = false;
+
+   @Inject
+   DataCenterInfoResponseHandler(DateCodecFactory dateCodecFactory) {
+      super(dateCodecFactory);
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      super.setPropertyOnEndTag(qName);
+      if ("dataCenterName".equals(qName))
+	 builder.name(textToStringValue());
+      else if ("location".equals(qName))
+	 builder.location(Location.fromId(textToStringValue()));
+      else if ("provisioningState".equals(qName))
+	 builder.state(ProvisioningState.fromValue(textToStringValue()));
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
+	 return;
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName))
+	 done = true;
+      clearTextBuffer();
+   }
+
+   @Override
+   public DataCenter getResult() {
+      return builder.build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandler.java
new file mode 100644
index 0000000..8b8ad1a
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterListResponseHandler.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.datacenter;
+
+import java.util.List;
+
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.xml.sax.SAXException;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+
+public class DataCenterListResponseHandler extends BaseDataCenterResponseHandler<List<DataCenter>> {
+
+   private final List<DataCenter> dataCenters;
+
+   @Inject
+   DataCenterListResponseHandler(DateCodecFactory dateCodec) {
+      super(dateCodec);
+      this.dataCenters = Lists.newArrayList();
+   }
+
+   @Override
+   public List<DataCenter> getResult() {
+      return dataCenters;
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      super.setPropertyOnEndTag(qName);
+      if ("dataCenterName".equals(qName))
+	 builder.name(textToStringValue());
+      else if ("location".equals(qName))
+	 builder.location(Location.fromValue(textToStringValue()));
+      else if ("provisioningState".equals(qName))
+	 builder.state(ProvisioningState.fromValue(textToStringValue()));
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName)) {
+	 dataCenters.add(builder.build());
+	 builder = DataCenter.builder();
+      }
+      clearTextBuffer();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandler.java
new file mode 100644
index 0000000..705a918
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/state/GetProvisioningStateResponseHandler.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.state;
+
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.xml.sax.SAXException;
+
+import com.google.inject.Inject;
+
+public class GetProvisioningStateResponseHandler extends BaseProfitBricksResponseHandler<ProvisioningState> {
+
+   private ProvisioningState state = ProvisioningState.UNRECOGNIZED;
+
+   @Inject
+   GetProvisioningStateResponseHandler(DateCodecFactory dateCodec) {
+      super(dateCodec);
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      clearTextBuffer();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("return".equals(qName))
+	 state = ProvisioningState.fromValue(textToStringValue());
+   }
+
+   @Override
+   public ProvisioningState getResult() {
+      return state;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
new file mode 100644
index 0000000..3ebc9c0
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/BaseProfitBricksLiveTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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;
+
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.apis.BaseApiLiveTest;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusAware;
+import org.jclouds.profitbricks.compute.internal.ProvisioningStatusPollingPredicate;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.util.Predicates2;
+
+import com.google.common.base.Predicate;
+
+public abstract class BaseProfitBricksLiveTest extends BaseApiLiveTest<ProfitBricksApi> {
+
+   protected Predicate<String> dcWaitingPredicate;
+
+   public BaseProfitBricksLiveTest() {
+      provider = "profitbricks";
+   }
+
+   @Override
+   protected void initialize() {
+      super.initialize();
+      this.dcWaitingPredicate = Predicates2.retry(
+	      new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE),
+	      2l * 60l, 2l, TimeUnit.SECONDS);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/ProfitBricksProviderMetadataTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/ProfitBricksProviderMetadataTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/ProfitBricksProviderMetadataTest.java
new file mode 100644
index 0000000..210eeb9
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/ProfitBricksProviderMetadataTest.java
@@ -0,0 +1,29 @@
+/*
+ * 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;
+
+import org.jclouds.providers.internal.BaseProviderMetadataTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "ProfitBricksProviderMetadataTest")
+public class ProfitBricksProviderMetadataTest extends BaseProviderMetadataTest {
+
+   public ProfitBricksProviderMetadataTest() {
+      super(new ProfitBricksProviderMetadata(), new ProfitBricksApiMetadata());
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/cb45048a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
new file mode 100644
index 0000000..b3a891b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/datacenter/CreateDataCenterRequestBinderTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.binder.datacenter;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Location;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "CreateDataCenterRequestBinderTest")
+public class CreateDataCenterRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      CreateDataCenterRequestBinder binder = new CreateDataCenterRequestBinder();
+
+      DataCenter.Request.CreatePayload payload = DataCenter.Request.CreatePayload.create("JClouds-DC", Location.DE_FKB);
+
+      String actual = binder.createPayload(payload);
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload
+	   = ("      <ws:createDataCenter>\n"
+	   + "         <request>\n"
+	   + "            <dataCenterName>JClouds-DC</dataCenterName>\n"
+	   + "            <location>de/fkb</location>\n"
+	   + "         </request>\n"
+	   + "      </ws:createDataCenter>\n").replaceAll("\\s+", "");
+}


[35/35] jclouds git commit: Update pom details for ProfitBricks

Posted by de...@apache.org.
Update pom details for ProfitBricks


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

Branch: refs/heads/master
Commit: d05cecc39cff3a56025a48d2e94bf0d4ae4a84bb
Parents: 1af5215
Author: Reijhanniel Jearl Campos <de...@apache.org>
Authored: Fri Feb 19 22:12:34 2016 +0800
Committer: Reijhanniel Jearl Campos <de...@apache.org>
Committed: Fri Feb 19 23:02:29 2016 +0800

----------------------------------------------------------------------
 .gitignore                     |  2 ++
 allcompute/pom.xml             |  5 +++++
 project/pom.xml                |  3 +++
 providers/pom.xml              |  1 +
 providers/profitbricks/pom.xml | 21 +++++++++++----------
 5 files changed, 22 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/d05cecc3/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index f8836f5..eb8b9db 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,5 @@ atlassian-ide-plugin.xml
 .factorypath
 .apt_generated
 .checkstyle
+*nb-configuration.xml
+*nbactions.xml
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/d05cecc3/allcompute/pom.xml
----------------------------------------------------------------------
diff --git a/allcompute/pom.xml b/allcompute/pom.xml
index cf6b4e0..340206d 100644
--- a/allcompute/pom.xml
+++ b/allcompute/pom.xml
@@ -128,5 +128,10 @@
       <artifactId>digitalocean2</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.apache.jclouds.provider</groupId>
+      <artifactId>profitbricks</artifactId>
+      <version>${project.version}</version>
+    </dependency>
   </dependencies>
 </project>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/d05cecc3/project/pom.xml
----------------------------------------------------------------------
diff --git a/project/pom.xml b/project/pom.xml
index 95c2a42..62877d3 100644
--- a/project/pom.xml
+++ b/project/pom.xml
@@ -463,6 +463,7 @@
             <exclude>**/src/test/resources/**/*.gz</exclude>
             <exclude>**/src/test/resources/**/*.xml</exclude>
             <exclude>**/src/test/resources/**/*.crt</exclude>
+            <exclude>**/profitbricks/src/test/resources/*.html</exclude>
 
             <!-- META-INF/services files -->
             <exclude>**/services/*LoggingModule</exclude>
@@ -519,6 +520,8 @@
             <exclude>**/.factorypath</exclude>
             <exclude>**/.apt_generated/**</exclude>
             <exclude>**/.checkstyle</exclude>
+            <exclude>nb-configuration.xml</exclude>
+            <exclude>nbactions.xml</exclude>
 
             <!-- Temporary files generated on CloudBees slaves -->
             <exclude>.repository/**</exclude>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/d05cecc3/providers/pom.xml
----------------------------------------------------------------------
diff --git a/providers/pom.xml b/providers/pom.xml
index 353c2f4..bb09d9b 100644
--- a/providers/pom.xml
+++ b/providers/pom.xml
@@ -71,5 +71,6 @@
     <module>aws-route53</module>
     <module>ultradns-ws</module>
     <module>dynect</module>
+    <module>profitbricks</module>
   </modules>
 </project>

http://git-wip-us.apache.org/repos/asf/jclouds/blob/d05cecc3/providers/profitbricks/pom.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/pom.xml b/providers/profitbricks/pom.xml
index 9311e48..c03b56d 100644
--- a/providers/profitbricks/pom.xml
+++ b/providers/profitbricks/pom.xml
@@ -20,12 +20,13 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
-        <groupId>org.apache.jclouds.labs</groupId>
-        <artifactId>jclouds-labs</artifactId>
+        <groupId>org.apache.jclouds</groupId>
+        <artifactId>jclouds-project</artifactId>
         <version>2.0.0-SNAPSHOT</version>
+        <relativePath>../../project/pom.xml</relativePath>
     </parent>
   
-    <!-- TODO: when out of labs, switch to org.jclouds.api -->
+    <groupId>org.apache.jclouds.provider</groupId>
     <artifactId>profitbricks</artifactId>
     <name>jclouds ProfitBricks api</name>
     <description>jclouds components to access an implementation of ProfitBricks</description>
@@ -39,7 +40,7 @@
         <jclouds.osgi.export>org.jclouds.profitbricks*;version="${project.version}"</jclouds.osgi.export>
         <jclouds.osgi.import>
             org.jclouds.labs*;version="${project.version}",
-            org.jclouds*;version="${jclouds.version}",
+            org.jclouds*;version="${project.version}",
             *
         </jclouds.osgi.import>
     </properties>
@@ -48,12 +49,12 @@
         <dependency>
             <groupId>org.apache.jclouds</groupId>
             <artifactId>jclouds-core</artifactId>
-            <version>${jclouds.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.jclouds</groupId>
             <artifactId>jclouds-compute</artifactId>
-            <version>${jclouds.version}</version>
+            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>com.google.auto.service</groupId>
@@ -69,21 +70,21 @@
         <dependency>
             <groupId>org.apache.jclouds</groupId>
             <artifactId>jclouds-core</artifactId>
-            <version>${jclouds.version}</version>
+            <version>${project.version}</version>
             <type>test-jar</type>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.jclouds</groupId>
             <artifactId>jclouds-compute</artifactId>
-            <version>${jclouds.version}</version>
+            <version>${project.version}</version>
             <type>test-jar</type>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.jclouds.driver</groupId>
             <artifactId>jclouds-sshj</artifactId>
-            <version>${jclouds.version}</version>
+            <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -101,7 +102,7 @@
         <dependency>
             <groupId>org.apache.jclouds.driver</groupId>
             <artifactId>jclouds-slf4j</artifactId>
-            <version>${jclouds.version}</version>
+            <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>


[06/35] jclouds git commit: JCLOUDS-702: JCloud ProfitBricks provider - Server & Image API

Posted by de...@apache.org.
JCLOUDS-702: JCloud ProfitBricks provider - Server & Image API


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

Branch: refs/heads/master
Commit: ee24ddb2b4d9001f8fdf47a483985c0c2c912bb4
Parents: 8206d19
Author: Reijhanniel <de...@gmail.com>
Authored: Fri Jan 23 10:05:41 2015 +0800
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Jan 26 11:27:18 2015 +0100

----------------------------------------------------------------------
 providers/profitbricks/pom.xml                  |   8 +-
 .../jclouds/profitbricks/ProfitBricksApi.java   |   8 +
 .../binder/BaseProfitBricksRequestBinder.java   |   2 +-
 .../server/CreateServerRequestBinder.java       |  57 +++
 .../server/UpdateServerRequestBinder.java       |  56 +++
 .../internal/ProvisioningStatusAware.java       |   2 +-
 .../ProvisioningStatusPollingPredicate.java     |   2 +
 .../profitbricks/domain/AvailabilityZone.java   |  35 ++
 .../org/jclouds/profitbricks/domain/Image.java  | 207 +++++++++
 .../org/jclouds/profitbricks/domain/OsType.java |  30 ++
 .../org/jclouds/profitbricks/domain/Server.java | 424 +++++++++++++++++++
 .../domain/internal/ServerCommonProperties.java |  49 +++
 .../jclouds/profitbricks/features/ImageApi.java |  65 +++
 .../profitbricks/features/ServerApi.java        | 164 +++++++
 .../parser/BaseProfitBricksResponseHandler.java |   8 +
 .../parser/RequestIdOnlyResponseHandler.java    |  49 +++
 .../parser/image/BaseImageResponseHandler.java  |  76 ++++
 .../parser/image/ImageInfoResponseHandler.java  |  48 +++
 .../parser/image/ImageListResponseHandler.java  |  51 +++
 .../server/BaseServerResponseHandler.java       |  75 ++++
 .../server/ServerIdOnlyResponseHandler.java     |  55 +++
 .../server/ServerInfoResponseHandler.java       |  48 +++
 .../server/ServerListResponseHandler.java       |  51 +++
 .../server/CreateServerRequestBinderTest.java   |  65 +++
 .../server/UpdateServerRequestBinderTest.java   |  64 +++
 .../profitbricks/domain/ServerBuilderTest.java  | 164 +++++++
 .../features/DataCenterApiMockTest.java         |  41 +-
 .../profitbricks/features/ImageApiLiveTest.java |  58 +++
 .../profitbricks/features/ImageApiMockTest.java | 116 +++++
 .../features/ServerApiLiveTest.java             | 139 ++++++
 .../features/ServerApiMockTest.java             | 338 +++++++++++++++
 .../RequestIdOnlyResponseHandlerTest.java       |  76 ++++
 .../parser/ServiceFaultResponseHandlerTest.java |   4 +-
 .../DataCenterInfoResponseHandlerTest.java      |   3 +-
 .../image/ImageInfoResponseHandlerTest.java     |  65 +++
 .../image/ImageListResponseHandlerTest.java     | 183 ++++++++
 .../server/ServerIdOnlyResponseHandlerTest.java |  40 ++
 .../server/ServerInfoResponseHandlerTest.java   |  76 ++++
 .../server/ServerListResponseHandlerTest.java   |  97 +++++
 .../internal/BaseProfitBricksMockTest.java      |  18 +-
 .../datacenter/datacenter-not-found.xml         |  17 +
 .../src/test/resources/fault-404.xml            |  30 +-
 .../test/resources/image/image-not-found.xml    |  17 +
 .../src/test/resources/image/image.xml          |  26 ++
 .../src/test/resources/image/images.xml         | 140 ++++++
 .../src/test/resources/server/server-create.xml |  13 +
 .../src/test/resources/server/server-delete.xml |  13 +
 .../src/test/resources/server/server-reset.xml  |  11 +
 .../src/test/resources/server/server-start.xml  |  11 +
 .../src/test/resources/server/server-stop.xml   |  11 +
 .../src/test/resources/server/server-update.xml |  13 +
 .../src/test/resources/server/server.xml        |  57 +++
 .../src/test/resources/server/servers.xml       | 104 +++++
 53 files changed, 3542 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/pom.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/pom.xml b/providers/profitbricks/pom.xml
index b48e589..84f49b4 100644
--- a/providers/profitbricks/pom.xml
+++ b/providers/profitbricks/pom.xml
@@ -57,13 +57,13 @@
             <version>${jclouds.version}</version>
         </dependency>
         <dependency>
-            <groupId>com.google.auto.value</groupId>
-            <artifactId>auto-value</artifactId>
+            <groupId>com.google.auto.service</groupId>
+            <artifactId>auto-service</artifactId>
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>com.google.auto.service</groupId>
-            <artifactId>auto-service</artifactId>
+            <groupId>com.google.auto.value</groupId>
+            <artifactId>auto-value</artifactId>
             <scope>provided</scope>
         </dependency>
         <!-- Test dependencies -->

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
index d1cb1e1..7ab121a 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -19,10 +19,18 @@ package org.jclouds.profitbricks;
 import java.io.Closeable;
 
 import org.jclouds.profitbricks.features.DataCenterApi;
+import org.jclouds.profitbricks.features.ImageApi;
+import org.jclouds.profitbricks.features.ServerApi;
 import org.jclouds.rest.annotations.Delegate;
 
 public interface ProfitBricksApi extends Closeable {
 
    @Delegate
    DataCenterApi dataCenterApi();
+
+   @Delegate
+   ImageApi imageApi();
+
+   @Delegate
+   ServerApi serverApi();
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
index af85c5e..8c2d36b 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/BaseProfitBricksRequestBinder.java
@@ -56,7 +56,7 @@ public abstract class BaseProfitBricksRequestBinder<T> implements MapBinder {
    protected abstract String createPayload(T payload);
 
    protected String formatIfNotEmpty(String pattern, Object param) {
-      return Strings.isNullOrEmpty(param.toString()) ? "" : String.format(pattern, param);
+      return Strings.isNullOrEmpty(nullableToString( param )) ? "" : String.format(pattern, param);
    }
 
    protected String nullableToString(Object object) {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
new file mode 100644
index 0000000..4acf33b
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinder.java
@@ -0,0 +1,57 @@
+/*
+ * 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.binder.server;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Server;
+
+public class CreateServerRequestBinder extends BaseProfitBricksRequestBinder<Server.Request.CreatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   CreateServerRequestBinder() {
+      super( "server" );
+      this.requestBuilder = new StringBuilder( 128 * 4 );
+   }
+
+   @Override
+   protected String createPayload( Server.Request.CreatePayload payload ) {
+      requestBuilder.append( "<ws:createServer>" )
+              .append( "<request>" )
+              .append( format( "<dataCenterId>%s</dataCenterId>", payload.dataCenterId() ) )
+              .append( format( "<cores>%s</cores>", payload.cores() ) )
+              .append( format( "<ram>%s</ram>", payload.ram() ) )
+              .append( formatIfNotEmpty( "<serverName>%s</serverName>", payload.name() ) )
+              .append( formatIfNotEmpty( "<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId() ) )
+              .append( formatIfNotEmpty( "<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId() ) )
+              .append( formatIfNotEmpty( "<internetAccess>%s</internetAccess>", payload.hasInternetAccess() ) )
+              .append( formatIfNotEmpty( "<lanId>%s</lanId>", payload.lanId() ) )
+              .append( formatIfNotEmpty( "<osType>%s</osType>", payload.osType() ) )
+              .append( formatIfNotEmpty( "<availabilityZone>%s</availabilityZone>", payload.availabilityZone() ) )
+              .append( formatIfNotEmpty( "<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug() ) )
+              .append( formatIfNotEmpty( "<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug() ) )
+              .append( formatIfNotEmpty( "<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug() ) )
+              .append( formatIfNotEmpty( "<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug() ) )
+              .append( formatIfNotEmpty( "<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug() ) )
+              .append( formatIfNotEmpty( "<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug() ) )
+              .append( "</request>" )
+              .append( "</ws:createServer>" );
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
new file mode 100644
index 0000000..d051b88
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinder.java
@@ -0,0 +1,56 @@
+/*
+ * 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.binder.server;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.Server;
+
+public class UpdateServerRequestBinder extends BaseProfitBricksRequestBinder<Server.Request.UpdatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   UpdateServerRequestBinder() {
+      super( "server" );
+      this.requestBuilder = new StringBuilder( 128 * 4 );
+
+   }
+
+   @Override
+   protected String createPayload( Server.Request.UpdatePayload payload ) {
+      requestBuilder.append( "<ws:updateServer>" )
+              .append( "<request>" )
+              .append( format( "<serverId>%s</serverId>", payload.id() ) )
+              .append( format( "<cores>%s</cores>", payload.cores() ) )
+              .append( format( "<ram>%s</ram>", payload.ram() ) )
+              .append( formatIfNotEmpty( "<serverName>%s</serverName>", payload.name() ) )
+              .append( formatIfNotEmpty( "<bootFromStorageId>%s</bootFromStorageId>", payload.bootFromStorageId() ) )
+              .append( formatIfNotEmpty( "<bootFromImageId>%s</bootFromImageId>", payload.bootFromImageId() ) )
+              .append( formatIfNotEmpty( "<osType>%s</osType>", payload.osType() ) )
+              .append( formatIfNotEmpty( "<availabilityZone>%s</availabilityZone>", payload.availabilityZone() ) )
+              .append( formatIfNotEmpty( "<cpuHotPlug>%s</cpuHotPlug>", payload.isCpuHotPlug() ) )
+              .append( formatIfNotEmpty( "<ramHotPlug>%s</ramHotPlug>", payload.isRamHotPlug() ) )
+              .append( formatIfNotEmpty( "<nicHotPlug>%s</nicHotPlug>", payload.isNicHotPlug() ) )
+              .append( formatIfNotEmpty( "<nicHotUnPlug>%s</nicHotUnPlug>", payload.isNicHotUnPlug() ) )
+              .append( formatIfNotEmpty( "<discVirtioHotPlug>%s</discVirtioHotPlug>", payload.isDiscVirtioHotPlug() ) )
+              .append( formatIfNotEmpty( "<discVirtioHotUnPlug>%s</discVirtioHotUnPlug>", payload.isDiscVirtioHotUnPlug() ) )
+              .append( "</request>" )
+              .append( "</ws:updateServer>" );
+      return requestBuilder.toString();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
index 84f7128..5056243 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
@@ -23,5 +23,5 @@ package org.jclouds.profitbricks.compute.internal;
  */
 public enum ProvisioningStatusAware {
 
-   DATACENTER;
+   DATACENTER, SERVER;
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
index d8a7521..73db33f 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
@@ -48,6 +48,8 @@ public class ProvisioningStatusPollingPredicate implements Predicate<String> {
       switch (domain) {
          case DATACENTER:
             return expect == api.dataCenterApi().getDataCenterState(input);
+         case SERVER:
+            return expect == api.serverApi().getServer( input ).state();
          default:
             throw new IllegalArgumentException("Unknown domain '" + domain + "'");
       }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
new file mode 100644
index 0000000..b582d69
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/AvailabilityZone.java
@@ -0,0 +1,35 @@
+/*
+ * 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;
+
+public enum AvailabilityZone {
+
+   AUTO, ZONE_1, ZONE_2, UNRECOGNIZED;
+
+   public String value() {
+      return name();
+   }
+
+   public static AvailabilityZone fromValue( String v ) {
+      try {
+         return valueOf( v );
+      } catch ( Exception ex ) {
+         return UNRECOGNIZED;
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
new file mode 100644
index 0000000..d272e27
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Image.java
@@ -0,0 +1,207 @@
+/*
+ * 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;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class Image {
+
+   public enum Type {
+
+      HDD, CDROM, UNRECOGNIZED;
+
+      public static Type fromValue(String v) {
+         try {
+            return valueOf(v);
+         } catch (IllegalArgumentException ex) {
+            return UNRECOGNIZED;
+         }
+      }
+   }
+
+   public abstract String id();
+
+   public abstract String name();
+
+   public abstract float size(); // MB
+
+   public abstract Type type();
+
+   public abstract Location location();
+
+   public abstract OsType osType();
+
+   public abstract boolean isPublic();
+
+   public abstract boolean isWriteable();
+
+   public abstract boolean isBootable();
+
+   public abstract boolean isCpuHotPlug();
+
+   public abstract boolean isCpuHotUnPlug();
+
+   public abstract boolean isRamHotPlug();
+
+   public abstract boolean isRamHotUnPlug();
+
+   public abstract boolean isNicHotPlug();
+
+   public abstract boolean isNicHotUnPlug();
+
+   public abstract boolean isDiscVirtioHotPlug();
+
+   public abstract boolean isDiscVirtioHotUnPlug();
+
+   public static Image create(String id, String name, float size, Type type, Location location, OsType osType,
+           boolean isPublic, boolean isWriteable, boolean isBootable, boolean cpuHotPlug, boolean cpuHotUnPlug,
+           boolean ramHotPlug, boolean ramHotUnPlug, boolean nicHotPlug, boolean nicHotUnPlug,
+           boolean discVirtioHotPlug, boolean discVirtioHotUnPlug) {
+      return new AutoValue_Image(id, name, size, type, location, osType, isPublic, isWriteable,
+              isBootable, cpuHotPlug, cpuHotUnPlug, ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public Builder toBuilder() {
+      return builder().fromImage(this);
+   }
+
+   public static class Builder {
+
+      private String id;
+      private String name;
+      private float size;
+      private Type type;
+      private Location location;
+      private OsType osType;
+      private boolean isPublic;
+      private boolean isWriteable;
+      private boolean isBootable;
+      private boolean cpuHotPlug;
+      private boolean cpuHotUnPlug;
+      private boolean ramHotPlug;
+      private boolean ramHotUnPlug;
+      private boolean nicHotPlug;
+      private boolean nicHotUnPlug;
+      private boolean discVirtioHotPlug;
+      private boolean discVirtioHotUnPlug;
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder size(float size) {
+         this.size = size;
+         return this;
+      }
+
+      public Builder type(Type type) {
+         this.type = type;
+         return this;
+      }
+
+      public Builder osType(OsType osType) {
+         this.osType = osType;
+         return this;
+      }
+
+      public Builder location(Location location) {
+         this.location = location;
+         return this;
+      }
+
+      public Builder isPublic(boolean isPublic) {
+         this.isPublic = isPublic;
+         return this;
+      }
+
+      public Builder isWriteable(boolean isWriteable) {
+         this.isWriteable = isWriteable;
+         return this;
+      }
+
+      public Builder isBootable(boolean isBootable) {
+         this.isBootable = isBootable;
+         return this;
+      }
+
+      public Builder isCpuHotPlug(boolean cpuHotPlug) {
+         this.cpuHotPlug = cpuHotPlug;
+         return this;
+      }
+
+      public Builder isCpuHotUnPlug(boolean cpuHotUnPlug) {
+         this.cpuHotUnPlug = cpuHotUnPlug;
+         return this;
+      }
+
+      public Builder isRamHotPlug(boolean ramHotPlug) {
+         this.ramHotPlug = ramHotPlug;
+         return this;
+      }
+
+      public Builder isRamHotUnPlug(boolean ramHotUnPlug) {
+         this.ramHotUnPlug = ramHotUnPlug;
+         return this;
+      }
+
+      public Builder isNicHotPlug(boolean nicHotPlug) {
+         this.nicHotPlug = nicHotPlug;
+         return this;
+      }
+
+      public Builder isNicHotUnPlug(boolean nicHotUnPlug) {
+         this.nicHotUnPlug = nicHotUnPlug;
+         return this;
+      }
+
+      public Builder isDiscVirtioHotPlug(boolean discVirtioHotPlug) {
+         this.discVirtioHotPlug = discVirtioHotPlug;
+         return this;
+      }
+
+      public Builder isDiscVirtioHotUnPlug(boolean discVirtioHotUnPlug) {
+         this.discVirtioHotUnPlug = discVirtioHotUnPlug;
+         return this;
+      }
+
+      public Image build() {
+         return Image.create(id, name, size, type, location, osType, isPublic, isWriteable, isBootable, cpuHotPlug, cpuHotUnPlug,
+                 ramHotPlug, ramHotUnPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug);
+      }
+
+      public Builder fromImage(Image in) {
+         return this.id(in.id()).isBootable(in.isBootable()).isCpuHotPlug(in.isCpuHotPlug()).isCpuHotUnPlug(in.isCpuHotUnPlug())
+                 .isDiscVirtioHotPlug(in.isDiscVirtioHotPlug()).isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug())
+                 .isNicHotPlug(in.isNicHotPlug()).isNicHotUnPlug(in.isNicHotUnPlug()).isPublic(in.isPublic())
+                 .isRamHotPlug(in.isRamHotPlug()).isRamHotUnPlug(in.isRamHotUnPlug()).isWriteable(in.isWriteable())
+                 .location(in.location()).name(in.name()).osType(in.osType()).size(in.size());
+      }
+
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
new file mode 100644
index 0000000..c21f1c4
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/OsType.java
@@ -0,0 +1,30 @@
+/*
+ * 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;
+
+public enum OsType {
+
+   WINDOWS, LINUX, OTHER, UNRECOGNIZED;
+
+   public static OsType fromValue(String v) {
+      try {
+         return valueOf(v);
+      } catch (IllegalArgumentException ex) {
+         return UNRECOGNIZED;
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
new file mode 100644
index 0000000..703eb59
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
@@ -0,0 +1,424 @@
+/*
+ * 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;
+
+import org.jclouds.profitbricks.domain.internal.ServerCommonProperties;
+import com.google.auto.value.AutoValue;
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import java.util.Date;
+import org.jclouds.javax.annotation.Nullable;
+
+@AutoValue
+public abstract class Server implements ServerCommonProperties {
+
+   public enum Status {
+
+      NOSTATE, RUNNING, BLOCKED, PAUSED, SHUTDOWN, SHUTOFF, CRASHED, UNRECOGNIZED;
+
+      public String value() {
+         return name();
+      }
+
+      public static Status fromValue( String v ) {
+         try {
+            return valueOf( v );
+         } catch ( IllegalArgumentException ex ) {
+            return UNRECOGNIZED;
+         }
+      }
+   }
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   @Override
+   public abstract String name();
+
+   @Nullable
+   public abstract Boolean hasInternetAccess();
+
+   public abstract ProvisioningState state();
+
+   @Nullable
+   public abstract Status status();
+
+   @Nullable
+   public abstract OsType osType();
+
+   @Nullable
+   public abstract AvailabilityZone availabilityZone();
+
+   @Nullable
+   public abstract Date creationTime();
+
+   @Nullable
+   public abstract Date lastModificationTime();
+
+//   public abstract List<Storage> storages();
+//   public abstract List<Nic> storages();
+   public static Server create( String id, String name, int cores, int ram, Boolean hasInternetAccess, ProvisioningState state,
+           Status status, OsType osType, AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime, Boolean isCpuHotPlug,
+           Boolean isRamHotPlug, Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
+      return new AutoValue_Server( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug,
+              cores, ram, id, name, hasInternetAccess, state, status, osType, availabilityZone, creationTime, lastModificationTime );
+
+   }
+
+   public static DescribingBuilder builder() {
+      return new DescribingBuilder();
+   }
+
+   public DescribingBuilder toBuilder() {
+      return builder().fromServer( this );
+   }
+
+   public abstract static class Builder<B extends Builder, D extends ServerCommonProperties> {
+
+      protected String name;
+      protected int cores;
+      protected int ram;
+      protected Boolean cpuHotPlug;
+      protected Boolean ramHotPlug;
+      protected Boolean nicHotPlug;
+      protected Boolean nicHotUnPlug;
+      protected Boolean discVirtioHotPlug;
+      protected Boolean discVirtioHotUnPlug;
+
+      public B name( String name ) {
+         this.name = name;
+         return self();
+      }
+
+      public B cores( int cores ) {
+         this.cores = cores;
+         return self();
+      }
+
+      public B ram( int ram ) {
+         this.ram = ram;
+         return self();
+      }
+
+      public B isCpuHotPlug( Boolean cpuHotPlug ) {
+         this.cpuHotPlug = cpuHotPlug;
+         return self();
+      }
+
+      public B isRamHotPlug( Boolean ramHotPlug ) {
+         this.ramHotPlug = ramHotPlug;
+         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();
+   }
+
+   public static class DescribingBuilder extends Builder<DescribingBuilder, Server> {
+
+      private String id;
+      private ProvisioningState state;
+      private Status status;
+      private OsType osType;
+      private AvailabilityZone zone;
+      private Date creationTime;
+      private Date lastModificationTime;
+      private Boolean hasInternetAccess;
+
+      public DescribingBuilder id( String id ) {
+         this.id = id;
+         return this;
+      }
+
+      public DescribingBuilder state( ProvisioningState state ) {
+         this.state = state;
+         return this;
+      }
+
+      public DescribingBuilder status( Status status ) {
+         this.status = status;
+         return this;
+      }
+
+      public DescribingBuilder osType( OsType osType ) {
+         this.osType = osType;
+         return this;
+      }
+
+      public DescribingBuilder availabilityZone( AvailabilityZone zone ) {
+         this.zone = zone;
+         return this;
+      }
+
+      public DescribingBuilder creationTime( Date creationTime ) {
+         this.creationTime = creationTime;
+         return this;
+      }
+
+      public DescribingBuilder lastModificationTime( Date lastModificationTime ) {
+         this.lastModificationTime = lastModificationTime;
+         return this;
+      }
+
+      public DescribingBuilder hasInternetAccess( Boolean hasInternetAccess ) {
+         this.hasInternetAccess = hasInternetAccess;
+         return this;
+      }
+
+      @Override
+      public Server build() {
+         return Server.create( id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
+                 lastModificationTime, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+      }
+
+      private DescribingBuilder fromServer( Server in ) {
+         return this.id( in.id() ).cores( in.cores() ).creationTime( in.creationTime() ).hasInternetAccess( in.hasInternetAccess() )
+                 .isCpuHotPlug( in.isCpuHotPlug() ).isDiscVirtioHotPlug( in.isDiscVirtioHotPlug() ).isDiscVirtioHotUnPlug( in.isDiscVirtioHotUnPlug() )
+                 .isNicHotPlug( in.isNicHotPlug() ).isNicHotUnPlug( in.isNicHotUnPlug() ).isRamHotPlug( in.isRamHotPlug() )
+                 .lastModificationTime( in.lastModificationTime() ).name( in.name() ).osType( in.osType() ).ram( in.ram() ).state( in.state() )
+                 .status( in.status() );
+      }
+
+      @Override
+      public DescribingBuilder self() {
+         return this;
+      }
+
+   }
+
+   public static final class Request {
+
+      public static CreatePayload.Builder creatingBuilder() {
+         return new CreatePayload.Builder();
+      }
+
+      public static UpdatePayload.Builder updatingBuilder() {
+         return new UpdatePayload.Builder();
+      }
+
+      @AutoValue
+      public abstract static class CreatePayload implements ServerCommonProperties {
+
+         public abstract String dataCenterId();
+
+         @Nullable
+         public abstract String bootFromStorageId();
+
+         @Nullable
+         public abstract String bootFromImageId();
+
+         @Nullable
+         public abstract Integer lanId();
+
+         @Nullable
+         public abstract Boolean hasInternetAccess();
+
+         @Nullable
+         public abstract AvailabilityZone availabilityZone();
+
+         @Nullable
+         public abstract OsType osType();
+
+         public static CreatePayload create( String dataCenterId, String name, int core, int ram ) {
+            return create( dataCenterId, name, core, ram, "", "", null, false, null, null, null, null, null, null, null, null );
+         }
+
+         public static CreatePayload create( String dataCenterId, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
+                 Integer lanId, Boolean hasInternetAccess, AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug,
+                 Boolean isNicHotPlug, Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
+            validateCores( cores );
+            validateRam( ram, isRamHotPlug );
+            return new AutoValue_Server_Request_CreatePayload( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
+                    isDiscVirtioHotUnPlug, name, cores, ram, dataCenterId, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
+                    availabilityZone, osType );
+         }
+
+         public static class Builder extends Server.Builder<Builder, CreatePayload> {
+
+            private String dataCenterId;
+            private String bootFromStorageId;
+            private String bootFromImageId;
+            private Integer lanId;
+            private Boolean hasInternetAccess;
+            private AvailabilityZone availabilityZone;
+            private OsType osType;
+
+            public Builder dataCenterId( String dataCenterId ) {
+               this.dataCenterId = dataCenterId;
+               return this;
+            }
+
+            public Builder dataCenterId( DataCenter dataCenter ) {
+               this.dataCenterId = checkNotNull( dataCenter, "Cannot pass null datacenter" ).id();
+               return this;
+            }
+
+            public Builder bootFromStorageId( String storageId ) {
+               this.bootFromStorageId = storageId;
+               return this;
+            }
+
+            public Builder bootFromImageId( String image ) {
+               this.bootFromImageId = image;
+               return this;
+            }
+
+            public Builder lanId( Integer lanId ) {
+               this.lanId = lanId;
+               return this;
+            }
+
+            public Builder availabilityZone( AvailabilityZone zone ) {
+               this.availabilityZone = zone;
+               return this;
+            }
+
+            public Builder osType( OsType osType ) {
+               this.osType = osType;
+               return this;
+            }
+
+            public Builder hasInternetAccess( Boolean hasInternetAccess ) {
+               this.hasInternetAccess = hasInternetAccess;
+               return this;
+            }
+
+            @Override
+            public Builder self() {
+               return this;
+            }
+
+            @Override
+            public CreatePayload build() {
+               return CreatePayload.create( dataCenterId, name, cores, ram, bootFromStorageId, bootFromImageId, lanId, hasInternetAccess,
+                       availabilityZone, osType, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+            }
+
+         }
+      }
+
+      @AutoValue
+      public abstract static class UpdatePayload implements ServerCommonProperties {
+
+         @Nullable
+         @Override
+         public abstract String name();
+
+         public abstract String id();
+
+         @Nullable
+         public abstract String bootFromStorageId();
+
+         @Nullable
+         public abstract String bootFromImageId();
+
+         @Nullable
+         public abstract AvailabilityZone availabilityZone();
+
+         @Nullable
+         public abstract OsType osType();
+
+         public static UpdatePayload create( String id, String name, int cores, int ram, String bootFromStorageId, String bootFromImageId,
+                 AvailabilityZone availabilityZone, OsType osType, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug,
+                 Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug ) {
+            return new AutoValue_Server_Request_UpdatePayload( isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug,
+                    isDiscVirtioHotUnPlug, cores, ram, name, id, bootFromStorageId, bootFromImageId, availabilityZone, osType );
+         }
+
+         public static class Builder extends Server.Builder<Builder, UpdatePayload> {
+
+            private String id;
+            private String bootFromStorageId;
+            private String bootFromImageId;
+            private AvailabilityZone availabilityZone;
+            private OsType osType;
+
+            public Builder id( String id ) {
+               this.id = id;
+               return this;
+            }
+
+            public Builder bootFromStorageId( String storageId ) {
+               this.bootFromStorageId = storageId;
+               return this;
+            }
+
+            public Builder bootFromImageId( String image ) {
+               this.bootFromImageId = image;
+               return this;
+            }
+
+            public Builder availabilityZone( AvailabilityZone zone ) {
+               this.availabilityZone = zone;
+               return this;
+            }
+
+            public Builder osType( OsType osType ) {
+               this.osType = osType;
+               return this;
+            }
+
+            @Override
+            public Builder self() {
+               return this;
+            }
+
+            @Override
+            public UpdatePayload build() {
+               return UpdatePayload.create( id, name, cores, ram, bootFromStorageId, bootFromImageId, availabilityZone, osType,
+                       cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug, discVirtioHotPlug, discVirtioHotUnPlug );
+
+            }
+
+         }
+      }
+
+   }
+
+   private static void validateCores( int cores ) {
+      checkArgument( cores > 0, "Core must be atleast 1." );
+   }
+
+   private static void validateRam( int ram, Boolean isRamHotPlug ) {
+      int minRam = ( isRamHotPlug == null || !isRamHotPlug ) ? 256 : 1024;
+      checkArgument( ram >= minRam && ram % 256 == 0, "RAM must be multiples of 256 with minimum of 256 MB (1024 MB if ramHotPlug is enabled)" );
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/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
new file mode 100644
index 0000000..7366fb1
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/internal/ServerCommonProperties.java
@@ -0,0 +1,49 @@
+/*
+ * 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;
+
+/**
+ * An interface used as common data type for {@link org.jclouds.profitbricks.domain.Server.Builder}
+ */
+public interface ServerCommonProperties {
+
+   @Nullable
+   Boolean isCpuHotPlug();
+
+   @Nullable
+   Boolean isRamHotPlug();
+
+   @Nullable
+   Boolean isNicHotPlug();
+
+   @Nullable
+   Boolean isNicHotUnPlug();
+
+   @Nullable
+   Boolean isDiscVirtioHotPlug();
+
+   @Nullable
+   Boolean isDiscVirtioHotUnPlug();
+
+   String name();
+
+   int cores();
+
+   int ram(); // in MB
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ImageApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ImageApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ImageApi.java
new file mode 100644
index 0000000..95d27c4
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ImageApi.java
@@ -0,0 +1,65 @@
+/*
+ * 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.features;
+
+import java.util.List;
+import javax.inject.Named;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.jclouds.Fallbacks;
+
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.image.ImageInfoResponseHandler;
+import org.jclouds.profitbricks.http.parser.image.ImageListResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface ImageApi {
+
+   /**
+    * @return Outputs a list of all HDD and/or CD-ROM/DVD images existing on or uploaded to the ProfitBricks FTP server.
+    */
+   @POST
+   @Named("image:getall")
+   @Payload("<ws:getAllImages/>")
+   @XMLResponseParser(ImageListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<Image> getAllImages();
+
+   /**
+    *
+    * @param identifier Image Id
+    * @return Returns information about a HDD or CD-ROM/DVD (ISO) image.
+    */
+   @POST
+   @Named("image:get")
+   @Payload("<ws:getImage><imageId>{id}</imageId></ws:getImage>")
+   @XMLResponseParser(ImageInfoResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Image getImage(@PayloadParam("id") String identifier);
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
new file mode 100644
index 0000000..1fa89b3
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/ServerApi.java
@@ -0,0 +1,164 @@
+/*
+ * 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.features;
+
+import java.util.List;
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import org.jclouds.Fallbacks;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.binder.server.CreateServerRequestBinder;
+import org.jclouds.profitbricks.binder.server.UpdateServerRequestBinder;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerInfoResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerListResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters( { BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class } )
+@Consumes( MediaType.TEXT_XML )
+@Produces( MediaType.TEXT_XML )
+public interface ServerApi {
+
+   /**
+    * @return Returns information about all virtual server, such as configuration, provisioning status, power status, etc.
+    */
+   @POST
+   @Named( "server:getall" )
+   @Payload( "<ws:getAllServers/>" )
+   @XMLResponseParser( ServerListResponseHandler.class )
+   @Fallback( Fallbacks.EmptyListOnNotFoundOr404.class )
+   List<Server> getAllServers();
+
+   /**
+    * @param identifier Identifier of the virtual server
+    * @return Returns information about a virtual server, such as configuration, provisioning status, power status, etc.
+    */
+   @POST
+   @Named( "server:get" )
+   @Payload( "<ws:getServer><serverId>{id}</serverId></ws:getServer>" )
+   @XMLResponseParser( ServerInfoResponseHandler.class )
+   @Fallback( Fallbacks.NullOnNotFoundOr404.class )
+   Server getServer( @PayloadParam( "id" ) String identifier );
+
+   /**
+    * Starts an existing virtual server
+    * <ul>
+    * <li>Server may receive new public IP addresses if necessary </li>
+    * <li>Billing will continue</li>
+    * </ul>
+    *
+    *
+    * @param id Identifier of the target virtual server
+    * @return Identifier of current request
+    */
+   @POST
+   @Named( "server:start" )
+   @Payload( "<ws:startServer><serverId>{id}</serverId></ws:startServer>" )
+   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
+   String startServer( @PayloadParam( "id" ) String id );
+
+   /**
+    *
+    * Stops an existing virtual server forcefully (HARD stop)
+    * <ul>
+    * <li>Server will be forcefully powered off. Any unsaved data may be lost! </li>
+    * <li>Billing for this server will be stopped </li>
+    * <li>When restarting the server a new public IP gets assigned, alternatively, you can reserve IP addresses, see reservation of public
+    * IP blocks</li>
+    * </ul>
+    *
+    * A graceful stop of a server is not possible through the ProfitBricks API. We recommend to access and execute the command on the
+    * virtual server directly. Once the server was shutdown you still can use the "stopServer" method that will stop billing.
+    *
+    * @param id Identifier of the target virtual server
+    * @return Identifier of current request
+    */
+   @POST
+   @Named( "server:stop" )
+   @Payload( "<ws:stopServer><serverId>{id}</serverId></ws:stopServer>" )
+   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
+   String stopServer( @PayloadParam( "id" ) String id );
+
+   /**
+    * Resets an existing virtual server (POWER CYCLE).
+    * <ul>
+    * <li>Server will be forcefully powered off and restarted immediately. Any unsaved data may be lost!</li>
+    * <li> Billing will continue</li>
+    * </ul>
+    * <b>Graceful REBOOT</b>
+    *
+    * A graceful reboot of a server is not possible through the ProfitBricks API. We recommend to access and execute the command on the
+    * virtual server directly.
+    *
+    * @param id Identifier of the target virtual server
+    * @return Identifier of current request
+    */
+   @POST
+   @Named( "server:reset" )
+   @Payload( "<ws:resetServer><serverId>{id}</serverId></ws:resetServer>" )
+   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
+   String resetServer( @PayloadParam( "id" ) String id );
+
+   /**
+    * Creates a Virtual Server within an existing data center. Parameters can be specified to set up a boot device and connect the server to
+    * an existing LAN or the Internet.
+    *
+    * @param payload Payload
+    * @return serverId of the created server
+    */
+   @POST
+   @Named( "server:create" )
+   @MapBinder( CreateServerRequestBinder.class )
+   @XMLResponseParser( ServerIdOnlyResponseHandler.class )
+   String createServer( @PayloadParam( "server" ) Server.Request.CreatePayload payload );
+
+   /**
+    * Updates parameters of an existing virtual server device.
+    *
+    * @param payload Paylaod
+    * @return Identifier of current request
+    */
+   @POST
+   @Named( "server:update" )
+   @MapBinder( UpdateServerRequestBinder.class )
+   @XMLResponseParser( RequestIdOnlyResponseHandler.class )
+   String updateServer( @PayloadParam( "server" ) Server.Request.UpdatePayload payload );
+
+   /**
+    * Deletes an existing Virtual Server.
+    *
+    * @param id Identifier of the target virtual server
+    * @return Identifier of current request
+    */
+   @POST
+   @Named( "server:delete" )
+   @Payload( "<ws:deleteServer><serverId>{id}</serverId></ws:deleteServer>" )
+   @Fallback( Fallbacks.FalseOnNotFoundOr404.class )
+   boolean deleteServer( @PayloadParam( "id" ) String id );
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
index 9e66159..c61f2b5 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/BaseProfitBricksResponseHandler.java
@@ -49,6 +49,14 @@ public abstract class BaseProfitBricksResponseHandler<T> extends ParseSax.Handle
       return strBuilder.toString().trim();
    }
 
+   protected Float textToFloatValue() {
+      return Float.valueOf(textToStringValue());
+   }
+   
+   protected Double textToDoubleValue(){
+      return Double.valueOf( textToStringValue());
+   }
+
    protected int textToIntValue() {
       return Integer.parseInt(textToStringValue());
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
new file mode 100644
index 0000000..6e6b288
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/RequestIdOnlyResponseHandler.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.xml.sax.SAXException;
+
+public class RequestIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
+
+   private String requestId;
+
+   @Inject
+   RequestIdOnlyResponseHandler( DateCodecFactory dateCodec ) {
+      super( dateCodec );
+   }
+
+   @Override
+   public void endElement( String uri, String localName, String qName ) throws SAXException {
+      setPropertyOnEndTag( qName );
+      clearTextBuffer();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag( String qName ) {
+      if ( "requestId".equals( qName ) )
+         requestId = textToStringValue();
+   }
+
+   @Override
+   public String getResult() {
+      return requestId;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
new file mode 100644
index 0000000..1a6ff94
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/BaseImageResponseHandler.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.image;
+
+import javax.inject.Inject;
+
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Image;
+import org.jclouds.profitbricks.domain.Image.Type;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+
+public abstract class BaseImageResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected Image.Builder builder;
+
+   @Inject
+   BaseImageResponseHandler(DateCodecFactory dateCodecFactory) {
+      super(dateCodecFactory);
+      this.builder = Image.builder();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("imageId".equals(qName))
+         builder.id(textToStringValue());
+      else if ("imageName".equals(qName))
+         builder.name(textToStringValue());
+      else if ("imageSize".equals(qName))
+         builder.size(textToFloatValue());
+      else if ("imageType".equals(qName))
+         builder.type(Type.fromValue(textToStringValue()));
+      else if ("location".equals(qName))
+         builder.location(Location.fromId(textToStringValue()));
+      else if ("osType".equals(qName))
+         builder.osType(OsType.fromValue(textToStringValue()));
+      else if ("public".equals(qName))
+         builder.isPublic(textToBooleanValue());
+      else if ("writeable".equals(qName))
+         builder.isWriteable(textToBooleanValue());
+      else if ("bootable".equals(qName))
+         builder.isBootable(textToBooleanValue());
+      else if ("cpuHotPlug".equals(qName))
+         builder.isCpuHotPlug(textToBooleanValue());
+      else if ("cpuHotUnPlug".equals(qName))
+         builder.isCpuHotUnPlug(textToBooleanValue());
+      else if ("ramHotPlug".equals(qName))
+         builder.isRamHotPlug(textToBooleanValue());
+      else if ("ramHotUnPlug".equals(qName))
+         builder.isRamHotUnPlug(textToBooleanValue());
+      else if ("nicHotPlug".equals(qName))
+         builder.isNicHotPlug(textToBooleanValue());
+      else if ("nicHotUnPlug".equals(qName))
+         builder.isNicHotUnPlug(textToBooleanValue());
+      else if ("discVirtioHotPlug".equals(qName))
+         builder.isDiscVirtioHotPlug(textToBooleanValue());
+      else if ("discVirtioHotUnPlug".equals(qName))
+         builder.isDiscVirtioHotUnPlug(textToBooleanValue());
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
new file mode 100644
index 0000000..0736acb
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageInfoResponseHandler.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.image;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Image;
+import org.xml.sax.SAXException;
+
+public class ImageInfoResponseHandler extends BaseImageResponseHandler<Image> {
+
+   private boolean done = false;
+
+   @Inject
+   ImageInfoResponseHandler(DateCodecFactory dateCodecFactory) {
+      super(dateCodecFactory);
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
+         return;
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName))
+         done = true;
+      clearTextBuffer();
+   }
+
+   @Override
+   public Image getResult() {
+      return builder.build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
new file mode 100644
index 0000000..8fc8091
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.image;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import java.util.List;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Image;
+import org.xml.sax.SAXException;
+
+public class ImageListResponseHandler extends BaseImageResponseHandler<List<Image>> {
+
+   private final List<Image> images;
+
+   @Inject
+   ImageListResponseHandler(DateCodecFactory dateCodecFactory) {
+      super(dateCodecFactory);
+      this.images = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      if ("return".equals(qName)) {
+         images.add(builder.build());
+         builder = Image.builder();
+      }
+      clearTextBuffer();
+   }
+
+   @Override
+   public List<Image> getResult() {
+      return images;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
new file mode 100644
index 0000000..e594ce4
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.server;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+
+public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected Server.DescribingBuilder builder;
+
+   @Inject
+   BaseServerResponseHandler( DateCodecFactory dateCodec ) {
+      super( dateCodec );
+      this.builder = Server.builder();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag( String qName ) {
+      if ( "serverId".equals( qName ) )
+         builder.id( textToStringValue() );
+      else if ( "serverName".equals( qName ) )
+         builder.name( textToStringValue() );
+      else if ( "cores".equals( qName ) )
+         builder.cores( textToIntValue() );
+      else if ( "ram".equals( qName ) )
+         builder.ram( textToIntValue() );
+      else if ( "provisioningState".equals( qName ) )
+         builder.state( ProvisioningState.fromValue( textToStringValue() ) );
+      else if ( "virtualMachineState".equals( qName ) )
+         builder.status( Server.Status.fromValue( textToStringValue() ) );
+      else if ( "osType".equals( qName ) )
+         builder.osType( OsType.fromValue( textToStringValue() ) );
+      else if ( "availabilityZone".equals( qName ) )
+         builder.availabilityZone( AvailabilityZone.fromValue( textToStringValue() ) );
+      else if ( "creationTime".equals( qName ) )
+         builder.creationTime( textToIso8601Date() );
+      else if ( "lastModificationTime".equals( qName ) )
+         builder.lastModificationTime( textToIso8601Date() );
+      else if ( "internetAccess".equals( qName ) )
+         builder.hasInternetAccess( textToBooleanValue() );
+      else if ( "cpuHotPlug".equals( qName ) )
+         builder.isCpuHotPlug( textToBooleanValue() );
+      else if ( "ramHotPlug".equals( qName ) )
+         builder.isRamHotPlug( textToBooleanValue() );
+      else if ( "nicHotPlug".equals( qName ) )
+         builder.isNicHotPlug( textToBooleanValue() );
+      else if ( "nicHotUnPlug".equals( qName ) )
+         builder.isNicHotUnPlug( textToBooleanValue() );
+      else if ( "discVirtioHotPlug".equals( qName ) )
+         builder.isDiscVirtioHotPlug( textToBooleanValue() );
+      else if ( "discVirtioHotUnPlug".equals( qName ) )
+         builder.isDiscVirtioHotUnPlug( textToBooleanValue() );
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
new file mode 100644
index 0000000..ed88018
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerIdOnlyResponseHandler.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.server;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * Handler for parsing SOAP response where <i>serverId</i> is the only <i>usable</i> value.
+ *
+ * Other properties available (which are ignored): requestId, dataCenterId, dataCenterVersion
+ */
+public class ServerIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
+
+   private String serverId;
+
+   @Inject
+   ServerIdOnlyResponseHandler( DateCodecFactory dateCodec ) {
+      super( dateCodec );
+   }
+
+   @Override
+   public void endElement( String uri, String localName, String qName ) throws SAXException {
+      setPropertyOnEndTag( qName );
+      clearTextBuffer();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag( String qName ) {
+      if ( "serverId".equals( qName ) )
+         serverId = textToStringValue();
+   }
+
+   @Override
+   public String getResult() {
+      return serverId;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
new file mode 100644
index 0000000..dfac4ff
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerInfoResponseHandler.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.server;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Server;
+import org.xml.sax.SAXException;
+
+public class ServerInfoResponseHandler extends BaseServerResponseHandler<Server> {
+
+   private boolean done = false;
+
+   @Inject
+   ServerInfoResponseHandler( DateCodecFactory dateCodec ) {
+      super( dateCodec );
+   }
+
+   @Override
+   public void endElement( String uri, String localName, String qName ) throws SAXException {
+      if ( done )
+         return;
+      setPropertyOnEndTag( qName );
+      if ( "return".equals( qName ) )
+         done = true;
+      clearTextBuffer();
+   }
+
+   @Override
+   public Server getResult() {
+      return builder.build();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
new file mode 100644
index 0000000..f50027c
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.server;
+
+import com.google.common.collect.Lists;
+import com.google.inject.Inject;
+import java.util.List;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.Server;
+import org.xml.sax.SAXException;
+
+public class ServerListResponseHandler extends BaseServerResponseHandler<List<Server>> {
+
+   private final List<Server> servers;
+
+   @Inject
+   ServerListResponseHandler( DateCodecFactory dateCodec ) {
+      super( dateCodec );
+      this.servers = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement( String uri, String localName, String qName ) throws SAXException {
+      setPropertyOnEndTag( qName );
+      if ( "return".equals( qName ) ) {
+         servers.add( builder.build() );
+         builder = Server.builder();
+      }
+      clearTextBuffer();
+   }
+
+   @Override
+   public List<Server> getResult() {
+      return servers;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
new file mode 100644
index 0000000..bf18841
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/CreateServerRequestBinderTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.binder.server;
+
+import org.jclouds.profitbricks.domain.Server;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "CreateServerRequestBinderTest" )
+public class CreateServerRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      CreateServerRequestBinder binder = new CreateServerRequestBinder();
+
+      Server.Request.CreatePayload payload = Server.Request.creatingBuilder()
+              .name( "jclouds-node" )
+              .cores( 4 )
+              .ram( 4 * 1024 )
+              .dataCenterId( "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" )
+              .build();
+
+      String actual = binder.createPayload( payload );
+      assertNotNull( actual, "Binder returned null payload" );
+      assertEquals( actual, expectedPayload );
+   }
+
+   private final String expectedPayload
+           = ( "      <ws:createServer>\n"
+           + "         <request>\n"
+           + "            <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>\n"
+           + "            <cores>4</cores>\n"
+           + "            <ram>4096</ram>\n"
+           + "            <serverName>jclouds-node</serverName>\n"
+//           + "            <bootFromStorageId>?</bootFromStorageId>\n"
+//           + "            <bootFromImageId>?</bootFromImageId>\n"
+//           + "            <internetAccess>false</internetAccess>\n"
+//           + "            <lanId>?</lanId>\n"
+//           + "            <osType>?</osType>\n"
+//           + "            <availabilityZone>AUTO</availabilityZone>\n"
+//           + "            <cpuHotPlug>false</cpuHotPlug>\n"
+//           + "            <ramHotPlug>false</ramHotPlug>\n"
+//           + "            <nicHotPlug>false</nicHotPlug>\n"
+//           + "            <nicHotUnPlug>false</nicHotUnPlug>\n"
+//           + "            <discVirtioHotPlug>false</discVirtioHotPlug>\n"
+//           + "            <discVirtioHotUnPlug>false</discVirtioHotUnPlug>\n"
+           + "         </request>\n"
+           + "      </ws:createServer>" )
+           .replaceAll( "\\s+", "" );
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
new file mode 100644
index 0000000..cba666b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/server/UpdateServerRequestBinderTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.binder.server;
+
+import org.jclouds.profitbricks.domain.Server;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test( groups = "unit", testName = "UpdateServerRequestBinderTest" )
+public class UpdateServerRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      UpdateServerRequestBinder binder = new UpdateServerRequestBinder();
+
+      Server.Request.UpdatePayload payload = Server.Request.updatingBuilder()
+              .id( "qwertyui-qwer-qwer-qwer-qwertyyuiiop" )
+              .cores( 8 )
+              .ram( 8 * 1024 )
+              .name( "apache-node")
+              .build();
+      
+      String actual = binder.createPayload( payload );
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(actual, expectedPayload);
+   }
+
+   private final String expectedPayload
+           = ( "      <ws:updateServer>\n"
+           + "         <request>\n"
+           + "            <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>\n"
+           + "            <cores>8</cores>\n"
+           + "            <ram>8192</ram>\n"
+           + "            <serverName>apache-node</serverName>\n"
+//           + "            <bootFromStorageId>?</bootFromStorageId>\n"
+//           + "            <bootFromImageId>?</bootFromImageId>\n"
+//           + "            <osType>?</osType>\n"
+//           + "            <availabilityZone>?</availabilityZone>\n"
+//           + "            <cpuHotPlug>?</cpuHotPlug>\n"
+//           + "            <ramHotPlug>?</ramHotPlug>\n"
+//           + "            <nicHotPlug>?</nicHotPlug>\n"
+//           + "            <nicHotUnPlug>?</nicHotUnPlug>\n"
+//           + "            <discVirtioHotPlug>?</discVirtioHotPlug>\n"
+//           + "            <discVirtioHotUnPlug>?</discVirtioHotUnPlug>\n"
+           + "         </request>\n"
+           + "      </ws:updateServer>" )
+           .replaceAll( "\\s+", "" );
+
+}


[18/35] jclouds git commit: Next development version 2.0.0-SNAPSHOT

Posted by de...@apache.org.
Next development version 2.0.0-SNAPSHOT


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

Branch: refs/heads/master
Commit: f8f82cc4c045e109033b3f2c42c7967a4d8b0a06
Parents: d117bb3
Author: Ignasi Barrera <na...@apache.org>
Authored: Tue Mar 24 10:56:30 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Mar 24 10:56:30 2015 +0100

----------------------------------------------------------------------
 providers/profitbricks/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/f8f82cc4/providers/profitbricks/pom.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/pom.xml b/providers/profitbricks/pom.xml
index b99ef5e..84f49b4 100644
--- a/providers/profitbricks/pom.xml
+++ b/providers/profitbricks/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.jclouds.labs</groupId>
         <artifactId>jclouds-labs</artifactId>
-        <version>1.9.0</version>
+        <version>2.0.0-SNAPSHOT</version>
     </parent>
   
     <!-- TODO: when out of labs, switch to org.jclouds.api -->


[17/35] jclouds git commit: Apache jclouds 1.9.0 release

Posted by de...@apache.org.
Apache jclouds 1.9.0 release


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

Branch: refs/heads/master
Commit: d117bb39192db19161fbd2c42f78007a156adf76
Parents: f58675e
Author: Ignasi Barrera <na...@apache.org>
Authored: Tue Mar 24 10:54:19 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Mar 24 10:54:19 2015 +0100

----------------------------------------------------------------------
 providers/profitbricks/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/d117bb39/providers/profitbricks/pom.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/pom.xml b/providers/profitbricks/pom.xml
index 84f49b4..b99ef5e 100644
--- a/providers/profitbricks/pom.xml
+++ b/providers/profitbricks/pom.xml
@@ -22,7 +22,7 @@
     <parent>
         <groupId>org.apache.jclouds.labs</groupId>
         <artifactId>jclouds-labs</artifactId>
-        <version>2.0.0-SNAPSHOT</version>
+        <version>1.9.0</version>
     </parent>
   
     <!-- TODO: when out of labs, switch to org.jclouds.api -->


[23/35] jclouds git commit: JCLOUDS-702: JClouds ProfitBricks provider - ComputeServiceAdapter

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/BaseStorageResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/BaseStorageResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/BaseStorageResponseHandler.java
index cb61e79..9026592 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/BaseStorageResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/BaseStorageResponseHandler.java
@@ -19,11 +19,9 @@ package org.jclouds.profitbricks.http.parser.storage;
 import java.util.Date;
 import java.util.List;
 
-import org.jclouds.date.DateCodec;
-
 import com.google.inject.Inject;
 
-import org.jclouds.date.DateCodecFactory;
+import org.jclouds.date.DateService;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Storage;
 import org.jclouds.profitbricks.domain.Storage.BusType;
@@ -33,20 +31,20 @@ import com.google.common.collect.Lists;
 
 public abstract class BaseStorageResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
 
-   protected final DateCodec dateCodec;
+   protected final DateService dateService;
 
    protected Storage.Builder builder;
    protected List<String> serverIds;
 
    @Inject
-   BaseStorageResponseHandler(DateCodecFactory dateCodec) {
-      this.dateCodec = dateCodec.iso8601();
+   BaseStorageResponseHandler(DateService dateService) {
+      this.dateService = dateService;
       this.builder = Storage.builder();
       this.serverIds = Lists.newArrayList();
    }
 
    protected final Date textToIso8601Date() {
-      return dateCodec.toDate(textToStringValue());
+      return dateService.iso8601DateOrSecondsDateParse(textToStringValue());
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandler.java
index 2bc1ed6..ae667ca 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageInfoResponseHandler.java
@@ -17,7 +17,8 @@
 package org.jclouds.profitbricks.http.parser.storage;
 
 import com.google.inject.Inject;
-import org.jclouds.date.DateCodecFactory;
+
+import org.jclouds.date.DateService;
 import org.jclouds.profitbricks.domain.Storage;
 import org.xml.sax.SAXException;
 
@@ -26,8 +27,8 @@ public class StorageInfoResponseHandler extends BaseStorageResponseHandler<Stora
    private boolean done = false;
 
    @Inject
-   StorageInfoResponseHandler(DateCodecFactory dateCodec) {
-      super(dateCodec);
+   StorageInfoResponseHandler(DateService dateService) {
+      super(dateService);
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
index 572f761..3048f66 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/storage/StorageListResponseHandler.java
@@ -16,22 +16,22 @@
  */
 package org.jclouds.profitbricks.http.parser.storage;
 
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-
 import java.util.List;
 
-import org.jclouds.date.DateCodecFactory;
+import org.jclouds.date.DateService;
 import org.jclouds.profitbricks.domain.Storage;
 import org.xml.sax.SAXException;
 
+import com.google.inject.Inject;
+import com.google.common.collect.Lists;
+
 public class StorageListResponseHandler extends BaseStorageResponseHandler<List<Storage>> {
 
    private List<Storage> storages;
 
    @Inject
-   StorageListResponseHandler(DateCodecFactory dateCodec) {
-      super(dateCodec);
+   StorageListResponseHandler(DateService dateService) {
+      super(dateService);
       this.storages = Lists.newArrayList();
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/Passwords.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/Passwords.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/Passwords.java
new file mode 100644
index 0000000..338f064
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/util/Passwords.java
@@ -0,0 +1,64 @@
+/*
+ * 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.util;
+
+import java.util.Random;
+import java.util.regex.Pattern;
+
+import com.google.common.collect.ImmutableSet;
+
+public class Passwords {
+
+   private static final Random random = new Random();
+
+   private static final int MIN_CHAR = 8;
+   private static final int MAX_CHAR = 50;
+   private static final String PASSWORD_FORMAT = String.format(
+           "[a-zA-Z0-9][^iIloOwWyYzZ10]{%d,%d}", MIN_CHAR - 1, MAX_CHAR);
+   private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_FORMAT);
+
+   private static final ImmutableSet<Character> INVALID_CHARS = ImmutableSet.<Character>of(
+           'i', 'I', 'l', 'o', 'O', 'w', 'W', 'y', 'Y', 'z', 'Z', '1', '0');
+
+   public static boolean isValidPassword(String password) {
+      return PASSWORD_PATTERN.matcher(password).matches();
+   }
+
+   public static String generate() {
+      int count = random.nextInt(MAX_CHAR - MIN_CHAR) + MIN_CHAR;
+
+      final char[] buffer = new char[count];
+
+      final int start = 'A';
+      final int end = 'z';
+      final int gap = end - start + 1;
+
+      while (count-- != 0) {
+         char ch = (char) (random.nextInt(gap) + start);
+         if ((isBetween(ch, start, 'Z') || isBetween(ch, 'a', end))
+                 && !INVALID_CHARS.contains(ch))
+            buffer[count] = ch;
+         else
+            count++;
+      }
+      return new String(buffer);
+   }
+
+   private static boolean isBetween(char ch, int start, int end) {
+      return ch >= start && ch <= end;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
index dda2ed6..42a1ad9 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/CreateSnapshotRequestBinderTest.java
@@ -37,11 +37,11 @@ public class CreateSnapshotRequestBinderTest {
    }
 
    private final String expectedPayload
-	   = ("      <ws:createSnapshot>\n"
-	   + "<request>\n"
-	   + "<storageId>123-1233-1324</storageId>\n"
-	   + "<description>describing the snapshot</description>\n"
-	   + "<snapshotName>snapshot name</snapshotName>\n"
-	   + "</request>\n"
-	   + "</ws:createSnapshot>").replaceAll("\\s+", "");
+           = ("      <ws:createSnapshot>\n"
+           + "<request>\n"
+           + "<storageId>123-1233-1324</storageId>\n"
+           + "<description>describing the snapshot</description>\n"
+           + "<snapshotName>snapshot name</snapshotName>\n"
+           + "</request>\n"
+           + "</ws:createSnapshot>").replaceAll("\\s+", "");
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
index 206cd79..e1ba061 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/snapshot/RollbackSnapshotRequestBinderTest.java
@@ -29,9 +29,9 @@ public class RollbackSnapshotRequestBinderTest {
       RollbackSnapshotRequestBinder binder = new RollbackSnapshotRequestBinder();
 
       Snapshot.Request.RollbackPayload payload = Snapshot.Request.rollbackBuilder()
-	      .snapshotId("snapshot-id")
-	      .storageId("storage-id")
-	      .build();
+              .snapshotId("snapshot-id")
+              .storageId("storage-id")
+              .build();
 
       String actual = binder.createPayload(payload);
       assertNotNull(actual, "Binder returned null payload");
@@ -39,9 +39,9 @@ public class RollbackSnapshotRequestBinderTest {
    }
 
    private final String expectedPayload = "<ws:rollbackSnapshot>"
-	   + "<request>"
-	   + "<snapshotId>snapshot-id</snapshotId>"
-	   + "<storageId>storage-id</storageId>"
-	   + "</request>"
-	   + "</ws:rollbackSnapshot>".replaceAll("\\s", "");
+           + "<request>"
+           + "<snapshotId>snapshot-id</snapshotId>"
+           + "<storageId>storage-id</storageId>"
+           + "</request>"
+           + "</ws:rollbackSnapshot>".replaceAll("\\s", "");
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java
new file mode 100644
index 0000000..83540a5
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.compute;
+
+import org.jclouds.compute.domain.NodeMetadata;
+import org.testng.annotations.Test;
+
+import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
+import org.jclouds.sshj.config.SshjSshClientModule;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
+import org.jclouds.compute.domain.ExecResponse;
+import org.jclouds.logging.config.LoggingModule;
+import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
+
+@Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceAdapterLiveTest")
+public class ProfitBricksComputeServiceAdapterLiveTest extends BaseComputeServiceLiveTest {
+
+   public ProfitBricksComputeServiceAdapterLiveTest() {
+      provider = "profitbricks";
+   }
+
+   @Override
+   protected Module getSshModule() {
+      return new SshjSshClientModule();
+   }
+
+   @Override
+   protected LoggingModule getLoggingModule() {
+      return new SLF4JLoggingModule();
+   }
+
+   @Override
+   public void testOptionToNotBlock() throws Exception {
+      // ProfitBricks implementation intentionally blocks until the node is 'AVAILABLE'
+   }
+
+   @Override
+   protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) {
+      // ProfitBricks doesn't support tags
+   }
+
+   @Override
+   protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
+      // ProfitBricks doesn't support user metadata
+   }
+
+   @Override
+   protected void checkResponseEqualsHostname(ExecResponse execResponse, NodeMetadata node1) {
+      // ProfitBricks doesn't support hostname
+   }
+
+   @Override
+   protected void checkOsMatchesTemplate(NodeMetadata node) {
+      // Not enough description from API to match template
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/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
new file mode 100644
index 0000000..eff7b01
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksTemplateBuilderLiveTest.java
@@ -0,0 +1,37 @@
+/*
+ * 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 java.util.Set;
+
+import com.google.common.collect.ImmutableSet;
+import org.jclouds.compute.internal.BaseTemplateBuilderLiveTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", testName = "ProfitBricksTemplateBuilderLiveTest")
+public class ProfitBricksTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest {
+
+   public ProfitBricksTemplateBuilderLiveTest() {
+      this.provider = "profitbricks";
+   }
+
+   @Override
+   protected Set<String> getIso3166Codes() {
+      return ImmutableSet.of();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManagerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManagerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManagerTest.java
new file mode 100644
index 0000000..dd115cc
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/concurrent/ProvisioningManagerTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.concurrent;
+
+import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
+import static java.util.logging.Logger.getAnonymousLogger;
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.base.Throwables;
+
+@Test(groups = "unit", testName = "ProvisioningManagerTest")
+public class ProvisioningManagerTest {
+
+   @Test
+   public void testProvision() throws IOException {
+      ProvisioningManager manager = new ProvisioningManager();
+      AtomicInteger completedJobs = new AtomicInteger(0);
+
+      try {
+         for (int i = 0; i < 5; i++) {
+            manager.provision(new MockJob(200, "slow", completedJobs));
+            manager.provision(new MockJob(0, "fast", completedJobs));
+            manager.provision(new MockJob(100, "normal", completedJobs));
+         }
+      } finally {
+         manager.close();
+      }
+
+      assertEquals(completedJobs.get(), 15);
+   }
+
+   @Test
+   public void testProvisionInterrupted() {
+      ProvisioningManager manager = new ProvisioningManager();
+      AtomicInteger completedJobs = new AtomicInteger(0);
+
+      manager.provision(new ShutdownExecutorJob(manager, completedJobs));
+      manager.provision(new MockJob(0, "rejected", completedJobs));
+
+      assertEquals(completedJobs.get(), 1);
+   }
+
+   private static class MockJob extends ProvisioningJob {
+
+      private final long delay;
+      private final AtomicInteger completedJobs;
+
+      public MockJob(long delay, String group, AtomicInteger completedJobs) {
+         super(sleepPredicate(delay), group, Suppliers.ofInstance((Object) 0));
+         this.delay = delay;
+         this.completedJobs = completedJobs;
+      }
+
+      @Override
+      public Integer call() throws Exception {
+         getAnonymousLogger().info("ProvisioningManagerTest: Starting " + this);
+         super.call();
+         getAnonymousLogger().info("ProvisioningManagerTest: Completed " + this);
+         return completedJobs.incrementAndGet();
+      }
+
+      @Override
+      public String toString() {
+         return "MockJob [id=" + hashCode() + ", group=" + getGroup() + ", delay=" + delay + "]";
+      }
+   }
+
+   private static class ShutdownExecutorJob extends ProvisioningJob {
+
+      public ShutdownExecutorJob(final ProvisioningManager manager, final AtomicInteger completedJobs) {
+         super(Predicates.<String>alwaysTrue(), "shutdown", new Supplier<Object>() {
+            @Override
+            public Integer get() {
+               try {
+                  manager.close();
+                  return completedJobs.incrementAndGet();
+               } catch (IOException ex) {
+                  throw Throwables.propagate(ex);
+               }
+            }
+         });
+      }
+   }
+
+   private static Predicate<String> sleepPredicate(final long delay) {
+      return new Predicate<String>() {
+         @Override
+         public boolean apply(String input) {
+            sleepUninterruptibly(delay, TimeUnit.MILLISECONDS);
+            return true;
+         }
+      };
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/DataCenterToLocationTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/DataCenterToLocationTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/DataCenterToLocationTest.java
new file mode 100644
index 0000000..7dcf69c
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/DataCenterToLocationTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.function;
+
+import static org.testng.Assert.assertEquals;
+
+import java.net.URI;
+
+import org.jclouds.domain.Location;
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.location.suppliers.all.JustProvider;
+import org.jclouds.profitbricks.ProfitBricksProviderMetadata;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+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 = "DataCenterToLocationTest")
+public class DataCenterToLocationTest {
+
+   private DataCenterToLocation fnLocation;
+   private LocationToLocation fnRegion;
+
+   @BeforeTest
+   public void setup() {
+      ProfitBricksProviderMetadata metadata = new ProfitBricksProviderMetadata();
+      JustProvider justProvider = new JustProvider(metadata.getId(), Suppliers.<URI>ofInstance(
+              URI.create(metadata.getEndpoint())), ImmutableSet.<String>of());
+      this.fnRegion = new LocationToLocation(justProvider);
+      this.fnLocation = new DataCenterToLocation(fnRegion);
+   }
+
+   @Test
+   public void testDataCenterToLocation() {
+      DataCenter dataCenter = DataCenter.builder()
+              .id("12345678-abcd-efgh-ijkl-987654321000")
+              .version(10)
+              .name("JClouds-DC")
+              .state(ProvisioningState.AVAILABLE)
+              .location(org.jclouds.profitbricks.domain.Location.DE_FRA)
+              .build();
+
+      Location actual = fnLocation.apply(dataCenter);
+
+      Location expected = new LocationBuilder()
+              .id(dataCenter.id())
+              .description(dataCenter.name())
+              .scope(LocationScope.ZONE)
+              .metadata(ImmutableMap.<String, Object>of(
+                              "version", dataCenter.version(),
+                              "state", dataCenter.state()))
+              .parent(fnRegion.apply(org.jclouds.profitbricks.domain.Location.DE_FRA))
+              .build();
+
+      assertEquals(actual, expected);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/LocationToLocationTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/LocationToLocationTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/LocationToLocationTest.java
new file mode 100644
index 0000000..3967cf5
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/LocationToLocationTest.java
@@ -0,0 +1,62 @@
+/*
+ * 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.function;
+
+import static org.testng.Assert.assertEquals;
+
+import java.net.URI;
+
+import org.jclouds.domain.LocationBuilder;
+import org.jclouds.domain.LocationScope;
+import org.jclouds.location.suppliers.all.JustProvider;
+import org.jclouds.profitbricks.ProfitBricksProviderMetadata;
+import org.jclouds.profitbricks.domain.Location;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+
+@Test(groups = "unit", testName = "LocationToLocationTest")
+public class LocationToLocationTest {
+
+   private LocationToLocation fnRegion;
+   private JustProvider justProvider;
+
+   @BeforeTest
+   public void setup() {
+      ProfitBricksProviderMetadata metadata = new ProfitBricksProviderMetadata();
+      this.justProvider = new JustProvider(metadata.getId(), Suppliers.<URI>ofInstance(
+              URI.create(metadata.getEndpoint())), ImmutableSet.<String>of());
+      this.fnRegion = new LocationToLocation(justProvider);
+   }
+
+   @Test
+   public void testLocationToLocation() {
+      Location[] locations = Location.values();
+      for (Location loc : locations) {
+         org.jclouds.domain.Location actual = fnRegion.apply(loc);
+         org.jclouds.domain.Location expected = new LocationBuilder()
+                 .id(loc.getId()).description(loc.getDescription()).scope(LocationScope.REGION)
+                 .parent(Iterables.getOnlyElement(justProvider.get())).build();
+
+         assertEquals(actual, expected);
+      }
+
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/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
new file mode 100644
index 0000000..d114efb
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ProvisionableToImageTest.java
@@ -0,0 +1,260 @@
+/*
+ * 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.function;
+
+import static org.testng.Assert.assertEquals;
+
+import java.net.URI;
+import java.util.Date;
+
+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.location.suppliers.all.JustProvider;
+import org.jclouds.profitbricks.ProfitBricksProviderMetadata;
+import org.jclouds.profitbricks.domain.Location;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableSet;
+
+@Test(groups = "unit", testName = "ProvisionableToImageTest")
+public class ProvisionableToImageTest {
+
+   private ProvisionableToImage fnImage;
+   private LocationToLocation fnRegion;
+
+   @BeforeTest
+   public void setup() {
+      ProfitBricksProviderMetadata metadata = new ProfitBricksProviderMetadata();
+      JustProvider justProvider = new JustProvider(metadata.getId(), Suppliers.<URI>ofInstance(
+              URI.create(metadata.getEndpoint())), ImmutableSet.<String>of());
+      this.fnRegion = new LocationToLocation(justProvider);
+      this.fnImage = new ProvisionableToImage(fnRegion);
+   }
+
+   @Test
+   public void testImageToImage() {
+      org.jclouds.profitbricks.domain.Image image
+              = org.jclouds.profitbricks.domain.Image.builder()
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("5ad99c9e-9166-11e4-9d74-52540066fee9")
+              .name("Ubuntu-14.04-LTS-server-2015-01-01")
+              .size(2048f)
+              .type(org.jclouds.profitbricks.domain.Image.Type.HDD)
+              .location(Location.US_LAS)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isPublic(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .isWriteable(true)
+              .build();
+
+      Image actual = fnImage.apply(image);
+
+      Image expected = new ImageBuilder()
+              .ids(image.id())
+              .name(image.name())
+              .location(fnRegion.apply(Location.US_LAS))
+              .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() {
+      org.jclouds.profitbricks.domain.Image image1
+              = org.jclouds.profitbricks.domain.Image.builder()
+              .id("f4742db0-9160-11e4-9d74-52540066fee9")
+              .name("Fedora-19-server-2015-01-01")
+              .size(2048f)
+              .type(org.jclouds.profitbricks.domain.Image.Type.HDD)
+              .location(Location.DE_FRA)
+              .osType(OsType.LINUX)
+              .build();
+
+      Image actual1 = fnImage.apply(image1);
+
+      Image expected1 = new ImageBuilder()
+              .ids(image1.id())
+              .name(image1.name())
+              .location(fnRegion.apply(image1.location()))
+              .status(Image.Status.AVAILABLE)
+              .operatingSystem(OperatingSystem.builder()
+                      .description("FEDORA")
+                      .family(OsFamily.FEDORA)
+                      .version("7")
+                      .is64Bit(true)
+                      .build())
+              .build();
+
+      assertEquals(actual1, expected1);
+
+      org.jclouds.profitbricks.domain.Image image2
+              = org.jclouds.profitbricks.domain.Image.builder()
+              .id("457bf707-d5d1-11e3-8b4f-52540066fee9")
+              .name("clearos-community-6.5.0-x86_64.iso")
+              .size(2048f)
+              .type(org.jclouds.profitbricks.domain.Image.Type.CDROM)
+              .location(Location.DE_FKB)
+              .osType(OsType.LINUX)
+              .build();
+
+      Image actual2 = fnImage.apply(image2);
+
+      Image expected2 = new ImageBuilder()
+              .ids(image2.id())
+              .name(image2.name())
+              .location(fnRegion.apply(image2.location()))
+              .status(Image.Status.AVAILABLE)
+              .operatingSystem(OperatingSystem.builder()
+                      .description("UNRECOGNIZED")
+                      .family(OsFamily.UNRECOGNIZED)
+                      .version("6.5.0")
+                      .is64Bit(true)
+                      .build())
+              .build();
+
+      assertEquals(actual2, expected2);
+
+      org.jclouds.profitbricks.domain.Image image3
+              = org.jclouds.profitbricks.domain.Image.builder()
+              .id("e54af701-53b8-11e3-8f17-52540066fee9")
+              .name("windows-2008-r2-server-setup.iso")
+              .size(2048f)
+              .type(org.jclouds.profitbricks.domain.Image.Type.CDROM)
+              .location(Location.US_LASDEV)
+              .osType(OsType.WINDOWS)
+              .build();
+
+      Image actual3 = fnImage.apply(image3);
+
+      Image expected3 = new ImageBuilder()
+              .ids(image3.id())
+              .name(image3.name())
+              .location(fnRegion.apply(image3.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() {
+      Snapshot snapshot1 = Snapshot.builder()
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+              .name("placeholder-snapshot-04/13/2015")
+              .description("Created from \"placeholder\" in Data Center \"sbx-computeservice\"")
+              .size(2048f)
+              .location(Location.US_LAS)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .creationTime(new Date(2015, 4, 13))
+              .lastModificationTime(new Date())
+              .state(ProvisioningState.AVAILABLE)
+              .build();
+
+      Image actual1 = fnImage.apply(snapshot1);
+
+      Image expected1 = new ImageBuilder()
+              .ids(snapshot1.id())
+              .name(snapshot1.name())
+              .location(fnRegion.apply(Location.US_LAS))
+              .status(Image.Status.AVAILABLE)
+              .operatingSystem(OperatingSystem.builder()
+                      .description(snapshot1.description())
+                      .family(OsFamily.LINUX)
+                      .is64Bit(true)
+                      .build())
+              .build();
+
+      assertEquals(actual1, expected1);
+
+      Snapshot snapshot2 = Snapshot.builder()
+              .isBootable(true)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(false)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .id("d80bf9c0-ce6e-4283-9ea4-2906635f6137")
+              .name("jclouds-ubuntu14.10-template")
+              .description("Created from \"jclouds-ubuntu14.10 Storage\" in Data Center \"jclouds-computeservice\"")
+              .size(10240f)
+              .location(Location.DE_FKB)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .osType(OsType.LINUX)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(false)
+              .creationTime(new Date(2015, 4, 13))
+              .lastModificationTime(new Date())
+              .state(ProvisioningState.INPROCESS)
+              .build();
+
+      Image actual2 = fnImage.apply(snapshot2);
+
+      Image expected2 = new ImageBuilder()
+              .ids(snapshot2.id())
+              .name(snapshot2.name())
+              .location(fnRegion.apply(Location.DE_FKB))
+              .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/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
new file mode 100644
index 0000000..5fba62b
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/ServerToNodeMetadataTest.java
@@ -0,0 +1,184 @@
+/*
+ * 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.function;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.util.Set;
+
+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 org.jclouds.profitbricks.ProfitBricksApiMetadata;
+import org.jclouds.profitbricks.domain.AvailabilityZone;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.Nic;
+import org.jclouds.profitbricks.domain.OsType;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Storage;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+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;
+
+@Test(groups = "unit", testName = "ServerToNodeMetadataTest")
+public class ServerToNodeMetadataTest {
+
+   private ServerToNodeMetadata fnNodeMetadata;
+
+   @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("12345678-abcd-efgh-ijkl-987654321000")
+                    .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);
+
+      this.fnNodeMetadata = new ServerToNodeMetadata(new StorageToVolume(), locationsSupply, namingConvention);
+   }
+
+   @Test
+   public void testServerToNodeMetadata() {
+      Server server = Server.builder()
+              .dataCenter(DataCenter.builder()
+                      .id("12345678-abcd-efgh-ijkl-987654321000").version(10)
+                      .build())
+              .id("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+              .name("mock-facebook-node")
+              .cores(4)
+              .ram(4096)
+              .hasInternetAccess(true)
+              .state(ProvisioningState.AVAILABLE)
+              .status(Server.Status.RUNNING)
+              .osType(OsType.LINUX)
+              .availabilityZone(AvailabilityZone.AUTO)
+              .isCpuHotPlug(true)
+              .isRamHotPlug(true)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .storages(ImmutableList.<Storage>of(
+                              Storage.builder()
+                              .bootDevice(true)
+                              .busType(Storage.BusType.VIRTIO)
+                              .deviceNumber(1)
+                              .size(40f)
+                              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+                              .name("facebook-storage")
+                              .build()
+                      )
+              )
+              .nics(ImmutableList.<Nic>of(
+                              Nic.builder()
+                              .id("qwqwqwqw-wewe-erer-rtrt-tytytytytyty")
+                              .lanId(1)
+                              .dataCenterId("12345678-abcd-efgh-ijkl-987654321000")
+                              .internetAccess(true)
+                              .serverId("qwertyui-qwer-qwer-qwer-qwertyyuiiop")
+                              .macAddress("02:01:09:cd:f0:b0")
+                              .ip("173.252.120.6")
+                              .build()
+                      )
+              )
+              .build();
+
+      NodeMetadata expected = fnNodeMetadata.apply(server);
+      assertNotNull(expected);
+
+      NodeMetadata actual = new NodeMetadataBuilder()
+              .group("mock")
+              .ids(server.id())
+              .name(server.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.ram())
+                      .processor(new Processor(server.cores(), 1d))
+                      .hypervisor("kvm")
+                      .volume(new VolumeBuilder()
+                              .bootDevice(true)
+                              .size(40f)
+                              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+                              .durable(true)
+                              .type(Volume.Type.LOCAL)
+                              .build())
+                      .build())
+              .operatingSystem(new OperatingSystem.Builder()
+                      .description(OsFamily.LINUX.value())
+                      .family(OsFamily.LINUX)
+                      .build())
+              .location(new LocationBuilder()
+                      .id("12345678-abcd-efgh-ijkl-987654321000")
+                      .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/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/StorageToVolumeTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/StorageToVolumeTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/StorageToVolumeTest.java
new file mode 100644
index 0000000..8a782e7
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/function/StorageToVolumeTest.java
@@ -0,0 +1,61 @@
+/*
+ * 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.function;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.compute.domain.Volume;
+import org.jclouds.compute.domain.VolumeBuilder;
+import org.jclouds.profitbricks.domain.Storage;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "StorageToVolumeTest")
+public class StorageToVolumeTest {
+
+   private StorageToVolume fnVolume;
+
+   @BeforeTest
+   public void setup() {
+      this.fnVolume = new StorageToVolume();
+   }
+
+   @Test
+   public void testStorageToVolume() {
+      Storage storage = Storage.builder()
+              .id("qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh")
+              .size(40)
+              .name("hdd-1")
+              .busType(Storage.BusType.VIRTIO)
+              .bootDevice(true)
+              .deviceNumber(1)
+              .build();
+
+      Volume actual = fnVolume.apply(storage);
+
+      Volume expected = new VolumeBuilder()
+              .id(storage.id())
+              .size(40f)
+              .bootDevice(true)
+              .device("1")
+              .type(Volume.Type.LOCAL)
+              .durable(true)
+              .build();
+
+      assertEquals(actual, expected);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
index 857a8ff..690412a 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
@@ -136,10 +136,10 @@ public class ProvisioningStatusPollingPredicateTest extends BaseProfitBricksMock
          server.shutdown();
       }
    }
-   
+
    @Test
-   public void testSnapshotPredicate() throws Exception{
-        MockWebServer server = mockWebServer();
+   public void testSnapshotPredicate() throws Exception {
+      MockWebServer server = mockWebServer();
 
       byte[] payloadInProcess = payloadFromResource("/snapshot/snapshot-state-inprocess.xml");
       byte[] payloadAvailable = payloadFromResource("/snapshot/snapshot.xml");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
index 20cf5f8..8e84746 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/DrivesApiLiveTest.java
@@ -16,16 +16,15 @@
  */
 package org.jclouds.profitbricks.features;
 
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+
 import java.util.List;
 
 import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
 import org.jclouds.profitbricks.domain.Drive;
 import org.jclouds.profitbricks.domain.Image;
 import org.jclouds.profitbricks.domain.Server;
-
-import static org.testng.Assert.assertFalse;
-import static org.testng.Assert.assertNotNull;
-
 import org.testng.annotations.Test;
 
 import com.google.common.collect.Iterables;
@@ -67,7 +66,7 @@ public class DrivesApiLiveTest extends BaseProfitBricksLiveTest {
       assertNotNull(requestId);
    }
 
-   @Test (dependsOnMethods = "addRomDriveToServerTest")
+   @Test(dependsOnMethods = "addRomDriveToServerTest")
    public void removeRomDriveFromServerTest() {
       String requestId = api.drivesApi().removeRomDriveFromServer(imageId, serverId);
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
index cd38494..ddf94d4 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/FirewallApiLiveTest.java
@@ -16,7 +16,6 @@
  */
 package org.jclouds.profitbricks.features;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 
 import java.util.List;
@@ -41,6 +40,7 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
 
 @Test(groups = "live", testName = "FirewallApiLiveTest", singleThreaded = true)
 public class FirewallApiLiveTest extends BaseProfitBricksLiveTest {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
index 227cfc7..e7c2eda 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiLiveTest.java
@@ -47,7 +47,7 @@ public class IpBlockApiLiveTest extends BaseProfitBricksLiveTest {
 
    @Test
    public void testReservePublicIpBlock() {
-      newIpBlock = api.ipBlockApi().reservePublicIpBlock("2", Location.US_LAS.value());
+      newIpBlock = api.ipBlockApi().reservePublicIpBlock("2", Location.US_LAS.getId());
 
       assertNotNull(newIpBlock);
       assertNotNull(newIpBlock.ips());

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
index b0d3356..e948e76 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/IpBlockApiMockTest.java
@@ -122,9 +122,9 @@ public class IpBlockApiMockTest extends BaseProfitBricksMockTest {
       String blockSize = "2";
       Location location = Location.US_LAS;
 
-      String content = "<ws:reservePublicIpBlock><request><blockSize>" + blockSize + "</blockSize><location>" + location.value() + "</location></request></ws:reservePublicIpBlock>";
+      String content = "<ws:reservePublicIpBlock><request><blockSize>" + blockSize + "</blockSize><location>" + location.getId() + "</location></request></ws:reservePublicIpBlock>";
       try {
-         IpBlock ipBlock = api.reservePublicIpBlock(blockSize, location.value());
+         IpBlock ipBlock = api.reservePublicIpBlock(blockSize, location.getId());
          assertRequestHasCommonProperties(server.takeRequest(), content);
          assertNotNull(ipBlock);
       } finally {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
index a79f9ae..d5e64cf 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
@@ -128,7 +128,7 @@ public class LoadbalancerApiLiveTest extends BaseProfitBricksLiveTest {
 
    @AfterClass(alwaysRun = true)
    public void testDeleteLoadBalancer() {
-      boolean result = api.loadBalancerApi().deleteLoadbalancer(loadBalancerID);
+      boolean result = api.loadBalancerApi().deleteLoadBalancer(loadBalancerID);
 
       Assert.assertTrue(result);
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
index f91083a..1271244 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
@@ -273,7 +273,7 @@ public class LoadbalancerApiMockTest extends BaseProfitBricksMockTest {
       String content = "<ws:deleteLoadBalancer><loadBalancerId>" + loadBalancerId + "</loadBalancerId></ws:deleteLoadBalancer>";
 
       try {
-         boolean done = api.deleteLoadbalancer(loadBalancerId);
+         boolean done = api.deleteLoadBalancer(loadBalancerId);
 
          assertRequestHasCommonProperties(server.takeRequest(), content);
          assertTrue(done);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/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 957555b..6c50f2a 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
@@ -89,20 +89,20 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
       String newName = "new name";
 
       api.snapshotApi().updateSnapshot(Snapshot.Request.updatingBuilder()
-	      .snapshotId(snapshotId)
-	      .description("new description")
-	      .name(newName)
-	      .bootable(true)
-	      .osType(OsType.LINUX)
-	      .cpuHotplug(true)
-	      .cpuHotunplug(true)
-	      .discVirtioHotplug(true)
-	      .discVirtioHotunplug(true)
-	      .nicHotplug(true)
-	      .nicHotunplug(true)
-	      .ramHotplug(true)
-	      .ramHotunplug(true)
-	      .build());
+              .snapshotId(snapshotId)
+              .description("new description")
+              .name(newName)
+              .bootable(true)
+              .osType(OsType.LINUX)
+              .isCpuHotPlug(true)
+              .isCpuHotUnPlug(true)
+              .isDiscVirtioHotPlug(true)
+              .isDiscVirtioHotUnPlug(true)
+              .isNicHotPlug(true)
+              .isNicHotUnPlug(true)
+              .isRamHotPlug(true)
+              .isRamHotUnPlug(true)
+              .build());
 
       Snapshot snapshot = api.snapshotApi().getSnapshot(snapshotId);
 
@@ -126,7 +126,7 @@ public class SnapshotApiLiveTest extends BaseProfitBricksLiveTest {
 
    private void initializeWaitPredicate() {
       this.snapshotWaitingPredicate = Predicates2.retry(
-	      new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.SNAPSHOT, ProvisioningState.AVAILABLE),
-	      2l * 60l, 2l, TimeUnit.SECONDS);
+              new ProvisioningStatusPollingPredicate(api, ProvisioningStatusAware.SNAPSHOT, ProvisioningState.AVAILABLE),
+              2l * 60l, 2l, TimeUnit.SECONDS);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
index 80342b0..528f893 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/SnapshotApiMockTest.java
@@ -47,13 +47,13 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
       SnapshotApi api = pbApi.snapshotApi();
 
       try {
-	 List<Snapshot> snapshots = api.getAllSnapshots();
-	 assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllSnapshots/>");
-	 assertNotNull(snapshots);
-	 assertEquals(snapshots.size(), 2);
+         List<Snapshot> snapshots = api.getAllSnapshots();
+         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllSnapshots/>");
+         assertNotNull(snapshots);
+         assertEquals(snapshots.size(), 2);
       } finally {
-	 pbApi.close();
-	 server.shutdown();
+         pbApi.close();
+         server.shutdown();
       }
    }
 
@@ -66,12 +66,12 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
       SnapshotApi api = pbApi.snapshotApi();
 
       try {
-	 List<Snapshot> snapshots = api.getAllSnapshots();
-	 assertRequestHasCommonProperties(server.takeRequest());
-	 assertTrue(snapshots.isEmpty());
+         List<Snapshot> snapshots = api.getAllSnapshots();
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertTrue(snapshots.isEmpty());
       } finally {
-	 pbApi.close();
-	 server.shutdown();
+         pbApi.close();
+         server.shutdown();
       }
    }
 
@@ -88,13 +88,13 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
       String content = "<ws:getSnapshot><snapshotId>" + id + "</snapshotId></ws:getSnapshot>";
 
       try {
-	 Snapshot snapshot = api.getSnapshot(id);
-	 assertRequestHasCommonProperties(server.takeRequest(), content);
-	 assertNotNull(snapshot);
-	 assertEquals(snapshot.id(), id);
+         Snapshot snapshot = api.getSnapshot(id);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(snapshot);
+         assertEquals(snapshot.id(), id);
       } finally {
-	 pbApi.close();
-	 server.shutdown();
+         pbApi.close();
+         server.shutdown();
       }
    }
 
@@ -108,12 +108,12 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
 
       String id = "random-non-existing-id";
       try {
-	 Snapshot snapshot = api.getSnapshot(id);
-	 assertRequestHasCommonProperties(server.takeRequest());
-	 assertNull(snapshot);
+         Snapshot snapshot = api.getSnapshot(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(snapshot);
       } finally {
-	 pbApi.close();
-	 server.shutdown();
+         pbApi.close();
+         server.shutdown();
       }
    }
 
@@ -128,27 +128,27 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
       String storageId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
 
       String content = "<ws:createSnapshot>"
-	      + "<request>"
-	      + "<storageId>" + storageId + "</storageId>"
-	      + "<description>description</description>"
-	      + "<snapshotName>snapshot-name</snapshotName>"
-	      + "</request>"
-	      + "</ws:createSnapshot>";
+              + "<request>"
+              + "<storageId>" + storageId + "</storageId>"
+              + "<description>description</description>"
+              + "<snapshotName>snapshot-name</snapshotName>"
+              + "</request>"
+              + "</ws:createSnapshot>";
 
       try {
-	 Snapshot snapshot = api.createSnapshot(
-		 Snapshot.Request.creatingBuilder()
-		 .storageId(storageId)
-		 .description("description")
-		 .name("snapshot-name")
-		 .build());
-	 assertRequestHasCommonProperties(server.takeRequest(), content);
-	 assertNotNull(snapshot.id());
-	 assertEquals(snapshot.id(), "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
+         Snapshot snapshot = api.createSnapshot(
+                 Snapshot.Request.creatingBuilder()
+                 .storageId(storageId)
+                 .description("description")
+                 .name("snapshot-name")
+                 .build());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(snapshot.id());
+         assertEquals(snapshot.id(), "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
 
       } finally {
-	 pbApi.close();
-	 server.shutdown();
+         pbApi.close();
+         server.shutdown();
       }
    }
 
@@ -163,35 +163,43 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
       String snapshotId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
 
       String content = "<ws:updateSnapshot>"
-	      + "<request>"
-	      + "<snapshotId>" + snapshotId + "</snapshotId>"
-	      + "<description>description</description>"
-	      + "<snapshotName>snapshot-name</snapshotName>"
-	      + "<bootable>false</bootable>"
-	      + "<osType>LINUX</osType>"
-	      + "<cpuHotPlug>false</cpuHotPlug>"
-	      + "<cpuHotUnPlug>false</cpuHotUnPlug>"
-	      + "<ramHotPlug>false</ramHotPlug>"
-	      + "<ramHotUnPlug>false</ramHotUnPlug>"
-	      + "<nicHotPlug>false</nicHotPlug>"
-	      + "<nicHotUnPlug>false</nicHotUnPlug>"
-	      + "<discVirtioHotPlug>false</discVirtioHotPlug>"
-	      + "<discVirtioHotUnPlug>false</discVirtioHotUnPlug>"
-	      + "</request>"
-	      + "</ws:updateSnapshot>";
+              + "<request>"
+              + "<snapshotId>" + snapshotId + "</snapshotId>"
+              + "<description>description</description>"
+              + "<snapshotName>snapshot-name</snapshotName>"
+              + "<bootable>false</bootable>"
+              + "<osType>LINUX</osType>"
+              + "<cpuHotPlug>false</cpuHotPlug>"
+              + "<cpuHotUnPlug>false</cpuHotUnPlug>"
+              + "<ramHotPlug>false</ramHotPlug>"
+              + "<ramHotUnPlug>false</ramHotUnPlug>"
+              + "<nicHotPlug>false</nicHotPlug>"
+              + "<nicHotUnPlug>false</nicHotUnPlug>"
+              + "<discVirtioHotPlug>false</discVirtioHotPlug>"
+              + "<discVirtioHotUnPlug>false</discVirtioHotUnPlug>"
+              + "</request>"
+              + "</ws:updateSnapshot>";
 
       try {
-	 String requestId = api.updateSnapshot(Snapshot.Request.updatingBuilder()
-		 .snapshotId(snapshotId)
-		 .name("snapshot-name")
-		 .description("description")
-		 .osType(OsType.LINUX)
-		 .build());
-	 assertRequestHasCommonProperties(server.takeRequest(), content);
-	 assertNotNull(requestId);
+         String requestId = api.updateSnapshot(Snapshot.Request.updatingBuilder()
+                 .snapshotId(snapshotId)
+                 .name("snapshot-name")
+                 .description("description")
+                 .osType(OsType.LINUX)
+                 .isCpuHotPlug(false)
+                 .isCpuHotUnPlug(false)
+                 .isDiscVirtioHotPlug(false)
+                 .isDiscVirtioHotUnPlug(false)
+                 .isNicHotPlug(false)
+                 .isNicHotUnPlug(false)
+                 .isRamHotPlug(false)
+                 .isRamHotUnPlug(false)
+                 .build());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(requestId);
       } finally {
-	 pbApi.close();
-	 server.shutdown();
+         pbApi.close();
+         server.shutdown();
       }
    }
 
@@ -207,12 +215,12 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
       String content = "<ws:deleteSnapshot><snapshotId>" + snapshotId + "</snapshotId></ws:deleteSnapshot>";
 
       try {
-	 boolean result = api.deleteSnapshot(snapshotId);
-	 assertRequestHasCommonProperties(server.takeRequest(), content);
-	 assertTrue(result);
+         boolean result = api.deleteSnapshot(snapshotId);
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(result);
       } finally {
-	 pbApi.close();
-	 server.shutdown();
+         pbApi.close();
+         server.shutdown();
       }
    }
 
@@ -226,12 +234,12 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
 
       String id = "random-non-existing-id";
       try {
-	 boolean result = api.deleteSnapshot(id);
-	 assertRequestHasCommonProperties(server.takeRequest());
-	 Assert.assertFalse(result);
+         boolean result = api.deleteSnapshot(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         Assert.assertFalse(result);
       } finally {
-	 pbApi.close();
-	 server.shutdown();
+         pbApi.close();
+         server.shutdown();
       }
    }
 
@@ -248,15 +256,15 @@ public class SnapshotApiMockTest extends BaseProfitBricksMockTest {
 
       String content = "<ws:rollbackSnapshot><request><snapshotId>" + snapshotId + "</snapshotId><storageId>" + storageId + "</storageId></request></ws:rollbackSnapshot>";
       try {
-	 String result = api.rollbackSnapshot(Snapshot.Request.rollbackBuilder()
-		 .snapshotId(snapshotId)
-		 .storageId(storageId)
-		 .build());
-	 assertRequestHasCommonProperties(server.takeRequest(), content);
-	 assertNotNull(result);
+         String result = api.rollbackSnapshot(Snapshot.Request.rollbackBuilder()
+                 .snapshotId(snapshotId)
+                 .storageId(storageId)
+                 .build());
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(result);
       } finally {
-	 pbApi.close();
-	 server.shutdown();
+         pbApi.close();
+         server.shutdown();
       }
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
index e2ee87e..16b2504 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/datacenter/DataCenterInfoResponseHandlerTest.java
@@ -19,8 +19,7 @@ package org.jclouds.profitbricks.http.parser.datacenter;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+import org.jclouds.date.DateService;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
 import org.jclouds.profitbricks.domain.DataCenter;
@@ -44,8 +43,8 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
       return factory.create(injector.getInstance(DataCenterInfoResponseHandler.class));
    }
 
-   protected DateCodecFactory createDateParser() {
-      return injector.getInstance(DateCodecFactory.class);
+   protected DateService createDateParser() {
+      return injector.getInstance(DateService.class);
    }
 
    @Test
@@ -55,7 +54,7 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
       DataCenter actual = parser.parse(payloadFromResource("/datacenter/datacenter.xml"));
       assertNotNull(actual, "Parsed content returned null");
 
-      DateCodec dateParser = createDateParser().iso8601();
+      DateService dateParser = createDateParser();
 
       DataCenter expected = DataCenter.builder()
               .id("12345678-abcd-efgh-ijkl-987654321000")
@@ -65,6 +64,11 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
               .location(Location.US_LAS)
               .servers(ImmutableList.<Server>of(
                               Server.builder()
+                              .dataCenter(DataCenter.builder()
+                                      .id("12345678-abcd-efgh-ijkl-987654321000")
+                                      .version(10)
+                                      .build()
+                              )
                               .id("qqqqqqqq-wwww-eeee-rrrr-tttttttttttt")
                               .name("jnode1")
                               .cores(4)
@@ -72,8 +76,8 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
                               .hasInternetAccess(true)
                               .state(ProvisioningState.AVAILABLE)
                               .status(Server.Status.RUNNING)
-                              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
-                              .lastModificationTime(dateParser.toDate("2014-12-12T03:08:35.629Z"))
+                              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
+                              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:08:35.629Z"))
                               .osType(OsType.LINUX)
                               .availabilityZone(AvailabilityZone.AUTO)
                               .isCpuHotPlug(true)
@@ -125,8 +129,8 @@ public class DataCenterInfoResponseHandlerTest extends BaseResponseHandlerTest<D
                               .size(40)
                               .name("jnode1-disk1")
                               .state(ProvisioningState.AVAILABLE)
-                              .creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
-                              .lastModificationTime(dateParser.toDate("2014-12-12T03:14:48.316Z"))
+                              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
+                              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-12T03:14:48.316Z"))
                               .serverIds(ImmutableList.of(
                                               "qqqqqqqq-wwww-eeee-rrrr-tttttttttttt"
                                       ))

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
index 7d0cb88..e954fb0 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/image/ImageListResponseHandlerTest.java
@@ -91,7 +91,7 @@ public class ImageListResponseHandlerTest extends BaseResponseHandlerTest<List<I
               .name("Debian-jessie-prerelease-server-2015-01-01")
               .size(2048f)
               .type(Image.Type.HDD)
-              .location(Location.US_LAS_DEV)
+              .location(Location.US_LASDEV)
               .isNicHotPlug(true)
               .isNicHotUnPlug(true)
               .osType(OsType.LINUX)
@@ -110,7 +110,7 @@ public class ImageListResponseHandlerTest extends BaseResponseHandlerTest<List<I
               .name("Fedora-19-server-2015-01-01")
               .size(2048f)
               .type(Image.Type.HDD)
-              .location(Location.US_LAS_DEV)
+              .location(Location.US_LASDEV)
               .isNicHotPlug(true)
               .isNicHotUnPlug(true)
               .osType(OsType.LINUX)
@@ -129,7 +129,7 @@ public class ImageListResponseHandlerTest extends BaseResponseHandlerTest<List<I
               .name("Ubuntu-12.04-LTS-server-2015-01-01")
               .size(2048f)
               .type(Image.Type.HDD)
-              .location(Location.US_LAS_DEV)
+              .location(Location.US_LASDEV)
               .isNicHotPlug(true)
               .isNicHotUnPlug(true)
               .osType(OsType.LINUX)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ed247e7d/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
index cec0999..eedfa50 100644
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandlerTest.java
@@ -17,9 +17,9 @@
 package org.jclouds.profitbricks.http.parser.loadbalancer;
 
 import com.google.common.collect.ImmutableList;
+
 import java.util.List;
-import org.jclouds.date.DateCodec;
-import org.jclouds.date.DateCodecFactory;
+
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.profitbricks.domain.Firewall;
 import org.jclouds.profitbricks.domain.LoadBalancer;
@@ -27,8 +27,12 @@ import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
 import org.jclouds.profitbricks.domain.ProvisioningState;
 import org.jclouds.profitbricks.domain.Server;
 import org.jclouds.profitbricks.http.parser.BaseResponseHandlerTest;
+
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.date.DateService;
+import org.jclouds.profitbricks.domain.DataCenter;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "LoadBalancerListResponseHandlerTest")
@@ -39,8 +43,8 @@ public class LoadBalancerListResponseHandlerTest extends BaseResponseHandlerTest
       return factory.create(injector.getInstance(LoadBalancerListResponseHandler.class));
    }
 
-   protected DateCodecFactory createDateParser() {
-      return injector.getInstance(DateCodecFactory.class);
+   protected DateService createDateParser() {
+      return injector.getInstance(DateService.class);
    }
 
    @Test
@@ -50,23 +54,68 @@ public class LoadBalancerListResponseHandlerTest extends BaseResponseHandlerTest
       List<LoadBalancer> actual = parser.parse(payloadFromResource("/loadbalancer/loadbalancers.xml"));
       assertNotNull(actual, "Parsed content returned null");
 
-      DateCodec dateParser = createDateParser().iso8601();
+      DateService dateParser = createDateParser();
 
-      List<LoadBalancer> expected = ImmutableList.<LoadBalancer>of(LoadBalancer.builder().id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee").loadBalancerAlgorithm(Algorithm.ROUND_ROBIN).name("load-1234567890-name")
-              .dataCenterId("datacenter-id").dataCenterVersion("datacenter-version").internetAccess(true).ip("192.168.0.1").lanId("lan-id").state(ProvisioningState.AVAILABLE).creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z")).lastModificationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+      List<LoadBalancer> expected = ImmutableList.<LoadBalancer>of(
+              LoadBalancer.builder()
+              .id("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
+              .algorithm(Algorithm.ROUND_ROBIN)
+              .name("load-1234567890-name")
+              .dataCenter(DataCenter.builder()
+                      .id("datacenter-id")
+                      .version(4)
+                      .build())
+              .internetAccess(true)
+              .ip("192.168.0.1")
+              .lanId("lan-id")
+              .state(ProvisioningState.AVAILABLE)
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
               .firewalls(ImmutableList.<Firewall>of(
-                              Firewall.builder().id("firewall-id").nicId("nic-id").active(false).state(ProvisioningState.AVAILABLE).build()
+                              Firewall.builder()
+                              .id("firewall-id")
+                              .nicId("nic-id")
+                              .active(false)
+                              .state(ProvisioningState.AVAILABLE)
+                              .build()
                       ))
               .balancedServers(ImmutableList.<Server>of(
-                              Server.builder().activate(true).balancedNicId("balanced-nic-id").id("server-id").name("server-name").build()
+                              Server.builder()
+                              .loadBalanced(true)
+                              .balancedNicId("balanced-nic-id")
+                              .id("server-id")
+                              .name("server-name")
+                              .build()
                       )).build(),
-              LoadBalancer.builder().id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy").loadBalancerAlgorithm(Algorithm.ROUND_ROBIN).name("load-balancer-name")
-              .dataCenterId("datacenter-id").dataCenterVersion("datacenter-version").internetAccess(false).ip("192.168.0.1").lanId("lan-id").state(ProvisioningState.AVAILABLE).creationTime(dateParser.toDate("2014-12-04T07:09:23.138Z")).lastModificationTime(dateParser.toDate("2014-12-04T07:09:23.138Z"))
+              LoadBalancer.builder()
+              .id("qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy")
+              .algorithm(Algorithm.ROUND_ROBIN)
+              .name("load-balancer-name")
+              .dataCenter(DataCenter.builder()
+                      .id("datacenter-id")
+                      .version(4)
+                      .build())
+              .internetAccess(false)
+              .ip("192.168.0.1")
+              .lanId("lan-id")
+              .state(ProvisioningState.AVAILABLE)
+              .creationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
+              .lastModificationTime(dateParser.iso8601DateOrSecondsDateParse("2014-12-04T07:09:23.138Z"))
               .firewalls(ImmutableList.<Firewall>of(
-                              Firewall.builder().id("firewall-id").nicId("nic-id").active(false).state(ProvisioningState.AVAILABLE).build()
+                              Firewall.builder()
+                              .id("firewall-id")
+                              .nicId("nic-id")
+                              .active(false)
+                              .state(ProvisioningState.AVAILABLE)
+                              .build()
                       ))
               .balancedServers(ImmutableList.<Server>of(
-                              Server.builder().activate(false).balancedNicId("balanced-nic-id").id("server-id").name("server-name").build()
+                              Server.builder()
+                              .loadBalanced(false)
+                              .balancedNicId("balanced-nic-id")
+                              .id("server-id")
+                              .name("server-name")
+                              .build()
                       ))
               .build()
       );


[20/35] jclouds git commit: JClouds Profitbricks provider - LoadBalancer API

Posted by de...@apache.org.
JClouds Profitbricks provider - LoadBalancer API


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

Branch: refs/heads/master
Commit: 23f158f32259718e734f0434e2ba4b05c0485011
Parents: f8f82cc
Author: jasminSPC <ja...@stackpointcloud.com>
Authored: Fri Apr 10 15:29:06 2015 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Apr 13 11:46:55 2015 +0200

----------------------------------------------------------------------
 .../jclouds/profitbricks/ProfitBricksApi.java   |   5 +
 .../CreateLoadBalancerRequestBinder.java        |  51 +++
 .../DeregisterLoadBalancerRequestBinder.java    |  45 ++
 .../RegisterLoadBalancerRequestBinder.java      |  47 +++
 .../UpdateLoadBalancerRequestBinder.java        |  44 ++
 .../profitbricks/domain/LoadBalancer.java       | 406 +++++++++++++++++++
 .../org/jclouds/profitbricks/domain/Server.java |  27 +-
 .../profitbricks/features/LoadBalancerApi.java  |  90 ++++
 .../firewall/FirewallListResponseHandler.java   |   9 +-
 .../BaseLoadBalancerResponseHandler.java        | 111 +++++
 .../LoadBalancerListResponseHandler.java        |  70 ++++
 .../LoadBalancerResponseHandler.java            |  65 +++
 .../server/BaseServerResponseHandler.java       |  20 +-
 .../server/ServerListResponseHandler.java       |   2 +-
 .../CreateLoadBalancerRequestBinderTest.java    |  54 +++
 ...DeregisterLoadBalancerRequestBinderTest.java |  52 +++
 .../RegisterLoadBalancerRequestBinderTest.java  |  52 +++
 .../UpdateLoadBalancerRequestBinderTest.java    |  54 +++
 .../features/LoadbalancerApiLiveTest.java       | 135 ++++++
 .../features/LoadbalancerApiMockTest.java       | 285 +++++++++++++
 .../LoadBalancerListResponseHandlerTest.java    |  75 ++++
 .../LoadBalancerResponseHandlerTest.java        |  93 +++++
 .../server/ServerInfoResponseHandlerTest.java   |   2 +
 .../server/ServerListResponseHandlerTest.java   |   4 +
 .../loadbalancer/loadbalancer-create.xml        |  17 +
 .../loadbalancer/loadbalancer-delete.xml        |  12 +
 .../loadbalancer/loadbalancer-deregister.xml    |  14 +
 .../loadbalancer/loadbalancer-register.xml      |  13 +
 .../loadbalancer/loadbalancer-update.xml        |  15 +
 .../resources/loadbalancer/loadbalancer.xml     |  32 ++
 .../resources/loadbalancer/loadbalancers.xml    |  57 +++
 .../src/test/resources/server/server.xml        |   2 +
 .../src/test/resources/server/servers.xml       |   4 +
 33 files changed, 1950 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
index 12da7ea..8755ed9 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/ProfitBricksApi.java
@@ -21,7 +21,9 @@ import org.jclouds.profitbricks.features.DataCenterApi;
 import org.jclouds.profitbricks.features.DrivesApi;
 import org.jclouds.profitbricks.features.FirewallApi;
 import org.jclouds.profitbricks.features.ImageApi;
+
 import org.jclouds.profitbricks.features.IpBlockApi;
+import org.jclouds.profitbricks.features.LoadBalancerApi;
 import org.jclouds.profitbricks.features.NicApi;
 import org.jclouds.profitbricks.features.ServerApi;
 import org.jclouds.profitbricks.features.SnapshotApi;
@@ -56,4 +58,7 @@ public interface ProfitBricksApi extends Closeable {
 
    @Delegate
    DrivesApi drivesApi();
+
+   @Delegate
+   LoadBalancerApi loadBalancerApi();
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
new file mode 100644
index 0000000..23e121e
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinder.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.binder.loadbalancer;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+
+import static java.lang.String.format;
+
+public class CreateLoadBalancerRequestBinder extends BaseProfitBricksRequestBinder<LoadBalancer.Request.CreatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   CreateLoadBalancerRequestBinder() {
+      super("loadbalancer");
+      this.requestBuilder = new StringBuilder(128 * 4);
+   }
+
+   @Override
+   protected String createPayload(LoadBalancer.Request.CreatePayload payload) {
+      requestBuilder.append("<ws:createLoadBalancer>")
+              .append("<request>")
+              .append(format("<dataCenterId>%s</dataCenterId>", payload.dataCenterId()))
+              .append(format("<loadBalancerName>%s</loadBalancerName>", payload.loadBalancerName()))
+              .append(format("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.loadBalancerAlgorithm()))
+              .append(format("<ip>%s</ip>", payload.ip()))
+              .append(format("<lanId>%s</lanId>", payload.lanId()));
+      for (String serverId : payload.serverIds()) {
+         requestBuilder.append(format("<serverIds>%s</serverIds>", serverId));
+      }
+      requestBuilder
+              .append("</request>")
+              .append("</ws:createLoadBalancer>");
+
+      return requestBuilder.toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
new file mode 100644
index 0000000..92f2868
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinder.java
@@ -0,0 +1,45 @@
+/*
+ * 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.binder.loadbalancer;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+
+public class DeregisterLoadBalancerRequestBinder extends BaseProfitBricksRequestBinder<LoadBalancer.Request.DeregisterPayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   DeregisterLoadBalancerRequestBinder() {
+      super("loadbalancer");
+      this.requestBuilder = new StringBuilder(128 * 4);
+   }
+
+   @Override
+   protected String createPayload(LoadBalancer.Request.DeregisterPayload payload) {
+      requestBuilder.append("<ws:deregisterServersOnLoadBalancer>")
+              .append("<request>");
+      for (String s : payload.serverIds()) {
+         requestBuilder.append(format("<serverIds>%s</serverIds>", s));
+      }
+      requestBuilder.append(format("<loadBalancerId>%s</loadBalancerId>", payload.id()))
+              .append("</request>")
+              .append("</ws:deregisterServersOnLoadBalancer>");
+
+      return requestBuilder.toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
new file mode 100644
index 0000000..2e437f0
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinder.java
@@ -0,0 +1,47 @@
+/*
+ * 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.binder.loadbalancer;
+
+import static java.lang.String.format;
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+
+public class RegisterLoadBalancerRequestBinder extends BaseProfitBricksRequestBinder<LoadBalancer.Request.RegisterPayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   RegisterLoadBalancerRequestBinder() {
+      super("loadbalancer");
+      this.requestBuilder = new StringBuilder(128 * 4);
+   }
+
+   @Override
+   protected String createPayload(LoadBalancer.Request.RegisterPayload payload) {
+      requestBuilder
+              .append("<ws:registerServersOnLoadBalancer>").append("<request>")
+              .append(format("<loadBalancerId>%s</loadBalancerId>", payload.id()));
+
+      for (String s : payload.serverIds()) {
+         requestBuilder.append(format("<serverIds>%s</serverIds>", s));
+      }
+      requestBuilder
+              .append("</request>")
+              .append("</ws:registerServersOnLoadBalancer>");
+
+      return requestBuilder.toString().replaceAll("\\s+", "");
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
new file mode 100644
index 0000000..0496655
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinder.java
@@ -0,0 +1,44 @@
+/*
+ * 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.binder.loadbalancer;
+
+import org.jclouds.profitbricks.binder.BaseProfitBricksRequestBinder;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+
+import static java.lang.String.format;
+
+public class UpdateLoadBalancerRequestBinder extends BaseProfitBricksRequestBinder<LoadBalancer.Request.UpdatePayload> {
+
+   protected final StringBuilder requestBuilder;
+
+   UpdateLoadBalancerRequestBinder() {
+      super("loadbalancer");
+      this.requestBuilder = new StringBuilder(128 * 4);
+   }
+
+   @Override
+   protected String createPayload(LoadBalancer.Request.UpdatePayload payload) {
+      return requestBuilder.append("<ws:updateLoadBalancer>")
+              .append("<request>")
+              .append(format("<loadBalancerId>%s</loadBalancerId>", payload.id()))
+              .append(formatIfNotEmpty("<loadBalancerName>%s</loadBalancerName>", payload.name()))
+              .append(formatIfNotEmpty("<loadBalancerAlgorithm>%s</loadBalancerAlgorithm>", payload.loadBalancerAlgorithm()))
+              .append(formatIfNotEmpty("<ip>%s</ip>", payload.ip()))
+              .append("</request>")
+              .append("</ws:updateLoadBalancer>").toString();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
new file mode 100644
index 0000000..bc118ea
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/LoadBalancer.java
@@ -0,0 +1,406 @@
+/*
+ * 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;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Enums;
+import static com.google.common.base.Preconditions.checkArgument;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import static com.google.common.net.InetAddresses.isInetAddress;
+import org.jclouds.javax.annotation.Nullable;
+
+import java.util.Date;
+import java.util.List;
+
+@AutoValue
+public abstract class LoadBalancer {
+
+   public enum Algorithm {
+
+      ROUND_ROBIN, UNRECOGNIZED;
+
+      public static Algorithm
+              fromValue(String value) {
+         return Enums.getIfPresent(Algorithm.class, value).or(UNRECOGNIZED);
+      }
+   }
+
+   @Nullable
+   public abstract String id();
+
+   @Nullable
+   public abstract String name();
+
+   @Nullable
+   public abstract Algorithm loadBalancerAlgorithm();
+
+   @Nullable
+   public abstract String dataCenterId();
+
+   @Nullable
+   public abstract String dataCenterVersion();
+
+   @Nullable
+   public abstract Boolean internetAccess();
+
+   @Nullable
+   public abstract String ip();
+
+   @Nullable
+   public abstract String lanId();
+
+   @Nullable
+   public abstract ProvisioningState state();
+
+   @Nullable
+   public abstract Date creationTime();
+
+   @Nullable
+   public abstract Date lastModificationTime();
+
+   @Nullable
+   public abstract List<Server> balancedServers();
+
+   @Nullable
+   public abstract List<Firewall> firewalls();
+
+   public static LoadBalancer create(String id, String name, Algorithm loadBalancerAlgorithm,
+           String dataCenterId, String dataCenterVersion, boolean internetAccess,
+           String ip, String lanId, ProvisioningState state, Date creationTime, Date lastModificationTime, List<Server> balancedServers, List<Firewall> firewalls) {
+      return new AutoValue_LoadBalancer(id, name, loadBalancerAlgorithm, dataCenterId, dataCenterVersion, internetAccess, ip, lanId, state, creationTime, lastModificationTime,
+              balancedServers != null ? ImmutableList.copyOf(balancedServers) : ImmutableList.<Server>of(),
+              firewalls != null ? ImmutableList.copyOf(firewalls) : ImmutableList.<Firewall>of());
+   }
+
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   private static void checkIp(String ip) {
+      if (ip != null)
+         checkArgument(isInetAddress(ip), "Invalid IP");
+   }
+
+   public static class Builder {
+
+      private String id;
+
+      private String name;
+
+      private Algorithm loadBalancerAlgorithm;
+
+      private String dataCenterId;
+
+      private String dataCenterVersion;
+
+      private boolean internetAccess;
+
+      private String ip;
+
+      private String lanId;
+
+      private ProvisioningState state;
+
+      private Date creationTime;
+
+      private Date lastModificationTime;
+
+      public List<Server> balancedServers;
+
+      private List<Firewall> firewalls;
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder loadBalancerAlgorithm(Algorithm loadBalancerAlgorithm) {
+         this.loadBalancerAlgorithm = loadBalancerAlgorithm;
+         return this;
+      }
+
+      public Builder dataCenterId(String dataCenterId) {
+         this.dataCenterId = dataCenterId;
+         return this;
+      }
+
+      public Builder dataCenterVersion(String dataCenterVersion) {
+         this.dataCenterVersion = dataCenterVersion;
+         return this;
+      }
+
+      public Builder internetAccess(boolean internetAccess) {
+         this.internetAccess = internetAccess;
+         return this;
+      }
+
+      public Builder ip(String ip) {
+         this.ip = ip;
+         return this;
+      }
+
+      public Builder lanId(String lanId) {
+         this.lanId = lanId;
+         return this;
+      }
+
+      public Builder creationTime(Date creationTime) {
+         this.creationTime = creationTime;
+         return this;
+      }
+
+      public Builder state(ProvisioningState state) {
+         this.state = state;
+         return this;
+      }
+
+      public Builder lastModificationTime(Date lastModificationTime) {
+         this.lastModificationTime = lastModificationTime;
+         return this;
+      }
+
+      public Builder balancedServers(List<Server> balancedServers) {
+         this.balancedServers = balancedServers;
+         return this;
+      }
+
+      public Builder firewalls(List<Firewall> firewalls) {
+         this.firewalls = firewalls;
+         return this;
+      }
+
+      public LoadBalancer build() {
+         checkIp(ip);
+         return LoadBalancer.create(id, name, loadBalancerAlgorithm, dataCenterId, dataCenterVersion, internetAccess, ip, lanId, state, creationTime, lastModificationTime, balancedServers, firewalls);
+      }
+
+      public Builder fromLoadBalancer(LoadBalancer in) {
+         return this.id(in.id()).name(in.name()).loadBalancerAlgorithm(in.loadBalancerAlgorithm())
+                 .dataCenterId(in.dataCenterId()).dataCenterVersion(in.dataCenterVersion()).internetAccess(in.internetAccess())
+                 .ip(in.ip()).lanId(in.lanId()).state(in.state()).creationTime(in.creationTime()).lastModificationTime(in.lastModificationTime()).balancedServers(in.balancedServers()).firewalls(in.firewalls());
+      }
+   }
+
+   public static final class Request {
+
+      public static CreatePayload.Builder creatingBuilder() {
+         return new CreatePayload.Builder();
+      }
+
+      public static UpdatePayload.Builder updatingBuilder() {
+         return new UpdatePayload.Builder();
+      }
+
+      public static RegisterPayload.Builder registerBuilder() {
+         return new RegisterPayload.Builder();
+      }
+
+      public static DeregisterPayload.Builder deregisterBuilder() {
+         return new DeregisterPayload.Builder();
+      }
+
+      @AutoValue
+      public abstract static class CreatePayload {
+
+         public abstract String dataCenterId();
+
+         public abstract String loadBalancerName();
+
+         public abstract Algorithm loadBalancerAlgorithm();
+
+         public abstract String ip();
+
+         public abstract String lanId();
+
+         public abstract List<String> serverIds();
+
+         public static CreatePayload create(String dataCenterId, String loadBalancerName, Algorithm loadBalancerAlgorithm, String ip, String lanId, List<String> serverIds) {
+            return new AutoValue_LoadBalancer_Request_CreatePayload(dataCenterId, loadBalancerName, loadBalancerAlgorithm, ip, lanId,
+                    serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList());
+         }
+
+         public static class Builder {
+
+            public String dataCenterId;
+            public String loadBalancerName;
+            public Algorithm loadBalancerAlgorithm;
+            public String ip;
+            public String lanId;
+            public List<String> serverIds;
+
+            public Builder dataCenterId(String dataCenterId) {
+               this.dataCenterId = dataCenterId;
+               return this;
+            }
+
+            public Builder loadBalancerName(String loadBalancerName) {
+               this.loadBalancerName = loadBalancerName;
+               return this;
+            }
+
+            public Builder loadBalancerAlgorithm(Algorithm loadBalancerAlgorithm) {
+               this.loadBalancerAlgorithm = loadBalancerAlgorithm;
+               return this;
+            }
+
+            public Builder ip(String ip) {
+               this.ip = ip;
+               return this;
+            }
+
+            public Builder lanId(String lanId) {
+               this.lanId = lanId;
+               return this;
+            }
+
+            public Builder serverIds(List<String> serverIds) {
+               this.serverIds = serverIds;
+               return this;
+            }
+
+            public CreatePayload build() {
+               checkIp(ip);
+               return CreatePayload.create(dataCenterId, loadBalancerName, loadBalancerAlgorithm, ip, lanId, serverIds);
+            }
+         }
+      }
+
+      @AutoValue
+      public abstract static class RegisterPayload {
+
+         public abstract List<String> serverIds();
+
+         public abstract String id();
+
+         public static RegisterPayload create(List<String> serverIds, String id) {
+            return new AutoValue_LoadBalancer_Request_RegisterPayload(
+                    serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList(), id);
+         }
+
+         public static class Builder {
+
+            public List<String> serverIds;
+            public String id;
+
+            public Builder serverIds(List<String> serverIds) {
+               this.serverIds = serverIds;
+               return this;
+            }
+
+            public Builder id(String id) {
+               this.id = id;
+               return this;
+            }
+
+            public RegisterPayload build() {
+               return RegisterPayload.create(serverIds, id);
+            }
+         }
+      }
+
+      @AutoValue
+      public abstract static class DeregisterPayload {
+
+         public abstract List<String> serverIds();
+
+         public abstract String id();
+
+         public static DeregisterPayload create(List<String> serverIds, String id) {
+            return new AutoValue_LoadBalancer_Request_DeregisterPayload(
+                    serverIds != null ? ImmutableList.copyOf(serverIds) : Lists.<String>newArrayList(), id);
+         }
+
+         public static class Builder {
+
+            public List<String> serverIds;
+            public String id;
+
+            public Builder serverIds(List<String> serverIds) {
+               this.serverIds = serverIds;
+               return this;
+            }
+
+            public Builder id(String id) {
+               this.id = id;
+               return this;
+            }
+
+            public DeregisterPayload build() {
+               return DeregisterPayload.create(serverIds, id);
+            }
+         }
+      }
+
+      @AutoValue
+      public abstract static class UpdatePayload {
+
+         public abstract String id();
+
+         public abstract String name();
+
+         public abstract Algorithm loadBalancerAlgorithm();
+
+         public abstract String ip();
+
+         public static UpdatePayload create(String id, String name, Algorithm loadBalancerAlgorithm, String ip) {
+            return new AutoValue_LoadBalancer_Request_UpdatePayload(id, name, loadBalancerAlgorithm, ip);
+         }
+
+         public static class Builder {
+
+            public String id;
+
+            public String name;
+
+            public Algorithm loadBalancerAlgorithm;
+
+            public String ip;
+
+            public Builder id(String id) {
+               this.id = id;
+               return this;
+            }
+
+            public Builder loadBalancerName(String loadBalancerName) {
+               this.name = loadBalancerName;
+               return this;
+            }
+
+            public Builder loadBalancerAlgorithm(Algorithm loadBalancerAlgorithm) {
+               this.loadBalancerAlgorithm = loadBalancerAlgorithm;
+               return this;
+            }
+
+            public Builder ip(String ip) {
+               this.ip = ip;
+               return this;
+            }
+
+            public UpdatePayload build() {
+               checkIp(ip);
+               return UpdatePayload.create(id, name, loadBalancerAlgorithm, ip);
+            }
+         }
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
index 1074fcd..ee1212a 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/domain/Server.java
@@ -61,6 +61,7 @@ public abstract class Server implements ServerCommonProperties {
    @Nullable
    public abstract Boolean hasInternetAccess();
 
+   @Nullable
    public abstract ProvisioningState state();
 
    @Nullable
@@ -84,14 +85,20 @@ public abstract class Server implements ServerCommonProperties {
    @Nullable
    public abstract List<Nic> nics();
 
+   @Nullable
+   public abstract String balancedNicId();
+
+   @Nullable
+   public abstract Boolean activate();
+
    public static Server create(String id, String name, int cores, int ram, Boolean hasInternetAccess, ProvisioningState state,
            Status status, OsType osType, AvailabilityZone availabilityZone, Date creationTime, Date lastModificationTime,
            List<Storage> storages, List<Nic> nics, Boolean isCpuHotPlug, Boolean isRamHotPlug, Boolean isNicHotPlug,
-           Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug) {
+           Boolean isNicHotUnPlug, Boolean isDiscVirtioHotPlug, Boolean isDiscVirtioHotUnPlug, String balancedNicId, boolean activate) {
       return new AutoValue_Server(isCpuHotPlug, isRamHotPlug, isNicHotPlug, isNicHotUnPlug, isDiscVirtioHotPlug, isDiscVirtioHotUnPlug,
               cores, ram, id, name, hasInternetAccess, state, status, osType, availabilityZone, creationTime, lastModificationTime,
               storages != null ? ImmutableList.copyOf(storages) : Lists.<Storage>newArrayList(),
-              nics != null ? ImmutableList.copyOf(nics) : Lists.<Nic>newArrayList());
+              nics != null ? ImmutableList.copyOf(nics) : Lists.<Nic>newArrayList(), balancedNicId, activate);
 
    }
 
@@ -178,6 +185,8 @@ public abstract class Server implements ServerCommonProperties {
       private Boolean hasInternetAccess;
       private List<Storage> storages;
       private List<Nic> nics;
+      private boolean activate;
+      private String balancedNicId;
 
       public DescribingBuilder id(String id) {
          this.id = id;
@@ -229,11 +238,21 @@ public abstract class Server implements ServerCommonProperties {
          return this;
       }
 
+      public DescribingBuilder balancedNicId(String balancedNicId) {
+         this.balancedNicId = balancedNicId;
+         return this;
+      }
+
+      public DescribingBuilder activate(boolean activate) {
+         this.activate = activate;
+         return this;
+      }
+
       @Override
       public Server build() {
          return Server.create(id, name, cores, ram, hasInternetAccess, state, status, osType, zone, creationTime,
                  lastModificationTime, storages, nics, cpuHotPlug, ramHotPlug, nicHotPlug, nicHotUnPlug,
-                 discVirtioHotPlug, discVirtioHotUnPlug);
+                 discVirtioHotPlug, discVirtioHotUnPlug, balancedNicId, activate);
       }
 
       private DescribingBuilder fromServer(Server in) {
@@ -242,7 +261,7 @@ public abstract class Server implements ServerCommonProperties {
                  .isDiscVirtioHotUnPlug(in.isDiscVirtioHotUnPlug()).isNicHotPlug(in.isNicHotPlug())
                  .isNicHotUnPlug(in.isNicHotUnPlug()).isRamHotPlug(in.isRamHotPlug())
                  .lastModificationTime(in.lastModificationTime()).name(in.name()).osType(in.osType()).ram(in.ram())
-                 .state(in.state()).status(in.status()).storages(in.storages()).nics(in.nics());
+                 .state(in.state()).status(in.status()).storages(in.storages()).nics(in.nics()).balancedNicId(in.balancedNicId()).activate(in.activate());
       }
 
       @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
new file mode 100644
index 0000000..cbac54a
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/features/LoadBalancerApi.java
@@ -0,0 +1,90 @@
+/*
+ * 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.features;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import java.util.List;
+import org.jclouds.Fallbacks;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.profitbricks.binder.loadbalancer.CreateLoadBalancerRequestBinder;
+import org.jclouds.profitbricks.binder.loadbalancer.DeregisterLoadBalancerRequestBinder;
+import org.jclouds.profitbricks.binder.loadbalancer.RegisterLoadBalancerRequestBinder;
+import org.jclouds.profitbricks.binder.loadbalancer.UpdateLoadBalancerRequestBinder;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.http.filters.ProfitBricksSoapMessageEnvelope;
+import org.jclouds.profitbricks.http.parser.RequestIdOnlyResponseHandler;
+import org.jclouds.profitbricks.http.parser.loadbalancer.LoadBalancerListResponseHandler;
+import org.jclouds.profitbricks.http.parser.loadbalancer.LoadBalancerResponseHandler;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+
+@RequestFilters({BasicAuthentication.class, ProfitBricksSoapMessageEnvelope.class})
+@Consumes(MediaType.TEXT_XML)
+@Produces(MediaType.TEXT_XML)
+public interface LoadBalancerApi {
+
+   @POST
+   @Named("loadbalancer:getall")
+   @Payload("<ws:getAllLoadBalancers/>")
+   @XMLResponseParser(LoadBalancerListResponseHandler.class)
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<LoadBalancer> getAllLoadBalancers();
+
+   @POST
+   @Named("loadbalancer:get")
+   @Payload("<ws:getLoadBalancer><loadBalancerId>{id}</loadBalancerId></ws:getLoadBalancer>")
+   @XMLResponseParser(LoadBalancerResponseHandler.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   LoadBalancer getLoadBalancer(@PayloadParam("id") String identifier);
+
+   @POST
+   @Named("loadbalancer:create")
+   @MapBinder(CreateLoadBalancerRequestBinder.class)
+   @XMLResponseParser(RequestIdOnlyResponseHandler.class)
+   String createLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.CreatePayload payload);
+
+   @POST
+   @Named("loadbalancer:register")
+   @MapBinder(RegisterLoadBalancerRequestBinder.class)
+   @XMLResponseParser(LoadBalancerResponseHandler.class)
+   LoadBalancer registerLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.RegisterPayload payload);
+
+   @POST
+   @Named("loadbalancer:Deregister")
+   @MapBinder(DeregisterLoadBalancerRequestBinder.class)
+   @XMLResponseParser(LoadBalancerResponseHandler.class)
+   LoadBalancer deregisterLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.DeregisterPayload payload);
+
+   @POST
+   @Named("loadbalancer:delete")
+   @Payload("<ws:deleteLoadBalancer><loadBalancerId>{id}</loadBalancerId></ws:deleteLoadBalancer>")
+   boolean deleteLoadbalancer(@PayloadParam("id") String id);
+
+   @POST
+   @Named("loadbalancer:update")
+   @MapBinder(UpdateLoadBalancerRequestBinder.class)
+   @XMLResponseParser(LoadBalancerResponseHandler.class)
+   LoadBalancer updateLoadBalancer(@PayloadParam("loadbalancer") LoadBalancer.Request.UpdatePayload payload);
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
index 6d8b292..e096148 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/firewall/FirewallListResponseHandler.java
@@ -28,7 +28,7 @@ import org.xml.sax.SAXException;
 
 public class FirewallListResponseHandler extends BaseFirewallResponseHandler<List<Firewall>> {
 
-   private final List<Firewall> firewalls;
+   private List<Firewall> firewalls;
 
    @Inject
    FirewallListResponseHandler(FirewallRuleListResponseHandler firewallRuleListResponseHandler) {
@@ -42,7 +42,7 @@ public class FirewallListResponseHandler extends BaseFirewallResponseHandler<Lis
          firewallRuleListResponseHandler.endElement(uri, localName, qName);
       else {
          setPropertyOnEndTag(qName);
-         if ("return".equals(qName)) {
+         if ("return".equals(qName) || "firewall".equals(qName)) {
             firewalls.add(builder
                     .rules(firewallRuleListResponseHandler.getResult())
                     .build());
@@ -57,6 +57,11 @@ public class FirewallListResponseHandler extends BaseFirewallResponseHandler<Lis
    }
 
    @Override
+   public void reset() {
+      this.firewalls = Lists.newArrayList();
+   }
+
+   @Override
    public List<Firewall> getResult() {
       return firewalls;
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
new file mode 100644
index 0000000..e093977
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/BaseLoadBalancerResponseHandler.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.loadbalancer;
+
+import java.util.Date;
+import org.jclouds.date.DateCodec;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.jclouds.profitbricks.http.parser.firewall.FirewallListResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerListResponseHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public abstract class BaseLoadBalancerResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
+
+   protected final ServerListResponseHandler balancedServerResponseHandler;
+   protected final FirewallListResponseHandler firewallListResponseHandler;
+
+   protected LoadBalancer.Builder builder;
+   protected final DateCodec dateCodec;
+
+   protected boolean useBalancedServerParser = false;
+   protected boolean useFirewallParser = false;
+
+   protected BaseLoadBalancerResponseHandler(DateCodecFactory dateCodec,
+           ServerListResponseHandler balancedServerResponseHandler, FirewallListResponseHandler firewallResponseHandler) {
+
+      if (dateCodec == null)
+         throw new NullPointerException("DateCodecFactory cannot be null");
+      if (balancedServerResponseHandler == null)
+         throw new NullPointerException("BalancedServerResponseHandler cannot be null");
+      if (firewallResponseHandler == null)
+         throw new NullPointerException("FirewallListResponseHandler cannot be null");
+
+      this.dateCodec = dateCodec.iso8601();
+      this.builder = LoadBalancer.builder();
+
+      this.balancedServerResponseHandler = balancedServerResponseHandler;
+      this.firewallListResponseHandler = firewallResponseHandler;
+   }
+
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
+      if ("balancedServers".equals(qName))
+         useBalancedServerParser = true;
+      if ("firewall".equals(qName))
+         useFirewallParser = true;
+
+      if (useBalancedServerParser)
+         balancedServerResponseHandler.startElement(uri, localName, qName, attributes);
+      else if (useFirewallParser)
+         firewallListResponseHandler.startElement(uri, localName, qName, attributes);
+   }
+
+   @Override
+   public void characters(char[] ch, int start, int length) {
+      if (useBalancedServerParser)
+         balancedServerResponseHandler.characters(ch, start, length);
+      else if (useFirewallParser)
+         firewallListResponseHandler.characters(ch, start, length);
+      else
+         super.characters(ch, start, length);
+   }
+
+   protected final Date textToIso8601Date() {
+      return dateCodec.toDate(textToStringValue());
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("loadBalancerId".equals(qName))
+         builder.id(textToStringValue());
+      else if ("loadBalancerName".equals(qName))
+         builder.name(textToStringValue());
+      else if ("loadBalancerAlgorithm".equals(qName))
+         builder.loadBalancerAlgorithm(Algorithm.fromValue(textToStringValue()));
+      else if ("dataCenterId".equals(qName))
+         builder.dataCenterId(textToStringValue());
+      else if ("dataCenterVersion".equals(qName))
+         builder.dataCenterVersion(textToStringValue());
+      else if ("internetAccess".equals(qName))
+         builder.internetAccess(textToBooleanValue());
+      else if ("ip".equals(qName))
+         builder.ip(textToStringValue());
+      else if ("lanId".equals(qName))
+         builder.lanId(textToStringValue());
+      else if ("provisioningState".equals(qName))
+         builder.state(ProvisioningState.fromValue(textToStringValue()));
+      else if ("creationTime".equals(qName))
+         builder.creationTime(textToIso8601Date());
+      else if ("lastModificationTime".equals(qName))
+         builder.lastModificationTime(textToIso8601Date());
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
new file mode 100644
index 0000000..4b31e8a
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerListResponseHandler.java
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.loadbalancer;
+
+import autovalue.shaded.com.google.common.common.collect.Lists;
+import com.google.inject.Inject;
+import java.util.List;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.http.parser.firewall.FirewallListResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerListResponseHandler;
+import org.xml.sax.SAXException;
+
+public class LoadBalancerListResponseHandler extends BaseLoadBalancerResponseHandler<List<LoadBalancer>> {
+
+   private final List<LoadBalancer> loadBalancers;
+
+   @Inject
+   LoadBalancerListResponseHandler(DateCodecFactory dateCodec, ServerListResponseHandler balancedServerResponseHandler, FirewallListResponseHandler firewallListResponseHandler) {
+      super(dateCodec, balancedServerResponseHandler, firewallListResponseHandler);
+      this.loadBalancers = Lists.newArrayList();
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (useBalancedServerParser) {
+         balancedServerResponseHandler.endElement(uri, localName, qName);
+      } else if (useFirewallParser) {
+         firewallListResponseHandler.endElement(uri, localName, qName);
+      } else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName)) {
+            loadBalancers.add(builder
+                    .firewalls(firewallListResponseHandler.getResult())
+                    .balancedServers(balancedServerResponseHandler.getResult())
+                    .build());
+
+            balancedServerResponseHandler.reset();
+            firewallListResponseHandler.reset();
+            builder = LoadBalancer.builder();
+         }
+         clearTextBuffer();
+      }
+      if ("firewall".equals(qName)) {
+         useFirewallParser = false;
+      } else if ("balancedServers".equals(qName)) {
+         useBalancedServerParser = false;
+      }
+
+   }
+
+   @Override
+   public List<LoadBalancer> getResult() {
+      return loadBalancers;
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandler.java
new file mode 100644
index 0000000..8c79512
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerResponseHandler.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.loadbalancer;
+
+import com.google.inject.Inject;
+import org.jclouds.date.DateCodecFactory;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.http.parser.firewall.FirewallListResponseHandler;
+import org.jclouds.profitbricks.http.parser.server.ServerListResponseHandler;
+import org.xml.sax.SAXException;
+
+public class LoadBalancerResponseHandler extends BaseLoadBalancerResponseHandler<LoadBalancer> {
+
+   private boolean done = false;
+
+   @Inject
+   LoadBalancerResponseHandler(DateCodecFactory dateCodec, ServerListResponseHandler serverListResponseHandler, FirewallListResponseHandler firewallListResponseHandler) {
+      super(dateCodec, serverListResponseHandler, firewallListResponseHandler);
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      if (done)
+         return;
+
+      if (useBalancedServerParser)
+         balancedServerResponseHandler.endElement(uri, localName, qName);
+      else if (useFirewallParser)
+         firewallListResponseHandler.endElement(uri, localName, qName);
+      else {
+         setPropertyOnEndTag(qName);
+         if ("return".equals(qName)) {
+            done = true;
+            builder.balancedServers(balancedServerResponseHandler.getResult());
+            builder.firewalls(firewallListResponseHandler.getResult());
+         }
+         clearTextBuffer();
+      }
+
+      if ("balancedServers".equals(qName))
+         useBalancedServerParser = false;
+      else if ("firewall".equals(qName))
+         useFirewallParser = false;
+
+   }
+
+   @Override
+   public LoadBalancer getResult() {
+      return builder.build();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
index 69a34b1..60fb4bf 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/BaseServerResponseHandler.java
@@ -17,11 +17,7 @@
 package org.jclouds.profitbricks.http.parser.server;
 
 import java.util.Date;
-
 import org.jclouds.date.DateCodec;
-
-import com.google.inject.Inject;
-
 import org.jclouds.date.DateCodecFactory;
 import org.jclouds.profitbricks.domain.AvailabilityZone;
 import org.jclouds.profitbricks.domain.OsType;
@@ -35,8 +31,8 @@ import org.xml.sax.SAXException;
 
 public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksResponseHandler<T> {
 
-   protected final StorageListResponseHandler storageListResponseHandler;
-   protected final NicListResponseHandler nicListResponseHandler;
+   protected StorageListResponseHandler storageListResponseHandler;
+   protected NicListResponseHandler nicListResponseHandler;
 
    protected Server.DescribingBuilder builder;
 
@@ -45,9 +41,15 @@ public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksRespo
    protected boolean useStorageParser = false;
    protected boolean useNicParser = false;
 
-   @Inject
    BaseServerResponseHandler(DateCodecFactory dateCodec, StorageListResponseHandler storageListResponseHandler,
            NicListResponseHandler nicListResponseHandler) {
+      if (dateCodec == null)
+         throw new NullPointerException("DateCodecFactory cannot be null");
+      if (storageListResponseHandler == null)
+         throw new NullPointerException("StorageListResponseHandler cannot be null");
+      if (nicListResponseHandler == null)
+         throw new NullPointerException("NicListResponseHandler cannot be null");
+
       this.dateCodec = dateCodec.iso8601();
       this.storageListResponseHandler = storageListResponseHandler;
       this.nicListResponseHandler = nicListResponseHandler;
@@ -119,6 +121,10 @@ public abstract class BaseServerResponseHandler<T> extends BaseProfitBricksRespo
          builder.isDiscVirtioHotPlug(textToBooleanValue());
       else if ("discVirtioHotUnPlug".equals(qName))
          builder.isDiscVirtioHotUnPlug(textToBooleanValue());
+      else if ("activate".equals(qName))
+         builder.activate(textToBooleanValue());
+      else if ("balancedNicId".equals(qName))
+         builder.balancedNicId(textToStringValue());
    }
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
index d7d50ab..362e378 100644
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/server/ServerListResponseHandler.java
@@ -47,7 +47,7 @@ public class ServerListResponseHandler extends BaseServerResponseHandler<List<Se
          nicListResponseHandler.endElement(uri, localName, qName);
       else {
          setPropertyOnEndTag(qName);
-         if ("return".equals(qName) || "servers".equals(qName)) {
+         if ("return".equals(qName) || "servers".equals(qName) || "balancedServers".equals(qName)) {
             servers.add(builder
                     .storages(storageListResponseHandler.getResult())
                     .nics(nicListResponseHandler.getResult())

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinderTest.java
new file mode 100644
index 0000000..f959be1
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/CreateLoadBalancerRequestBinderTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.binder.loadbalancer;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.testng.annotations.Test;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+@Test(groups = "unit", testName = "CreateLoadBalancerRequestBinderTest")
+public class CreateLoadBalancerRequestBinderTest {
+
+   @Test
+   public void testCreatePayload() {
+      CreateLoadBalancerRequestBinder binder = new CreateLoadBalancerRequestBinder();
+
+      List<String> serverIds = Lists.newArrayList();
+      serverIds.add("server-ids");
+
+      String actual = binder.createPayload(LoadBalancer.Request.CreatePayload.create("datacenter-id", "load-balancer-name", Algorithm.ROUND_ROBIN, "-ip", "lan-id", serverIds));
+
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload
+           = ("<ws:createLoadBalancer>\n"
+           + "            <request>\n"
+           + "                <dataCenterId>datacenter-id</dataCenterId>\n"
+           + "                <loadBalancerName>load-balancer-name</loadBalancerName>\n"
+           + "                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>\n"
+           + "                <ip>-ip</ip>\n"
+           + "                <lanId>lan-id</lanId>\n"
+           + "                <serverIds>server-ids</serverIds>\n"
+           + "            </request>\n"
+           + "        </ws:createLoadBalancer>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
new file mode 100644
index 0000000..dbf0271
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/DeregisterLoadBalancerRequestBinderTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.binder.loadbalancer;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "DeregisterLoadBalancerRequestBinderTest")
+public class DeregisterLoadBalancerRequestBinderTest {
+
+   @Test
+   public void testDeregisterPayload() {
+      DeregisterLoadBalancerRequestBinder binder = new DeregisterLoadBalancerRequestBinder();
+      List<String> serverIds = Lists.newArrayList();
+      serverIds.add("1");
+      serverIds.add("2");
+
+      LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request.DeregisterPayload.create(serverIds, "load-balancer-id");
+
+      String actual = binder.createPayload(payload);
+
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload
+           = ("        <ws:deregisterServersOnLoadBalancer>\n"
+           + "             <request>"
+           + "                <serverIds>1</serverIds>\n"
+           + "                <serverIds>2</serverIds>\n"
+           + "                <loadBalancerId>load-balancer-id</loadBalancerId>\n"
+           + "             </request>"
+           + "        </ws:deregisterServersOnLoadBalancer>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
new file mode 100644
index 0000000..2bbf6fd
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/RegisterLoadBalancerRequestBinderTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.binder.loadbalancer;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "RegisterLoadBalancerRequestBinderTest")
+public class RegisterLoadBalancerRequestBinderTest {
+
+   @Test
+   public void testRegisterPayload() {
+      RegisterLoadBalancerRequestBinder binder = new RegisterLoadBalancerRequestBinder();
+      List<String> serverIds = Lists.newArrayList();
+      serverIds.add("1");
+      serverIds.add("2");
+
+      LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request.RegisterPayload.create(serverIds, "load-balancer-id");
+
+      String actual = binder.createPayload(payload);
+
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload
+           = ("        <ws:registerServersOnLoadBalancer>\n"
+           + "             <request>"
+           + "                <loadBalancerId>load-balancer-id</loadBalancerId>\n"
+           + "                <serverIds>1</serverIds>\n"
+           + "                <serverIds>2</serverIds>\n"
+           + "             </request>"
+           + "        </ws:registerServersOnLoadBalancer>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinderTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinderTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinderTest.java
new file mode 100644
index 0000000..21c08d0
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/binder/loadbalancer/UpdateLoadBalancerRequestBinderTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.binder.loadbalancer;
+
+import com.google.common.collect.Lists;
+import java.util.List;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "UpdateLoadBalancerRequestBinderTest")
+public class UpdateLoadBalancerRequestBinderTest {
+
+   @Test
+   public void testDeregisterPayload() {
+      UpdateLoadBalancerRequestBinder binder = new UpdateLoadBalancerRequestBinder();
+      List<String> serverIds = Lists.newArrayList();
+      serverIds.add("1");
+      serverIds.add("2");
+
+      LoadBalancer.Request.UpdatePayload payload = LoadBalancer.Request.UpdatePayload.create("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee", "load-balancer-name",
+              LoadBalancer.Algorithm.ROUND_ROBIN, "ip");
+
+      String actual = binder.createPayload(payload);
+
+      assertNotNull(actual, "Binder returned null payload");
+      assertEquals(expectedPayload, actual);
+   }
+
+   private final String expectedPayload
+           = ("        <ws:updateLoadBalancer>\n"
+           + "            <request>\n"
+           + "                <loadBalancerId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</loadBalancerId>\n"
+           + "                <loadBalancerName>load-balancer-name</loadBalancerName>\n"
+           + "                <loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>\n"
+           + "                <ip>ip</ip>              \n"
+           + "            </request>\n"
+           + "        </ws:updateLoadBalancer>").replaceAll("\\s+", "");
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
new file mode 100644
index 0000000..a79f9ae
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiLiveTest.java
@@ -0,0 +1,135 @@
+/*
+ * 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.features;
+
+import com.google.common.collect.Iterables;
+import java.util.List;
+import org.assertj.core.util.Lists;
+import org.jclouds.profitbricks.BaseProfitBricksLiveTest;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
+import org.jclouds.profitbricks.domain.Server;
+import org.testng.Assert;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "LoadbalancerApiLiveTest")
+public class LoadbalancerApiLiveTest extends BaseProfitBricksLiveTest {
+
+   private String dataCenterId;
+   private String loadBalancerID;
+   private String serverId;
+
+   @Override
+   protected void initialize() {
+      super.initialize();
+      List<DataCenter> dataCenters = api.dataCenterApi().getAllDataCenters();
+      assertFalse(dataCenters.isEmpty(), "At least 1 datacenter has to be available for loadbalancer testing.");
+
+      dataCenterId = Iterables.getFirst(dataCenters, null).id();
+
+      List<Server> servers = api.serverApi().getAllServers();
+      assertFalse(servers.isEmpty(), "At least 1 server has to be available for loadbalancer testing.");
+
+      serverId = Iterables.getFirst(servers, null).id();
+   }
+
+   @Test
+   public void testCreateLoadBalancer() {
+      List<String> serverIds = com.google.common.collect.Lists.newArrayList();
+      serverIds.add("server-ids");
+
+      LoadBalancer.Request.CreatePayload payload = LoadBalancer.Request.creatingBuilder()
+              .dataCenterId(dataCenterId)
+              .loadBalancerName("testName")
+              .loadBalancerAlgorithm(Algorithm.ROUND_ROBIN)
+              .ip("0.0.0.1")
+              .lanId("1")
+              .serverIds(serverIds)
+              .build();
+
+      String requestId = api.loadBalancerApi().createLoadBalancer(payload);
+
+      assertNotNull(requestId);
+   }
+
+   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   public void testGetAllLoadBalancers() {
+      List<LoadBalancer> loadBalancers = api.loadBalancerApi().getAllLoadBalancers();
+
+      assertFalse(loadBalancers.isEmpty());
+   }
+
+   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   public void testGetLoadBalancer() {
+      LoadBalancer loadBalancer = api.loadBalancerApi().getLoadBalancer(loadBalancerID);
+
+      assertNotNull(loadBalancer);
+   }
+
+   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   public void testRegisterLoadBalancer() {
+      List<String> serverIds = Lists.newArrayList();
+      serverIds.add(serverId);
+
+      LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request.registerBuilder()
+              .id(loadBalancerID)
+              .serverIds(serverIds)
+              .build();
+
+      LoadBalancer loadBalancer = api.loadBalancerApi().registerLoadBalancer(payload);
+
+      assertNotNull(loadBalancer);
+   }
+
+   @Test(dependsOnMethods = "testRegisterLoadBalancer")
+   public void testDeregisterLoadBalancer() {
+      List<String> serverIds = Lists.newArrayList();
+      serverIds.add(serverId);
+
+      LoadBalancer.Request.DeregisterPayload payload = LoadBalancer.Request.deregisterBuilder()
+              .id(loadBalancerID)
+              .serverIds(serverIds)
+              .build();
+
+      LoadBalancer loadBalancer = api.loadBalancerApi().deregisterLoadBalancer(payload);
+
+      assertNotNull(loadBalancer);
+   }
+
+   @Test(dependsOnMethods = "testCreateLoadBalancer")
+   public void testUpdateLoadBalancer() {
+      LoadBalancer.Request.UpdatePayload payload = LoadBalancer.Request.updatingBuilder()
+              .id(loadBalancerID)
+              .loadBalancerName("whatever")
+              .build();
+
+      LoadBalancer loadBalancer = api.loadBalancerApi().updateLoadBalancer(payload);
+
+      assertNotNull(loadBalancer);
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void testDeleteLoadBalancer() {
+      boolean result = api.loadBalancerApi().deleteLoadbalancer(loadBalancerID);
+
+      Assert.assertTrue(result);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/23f158f3/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
new file mode 100644
index 0000000..f91083a
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/features/LoadbalancerApiMockTest.java
@@ -0,0 +1,285 @@
+/*
+ * 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.features;
+
+import com.google.common.collect.Lists;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import java.util.List;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.LoadBalancer;
+import org.jclouds.profitbricks.domain.LoadBalancer.Algorithm;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.AssertJUnit.assertTrue;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "LoadbalancerApiMockTest")
+public class LoadbalancerApiMockTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testGetAllLoadBalancers() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancers.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      try {
+         List<LoadBalancer> loadBalancerList = api.getAllLoadBalancers();
+
+         assertRequestHasCommonProperties(server.takeRequest(), "<ws:getAllLoadBalancers/>");
+         assertNotNull(loadBalancerList);
+         assertTrue(loadBalancerList.size() == 2);
+
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetAllLoadBalancersReturning404() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      try {
+         List<LoadBalancer> loadBalancerList = api.getAllLoadBalancers();
+
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertTrue(loadBalancerList.isEmpty());
+
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+
+      String content = "<ws:getLoadBalancer><loadBalancerId>" + id + "</loadBalancerId></ws:getLoadBalancer>";
+      try {
+         LoadBalancer loadBalancer = api.getLoadBalancer(id);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(loadBalancer);
+         assertEquals(loadBalancer.id(), id);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testGetNonExistingLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setResponseCode(404));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String id = "random-non-existing-id";
+
+      try {
+         LoadBalancer loadBalancer = api.getLoadBalancer(id);
+
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertNull(loadBalancer);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testCreateLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-create.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String content = "<ws:createLoadBalancer>"
+              + "<request>"
+              + "<dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee</dataCenterId>"
+              + "<loadBalancerName>load-balancer-name</loadBalancerName>"
+              + "<loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>"
+              + "<ip>192.168.0.1</ip>"
+              + "<lanId>lan-id</lanId>"
+              + "<serverIds>server-ids</serverIds>"
+              + "</request>"
+              + "</ws:createLoadBalancer>";
+
+      try {
+         List<String> serverIds = Lists.newArrayList();
+         serverIds.add("server-ids");
+         String requestId = api.createLoadBalancer(LoadBalancer.Request.creatingBuilder()
+                 .dataCenterId("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeee")
+                 .loadBalancerName("load-balancer-name")
+                 .loadBalancerAlgorithm(Algorithm.ROUND_ROBIN)
+                 .ip("192.168.0.1")
+                 .lanId("lan-id")
+                 .serverIds(serverIds)
+                 .build());
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testUpdateLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-create.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      String newName = "Apache";
+
+      String content = "<ws:updateLoadBalancer>"
+              + "<request>"
+              + "<loadBalancerId>" + id + "</loadBalancerId>"
+              + "<loadBalancerName>load-balancer-name</loadBalancerName>"
+              + "<loadBalancerAlgorithm>ROUND_ROBIN</loadBalancerAlgorithm>"
+              + "<ip>192.168.0.1</ip>"
+              + "</request>"
+              + "</ws:updateLoadBalancer>";
+
+      try {
+         LoadBalancer.Request.UpdatePayload toUpdate = LoadBalancer.Request.updatingBuilder()
+                 .id(id)
+                 .loadBalancerName("load-balancer-name")
+                 .loadBalancerAlgorithm(Algorithm.ROUND_ROBIN)
+                 .ip("192.168.0.1")
+                 .build();
+
+         LoadBalancer loadBalancer = api.updateLoadBalancer(toUpdate);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(loadBalancer);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+
+   }
+
+   @Test
+   public void testRegisterLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-register.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String content = "<ws:registerServersOnLoadBalancer>"
+              + "<request>"
+              + "<loadBalancerId>1234</loadBalancerId>"
+              + "<serverIds>1</serverIds>"
+              + "<serverIds>2</serverIds>"
+              + "</request>"
+              + "</ws:registerServersOnLoadBalancer>";
+
+      try {
+         List<String> serverIds = Lists.newArrayList();
+         serverIds.add("1");
+         serverIds.add("2");
+         LoadBalancer.Request.RegisterPayload payload = LoadBalancer.Request.registerBuilder()
+                 .id("1234")
+                 .serverIds(serverIds)
+                 .build();
+
+         LoadBalancer loadbalancer = api.registerLoadBalancer(payload);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeregisterLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-update.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String content = "<ws:deregisterServersOnLoadBalancer>"
+              + "<request>"
+              + "<serverIds>1</serverIds>"
+              + "<serverIds>2</serverIds>"
+              + "<loadBalancerId>load-balancer-id</loadBalancerId>"
+              + "</request>"
+              + "</ws:deregisterServersOnLoadBalancer>";
+
+      try {
+         List<String> serverIds = Lists.newArrayList();
+         serverIds.add("1");
+         serverIds.add("2");
+         LoadBalancer loadbalancer = api.deregisterLoadBalancer(LoadBalancer.Request.DeregisterPayload.create(serverIds, "load-balancer-id"));
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertNotNull(loadbalancer);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testDeleteLoadBalancer() throws Exception {
+      MockWebServer server = mockWebServer();
+      server.enqueue(new MockResponse().setBody(payloadFromResource("/loadbalancer/loadbalancer-register.xml")));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+      LoadBalancerApi api = pbApi.loadBalancerApi();
+
+      String loadBalancerId = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+
+      String content = "<ws:deleteLoadBalancer><loadBalancerId>" + loadBalancerId + "</loadBalancerId></ws:deleteLoadBalancer>";
+
+      try {
+         boolean done = api.deleteLoadbalancer(loadBalancerId);
+
+         assertRequestHasCommonProperties(server.takeRequest(), content);
+         assertTrue(done);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+}


[04/35] jclouds git commit: JCLOUDS-702: JCloud ProfitBricks provider - Server & Image API

Posted by de...@apache.org.
http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/server/server-delete.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server-delete.xml b/providers/profitbricks/src/test/resources/server/server-delete.xml
new file mode 100644
index 0000000..1b18bd8
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/server/server-delete.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:deleteServerResponse>
+            <return>
+                <requestId>102459</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>4</dataCenterVersion>
+            </return>
+        </ws:deleteServerResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/server/server-reset.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server-reset.xml b/providers/profitbricks/src/test/resources/server/server-reset.xml
new file mode 100644
index 0000000..db8d498
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/server/server-reset.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:resetServerResponse>
+            <return>
+                <requestId>123456</requestId>
+            </return>
+        </ws:resetServerResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/server/server-start.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server-start.xml b/providers/profitbricks/src/test/resources/server/server-start.xml
new file mode 100644
index 0000000..a34ce84
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/server/server-start.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:startServerResponse>
+            <return>
+                <requestId>123456</requestId>
+            </return>
+        </ws:startServerResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/server/server-stop.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server-stop.xml b/providers/profitbricks/src/test/resources/server/server-stop.xml
new file mode 100644
index 0000000..4f5bce4
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/server/server-stop.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:stopServerResponse>
+            <return>
+                <requestId>123456</requestId>
+            </return>
+        </ws:stopServerResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/server/server-update.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server-update.xml b/providers/profitbricks/src/test/resources/server/server-update.xml
new file mode 100644
index 0000000..fb95440
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/server/server-update.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.api.profitbricks.com/">
+    <soapenv:Header/>
+    <soapenv:Body>
+        <ws:updateServerResponse>
+            <return>
+                <requestId>102458</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>3</dataCenterVersion>
+            </return>
+        </ws:updateServerResponse>
+    </soapenv:Body>
+</soapenv:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/server/server.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/server.xml b/providers/profitbricks/src/test/resources/server/server.xml
new file mode 100644
index 0000000..8fac75d
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/server/server.xml
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getServerResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <requestId>16366014</requestId>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>10</dataCenterVersion>
+                <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>
+                <serverName>facebook-node</serverName>
+                <cores>4</cores>
+                <ram>4096</ram>
+                <internetAccess>true</internetAccess>
+                <ips>173.252.120.6</ips>
+                <connectedStorages>
+                    <bootDevice>true</bootDevice>
+                    <busType>VIRTIO</busType>
+                    <deviceNumber>1</deviceNumber>
+                    <size>40</size>
+                    <storageId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</storageId>
+                    <storageName>facebook-storage</storageName>
+                </connectedStorages>
+                <nics>
+                    <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                    <dataCenterVersion>10</dataCenterVersion>
+                    <nicId>qwqwqwqw-wewe-erer-rtrt-tytytytytyty</nicId>
+                    <lanId>1</lanId>
+                    <internetAccess>true</internetAccess>
+                    <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>
+                    <ips>173.252.120.6</ips>
+                    <macAddress>02:01:09:cd:f0:b0</macAddress>
+                    <firewall>
+                        <active>false</active>
+                        <firewallId>wqwqwqwq-ewew-rere-trtr-ytytytytytyt</firewallId>
+                        <nicId>qwqwqwqw-wewe-erer-rtrt-tytytytytyty</nicId>
+                        <provisioningState>AVAILABLE</provisioningState>
+                    </firewall>
+                    <dhcpActive>true</dhcpActive>
+                    <gatewayIp>173.252.120.1</gatewayIp>
+                    <provisioningState>AVAILABLE</provisioningState>
+                </nics>
+                <provisioningState>AVAILABLE</provisioningState>
+                <virtualMachineState>RUNNING</virtualMachineState>
+                <creationTime>2014-12-04T07:09:23.138Z</creationTime>
+                <lastModificationTime>2014-12-12T03:08:35.629Z</lastModificationTime>
+                <osType>LINUX</osType>
+                <availabilityZone>AUTO</availabilityZone>
+                <cpuHotPlug>true</cpuHotPlug>
+                <ramHotPlug>true</ramHotPlug>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+            </return>
+        </ns2:getServerResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/ee24ddb2/providers/profitbricks/src/test/resources/server/servers.xml
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/resources/server/servers.xml b/providers/profitbricks/src/test/resources/server/servers.xml
new file mode 100644
index 0000000..4a74b5d
--- /dev/null
+++ b/providers/profitbricks/src/test/resources/server/servers.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
+    <S:Body>
+        <ns2:getAllServersResponse xmlns:ns2="http://ws.api.profitbricks.com/">
+            <return>
+                <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                <dataCenterVersion>10</dataCenterVersion>
+                <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>
+                <serverName>facebook-node</serverName>
+                <cores>4</cores>
+                <ram>4096</ram>
+                <internetAccess>true</internetAccess>
+                <ips>173.252.120.6</ips>
+                <connectedStorages>
+                    <bootDevice>true</bootDevice>
+                    <busType>VIRTIO</busType>
+                    <deviceNumber>1</deviceNumber>
+                    <size>40</size>
+                    <storageId>qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh</storageId>
+                    <storageName>facebook-storage</storageName>
+                </connectedStorages>
+                <nics>
+                    <dataCenterId>aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee</dataCenterId>
+                    <dataCenterVersion>10</dataCenterVersion>
+                    <nicId>qwqwqwqw-wewe-erer-rtrt-tytytytytyty</nicId>
+                    <lanId>1</lanId>
+                    <internetAccess>true</internetAccess>
+                    <serverId>qwertyui-qwer-qwer-qwer-qwertyyuiiop</serverId>
+                    <ips>173.252.120.6</ips>
+                    <macAddress>02:01:09:cd:f0:b0</macAddress>
+                    <firewall>
+                        <active>false</active>
+                        <firewallId>wqwqwqwq-ewew-rere-trtr-ytytytytytyt</firewallId>
+                        <nicId>qwqwqwqw-wewe-erer-rtrt-tytytytytyty</nicId>
+                        <provisioningState>AVAILABLE</provisioningState>
+                    </firewall>
+                    <dhcpActive>true</dhcpActive>
+                    <gatewayIp>173.252.120.1</gatewayIp>
+                    <provisioningState>AVAILABLE</provisioningState>
+                </nics>
+                <provisioningState>AVAILABLE</provisioningState>
+                <virtualMachineState>RUNNING</virtualMachineState>
+                <creationTime>2014-12-04T07:09:23.138Z</creationTime>
+                <lastModificationTime>2014-12-12T03:08:35.629Z</lastModificationTime>
+                <osType>LINUX</osType>
+                <availabilityZone>AUTO</availabilityZone>
+                <cpuHotPlug>true</cpuHotPlug>
+                <ramHotPlug>true</ramHotPlug>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+            </return>
+            <return>
+                <dataCenterId>qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy</dataCenterId>
+                <dataCenterVersion>238</dataCenterVersion>
+                <serverId>asdfghjk-asdf-asdf-asdf-asdfghjklkjl</serverId>
+                <serverName>google-node</serverName>
+                <cores>1</cores>
+                <ram>1024</ram>
+                <internetAccess>false</internetAccess>
+                <ips>202.69.181.241</ips>
+                <connectedStorages>
+                    <bootDevice>true</bootDevice>
+                    <busType>VIRTIO</busType>
+                    <deviceNumber>1</deviceNumber>
+                    <size>5</size>
+                    <storageId>asfasfle-f23n-cu89-klfr-njkdsvwllkfa</storageId>
+                    <storageName>google-disk</storageName>
+                </connectedStorages>
+                <nics>
+                    <dataCenterId>qqqqqqqq-wwww-rrrr-tttt-yyyyyyyyyyyy</dataCenterId>
+                    <dataCenterVersion>238</dataCenterVersion>
+                    <nicId>mkl45h5e-sdgb-h6rh-235r-rfweshdfhreh</nicId>
+                    <lanId>3</lanId>
+                    <internetAccess>false</internetAccess>
+                    <serverId>asdfghjk-asdf-asdf-asdf-asdfghjklkjl</serverId>
+                    <ips>202.69.181.241</ips>
+                    <macAddress>02:01:9e:5e:35:1e</macAddress>
+                    <firewall>
+                        <active>false</active>
+                        <firewallId>cvvdsgbd-sdgj-eger-h56j-wet43gvsgeg4</firewallId>
+                        <nicId>mkl45h5e-sdgb-h6rh-235r-rfweshdfhreh</nicId>
+                        <provisioningState>INPROCESS</provisioningState>
+                    </firewall>
+                    <dhcpActive>false</dhcpActive>
+                    <provisioningState>AVAILABLE</provisioningState>
+                </nics>
+                <provisioningState>AVAILABLE</provisioningState>
+                <virtualMachineState>RUNNING</virtualMachineState>
+                <creationTime>2014-11-12T07:01:00.441Z</creationTime>
+                <lastModificationTime>2014-11-12T07:01:00.441Z</lastModificationTime>
+                <osType>LINUX</osType>
+                <availabilityZone>AUTO</availabilityZone>
+                <cpuHotPlug>true</cpuHotPlug>
+                <ramHotPlug>true</ramHotPlug>
+                <nicHotPlug>true</nicHotPlug>
+                <nicHotUnPlug>true</nicHotUnPlug>
+                <discVirtioHotPlug>true</discVirtioHotPlug>
+                <discVirtioHotUnPlug>true</discVirtioHotUnPlug>
+            </return>
+        </ns2:getAllServersResponse>
+    </S:Body>
+</S:Envelope>
\ No newline at end of file


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

Posted by de...@apache.org.
JCLOUDS-947: Properly configure live tests in ProfitBricks


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

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

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


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

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

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

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
deleted file mode 100644
index bd00a3d..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusAware.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.profitbricks.compute.internal;
-
-/**
- * An enumeration of ProfitBricks domain classes containing a property 'ProvisioningState'.
- *
- * @see ProvisioningStatusPollingPredicate
- */
-public enum ProvisioningStatusAware {
-
-   DATACENTER, SERVER, STORAGE, NIC, SNAPSHOT;
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
deleted file mode 100644
index 41c3e93..0000000
--- a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicate.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.profitbricks.compute.internal;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.domain.ProvisioningState;
-
-import com.google.common.base.Predicate;
-import org.jclouds.rest.ResourceNotFoundException;
-
-/**
- * A custom predicate for waiting until a virtual resource satisfies the given expected status
- * <p>
- * Performing api requests on a datacenter that is not {@link ProvisioningState#AVAILABLE} is not allowed. On some
- * cases, the API user gets blocked from further requests, and will then need to contact tech support for api lock
- * release.
- */
-public class ProvisioningStatusPollingPredicate implements Predicate<String> {
-
-   private final ProfitBricksApi api;
-   private final ProvisioningStatusAware domain;
-   private final ProvisioningState expect;
-
-   public ProvisioningStatusPollingPredicate(ProfitBricksApi api, ProvisioningStatusAware domain, ProvisioningState expect) {
-      this.api = checkNotNull(api, "API null");
-      this.expect = checkNotNull(expect, "Expected state null");
-      this.domain = checkNotNull(domain, "Domain null");
-   }
-
-   @Override
-   public boolean apply(String input) {
-      checkNotNull(input, "Virtual item id can't be null.");
-      try {
-         switch (domain) {
-            case DATACENTER:
-               return expect == api.dataCenterApi().getDataCenterState(input);
-            case SERVER:
-               return expect == api.serverApi().getServer(input).state();
-            case STORAGE:
-               return expect == api.storageApi().getStorage(input).state();
-            case NIC:
-               return expect == api.nicApi().getNic(input).state();
-            case SNAPSHOT:
-               return expect == api.snapshotApi().getSnapshot(input).state();
-            default:
-               throw new IllegalArgumentException("Unknown domain '" + domain + "'");
-         }
-      } catch (ResourceNotFoundException ex) {
-         // After provisioning, a node might still not be "fetchable" via API
-         return false;
-      }
-   }
-
-}

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

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

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

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

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

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java
new file mode 100644
index 0000000..a239336
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/loadbalancer/LoadBalancerIdOnlyResponseHandler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.loadbalancer;
+
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * Handler for parsing SOAP response where <i>loadBalancerId</i> is the only <i>usable</i> value.
+ *
+ * Other properties available (which are ignored): requestId, dataCenterId, dataCenterVersion
+ */
+public class LoadBalancerIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
+
+   private String loadBalancerId;
+
+   LoadBalancerIdOnlyResponseHandler() {
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      clearTextBuffer();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("loadBalancerId".equals(qName))
+         loadBalancerId = textToStringValue();
+   }
+
+   @Override
+   public String getResult() {
+      return loadBalancerId;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java
new file mode 100644
index 0000000..8f8ba03
--- /dev/null
+++ b/providers/profitbricks/src/main/java/org/jclouds/profitbricks/http/parser/nic/NicIdOnlyResponseHandler.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.http.parser.nic;
+
+import org.jclouds.profitbricks.http.parser.BaseProfitBricksResponseHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * Handler for parsing SOAP response where <i>nicId</i> is the only <i>usable</i> value.
+ *
+ * Other properties available (which are ignored): requestId, dataCenterId, dataCenterVersion
+ */
+public class NicIdOnlyResponseHandler extends BaseProfitBricksResponseHandler<String> {
+
+   private String nicId;
+
+   NicIdOnlyResponseHandler() {
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) throws SAXException {
+      setPropertyOnEndTag(qName);
+      clearTextBuffer();
+   }
+
+   @Override
+   protected void setPropertyOnEndTag(String qName) {
+      if ("nicId".equals(qName))
+         nicId = textToStringValue();
+   }
+
+   @Override
+   public String getResult() {
+      return nicId;
+   }
+
+}

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

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

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

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java
deleted file mode 100644
index 83540a5..0000000
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceAdapterLiveTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.profitbricks.compute;
-
-import org.jclouds.compute.domain.NodeMetadata;
-import org.testng.annotations.Test;
-
-import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
-import org.jclouds.sshj.config.SshjSshClientModule;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
-import org.jclouds.compute.domain.ExecResponse;
-import org.jclouds.logging.config.LoggingModule;
-import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
-
-@Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceAdapterLiveTest")
-public class ProfitBricksComputeServiceAdapterLiveTest extends BaseComputeServiceLiveTest {
-
-   public ProfitBricksComputeServiceAdapterLiveTest() {
-      provider = "profitbricks";
-   }
-
-   @Override
-   protected Module getSshModule() {
-      return new SshjSshClientModule();
-   }
-
-   @Override
-   protected LoggingModule getLoggingModule() {
-      return new SLF4JLoggingModule();
-   }
-
-   @Override
-   public void testOptionToNotBlock() throws Exception {
-      // ProfitBricks implementation intentionally blocks until the node is 'AVAILABLE'
-   }
-
-   @Override
-   protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) {
-      // ProfitBricks doesn't support tags
-   }
-
-   @Override
-   protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
-      // ProfitBricks doesn't support user metadata
-   }
-
-   @Override
-   protected void checkResponseEqualsHostname(ExecResponse execResponse, NodeMetadata node1) {
-      // ProfitBricks doesn't support hostname
-   }
-
-   @Override
-   protected void checkOsMatchesTemplate(NodeMetadata node) {
-      // Not enough description from API to match template
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java
new file mode 100644
index 0000000..2599f71
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/ProfitBricksComputeServiceLiveTest.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.compute;
+
+import static org.jclouds.profitbricks.BaseProfitBricksLiveTest.testLocation;
+import static org.jclouds.profitbricks.config.ProfitBricksComputeProperties.POLL_PREDICATE_DATACENTER;
+
+import java.util.Objects;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.collect.FluentIterable;
+
+import org.jclouds.compute.domain.NodeMetadata;
+import org.testng.annotations.Test;
+
+import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
+import org.jclouds.sshj.config.SshjSshClientModule;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+
+import org.jclouds.compute.domain.ExecResponse;
+import org.jclouds.logging.config.LoggingModule;
+import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.domain.DataCenter;
+import org.jclouds.profitbricks.features.DataCenterApi;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeGroups;
+
+@Test(groups = "live", singleThreaded = true, testName = "ProfitBricksComputeServiceLiveTest")
+public class ProfitBricksComputeServiceLiveTest extends BaseComputeServiceLiveTest {
+
+   private static final String TEST_DC_NAME = "computeServiceLiveTest" + System.currentTimeMillis();
+
+   private DataCenter dataCenter;
+
+   public ProfitBricksComputeServiceLiveTest() {
+      provider = "profitbricks";
+   }
+
+   @BeforeGroups(groups = {"integration", "live"})
+   @Override
+   public void setupContext() {
+      super.setupContext();
+
+      final DataCenterApi api = getDataCenterApi();
+      final Predicate<String> predicate = getDataCenterPredicate();
+      dataCenter = FluentIterable.from(api.getAllDataCenters()).firstMatch(new Predicate<DataCenter>() {
+
+         @Override
+         public boolean apply(DataCenter input) {
+            boolean match = Objects.equals(input.name(), TEST_DC_NAME);
+            if (match && input.location() == testLocation)
+               return predicate.apply(input.id());
+            return match;
+         }
+      }).or(new Supplier<DataCenter>() {
+
+         @Override
+         public DataCenter get() {
+            DataCenter dataCenter = api.createDataCenter(
+                    DataCenter.Request.creatingPayload(TEST_DC_NAME, testLocation));
+            predicate.apply(dataCenter.id());
+
+            return api.getDataCenter(dataCenter.id());
+         }
+      });
+   }
+
+   @AfterClass(groups = {"integration", "live"}, alwaysRun = true)
+   @Override
+   protected void tearDownContext() {
+      super.tearDownContext();
+      if (dataCenter != null)
+         getDataCenterApi().deleteDataCenter(dataCenter.id());
+   }
+
+   private Predicate<String> getDataCenterPredicate() {
+      return client.getContext().utils().injector().getInstance(Key.get(new TypeLiteral<Predicate<String>>() {
+      }, Names.named(POLL_PREDICATE_DATACENTER)));
+   }
+
+   private DataCenterApi getDataCenterApi() {
+      return client.getContext().unwrapApi(ProfitBricksApi.class).dataCenterApi();
+   }
+
+   @Override
+   protected Module getSshModule() {
+      return new SshjSshClientModule();
+   }
+
+   @Override
+   protected LoggingModule getLoggingModule() {
+      return new SLF4JLoggingModule();
+   }
+
+   @Override
+   public void testOptionToNotBlock() throws Exception {
+      // ProfitBricks implementation intentionally blocks until the node is 'AVAILABLE'
+   }
+
+   @Override
+   protected void checkTagsInNodeEquals(NodeMetadata node, ImmutableSet<String> tags) {
+      // ProfitBricks doesn't support tags
+   }
+
+   @Override
+   protected void checkUserMetadataContains(NodeMetadata node, ImmutableMap<String, String> userMetadata) {
+      // ProfitBricks doesn't support user metadata
+   }
+
+   @Override
+   protected void checkResponseEqualsHostname(ExecResponse execResponse, NodeMetadata node1) {
+      // ProfitBricks doesn't support hostname
+   }
+
+   @Override
+   protected void checkOsMatchesTemplate(NodeMetadata node) {
+      // Not enough description from API to match template
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java
new file mode 100644
index 0000000..9c2b228
--- /dev/null
+++ b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/config/StatusPredicateTest.java
@@ -0,0 +1,145 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.profitbricks.compute.config;
+
+import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
+import static org.testng.Assert.assertEquals;
+
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.profitbricks.ProfitBricksApi;
+import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule.DataCenterProvisioningStatePredicate;
+import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule.ServerStatusPredicate;
+import org.jclouds.profitbricks.compute.config.ProfitBricksComputeServiceContextModule.SnapshotProvisioningStatePredicate;
+import org.jclouds.profitbricks.domain.ProvisioningState;
+import org.jclouds.profitbricks.domain.Server;
+import org.jclouds.profitbricks.domain.Snapshot;
+import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
+import org.jclouds.util.Predicates2;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicate;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+
+/**
+ * Test class for {@link DataCenterProvisioningStatePredicate} and {@link ServerStatusPredicate}
+ */
+@Test(groups = "unit", testName = "ProvisioningStatusPollingPredicateTest")
+public class StatusPredicateTest extends BaseProfitBricksMockTest {
+
+   @Test
+   public void testDataCenterPredicate() throws Exception {
+      MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/datacenter/datacenter-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/datacenter/datacenter-state.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new DataCenterProvisioningStatePredicate(pbApi, ProvisioningState.AVAILABLE),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
+      try {
+         waitUntilAvailable.apply(id);
+         ProvisioningState finalState = pbApi.dataCenterApi().getDataCenterState(id);
+         assertRequestHasCommonProperties(server.takeRequest());
+         assertEquals(finalState, ProvisioningState.AVAILABLE);
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testServerPredicate() throws Exception {
+      MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/server/server-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/server/server.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new ServerStatusPredicate(pbApi, Server.Status.RUNNING),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
+      try {
+         waitUntilAvailable.apply(id);
+         Server remoteServer = pbApi.serverApi().getServer(id);
+         assertEquals(remoteServer.status(), Server.Status.RUNNING);
+         assertRequestHasCommonProperties(server.takeRequest());
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+   @Test
+   public void testSnapshotPredicate() throws Exception {
+      MockWebServer server = mockWebServer();
+
+      byte[] payloadInProcess = payloadFromResource("/snapshot/snapshot-state-inprocess.xml");
+      byte[] payloadAvailable = payloadFromResource("/snapshot/snapshot.xml");
+
+      // wait 3 times
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadInProcess));
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      server.enqueue(new MockResponse().setBody(payloadAvailable));
+
+      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
+
+      Predicate<String> waitUntilAvailable = Predicates2.retry(
+              new SnapshotProvisioningStatePredicate(pbApi, ProvisioningState.AVAILABLE),
+              30l, 1l, TimeUnit.SECONDS);
+
+      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
+      try {
+         waitUntilAvailable.apply(id);
+         Snapshot snapshot = pbApi.snapshotApi().getSnapshot(id);
+         assertEquals(snapshot.state(), ProvisioningState.AVAILABLE);
+         assertRequestHasCommonProperties(server.takeRequest());
+      } finally {
+         pbApi.close();
+         server.shutdown();
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/52c6c2b7/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
----------------------------------------------------------------------
diff --git a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java b/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
deleted file mode 100644
index 690412a..0000000
--- a/providers/profitbricks/src/test/java/org/jclouds/profitbricks/compute/internal/ProvisioningStatusPollingPredicateTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.profitbricks.compute.internal;
-
-import static org.jclouds.profitbricks.internal.BaseProfitBricksMockTest.mockWebServer;
-import static org.testng.Assert.assertEquals;
-
-import java.util.concurrent.TimeUnit;
-
-import org.jclouds.profitbricks.ProfitBricksApi;
-import org.jclouds.profitbricks.domain.ProvisioningState;
-import org.jclouds.profitbricks.internal.BaseProfitBricksMockTest;
-import org.jclouds.util.Predicates2;
-import org.testng.annotations.Test;
-
-import com.google.common.base.Predicate;
-import com.squareup.okhttp.mockwebserver.MockResponse;
-import com.squareup.okhttp.mockwebserver.MockWebServer;
-
-/**
- * Tests for the {@link ProvisioningStatusPollingPredicate} class.
- * <p>
- */
-@Test(groups = "unit", testName = "ProvisioningStatusPollingPredicateTest")
-public class ProvisioningStatusPollingPredicateTest extends BaseProfitBricksMockTest {
-
-   @Test
-   public void testDataCenterPredicate() throws Exception {
-      MockWebServer server = mockWebServer();
-
-      byte[] payloadInProcess = payloadFromResource("/datacenter/datacenter-state-inprocess.xml");
-      byte[] payloadAvailable = payloadFromResource("/datacenter/datacenter-state.xml");
-
-      // wait 3 times
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-
-      Predicate<String> waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.DATACENTER, ProvisioningState.AVAILABLE),
-              30l, 1l, TimeUnit.SECONDS);
-
-      String id = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
-      try {
-         waitUntilAvailable.apply(id);
-         ProvisioningState finalState = pbApi.dataCenterApi().getDataCenterState(id);
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertEquals(finalState, ProvisioningState.AVAILABLE);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testServerPredicate() throws Exception {
-      MockWebServer server = mockWebServer();
-
-      byte[] payloadInProcess = payloadFromResource("/server/server-state-inprocess.xml");
-      byte[] payloadAvailable = payloadFromResource("/server/server.xml");
-
-      // wait 3 times
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-
-      Predicate<String> waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.SERVER, ProvisioningState.AVAILABLE),
-              30l, 1l, TimeUnit.SECONDS);
-
-      String id = "qwertyui-qwer-qwer-qwer-qwertyyuiiop";
-      try {
-         waitUntilAvailable.apply(id);
-         ProvisioningState finalState = pbApi.serverApi().getServer(id).state();
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertEquals(finalState, ProvisioningState.AVAILABLE);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testStoragePredicate() throws Exception {
-      MockWebServer server = mockWebServer();
-
-      byte[] payloadInProcess = payloadFromResource("/storage/storage-state-inprocess.xml");
-      byte[] payloadAvailable = payloadFromResource("/storage/storage.xml");
-
-      // wait 3 times
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-
-      Predicate<String> waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.STORAGE, ProvisioningState.AVAILABLE),
-              30l, 1l, TimeUnit.SECONDS);
-
-      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
-      try {
-         waitUntilAvailable.apply(id);
-         ProvisioningState finalState = pbApi.storageApi().getStorage(id).state();
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertEquals(finalState, ProvisioningState.AVAILABLE);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-   @Test
-   public void testSnapshotPredicate() throws Exception {
-      MockWebServer server = mockWebServer();
-
-      byte[] payloadInProcess = payloadFromResource("/snapshot/snapshot-state-inprocess.xml");
-      byte[] payloadAvailable = payloadFromResource("/snapshot/snapshot.xml");
-
-      // wait 3 times
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadInProcess));
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      server.enqueue(new MockResponse().setBody(payloadAvailable));
-
-      ProfitBricksApi pbApi = api(server.getUrl(rootUrl));
-
-      Predicate<String> waitUntilAvailable = Predicates2.retry(
-              new ProvisioningStatusPollingPredicate(pbApi, ProvisioningStatusAware.SNAPSHOT, ProvisioningState.AVAILABLE),
-              30l, 1l, TimeUnit.SECONDS);
-
-      String id = "qswdefrg-qaws-qaws-defe-rgrgdsvcxbrh";
-      try {
-         waitUntilAvailable.apply(id);
-         ProvisioningState finalState = pbApi.snapshotApi().getSnapshot(id).state();
-         assertRequestHasCommonProperties(server.takeRequest());
-         assertEquals(finalState, ProvisioningState.AVAILABLE);
-      } finally {
-         pbApi.close();
-         server.shutdown();
-      }
-   }
-
-}

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

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

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

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


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

Posted by de...@apache.org.
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.*")