Skip to content

Commit 836194c

Browse files
authored
Merge pull request #2295 from hannseman/swarm-rotate-token
Add support for rotate_manager_unlock_key
2 parents 75e0ad0 + 532c62e commit 836194c

File tree

3 files changed

+35
-8
lines changed

3 files changed

+35
-8
lines changed

docker/api/swarm.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -406,8 +406,10 @@ def update_node(self, node_id, version, node_spec=None):
406406
return True
407407

408408
@utils.minimum_version('1.24')
409-
def update_swarm(self, version, swarm_spec=None, rotate_worker_token=False,
410-
rotate_manager_token=False):
409+
def update_swarm(self, version, swarm_spec=None,
410+
rotate_worker_token=False,
411+
rotate_manager_token=False,
412+
rotate_manager_unlock_key=False):
411413
"""
412414
Update the Swarm's configuration
413415
@@ -421,6 +423,8 @@ def update_swarm(self, version, swarm_spec=None, rotate_worker_token=False,
421423
``False``.
422424
rotate_manager_token (bool): Rotate the manager join token.
423425
Default: ``False``.
426+
rotate_manager_unlock_key (bool): Rotate the manager unlock key.
427+
Default: ``False``.
424428
425429
Returns:
426430
``True`` if the request went through.
@@ -429,12 +433,20 @@ def update_swarm(self, version, swarm_spec=None, rotate_worker_token=False,
429433
:py:class:`docker.errors.APIError`
430434
If the server returns an error.
431435
"""
432-
433436
url = self._url('/swarm/update')
434-
response = self._post_json(url, data=swarm_spec, params={
437+
params = {
435438
'rotateWorkerToken': rotate_worker_token,
436439
'rotateManagerToken': rotate_manager_token,
437440
'version': version
438-
})
441+
}
442+
if rotate_manager_unlock_key:
443+
if utils.version_lt(self._version, '1.25'):
444+
raise errors.InvalidVersion(
445+
'Rotate manager unlock key '
446+
'is only available for API version >= 1.25'
447+
)
448+
params['rotateManagerUnlockKey'] = rotate_manager_unlock_key
449+
450+
response = self._post_json(url, data=swarm_spec, params=params)
439451
self._raise_for_status(response)
440452
return True

docker/models/swarm.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ def unlock(self, key):
151151
unlock.__doc__ = APIClient.unlock_swarm.__doc__
152152

153153
def update(self, rotate_worker_token=False, rotate_manager_token=False,
154-
**kwargs):
154+
rotate_manager_unlock_key=False, **kwargs):
155155
"""
156156
Update the swarm's configuration.
157157
@@ -164,7 +164,8 @@ def update(self, rotate_worker_token=False, rotate_manager_token=False,
164164
``False``.
165165
rotate_manager_token (bool): Rotate the manager join token.
166166
Default: ``False``.
167-
167+
rotate_manager_unlock_key (bool): Rotate the manager unlock key.
168+
Default: ``False``.
168169
Raises:
169170
:py:class:`docker.errors.APIError`
170171
If the server returns an error.
@@ -178,5 +179,6 @@ def update(self, rotate_worker_token=False, rotate_manager_token=False,
178179
version=self.version,
179180
swarm_spec=self.client.api.create_swarm_spec(**kwargs),
180181
rotate_worker_token=rotate_worker_token,
181-
rotate_manager_token=rotate_manager_token
182+
rotate_manager_token=rotate_manager_token,
183+
rotate_manager_unlock_key=rotate_manager_unlock_key
182184
)

tests/integration/api_swarm_test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,19 @@ def test_remove_main_node(self):
236236

237237
assert e.value.response.status_code >= 400
238238

239+
@requires_api_version('1.25')
240+
def test_rotate_manager_unlock_key(self):
241+
spec = self.client.create_swarm_spec(autolock_managers=True)
242+
assert self.init_swarm(swarm_spec=spec)
243+
swarm_info = self.client.inspect_swarm()
244+
key_1 = self.client.get_unlock_key()
245+
assert self.client.update_swarm(
246+
version=swarm_info['Version']['Index'],
247+
rotate_manager_unlock_key=True
248+
)
249+
key_2 = self.client.get_unlock_key()
250+
assert key_1['UnlockKey'] != key_2['UnlockKey']
251+
239252
@requires_api_version('1.30')
240253
def test_init_swarm_data_path_addr(self):
241254
assert self.init_swarm(data_path_addr='eth0')

0 commit comments

Comments
 (0)