From 3a255a70674c50b0d161e64b3d9493a24ad03a1f Mon Sep 17 00:00:00 2001 From: Dmitriy Rabotyagov Date: Wed, 25 Oct 2023 13:47:19 +0200 Subject: [PATCH] Do not pass NoneType as argument to ceph_crush_rule With ansible-core 2.15 it is not possible to pass argument of unexpected type, as otherwise module will fail with: `'None' is not a string and conversion is not allowed` With that we want to only get all existing crush rules, so we can simply supply an empty string as a name argument, which would satisfy requirements and have same behaviour for previous ansible versions. Alternative approach would be to stop making `name` as a required argument to the module and use empty string as default value when info state is used. --- library/ceph_crush_rule.py | 3 ++- .../tasks/get_def_crush_rule_name.yml | 2 +- tests/library/test_ceph_crush_rule.py | 25 +++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/library/ceph_crush_rule.py b/library/ceph_crush_rule.py index 88ec8434cb..e696a9fb72 100644 --- a/library/ceph_crush_rule.py +++ b/library/ceph_crush_rule.py @@ -46,7 +46,8 @@ options: name: description: - - name of the Ceph Crush rule. + - name of the Ceph Crush rule. If state is 'info' - empty string + can be provided as a value to get all crush rules required: true cluster: description: diff --git a/roles/ceph-facts/tasks/get_def_crush_rule_name.yml b/roles/ceph-facts/tasks/get_def_crush_rule_name.yml index 4b1a04eb01..cdfcfbf362 100644 --- a/roles/ceph-facts/tasks/get_def_crush_rule_name.yml +++ b/roles/ceph-facts/tasks/get_def_crush_rule_name.yml @@ -1,7 +1,7 @@ --- - name: get current default crush rule details ceph_crush_rule: - name: null + name: "" cluster: "{{ cluster }}" state: info environment: diff --git a/tests/library/test_ceph_crush_rule.py b/tests/library/test_ceph_crush_rule.py index e3bd9b173f..3b31969141 100644 --- a/tests/library/test_ceph_crush_rule.py +++ b/tests/library/test_ceph_crush_rule.py @@ -396,6 +396,31 @@ def test_get_existing_rule(self, m_run_command, m_exit_json): assert result['stderr'] == stderr assert result['stdout'] == stdout + @patch('ansible.module_utils.basic.AnsibleModule.exit_json') + @patch('ansible.module_utils.basic.AnsibleModule.run_command') + def test_get_all_rules(self, m_run_command, m_exit_json): + ca_test_common.set_module_args({ + 'name': str(), + 'state': 'info' + }) + m_exit_json.side_effect = ca_test_common.exit_json + rc = 0 + stderr = '' + stdout = '{{"rule_name":"{}","steps":[{{"item_name":"{}"}},{{"type":"{}"}}]}}'.format(fake_name, fake_bucket_root, fake_bucket_type) + m_run_command.return_value = rc, stdout, stderr + + with pytest.raises(ca_test_common.AnsibleExitJson) as result: + ceph_crush_rule.main() + + result = result.value.args[0] + assert not result['changed'] + assert result['cmd'] == ['ceph', '-n', fake_user, '-k', fake_keyring, + '--cluster', fake_cluster, 'osd', 'crush', 'rule', + 'dump', '--format=json'] + assert result['rc'] == rc + assert result['stderr'] == stderr + assert result['stdout'] == stdout + @patch.dict(os.environ, {'CEPH_CONTAINER_BINARY': fake_container_binary}) @patch.dict(os.environ, {'CEPH_CONTAINER_IMAGE': fake_container_image}) @patch('ansible.module_utils.basic.AnsibleModule.exit_json')