]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
ceph-pool: add support updating crush rule of the pool
authorSeena Fallah <seenafallah@gmail.com>
Tue, 30 Jul 2024 20:44:19 +0000 (22:44 +0200)
committerGuillaume Abrioux <gabrioux@ibm.com>
Tue, 13 Aug 2024 09:17:36 +0000 (11:17 +0200)
Support updating crush rule of the pool via crush rule name.

Signed-off-by: Seena Fallah <seenafallah@gmail.com>
library/ceph_pool.py
tests/library/test_ceph_pool.py

index 96e66ddf8f6ef2bd5e4b86786b957321f784c49b..734fdc7f58b17d4b85838a86aca1cb2dd01c0244 100644 (file)
@@ -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():
index f072c26115cabc7c2f926bb3de5796567c3dbbc6..a83b5c442e6459ed857b20d769e3c03722de317d 100644 (file)
@@ -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',