]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ansible.git/commitdiff
ceph_ec_profile: add support more plugins
authorSeena Fallah <seenafallah@gmail.com>
Thu, 14 Mar 2024 12:36:07 +0000 (13:36 +0100)
committerSeena Fallah <seenafallah@gmail.com>
Sat, 16 Mar 2024 23:44:45 +0000 (00:44 +0100)
Add support more plugins with their respective args.

Signed-off-by: Seena Fallah <seenafallah@gmail.com>
(cherry picked from commit 80666a20dad82c6c0f8ad6a99c26bf52781bcfe3)

library/ceph_ec_profile.py
module_utils/ca_common.py

index 1ac5df38dc5f6a18bfc02c206d09e23d576e4820..0b84724095e2f81db65aa0df2298ab92e0311ca1 100644 (file)
@@ -101,7 +101,7 @@ EXAMPLES = '''
 RETURN = '''#  '''
 
 
-def get_profile(module, name, cluster='ceph', container_image=None):
+def get_profile(name, cluster='ceph', container_image=None):
     '''
     Get existing profile
     '''
@@ -116,16 +116,14 @@ def get_profile(module, name, cluster='ceph', container_image=None):
     return cmd
 
 
-def create_profile(module, name, k, m, stripe_unit, crush_device_class, cluster='ceph', force=False, container_image=None):  # noqa: E501
+def create_profile(name, user_profile, force, cluster='ceph', container_image=None):  # noqa: E501
     '''
     Create a profile
     '''
 
-    args = ['set', name, 'k={}'.format(k), 'm={}'.format(m)]
-    if stripe_unit:
-        args.append('stripe_unit={}'.format(stripe_unit))
-    if crush_device_class:
-        args.append('crush-device-class={}'.format(crush_device_class))
+    args = ['set', name]
+    for key, value in user_profile.items():
+        args.append('{}={}'.format(key, value))
     if force:
         args.append('--force')
 
