From 3919a891c27c93f7f0b15fba96b18cbf77f4f252 Mon Sep 17 00:00:00 2001 From: Ganesh Nalawade Date: Fri, 6 Dec 2019 08:58:03 +0530 Subject: [PATCH] Fix iosxr netconf plugin get device info (#65489) * Fix iosxr netconf plugin get device info Fixes https://github.com/ansible/ansible/issues/64634 * Catch execption if the xml payload to get device info is not valid for iosxr version running on remote host. * Fix CI issue --- lib/ansible/plugins/netconf/iosxr.py | 32 +++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/lib/ansible/plugins/netconf/iosxr.py b/lib/ansible/plugins/netconf/iosxr.py index 45a76e8d45f..c80801d0e1e 100644 --- a/lib/ansible/plugins/netconf/iosxr.py +++ b/lib/ansible/plugins/netconf/iosxr.py @@ -55,22 +55,24 @@ class Netconf(NetconfBase): ]) install_filter = build_xml('install', install_meta, opcode='filter') + try: + reply = self.get(install_filter) + resp = remove_namespaces(re.sub(r'<\?xml version="1.0" encoding="UTF-8"\?>', '', reply)) + ele_boot_variable = etree_find(resp, 'boot-variable/boot-variable') + if ele_boot_variable is not None: + device_info['network_os_image'] = re.split('[:|,]', ele_boot_variable.text)[1] + ele_package_name = etree_find(reply, 'package-name') + if ele_package_name is not None: + device_info['network_os_package'] = ele_package_name.text + device_info['network_os_version'] = re.split('-', ele_package_name.text)[-1] - reply = self.get(install_filter) - ele_boot_variable = etree_find(reply, 'boot-variable/boot-variable') - if ele_boot_variable is not None: - device_info['network_os_image'] = re.split('[:|,]', ele_boot_variable.text)[1] - ele_package_name = etree_find(reply, 'package-name') - if ele_package_name is not None: - device_info['network_os_package'] = ele_package_name.text - device_info['network_os_version'] = re.split('-', ele_package_name.text)[-1] - - hostname_filter = build_xml('host-names', opcode='filter') - - reply = self.get(hostname_filter) - hostname_ele = etree_find(reply, 'host-name') - device_info['network_os_hostname'] = hostname_ele.text if hostname_ele is not None else None - + hostname_filter = build_xml('host-names', opcode='filter') + reply = self.get(hostname_filter) + resp = remove_namespaces(re.sub(r'<\?xml version="1.0" encoding="UTF-8"\?>', '', reply)) + hostname_ele = etree_find(resp.strip(), 'host-name') + device_info['network_os_hostname'] = hostname_ele.text if hostname_ele is not None else None + except Exception as exc: + self._connection.queue_message('vvvv', 'Fail to retrieve device info %s' % exc) return device_info def get_capabilities(self):