ios_logging: fix idempotence errors (#53109)

* ios_logging: fix the error checking the existence of "host" destinations (IOS 12)

In the "have" list, records of type "host" do not contain the key "size",
although in the list "want" it is always there. Because of this, the module
assumes that the "host" type destinations is not configured and does it again.
This does not change the configuration on the device, but is redundant and
the status of the task will always be "changed". This patch fixes it.

* ios_logging: fixes #53227

* ios_logging: minor changes in string matching
This commit is contained in:
hexdump0x0200 2019-03-07 19:10:03 +07:00 committed by Nilashish Chakraborty
parent ce9fc9b912
commit 4d407d1781
4 changed files with 84 additions and 1 deletions

View file

@ -274,7 +274,7 @@ def map_config_to_obj(module):
data = get_config(module, flags=['| include logging']) data = get_config(module, flags=['| include logging'])
for line in data.split('\n'): for line in data.split('\n'):
match = re.search(r'logging (\S+)', line, re.M) match = re.search(r'^logging (\S+)', line, re.M)
if match: if match:
if match.group(1) in dest_group: if match.group(1) in dest_group:
dest = match.group(1) dest = match.group(1)
@ -291,6 +291,7 @@ def map_config_to_obj(module):
obj.append({ obj.append({
'dest': dest, 'dest': dest,
'name': match.group(1), 'name': match.group(1),
'size': parse_size(line, dest),
'facility': parse_facility(line, dest), 'facility': parse_facility(line, dest),
'level': parse_level(line, dest) 'level': parse_level(line, dest)
}) })
@ -301,6 +302,7 @@ def map_config_to_obj(module):
obj.append({ obj.append({
'dest': dest, 'dest': dest,
'name': match.group(1), 'name': match.group(1),
'size': parse_size(line, dest),
'facility': parse_facility(line, dest), 'facility': parse_facility(line, dest),
'level': parse_level(line, dest) 'level': parse_level(line, dest)
}) })

View file

@ -2,6 +2,7 @@
logging buffered 5000 logging buffered 5000
logging console informational logging console informational
logging facility local0 logging facility local0
no logging monitor
logging host 1.2.3.4 transport tcp logging host 1.2.3.4 transport tcp
logging host 1.2.3.4 logging host 1.2.3.4
logging host 2.3.4.5 logging host 2.3.4.5

View file

@ -0,0 +1,6 @@
!
logging buffered 5000
logging console informational
logging facility local0
logging 2.3.4.5
!

View file

@ -66,3 +66,77 @@ class TestIosLoggingModule(TestIosModule):
set_module_args(dict(dest='buffered', size=6000)) set_module_args(dict(dest='buffered', size=6000))
commands = ['logging buffered 6000'] commands = ['logging buffered 6000']
self.execute_module(changed=True, commands=commands) self.execute_module(changed=True, commands=commands)
def test_ios_logging_add_host(self):
set_module_args(dict(dest='host', name='192.168.1.1'))
commands = ['logging host 192.168.1.1']
self.execute_module(changed=True, commands=commands)
def test_ios_logging_host_idempotent(self):
set_module_args(dict(dest='host', name='2.3.4.5'))
commands = []
self.execute_module(changed=False, commands=commands)
def test_ios_logging_delete_non_exist_host(self):
set_module_args(dict(dest='host', name='192.168.1.1', state='absent'))
commands = []
self.execute_module(changed=False, commands=commands)
def test_ios_logging_delete_host(self):
set_module_args(dict(dest='host', name='2.3.4.5', state='absent'))
commands = ['no logging host 2.3.4.5']
self.execute_module(changed=True, commands=commands)
def test_ios_logging_configure_disabled_monitor_destination(self):
set_module_args(dict(dest='monitor', level='debugging'))
commands = ['logging monitor debugging']
self.execute_module(changed=True, commands=commands)
class TestIosLoggingModuleIOS12(TestIosModule):
module = ios_logging
def setUp(self):
super(TestIosLoggingModuleIOS12, self).setUp()
self.mock_get_config = patch('ansible.modules.network.ios.ios_logging.get_config')
self.get_config = self.mock_get_config.start()
self.mock_load_config = patch('ansible.modules.network.ios.ios_logging.load_config')
self.load_config = self.mock_load_config.start()
self.mock_get_capabilities = patch('ansible.modules.network.ios.ios_logging.get_capabilities')
self.get_capabilities = self.mock_get_capabilities.start()
self.get_capabilities.return_value = {'device_info': {'network_os_version': '12.1(2)T'}}
def tearDown(self):
super(TestIosLoggingModuleIOS12, self).tearDown()
self.mock_get_config.stop()
self.mock_load_config.stop()
self.mock_get_capabilities.stop()
def load_fixtures(self, commands=None):
self.get_config.return_value = load_fixture('ios_logging_config_ios12.cfg')
self.load_config.return_value = None
def test_ios_logging_add_host(self):
set_module_args(dict(dest='host', name='192.168.1.1'))
commands = ['logging 192.168.1.1']
self.execute_module(changed=True, commands=commands)
def test_ios_logging_host_idempotent(self):
set_module_args(dict(dest='host', name='2.3.4.5'))
commands = []
self.execute_module(changed=False, commands=commands)
def test_ios_logging_delete_non_exist_host(self):
set_module_args(dict(dest='host', name='192.168.1.1', state='absent'))
commands = []
self.execute_module(changed=False, commands=commands)
def test_ios_logging_delete_host(self):
set_module_args(dict(dest='host', name='2.3.4.5', state='absent'))
commands = ['no logging 2.3.4.5']
self.execute_module(changed=True, commands=commands)