mirror of https://github.com/ceph/ceph-ansible.git
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 <seenafallah@gmail.com>
(cherry picked from commit d6ac0cc120
)
pull/7600/head
parent
5f85f320c9
commit
acf444f78f
|
@ -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():
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue