You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by an...@apache.org on 2015/11/13 16:48:26 UTC

jclouds-labs git commit: add docker NetworkAPI

Repository: jclouds-labs
Updated Branches:
  refs/heads/master 114b35289 -> c57ac931d


add docker NetworkAPI

- bump api version to 1.21
- use `alpine/3.2` image for liveTests
- use `kwart/alpine-ext:3.2-ssh` image as ssh-able image
- assert request bodies created correctly in NetworkApiMockTest


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

Branch: refs/heads/master
Commit: c57ac931de22beb2f4c7a76f44dd6bf225288ebf
Parents: 114b352
Author: Andrea Turli <an...@gmail.com>
Authored: Tue Nov 10 16:49:59 2015 +0100
Committer: Andrea Turli <an...@gmail.com>
Committed: Fri Nov 13 16:47:01 2015 +0100

----------------------------------------------------------------------
 .../internal/BaseAzureComputeApiLiveTest.java   |  22 +-
 docker/README.md                                |   4 +-
 docker/pom.xml                                  |   2 +-
 .../main/java/org/jclouds/docker/DockerApi.java |   8 +-
 .../org/jclouds/docker/DockerApiMetadata.java   |  18 +-
 .../strategy/DockerComputeServiceAdapter.java   |   1 -
 .../java/org/jclouds/docker/domain/Network.java | 107 ++++++++
 .../jclouds/docker/domain/NetworkSettings.java  | 175 +++++++++++-
 .../java/org/jclouds/docker/domain/State.java   |  17 +-
 .../org/jclouds/docker/features/NetworkApi.java | 100 +++++++
 .../docker/compute/BaseDockerApiLiveTest.java   |   5 +
 .../DockerComputeServiceAdapterLiveTest.java    |   7 +-
 .../functions/ContainerToNodeMetadataTest.java  |   6 +-
 .../docker/config/DockerParserModuleTest.java   |  69 ++++-
 .../docker/features/ContainerApiLiveTest.java   |   9 +-
 .../docker/features/ContainerApiMockTest.java   |   2 +-
 .../docker/features/ImageApiLiveTest.java       |   3 -
 .../docker/features/MiscApiLiveTest.java        |  12 +-
 .../docker/features/NetworkApiLiveTest.java     | 125 +++++++++
 .../docker/features/NetworkApiMockTest.java     | 153 +++++++++++
 .../docker/internal/BaseDockerMockTest.java     |  15 ++
 .../docker/parse/ContainerParseTest.java        |  45 +++-
 .../jclouds/docker/parse/NetworkParseTest.java  |  71 +++++
 .../jclouds/docker/parse/NetworksParseTest.java |  97 +++++++
 docker/src/test/resources/container.json        | 270 ++++++++++---------
 docker/src/test/resources/network-creation.json |   4 +
 docker/src/test/resources/network.json          |  30 +++
 docker/src/test/resources/networks.json         |  56 ++++
 28 files changed, 1238 insertions(+), 195 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java
----------------------------------------------------------------------
diff --git a/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java b/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java
index 50344a4..adf716d 100644
--- a/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java
+++ b/azurecompute/src/test/java/org/jclouds/azurecompute/internal/BaseAzureComputeApiLiveTest.java
@@ -21,38 +21,36 @@ import static com.google.common.collect.Iterables.tryFind;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.jclouds.azurecompute.domain.NetworkConfiguration.VirtualNetworkSite;
 import static org.testng.Assert.assertTrue;
-
-import com.google.common.base.Optional;
-import com.google.common.collect.ImmutableList;
-
 import java.util.List;
-import java.util.logging.Logger;
 import java.util.UUID;
 import java.util.logging.Level;
+import java.util.logging.Logger;
 
+import org.jclouds.azurecompute.AzureTestUtils;
+import org.jclouds.azurecompute.AzureTestUtils.SameVirtualNetworkSiteNamePredicate;
 import org.jclouds.azurecompute.domain.CloudService;
+import org.jclouds.azurecompute.domain.CreateStorageServiceParams;
 import org.jclouds.azurecompute.domain.Deployment;
 import org.jclouds.azurecompute.domain.DeploymentParams;
 import org.jclouds.azurecompute.domain.NetworkConfiguration;
-import org.jclouds.azurecompute.domain.NetworkConfiguration.VirtualNetworkConfiguration;
-import org.jclouds.azurecompute.domain.StorageService;
-import org.jclouds.azurecompute.domain.CreateStorageServiceParams;
 import org.jclouds.azurecompute.domain.NetworkConfiguration.AddressSpace;
 import org.jclouds.azurecompute.domain.NetworkConfiguration.Subnet;
-import org.jclouds.azurecompute.AzureTestUtils;
-import org.jclouds.azurecompute.AzureTestUtils.SameVirtualNetworkSiteNamePredicate;
+import org.jclouds.azurecompute.domain.NetworkConfiguration.VirtualNetworkConfiguration;
+import org.jclouds.azurecompute.domain.StorageService;
 import org.jclouds.azurecompute.util.ConflictManagementPredicate;
