From d6ac0cc120c5552dba8ceb04a9ef77fe027e6cb4 Mon Sep 17 00:00:00 2001 From: Seena Fallah Date: Tue, 30 Jul 2024 22:44:19 +0200 Subject: [PATCH] ceph-pool: add support updating crush rule of the pool Support updating crush rule of the pool via crush rule name. Signed-off-by: Seena Fallah --- library/ceph_pool.py | 43 +++++++++++++++++++++++++++++++-- tests/library/test_ceph_pool.py | 36 +++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/library/ceph_pool.py b/library/ceph_pool.py index 96e66ddf8..734fdc7f5 100644 --- a/library/ceph_pool.py +++ b/library/ceph_pool.py @@ -219,6 +219,28 @@ def get_application_pool(cluster, return cmd +def get_crush_rule_pool(cluster, + name, + user, + user_key, + output_format='json', + container_image=None): + ''' + Get crush rule type on a given pool + ''' + + args = ['get', name, 'crush_rule', '-f', output_format] + + cmd = generate_cmd(sub_cmd=['osd', 'pool'], + args=args, + cluster=cluster, + user=user, + user_key=user_key, + container_image=container_image) + + return cmd + + def enable_application_pool(cluster, name, application, @@ -317,6 +339,12 @@ def get_pool_details(module, user, # noqa: E501 user_key, # noqa: E501 container_image=container_image)) # noqa: E501 + _rc, _cmd, crush_rule, _err = exec_command(module, + get_crush_rule_pool(cluster, # noqa: E501 + name, # noqa: E501 + user, # noqa: E501 + user_key, # noqa: E501 + container_image=container_image)) # noqa: E501 # This is a trick because "target_size_ratio" isn't present at the same # level in the dict @@ -343,6 +371,8 @@ def get_pool_details(module, else: out['application'] = application[0] + out['crush_rule'] = json.loads(crush_rule.strip())['crush_rule'] + return rc, cmd, out, err @@ -353,7 +383,8 @@ def compare_pool_config(user_pool_config, running_pool_details): delta = {} filter_keys = ['pg_num', 'pg_placement_num', 'size', - 'pg_autoscale_mode', 'target_size_ratio'] + 'pg_autoscale_mode', 'target_size_ratio', + 'crush_rule'] for key in filter_keys: if (str(running_pool_details[key]) != user_pool_config[key]['value'] and # noqa: E501 user_pool_config[key]['value']): @@ -599,6 +630,8 @@ def run_module(): keyring_filename = cluster + '.' + user + '.keyring' user_key = os.path.join("/etc/ceph/", keyring_filename) + diff = dict(before="", after="") + if state == "present": rc, cmd, out, err = exec_command(module, check_pool_exist(cluster, @@ -625,6 +658,12 @@ def run_module(): if details['pg_autoscale_mode'] == 'on': delta.pop('pg_num', None) delta.pop('pgp_num', None) + if not module.params.get('rule_name'): + delta.pop('crush_rule', None) + + for key in delta.keys(): + diff['before'] += "{}: {}\n".format(key, details[key]) + diff['after'] += "{}: {}\n".format(key, delta[key]['value']) changed = len(delta) > 0 if changed and not module.check_mode: @@ -687,7 +726,7 @@ def run_module(): container_image=container_image)) # noqa: E501 exit_module(module=module, out=out, rc=rc, cmd=cmd, err=err, startd=startd, - changed=changed) + changed=changed, diff=diff) def main(): diff --git a/tests/library/test_ceph_pool.py b/tests/library/test_ceph_pool.py index f072c2611..a83b5c442 100644 --- a/tests/library/test_ceph_pool.py +++ b/tests/library/test_ceph_pool.py @@ -248,6 +248,42 @@ class TestCephPoolModule(object): assert cmd == expected_command + def test_get_crush_rule_pool(self): + expected_command = [ + 'podman', + 'run', + '--rm', + '--net=host', + '-v', + '/etc/ceph:/etc/ceph:z', + '-v', + '/var/lib/ceph/:/var/lib/ceph/:z', + '-v', + '/var/log/ceph/:/var/log/ceph/:z', + '--entrypoint=ceph', + fake_container_image_name, + '-n', + 'client.admin', + '-k', + '/etc/ceph/ceph.client.admin.keyring', + '--cluster', + 'ceph', + 'osd', + 'pool', + 'get', + self.fake_user_pool_config['pool_name']['value'], + 'crush_rule', + '-f', + 'json' + ] + + cmd = ceph_pool.get_crush_rule_pool(fake_cluster_name, + self.fake_user_pool_config['pool_name']['value'], + fake_user, fake_user_key, 'json', + container_image=fake_container_image_name) + + assert cmd == expected_command + def test_enable_application_pool(self): expected_command = [ 'podman',