From d7b386fb2cb838789992b43aa76901585db6355a 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 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/library/ceph_pool.py b/library/ceph_pool.py index 96e66ddf8f..734fdc7f58 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():