From 6d1bd33aa5f2e82ada8397b6bd9c7e889eed9cf1 Mon Sep 17 00:00:00 2001 From: Trishna Guha Date: Fri, 28 Jul 2017 17:09:04 +0530 Subject: [PATCH] fix iosxr_banner (#27378) Signed-off-by: Trishna Guha --- .../modules/network/iosxr/iosxr_banner.py | 23 +++++--- .../iosxr_banner/tests/cli/basic-login.yaml | 4 +- .../iosxr_banner/tests/cli/basic-motd.yaml | 4 +- .../tests/cli/basic-no-login.yaml | 2 +- .../network/iosxr/test_iosxr_banner.py | 53 ------------------- 5 files changed, 22 insertions(+), 64 deletions(-) delete mode 100644 test/units/modules/network/iosxr/test_iosxr_banner.py diff --git a/lib/ansible/modules/network/iosxr/iosxr_banner.py b/lib/ansible/modules/network/iosxr/iosxr_banner.py index 4e85cb3b08..1740c51e2c 100644 --- a/lib/ansible/modules/network/iosxr/iosxr_banner.py +++ b/lib/ansible/modules/network/iosxr/iosxr_banner.py @@ -87,6 +87,8 @@ commands: - string """ +import re + from ansible.module_utils.basic import AnsibleModule from ansible.module_utils.iosxr import get_config, load_config from ansible.module_utils.iosxr import iosxr_argument_spec, check_args @@ -97,12 +99,13 @@ def map_obj_to_commands(updates, module): want, have = updates state = module.params['state'] - if state == 'absent' or (state == 'absent' and - 'text' in have.keys() and have['text']): - commands.append('no banner %s' % module.params['banner']) + if state == 'absent': + if have.get('state') != 'absent' and ('text' in have.keys() and have['text']): + commands.append('no banner %s' % module.params['banner']) elif state == 'present': - if want['text'] and (want['text'] != have.get('text')): + if (want['text'] and + want['text'].encode().decode('unicode_escape').strip("'") != have.get('text')): banner_cmd = 'banner %s ' % module.params['banner'] banner_cmd += want['text'].strip() commands.append(banner_cmd) @@ -113,9 +116,17 @@ def map_obj_to_commands(updates, module): def map_config_to_obj(module): flags = 'banner %s' % module.params['banner'] output = get_config(module, flags=[flags]) + + match = re.search(r'banner (\S+) (.*)', output, re.DOTALL) + if match: + text = match.group(2).strip("'") + else: + text = None + obj = {'banner': module.params['banner'], 'state': 'absent'} + if output: - obj['text'] = output + obj['text'] = text obj['state'] = 'present' return obj @@ -124,7 +135,7 @@ def map_config_to_obj(module): def map_params_to_obj(module): text = module.params['text'] if text: - text = str(text).strip() + text = "%r" % (str(text).strip()) return { 'banner': module.params['banner'], diff --git a/test/integration/targets/iosxr_banner/tests/cli/basic-login.yaml b/test/integration/targets/iosxr_banner/tests/cli/basic-login.yaml index 9e87a5d5ad..cf89734a4f 100644 --- a/test/integration/targets/iosxr_banner/tests/cli/basic-login.yaml +++ b/test/integration/targets/iosxr_banner/tests/cli/basic-login.yaml @@ -22,8 +22,8 @@ - assert: that: - "result.changed == true" - - "'this is my login banner' in result.commands" - - "'that has a multiline' in result.commands" + - "'this is my login banner' in result.commands[0]" + - "'that has a multiline' in result.commands[0]" - name: Set login again (idempotent) iosxr_banner: diff --git a/test/integration/targets/iosxr_banner/tests/cli/basic-motd.yaml b/test/integration/targets/iosxr_banner/tests/cli/basic-motd.yaml index da7b78c17e..207f56f01d 100644 --- a/test/integration/targets/iosxr_banner/tests/cli/basic-motd.yaml +++ b/test/integration/targets/iosxr_banner/tests/cli/basic-motd.yaml @@ -22,8 +22,8 @@ - assert: that: - "result.changed == true" - - "'this is my motd banner' in result.commands" - - "'that has a multiline' in result.commands" + - "'this is my motd banner' in result.commands[0]" + - "'that has a multiline' in result.commands[0]" - name: Set motd again (idempotent) iosxr_banner: diff --git a/test/integration/targets/iosxr_banner/tests/cli/basic-no-login.yaml b/test/integration/targets/iosxr_banner/tests/cli/basic-no-login.yaml index 7590b6b2fa..9b96d01c02 100644 --- a/test/integration/targets/iosxr_banner/tests/cli/basic-no-login.yaml +++ b/test/integration/targets/iosxr_banner/tests/cli/basic-no-login.yaml @@ -21,7 +21,7 @@ - assert: that: - "result.changed == true" - - "'no banner login' in result.commands" + - "'no banner login' in result.commands[0]" - name: remove login (idempotent) iosxr_banner: diff --git a/test/units/modules/network/iosxr/test_iosxr_banner.py b/test/units/modules/network/iosxr/test_iosxr_banner.py deleted file mode 100644 index ae2c07ed81..0000000000 --- a/test/units/modules/network/iosxr/test_iosxr_banner.py +++ /dev/null @@ -1,53 +0,0 @@ -# This file is part of Ansible -# -# Ansible is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Ansible is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Ansible. If not, see . - -# Make coding more python3-ish -from __future__ import (absolute_import, division, print_function) -__metaclass__ = type - -import json - -from ansible.compat.tests.mock import patch -from ansible.modules.network.iosxr import iosxr_banner -from .iosxr_module import TestIosxrModule, load_fixture, set_module_args - - -class TestIosxrBannerModule(TestIosxrModule): - - module = iosxr_banner - - def setUp(self): - self.mock_get_config = patch('ansible.modules.network.iosxr.iosxr_banner.get_config') - self.get_config = self.mock_get_config.start() - - self.mock_load_config = patch('ansible.modules.network.iosxr.iosxr_banner.load_config') - self.load_config = self.mock_load_config.start() - - def tearDown(self): - self.mock_get_config.stop() - self.mock_load_config.stop() - - def load_fixtures(self, commands=None): - self.load_config.return_value = dict(diff=None, session='session') - - def test_iosxr_banner_create(self): - set_module_args(dict(banner='login', text='test\nbanner\nstring')) - commands = ['banner login test\nbanner\nstring'] - self.execute_module(changed=True, commands=commands) - - def test_iosxr_banner_remove(self): - set_module_args(dict(banner='login', state='absent')) - commands = ['no banner login'] - self.execute_module(changed=True, commands=commands)