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

jclouds-labs git commit: JCLOUDS-1167 oneandone-privatenetwork-api

Repository: jclouds-labs
Updated Branches:
  refs/heads/master bb178c714 -> 80e5c9116


JCLOUDS-1167 oneandone-privatenetwork-api


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

Branch: refs/heads/master
Commit: 80e5c91161feff705b802738a9bd869b101ee135
Parents: bb178c7
Author: alibazlamit <al...@ali-G751JT>
Authored: Fri Sep 9 12:35:11 2016 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Sep 19 12:02:05 2016 +0200

----------------------------------------------------------------------
 .../jclouds/oneandone/rest/OneAndOneApi.java    |   4 +
 .../oneandone/rest/domain/DataCenter.java       |  15 +-
 .../jclouds/oneandone/rest/domain/Dvd.java      |  13 +-
 .../oneandone/rest/domain/PrivateNetwork.java   | 116 ++++++++
 .../rest/features/PrivateNetworkApi.java        | 101 +++++++
 .../features/PrivateNetworkApiMockTest.java     | 263 +++++++++++++++++++
 .../features/PrivateNetworksApiLiveTest.java    | 135 ++++++++++
 .../rest/internal/BaseOneAndOneLiveTest.java    |   3 +
 .../src/test/resources/privatenetwork/get.json  |  25 ++
 .../src/test/resources/privatenetwork/list.json |  34 +++
 .../resources/privatenetwork/list.options.json  |  34 +++
 .../resources/privatenetwork/server.get.json    |   4 +
 .../resources/privatenetwork/servers.list.json  |  10 +
 13 files changed, 742 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java
----------------------------------------------------------------------
diff --git a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java
index cfd08a9..2b0e9d7 100644
--- a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java
+++ b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/OneAndOneApi.java
@@ -20,6 +20,7 @@ import java.io.Closeable;
 import org.apache.jclouds.oneandone.rest.features.FirewallPolicyApi;
 import org.apache.jclouds.oneandone.rest.features.ImageApi;
 import org.apache.jclouds.oneandone.rest.features.LoadBalancerApi;
+import org.apache.jclouds.oneandone.rest.features.PrivateNetworkApi;
 import org.apache.jclouds.oneandone.rest.features.PublicIpApi;
 import org.apache.jclouds.oneandone.rest.features.ServerApi;
 import org.apache.jclouds.oneandone.rest.features.SharedStorageApi;
