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.

Signed-off-by: Dmitriy Rabotyagov <noonedeadpunk@gmail.com>
pull/7470/head
Dmitriy Rabotyagov 2023-10-25 13:47:19 +02:00 committed by Teoman ONAY
parent 490ca79ccc
commit b610297554
3 changed files with 28 additions and 2 deletions

View File

@ -46,7 +46,8 @@ description:
options: options:
name: name:
description: 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 required: true
cluster: cluster:
description: description:

View File

@ -1,7 +1,7 @@
--- ---
- name: get current default crush rule details - name: get current default crush rule details
ceph_crush_rule: ceph_crush_rule:
name: null name: ""
cluster: "{{ cluster }}" cluster: "{{ cluster }}"
state: info state: info
environment: environment:

View File

@ -396,6 +396,31 @@ class TestCephCrushRuleModule(object):
assert result['stderr'] == stderr assert result['stderr'] == stderr
assert result['stdout'] == stdout 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_BINARY': fake_container_binary})
@patch.dict(os.environ, {'CEPH_CONTAINER_IMAGE': fake_container_image}) @patch.dict(os.environ, {'CEPH_CONTAINER_IMAGE': fake_container_image})
@patch('ansible.module_utils.basic.AnsibleModule.exit_json') @patch('ansible.module_utils.basic.AnsibleModule.exit_json')