diff --git a/library/ceph_ec_profile.py b/library/ceph_ec_profile.py index 1ac5df38dc..0b84724095 100644 --- a/library/ceph_ec_profile.py +++ b/library/ceph_ec_profile.py @@ -101,7 +101,7 @@ 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(): diff --git a/module_utils/ca_common.py b/module_utils/ca_common.py index f478b75e59..32c0cbdbed 100644 --- a/module_utils/ca_common.py +++ b/module_utils/ca_common.py @@ -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