Skip to content

Commit 6552076

Browse files
committed
Add support for force disconnect
Signed-off-by: Joffrey F <[email protected]>
1 parent a665dfb commit 6552076

File tree

4 files changed

+41
-4
lines changed

4 files changed

+41
-4
lines changed

docker/api/network.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,15 @@ def connect_container_to_network(self, container, net_id,
9393

9494
@check_resource
9595
@minimum_version('1.21')
96-
def disconnect_container_from_network(self, container, net_id):
97-
data = {"container": container}
96+
def disconnect_container_from_network(self, container, net_id,
97+
force=False):
98+
data = {"Container": container}
99+
if force:
100+
if version_lt(self._version, '1.22'):
101+
raise InvalidVersion(
102+
'Forced disconnect was introduced in API 1.22'
103+
)
104+
data['Force'] = force
98105
url = self._url("/networks/{0}/disconnect", net_id)
99106
res = self._post_json(url, data=data)
100107
self._raise_for_status(res)

docs/api.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,8 @@ Inspect changes on a container's filesystem.
355355

356356
* container (str): container-id/name to be disconnected from a network
357357
* net_id (str): network id
358+
* force (bool): Force the container to disconnect from a network.
359+
Default: `False`
358360

359361
## events
360362

tests/integration/network_test.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ def test_connect_and_disconnect_container(self):
115115
network_data = self.client.inspect_network(net_id)
116116
self.assertEqual(
117117
list(network_data['Containers'].keys()),
118-
[container['Id']])
118+
[container['Id']]
119+
)
119120

120121
with pytest.raises(docker.errors.APIError):
121122
self.client.connect_container_to_network(container, net_id)
@@ -127,6 +128,33 @@ def test_connect_and_disconnect_container(self):
127128
with pytest.raises(docker.errors.APIError):
128129
self.client.disconnect_container_from_network(container, net_id)
129130

131+
@requires_api_version('1.22')
132+
def test_connect_and_force_disconnect_container(self):
133+
net_name, net_id = self.create_network()
134+
135+
container = self.client.create_container('busybox', 'top')
136+
self.tmp_containers.append(container)
137+
self.client.start(container)
138+
139+
network_data = self.client.inspect_network(net_id)
140+
self.assertFalse(network_data.get('Containers'))
141+
142+
self.client.connect_container_to_network(container, net_id)
143+
network_data = self.client.inspect_network(net_id)
144+
self.assertEqual(
145+
list(network_data['Containers'].keys()),
146+
[container['Id']]
147+
)
148+
149+
self.client.disconnect_container_from_network(container, net_id, True)
150+
network_data = self.client.inspect_network(net_id)
151+
self.assertFalse(network_data.get('Containers'))
152+
153+
with pytest.raises(docker.errors.APIError):
154+
self.client.disconnect_container_from_network(
155+
container, net_id, force=True
156+
)
157+
130158
@requires_api_version('1.22')
131159
def test_connect_with_aliases(self):
132160
net_name, net_id = self.create_network()

tests/unit/network_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,4 +184,4 @@ def test_disconnect_container_from_network(self):
184184

185185
self.assertEqual(
186186
json.loads(post.call_args[1]['data']),
187-
{'container': container_id})
187+
{'Container': container_id})

0 commit comments

Comments
 (0)