From b0e7c71716a3ea4434c139530fbbfcc73489fc16 Mon Sep 17 00:00:00 2001 From: Trishna Guha Date: Mon, 13 Nov 2017 10:47:20 +0000 Subject: [PATCH] nxos_interface TypeError fix (#32114) * nxos_inteface TypeError fix Signed-off-by: Trishna Guha * Make sure that run_commands does not list of strings for json output Signed-off-by: Trishna Guha * return default value to handle exception Signed-off-by: Trishna Guha --- lib/ansible/module_utils/nxos.py | 5 +- .../modules/network/nxos/nxos_interface.py | 124 +++++++++--------- 2 files changed, 68 insertions(+), 61 deletions(-) diff --git a/lib/ansible/module_utils/nxos.py b/lib/ansible/module_utils/nxos.py index 26bf6fc8af6..471f3226d7a 100644 --- a/lib/ansible/module_utils/nxos.py +++ b/lib/ansible/module_utils/nxos.py @@ -34,7 +34,7 @@ from ansible.module_utils._text import to_text from ansible.module_utils.basic import env_fallback, return_values from ansible.module_utils.network_common import to_list, ComplexList from ansible.module_utils.connection import exec_command -from ansible.module_utils.six import iteritems +from ansible.module_utils.six import iteritems, string_types from ansible.module_utils.urls import fetch_url _DEVICE_CONNECTION = None @@ -169,6 +169,9 @@ class Cli: except ValueError: out = to_text(out).strip() + if item['output'] == 'json' and isinstance(out, string_types): + self._module.fail_json(msg='failed to retrieve output of %s in json format' % item['command']) + responses.append(out) return responses diff --git a/lib/ansible/modules/network/nxos/nxos_interface.py b/lib/ansible/modules/network/nxos/nxos_interface.py index 7bcce1dd454..f2f00509571 100644 --- a/lib/ansible/modules/network/nxos/nxos_interface.py +++ b/lib/ansible/modules/network/nxos/nxos_interface.py @@ -275,72 +275,76 @@ def get_interface(intf, module): try: body = execute_show_command(command, module)[0] except IndexError: - body = [] + return {} if body: - interface_table = body['TABLE_interface']['ROW_interface'] - if interface_table.get('eth_mode') == 'fex-fabric': - module.fail_json(msg='nxos_interface does not support interfaces with mode "fex-fabric"') - intf_type = get_interface_type(intf) - if intf_type in ['portchannel', 'ethernet']: - if not interface_table.get('eth_mode'): - interface_table['eth_mode'] = 'layer3' + try: + interface_table = body['TABLE_interface']['ROW_interface'] + except KeyError: + return {} + if interface_table: + if interface_table.get('eth_mode') == 'fex-fabric': + module.fail_json(msg='nxos_interface does not support interfaces with mode "fex-fabric"') + intf_type = get_interface_type(intf) + if intf_type in ['portchannel', 'ethernet']: + if not interface_table.get('eth_mode'): + interface_table['eth_mode'] = 'layer3' - if intf_type == 'ethernet': - key_map.update(base_key_map) - key_map.update(mode_map) - temp_dict = apply_key_map(key_map, interface_table) - temp_dict = apply_value_map(mode_value_map, temp_dict) - interface.update(temp_dict) + if intf_type == 'ethernet': + key_map.update(base_key_map) + key_map.update(mode_map) + temp_dict = apply_key_map(key_map, interface_table) + temp_dict = apply_value_map(mode_value_map, temp_dict) + interface.update(temp_dict) - elif intf_type == 'svi': - key_map.update(svi_map) - temp_dict = apply_key_map(key_map, interface_table) - interface.update(temp_dict) - attributes = get_manual_interface_attributes(intf, module) - interface['admin_state'] = str(attributes.get('admin_state', - 'nxapibug')) - interface['description'] = str(attributes.get('description', - 'nxapi_bug')) - command = 'show run interface {0}'.format(intf) - body = execute_show_command(command, module)[0] - if 'ip forward' in body: - interface['ip_forward'] = 'enable' - else: - interface['ip_forward'] = 'disable' - if 'fabric forwarding mode anycast-gateway' in body: - interface['fabric_forwarding_anycast_gateway'] = True - else: - interface['fabric_forwarding_anycast_gateway'] = False + elif intf_type == 'svi': + key_map.update(svi_map) + temp_dict = apply_key_map(key_map, interface_table) + interface.update(temp_dict) + attributes = get_manual_interface_attributes(intf, module) + interface['admin_state'] = str(attributes.get('admin_state', + 'nxapibug')) + interface['description'] = str(attributes.get('description', + 'nxapi_bug')) + command = 'show run interface {0}'.format(intf) + body = execute_show_command(command, module)[0] + if 'ip forward' in body: + interface['ip_forward'] = 'enable' + else: + interface['ip_forward'] = 'disable' + if 'fabric forwarding mode anycast-gateway' in body: + interface['fabric_forwarding_anycast_gateway'] = True + else: + interface['fabric_forwarding_anycast_gateway'] = False - elif intf_type == 'loopback': - key_map.update(base_key_map) - key_map.pop('admin_state') - key_map.update(loop_map) - temp_dict = apply_key_map(key_map, interface_table) - if not temp_dict.get('description'): - temp_dict['description'] = "None" - interface.update(temp_dict) + elif intf_type == 'loopback': + key_map.update(base_key_map) + key_map.pop('admin_state') + key_map.update(loop_map) + temp_dict = apply_key_map(key_map, interface_table) + if not temp_dict.get('description'): + temp_dict['description'] = "None" + interface.update(temp_dict) - elif intf_type == 'management': - key_map.update(base_key_map) - temp_dict = apply_key_map(key_map, interface_table) - interface.update(temp_dict) + elif intf_type == 'management': + key_map.update(base_key_map) + temp_dict = apply_key_map(key_map, interface_table) + interface.update(temp_dict) - elif intf_type == 'portchannel': - key_map.update(base_key_map) - key_map.update(mode_map) - temp_dict = apply_key_map(key_map, interface_table) - temp_dict = apply_value_map(mode_value_map, temp_dict) - if not temp_dict.get('description'): - temp_dict['description'] = "None" - interface.update(temp_dict) + elif intf_type == 'portchannel': + key_map.update(base_key_map) + key_map.update(mode_map) + temp_dict = apply_key_map(key_map, interface_table) + temp_dict = apply_value_map(mode_value_map, temp_dict) + if not temp_dict.get('description'): + temp_dict['description'] = "None" + interface.update(temp_dict) - elif intf_type == 'nve': - key_map.update(base_key_map) - temp_dict = apply_key_map(key_map, interface_table) - if not temp_dict.get('description'): - temp_dict['description'] = "None" - interface.update(temp_dict) + elif intf_type == 'nve': + key_map.update(base_key_map) + temp_dict = apply_key_map(key_map, interface_table) + if not temp_dict.get('description'): + temp_dict['description'] = "None" + interface.update(temp_dict) return interface @@ -369,7 +373,7 @@ def get_interfaces_dict(module): try: body = execute_show_command(command, module)[0] except IndexError: - body = {} + return {} interfaces = { 'ethernet': [],