@@ -137,7 +135,7 @@ def create_profile(module, name, k, m, stripe_unit, crush_device_class, cluster=
     return cmd
 
 
-def delete_profile(module, name, cluster='ceph', container_image=None):
+def delete_profile(name, cluster='ceph', container_image=None):
     '''
     Delete a profile
     '''
@@ -152,6 +150,22 @@ def delete_profile(module, name, cluster='ceph', container_image=None):
     return cmd
 
 
+def parse_user_profile(module):
+    profile_keys = ['plugin',
+                    'k', 'm', 'd', 'l', 'c',
+                    'stripe_unit', 'scalar_mds', 'technique',
+                    'crush-root', 'crush-device-class', 'crush-failure-domain']
+
+    profile = {}
+    for key in profile_keys:
+        ansible_lookup_key = key.replace('-', '_')
+        value = module.params.get(ansible_lookup_key)
+        if value:
+            profile[key] = value
+
+    return profile
+
+
 def run_module():
     module_args = dict(
         cluster=dict(type='str', required=False, default='ceph'),
@@ -159,9 +173,18 @@ def run_module():
         state=dict(type='str', required=False,
                    choices=['present', 'absent'], default='present'),
         stripe_unit=dict(type='str', required=False),
-        k=dict(type='str', required=False),
-        m=dict(type='str', required=False),
-        crush_device_class=dict(type='str', required=False, default=''),
+        plugin=dict(type='str', required=False, default='jerasure'),
+        k=dict(type='int', required=False),
+        m=dict(type='int', required=False),
+        d=dict(type='int', required=False),
+        l=dict(type='int', required=False),
+        c=dict(type='int', required=False),
+        scalar_mds=dict(type='str', required=False),
+        technique=dict(type='str', required=False),
+        crush_root=dict(type='str', required=False),
+        crush_failure_domain=dict(type='str', required=False),
+        crush_device_class=dict(type='str', required=False),
+        force=dict(type='bool', required=False, default=False),
     )
 
     module = AnsibleModule(
@@ -174,10 +197,8 @@ def run_module():
     name = module.params.get('name')
     cluster = module.params.get('cluster')
     state = module.params.get('state')
-    stripe_unit = module.params.get('stripe_unit')
-    k = module.params.get('k')
-    m = module.params.get('m')
-    crush_device_class = module.params.get('crush_device_class')
+    force = module.params.get('force')
+    user_profile = parse_user_profile(module)
 
     if module.check_mode:
         module.exit_json(
@@ -191,46 +212,32 @@ def run_module():
         )
 
     startd = datetime.datetime.now()
+    diff = dict(before="", after="")
     changed = False
 
     # will return either the image name or None
     container_image = is_containerized()
 
     if state == "present":
-        rc, cmd, out, err = exec_command(module, get_profile(module, name, cluster, container_image=container_image))  # noqa: E501
+        rc, cmd, out, err = exec_command(module, get_profile(name, cluster, container_image=container_image))  # noqa: E501
+        current_profile = {}
         if rc == 0:
-            # the profile already exists, let's check whether we have to
-            # update it
             current_profile = json.loads(out)
-            if current_profile['k'] != k or \
-               current_profile['m'] != m or \
-               current_profile.get('stripe_unit', stripe_unit) != stripe_unit or \
-               current_profile.get('crush-device-class', crush_device_class) != crush_device_class:  # noqa: E501
-                rc, cmd, out, err = exec_command(module,
-                                                 create_profile(module,
-                                                                name,
-                                                                k,
-                                                                m,
-                                                                stripe_unit,
-                                                                crush_device_class,  # noqa: E501
-                                                                cluster,
-                                                                force=True, container_image=container_image))  # noqa: E501
-                changed = True
-        else:
-            # the profile doesn't exist, it has to be created
-            rc, cmd, out, err = exec_command(module, create_profile(module,
-                                                                    name,
-                                                                    k,
-                                                                    m,
-                                                                    stripe_unit,  # noqa: E501
-                                                                    crush_device_class,  # noqa: E501
-                                                                    cluster,
-                                                                    container_image=container_image))  # noqa: E501
-            if rc == 0:
-                changed = True
+
+        changed = current_profile != user_profile
+        if changed:
+            diff['before'] = json.dumps(current_profile)
+            diff['after'] = json.dumps(user_profile)
+            rc, cmd, out, err = exec_command(module,
+                                             create_profile(name,
+                                                            user_profile,
+                                                            force,
+                                                            cluster,
+                                                            container_image=container_image),  # noqa: E501
+                                             check_rc=True)
 
     elif state == "absent":
-        rc, cmd, out, err = exec_command(module, delete_profile(module, name, cluster, container_image=container_image))  # noqa: E501
+        rc, cmd, out, err = exec_command(module, delete_profile(name, cluster, container_image=container_image))  # noqa: E501
         if not err:
             out = 'Profile {} removed.'.format(name)
             changed = True
@@ -238,7 +245,7 @@ def run_module():
             rc = 0
             out = "Skipping, the profile {} doesn't exist".format(name)
 
-    exit_module(module=module, out=out, rc=rc, cmd=cmd, err=err, startd=startd, changed=changed)  # noqa: E501
+    exit_module(module=module, out=out, rc=rc, cmd=cmd, err=err, startd=startd, changed=changed, diff=diff)  # noqa: E501
 
 
 def main():
index f478b75e59a0172e3951c26ca8f43c574782684b..32c0cbdbed56c805d23d88d0876c0d5799bed9a0 100644 (file)
@@ -81,7 +81,7 @@ def pre_generate_cmd(cmd, container_image=None, interactive=False):
     return cmd
 
 
-def exec_command(module, cmd, stdin=None):
+def exec_command(module, cmd, stdin=None, check_rc=False):
     '''
     Execute command(s)
     '''
@@ -89,7 +89,7 @@ def exec_command(module, cmd, stdin=None):
     binary_data = False
     if stdin:
         binary_data = True
-    rc, out, err = module.run_command(cmd, data=stdin, binary_data=binary_data)
+    rc, out, err = module.run_command(cmd, data=stdin, binary_data=binary_data, check_rc=check_rc)  # noqa: E501
 
     return rc, cmd, out, err