diff options
author | Matt Daue <mattdaue@gmail.com> | 2016-02-09 21:15:53 -0500 |
---|---|---|
committer | Matt Daue <mattdaue@gmail.com> | 2016-03-02 20:38:37 -0500 |
commit | d4a5bc4a86e9ab69368c80027439bca3ecc1e852 (patch) | |
tree | faefd7bd31de3238c4c89679e9fb9d188eed2da9 | |
parent | 062c76d8b22a6bd8a9076e17bb9a0a106bd21ce5 (diff) | |
download | docker-py-d4a5bc4a86e9ab69368c80027439bca3ecc1e852.tar.gz |
Add ip4&ip6 (#935) support, network/id/connect
Signed-off-by: Matt Daue <mattdaue@gmail.com>
- Implement check to validate API ver is >= 1.22 for new feature
- Includes patch @elchris82: Changed network in data dict to IPAMConfig as needed from the API. See https://github.com/docker/docker/issues/20732
- Update unit test for container attach to net
- Update integration tests
- Add integration test for IP setting
Signed-off-by: Matt Daue <mattdaue@gmail.com>
-rw-r--r-- | docker/api/network.py | 18 | ||||
-rw-r--r-- | tests/integration/network_test.py | 48 |
2 files changed, 66 insertions, 0 deletions
diff --git a/docker/api/network.py b/docker/api/network.py index d9a6128..1f9ea9e 100644 --- a/docker/api/network.py +++ b/docker/api/network.py @@ -1,6 +1,8 @@ import json +from ..errors import InvalidVersion from ..utils import check_resource, minimum_version, normalize_links +from ..utils import version_lt class NetworkApiMixin(object): @@ -48,6 +50,7 @@ class NetworkApiMixin(object): @check_resource @minimum_version('1.21') def connect_container_to_network(self, container, net_id, + ipv4_address=None, ipv6_address=None, aliases=None, links=None): data = { "Container": container, @@ -56,6 +59,21 @@ class NetworkApiMixin(object): "Links": normalize_links(links) if links else None, }, } + + # IPv4 or IPv6 or neither: + if ipv4_address or ipv6_address: + if version_lt(self._version, '1.22'): + raise InvalidVersion('IP address assignment is not ' + 'supported in API version < 1.22') + + data['EndpointConfig']['IPAMConfig'] = dict() + if ipv4_address: + data['EndpointConfig']['IPAMConfig']['IPv4Address'] = \ + ipv4_address + if ipv6_address: + data['EndpointConfig']['IPAMConfig']['IPv6Address'] = \ + ipv6_address + url = self._url("/networks/{0}/connect", net_id) res = self._post_json(url, data=data) self._raise_for_status(res) diff --git a/tests/integration/network_test.py b/tests/integration/network_test.py index a379bbf..a744617 100644 --- a/tests/integration/network_test.py +++ b/tests/integration/network_test.py @@ -235,3 +235,51 @@ class TestNetworks(helpers.BaseTestCase): ) self.execute(container, ['nslookup', 'bar']) + + @requires_api_version('1.22') + def test_connect_with_ipv4_address(self): + net_name, net_id = self.create_network() + + container = self.create_and_start( + host_config=self.client.create_host_config(network_mode=net_name)) + + self.client.disconnect_container_from_network(container, net_name) + self.client.connect_container_to_network( + container, net_name, + ipv4_address='192.168.0.1') + + container_data = self.client.inspect_container(container) + self.assertEqual( + container_data['NetworkSettings']['Networks'][net_name] + ['IPAMConfig']['IPv4Address'], + '192.168.0.1') + + self.create_and_start( + name='docker-py-test-upstream', + host_config=self.client.create_host_config(network_mode=net_name)) + + self.execute(container, ['nslookup', 'bar']) + + @requires_api_version('1.22') + def test_connect_with_ipv6_address(self): + net_name, net_id = self.create_network() + + container = self.create_and_start( + host_config=self.client.create_host_config(network_mode=net_name)) + + self.client.disconnect_container_from_network(container, net_name) + self.client.connect_container_to_network( + container, net_name, + ipv6_address='2001:389::1') + + container_data = self.client.inspect_container(container) + self.assertEqual( + container_data['NetworkSettings']['Networks'][net_name] + ['IPAMConfig']['IPv6Address'], + '2001:389::1') + + self.create_and_start( + name='docker-py-test-upstream', + host_config=self.client.create_host_config(network_mode=net_name)) + + self.execute(container, ['nslookup', 'bar']) |