-
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+
 public class BaseAzureComputeApiLiveTest extends AbstractAzureComputeApiLiveTest {
 
    public static final String DEFAULT_ADDRESS_SPACE = "10.0.0.0/20";
 
    public static final String DEFAULT_SUBNET_ADDRESS_SPACE = "10.0.0.0/23";
 
-   public static final String VIRTUAL_NETWORK_NAME = "jclouds-virtual-network";
+   public static final String VIRTUAL_NETWORK_NAME = "jclouds-virtual-network-live-test";
 
    public static final String DEFAULT_SUBNET_NAME = "jclouds-1";
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/README.md
----------------------------------------------------------------------
diff --git a/docker/README.md b/docker/README.md
index c5080e6..4fdf700 100644
--- a/docker/README.md
+++ b/docker/README.md
@@ -8,7 +8,7 @@ Please follow these steps to configure your workstation for jclouds-docker:
 
 - install the latest Docker release (please visit https://docs.docker.com/installation/)
 
-If you are using `boot2docker` then it can also manage certificates and help you setup `DOCKER_CERT_PATH` and `DOCKER_HOST` environment variables. (See `boot2docker shellinit`)
+If you are using `docker-machine` then it can also manage certificates and help you setup `DOCKER_CERT_PATH` and `DOCKER_HOST` environment variables.
 
 Assuming these environment variables are setup correctly there are no further setups steps are required.
 
@@ -48,7 +48,7 @@ As jclouds docker support is quite new, issues may occasionally arise. Please fo
 
 1. Remove all containers
 
-    $ docker rm `docker ps -a`
+    $ docker rm -f `docker ps -a`
 
 2. remove all the images
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/pom.xml
----------------------------------------------------------------------
diff --git a/docker/pom.xml b/docker/pom.xml
index a10b263..39009fa 100644
--- a/docker/pom.xml
+++ b/docker/pom.xml
@@ -34,7 +34,7 @@
   <packaging>bundle</packaging>
 
   <properties>
-    <test.docker.api-version>1.19</test.docker.api-version>
+    <test.docker.api-version>1.21</test.docker.api-version>
     <test.docker.identity>${env.DOCKER_CERT_PATH}/cert.pem</test.docker.identity>
     <test.docker.credential>${env.DOCKER_CERT_PATH}/key.pem</test.docker.credential>
     <test.docker.cacert.path>${env.DOCKER_CERT_PATH}/ca.pem</test.docker.cacert.path>

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/main/java/org/jclouds/docker/DockerApi.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/DockerApi.java b/docker/src/main/java/org/jclouds/docker/DockerApi.java
index 502f577..4650eac 100644
--- a/docker/src/main/java/org/jclouds/docker/DockerApi.java
+++ b/docker/src/main/java/org/jclouds/docker/DockerApi.java
@@ -16,13 +16,14 @@
  */
 package org.jclouds.docker;
 
+import java.io.Closeable;
+
 import org.jclouds.docker.features.ContainerApi;
 import org.jclouds.docker.features.ImageApi;
 import org.jclouds.docker.features.MiscApi;
+import org.jclouds.docker.features.NetworkApi;
 import org.jclouds.rest.annotations.Delegate;
 
-import java.io.Closeable;
-
 public interface DockerApi extends Closeable {
 
    @Delegate
@@ -34,4 +35,7 @@ public interface DockerApi extends Closeable {
    @Delegate
    ImageApi getImageApi();
 
+   @Delegate
+   NetworkApi getNetworkApi();
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/main/java/org/jclouds/docker/DockerApiMetadata.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/DockerApiMetadata.java b/docker/src/main/java/org/jclouds/docker/DockerApiMetadata.java
index 6585541..9089fd0 100644
--- a/docker/src/main/java/org/jclouds/docker/DockerApiMetadata.java
+++ b/docker/src/main/java/org/jclouds/docker/DockerApiMetadata.java
@@ -16,9 +16,11 @@
  */
 package org.jclouds.docker;
 
-import com.google.auto.service.AutoService;
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
+import static org.jclouds.compute.config.ComputeServiceProperties.TEMPLATE;
+import static org.jclouds.reflect.Reflection2.typeToken;
+import java.net.URI;
+import java.util.Properties;
+
 import org.jclouds.Constants;
 import org.jclouds.apis.ApiMetadata;
 import org.jclouds.compute.ComputeServiceContext;
@@ -28,11 +30,9 @@ import org.jclouds.docker.config.DockerHttpApiModule;
 import org.jclouds.docker.config.DockerParserModule;
 import org.jclouds.rest.internal.BaseHttpApiMetadata;
 
-import java.net.URI;
-import java.util.Properties;
-
-import static org.jclouds.compute.config.ComputeServiceProperties.TEMPLATE;
-import static org.jclouds.reflect.Reflection2.typeToken;
+import com.google.auto.service.AutoService;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
 
 @AutoService(ApiMetadata.class)
 public class DockerApiMetadata extends BaseHttpApiMetadata<DockerApi> {
@@ -70,7 +70,7 @@ public class DockerApiMetadata extends BaseHttpApiMetadata<DockerApi> {
                  .identityName("Path to certificate .pem file")
                  .credentialName("Path to key .pem file")
                  .documentation(URI.create("https://docs.docker.com/reference/api/docker_remote_api/"))
-                 .version("1.16")
+                 .version("1.21")
                  .defaultEndpoint("https://127.0.0.1:2376")
                  .defaultProperties(DockerApiMetadata.defaultProperties())
                  .view(typeToken(ComputeServiceContext.class))

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java b/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
index 6af757f..d800b7e 100644
--- a/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
+++ b/docker/src/main/java/org/jclouds/docker/compute/strategy/DockerComputeServiceAdapter.java
@@ -18,7 +18,6 @@ package org.jclouds.docker.compute.strategy;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Iterables.find;
-
 import java.util.List;
 import java.util.Map;
 import java.util.Set;

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/main/java/org/jclouds/docker/domain/Network.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/Network.java b/docker/src/main/java/org/jclouds/docker/domain/Network.java
new file mode 100644
index 0000000..74f9e81
--- /dev/null
+++ b/docker/src/main/java/org/jclouds/docker/domain/Network.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.docker.domain;
+
+import static org.jclouds.docker.internal.NullSafeCopies.copyOf;
+import java.util.List;
+import java.util.Map;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.json.SerializedNames;
+
+import com.google.auto.value.AutoValue;
+
+@AutoValue
+public abstract class Network {
+
+   @AutoValue
+   public abstract static class IPAM {
+
+      IPAM() {} // For AutoValue only!
+
+      @Nullable
+      public abstract String driver();
+
+      public abstract List<Config> config();
+
+      @SerializedNames({"Driver", "Config"})
+      public static IPAM create(String driver, List<Config> config) {
+         return new AutoValue_Network_IPAM(driver, copyOf(config));
+      }
+
+      @AutoValue
+      public abstract static class Config {
+
+         Config() {} // For AutoValue only!
+
+         public abstract String subnet();
+
+         @Nullable
+         public abstract String ipRange();
+
+         @Nullable
+         public abstract String gateway();
+
+         @SerializedNames({"Subnet", "IPRange", "Gateway"})
+         public static Config create(String subnet, String ipRange, String gateway) {
+            return new AutoValue_Network_IPAM_Config(subnet, ipRange, gateway);
+         }
+      }
+   }
+
+   @AutoValue
+   public abstract static class Details {
+
+      Details() {} // For AutoValue only!
+
+      public abstract String endpoint();
+
+      public abstract String macAddress();
+
+      public abstract String ipv4address();
+
+      public abstract String ipv6address();
+
+      @SerializedNames({ "EndpointID", "MacAddress", "IPv4Address", "IPv6Address" })
+      public static Details create(String endpoint, String macAddress, String ipv4address, String ipv6address) {
+         return new AutoValue_Network_Details(endpoint, macAddress, ipv4address, ipv6address);
+      }
+   }
+
+   @Nullable public abstract String name();
+
+   @Nullable public abstract String id();
+
+   @Nullable public abstract String scope();
+
+   @Nullable public abstract String driver();
+
+   @Nullable public abstract IPAM ipam();
+
+   public abstract Map<String, Details> containers();
+
+   public abstract Map<String, String> options();
+
+   Network() {}
+
+   @SerializedNames({ "Name", "Id", "Scope", "Driver", "IPAM", "Containers", "Options" })
+   public static Network create(String name, String id, String scope, String driver, IPAM ipam,
+                                Map<String, Details> containers, Map<String, String> options) {
+      return new AutoValue_Network(name, id, scope, driver, ipam, copyOf(containers), copyOf(options));
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java b/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
index fee82f2..ca27729 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/NetworkSettings.java
@@ -18,7 +18,6 @@ package org.jclouds.docker.domain;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.jclouds.docker.internal.NullSafeCopies.copyOf;
-
 import java.util.List;
 import java.util.Map;
 
@@ -27,28 +26,98 @@ import org.jclouds.json.SerializedNames;
 
 import com.google.auto.value.AutoValue;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 @AutoValue
 public abstract class NetworkSettings {
+
+   @AutoValue
+   public abstract static class Details {
+
+      Details() {} // For AutoValue only!
+
+      public abstract String endpoint();
+
+      public abstract String gateway();
+
+      public abstract String ipAddress();
+
+      public abstract int ipPrefixLen();
+
+      public abstract String ipv6Gateway();
+
+      public abstract String globalIPv6Address();
+
+      public abstract int globalIPv6PrefixLen();
+
+      public abstract String macAddress();
+
+      @SerializedNames({ "EndpointID", "Gateway", "IPAddress", "IPPrefixLen", "IPv6Gateway", "GlobalIPv6Address", "GlobalIPv6PrefixLen", "MacAddress" })
+      public static Details create(String endpointId, String gateway, String ipAddress, int ipPrefixLen, String ipv6Gateway, String globalIPv6Address,
+                                   int globalIPv6PrefixLen, String macAddress) {
+         return new AutoValue_NetworkSettings_Details(endpointId, gateway, ipAddress, ipPrefixLen, ipv6Gateway, globalIPv6Address, globalIPv6PrefixLen,
+                 macAddress);
+      }
+   }
+
+   public abstract String bridge();
+
+   @Nullable public abstract String sandboxId();
+
+   public abstract boolean hairpinMode();
+
+   @Nullable public abstract String linkLocalIPv6Address();
+
+   public abstract int linkLocalIPv6PrefixLen();
+
+   @Nullable public abstract Map<String, List<Map<String, String>>> ports();
+
+   @Nullable public abstract String sandboxKey();
+
+   public abstract List<String> secondaryIPAddresses();
+
+   public abstract List<String> secondaryIPv6Addresses();
+
+   @Nullable public abstract String endpointId();
+
+   public abstract String gateway();
+
+   @Nullable public abstract String globalIPv6Address();
+
+   public abstract int globalIPv6PrefixLen();
+
    public abstract String ipAddress();
 
    public abstract int ipPrefixLen();
 
-   public abstract String gateway();
+   @Nullable public abstract String ipv6Gateway();
 
-   public abstract String bridge();
+   @Nullable public abstract String macAddress();
 
-   @Nullable public abstract String portMapping();
+   public abstract Map<String, Details> networks();
 
-   public abstract Map<String, List<Map<String, String>>> ports();
+   @Nullable public abstract String portMapping();
 
    NetworkSettings() {
    }
 
-   @SerializedNames({ "IPAddress", "IPPrefixLen", "Gateway", "Bridge", "PortMapping", "Ports" })
-   public static NetworkSettings create(String ipAddress, int ipPrefixLen, String gateway, String bridge,
-         String portMapping, Map<String, List<Map<String, String>>> ports) {
-      return new AutoValue_NetworkSettings(ipAddress, ipPrefixLen, gateway, bridge, portMapping, copyOf(ports));
+   @SerializedNames({ "Bridge", "SandboxID", "HairpinMode", "LinkLocalIPv6Address",
+           "LinkLocalIPv6PrefixLen", "Ports", "SandboxKey", "SecondaryIPAddresses",
+           "SecondaryIPv6Addresses", "EndpointID", "Gateway", "GlobalIPv6Address",
+           "GlobalIPv6PrefixLen", "IPAddress", "IPPrefixLen", "IPv6Gateway",
+           "MacAddress", "Networks", "PortMapping" })
+   public static NetworkSettings create(String bridge, String sandboxId, boolean hairpinMode, String linkLocalIPv6Address,
+                                        int linkLocalIPv6PrefixLen, Map<String, List<Map<String, String>>> ports, String sandboxKey, List<String> secondaryIPAddresses,
+                                        List<String> secondaryIPv6Addresses, String endpointId, String gateway, String globalIPv6Address,
+                                        int globalIPv6PrefixLen, String ipAddress, int ipPrefixLen, String ipv6Gateway,
+                                        String macAddress, Map<String, Details> networks, String portMapping) {
+      return new AutoValue_NetworkSettings(
+              bridge, sandboxId, hairpinMode, linkLocalIPv6Address,
+              linkLocalIPv6PrefixLen, ports, sandboxKey, copyOf(secondaryIPAddresses), copyOf(secondaryIPv6Addresses),
+              endpointId, gateway, globalIPv6Address, globalIPv6PrefixLen,
+              ipAddress, ipPrefixLen, ipv6Gateway,
+              macAddress, copyOf(networks), portMapping);
    }
 
    public static Builder builder() {
@@ -67,6 +136,19 @@ public abstract class NetworkSettings {
       private String bridge;
       private String portMapping;
       private Map<String, List<Map<String, String>>> ports = ImmutableMap.of();
+      private String sandboxId;
+      private boolean hairpinMode;
+      private String linkLocalIPv6Address;
+      private int linkLocalIPv6PrefixLen;
+      private String sandboxKey;
+      private List<String> secondaryIPAddresses = Lists.newArrayList();
+      private List<String> secondaryIPv6Addresses = Lists.newArrayList();
+      private String endpointId;
+      private String globalIPv6Address;
+      private int globalIPv6PrefixLen;
+      private String ipv6Gateway;
+      private String macAddress;
+      private Map<String, Details> networks = Maps.newHashMap();
 
       public Builder ipAddress(String ipAddress) {
          this.ipAddress = ipAddress;
@@ -98,13 +180,84 @@ public abstract class NetworkSettings {
          return this;
       }
 
+      public Builder sandboxId(String sandboxId) {
+         this.sandboxId = sandboxId;
+         return this;
+      }
+
+      public Builder hairpinMode(boolean hairpinMode) {
+         this.hairpinMode = hairpinMode;
+         return this;
+      }
+
+      public Builder linkLocalIPv6Address(String linkLocalIPv6Address) {
+         this.linkLocalIPv6Address = linkLocalIPv6Address;
+         return this;
+      }
+
+      public Builder linkLocalIPv6PrefixLen(int linkLocalIPv6PrefixLen) {
+         this.linkLocalIPv6PrefixLen = linkLocalIPv6PrefixLen;
+         return this;
+      }
+
+      public Builder sandboxKey(String sandboxKey) {
+         this.sandboxKey = sandboxKey;
+         return this;
+      }
+
+      public Builder secondaryIPAddresses(List<String> secondaryIPAddresses) {
+         this.secondaryIPAddresses = secondaryIPAddresses;
+         return this;
+      }
+
+      public Builder secondaryIPv6Addresses(List<String> secondaryIPv6Addresses) {
+         this.secondaryIPv6Addresses = secondaryIPv6Addresses;
+         return this;
+      }
+
+      public Builder endpointId(String endpointId) {
+         this.endpointId = endpointId;
+         return this;
+      }
+
+      public Builder globalIPv6Address(String globalIPv6Address) {
+         this.globalIPv6Address = globalIPv6Address;
+         return this;
+      }
+
+      public Builder globalIPv6PrefixLen(int globalIPv6PrefixLen) {
+         this.globalIPv6PrefixLen = globalIPv6PrefixLen;
+         return this;
+      }
+
+      public Builder ipv6Gateway(String ipv6Gateway) {
+         this.ipv6Gateway = ipv6Gateway;
+         return this;
+      }
+
+      public Builder macAddress(String macAddress) {
+         this.macAddress = macAddress;
+         return this;
+      }
+
+      public Builder networks(Map<String, Details> networks) {
+         this.networks.putAll(networks);
+         return this;
+      }
+
       public NetworkSettings build() {
-         return NetworkSettings.create(ipAddress, ipPrefixLen, gateway, bridge, portMapping, ports);
+         return NetworkSettings.create(bridge, sandboxId, hairpinMode, linkLocalIPv6Address, linkLocalIPv6PrefixLen, ports,
+                 sandboxKey, secondaryIPAddresses, secondaryIPv6Addresses, endpointId, gateway,
+                 globalIPv6Address, globalIPv6PrefixLen, ipAddress, ipPrefixLen, ipv6Gateway, macAddress, networks, portMapping);
       }
 
       public Builder fromNetworkSettings(NetworkSettings in) {
          return this.ipAddress(in.ipAddress()).ipPrefixLen(in.ipPrefixLen()).gateway(in.gateway()).bridge(in.bridge())
-               .portMapping(in.portMapping()).ports(in.ports());
+               .portMapping(in.portMapping()).ports(in.ports()).sandboxId(in.sandboxId()).hairpinMode(in.hairpinMode()).linkLocalIPv6Address(in
+                         .linkLocalIPv6Address()).linkLocalIPv6PrefixLen(in.linkLocalIPv6PrefixLen()).sandboxKey(in.sandboxKey()).secondaryIPAddresses(in
+                         .secondaryIPAddresses()).secondaryIPv6Addresses(in.secondaryIPv6Addresses()).endpointId(in.endpointId()).globalIPv6Address(in
+                         .globalIPv6Address()).globalIPv6PrefixLen(in.globalIPv6PrefixLen()).ipv6Gateway(in.ipv6Gateway()).macAddress(in.macAddress())
+                 .networks(in.networks());
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/main/java/org/jclouds/docker/domain/State.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/domain/State.java b/docker/src/main/java/org/jclouds/docker/domain/State.java
index 1b3c809..54d96cf 100644
--- a/docker/src/main/java/org/jclouds/docker/domain/State.java
+++ b/docker/src/main/java/org/jclouds/docker/domain/State.java
@@ -16,12 +16,15 @@
  */
 package org.jclouds.docker.domain;
 
+import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.json.SerializedNames;
 
 import com.google.auto.value.AutoValue;
 
 @AutoValue
 public abstract class State {
+
+
    public abstract int pid();
 
    public abstract boolean running();
@@ -36,12 +39,20 @@ public abstract class State {
 
    public abstract boolean restarting();
 
+   @Nullable public abstract String status();
+
+   @Nullable public abstract boolean oomKilled();
+
+   @Nullable public abstract boolean dead();
+
+   @Nullable public abstract String error();
+
    State() {
    }
 
-   @SerializedNames({ "Pid", "Running", "ExitCode", "StartedAt", "FinishedAt", "Paused", "Restarting" })
+   @SerializedNames({ "Pid", "Running", "ExitCode", "StartedAt", "FinishedAt", "Paused", "Restarting", "Status", "OOMKilled", "Dead", "Error" })
    public static State create(int pid, boolean running, int exitCode, String startedAt, String finishedAt,
-         boolean paused, boolean restarting) {
-      return new AutoValue_State(pid, running, exitCode, startedAt, finishedAt, paused, restarting);
+         boolean paused, boolean restarting, String status, boolean oomKilled, boolean dead, String error) {
+      return new AutoValue_State(pid, running, exitCode, startedAt, finishedAt, paused, restarting, status, oomKilled, dead, error);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/main/java/org/jclouds/docker/features/NetworkApi.java
----------------------------------------------------------------------
diff --git a/docker/src/main/java/org/jclouds/docker/features/NetworkApi.java b/docker/src/main/java/org/jclouds/docker/features/NetworkApi.java
new file mode 100644
index 0000000..79671cc
--- /dev/null
+++ b/docker/src/main/java/org/jclouds/docker/features/NetworkApi.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.docker.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.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.docker.domain.Network;
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.Headers;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.binders.BindToJsonPayload;
+
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/v{jclouds.api-version}/networks")
+public interface NetworkApi {
+
+   /**
+    * @return a set of networks
+    */
+   @Named("networks:list")
+   @GET
+   @Fallback(EmptyListOnNotFoundOr404.class)
+   List<Network> listNetworks();
+
+   /**
+    * @param network the network’s configuration (@see BindToJsonPayload)
+    * @return a new network
+    */
+   @Named("network:create")
+   @POST
+   @Path("/create")
+   Network createNetwork(@BinderParam(BindToJsonPayload.class) Network network);
+
+   /**
+    * Return low-level information on the network id
+    * @param networkIdOrName  The id or name of the network to get.
+    * @return The details of the network or <code>null</code> if the network with the given id doesn't exist.
+    */
+   @Named("network:inspect")
+   @GET
+   @Path("/{idOrName}")
+   @Fallback(NullOnNotFoundOr404.class)
+   Network inspectNetwork(@PathParam("idOrName") String networkIdOrName);
+
+   /**
+    * @param networkIdOrName The id or name of the network to be removed.
+    */
+   @Named("network:delete")
+   @DELETE
+   @Path("/{idOrName}")
+   void removeNetwork(@PathParam("idOrName") String networkIdOrName);
+
+   /**
+    * @param networkIdOrName The id or name of the network where the container will be attached.
+    */
+   @Named("network:connectContainer")
+   @POST
+   @Path("/{idOrName}/connect")
+   @Payload("%7B\"Container\":\"{containerIdOrName}\"%7D")
+   @Headers(keys = "Content-Type", values = "application/json")
+   void connectContainerToNetwork(@PathParam("idOrName") String networkIdOrName, @PayloadParam("containerIdOrName") String containerIdOrName);
+
+   /**
+    * @param networkIdOrName The id or name of the network where the container was attached.
+    */
+   @Named("network:disconnectContainer")
+   @POST
+   @Path("/{idOrName}/disconnect")
+   @Payload("%7B\"Container\":\"{containerIdOrName}\"%7D")
+   @Headers(keys = "Content-Type", values = "application/json")
+   void disconnectContainerFromNetwork(@PathParam("idOrName") String networkIdOrName, @PayloadParam("containerIdOrName") String containerIdOrName);
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java
index 5778d9a..eab76ba 100644
--- a/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java
@@ -45,6 +45,11 @@ import com.google.inject.Module;
 @Test(groups = "live")
 public class BaseDockerApiLiveTest extends BaseApiLiveTest<DockerApi> {
 
+   protected static final String DEFAULT_IMAGE = "alpine";
+   protected static final String DEFAULT_TAG = "3.2";
+   protected static final String ALPINE_IMAGE_TAG = String.format("%s:%s", DEFAULT_IMAGE, DEFAULT_TAG);
+
+
    public BaseDockerApiLiveTest() {
       provider = "docker";
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
index 9aae9bf..faad0ac 100644
--- a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
@@ -22,7 +22,6 @@ import static org.testng.Assert.assertNotNull;
 import java.util.Properties;
 import java.util.Random;
 
-import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.Template;
@@ -48,13 +47,12 @@ import com.google.inject.Module;
 @Test(groups = "live", singleThreaded = true, testName = "DockerComputeServiceAdapterLiveTest")
 public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest {
 
-   private static final String SSHABLE_IMAGE = "tutum/ubuntu";
-   private static final String SSHABLE_IMAGE_TAG = "trusty";
+   private static final String SSHABLE_IMAGE = "kwart/alpine-ext";
+   private static final String SSHABLE_IMAGE_TAG = "3.2-ssh";
    private Image defaultImage;
 
    private DockerComputeServiceAdapter adapter;
    private TemplateBuilder templateBuilder;
-   private ComputeService computeService;
    private NodeAndInitialCredentials<Container> guest;
 
    @BeforeClass
@@ -75,7 +73,6 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest {
       Injector injector = newBuilder().modules(modules).overrides(props).buildInjector();
       adapter = injector.getInstance(DockerComputeServiceAdapter.class);
       templateBuilder = injector.getInstance(TemplateBuilder.class);
-      computeService = injector.getInstance(ComputeService.class);
       return injector.getInstance(DockerApi.class);
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java b/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java
index 0f81c94..00cd836 100644
--- a/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java
+++ b/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java
@@ -96,7 +96,11 @@ public class ContainerToNodeMetadataTest {
             "2014-03-24T20:28:37.537659054Z", // startedAt
             "0001-01-01T00:00:00Z", // finishedAt
             false, // paused
-            false  // restarting
+            false,  // restarting
+            "running", // Status
+            false, // OOMKilled
+            false, // Dead
+            ""     // Error
       );
       container = Container.builder()
               .id("6d35806c1bd2b25cd92bba2d2c2c5169dc2156f53ab45c2b62d76e2d2fee14a9")

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java b/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java
index 57659c5..33564ea 100644
--- a/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java
+++ b/docker/src/test/java/org/jclouds/docker/config/DockerParserModuleTest.java
@@ -19,6 +19,9 @@ package org.jclouds.docker.config;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
+import java.util.List;
+import java.util.Map;
+
 import org.jclouds.docker.domain.Container;
 import org.jclouds.docker.domain.NetworkSettings;
 import org.jclouds.docker.domain.Port;
@@ -53,8 +56,70 @@ public class DockerParserModuleTest {
    }
 
    public void networkSettings() {
-      String text = "{\"IPAddress\":\"XX.XX.206.98\",\"IPPrefixLen\":27,\"Gateway\":\"XX.XX.206.105\",\"Bridge\":\"public\",\"Ports\":{}}";
-      NetworkSettings settings = NetworkSettings.create("XX.XX.206.98", 27, "XX.XX.206.105", "public", null, null);
+      String text = "{" +
+              "\"Bridge\":\"\"," +
+              "\"SandboxID\":\"3ef128b055eb9ef62a6a2c281d97a2dfde5f47947d490f1dd2a81612611d961f\"," +
+              "\"HairpinMode\":false," +
+              "\"LinkLocalIPv6Address\":\"\"," +
+              "\"LinkLocalIPv6PrefixLen\":0," +
+              "\"Ports\":{}," +
+              "\"SandboxKey\":\"/var/run/docker/netns/3ef128b055eb\"," +
+              "\"SecondaryIPAddresses\":[]," +
+              "\"SecondaryIPv6Addresses\":[]," +
+              "\"EndpointID\":\"9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6\"," +
+              "\"Gateway\":\"172.17.0.1\"," +
+              "\"GlobalIPv6Address\":\"\"," +
+              "\"GlobalIPv6PrefixLen\":0," +
+              "\"IPAddress\":\"172.17.0.2\"," +
+              "\"IPPrefixLen\":16," +
+              "\"IPv6Gateway\":\"\"," +
+              "\"MacAddress\":\"02:42:ac:11:00:02\"," +
+              "\"Networks\":{" +
+              "\"bridge\":{" +
+              "\"EndpointID\":\"9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6\"," +
+              "\"Gateway\":\"172.17.0.1\"," +
+              "\"IPAddress\":\"172.17.0.2\"," +
+              "\"IPPrefixLen\":16," +
+              "\"IPv6Gateway\":\"\"," +
+              "\"GlobalIPv6Address\":\"\"," +
+              "\"GlobalIPv6PrefixLen\":0," +
+              "\"MacAddress\":\"02:42:ac:11:00:02\"" +
+              "}" +
+              "}" +
+              "}";
+      NetworkSettings settings = NetworkSettings.create(
+              "", // Bridge
+              "3ef128b055eb9ef62a6a2c281d97a2dfde5f47947d490f1dd2a81612611d961f", // SandboxID
+              false, // HairpinMode
+              "", // LinkLocalIPv6Address
+              0, // LinkLocalIPv6PrefixLen
+              ImmutableMap.<String, List<Map<String, String>>> of(), // Ports
+              "/var/run/docker/netns/3ef128b055eb", // SandboxKey
+              null, // SecondaryIPAddresses
+              null, // SecondaryIPv6Addresses
+              "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6", // EndpointID
+              "172.17.0.1", // Gateway
+              "", // GlobalIPv6Address
+              0, // GlobalIPv6PrefixLen
+              "172.17.0.2", // IPAddress
+              16, // IPPrefixLen
+              "", // IPv6Gateway
+              "02:42:ac:11:00:02", // MacAddress
+              ImmutableMap.of(
+                      "bridge", NetworkSettings.Details.create(
+                              "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6", // EndpointID
+                              "172.17.0.1", // Gateway
+                              "172.17.0.2", // IPAddress
+                              16, // IPPrefixLen
+                              "", // IPv6Gateway
+                              "", // GlobalIPv6Address
+                              0, // GlobalIPv6PrefixLen
+                              "02:42:ac:11:00:02" // MacAddress
+                     )
+              ),
+              null // PortMapping
+      );
+
       assertEquals(json.fromJson(text, NetworkSettings.class), settings);
       assertEquals(json.toJson(settings), text);
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
index 23e7e7b..295eb5b 100644
--- a/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
@@ -47,17 +47,16 @@ import com.google.common.collect.ImmutableList;
 public class ContainerApiLiveTest extends BaseDockerApiLiveTest {
 
    private Container container = null;
-   protected static final String BUSYBOX_IMAGE_TAG = "busybox:ubuntu-12.04";
    protected Image image = null;
 
    @BeforeClass
    protected void init() {
-      if (api.getImageApi().inspectImage(BUSYBOX_IMAGE_TAG) == null) {
-         CreateImageOptions options = CreateImageOptions.Builder.fromImage(BUSYBOX_IMAGE_TAG);
+      if (api.getImageApi().inspectImage(ALPINE_IMAGE_TAG) == null) {
+         CreateImageOptions options = CreateImageOptions.Builder.fromImage(ALPINE_IMAGE_TAG);
          InputStream createImageStream = api.getImageApi().createImage(options);
          consumeStream(createImageStream);
       }
-      image = api.getImageApi().inspectImage(BUSYBOX_IMAGE_TAG);
+      image = api.getImageApi().inspectImage(ALPINE_IMAGE_TAG);
       assertNotNull(image);
    }
 
@@ -69,7 +68,7 @@ public class ContainerApiLiveTest extends BaseDockerApiLiveTest {
          }
       }
       if (image != null) {
-         api.getImageApi().deleteImage(BUSYBOX_IMAGE_TAG);
+         api.getImageApi().deleteImage(ALPINE_IMAGE_TAG);
       }
    }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java b/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java
index ab3657b..a9d32b5 100644
--- a/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java
+++ b/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java
@@ -78,7 +78,7 @@ public class ContainerApiMockTest extends BaseDockerMockTest {
    public void testGetContainer() throws Exception {
       MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/container.json")));
       ContainerApi api = api(DockerApi.class, server.getUrl("/").toString(), new DockerParserModule()).getContainerApi();
-      String containerId = "b03d4cd15b76f8876110615cdeed15eadf77c9beb408d62f1687dcc69192cd6d";
+      String containerId = "e475abdf3e139a5e1e158b38b6cb290a1bec856d39d5a951f015dfb8fcba7331";
       try {
          assertEquals(api.inspectContainer(containerId), new ContainerParseTest().expected());
          assertSent(server, "GET", "/containers/" + containerId + "/json");

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java
index 1249f2f..051ea01 100644
--- a/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/features/ImageApiLiveTest.java
@@ -35,9 +35,6 @@ import com.google.common.collect.Iterables;
 @Test(groups = "live", testName = "ImageApiLiveTest", singleThreaded = true)
 public class ImageApiLiveTest extends BaseDockerApiLiveTest {
 
-   private static final String DEFAULT_IMAGE = "busybox";
-   private static final String DEFAULT_TAG = "ubuntu-14.04";
-
    private Image image;
 
    @Test

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java
index 8cdd76b..95b749b 100644
--- a/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java
@@ -51,8 +51,6 @@ import com.google.common.collect.Iterables;
 @Test(groups = "live", testName = "MiscApiLiveTest", singleThreaded = true)
 public class MiscApiLiveTest extends BaseDockerApiLiveTest {
 
-   protected static final String BUSYBOX_IMAGE_TAG = "busybox:ubuntu-12.04";
-
    private static String imageId;
 
    private Container container = null;
@@ -61,12 +59,12 @@ public class MiscApiLiveTest extends BaseDockerApiLiveTest {
 
    @BeforeClass
    protected void init() {
-      if (api.getImageApi().inspectImage(BUSYBOX_IMAGE_TAG) == null) {
-         CreateImageOptions options = CreateImageOptions.Builder.fromImage(BUSYBOX_IMAGE_TAG);
+      if (api.getImageApi().inspectImage(ALPINE_IMAGE_TAG) == null) {
+         CreateImageOptions options = CreateImageOptions.Builder.fromImage(ALPINE_IMAGE_TAG);
          InputStream createImageStream = api.getImageApi().createImage(options);
          consumeStream(createImageStream);
       }
-      image = api.getImageApi().inspectImage(BUSYBOX_IMAGE_TAG);
+      image = api.getImageApi().inspectImage(ALPINE_IMAGE_TAG);
       assertNotNull(image);
       Config containerConfig = Config.builder().image(image.id())
             .cmd(ImmutableList.of("/bin/sh", "-c", "touch hello; while true; do echo hello world; sleep 1; done"))
@@ -85,7 +83,7 @@ public class MiscApiLiveTest extends BaseDockerApiLiveTest {
          }
       }
       if (image != null) {
-         api.getImageApi().deleteImage(BUSYBOX_IMAGE_TAG);
+         api.getImageApi().deleteImage(ALPINE_IMAGE_TAG);
       }
    }
 
@@ -107,7 +105,7 @@ public class MiscApiLiveTest extends BaseDockerApiLiveTest {
 
    @Test
    public void testBuildImageFromDockerfile() throws IOException, InterruptedException, URISyntaxException {
-      BuildOptions options = BuildOptions.Builder.tag("testBuildImage").verbose(false).nocache(false);
+      BuildOptions options = BuildOptions.Builder.tag("jclouds-test-test-build-image").verbose(false).nocache(false);
       InputStream buildImageStream = api().build(tarredDockerfile(), options);
       String buildStream = consumeStream(buildImageStream);
       Iterable<String> splitted = Splitter.on("\n").split(buildStream.replace("\r", "").trim());

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/features/NetworkApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/NetworkApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/features/NetworkApiLiveTest.java
new file mode 100644
index 0000000..8edafa3
--- /dev/null
+++ b/docker/src/test/java/org/jclouds/docker/features/NetworkApiLiveTest.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.docker.features;
+
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+import org.jclouds.docker.compute.BaseDockerApiLiveTest;
+import org.jclouds.docker.domain.Config;
+import org.jclouds.docker.domain.Container;
+import org.jclouds.docker.domain.Image;
+import org.jclouds.docker.domain.Network;
+import org.jclouds.docker.options.CreateImageOptions;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+
+@Test(groups = "live", testName = "NetworkApiLiveTest", singleThreaded = true)
+public class NetworkApiLiveTest extends BaseDockerApiLiveTest {
+
+   private static final String NETWORK_NAME = "JCLOUDS_NETWORK";
+
+   private Network network = null;
+   protected Image image = null;
+   private Container container;
+
+   @BeforeClass
+   protected void init() {
+
+      if (api.getImageApi().inspectImage(ALPINE_IMAGE_TAG) == null) {
+         CreateImageOptions options = CreateImageOptions.Builder.fromImage(ALPINE_IMAGE_TAG);
+         InputStream createImageStream = api.getImageApi().createImage(options);
+         consumeStream(createImageStream);
+      }
+      image = api.getImageApi().inspectImage(ALPINE_IMAGE_TAG);
+      assertNotNull(image);
+
+      Config containerConfig = Config.builder().image(image.id())
+              .cmd(ImmutableList.of("sh", "-c", "touch hello; while true; do echo hello world; sleep 1; done"))
+              .build();
+      container = api.getContainerApi().createContainer("jclouds-test-network", containerConfig);
+      api.getContainerApi().startContainer(container.id());
+      container = api.getContainerApi().inspectContainer(container.id());
+   }
+
+   @AfterClass(alwaysRun = true)
+   protected void tearDown() {
+      if (container != null) {
+         api.getContainerApi().stopContainer(container.id());
+         api.getContainerApi().removeContainer(container.id());
+      }
+      if (network != null) {
+         api().removeNetwork(network.id());
+      }
+   }
+
+   public void testCreateNetwork() throws IOException, InterruptedException {
+      network = api().createNetwork(Network.create(NETWORK_NAME, null, null, null, null, ImmutableMap.<String, Network.Details> of(), ImmutableMap.<String, String> of()));
+      assertNotNull(network);
+      assertNotNull(network.id());
+   }
+
+   @Test(dependsOnMethods = "testCreateNetwork")
+   public void testGetNetwork() {
+      network = api().inspectNetwork(network.id());
+      assertNotNull(network);
+   }
+
+   @Test(dependsOnMethods = "testGetNetwork")
+   public void testAttachContainerToNetwork() {
+      api().connectContainerToNetwork(network.id(), container.id());
+      container = api.getContainerApi().inspectContainer(container.id());
+      assertTrue(Iterables.any(container.networkSettings().networks().keySet(), Predicates.equalTo(network.name())));
+   }
+
+   @Test(dependsOnMethods = "testAttachContainerToNetwork")
+   public void testDisconnectContainerFromNetwork() {
+      api().disconnectContainerFromNetwork(network.id(), container.id());
+      container = api.getContainerApi().inspectContainer(container.id());
+      assertFalse(Iterables.any(container.networkSettings().networks().keySet(), Predicates.equalTo(network.name())));
+   }
+
+   @Test(dependsOnMethods = "testCreateNetwork")
+   public void testListNetworks() {
+      List<Network> networks = api().listNetworks();
+      for (Network network : networks) {
+         assertNotNull(network.id());
+      }
+   }
+
+   @Test(dependsOnMethods = "testDisconnectContainerFromNetwork")
+   public void testRemoveNetwork() {
+      api().removeNetwork(network.id());
+      assertNull(api().inspectNetwork(network.id()));
+      network = null;
+   }
+
+   private NetworkApi api() {
+      return api.getNetworkApi();
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/features/NetworkApiMockTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/NetworkApiMockTest.java b/docker/src/test/java/org/jclouds/docker/features/NetworkApiMockTest.java
new file mode 100644
index 0000000..f35e257
--- /dev/null
+++ b/docker/src/test/java/org/jclouds/docker/features/NetworkApiMockTest.java
@@ -0,0 +1,153 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.docker.features;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import java.util.Map;
+
+import org.jclouds.docker.DockerApi;
+import org.jclouds.docker.config.DockerParserModule;
+import org.jclouds.docker.domain.Network;
+import org.jclouds.docker.internal.BaseDockerMockTest;
+import org.jclouds.docker.parse.NetworkParseTest;
+import org.jclouds.docker.parse.NetworksParseTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+
+/**
+ * Mock tests for the {@link NetworkApi} class.
+ */
+@Test(groups = "unit", testName = "NetworkApiMockTest")
+public class NetworkApiMockTest extends BaseDockerMockTest {
+
+   public void testListNetworks() throws Exception {
+      MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/networks.json")));
+      NetworkApi api = api(DockerApi.class, server.getUrl("/").toString()).getNetworkApi();
+      try {
+         assertEquals(api.listNetworks(), new NetworksParseTest().expected());
+         assertSent(server, "GET", "/networks");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testListNonexistentNetworks() throws Exception {
+      MockWebServer server = mockWebServer(new MockResponse().setResponseCode(404));
+      NetworkApi api = api(DockerApi.class, server.getUrl("/").toString()).getNetworkApi();
+      try {
+         assertEquals(api.listNetworks(), ImmutableList.of());
+         assertSent(server, "GET", "/networks");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testGetNetwork() throws Exception {
+      MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/network.json")));
+      NetworkApi api = api(DockerApi.class, server.getUrl("/").toString(), new DockerParserModule()).getNetworkApi();
+      String networkId = "b03d4cd15b76f8876110615cdeed15eadf77c9beb408d62f1687dcc69192cd6d";
+      try {
+         assertEquals(api.inspectNetwork(networkId), new NetworkParseTest().expected());
+         assertSent(server, "GET", "/networks/" + networkId);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testCreateNetwork() throws Exception {
+      MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/network-creation.json")));
+      NetworkApi api = api(DockerApi.class, server.getUrl("/").toString()).getNetworkApi();
+
+      Map<String, String> options = ImmutableMap.<String, String> builder()
+              .put("com.docker.network.bridge.default_bridge", "true")
+              .put("com.docker.network.bridge.enable_icc", "true")
+              .put("com.docker.network.bridge.enable_ip_masquerade", "true")
+              .put("com.docker.network.bridge.host_binding_ipv4", "0.0.0.0")
+              .put("com.docker.network.bridge.name", "docker0")
+              .put("com.docker.network.driver.mtu", "1500")
+              .build();
+
+      Network network = Network.create(
+              "isolated_nw", // Name
+              null, // Id
+              "bridge", // Driver
+              null, // Scope
+              Network.IPAM.create(
+                      "default", // driver
+                      ImmutableList.of(Network.IPAM.Config.create("172.17.0.0/16", null, null)) // config
+              ),
+              ImmutableMap.of("39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867",
+                      Network.Details.create(
+                              "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", //endpointId
+                              "02:42:ac:11:00:02", // MAC
+                              "172.17.0.2/16", // ipv4address
+                              "" // ipv6address
+                      )
+              ),
+              options);
+
+      try {
+         Network created = api.createNetwork(network);
+         assertNotNull(created);
+         assertThat(created.id()).isEqualTo("22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30");
+         assertSent(server, "POST", "/networks/create", "{\"Name\":\"isolated_nw\",\"Scope\":\"bridge\",\"IPAM\":{\"Driver\":\"default\",\"Config\":[{\"Subnet\":\"172.17.0.0/16\"}]},\"Containers\":{\"39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867\":{\"EndpointID\":\"ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda\",\"MacAddress\":\"02:42:ac:11:00:02\",\"IPv4Address\":\"172.17.0.2/16\",\"IPv6Address\":\"\"}},\"Options\":{\"com.docker.network.bridge.default_bridge\":\"true\",\"com.docker.network.bridge.enable_icc\":\"true\",\"com.docker.network.bridge.enable_ip_masquerade\":\"true\",\"com.docker.network.bridge.host_binding_ipv4\":\"0.0.0.0\",\"com.docker.network.bridge.name\":\"docker0\",\"com.docker.network.driver.mtu\":\"1500\"}}");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testRemoveNetwork() throws Exception {
+      MockWebServer server = mockWebServer(new MockResponse().setResponseCode(204));
+      NetworkApi api = api(DockerApi.class, server.getUrl("/").toString()).getNetworkApi();
+      String networkId = "6d35806c1bd2b25cd92bba2d2c2c5169dc2156f53ab45c2b62d76e2d2fee14a9";
+      try {
+         api.removeNetwork(networkId);
+         assertSent(server, "DELETE", "/networks/" + networkId);
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testConnectContainerToNetwork() throws Exception {
+      MockWebServer server = mockWebServer(new MockResponse().setResponseCode(200));
+      NetworkApi api = api(DockerApi.class, server.getUrl("/").toString()).getNetworkApi();
+      try {
+         api.connectContainerToNetwork("123456789", "containerName");
+         assertSent(server, "POST", "/networks/123456789/connect", "{ \"Container\": \"containerName\" }");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+   public void testDisconnectContainerFromNetwork() throws Exception {
+      MockWebServer server = mockWebServer(new MockResponse().setResponseCode(200));
+      NetworkApi api = api(DockerApi.class, server.getUrl("/").toString()).getNetworkApi();
+      try {
+         api.disconnectContainerFromNetwork("123456789", "containerName");
+         assertSent(server, "POST", "/networks/123456789/disconnect", "{ \"Container\": \"containerName\" }");
+      } finally {
+         server.shutdown();
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java b/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java
index 994519e..f04e94f 100644
--- a/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java
+++ b/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java
@@ -16,8 +16,11 @@
  */
 package org.jclouds.docker.internal;
 
+import static com.google.common.base.Charsets.UTF_8;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.jclouds.util.Strings2.toStringAndClose;
+import static org.testng.Assert.assertEquals;
 import java.io.IOException;
 import java.util.Properties;
 
@@ -29,6 +32,7 @@ import org.jclouds.http.okhttp.config.OkHttpCommandExecutorServiceModule;
 
 import com.google.common.base.Charsets;
 import com.google.common.base.Throwables;
+import com.google.gson.JsonParser;
 import com.google.inject.Module;
 import com.squareup.okhttp.mockwebserver.MockWebServer;
 import com.squareup.okhttp.mockwebserver.RecordedRequest;
@@ -66,4 +70,15 @@ public class BaseDockerMockTest extends BaseMockWebServerTest {
       return request;
    }
 
+   protected RecordedRequest assertSent(MockWebServer server, String method, String path, String json)
+           throws InterruptedException {
+      RecordedRequest request = assertSent(server, method, path);
+      assertEquals(request.getHeader("Content-Type"), APPLICATION_JSON);
+      assertEquals(parser.parse(new String(request.getBody(), UTF_8)), parser.parse(json));
+      return request;
+   }
+
+   /** So that we can ignore formatting. */
+   private final JsonParser parser = new JsonParser();
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
index ff2e2fe..42e94be 100644
--- a/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
+++ b/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java
@@ -63,17 +63,46 @@ public class ContainerParseTest extends BaseDockerParseTest<Container> {
                       .workingDir("/home/weave")
                       .exposedPorts(ImmutableMap.of("6783/tcp", ImmutableMap.of(), "6783/udp", ImmutableMap.of()))
                       .build())
-              .state(State.create(3939, true, 0, "2014-10-31T17:00:21.802008706Z", "0001-01-01T00:00:00Z", false, false))
+              .state(State.create(10357, true, 0, "2015-11-10T09:33:21.68146124Z", "0001-01-01T00:00:00Z", false, false, "running", false, false, ""))
               .image("57e570db16baba1e8c0d6f3c15868ddb400f64ff76ec948e65c3ca3f15fb3587")
               .networkSettings(NetworkSettings.builder()
-                      .ipAddress("172.17.0.7")
+                      .sandboxId("3ef128b055eb9ef62a6a2c281d97a2dfde5f47947d490f1dd2a81612611d961f")
+                      .hairpinMode(false)
+                      .linkLocalIPv6Address("")
+                      .linkLocalIPv6PrefixLen(0)
+                      .globalIPv6Address("")
+                      .globalIPv6PrefixLen(0)
+                      .ipv6Gateway("")
+                      .sandboxKey("/var/run/docker/netns/3ef128b055eb")
+                      .endpointId("9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6")
+                      .ipAddress("172.17.0.2")
                       .ipPrefixLen(16)
-                      .gateway("172.17.42.1")
-                      .bridge("docker0")
-                      .ports(ImmutableMap.<String, List<Map<String, String>>>of(
-                                      "6783/tcp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "0.0.0.0", "HostPort", "6783")),
-                                      "6783/udp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "0.0.0.0", "HostPort", "6783")))
-                      )
+                      .gateway("172.17.0.1")
+                      .bridge("")
+                      .ports(ImmutableMap.<String, List<Map<String, String>>>of())
+                      .macAddress("02:42:ac:11:00:02")
+                      .networks(ImmutableMap.of(
+                              "JCLOUDS_NETWORK", NetworkSettings.Details.create(
+                                      "04268fbb4dc368b5a53bb1c3f89294a4f0c72095deb944db3c4efc6d6a439304",
+                                      "172.19.0.1",
+                                      "172.19.0.2",
+                                      16,
+                                      "",
+                                      "",
+                                      0,
+                                      "02:42:ac:13:00:02"
+                              ),
+                              "bridge", NetworkSettings.Details.create(
+                                      "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6",
+                                      "172.17.0.1",
+                                      "172.17.0.2",
+                                      16,
+                                      "",
+                                      "",
+                                      0,
+                                      "02:42:ac:11:00:02"
+                              )
+                      ))
                       .build())
               .resolvConfPath("/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/resolv.conf")
               .hostConfig(HostConfig.builder()

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/parse/NetworkParseTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/parse/NetworkParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/NetworkParseTest.java
new file mode 100644
index 0000000..9b4815c
--- /dev/null
+++ b/docker/src/test/java/org/jclouds/docker/parse/NetworkParseTest.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.docker.parse;
+
+import java.util.Map;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.docker.domain.Network;
+import org.jclouds.docker.internal.BaseDockerParseTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+@Test(groups = "unit")
+public class NetworkParseTest extends BaseDockerParseTest<Network> {
+
+   @Override
+   public String resource() {
+      return "/network.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   public Network expected() {
+
+      Map<String, String> options = ImmutableMap.<String, String> builder()
+              .put("com.docker.network.bridge.default_bridge", "true")
+              .put("com.docker.network.bridge.enable_icc", "true")
+              .put("com.docker.network.bridge.enable_ip_masquerade", "true")
+              .put("com.docker.network.bridge.host_binding_ipv4", "0.0.0.0")
+              .put("com.docker.network.bridge.name", "docker0")
+              .put("com.docker.network.driver.mtu", "1500")
+              .build();
+
+      return Network.create(
+              "bridge", // Name
+              "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", // Id
+              "local", // Scope
+              "bridge", // Driver
+              Network.IPAM.create(
+                      "default", // driver
+                      ImmutableList.of(Network.IPAM.Config.create("172.17.0.0/16", null, null)) // config
+              ),
+              ImmutableMap.of("39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867",
+                      Network.Details.create(
+                      "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", //endpointId
+                      "02:42:ac:11:00:02", // MAC
+                      "172.17.0.2/16", // ipv4address
+                      "" // ipv6address
+                      )
+              ),
+              options);
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/java/org/jclouds/docker/parse/NetworksParseTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/parse/NetworksParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/NetworksParseTest.java
new file mode 100644
index 0000000..d9053f8
--- /dev/null
+++ b/docker/src/test/java/org/jclouds/docker/parse/NetworksParseTest.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.docker.parse;
+
+import java.util.List;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.docker.domain.Network;
+import org.jclouds.docker.internal.BaseDockerParseTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+@Test(groups = "unit")
+public class NetworksParseTest extends BaseDockerParseTest<List<Network>> {
+
+   @Override
+   public String resource() {
+      return "/networks.json";
+   }
+
+   @Override
+   @Consumes(MediaType.APPLICATION_JSON)
+   public List<Network> expected() {
+      return ImmutableList.of(
+
+              Network.create(
+                      "bridge", // Name
+                      "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566", // Id
+                      "local", // Scope
+                      "bridge", // Driver
+                      Network.IPAM.create(
+                              "default", // driver
+                              ImmutableList.of(Network.IPAM.Config.create("172.17.0.0/16", null, null)) // config
+                      ),
+                      ImmutableMap.of("39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867",
+                              Network.Details.create(
+                                      "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda", //endpointId
+                                      "02:42:ac:11:00:02", // MAC
+                                      "172.17.0.2/16", // ipv4address
+                                      "" // ipv6address
+                              )
+                      ),
+                      ImmutableMap.<String, String> builder()
+                              .put("com.docker.network.bridge.default_bridge", "true")
+                              .put("com.docker.network.bridge.enable_icc", "true")
+                              .put("com.docker.network.bridge.enable_ip_masquerade", "true")
+                              .put("com.docker.network.bridge.host_binding_ipv4", "0.0.0.0")
+                              .put("com.docker.network.bridge.name", "docker0")
+                              .put("com.docker.network.driver.mtu", "1500")
+                              .build()
+              ),
+              Network.create(
+                      "none", // Name
+                      "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794", // Id
+                      "local", // Scope
+                      "null", // Driver
+                      Network.IPAM.create(
+                              "default", // driver
+                              ImmutableList.<Network.IPAM.Config>of() // config
+                      ),
+                      ImmutableMap.<String, Network.Details> of(),
+                      ImmutableMap.<String, String> of()
+              ),
+              Network.create(
+                      "host", // Name
+                      "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e", // Id
+                      "local", // Scope
+                      "host", // Driver
+                      Network.IPAM.create(
+                              "default", // driver
+                              ImmutableList.<Network.IPAM.Config>of() // config
+                      ),
+                      ImmutableMap.<String, Network.Details> of(),
+                      ImmutableMap.<String, String> of()
+              )
+      );
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/resources/container.json
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/container.json b/docker/src/test/resources/container.json
index 5a13e13..fa1b61f 100644
--- a/docker/src/test/resources/container.json
+++ b/docker/src/test/resources/container.json
@@ -1,129 +1,155 @@
 {
-    "Args": [
-        "-iface",
-        "ethwe",
-        "-wait",
-        "5",
-        "-name",
-        "7a:63:a2:39:7b:0f"
+  "Args": [
+    "-iface",
+    "ethwe",
+    "-wait",
+    "5",
+    "-name",
+    "7a:63:a2:39:7b:0f"
+  ],
+  "Config": {
+    "AttachStderr": false,
+    "AttachStdin": false,
+    "AttachStdout": false,
+    "Cmd": [
+      "-name",
+      "7a:63:a2:39:7b:0f"
     ],
-    "Config": {
-        "AttachStderr": false,
-        "AttachStdin": false,
-        "AttachStdout": false,
-        "Cmd": [
-            "-name",
-            "7a:63:a2:39:7b:0f"
-        ],
-        "CpuShares": 0,
-        "Cpuset": "",
-        "Domainname": "",
-        "Entrypoint": [
-            "/home/weave/weaver",
-            "-iface",
-            "ethwe",
-            "-wait",
-            "5"
-        ],
-        "Env": [
-            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
-        ],
-        "ExposedPorts": {
-            "6783/tcp": {},
-            "6783/udp": {}
-        },
-        "Hostname": "6c9932f478bd",
-        "Image": "zettio/weave",
-        "Memory": 0,
-        "MemorySwap": 0,
-        "NetworkDisabled": false,
-        "OnBuild": null,
-        "OpenStdin": false,
-        "PortSpecs": null,
-        "SecurityOpt": null,
-        "StdinOnce": false,
-        "Tty": false,
-        "User": "",
-        "Volumes": null,
-        "WorkingDir": "/home/weave"
-    },
-    "Created": "2014-10-31T17:00:21.544197943Z",
-    "Driver": "aufs",
-    "ExecDriver": "native-0.2",
-    "HostConfig": {
-        "Binds": null,
-        "CapAdd": null,
-        "CapDrop": null,
-        "ContainerIDFile": "",
-        "Devices": [],
-        "Dns": [ "8.8.8.8", "8.8.4.4" ],
-        "DnsSearch": null,
-        "ExtraHosts": [ "extra:169.254.0.1" ],
-        "Links": null,
-        "LxcConf": [],
-        "NetworkMode": "bridge",
-        "PortBindings": {
-            "6783/tcp": [
-                {
-                    "HostIp": "",
-                    "HostPort": "6783"
-                }
-            ],
-            "6783/udp": [
-                {
-                    "HostIp": "",
-                    "HostPort": "6783"
-                }
-            ]
-        },
-        "Privileged": true,
-        "PublishAllPorts": false,
-        "RestartPolicy": {
-            "MaximumRetryCount": 0,
-            "Name": ""
-        },
-        "VolumesFrom": null
+    "CpuShares": 0,
+    "Cpuset": "",
+    "Domainname": "",
+    "Entrypoint": [
+      "/home/weave/weaver",
+      "-iface",
+      "ethwe",
+      "-wait",
+      "5"
+    ],
+    "Env": [
+      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+    ],
+    "ExposedPorts": {
+      "6783/tcp": {},
+      "6783/udp": {}
     },
-    "HostnamePath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hostname",
-    "HostsPath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hosts",
-    "Id": "6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524",
-    "Image": "57e570db16baba1e8c0d6f3c15868ddb400f64ff76ec948e65c3ca3f15fb3587",
-    "MountLabel": "",
-    "Name": "/weave",
-    "NetworkSettings": {
-        "Bridge": "docker0",
-        "Gateway": "172.17.42.1",
-        "IPAddress": "172.17.0.7",
-        "IPPrefixLen": 16,
-        "MacAddress": "02:42:ac:11:00:07",
-        "PortMapping": null,
-        "Ports": {
-            "6783/tcp": [
-                {
-                    "HostIp": "0.0.0.0",
-                    "HostPort": "6783"
-                }
-            ],
-            "6783/udp": [
-                {
-                    "HostIp": "0.0.0.0",
-                    "HostPort": "6783"
-                }
-            ]
+    "Hostname": "6c9932f478bd",
+    "Image": "zettio/weave",
+    "Memory": 0,
+    "MemorySwap": 0,
+    "NetworkDisabled": false,
+    "OnBuild": null,
+    "OpenStdin": false,
+    "PortSpecs": null,
+    "SecurityOpt": null,
+    "StdinOnce": false,
+    "Tty": false,
+    "User": "",
+    "Volumes": null,
+    "WorkingDir": "/home/weave"
+  },
+  "Created": "2014-10-31T17:00:21.544197943Z",
+  "Driver": "aufs",
+  "ExecDriver": "native-0.2",
+  "HostConfig": {
+    "Binds": null,
+    "CapAdd": null,
+    "CapDrop": null,
+    "ContainerIDFile": "",
+    "Devices": [],
+    "Dns": [
+      "8.8.8.8",
+      "8.8.4.4"
+    ],
+    "DnsSearch": null,
+    "ExtraHosts": ["extra:169.254.0.1"],
+    "Links": null,
+    "LxcConf": [],
+    "NetworkMode": "bridge",
+    "PortBindings": {
+      "6783/tcp": [
+        {
+          "HostIp": "",
+          "HostPort": "6783"
+        }
+      ],
+      "6783/udp": [
+        {
+          "HostIp": "",
+          "HostPort": "6783"
         }
+      ]
     },
-    "Path": "/home/weave/weaver",
-    "ProcessLabel": "",
-    "ResolvConfPath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/resolv.conf",
-    "State": {
-        "ExitCode": 0,
-        "FinishedAt": "0001-01-01T00:00:00Z",
-        "Paused": false,
-        "Pid": 3939,
-        "Restarting": false,
-        "Running": true,
-        "StartedAt": "2014-10-31T17:00:21.802008706Z"
+    "Privileged": true,
+    "PublishAllPorts": false,
+    "RestartPolicy": {
+      "MaximumRetryCount": 0,
+      "Name": ""
     },
-    "Volumes": {},
-    "VolumesRW": {}
+    "VolumesFrom": null
+  },
+  "HostnamePath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hostname",
+  "HostsPath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hosts",
+  "Id": "6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524",
+  "Image": "57e570db16baba1e8c0d6f3c15868ddb400f64ff76ec948e65c3ca3f15fb3587",
+  "MountLabel": "",
+  "Name": "/weave",
+  "NetworkSettings": {
+    "Bridge": "",
+    "SandboxID": "3ef128b055eb9ef62a6a2c281d97a2dfde5f47947d490f1dd2a81612611d961f",
+    "HairpinMode": false,
+    "LinkLocalIPv6Address": "",
+    "LinkLocalIPv6PrefixLen": 0,
+    "Ports": {},
+    "SandboxKey": "/var/run/docker/netns/3ef128b055eb",
+    "SecondaryIPAddresses": null,
+    "SecondaryIPv6Addresses": null,
+    "EndpointID": "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6",
+    "Gateway": "172.17.0.1",
+    "GlobalIPv6Address": "",
+    "GlobalIPv6PrefixLen": 0,
+    "IPAddress": "172.17.0.2",
+    "IPPrefixLen": 16,
+    "IPv6Gateway": "",
+    "MacAddress": "02:42:ac:11:00:02",
+    "Networks": {
+      "JCLOUDS_NETWORK": {
+        "EndpointID": "04268fbb4dc368b5a53bb1c3f89294a4f0c72095deb944db3c4efc6d6a439304",
+        "Gateway": "172.19.0.1",
+        "IPAddress": "172.19.0.2",
+        "IPPrefixLen": 16,
+        "IPv6Gateway": "",
+        "GlobalIPv6Address": "",
+        "GlobalIPv6PrefixLen": 0,
+        "MacAddress": "02:42:ac:13:00:02"
+      },
+      "bridge": {
+        "EndpointID": "9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6",
+        "Gateway": "172.17.0.1",
+        "IPAddress": "172.17.0.2",
+        "IPPrefixLen": 16,
+        "IPv6Gateway": "",
+        "GlobalIPv6Address": "",
+        "GlobalIPv6PrefixLen": 0,
+        "MacAddress": "02:42:ac:11:00:02"
+      }
+    }
+  },
+  "Path": "/home/weave/weaver",
+  "ProcessLabel": "",
+  "ResolvConfPath": "/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/resolv.conf",
+  "State": {
+    "Status": "running",
+    "Running": true,
+    "Paused": false,
+    "Restarting": false,
+    "OOMKilled": false,
+    "Dead": false,
+    "Pid": 10357,
+    "ExitCode": 0,
+    "Error": "",
+    "StartedAt": "2015-11-10T09:33:21.68146124Z",
+    "FinishedAt": "0001-01-01T00:00:00Z"
+  },
+  "Volumes": {},
+  "VolumesRW": {}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/resources/network-creation.json
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/network-creation.json b/docker/src/test/resources/network-creation.json
new file mode 100644
index 0000000..63b70e4
--- /dev/null
+++ b/docker/src/test/resources/network-creation.json
@@ -0,0 +1,4 @@
+{
+  "Id": "22be93d5babb089c5aab8dbc369042fad48ff791584ca2da2100db837a1c7c30",
+  "Warning": ""
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/resources/network.json
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/network.json b/docker/src/test/resources/network.json
new file mode 100644
index 0000000..1e6c422
--- /dev/null
+++ b/docker/src/test/resources/network.json
@@ -0,0 +1,30 @@
+{
+  "Name": "bridge",
+  "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566",
+  "Scope": "local",
+  "Driver": "bridge",
+  "IPAM": {
+    "Driver": "default",
+    "Config": [
+      {
+        "Subnet": "172.17.0.0/16"
+      }
+    ]
+  },
+  "Containers": {
+    "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": {
+      "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda",
+      "MacAddress": "02:42:ac:11:00:02",
+      "IPv4Address": "172.17.0.2/16",
+      "IPv6Address": ""
+    }
+  },
+  "Options": {
+    "com.docker.network.bridge.default_bridge": "true",
+    "com.docker.network.bridge.enable_icc": "true",
+    "com.docker.network.bridge.enable_ip_masquerade": "true",
+    "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
+    "com.docker.network.bridge.name": "docker0",
+    "com.docker.network.driver.mtu": "1500"
+  }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/c57ac931/docker/src/test/resources/networks.json
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/networks.json b/docker/src/test/resources/networks.json
new file mode 100644
index 0000000..af81f03
--- /dev/null
+++ b/docker/src/test/resources/networks.json
@@ -0,0 +1,56 @@
+[
+  {
+    "Name": "bridge",
+    "Id": "f2de39df4171b0dc801e8002d1d999b77256983dfc63041c0f34030aa3977566",
+    "Scope": "local",
+    "Driver": "bridge",
+    "IPAM": {
+      "Driver": "default",
+      "Config": [
+        {
+          "Subnet": "172.17.0.0/16"
+        }
+      ]
+    },
+    "Containers": {
+      "39b69226f9d79f5634485fb236a23b2fe4e96a0a94128390a7fbbcc167065867": {
+        "EndpointID": "ed2419a97c1d9954d05b46e462e7002ea552f216e9b136b80a7db8d98b442eda",
+        "MacAddress": "02:42:ac:11:00:02",
+        "IPv4Address": "172.17.0.2/16",
+        "IPv6Address": ""
+      }
+    },
+    "Options": {
+      "com.docker.network.bridge.default_bridge": "true",
+      "com.docker.network.bridge.enable_icc": "true",
+      "com.docker.network.bridge.enable_ip_masquerade": "true",
+      "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
+      "com.docker.network.bridge.name": "docker0",
+      "com.docker.network.driver.mtu": "1500"
+    }
+  },
+  {
+    "Name": "none",
+    "Id": "e086a3893b05ab69242d3c44e49483a3bbbd3a26b46baa8f61ab797c1088d794",
+    "Scope": "local",
+    "Driver": "null",
+    "IPAM": {
+      "Driver": "default",
+      "Config": []
+    },
+    "Containers": {},
+    "Options": {}
+  },
+  {
+    "Name": "host",
+    "Id": "13e871235c677f196c4e1ecebb9dc733b9b2d2ab589e30c539efeda84a24215e",
+    "Scope": "local",
+    "Driver": "host",
+    "IPAM": {
+      "Driver": "default",
+      "Config": []
+    },
+    "Containers": {},
+    "Options": {}
+  }
+]
\ No newline at end of file