Skip to content

Commit

Permalink
Do not pass NoneType as argument to ceph_crush_rule
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
Dmitriy Rabotyagov committed Oct 25, 2023
1 parent 490ca79 commit 9162d04
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 2 deletions.
3 changes: 2 additions & 1 deletion library/ceph_crush_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion roles/ceph-facts/tasks/get_def_crush_rule_name.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
- name: get current default crush rule details
ceph_crush_rule:
name: null
name: ""
cluster: "{{ cluster }}"
state: info
environment:
Expand Down
25 changes: 25 additions & 0 deletions tests/library/test_ceph_crush_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand Down

0 comments on commit 9162d04

Please sign in to comment.