From 5b86ac88014271cce1a48ecb10f3ecef96cb4ded Mon Sep 17 00:00:00 2001 From: Dimitri Savineau Date: Mon, 25 Jan 2021 18:06:03 -0500 Subject: [PATCH] library: add realm pull to radosgw_realm module This adds the realm pull operation to the current radosgw_realm module. The pull operation requires the url, access/secret key variables. Signed-off-by: Dimitri Savineau --- library/radosgw_realm.py | 39 +++++++++++++++++++- roles/ceph-rgw/tasks/multisite/secondary.yml | 11 +++++- tests/library/test_radosgw_realm.py | 19 ++++++++++ 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/library/radosgw_realm.py b/library/radosgw_realm.py index 3150d1803..077e51092 100644 --- a/library/radosgw_realm.py +++ b/library/radosgw_realm.py @@ -61,6 +61,18 @@ options: - set the default flag on the realm. required: false default: false + url: + description: + - URL to the master RADOS Gateway zone. + required: false + access_key: + description: + - S3 access key of the master RADOS Gateway zone. + required: false + secret_key: + description: + - S3 secret key of the master RADOS Gateway zone. + required: false author: - Dimitri Savineau @@ -205,6 +217,24 @@ def remove_realm(module, container_image=None): return cmd +def pull_realm(module, container_image=None): + ''' + Pull a realm + ''' + + cluster = module.params.get('cluster') + name = module.params.get('name') + url = module.params.get('url') + access_key = module.params.get('access_key') + secret_key = module.params.get('secret_key') + + args = ['pull', '--rgw-realm=' + name, '--url=' + url, '--access-key=' + access_key, '--secret=' + secret_key] + + cmd = generate_radosgw_cmd(cluster=cluster, args=args, container_image=container_image) + + return cmd + + def exit_module(module, out, rc, cmd, err, startd, changed=False): endd = datetime.datetime.now() delta = endd - startd @@ -226,13 +256,17 @@ def run_module(): module_args = dict( cluster=dict(type='str', required=False, default='ceph'), name=dict(type='str', required=True), - state=dict(type='str', required=False, choices=['present', 'absent', 'info'], default='present'), + state=dict(type='str', required=False, choices=['present', 'absent', 'info', 'pull'], default='present'), default=dict(type='bool', required=False, default=False), + url=dict(type='str', required=False), + access_key=dict(type='str', required=False), + secret_key=dict(type='str', required=False), ) module = AnsibleModule( argument_spec=module_args, supports_check_mode=True, + required_if=[['state', 'pull', ['url', 'access_key', 'secret_key']]], ) # Gather module parameters in variables @@ -274,6 +308,9 @@ def run_module(): elif state == "info": rc, cmd, out, err = exec_commands(module, get_realm(module, container_image=container_image)) + elif state == "pull": + rc, cmd, out, err = exec_commands(module, pull_realm(module, container_image=container_image)) + exit_module(module=module, out=out, rc=rc, cmd=cmd, err=err, startd=startd, changed=changed) diff --git a/roles/ceph-rgw/tasks/multisite/secondary.yml b/roles/ceph-rgw/tasks/multisite/secondary.yml index 128ff6cac..b1b759fc0 100644 --- a/roles/ceph-rgw/tasks/multisite/secondary.yml +++ b/roles/ceph-rgw/tasks/multisite/secondary.yml @@ -21,11 +21,20 @@ when: not item.rgw_zonemaster | default(rgw_zonemaster) | bool - name: fetch the realm(s) - command: "{{ container_exec_cmd }} radosgw-admin realm pull --cluster={{ cluster }} --rgw-realm={{ item.realm }} --url={{ item.endpoint }} --access-key={{ item.system_access_key }} --secret={{ item.system_secret_key }}" + radosgw_realm: + name: "{{ item.realm }}" + cluster: "{{ cluster }}" + url: "{{ item.endpoint }}" + access_key: "{{ item.system_access_key }}" + secret_key: "{{ item.system_secret_key }}" + state: pull delegate_to: "{{ groups[mon_group_name][0] }}" run_once: true loop: "{{ secondary_realms }}" when: secondary_realms is defined + environment: + CEPH_CONTAINER_IMAGE: "{{ ceph_docker_registry + '/' + ceph_docker_image + ':' + ceph_docker_image_tag if containerized_deployment | bool else None }}" + CEPH_CONTAINER_BINARY: "{{ container_binary }}" - name: get the period(s) command: "{{ container_exec_cmd }} radosgw-admin period get --cluster={{ cluster }} --rgw-realm={{ item.realm }}" diff --git a/tests/library/test_radosgw_realm.py b/tests/library/test_radosgw_realm.py index 4a4e51214..a1a7707ca 100644 --- a/tests/library/test_radosgw_realm.py +++ b/tests/library/test_radosgw_realm.py @@ -25,6 +25,9 @@ fake_realm = 'foo' fake_params = {'cluster': fake_cluster, 'name': fake_realm, 'default': True} +fake_url = 'http://192.168.42.100:8080' +fake_access_key = '8XQHmFxixz7LCM2AdM2p' +fake_secret_key = 'XC8IhEPJprL6SrpaJDmolVs7jbOvoe2E3AaWKGRx' class TestRadosgwRealmModule(object): @@ -103,3 +106,19 @@ class TestRadosgwRealmModule(object): ] assert radosgw_realm.remove_realm(fake_module) == expected_cmd + + def test_pull_realm(self): + fake_module = MagicMock() + fake_params.update({'url': fake_url, 'access_key': fake_access_key, 'secret_key': fake_secret_key}) + fake_module.params = fake_params + expected_cmd = [ + fake_binary, + '--cluster', fake_cluster, + 'realm', 'pull', + '--rgw-realm=' + fake_realm, + '--url=' + fake_url, + '--access-key=' + fake_access_key, + '--secret=' + fake_secret_key + ] + + assert radosgw_realm.pull_realm(fake_module) == expected_cmd -- 2.39.5