diff --git a/lib/ansible/module_utils/nxos.py b/lib/ansible/module_utils/nxos.py index 2086781c1ec..cb837b5643a 100644 --- a/lib/ansible/module_utils/nxos.py +++ b/lib/ansible/module_utils/nxos.py @@ -150,10 +150,16 @@ class Cli: if check_rc and rc != 0: self._module.fail_json(msg=to_text(err, errors='surrogate_then_replace')) - try: - out = self._module.from_json(out) - except ValueError: - out = str(out).strip() + if not check_rc and rc != 0: + try: + out = self._module.from_json(err) + except ValueError: + out = to_text(err, errors='surrogate_then_replace').strip() + else: + try: + out = self._module.from_json(out) + except ValueError: + out = to_text(out, errors='surrogate_then_replace').strip() responses.append(out) return responses diff --git a/lib/ansible/modules/network/nxos/nxos_banner.py b/lib/ansible/modules/network/nxos/nxos_banner.py index 3690a31f1bc..6d9295b90d0 100644 --- a/lib/ansible/modules/network/nxos/nxos_banner.py +++ b/lib/ansible/modules/network/nxos/nxos_banner.py @@ -107,7 +107,11 @@ def map_obj_to_commands(want, have, module): def map_config_to_obj(module): - output = run_commands(module, ['show banner %s' % module.params['banner']])[0] + output = run_commands(module, ['show banner %s' % module.params['banner']], False)[0] + + if "Invalid command" in output: + module.fail_json(msg="banner: exec may not be supported on this platform. Possible values are : exec | motd") + if isinstance(output, dict): output = list(output.values())[0] @@ -148,6 +152,7 @@ def main(): supports_check_mode=True) warnings = list() + check_args(module, warnings) result = {'changed': False} @@ -155,7 +160,6 @@ def main(): result['warnings'] = warnings want = map_params_to_obj(module) have = map_config_to_obj(module) - commands = map_obj_to_commands(want, have, module) result['commands'] = commands diff --git a/test/units/modules/network/nxos/test_nxos_banner.py b/test/units/modules/network/nxos/test_nxos_banner.py index 216361f3850..145b4bd57e9 100644 --- a/test/units/modules/network/nxos/test_nxos_banner.py +++ b/test/units/modules/network/nxos/test_nxos_banner.py @@ -42,12 +42,42 @@ class TestNxosBannerModule(TestNxosModule): def load_fixtures(self, commands=None, device=''): self.load_config.return_value = dict(diff=None, session='session') - def test_nxos_banner_create(self): + def test_nxos_banner_exec_create(self): set_module_args(dict(banner='exec', text='test\nbanner\nstring')) commands = ['banner exec @\ntest\nbanner\nstring\n@'] + self.run_commands.return_value = commands self.execute_module(changed=True, commands=commands) - def test_nxos_banner_remove(self): + def test_nxos_banner_exec_remove(self): set_module_args(dict(banner='exec', state='absent')) commands = ['no banner exec'] + self.run_commands.return_value = commands + self.execute_module(changed=True, commands=commands) + + def test_nxos_banner_exec_fail_create(self): + set_module_args(dict(banner='exec', text='test\nbanner\nstring')) + commands = ['banner exec @\ntest\nbanner\nstring\n@'] + err_rsp = ['Invalid command'] + self.run_commands.return_value = err_rsp + result = self.execute_module(failed=True, changed=True) + self.assertEqual(result['msg'], 'banner: exec may not be supported on this platform. Possible values are : exec | motd') + + def test_nxos_banner_exec_fail_remove(self): + set_module_args(dict(banner='exec', state='absent')) + commands = ['no banner exec'] + err_rsp = ['Invalid command'] + self.run_commands.return_value = err_rsp + result = self.execute_module(failed=True, changed=True) + self.assertEqual(result['msg'], 'banner: exec may not be supported on this platform. Possible values are : exec | motd') + + def test_nxos_banner_motd_create(self): + set_module_args(dict(banner='motd', text='test\nbanner\nstring')) + commands = ['banner motd @\ntest\nbanner\nstring\n@'] + self.run_commands.return_value = commands + self.execute_module(changed=True, commands=commands) + + def test_nxos_banner_motd_remove(self): + set_module_args(dict(banner='motd', state='absent')) + commands = ['no banner motd'] + self.run_commands.return_value = commands self.execute_module(changed=True, commands=commands)