Repository: jclouds-labs
Updated Branches:
  refs/heads/master bb9dfbafb -> e95de6a70


Profitbricks REST - NIC 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/e95de6a7
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/e95de6a7
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/e95de6a7

Branch: refs/heads/master
Commit: e95de6a708288c2bb128a1a60a246e7eaeff0dbf
Parents: bb9dfba
Author: mirza-spc <[email protected]>
Authored: Tue Mar 22 14:41:36 2016 +0100
Committer: Ignasi Barrera <[email protected]>
Committed: Mon Mar 28 17:07:34 2016 +0200

----------------------------------------------------------------------
 .../profitbricks/rest/ProfitBricksApi.java      |   4 +
 .../binder/BaseProfitBricksRequestBinder.java   |   4 +-
 .../binder/image/UpdateImageRequestBinder.java  |  28 ++--
 .../rest/binder/nic/CreateNicRequestBinder.java |  84 +++++++++++
 .../rest/binder/nic/UpdateNicRequestBinder.java |  72 +++++++++
 .../binder/server/AttachCdromRequestBinder.java |   4 +-
 .../server/AttachVolumeRequestBinder.java       |   4 +-
 .../server/CreateServerRequestBinder.java       |   6 +-
 .../server/UpdateServerRequestBinder.java       |  16 +-
 .../snapshot/UpdateSnapshotRequestBinder.java   |  30 ++--
 .../volume/CreateVolumeRequestBinder.java       |   4 +-
 .../volume/UpdateVolumeRequestBinder.java       |   8 +-
 .../jclouds/profitbricks/rest/domain/Nic.java   | 115 +++++++++++++-
 .../profitbricks/rest/features/NicApi.java      | 126 ++++++++++++++++
 .../rest/features/NicApiLiveTest.java           | 151 +++++++++++++++++++
 .../rest/features/NicApiMockTest.java           | 151 +++++++++++++++++++
 .../src/test/resources/nic/get.json             |  31 ++++
 .../src/test/resources/nic/list.json            |  38 +++++
 18 files changed, 818 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/ProfitBricksApi.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/ProfitBricksApi.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/ProfitBricksApi.java
index 90e5fc8..a0ab0c0 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/ProfitBricksApi.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/ProfitBricksApi.java
@@ -21,6 +21,7 @@ import com.google.common.annotations.Beta;
 import java.io.Closeable;
 import org.apache.jclouds.profitbricks.rest.features.DataCenterApi;
 import org.apache.jclouds.profitbricks.rest.features.ImageApi;
+import org.apache.jclouds.profitbricks.rest.features.NicApi;
 import org.apache.jclouds.profitbricks.rest.features.ServerApi;
 import org.apache.jclouds.profitbricks.rest.features.SnapshotApi;
 import org.apache.jclouds.profitbricks.rest.features.VolumeApi;
