Skip to content

Commit 41e1164

Browse files
committed
Implement swarm node removal
Signed-off-by: Joffrey F <[email protected]>
1 parent 5344e11 commit 41e1164

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

docker/api/swarm.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,13 +224,41 @@ def nodes(self, filters=None):
224224

225225
return self._result(self._get(url, params=params), True)
226226

227+
@utils.check_resource
228+
@utils.minimum_version('1.24')
229+
def remove_node(self, node_id, force=False):
230+
"""
231+
Remove a node from the swarm.
232+
233+
Args:
234+
node_id (string): ID of the node to be removed.
235+
force (bool): Force remove an active node. Default: `False`
236+
237+
Raises:
238+
:py:class:`docker.errors.NotFound`
239+
If the node referenced doesn't exist in the swarm.
240+
241+
:py:class:`docker.errors.APIError`
242+
If the server returns an error.
243+
Returns:
244+
`True` if the request was successful.
245+
"""
246+
url = self._url('/nodes/{0}', node_id)
247+
params = {
248+
'force': force
249+
}
250+
res = self._delete(url, params=params)
251+
self._raise_for_status(res)
252+
return True
253+
227254
@utils.minimum_version('1.24')
228255
def update_node(self, node_id, version, node_spec=None):
229256
"""
230257
Update the Node's configuration
231258
232259
Args:
233260
261+
node_id (string): ID of the node to be updated.
234262
version (int): The version number of the node object being
235263
updated. This is required to avoid conflicting writes.
236264
node_spec (dict): Configuration settings to update. Any values

docker/models/nodes.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,25 @@ def update(self, node_spec):
4141
"""
4242
return self.client.api.update_node(self.id, self.version, node_spec)
4343

44+
def remove(self, force=False):
45+
"""
46+
Remove this node from the swarm.
47+
48+
Args:
49+
force (bool): Force remove an active node. Default: `False`
50+
51+
Returns:
52+
`True` if the request was successful.
53+
54+
Raises:
55+
:py:class:`docker.errors.NotFound`
56+
If the node doesn't exist in the swarm.
57+
58+
:py:class:`docker.errors.APIError`
59+
If the server returns an error.
60+
"""
61+
return self.client.api.remove_node(self.id, force=force)
62+
4463

4564
class NodeCollection(Collection):
4665
"""Nodes on the Docker server."""

tests/integration/api_swarm_test.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,20 @@ def test_update_node(self):
159159
node_spec=orig_spec)
160160
reverted_node = self.client.inspect_node(node['ID'])
161161
assert orig_spec == reverted_node['Spec']
162+
163+
@requires_api_version('1.24')
164+
def test_remove_main_node(self):
165+
assert self.client.init_swarm('eth0')
166+
nodes_list = self.client.nodes()
167+
node_id = nodes_list[0]['ID']
168+
with pytest.raises(docker.errors.NotFound):
169+
self.client.remove_node('foobar01')
170+
with pytest.raises(docker.errors.APIError) as e:
171+
self.client.remove_node(node_id)
172+
173+
assert e.value.response.status_code == 500
174+
175+
with pytest.raises(docker.errors.APIError) as e:
176+
self.client.remove_node(node_id, True)
177+
178+
assert e.value.response.status_code == 500

0 commit comments

Comments
 (0)