From 6b8044e92c875d04af27c6502e4307c13b39c6e0 Mon Sep 17 00:00:00 2001
From: j0hnsmith <info@whywouldwe.com>
Date: Thu, 19 Jun 2014 11:57:55 +0100
Subject: [PATCH] add net param support

Signed-off-by: Peter Flood <info@whywouldwe.com>
---
 docs/yml.md                       |  2 ++
 fig/packages/docker/client.py     |  5 ++++-
 fig/service.py                    |  8 +++++++-
 tests/integration/service_test.py | 15 +++++++++++++++
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/docs/yml.md b/docs/yml.md
index 24484d4f6..5a5a2af63 100644
--- a/docs/yml.md
+++ b/docs/yml.md
@@ -59,3 +59,5 @@ environment:
   RACK_ENV: development
 ```
 
+-- Networking mode. Use the same values as the docker client --net parameter
+net: "host"
diff --git a/fig/packages/docker/client.py b/fig/packages/docker/client.py
index 7f00b4c45..79505c416 100644
--- a/fig/packages/docker/client.py
+++ b/fig/packages/docker/client.py
@@ -679,7 +679,7 @@ class Client(requests.Session):
                             True)
 
     def start(self, container, binds=None, volumes_from=None, port_bindings=None,
-              lxc_conf=None, publish_all_ports=False, links=None, privileged=False):
+              lxc_conf=None, publish_all_ports=False, links=None, privileged=False, network_mode=None):
         if isinstance(container, dict):
             container = container.get('Id')
 
@@ -726,6 +726,9 @@ class Client(requests.Session):
 
         start_config['Privileged'] = privileged
 
+        if network_mode:
+            start_config['NetworkMode'] = network_mode
+
         url = self._url("/containers/{0}/start".format(container))
         res = self._post_json(url, data=start_config)
         self._raise_for_status(res)
diff --git a/fig/service.py b/fig/service.py
index 2fc7125d0..d6f44cfda 100644
--- a/fig/service.py
+++ b/fig/service.py
@@ -11,7 +11,7 @@ from .progress_stream import stream_output, StreamOutputError
 log = logging.getLogger(__name__)
 
 
-DOCKER_CONFIG_KEYS = ['image', 'command', 'hostname', 'user', 'detach', 'stdin_open', 'tty', 'mem_limit', 'ports', 'environment', 'dns', 'volumes', 'volumes_from', 'entrypoint', 'privileged']
+DOCKER_CONFIG_KEYS = ['image', 'command', 'hostname', 'user', 'detach', 'stdin_open', 'tty', 'mem_limit', 'ports', 'environment', 'dns', 'volumes', 'volumes_from', 'entrypoint', 'privileged', 'net']
 DOCKER_CONFIG_HINTS = {
     'link'      : 'links',
     'port'      : 'ports',
@@ -229,6 +229,7 @@ class Service(object):
                     }
 
         privileged = options.get('privileged', False)
+        net = options.get('net', 'bridge')
 
         container.start(
             links=self._get_links(link_to_self=override_options.get('one_off', False)),
@@ -236,6 +237,7 @@ class Service(object):
             binds=volume_bindings,
             volumes_from=volumes_from,
             privileged=privileged,
+            network_mode=net,
         )
         return container
 
@@ -297,6 +299,10 @@ class Service(object):
         if 'privileged' in container_options:
             del container_options['privileged']
 
+        # net is only required for starting containers, not for creating them
+        if 'net' in container_options:
+            del container_options['net']
+
         return container_options
 
     def build(self):
diff --git a/tests/integration/service_test.py b/tests/integration/service_test.py
index 78ddbd850..aaefbd403 100644
--- a/tests/integration/service_test.py
+++ b/tests/integration/service_test.py
@@ -253,3 +253,18 @@ class ServiceTest(DockerClientTestCase):
         self.assertEqual(len(containers), 2)
         for container in containers:
             self.assertEqual(list(container.inspect()['HostConfig']['PortBindings'].keys()), ['8000/tcp'])
+
+    def test_network_mode_none(self):
+        service = self.create_service('web', net='none')
+        container = service.start_container().inspect()
+        self.assertEqual(container['HostConfig']['NetworkMode'], 'none')
+
+    def test_network_mode_bridged(self):
+        service = self.create_service('web', net='bridge')
+        container = service.start_container().inspect()
+        self.assertEqual(container['HostConfig']['NetworkMode'], 'bridge')
+
+    def test_network_mode_host(self):
+        service = self.create_service('web', net='host')
+        container = service.start_container().inspect()
+        self.assertEqual(container['HostConfig']['NetworkMode'], 'host')