From 195159ecef8d166cb03c8d9d31734946df849297 Mon Sep 17 00:00:00 2001 From: Dimitri Savineau Date: Fri, 22 Jan 2021 12:45:32 -0500 Subject: [PATCH] library: retrieve realm id for zone/zonegroup When the zonegroup or the zone doesn't have a realm associated then it's not possible to modify that ressource. This patch allows to retrieve the current realm id and compare it to the realm id from the realm in parameter. Signed-off-by: Dimitri Savineau --- library/radosgw_zone.py | 69 ++++++++++++++++++------- library/radosgw_zonegroup.py | 38 +++++++++++++- tests/library/test_radosgw_zone.py | 13 +++++ tests/library/test_radosgw_zonegroup.py | 13 +++++ 4 files changed, 111 insertions(+), 22 deletions(-) diff --git a/library/radosgw_zone.py b/library/radosgw_zone.py index 244520f60..047e1b194 100644 --- a/library/radosgw_zone.py +++ b/library/radosgw_zone.py @@ -329,6 +329,30 @@ def get_zonegroup(module, container_image=None): return cmd +def get_realm(module, container_image=None): + ''' + Get existing realm + ''' + + cluster = module.params.get('cluster') + realm = module.params.get('realm') + + cmd = pre_generate_radosgw_cmd(container_image=container_image) + + args = [ + '--cluster', + cluster, + 'realm', + 'get', + '--rgw-realm=' + realm, + '--format=json' + ] + + cmd.extend(args) + + return cmd + + def remove_zone(module, container_image=None): ''' Remove a zone @@ -415,28 +439,33 @@ def run_module(): rc, cmd, out, err = exec_commands(module, get_zone(module, container_image=container_image)) if rc == 0: zone = json.loads(out) + _rc, _cmd, _out, _err = exec_commands(module, get_realm(module, container_image=container_image)) + if _rc != 0: + fatal(_err, module) + realm = json.loads(_out) _rc, _cmd, _out, _err = exec_commands(module, get_zonegroup(module, container_image=container_image)) - if _rc == 0: - zonegroup = json.loads(_out) - if not access_key: - access_key = '' - if not secret_key: - secret_key = '' - current = { - 'endpoints': next(zone['endpoints'] for zone in zonegroup['zones'] if zone['name'] == name), - 'access_key': zone['system_key']['access_key'], - 'secret_key': zone['system_key']['secret_key'] - } - asked = { - 'endpoints': endpoints, - 'access_key': access_key, - 'secret_key': secret_key - } - if current != asked: - rc, cmd, out, err = exec_commands(module, modify_zone(module, container_image=container_image)) - changed = True - else: + if _rc != 0: fatal(_err, module) + zonegroup = json.loads(_out) + if not access_key: + access_key = '' + if not secret_key: + secret_key = '' + current = { + 'endpoints': next(zone['endpoints'] for zone in zonegroup['zones'] if zone['name'] == name), + 'access_key': zone['system_key']['access_key'], + 'secret_key': zone['system_key']['secret_key'], + 'realm_id': zone['realm_id'] + } + asked = { + 'endpoints': endpoints, + 'access_key': access_key, + 'secret_key': secret_key, + 'realm_id': realm['id'] + } + if current != asked: + rc, cmd, out, err = exec_commands(module, modify_zone(module, container_image=container_image)) + changed = True else: rc, cmd, out, err = exec_commands(module, create_zone(module, container_image=container_image)) changed = True diff --git a/library/radosgw_zonegroup.py b/library/radosgw_zonegroup.py index 8aec4f600..8abf2aef9 100644 --- a/library/radosgw_zonegroup.py +++ b/library/radosgw_zonegroup.py @@ -16,6 +16,10 @@ from __future__ import absolute_import, division, print_function __metaclass__ = type from ansible.module_utils.basic import AnsibleModule +try: + from ansible.module_utils.ca_common import fatal +except ImportError: + from module_utils.ca_common import fatal import datetime import json import os @@ -251,6 +255,30 @@ def get_zonegroup(module, container_image=None): return cmd +def get_realm(module, container_image=None): + ''' + Get existing realm + ''' + + cluster = module.params.get('cluster') + realm = module.params.get('realm') + + cmd = pre_generate_radosgw_cmd(container_image=container_image) + + args = [ + '--cluster', + cluster, + 'realm', + 'get', + '--rgw-realm=' + realm, + '--format=json' + ] + + cmd.extend(args) + + return cmd + + def remove_zonegroup(module, container_image=None): ''' Remove a zonegroup @@ -327,13 +355,19 @@ def run_module(): rc, cmd, out, err = exec_commands(module, get_zonegroup(module, container_image=container_image)) if rc == 0: zonegroup = json.loads(out) + _rc, _cmd, _out, _err = exec_commands(module, get_realm(module, container_image=container_image)) + if _rc != 0: + fatal(_err, module) + realm = json.loads(_out) current = { 'endpoints': zonegroup['endpoints'], - 'master': zonegroup.get('is_master', 'false') + 'master': zonegroup.get('is_master', 'false'), + 'realm_id': zonegroup['realm_id'] } asked = { 'endpoints': endpoints, - 'master': master + 'master': master, + 'realm_id': realm['id'] } if current != asked: rc, cmd, out, err = exec_commands(module, modify_zonegroup(module, container_image=container_image)) diff --git a/tests/library/test_radosgw_zone.py b/tests/library/test_radosgw_zone.py index fd1bfcdd1..dd76549c6 100644 --- a/tests/library/test_radosgw_zone.py +++ b/tests/library/test_radosgw_zone.py @@ -136,6 +136,19 @@ class TestRadosgwZoneModule(object): assert radosgw_zone.get_zonegroup(fake_module) == expected_cmd + def test_get_realm(self): + fake_module = MagicMock() + fake_module.params = fake_params + expected_cmd = [ + fake_binary, + '--cluster', fake_cluster, + 'realm', 'get', + '--rgw-realm=' + fake_realm, + '--format=json' + ] + + assert radosgw_zone.get_realm(fake_module) == expected_cmd + def test_remove_zone(self): fake_module = MagicMock() fake_module.params = fake_params diff --git a/tests/library/test_radosgw_zonegroup.py b/tests/library/test_radosgw_zonegroup.py index 3de7fd009..a56fb9d5e 100644 --- a/tests/library/test_radosgw_zonegroup.py +++ b/tests/library/test_radosgw_zonegroup.py @@ -117,6 +117,19 @@ class TestRadosgwZonegroupModule(object): assert radosgw_zonegroup.get_zonegroup(fake_module) == expected_cmd + def test_get_realm(self): + fake_module = MagicMock() + fake_module.params = fake_params + expected_cmd = [ + fake_binary, + '--cluster', fake_cluster, + 'realm', 'get', + '--rgw-realm=' + fake_realm, + '--format=json' + ] + + assert radosgw_zonegroup.get_realm(fake_module) == expected_cmd + def test_remove_zonegroup(self): fake_module = MagicMock() fake_module.params = fake_params -- 2.39.5