@@ -43,5 +44,8 @@ public interface ProfitBricksApi extends Closeable {
    
    @Delegate
    SnapshotApi snapshotApi();
+   
+   @Delegate
+   NicApi nicApi();
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/BaseProfitBricksRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/BaseProfitBricksRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/BaseProfitBricksRequestBinder.java
index dae21b9..3c8753c 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/BaseProfitBricksRequestBinder.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/BaseProfitBricksRequestBinder.java
@@ -33,14 +33,14 @@ public abstract class BaseProfitBricksRequestBinder<T> 
implements MapBinder {
 
    protected final Supplier<URI> endpointSupplier;
    protected final String paramName;
-   protected final Map<String, Object> formMap;
+   protected final Map<String, Object> requestBuilder;
    protected final Json jsonBinder;
 
    @Inject
    protected BaseProfitBricksRequestBinder(String paramName, Json jsonBinder, 
Supplier<URI> endpointSupplier) {
       this.paramName = checkNotNull(paramName, "Initialize 'paramName' in 
constructor");
       this.jsonBinder = jsonBinder;
-      this.formMap = new HashMap<String, Object>();
+      this.requestBuilder = new HashMap<String, Object>();
       this.endpointSupplier = endpointSupplier;
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/image/UpdateImageRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/image/UpdateImageRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/image/UpdateImageRequestBinder.java
index 7fa4998..dca1f4b 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/image/UpdateImageRequestBinder.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/image/UpdateImageRequestBinder.java
@@ -44,45 +44,45 @@ public class UpdateImageRequestBinder extends 
BaseProfitBricksRequestBinder<Imag
       imageId = payload.id();
 
       if (payload.name() != null)
-        formMap.put("name", payload.name());
+        requestBuilder.put("name", payload.name());
 
       if (payload.description() != null)
-        formMap.put("description", payload.description());
+        requestBuilder.put("description", payload.description());
 
       if (payload.licenceType() != null)
-        formMap.put("licenceType", payload.licenceType());
+        requestBuilder.put("licenceType", payload.licenceType());
 
       if (payload.cpuHotPlug() != null)
-        formMap.put("cpuHotPlug", payload.cpuHotPlug());
+        requestBuilder.put("cpuHotPlug", payload.cpuHotPlug());
 
       if (payload.cpuHotUnplug() != null)
-        formMap.put("cpuHotUnplug", payload.cpuHotUnplug());
+        requestBuilder.put("cpuHotUnplug", payload.cpuHotUnplug());
 
       if (payload.ramHotPlug() != null)
-        formMap.put("ramHotPlug", payload.ramHotPlug());
+        requestBuilder.put("ramHotPlug", payload.ramHotPlug());
 
       if (payload.ramHotUnplug() != null)
-        formMap.put("ramHotUnplug", payload.ramHotUnplug());
+        requestBuilder.put("ramHotUnplug", payload.ramHotUnplug());
 
       if (payload.nicHotPlug() != null)
-        formMap.put("nicHotPlug", payload.nicHotPlug());
+        requestBuilder.put("nicHotPlug", payload.nicHotPlug());
 
       if (payload.nicHotUnplug() != null)
-        formMap.put("nicHotUnplug", payload.nicHotUnplug());
+        requestBuilder.put("nicHotUnplug", payload.nicHotUnplug());
 
       if (payload.discVirtioHotPlug() != null)
-        formMap.put("discVirtioHotPlug", payload.discVirtioHotPlug());
+        requestBuilder.put("discVirtioHotPlug", payload.discVirtioHotPlug());
 
       if (payload.discVirtioHotUnplug() != null)
-        formMap.put("discVirtioHotUnplug", payload.discVirtioHotUnplug());
+        requestBuilder.put("discVirtioHotUnplug", 
payload.discVirtioHotUnplug());
 
       if (payload.discScsiHotPlug() != null)
-        formMap.put("discScsiHotPlug", payload.discScsiHotPlug());
+        requestBuilder.put("discScsiHotPlug", payload.discScsiHotPlug());
 
       if (payload.discScsiHotUnplug() != null)
-        formMap.put("discScsiHotUnplug", payload.discScsiHotUnplug());
+        requestBuilder.put("discScsiHotUnplug", payload.discScsiHotUnplug());
       
-      return jsonBinder.toJson(formMap);
+      return jsonBinder.toJson(requestBuilder);
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/nic/CreateNicRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/nic/CreateNicRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/nic/CreateNicRequestBinder.java
new file mode 100644
index 0000000..3a432a5
--- /dev/null
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/nic/CreateNicRequestBinder.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.apache.jclouds.profitbricks.rest.binder.nic;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.base.Supplier;
+import com.google.inject.Inject;
+import java.net.URI;
+import java.util.HashMap;
+import java.util.Map;
+import 
org.apache.jclouds.profitbricks.rest.binder.BaseProfitBricksRequestBinder;
+import org.apache.jclouds.profitbricks.rest.domain.Nic;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.json.Json;
+import org.jclouds.location.Provider;
+
+public class CreateNicRequestBinder extends 
BaseProfitBricksRequestBinder<Nic.Request.CreatePayload> {
+
+   private String dataCenterId;
+   private String serverId;
+
+   @Inject
+   CreateNicRequestBinder(Json jsonBinder,  @Provider Supplier<URI> 
endpointSupplier) {
+      super("nic", jsonBinder, endpointSupplier);
+   }
+
+   @Override
+   protected String createPayload(Nic.Request.CreatePayload payload) {
+      
+      checkNotNull(payload, "payload");
+      checkNotNull(payload.dataCenterId(), "dataCenterId");
+      checkNotNull(payload.serverId(), "serverId");
+
+      dataCenterId = payload.dataCenterId();
+      serverId = payload.serverId();
+            
+      Map<String, Object> properties = new HashMap<String, Object>();
+      
+      properties.put("lan",  payload.lan());
+      
+      if (payload.name() != null)
+         properties.put("name", payload.name());
+      
+      if (payload.ips() != null && !payload.ips().isEmpty())
+         properties.put("ips", payload.ips());
+      
+      if (payload.dhcp() != null)
+         properties.put("dhcp", payload.dhcp());
+      
+      if (payload.firewallActive() != null)
+         properties.put("firewallActive", payload.firewallActive());
+      
+      if (payload.firewallrules() != null) {
+         Map<String, Object> entities = new HashMap<String, Object>();
+         entities.put("firewallrules", payload.firewallrules());
+         properties.put("entities", entities);
+      }
+      
+      requestBuilder.put("properties", properties);
+      
+      return jsonBinder.toJson(requestBuilder);
+   }
+
+   @Override
+   protected <R extends HttpRequest> R createRequest(R fromRequest, String 
payload) {              
+      R request = (R) 
fromRequest.toBuilder().replacePath(String.format("/rest/datacenters/%s/servers/%s/nics",
 dataCenterId, serverId)).build();
+      return super.createRequest(request, payload);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/nic/UpdateNicRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/nic/UpdateNicRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/nic/UpdateNicRequestBinder.java
new file mode 100644
index 0000000..7bb92fc
--- /dev/null
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/nic/UpdateNicRequestBinder.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.apache.jclouds.profitbricks.rest.binder.nic;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import com.google.common.base.Supplier;
+import com.google.inject.Inject;
+import java.net.URI;
+import 
org.apache.jclouds.profitbricks.rest.binder.BaseProfitBricksRequestBinder;
+import org.apache.jclouds.profitbricks.rest.domain.Nic;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.json.Json;
+import org.jclouds.location.Provider;
+
+public class UpdateNicRequestBinder extends 
BaseProfitBricksRequestBinder<Nic.Request.UpdatePayload> {
+
+   private String dataCenterId;
+   private String serverId;
+   private String nicId;
+
+   @Inject
+   UpdateNicRequestBinder(Json jsonBinder,  @Provider Supplier<URI> 
endpointSupplier) {
+      super("nic", jsonBinder, endpointSupplier);
+   }
+
+   @Override
+   protected String createPayload(Nic.Request.UpdatePayload payload) {
+            
+      checkNotNull(payload, "payload");
+      checkNotNull(payload.dataCenterId(), "dataCenterId");
+      checkNotNull(payload.serverId(), "serverId");
+      checkNotNull(payload.id(), "id");
+      
+      dataCenterId = payload.dataCenterId();
+      serverId = payload.serverId();
+      nicId = payload.id();
+            
+      requestBuilder.put("lan",  payload.lan());
+      
+      if (payload.name() != null)
+         requestBuilder.put("name", payload.name());
+      
+      if (payload.ips() != null && !payload.ips().isEmpty())
+         requestBuilder.put("ips", payload.ips());
+      
+      if (payload.dhcp() != null)
+         requestBuilder.put("dhcp", payload.dhcp());
+      
+      return jsonBinder.toJson(requestBuilder);
+   }
+
+   @Override
+   protected <R extends HttpRequest> R createRequest(R fromRequest, String 
payload) {              
+      R request = (R) 
fromRequest.toBuilder().replacePath(String.format("/rest/datacenters/%s/servers/%s/nics/%s",
 dataCenterId, serverId, nicId)).build();
+      return super.createRequest(request, payload);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachCdromRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachCdromRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachCdromRequestBinder.java
index 8315cce..33f19d9 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachCdromRequestBinder.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachCdromRequestBinder.java
@@ -48,8 +48,8 @@ public class AttachCdromRequestBinder extends 
BaseProfitBricksRequestBinder<Serv
       dataCenterId = payload.dataCenterId();
       serverId = payload.serverId();
       
-      formMap.put("id", payload.imageId());
-      return jsonBinder.toJson(formMap);
+      requestBuilder.put("id", payload.imageId());
+      return jsonBinder.toJson(requestBuilder);
    }
    
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachVolumeRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachVolumeRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachVolumeRequestBinder.java
index b4178f4..ca37d15 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachVolumeRequestBinder.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/AttachVolumeRequestBinder.java
@@ -48,8 +48,8 @@ public class AttachVolumeRequestBinder extends 
BaseProfitBricksRequestBinder<Ser
       dataCenterId = payload.dataCenterId();
       serverId = payload.serverId();
       
-      formMap.put("id", payload.volumeId());
-      return jsonBinder.toJson(formMap);
+      requestBuilder.put("id", payload.volumeId());
+      return jsonBinder.toJson(requestBuilder);
    }
    
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/CreateServerRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/CreateServerRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/CreateServerRequestBinder.java
index d7a2a97..ae2e87a 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/CreateServerRequestBinder.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/CreateServerRequestBinder.java
@@ -61,7 +61,7 @@ public class CreateServerRequestBinder extends 
BaseProfitBricksRequestBinder<Ser
       else if (payload.bootCdrom() != null)
          properties.put("bootCdrom", payload.bootCdrom());
       
-      formMap.put("properties", properties);
+      requestBuilder.put("properties", properties);
       
       Server.Entities entities = payload.entities();
       
@@ -75,10 +75,10 @@ public class CreateServerRequestBinder extends 
BaseProfitBricksRequestBinder<Ser
          if (entities.nics() != null)
             entitiesParams.put("nics", entities.nics());
          
-         formMap.put("entities", entitiesParams);
+         requestBuilder.put("entities", entitiesParams);
       }
 
-      return jsonBinder.toJson(formMap);
+      return jsonBinder.toJson(requestBuilder);
    }
   
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/UpdateServerRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/UpdateServerRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/UpdateServerRequestBinder.java
index 61ebf81..a9be7d1 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/UpdateServerRequestBinder.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/server/UpdateServerRequestBinder.java
@@ -45,22 +45,22 @@ public class UpdateServerRequestBinder extends 
BaseProfitBricksRequestBinder<Ser
       dataCenterId = payload.dataCenterId();
       serverId = payload.id();
       
-      formMap.put("name",  payload.name());
-      formMap.put("ram",   payload.ram());
-      formMap.put("cores", payload.cores());
+      requestBuilder.put("name",  payload.name());
+      requestBuilder.put("ram",   payload.ram());
+      requestBuilder.put("cores", payload.cores());
       
       if (payload.availabilityZone() != null)
-         formMap.put("availabilityzone", payload.availabilityZone());
+         requestBuilder.put("availabilityzone", payload.availabilityZone());
       
       if (payload.licenceType() != null)
-         formMap.put("licencetype", payload.licenceType());
+         requestBuilder.put("licencetype", payload.licenceType());
       
       if (payload.bootVolume() != null)
-         formMap.put("bootVolume", payload.bootVolume());
+         requestBuilder.put("bootVolume", payload.bootVolume());
       else if (payload.bootCdrom() != null)
-         formMap.put("bootCdrom", payload.bootCdrom());
+         requestBuilder.put("bootCdrom", payload.bootCdrom());
       
-      return jsonBinder.toJson(formMap);
+      return jsonBinder.toJson(requestBuilder);
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/snapshot/UpdateSnapshotRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/snapshot/UpdateSnapshotRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/snapshot/UpdateSnapshotRequestBinder.java
index 5b9f984..1db1cb6 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/snapshot/UpdateSnapshotRequestBinder.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/snapshot/UpdateSnapshotRequestBinder.java
@@ -21,10 +21,10 @@ import 
org.apache.jclouds.profitbricks.rest.binder.BaseProfitBricksRequestBinder
 import org.apache.jclouds.profitbricks.rest.domain.Snapshot;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.json.Json;
-import static com.google.common.base.Preconditions.checkNotNull;
 import com.google.common.base.Supplier;
 import java.net.URI;
 import org.jclouds.location.Provider;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 public class UpdateSnapshotRequestBinder extends 
BaseProfitBricksRequestBinder<Snapshot.Request.UpdatePayload> {
 
@@ -43,45 +43,45 @@ public class UpdateSnapshotRequestBinder extends 
BaseProfitBricksRequestBinder<S
       snapshotId = payload.id();
 
       if (payload.name() != null)
-        formMap.put("name", payload.name());
+        requestBuilder.put("name", payload.name());
 
       if (payload.description() != null)
-        formMap.put("description", payload.description());
+        requestBuilder.put("description", payload.description());
 
       if (payload.licenceType() != null)
-        formMap.put("licenceType", payload.licenceType());
+        requestBuilder.put("licenceType", payload.licenceType());
 
       if (payload.cpuHotPlug() != null)
-        formMap.put("cpuHotPlug", payload.cpuHotPlug());
+        requestBuilder.put("cpuHotPlug", payload.cpuHotPlug());
 
       if (payload.cpuHotUnplug() != null)
-        formMap.put("cpuHotUnplug", payload.cpuHotUnplug());
+        requestBuilder.put("cpuHotUnplug", payload.cpuHotUnplug());
 
       if (payload.ramHotPlug() != null)
-        formMap.put("ramHotPlug", payload.ramHotPlug());
+        requestBuilder.put("ramHotPlug", payload.ramHotPlug());
 
       if (payload.ramHotUnplug() != null)
-        formMap.put("ramHotUnplug", payload.ramHotUnplug());
+        requestBuilder.put("ramHotUnplug", payload.ramHotUnplug());
 
       if (payload.nicHotPlug() != null)
-        formMap.put("nicHotPlug", payload.nicHotPlug());
+        requestBuilder.put("nicHotPlug", payload.nicHotPlug());
 
       if (payload.nicHotUnplug() != null)
-        formMap.put("nicHotUnplug", payload.nicHotUnplug());
+        requestBuilder.put("nicHotUnplug", payload.nicHotUnplug());
 
       if (payload.discVirtioHotPlug() != null)
-        formMap.put("discVirtioHotPlug", payload.discVirtioHotPlug());
+        requestBuilder.put("discVirtioHotPlug", payload.discVirtioHotPlug());
 
       if (payload.discVirtioHotUnplug() != null)
-        formMap.put("discVirtioHotUnplug", payload.discVirtioHotUnplug());
+        requestBuilder.put("discVirtioHotUnplug", 
payload.discVirtioHotUnplug());
 
       if (payload.discScsiHotPlug() != null)
-        formMap.put("discScsiHotPlug", payload.discScsiHotPlug());
+        requestBuilder.put("discScsiHotPlug", payload.discScsiHotPlug());
 
       if (payload.discScsiHotUnplug() != null)
-        formMap.put("discScsiHotUnplug", payload.discScsiHotUnplug());
+        requestBuilder.put("discScsiHotUnplug", payload.discScsiHotUnplug());
       
-      return jsonBinder.toJson(formMap);
+      return jsonBinder.toJson(requestBuilder);
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/CreateVolumeRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/CreateVolumeRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/CreateVolumeRequestBinder.java
index 661499e..a642c2f 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/CreateVolumeRequestBinder.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/CreateVolumeRequestBinder.java
@@ -68,9 +68,9 @@ public class CreateVolumeRequestBinder extends 
BaseProfitBricksRequestBinder<Vol
       else if (payload.licenceType() != null)
          properties.put("licenceType", payload.licenceType());
       
-      formMap.put("properties", properties);
+      requestBuilder.put("properties", properties);
       
-      return jsonBinder.toJson(formMap);
+      return jsonBinder.toJson(requestBuilder);
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/UpdateVolumeRequestBinder.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/UpdateVolumeRequestBinder.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/UpdateVolumeRequestBinder.java
index e300f73..6a21e6a 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/UpdateVolumeRequestBinder.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/binder/volume/UpdateVolumeRequestBinder.java
@@ -46,15 +46,15 @@ public class UpdateVolumeRequestBinder extends 
BaseProfitBricksRequestBinder<Vol
       volumeId = payload.id();
       
       if (payload.name() != null)
-         formMap.put("name",  payload.name());
+         requestBuilder.put("name",  payload.name());
       
       if (payload.size() != null)
-         formMap.put("size",  payload.size());
+         requestBuilder.put("size",  payload.size());
       
       if (payload.bus() != null)
-         formMap.put("bus",  payload.bus());
+         requestBuilder.put("bus",  payload.bus());
       
-      return jsonBinder.toJson(formMap);
+      return jsonBinder.toJson(requestBuilder);
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Nic.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Nic.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Nic.java
index c32b32b..10b75da 100644
--- 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Nic.java
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/domain/Nic.java
@@ -27,6 +27,12 @@ import org.jclouds.javax.annotation.Nullable;
 public abstract class Nic {
 
    public abstract String id();
+   
+   @Nullable
+   public abstract String dataCenterId();
+   
+   @Nullable
+   public abstract String serverId();   
 
    public abstract String type();
 
@@ -41,9 +47,9 @@ public abstract class Nic {
    @Nullable
    public abstract Entities entities();
 
-   @SerializedNames({"id", "type", "href", "metadata", "properties", 
"entities"})
-   public static Nic create(String id, String type, String href, Metadata 
metadata, Properties properties, Entities entities) {
-      return new AutoValue_Nic(id, type, href, metadata, properties, entities);
+   @SerializedNames({"id", "dataCenterId", "serverId", "type", "href", 
"metadata", "properties", "entities"})
+   public static Nic create(String id, String dataCenterId, String serverId, 
String type, String href, Metadata metadata, Properties properties, Entities 
entities) {
+      return new AutoValue_Nic(id, dataCenterId, serverId, type, href, 
metadata, properties, entities);
    }
 
    @AutoValue
@@ -52,21 +58,24 @@ public abstract class Nic {
       @Nullable
       public abstract String name();
 
+      @Nullable
       public abstract String mac();
 
       public abstract List<String> ips();
 
-      public abstract boolean dhcp();
+      @Nullable
+      public abstract Boolean dhcp();
 
       public abstract int lan();
 
-      public abstract boolean firewallActive();
+      @Nullable
+      public abstract Boolean firewallActive();
 
       @Nullable
       public abstract Entities entities();
 
       @SerializedNames({"name", "mac", "ips", "dhcp", "lan", "firewallActive", 
"entities"})
-      public static Properties create(String name, String mac, List<String> 
ips, boolean dhcp, int lan, boolean firewallactive, Entities entities) {
+      public static Properties create(String name, String mac, List<String> 
ips, Boolean dhcp, int lan, Boolean firewallactive, Entities entities) {
         return new AutoValue_Nic_Properties(name, mac, ips == null ? 
ImmutableList.<String>of() : copyOf(ips), dhcp, lan, firewallactive, entities);
       }
    }
@@ -81,5 +90,99 @@ public abstract class Nic {
         return new AutoValue_Nic_Entities(firewallrules);
       }
    }
+   
+   public static final class Request {
+
+      public static CreatePayload.Builder creatingBuilder() {
+         return new AutoValue_Nic_Request_CreatePayload.Builder();
+      }
+
+      public static UpdatePayload.Builder updatingBuilder() {
+         return new AutoValue_Nic_Request_UpdatePayload.Builder();
+      }
+
+      @AutoValue
+      public abstract static class CreatePayload {
+
+         @Nullable
+         public abstract String name();
+
+         @Nullable
+         public abstract List<String> ips();
+
+         @Nullable
+         public abstract Boolean dhcp();
+
+         public abstract int lan();
+         
+         @Nullable
+         public abstract Boolean firewallActive();
+         
+         @Nullable
+         public abstract List<FirewallRule> firewallrules();
+
+         public abstract String dataCenterId();
+         public abstract String serverId();
+
+         @AutoValue.Builder
+         public abstract static class Builder {
+
+            public abstract Builder name(String name);
+            public abstract Builder ips(List<String> ips);
+            public abstract Builder dhcp(Boolean dhcp);
+            public abstract Builder lan(int lan);
+            public abstract Builder firewallActive(Boolean firewallActive);
+            public abstract Builder firewallrules(List<FirewallRule> 
firewallrules);
+            public abstract Builder dataCenterId(String dataCenterId);
+            public abstract Builder serverId(String serverId);
+           
+            abstract CreatePayload autoBuild();
+
+            public CreatePayload build() {
+               return autoBuild();
+            }
+         }
+      }
+
+      @AutoValue
+      public abstract static class UpdatePayload {
+
+         @Nullable
+         public abstract String name();
+
+         @Nullable
+         public abstract List<String> ips();
+
+         @Nullable
+         public abstract Boolean dhcp();
+
+         @Nullable
+         public abstract Integer lan();
+         
+         public abstract String dataCenterId();
+         public abstract String serverId();
+         public abstract String id();
+
+         @AutoValue.Builder
+         public abstract static class Builder {
+            public abstract Builder name(String name);
+            public abstract Builder ips(List<String> ips);
+            public abstract Builder dhcp(Boolean dhcp);
+            public abstract Builder lan(Integer lan);
+            public abstract Builder dataCenterId(String dataCenterId);
+            public abstract Builder serverId(String serverId);
+            public abstract Builder id(String id);
+           
+            abstract UpdatePayload autoBuild();
+
+            public UpdatePayload build() {
+               return autoBuild();
+            }
+         }
+      }
+      
+   }
+   
 
 }
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/features/NicApi.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/features/NicApi.java
 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/features/NicApi.java
new file mode 100644
index 0000000..965ddad
--- /dev/null
+++ 
b/profitbricks-rest/src/main/java/org/apache/jclouds/profitbricks/rest/features/NicApi.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jclouds.profitbricks.rest.features;
+
+import com.google.inject.Inject;
+import com.google.inject.TypeLiteral;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Type;
+import java.util.List;
+import javax.inject.Named;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import org.apache.jclouds.profitbricks.rest.binder.nic.CreateNicRequestBinder;
+import org.apache.jclouds.profitbricks.rest.binder.nic.UpdateNicRequestBinder;
+import org.apache.jclouds.profitbricks.rest.domain.Nic;
+import org.apache.jclouds.profitbricks.rest.domain.options.DepthOptions;
+import org.apache.jclouds.profitbricks.rest.util.ParseId;
+import org.jclouds.Fallbacks;
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.http.filters.BasicAuthentication;
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.PATCH;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.util.Strings2;
+
+@Path("/datacenters/{dataCenterId}/servers/{serverId}/nics")
+@RequestFilters(BasicAuthentication.class)
+public interface NicApi extends Closeable {
+   
+   @Named("nic:list")
+   @GET
+   @SelectJson("items")
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<Nic> list(@PathParam("dataCenterId") String dataCenterId, 
@PathParam("serverId") String serverId);
+
+   @Named("nic:list")
+   @GET
+   @SelectJson("items")
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<Nic> list(@PathParam("dataCenterId") String dataCenterId, 
@PathParam("serverId") String serverId, DepthOptions options);
+   
+   @Named("nic:get")
+   @GET   
+   @Path("/{nicId}")
+   @ResponseParser(NicApi.NicParser.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Nic get(@PathParam("dataCenterId") String dataCenterId, 
@PathParam("serverId") String serverId, @PathParam("nicId") String nicId);
+
+   @Named("nic:get")
+   @GET   
+   @Path("/{nicId}")
+   @ResponseParser(NicApi.NicParser.class)
+   @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+   Nic get(@PathParam("dataCenterId") String dataCenterId, 
@PathParam("serverId") String serverId, @PathParam("nicId") String nicId, 
DepthOptions options);
+   
+   @Named("nic:create")
+   @POST
+   @MapBinder(CreateNicRequestBinder.class)
+   @ResponseParser(NicApi.NicParser.class)
+   Nic create(@PayloadParam("nic") Nic.Request.CreatePayload payload);
+   
+   @Named("nic:update")
+   @PATCH
+   @Path("/{nicId}")
+   @MapBinder(UpdateNicRequestBinder.class)
+   @ResponseParser(NicApi.NicParser.class)
+   @Produces("application/vnd.profitbricks.partial-properties+json")
+   Nic update(@PayloadParam("nic") Nic.Request.UpdatePayload payload);
+   
+   @Named("nic:delete")
+   @DELETE
+   @Path("/{nicId}")
+   @Fallback(Fallbacks.VoidOnNotFoundOr404.class)
+   void delete(@PathParam("dataCenterId") String dataCenterId, 
@PathParam("serverId") String serverId, @PathParam("nicId") String nicId);
+   
+   static final class NicParser extends ParseJson<Nic> {
+      
+      private final ParseId parseService;
+            
+      @Inject NicParser(Json json, ParseId parseId) {
+         super(json, TypeLiteral.get(Nic.class));
+         this.parseService = parseId;
+      }
+      
+      @Override      
+      public <V> V apply(InputStream stream, Type type) throws IOException {
+         try {
+            return (V) json.fromJson(this.parseService.parseId(
+               this.parseService.parseId(Strings2.toStringAndClose(stream), 
"datacenters", "dataCenterId"),
+               "servers", 
+               "serverId"
+            ), type);
+         } finally {
+            if (stream != null)
+               stream.close();
+         }
+      }
+   }
+   
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/NicApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/NicApiLiveTest.java
 
b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/NicApiLiveTest.java
new file mode 100644
index 0000000..b2f4860
--- /dev/null
+++ 
b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/NicApiLiveTest.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jclouds.profitbricks.rest.features;
+
+import com.google.common.base.Predicate;
+import java.util.List;
+import org.apache.jclouds.profitbricks.rest.domain.DataCenter;
+import org.apache.jclouds.profitbricks.rest.domain.State;
+import org.apache.jclouds.profitbricks.rest.domain.Nic;
+import org.apache.jclouds.profitbricks.rest.domain.Server;
+import org.apache.jclouds.profitbricks.rest.ids.ServerRef;
+import org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksLiveTest;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+
+@Test(groups = "live", testName = "NicApiLiveTest")
+public class NicApiLiveTest extends BaseProfitBricksLiveTest {
+   
+   private DataCenter dataCenter;
+   private Server testServer;
+   private Nic testNic;
+  
+   @BeforeClass
+   public void setupTest() {
+      dataCenter = createDataCenter();
+      assertDataCenterAvailable(dataCenter);
+            
+      testServer = api.serverApi().createServer(
+         Server.Request.creatingBuilder()
+            .dataCenterId(dataCenter.id())
+            .name("jclouds-node")
+            .cores(1)
+            .ram(1024)
+            .build());
+      
+      assertNodeAvailable(ServerRef.create(dataCenter.id(), testServer.id()));
+   }
+   
+   @AfterClass(alwaysRun = true)
+   public void teardownTest() {
+      if (dataCenter != null)
+         deleteDataCenter(dataCenter.id());
+   }
+     
+   @Test
+   public void testCreateNic() {
+      assertNotNull(dataCenter);
+            
+      testNic = nicApi().create(
+              Nic.Request.creatingBuilder()
+              .dataCenterId(dataCenter.id())
+              .serverId(testServer.id())
+              .name("jclouds-nic")
+              .lan(1)
+              .build());
+
+      assertNotNull(testNic);
+      assertEquals(testNic.properties().name(), "jclouds-nic");
+      assertNicAvailable(testNic);
+   }
+   
+
+   @Test(dependsOnMethods = "testCreateNic")
+   public void testGetNic() {
+      Nic nic = nicApi().get(dataCenter.id(), testServer.id(), testNic.id());
+
+      assertNotNull(nic);
+      assertEquals(nic.id(), testNic.id());
+   }
+
+   @Test(dependsOnMethods = "testCreateNic")
+   public void testList() {
+      List<Nic> nics = nicApi().list(dataCenter.id(), testServer.id());
+
+      assertNotNull(nics);
+      assertFalse(nics.isEmpty());
+      assertEquals(nics.size(), 1);
+   }
+   
+   @Test(dependsOnMethods = "testGetNic")
+   public void testUpdateNic() {
+      assertDataCenterAvailable(dataCenter);
+      
+      nicApi().update(
+              Nic.Request.updatingBuilder()
+              .dataCenterId(testNic.dataCenterId())
+              .serverId(testServer.id())
+              .id(testNic.id())
+              .name("apache-nic")
+              .build());
+
+      assertNicAvailable(testNic);
+      
+      Nic nic = nicApi().get(dataCenter.id(), testServer.id(), testNic.id());
+      
+      assertEquals(nic.properties().name(), "apache-nic");
+   }
+   
+
+   @Test(dependsOnMethods = "testUpdateNic", alwaysRun = true)
+   public void testDeleteNic() {
+      nicApi().delete(testNic.dataCenterId(), testServer.id(), testNic.id());
+      assertNicRemoved(testNic);
+   } 
+   
+   private void assertNicAvailable(Nic nic) {
+      assertPredicate(new Predicate<Nic>() {
+         @Override
+         public boolean apply(Nic testNic) {
+            Nic nic = nicApi().get(testNic.dataCenterId(), testNic.serverId(), 
testNic.id());
+            
+            if (nic == null || nic.metadata() == null)
+               return false;
+            
+            return nic.metadata().state() == State.AVAILABLE;
+         }
+      }, nic);
+   }
+   
+   private void assertNicRemoved(Nic nic) {
+      assertPredicate(new Predicate<Nic>() {
+         @Override
+         public boolean apply(Nic testNic) {
+            return nicApi().get(testNic.dataCenterId(), testNic.serverId(), 
testNic.id()) == null;
+         }
+      }, nic);
+   }
+     
+   private NicApi nicApi() {
+      return api.nicApi();
+   }
+   
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/NicApiMockTest.java
----------------------------------------------------------------------
diff --git 
a/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/NicApiMockTest.java
 
b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/NicApiMockTest.java
new file mode 100644
index 0000000..1ba8c76
--- /dev/null
+++ 
b/profitbricks-rest/src/test/java/org/apache/jclouds/profitbricks/rest/features/NicApiMockTest.java
@@ -0,0 +1,151 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jclouds.profitbricks.rest.features;
+
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import java.util.List;
+import org.apache.jclouds.profitbricks.rest.domain.Nic;
+import org.apache.jclouds.profitbricks.rest.domain.options.DepthOptions;
+import 
org.apache.jclouds.profitbricks.rest.internal.BaseProfitBricksApiMockTest;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import org.testng.annotations.Test;
+
+@Test(groups = "unit", testName = "NicApiMockTest", singleThreaded = true)
+public class NicApiMockTest extends BaseProfitBricksApiMockTest {
+   
+   @Test
+   public void testGetList() throws InterruptedException {
+      server.enqueue(
+         new MockResponse().setBody(stringFromResource("/nic/list.json"))
+      );
+      
+      List<Nic> list = nicApi().list("datacenter-id", "server-id");
+      
+      assertNotNull(list);
+      assertEquals(list.size(), 1);
+      assertEquals(list.get(0).properties().name(), "Test Nic");
+      
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", 
"/datacenters/datacenter-id/servers/server-id/nics");
+   }
+   
+   @Test
+   public void testGetListWith404() throws InterruptedException {
+      server.enqueue(response404());
+      List<Nic> list = nicApi().list("datacenter-id", "server-id", new 
DepthOptions().depth(1));
+      assertTrue(list.isEmpty());
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", 
"/datacenters/datacenter-id/servers/server-id/nics?depth=1");
+   }
+    
+   @Test
+   public void testGetNic() throws InterruptedException {
+      MockResponse response = new MockResponse();
+      response.setBody(stringFromResource("/nic/get.json"));
+      response.setHeader("Content-Type", 
"application/vnd.profitbricks.resource+json");
+      
+      server.enqueue(response);
+      
+      Nic nic = nicApi().get("datacenter-id", "server-id", "some-id");
+      
+      assertNotNull(nic);
+      assertEquals(nic.properties().name(), "test nic");
+      
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", 
"/datacenters/datacenter-id/servers/server-id/nics/some-id");
+   }
+   
+   public void testGetNicWith404() throws InterruptedException {
+      server.enqueue(response404());
+
+      Nic nic = nicApi().get("datacenter-id", "server-id", "some-id");
+      
+      assertEquals(nic, null);
+
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "GET", 
"/datacenters/datacenter-id/servers/server-id/nics/some-id");
+   }
+   
+   @Test
+   public void testCreate() throws InterruptedException {
+      server.enqueue(
+         new MockResponse().setBody(stringFromResource("/nic/get.json"))
+      );
+      
+      Nic nic = nicApi().create(
+              Nic.Request.creatingBuilder()
+              .dataCenterId("datacenter-id")
+              .serverId("server-id")
+              .name("jclouds-nic")
+              .lan(1)
+              .build());
+
+      assertNotNull(nic);
+      assertNotNull(nic.id());
+      
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "POST", 
"/rest/datacenters/datacenter-id/servers/server-id/nics", 
+              "{\"properties\": {\"name\": \"jclouds-nic\", \"lan\": 1}}"
+      );
+   }
+   
+   @Test
+   public void testUpdate() throws InterruptedException {
+      server.enqueue(
+         new MockResponse().setBody(stringFromResource("/nic/get.json"))
+      );
+      
+      api.nicApi().update(
+              Nic.Request.updatingBuilder()
+              .id("some-id")
+              .dataCenterId("datacenter-id")
+              .serverId("server-id")
+              .name("apache-nic")
+              .build());
+            
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "PATCH", 
"/rest/datacenters/datacenter-id/servers/server-id/nics/some-id", "{\"name\": 
\"apache-nic\"}");
+   }
+   
+   @Test
+   public void testDelete() throws InterruptedException {
+      server.enqueue(
+         new MockResponse().setBody("")
+      );
+      
+      nicApi().delete("datacenter-id", "server-id", "some-id");
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "DELETE", 
"/datacenters/datacenter-id/servers/server-id/nics/some-id");
+   }
+   
+   @Test
+   public void testDeleteWith404() throws InterruptedException {
+      server.enqueue(response404());
+
+      nicApi().delete("datacenter-id", "server-id", "some-id");
+      
+      assertEquals(server.getRequestCount(), 1);
+      assertSent(server, "DELETE", 
"/datacenters/datacenter-id/servers/server-id/nics/some-id");
+   }
+           
+   private NicApi nicApi() {
+      return api.nicApi();
+   }
+   
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/test/resources/nic/get.json
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/resources/nic/get.json 
b/profitbricks-rest/src/test/resources/nic/get.json
new file mode 100644
index 0000000..8b00001
--- /dev/null
+++ b/profitbricks-rest/src/test/resources/nic/get.json
@@ -0,0 +1,31 @@
+{
+  "id": "01ea3bd9-047c-4941-85cf-ed6b7a2d1d7d",
+  "type": "nic",
+  "href": 
"https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/364f0f1c-7384-462b-8f0c-cfc4c3f6e2b2/nics/01ea3bd9-047c-4941-85cf-ed6b7a2d1d7d";,
+  "metadata": {
+    "createdDate": "2015-02-09T22:46:38Z",
+    "createdBy": "[email protected]",
+    "etag": "b4854a82738079d2c7f43b5324bd92e3",
+    "lastModifiedDate": "2015-02-09T22:46:38Z",
+    "lastModifiedBy": "[email protected]",
+    "state": "AVAILABLE"
+  },
+  "properties": {
+    "name": "test nic",
+    "mac": "02:01:94:9e:f4:a9",
+    "ips": [
+      "208.94.39.76"
+    ],
+    "dhcp": true,
+    "lan": 1,
+    "firewallActive": false
+  },
+  "entities": {
+    "firewallrules": {
+      "id": "01ea3bd9-047c-4941-85cf-ed6b7a2d1d7d/firewallrules",
+      "type": "collection",
+      "href": 
"https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/364f0f1c-7384-462b-8f0c-cfc4c3f6e2b2/nics/01ea3bd9-047c-4941-85cf-ed6b7a2d1d7d/firewallrules";,
+      "items": []
+    }
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/e95de6a7/profitbricks-rest/src/test/resources/nic/list.json
----------------------------------------------------------------------
diff --git a/profitbricks-rest/src/test/resources/nic/list.json 
b/profitbricks-rest/src/test/resources/nic/list.json
new file mode 100644
index 0000000..6d0098b
--- /dev/null
+++ b/profitbricks-rest/src/test/resources/nic/list.json
@@ -0,0 +1,38 @@
+{
+  "id": "364f0f1c-7384-462b-8f0c-cfc4c3f6e2b2/nics",
+  "type": "collection",
+  "href": 
"https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/364f0f1c-7384-462b-8f0c-cfc4c3f6e2b2/nics";,
+  "items": [
+    {
+      "id": "01ea3bd9-047c-4941-85cf-ed6b7a2d1d7d",
+      "type": "nic",
+      "href": 
"https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/364f0f1c-7384-462b-8f0c-cfc4c3f6e2b2/nics/01ea3bd9-047c-4941-85cf-ed6b7a2d1d7d";,
+      "metadata": {
+        "createdDate": "2015-02-09T22:46:38Z",
+        "createdBy": "[email protected]",
+        "etag": "b4854a82738079d2c7f43b5324bd92e3",
+        "lastModifiedDate": "2015-02-09T22:46:38Z",
+        "lastModifiedBy": "[email protected]",
+        "state": "AVAILABLE"
+      },
+      "properties": {
+        "name": "Test Nic",
+        "mac": "02:01:94:9e:f4:a9",
+        "ips": [
+          "208.94.39.76"
+        ],
+        "dhcp": true,
+        "lan": 1,
+        "firewallActive": false
+      },
+      "entities": {
+        "firewallrules": {
+          "id": "01ea3bd9-047c-4941-85cf-ed6b7a2d1d7d/firewallrules",
+          "type": "collection",
+          "href": 
"https://api.profitbricks.com/rest/datacenters/b0ac144e-e294-415f-ba39-6737d5a9d419/servers/364f0f1c-7384-462b-8f0c-cfc4c3f6e2b2/nics/01ea3bd9-047c-4941-85cf-ed6b7a2d1d7d/firewallrules";,
+          "items": []
+        }
+      }
+    }
+  ]
+}
\ No newline at end of file


Reply via email to