@@ -44,4 +45,7 @@ public interface OneAndOneApi extends Closeable {
 
    @Delegate
    PublicIpApi publicIpApi();
+
+   @Delegate
+   PrivateNetworkApi privateNetworkApi();
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java
----------------------------------------------------------------------
diff --git a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java
index c2d129f..95e2bf3 100644
--- a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java
+++ b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/DataCenter.java
@@ -21,15 +21,14 @@ import org.jclouds.json.SerializedNames;
 
 @AutoValue
 public abstract class DataCenter {
+    public abstract String id();
 
-   public abstract String id();
+    public abstract String countryCode();
 
-   public abstract String countryCode();
+    public abstract String location();
 
-   public abstract String location();
-
-   @SerializedNames({"id", "country_code", "location"})
-   public static DataCenter create(String id, String countryCode, String location) {
-      return new AutoValue_DataCenter(id, countryCode, location);
-   }
+    @SerializedNames({"id", "country_code", "location"})
+    public static DataCenter create(String id, String countryCode, String location) {
+        return new AutoValue_DataCenter(id, countryCode, location);
+    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java
----------------------------------------------------------------------
diff --git a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java
index 865eb48..dd778be 100644
--- a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java
+++ b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/Dvd.java
@@ -21,13 +21,12 @@ import org.jclouds.json.SerializedNames;
 
 @AutoValue
 public abstract class Dvd {
+    public abstract String id();
 
-   public abstract String id();
+    public abstract String name();
 
-   public abstract String name();
-
-   @SerializedNames({"id", "name"})
-   public static Dvd create(String id, String name) {
-      return new AutoValue_Dvd(id, name);
-   }
+    @SerializedNames({"id", "name"})
+    public static Dvd create(String id, String name) {
+        return new AutoValue_Dvd(id, name);
+    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/PrivateNetwork.java
----------------------------------------------------------------------
diff --git a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/PrivateNetwork.java b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/PrivateNetwork.java
index 5a01fc7..487acf5 100644
--- a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/PrivateNetwork.java
+++ b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/domain/PrivateNetwork.java
@@ -58,4 +58,120 @@ public abstract class PrivateNetwork {
    public static PrivateNetwork create(String id, String name, String description, String networkAddress, String subnetMask, GenericState state, String creationDate, List<Server> servers, String cloudpanelId, DataCenter datacenter) {
       return new AutoValue_PrivateNetwork(id, name, description, networkAddress, subnetMask, state, creationDate, servers == null ? ImmutableList.<Server>of() : servers, cloudpanelId, datacenter);
    }
+
+   @AutoValue
+   public abstract static class CreatePrivateNetwork {
+
+      public abstract String name();
+
+      @Nullable
+      public abstract String description();
+
+      @Nullable
+      public abstract String networkAddress();
+
+      @Nullable
+      public abstract String subnetMask();
+
+      @Nullable
+      public abstract String datacenterId();
+
+      @SerializedNames({"name", "description", "network_address", "subnet_mask", "datacenter_id"})
+      public static CreatePrivateNetwork create(String name, String description, String networkAddress, String subnetMask, String datacenterId) {
+         return builder()
+                 .name(name)
+                 .description(description)
+                 .subnetMask(subnetMask)
+                 .networkAddress(networkAddress)
+                 .datacenterId(datacenterId)
+                 .build();
+      }
+
+      public static Builder builder() {
+         return new AutoValue_PrivateNetwork_CreatePrivateNetwork.Builder();
+      }
+
+      @AutoValue.Builder
+      public abstract static class Builder {
+
+         public abstract Builder name(String name);
+
+         public abstract Builder description(String description);
+
+         public abstract Builder networkAddress(String networkAddress);
+
+         public abstract Builder subnetMask(String subnetMask);
+
+         public abstract Builder datacenterId(String datacenterId);
+
+         public abstract CreatePrivateNetwork build();
+      }
+   }
+
+   @AutoValue
+   public abstract static class UpdatePrivateNetwork {
+
+      public abstract String name();
+
+      @Nullable
+      public abstract String description();
+
+      @Nullable
+      public abstract String networkAddress();
+
+      @Nullable
+      public abstract String subnetMask();
+
+      @SerializedNames({"name", "description", "network_address", "subnet_mask"})
+      public static UpdatePrivateNetwork create(String name, String description, String networkAddress, String subnetMask) {
+         return builder()
+                 .name(name)
+                 .description(description)
+                 .subnetMask(subnetMask)
+                 .networkAddress(networkAddress)
+                 .build();
+      }
+
+      public static Builder builder() {
+         return new AutoValue_PrivateNetwork_UpdatePrivateNetwork.Builder();
+      }
+
+      @AutoValue.Builder
+      public abstract static class Builder {
+
+         public abstract Builder name(String name);
+
+         public abstract Builder description(String description);
+
+         public abstract Builder networkAddress(String networkAddress);
+
+         public abstract Builder subnetMask(String subnetMask);
+
+         public abstract UpdatePrivateNetwork build();
+      }
+   }
+
+   @AutoValue
+   public abstract static class Server {
+
+      public abstract String id();
+
+      public abstract String name();
+
+      @SerializedNames({"id", "name"})
+      public static Server create(String id, String name) {
+         return new AutoValue_PrivateNetwork_Server(id, name);
+      }
+
+      @AutoValue
+      public abstract static class CreateServer {
+
+         public abstract List<String> servers();
+
+         @SerializedNames({"servers"})
+         public static CreateServer create(List<String> servers) {
+            return new AutoValue_PrivateNetwork_Server_CreateServer(servers == null ? ImmutableList.<String>of() : ImmutableList.copyOf(servers));
+         }
+      }
+   }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworkApi.java
----------------------------------------------------------------------
diff --git a/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworkApi.java b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworkApi.java
new file mode 100644
index 0000000..3f97250
--- /dev/null
+++ b/oneandone/src/main/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworkApi.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.apache.jclouds.oneandone.rest.features;
+
+import java.util.List;
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import org.apache.jclouds.oneandone.rest.domain.PrivateNetwork;
+import org.apache.jclouds.oneandone.rest.domain.PrivateNetwork.Server;
+import org.apache.jclouds.oneandone.rest.domain.options.GenericQueryOptions;
+import org.apache.jclouds.oneandone.rest.filters.AuthenticateRequest;
+import org.jclouds.Fallbacks;
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+@Path("/private_networks")
+@Produces("application/json")
+@Consumes("application/json")
+@RequestFilters(AuthenticateRequest.class)
+public interface PrivateNetworkApi {
+
+   @Named("privatenetwork:list")
+   @GET
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<PrivateNetwork> list();
+
+   @Named("privatenetwork:list")
+   @GET
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<PrivateNetwork> list(GenericQueryOptions options);
+
+   @Named("privatenetwork:get")
+   @GET
+   @Path("/{privateNetworkId}")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   PrivateNetwork get(@PathParam("privateNetworkId") String privateNetworkId);
+
+   @Named("privatenetwork:create")
+   @POST
+   PrivateNetwork create(@BinderParam(BindToJsonPayload.class) PrivateNetwork.CreatePrivateNetwork privateNetwork);
+
+   @Named("privatenetwork:update")
+   @PUT
+   @Path("/{privateNetworkId}")
+   PrivateNetwork update(@PathParam("privateNetworkId") String privateNetworkId, @BinderParam(BindToJsonPayload.class) PrivateNetwork.UpdatePrivateNetwork privateNetwork);
+
+   @Named("privatenetwork:delete")
+   @DELETE
+   @Path("/{privateNetworkId}")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @MapBinder(BindToJsonPayload.class)
+   PrivateNetwork delete(@PathParam("privateNetworkId") String privateNetworkId);
+
+   @Named("sharedstorages:servers:list")
+   @GET
+   @Path("/{privateNetworkId}/servers")
+   @Fallback(Fallbacks.EmptyListOnNotFoundOr404.class)
+   List<Server> listServers(@PathParam("privateNetworkId") String privateNetworkId);
+
+   @Named("sharedstorages:servers:create")
+   @POST
+   @Path("/{privateNetworkId}/servers")
+   PrivateNetwork attachServer(@PathParam("privateNetworkId") String privateNetworkId, @BinderParam(BindToJsonPayload.class) PrivateNetwork.Server.CreateServer server);
+
+   @Named("sharedstorages:servers:get")
+   @GET
+   @Path("/{privateNetworkId}/servers/{serverId}")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Server getServer(@PathParam("privateNetworkId") String privateNetworkId, @PathParam("serverId") String serverId);
+
+   @Named("sharedstorages:servers:delete")
+   @DELETE
+   @Path("/{privateNetworkId}/servers/{serverId}")
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   @MapBinder(BindToJsonPayload.class)
+   PrivateNetwork detachServer(@PathParam("privateNetworkId") String privateNetworkId, @PathParam("serverId") String serverId);
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworkApiMockTest.java
----------------------------------------------------------------------
diff --git a/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworkApiMockTest.java b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworkApiMockTest.java
new file mode 100644
index 0000000..9032ed7
--- /dev/null
+++ b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworkApiMockTest.java
@@ -0,0 +1,263 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jclouds.oneandone.rest.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.jclouds.oneandone.rest.domain.PrivateNetwork;
+import org.apache.jclouds.oneandone.rest.domain.options.GenericQueryOptions;
+import org.apache.jclouds.oneandone.rest.internal.BaseOneAndOneApiMockTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "PrivateNetworkApiMockTest", singleThreaded = true)
+public class PrivateNetworkApiMockTest extends BaseOneAndOneApiMockTest {
+
+   private PrivateNetworkApi privateNetworkApi() {
+      return api.privateNetworkApi();
+   }
+
+   @Test
+   public void testList() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/list.json"))
+      );
+
+      List<PrivateNetwork> networks = privateNetworkApi().list();
+
+      assertNotNull(networks);
+      assertEquals(networks.size(), 2);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks");
+   }
+
+   @Test
+   public void testList404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404));
+
+      List<PrivateNetwork> networks = privateNetworkApi().list();
+
+      assertEquals(networks.size(), 0);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks");
+   }
+
+   @Test
+   public void testListWithOption() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/list.options.json"))
+      );
+      GenericQueryOptions options = new GenericQueryOptions();
+      options.options(0, 0, null, "New", null);
+      List<PrivateNetwork> result = privateNetworkApi().list(options);
+
+      assertNotNull(result);
+      assertEquals(result.size(), 2);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks?q=New");
+   }
+
+   @Test
+   public void testListWithOption404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404));
+
+      GenericQueryOptions options = new GenericQueryOptions();
+      options.options(0, 0, null, "New", null);
+      List<PrivateNetwork> result = privateNetworkApi().list(options);
+
+      assertEquals(result.size(), 0);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks?q=New");
+   }
+
+   public void testGet() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/get.json"))
+      );
+      PrivateNetwork result = privateNetworkApi().get("privatenetworkId");
+
+      assertNotNull(result);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks/privatenetworkId");
+   }
+
+   public void testGet404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404));
+
+      PrivateNetwork result = privateNetworkApi().get("privatenetworkId");
+
+      assertEquals(result, null);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks/privatenetworkId");
+   }
+
+   @Test
+   public void testCreate() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/get.json"))
+      );
+
+      PrivateNetwork response = privateNetworkApi().create(PrivateNetwork.CreatePrivateNetwork.builder()
+              .name("name")
+              .networkAddress("192.168.1.0")
+              .subnetMask("255.255.255.0")
+              .build());
+
+      assertNotNull(response);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "POST", "/private_networks", "{\"name\":\"name\",\"network_address\":\"192.168.1.0\",\"subnet_mask\":\"255.255.255.0\"}");
+   }
+
+   @Test
+   public void testUpdate() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/get.json"))
+      );
+      PrivateNetwork response = privateNetworkApi().update("privatenetworkId", PrivateNetwork.UpdatePrivateNetwork.builder()
+              .name("name")
+              .build()
+      );
+
+      assertNotNull(response);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "PUT", "/private_networks/privatenetworkId", "{\"name\":\"name\"}");
+   }
+
+   @Test
+   public void testDelete() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/get.json"))
+      );
+      PrivateNetwork response = privateNetworkApi().delete("privatenetworkId");
+
+      assertNotNull(response);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "DELETE", "/private_networks/privatenetworkId");
+   }
+
+   @Test
+   public void testDelete404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404));
+      PrivateNetwork response = privateNetworkApi().delete("privatenetworkId");
+
+      assertEquals(response, null);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "DELETE", "/private_networks/privatenetworkId");
+   }
+
+   @Test
+   public void testListServers() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/servers.list.json"))
+      );
+
+      List<PrivateNetwork.Server> servers = privateNetworkApi().listServers("privatenetworkId");
+
+      assertNotNull(servers);
+      assertEquals(servers.size(), 2);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks/privatenetworkId/servers");
+   }
+
+   @Test
+   public void testListServers404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404));
+
+      List<PrivateNetwork.Server> servers = privateNetworkApi().listServers("privatenetworkId");
+
+      assertEquals(servers.size(), 0);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks/privatenetworkId/servers");
+   }
+
+   @Test
+   public void testGetServer() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/server.get.json"))
+      );
+      PrivateNetwork.Server result = privateNetworkApi().getServer("privatenetworkId", "serverId");
+
+      assertNotNull(result);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks/privatenetworkId/servers/serverId");
+   }
+
+   @Test
+   public void testGetServer404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404));
+
+      PrivateNetwork.Server result = privateNetworkApi().getServer("privatenetworkId", "serverId");
+
+      assertEquals(result, null);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", "/private_networks/privatenetworkId/servers/serverId");
+   }
+
+   @Test
+   public void testAttachServer() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/get.json"))
+      );
+
+      List<String> servers = new ArrayList<String>();
+      String toAdd = "server_id";
+      servers.add(toAdd);
+      PrivateNetwork response = privateNetworkApi().attachServer("privatenetworkId", PrivateNetwork.Server.CreateServer.create(servers));
+
+      assertNotNull(response);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "POST", "/private_networks/privatenetworkId/servers", "{\"servers\":[\"server_id\"]}");
+   }
+
+   @Test
+   public void testDetachServer() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setBody(stringFromResource("/privatenetwork/get.json"))
+      );
+      PrivateNetwork response = privateNetworkApi().detachServer("privatenetworkId", "serverId");
+
+      assertNotNull(response);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "DELETE", "/private_networks/privatenetworkId/servers/serverId");
+   }
+
+   @Test
+   public void testDetachServer404() throws InterruptedException {
+      server.enqueue(
+              new MockResponse().setResponseCode(404));
+
+      PrivateNetwork response = privateNetworkApi().detachServer("privatenetworkId", "serverId");
+
+      assertEquals(response, null);
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "DELETE", "/private_networks/privatenetworkId/servers/serverId");
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworksApiLiveTest.java
----------------------------------------------------------------------
diff --git a/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworksApiLiveTest.java b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworksApiLiveTest.java
new file mode 100644
index 0000000..466430b
--- /dev/null
+++ b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/features/PrivateNetworksApiLiveTest.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.apache.jclouds.oneandone.rest.features;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.jclouds.oneandone.rest.domain.PrivateNetwork;
+import org.apache.jclouds.oneandone.rest.domain.Server;
+import org.apache.jclouds.oneandone.rest.domain.options.GenericQueryOptions;
+import org.apache.jclouds.oneandone.rest.ids.ServerPrivateNetworkRef;
+import org.apache.jclouds.oneandone.rest.internal.BaseOneAndOneLiveTest;
+import org.testng.Assert;
+import static org.testng.Assert.assertEquals;
+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 = "PrivateNetworksApiLiveTest")
+public class PrivateNetworksApiLiveTest extends BaseOneAndOneLiveTest {
+
+   private PrivateNetwork currentPrivateNetwork;
+   private List<PrivateNetwork> privateNetworks;
+   private Server currentServer;
+
+   private PrivateNetworkApi privateNetworkApi() {
+
+      return api.privateNetworkApi();
+   }
+
+   @BeforeClass
+   public void setupTest() {
+      currentServer = createServer("privatenetwork jclouds server");
+      assertNodeAvailable(currentServer);
+      currentPrivateNetwork = privateNetworkApi().create(PrivateNetwork.CreatePrivateNetwork.builder()
+              .name("jclouds privatenetwork")
+              .networkAddress("192.168.1.0")
+              .subnetMask("255.255.255.0")
+              .build());
+   }
+
+   @Test
+   public void testList() {
+      privateNetworks = privateNetworkApi().list();
+
+      Assert.assertTrue(privateNetworks.size() > 0);
+   }
+
+   public void testListWithOption() {
+      GenericQueryOptions options = new GenericQueryOptions();
+      options.options(0, 0, null, "jclouds", null);
+      List<PrivateNetwork> resultWithQuery = privateNetworkApi().list(options);
+
+      Assert.assertTrue(resultWithQuery.size() > 0);
+   }
+
+   public void testGet() {
+      PrivateNetwork result = privateNetworkApi().get(currentPrivateNetwork.id());
+
+      assertEquals(result.id(), currentPrivateNetwork.id());
+   }
+
+   public void testUpdate() throws InterruptedException {
+      String updatedName = "updatejclouds PN";
+
+      PrivateNetwork updateResult = privateNetworkApi().update(currentPrivateNetwork.id(), PrivateNetwork.UpdatePrivateNetwork.builder()
+              .name(updatedName)
+              .build());
+
+      assertEquals(updateResult.name(), updatedName);
+
+   }
+
+   @Test(dependsOnMethods = "testUpdate")
+   public void testAttachServer() throws InterruptedException {
+      List<String> servers = new ArrayList<String>();
+      String toAdd = currentServer.id();
+      servers.add(toAdd);
+
+      PrivateNetwork updateResult = privateNetworkApi().attachServer(currentPrivateNetwork.id(), PrivateNetwork.Server.CreateServer.create(servers));
+
+      assertNotNull(updateResult);
+
+   }
+
+   @Test(dependsOnMethods = "testAttachServer")
+   public void testListServers() {
+      assertPrivateNetworkAvailable(ServerPrivateNetworkRef.create(currentServer.id(), currentPrivateNetwork.id()));
+      List<PrivateNetwork.Server> servers = privateNetworkApi().listServers(currentPrivateNetwork.id());
+
+      Assert.assertTrue(servers.size() > 0);
+   }
+
+   @Test(dependsOnMethods = "testAttachServer")
+   public void testServerGet() {
+      PrivateNetwork.Server result = privateNetworkApi().getServer(currentPrivateNetwork.id(), currentServer.id());
+
+      assertEquals(result.id(), currentServer.id());
+   }
+
+   @Test(dependsOnMethods = "testServerGet")
+   public void testDetachServer() {
+      turnOFFServer(currentServer.id());
+      assertNodeAvailable(currentServer);
+      assertPrivateNetworkAvailable(ServerPrivateNetworkRef.create(currentServer.id(), currentPrivateNetwork.id()));
+      PrivateNetwork result = privateNetworkApi().detachServer(currentPrivateNetwork.id(), currentServer.id());
+
+      assertEquals(result.id(), currentPrivateNetwork.id());
+   }
+
+   @AfterClass(alwaysRun = true)
+   public void teardownTest() throws InterruptedException {
+      if (currentPrivateNetwork != null && currentServer != null) {
+         assertPrivateNetworkAvailable(ServerPrivateNetworkRef.create(currentServer.id(), currentPrivateNetwork.id()));
+         privateNetworkApi().delete(currentPrivateNetwork.id());
+         assertNodeAvailable(currentServer);
+         deleteServer(currentServer.id());
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneLiveTest.java
----------------------------------------------------------------------
diff --git a/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneLiveTest.java b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneLiveTest.java
index b03b44c..78b5eb9 100644
--- a/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneLiveTest.java
+++ b/oneandone/src/test/java/org/apache/jclouds/oneandone/rest/internal/BaseOneAndOneLiveTest.java
@@ -123,4 +123,7 @@ public class BaseOneAndOneLiveTest extends BaseApiLiveTest<OneAndOneApi> {
    protected Server turnOnServer(String serverId) {
       return api.serverApi().updateStatus(serverId, Server.UpdateStatus.create(Types.ServerAction.POWER_ON, Types.ServerActionMethod.SOFTWARE));
    }
+   protected Server turnOFFServer(String serverId) {
+      return api.serverApi().updateStatus(serverId, Server.UpdateStatus.create(Types.ServerAction.POWER_OFF, Types.ServerActionMethod.SOFTWARE));
+}
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/test/resources/privatenetwork/get.json
----------------------------------------------------------------------
diff --git a/oneandone/src/test/resources/privatenetwork/get.json b/oneandone/src/test/resources/privatenetwork/get.json
new file mode 100644
index 0000000..5fff526
--- /dev/null
+++ b/oneandone/src/test/resources/privatenetwork/get.json
@@ -0,0 +1,25 @@
+{
+  "id": "7786BE739765D4EC0635A90C19F44D91",
+  "cloudpanel_id": "pn90282_1",
+  "name": "Private Network",
+  "description": "Private network description",
+  "datacenter": {
+    "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+    "location": "USA",
+    "country_code": "US"
+  },
+  "network_address": null,
+  "subnet_mask": null,
+  "state": "ACTIVE",
+  "creation_date": "2015-04-06T23:48:38Z",
+  "servers": [
+  {
+    "id": "7786BE739765D4EC0635A90C19F44D91",
+    "name": "My server name"
+  },
+  {
+    "id": "7786BE739765D4EC0635A90C19F44D91",
+    "name": "My server name 2"
+  }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/test/resources/privatenetwork/list.json
----------------------------------------------------------------------
diff --git a/oneandone/src/test/resources/privatenetwork/list.json b/oneandone/src/test/resources/privatenetwork/list.json
new file mode 100644
index 0000000..164d12b
--- /dev/null
+++ b/oneandone/src/test/resources/privatenetwork/list.json
@@ -0,0 +1,34 @@
+[
+    {
+        "id": "6058B5DAF8182D20E1C68C3CED78EE22",
+        "name": "My private network",
+        "description": "My private network description",
+        "datacenter": {
+            "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+            "location": "USA",
+            "country_code": "US"
+        },
+        "network_address": "192.168.1.0",
+        "subnet_mask": "255.255.255.0",
+        "state": "ACTIVE",
+        "creation_date": "2015-04-28T10:21:19+00:00",
+        "servers": [],
+        "cloudpanel_id": "pn99AA4_1"
+    },
+    {
+        "id": "6058B5DAF8182D20E1C68C3CED78EE23",
+        "name": "My private network 2",
+        "description": "My private network description",
+        "datacenter": {
+            "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+            "location": "USA",
+            "country_code": "US"
+        },
+        "network_address": null,
+        "subnet_mask": null,
+        "state": "ACTIVE",
+        "creation_date": "2015-04-28T10:21:19+00:00",
+        "servers": [],
+        "cloudpanel_id": "pn99AA4_1"
+    }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/test/resources/privatenetwork/list.options.json
----------------------------------------------------------------------
diff --git a/oneandone/src/test/resources/privatenetwork/list.options.json b/oneandone/src/test/resources/privatenetwork/list.options.json
new file mode 100644
index 0000000..164d12b
--- /dev/null
+++ b/oneandone/src/test/resources/privatenetwork/list.options.json
@@ -0,0 +1,34 @@
+[
+    {
+        "id": "6058B5DAF8182D20E1C68C3CED78EE22",
+        "name": "My private network",
+        "description": "My private network description",
+        "datacenter": {
+            "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+            "location": "USA",
+            "country_code": "US"
+        },
+        "network_address": "192.168.1.0",
+        "subnet_mask": "255.255.255.0",
+        "state": "ACTIVE",
+        "creation_date": "2015-04-28T10:21:19+00:00",
+        "servers": [],
+        "cloudpanel_id": "pn99AA4_1"
+    },
+    {
+        "id": "6058B5DAF8182D20E1C68C3CED78EE23",
+        "name": "My private network 2",
+        "description": "My private network description",
+        "datacenter": {
+            "id": "D0F6D8C8ED29D3036F94C27BBB7BAD36",
+            "location": "USA",
+            "country_code": "US"
+        },
+        "network_address": null,
+        "subnet_mask": null,
+        "state": "ACTIVE",
+        "creation_date": "2015-04-28T10:21:19+00:00",
+        "servers": [],
+        "cloudpanel_id": "pn99AA4_1"
+    }
+]
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/test/resources/privatenetwork/server.get.json
----------------------------------------------------------------------
diff --git a/oneandone/src/test/resources/privatenetwork/server.get.json b/oneandone/src/test/resources/privatenetwork/server.get.json
new file mode 100644
index 0000000..b7f5213
--- /dev/null
+++ b/oneandone/src/test/resources/privatenetwork/server.get.json
@@ -0,0 +1,4 @@
+{
+  "id": "C72CF0A681B0CCE7EC624DD194D585C6",
+  "name": "My server 1"
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/80e5c911/oneandone/src/test/resources/privatenetwork/servers.list.json
----------------------------------------------------------------------
diff --git a/oneandone/src/test/resources/privatenetwork/servers.list.json b/oneandone/src/test/resources/privatenetwork/servers.list.json
new file mode 100644
index 0000000..83935b5
--- /dev/null
+++ b/oneandone/src/test/resources/privatenetwork/servers.list.json
@@ -0,0 +1,10 @@
+[
+{
+  "id": "C72CF0A681B0CCE7EC624DD194D585C6",
+  "name": "My server 1"
+},
+{
+  "id": "4ECD9D188EB457317B2CF8F07885E7B4",
+  "name": "My server 2"
+}
+]
\ No newline at end of file