Skip to content

Commit 62d9964

Browse files
committed
Merge pull request #818 from rmb938/patch-1
allow custom ipam options when creating networks
2 parents 140879d + 67a2944 commit 62d9964

File tree

7 files changed

+83
-4
lines changed

7 files changed

+83
-4
lines changed

docker/api/network.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@ def networks(self, names=None, ids=None):
1919
return self._result(res, json=True)
2020

2121
@minimum_version('1.21')
22-
def create_network(self, name, driver=None, options=None):
22+
def create_network(self, name, driver=None, options=None, ipam=None):
2323
if options is not None and not isinstance(options, dict):
2424
raise TypeError('options must be a dictionary')
2525

2626
data = {
2727
'name': name,
2828
'driver': driver,
29-
'options': options
29+
'options': options,
30+
'ipam': ipam,
3031
}
3132
url = self._url("/networks/create")
3233
res = self._post_json(url, data=data)

docker/utils/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
kwargs_from_env, convert_filters, datetime_to_timestamp, create_host_config,
55
create_container_config, parse_bytes, ping_registry, parse_env_file,
66
version_lt, version_gte, decode_json_header, split_command,
7-
) # flake8: noqa
7+
create_ipam_config, create_ipam_pool
8+
) # flake8: noqa
89

910
from .types import Ulimit, LogConfig # flake8: noqa
1011
from .decorators import check_resource, minimum_version # flake8: noqa

docker/utils/utils.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,23 @@
4444
}
4545

4646

47+
def create_ipam_pool(subnet=None, iprange=None, gateway=None,
48+
aux_addresses=None):
49+
return {
50+
'subnet': subnet,
51+
'iprange': iprange,
52+
'gateway': gateway,
53+
'auxaddresses': aux_addresses
54+
}
55+
56+
57+
def create_ipam_config(driver='default', pool_configs=None):
58+
return {
59+
'driver': driver,
60+
'config': pool_configs or []
61+
}
62+
63+
4764
def mkbuildcontext(dockerfile):
4865
f = tempfile.NamedTemporaryFile()
4966
t = tarfile.open(mode='w', fileobj=f)

docs/networks.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Using Networks
2+
3+
With the release of Docker 1.9 you can now manage custom networks.
4+
5+
6+
Here you can see how to create a network named ```network1``` using the ```bridge``` driver
7+
8+
```python
9+
docker_client.create_network("network1", driver="bridge")
10+
```
11+
12+
You can also create more advanced networks with custom IPAM configurations. For example,
13+
setting the subnet to ```192.168.52.0/24``` and gateway to ```192.168.52.254```
14+
15+
```python
16+
17+
ipam_config = docker.utils.create_ipam_config(subnet='192.168.52.0/24', gateway='192.168.52.254')
18+
19+
docker_client.create_network("network1", driver="bridge", ipam=ipam_config)
20+
```

mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pages:
1212
- Using TLS: tls.md
1313
- Host devices: host-devices.md
1414
- Host configuration: hostconfig.md
15+
- Network configuration: networks.md
1516
- Using with boot2docker: boot2docker.md
1617
- Change Log: change_log.md
1718
- Contributing: contributing.md

tests/unit/network_test.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from .. import base
66
from .api_test import DockerClientTest, url_prefix, response
7+
from docker.utils import create_ipam_config, create_ipam_pool
78

89
try:
910
from unittest import mock
@@ -80,6 +81,29 @@ def test_create_network(self):
8081
json.loads(post.call_args[1]['data']),
8182
{"name": "foo", "driver": "bridge", "options": opts})
8283

84+
ipam_pool_config = create_ipam_pool(subnet="192.168.52.0/24",
85+
gateway="192.168.52.254")
86+
ipam_config = create_ipam_config(pool_configs=[ipam_pool_config])
87+
88+
self.client.create_network("bar", driver="bridge",
89+
ipam=ipam_config)
90+
91+
self.assertEqual(
92+
json.loads(post.call_args[1]['data']),
93+
{
94+
"name": "bar",
95+
"driver": "bridge",
96+
"ipam": {
97+
"driver": "default",
98+
"config": [{
99+
"iprange": None,
100+
"gateway": "192.168.52.254",
101+
"subnet": "192.168.52.0/24",
102+
"auxaddresses": None
103+
}]
104+
}
105+
})
106+
83107
@base.requires_api_version('1.21')
84108
def test_remove_network(self):
85109
network_id = 'abc12345'

tests/unit/utils_test.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
parse_repository_tag, parse_host, convert_filters, kwargs_from_env,
1919
create_host_config, Ulimit, LogConfig, parse_bytes, parse_env_file,
2020
exclude_paths, convert_volume_binds, decode_json_header, tar,
21-
split_command,
21+
split_command, create_ipam_config, create_ipam_pool
2222
)
2323
from docker.utils.ports import build_port_bindings, split_port
2424

@@ -428,6 +428,21 @@ def test_decode_json_header(self):
428428
decoded_data = decode_json_header(data)
429429
self.assertEqual(obj, decoded_data)
430430

431+
def test_create_ipam_config(self):
432+
ipam_pool = create_ipam_pool(subnet='192.168.52.0/24',
433+
gateway='192.168.52.254')
434+
435+
ipam_config = create_ipam_config(pool_configs=[ipam_pool])
436+
self.assertEqual(ipam_config, {
437+
'driver': 'default',
438+
'config': [{
439+
'subnet': '192.168.52.0/24',
440+
'gateway': '192.168.52.254',
441+
'auxaddresses': None,
442+
'iprange': None
443+
}]
444+
})
445+
431446

432447
class SplitCommandTest(base.BaseTestCase):
433448

0 commit comments

Comments
 (0)