diff options
author | Aanand Prasad <aanand.prasad@gmail.com> | 2016-01-05 12:55:45 +0000 |
---|---|---|
committer | Aanand Prasad <aanand.prasad@gmail.com> | 2016-01-05 12:55:45 +0000 |
commit | 62d9964cc1881f6f3cd021594cd40fd80a8fc855 (patch) | |
tree | 3e26ffbbe67582f2eb5f5cc36075eeefa82e08b6 | |
parent | 140879d65720646b87fe7a8809a8f2a7846ade39 (diff) | |
parent | 67a29441c4605c4027fa22484f3d14f36349c6bb (diff) | |
download | docker-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.py | 5 | ||||
-rw-r--r-- | docker/utils/__init__.py | 3 | ||||
-rw-r--r-- | docker/utils/utils.py | 17 | ||||
-rw-r--r-- | docs/networks.md | 20 | ||||
-rw-r--r-- | mkdocs.yml | 1 | ||||
-rw-r--r-- | tests/unit/network_test.py | 24 | ||||
-rw-r--r-- | tests/unit/utils_test.py | 17 |
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) +``` @@ -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): |