From: Dimitri Savineau Date: Thu, 21 Jan 2021 16:19:44 +0000 (-0500) Subject: library: make cephadm_adopt module idempotent X-Git-Tag: v5.0.11~7 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4ab40842df1672061adb44c4087870713262cf80;p=ceph-ansible.git library: make cephadm_adopt module idempotent Running the cephadm_adopt module on an already adopted daemon will fail because the cephadm adopt command isn't idempotent. Closes: https://bugzilla.redhat.com/show_bug.cgi?id=1918424 Signed-off-by: Dimitri Savineau (cherry picked from commit ff9d314305400aeab764310c44bfab95beb64f04) --- diff --git a/library/cephadm_adopt.py b/library/cephadm_adopt.py index bb70c5887..be3faf767 100644 --- a/library/cephadm_adopt.py +++ b/library/cephadm_adopt.py @@ -17,6 +17,7 @@ __metaclass__ = type from ansible.module_utils.basic import AnsibleModule import datetime +import json ANSIBLE_METADATA = { @@ -135,6 +136,35 @@ def main(): startd = datetime.datetime.now() + cmd = ['cephadm', 'ls', '--no-detail'] + + if module.check_mode: + exit_module( + module=module, + out='', + rc=0, + cmd=cmd, + err='', + startd=startd, + changed=False + ) + else: + rc, out, err = module.run_command(cmd) + + if rc == 0: + if name in [x["name"] for x in json.loads(out) if x["style"] == "cephadm:v1"]: + exit_module( + module=module, + out='{} is already adopted'.format(name), + rc=0, + cmd=cmd, + err='', + startd=startd, + changed=False + ) + else: + module.fail_json(msg=err, rc=rc) + cmd = ['cephadm'] if docker: @@ -151,27 +181,16 @@ def main(): if not firewalld: cmd.append('--skip-firewalld') - if module.check_mode: - exit_module( - module=module, - out='', - rc=0, - cmd=cmd, - err='', - startd=startd, - changed=False - ) - else: - rc, out, err = module.run_command(cmd) - exit_module( - module=module, - out=out, - rc=rc, - cmd=cmd, - err=err, - startd=startd, - changed=True - ) + rc, out, err = module.run_command(cmd) + exit_module( + module=module, + out=out, + rc=rc, + cmd=cmd, + err=err, + startd=startd, + changed=True + ) if __name__ == '__main__': diff --git a/tests/library/test_cephadm_adopt.py b/tests/library/test_cephadm_adopt.py index 337d58265..660d1b3d5 100644 --- a/tests/library/test_cephadm_adopt.py +++ b/tests/library/test_cephadm_adopt.py @@ -57,12 +57,12 @@ class TestCephadmAdoptModule(object): result = result.value.args[0] assert not result['changed'] - assert result['cmd'] == ['cephadm', 'adopt', '--cluster', fake_cluster, '--name', fake_name, '--style', 'legacy'] + assert result['cmd'] == ['cephadm', 'ls', '--no-detail'] assert result['rc'] == 0 assert not result['stdout'] assert not result['stderr'] - @patch('ansible.module_utils.basic.AnsibleModule.exit_json') + @patch('ansible.module_utils.basic.AnsibleModule.fail_json') @patch('ansible.module_utils.basic.AnsibleModule.run_command') def test_with_failure(self, m_run_command, m_exit_json): set_module_args({ @@ -78,10 +78,8 @@ class TestCephadmAdoptModule(object): cephadm_adopt.main() result = result.value.args[0] - assert result['changed'] - assert result['cmd'] == ['cephadm', 'adopt', '--cluster', fake_cluster, '--name', fake_name, '--style', 'legacy'] assert result['rc'] == 1 - assert result['stderr'] == 'ERROR: cephadm should be run as root' + assert result['msg'] == 'ERROR: cephadm should be run as root' @patch('ansible.module_utils.basic.AnsibleModule.exit_json') @patch('ansible.module_utils.basic.AnsibleModule.run_command') @@ -99,7 +97,10 @@ class TestCephadmAdoptModule(object): 'firewalld ready'.format(fake_name, fake_name) stderr = '' rc = 0 - m_run_command.return_value = rc, stdout, stderr + m_run_command.side_effect = [ + (0, '[{{"style":"legacy","name":"{}"}}]'.format(fake_name), ''), + (rc, stdout, stderr) + ] with pytest.raises(AnsibleExitJson) as result: cephadm_adopt.main() @@ -111,6 +112,28 @@ class TestCephadmAdoptModule(object): 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_already_adopted(self, m_run_command, m_exit_json): + set_module_args({ + 'name': fake_name + }) + m_exit_json.side_effect = exit_json + stderr = '' + stdout = '[{{"style":"cephadm:v1","name":"{}"}}]'.format(fake_name) + rc = 0 + m_run_command.return_value = rc, stdout, stderr + + with pytest.raises(AnsibleExitJson) as result: + cephadm_adopt.main() + + result = result.value.args[0] + assert not result['changed'] + assert result['cmd'] == ['cephadm', 'ls', '--no-detail'] + assert result['rc'] == 0 + assert result['stderr'] == stderr + assert result['stdout'] == '{} is already adopted'.format(fake_name) + @patch('ansible.module_utils.basic.AnsibleModule.exit_json') @patch('ansible.module_utils.basic.AnsibleModule.run_command') def test_with_docker(self, m_run_command, m_exit_json): @@ -122,7 +145,10 @@ class TestCephadmAdoptModule(object): stdout = '' stderr = '' rc = 0 - m_run_command.return_value = rc, stdout, stderr + m_run_command.side_effect = [ + (0, '[{{"style":"legacy","name":"{}"}}]'.format(fake_name), ''), + (rc, stdout, stderr) + ] with pytest.raises(AnsibleExitJson) as result: cephadm_adopt.main() @@ -143,7 +169,10 @@ class TestCephadmAdoptModule(object): stdout = '' stderr = '' rc = 0 - m_run_command.return_value = rc, stdout, stderr + m_run_command.side_effect = [ + (0, '[{{"style":"legacy","name":"{}"}}]'.format(fake_name), ''), + (rc, stdout, stderr) + ] with pytest.raises(AnsibleExitJson) as result: cephadm_adopt.main() @@ -164,7 +193,10 @@ class TestCephadmAdoptModule(object): stdout = '' stderr = '' rc = 0 - m_run_command.return_value = rc, stdout, stderr + m_run_command.side_effect = [ + (0, '[{{"style":"legacy","name":"{}"}}]'.format(fake_name), ''), + (rc, stdout, stderr) + ] with pytest.raises(AnsibleExitJson) as result: cephadm_adopt.main() @@ -185,7 +217,10 @@ class TestCephadmAdoptModule(object): stdout = '' stderr = '' rc = 0 - m_run_command.return_value = rc, stdout, stderr + m_run_command.side_effect = [ + (0, '[{{"style":"legacy","name":"{}"}}]'.format(fake_name), ''), + (rc, stdout, stderr) + ] with pytest.raises(AnsibleExitJson) as result: cephadm_adopt.main()