summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAanand Prasad <aanand.prasad@gmail.com>2016-01-05 12:55:45 +0000
committerAanand Prasad <aanand.prasad@gmail.com>2016-01-05 12:55:45 +0000
commit62d9964cc1881f6f3cd021594cd40fd80a8fc855 (patch)
tree3e26ffbbe67582f2eb5f5cc36075eeefa82e08b6
parent140879d65720646b87fe7a8809a8f2a7846ade39 (diff)
parent67a29441c4605c4027fa22484f3d14f36349c6bb (diff)
downloaddocker-py-62d9964cc1881f6f3cd021594cd40fd80a8fc855.tar.gz
Merge pull request #818 from rmb938/patch-1
allow custom ipam options when creating networks
-rw-r--r--docker/api/network.py5
-rw-r--r--docker/utils/__init__.py3
-rw-r--r--docker/utils/utils.py17
-rw-r--r--docs/networks.md20
-rw-r--r--mkdocs.yml1
-rw-r--r--tests/unit/network_test.py24
-rw-r--r--tests/unit/utils_test.py17
7 files changed, 83 insertions, 4 deletions
diff --git a/docker/api/network.py b/docker/api/network.py
index 4d1901a..ce3f511 100644
--- a/docker/api/network.py
+++ b/docker/api/network.py
@@ -19,14 +19,15 @@ class NetworkApiMixin(object):
return self._result(res, json=True)
@minimum_version('1.21')
- def create_network(self, name, driver=None, options=None):
+ def create_network(self, name, driver=None, options=None, ipam=None):
if options is not None and not isinstance(options, dict):
raise TypeError('options must be a dictionary')
data = {
'name': name,
'driver': driver,
- 'options': options
+ 'options': options,
+ 'ipam': ipam,
}
url = self._url("/networks/create")
res = self._post_json(url, data=data)
diff --git a/docker/utils/__init__.py b/docker/utils/__init__.py
index e86b724..2f308bf 100644
--- a/docker/utils/__init__.py
+++ b/docker/utils/__init__.py
@@ -4,7 +4,8 @@ from .utils import (
kwargs_from_env, convert_filters, datetime_to_timestamp, create_host_config,
create_container_config, parse_bytes, ping_registry, parse_env_file,
version_lt, version_gte, decode_json_header, split_command,
-) # flake8: noqa
+ create_ipam_config, create_ipam_pool
+) # flake8: noqa
from .types import Ulimit, LogConfig # flake8: noqa
from .decorators import check_resource, minimum_version # flake8: noqa
diff --git a/docker/utils/utils.py b/docker/utils/utils.py
index 03b4c35..e7b6616 100644
--- a/docker/utils/utils.py
+++ b/docker/utils/utils.py
@@ -44,6 +44,23 @@ BYTE_UNITS = {
}
+def create_ipam_pool(subnet=None, iprange=None, gateway=None,
+ aux_addresses=None):
+ return {
+ 'subnet': subnet,
+ 'iprange': iprange,
+ 'gateway': gateway,
+ 'auxaddresses': aux_addresses
+ }
+
+
+def create_ipam_config(driver='default', pool_configs=None):
+ return {
+ 'driver': driver,
+ 'config': pool_configs or []
+ }
+
+
def mkbuildcontext(dockerfile):
f = tempfile.NamedTemporaryFile()
t = tarfile.open(mode='w', fileobj=f)
diff --git a/docs/networks.md b/docs/networks.md
new file mode 100644
index 0000000..4193537
--- /dev/null
+++ b/docs/networks.md
@@ -0,0 +1,20 @@
+# Using Networks
+
+With the release of Docker 1.9 you can now manage custom networks.
+
+
+Here you can see how to create a network named ```network1``` using the ```bridge``` driver
+
+```python
+docker_client.create_network("network1", driver="bridge")
+```
+
+You can also create more advanced networks with custom IPAM configurations. For example,
+setting the subnet to ```192.168.52.0/24``` and gateway to ```192.168.52.254```
+
+```python
+
+ipam_config = docker.utils.create_ipam_config(subnet='192.168.52.0/24', gateway='192.168.52.254')
+
+docker_client.create_network("network1", driver="bridge", ipam=ipam_config)
+```
diff --git a/mkdocs.yml b/mkdocs.yml
index 8293cbc..c6bfae1 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -12,6 +12,7 @@ pages:
- Using TLS: tls.md
- Host devices: host-devices.md
- Host configuration: hostconfig.md
+- Network configuration: networks.md
- Using with boot2docker: boot2docker.md
- Change Log: change_log.md
- Contributing: contributing.md
diff --git a/tests/unit/network_test.py b/tests/unit/network_test.py
index a41a980..7d2cc9a 100644
--- a/tests/unit/network_test.py
+++ b/tests/unit/network_test.py
@@ -4,6 +4,7 @@ import six
from .. import base
from .api_test import DockerClientTest, url_prefix, response
+from docker.utils import create_ipam_config, create_ipam_pool
try:
from unittest import mock
@@ -80,6 +81,29 @@ class NetworkTest(DockerClientTest):
json.loads(post.call_args[1]['data']),
{"name": "foo", "driver": "bridge", "options": opts})
+ ipam_pool_config = create_ipam_pool(subnet="192.168.52.0/24",
+ gateway="192.168.52.254")
+ ipam_config = create_ipam_config(pool_configs=[ipam_pool_config])
+
+ self.client.create_network("bar", driver="bridge",
+ ipam=ipam_config)
+
+ self.assertEqual(
+ json.loads(post.call_args[1]['data']),
+ {
+ "name": "bar",
+ "driver": "bridge",
+ "ipam": {
+ "driver": "default",
+ "config": [{
+ "iprange": None,
+ "gateway": "192.168.52.254",
+ "subnet": "192.168.52.0/24",
+ "auxaddresses": None
+ }]
+ }
+ })
+
@base.requires_api_version('1.21')
def test_remove_network(self):
network_id = 'abc12345'
diff --git a/tests/unit/utils_test.py b/tests/unit/utils_test.py
index a68e1e7..d436de2 100644
--- a/tests/unit/utils_test.py
+++ b/tests/unit/utils_test.py
@@ -18,7 +18,7 @@ from docker.utils import (
parse_repository_tag, parse_host, convert_filters, kwargs_from_env,
create_host_config, Ulimit, LogConfig, parse_bytes, parse_env_file,
exclude_paths, convert_volume_binds, decode_json_header, tar,
- split_command,
+ split_command, create_ipam_config, create_ipam_pool
)
from docker.utils.ports import build_port_bindings, split_port
@@ -428,6 +428,21 @@ class UtilsTest(base.BaseTestCase):
decoded_data = decode_json_header(data)
self.assertEqual(obj, decoded_data)
+ def test_create_ipam_config(self):
+ ipam_pool = create_ipam_pool(subnet='192.168.52.0/24',
+ gateway='192.168.52.254')
+
+ ipam_config = create_ipam_config(pool_configs=[ipam_pool])
+ self.assertEqual(ipam_config, {
+ 'driver': 'default',
+ 'config': [{
+ 'subnet': '192.168.52.0/24',
+ 'gateway': '192.168.52.254',
+ 'auxaddresses': None,
+ 'iprange': None
+ }]
+ })
+
class SplitCommandTest(base.BaseTestCase):