ceph_ec_profile: add support more plugins

Add support more plugins with their respective args.

Signed-off-by: Seena Fallah <seenafallah@gmail.com>
(cherry picked from commit 80666a20da)
pull/7519/head
Seena Fallah 2024-03-14 13:36:07 +01:00
parent 35233e85f0
commit c6ec59752c
2 changed files with 55 additions and 48 deletions

View 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():

View 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