From def0fe8f1c899a1342176dfb39b7bc64bf69c6e4 Mon Sep 17 00:00:00 2001 From: Tom Strickx Date: Wed, 24 Jan 2018 17:40:14 +0000 Subject: [PATCH 1/2] Update get_interfaces_ip to deal with unnumbered interfaces Unnumbered interfaces are listed in `show ip interface`, but have no `prefix` key. Take precautions for this, and inherit the IP of the interface it is borrowing from. Take the same precaution for ipv6. This fixes #630. --- napalm/nxos/nxos.py | 46 +++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/napalm/nxos/nxos.py b/napalm/nxos/nxos.py index 5eb8b7ba9..04fca1ecf 100644 --- a/napalm/nxos/nxos.py +++ b/napalm/nxos/nxos.py @@ -697,17 +697,36 @@ def get_interfaces_ip(self): for interface in ipv4_interf_table_vrf: interface_name = py23_compat.text_type(interface.get('intf-name', '')) - address = napalm.base.helpers.ip(interface.get('prefix')) - prefix = int(interface.get('masklen', '')) - if interface_name not in interfaces_ip.keys(): - interfaces_ip[interface_name] = {} - if 'ipv4' not in interfaces_ip[interface_name].keys(): - interfaces_ip[interface_name]['ipv4'] = {} - if address not in interfaces_ip[interface_name].get('ipv4'): - interfaces_ip[interface_name]['ipv4'][address] = {} - interfaces_ip[interface_name]['ipv4'][address].update({ - 'prefix_length': prefix - }) + addr_str = interface.get('prefix') + unnumbered = py23_compat.text_type(interface.get('unnum-intf', '')) + if addr_str: + address = napalm.base.helpers.ip(addr_str) + prefix = int(interface.get('masklen', '')) + if interface_name not in interfaces_ip.keys(): + interfaces_ip[interface_name] = {} + if 'ipv4' not in interfaces_ip[interface_name].keys(): + interfaces_ip[interface_name]['ipv4'] = {} + if address not in interfaces_ip[interface_name].get('ipv4'): + interfaces_ip[interface_name]['ipv4'][address] = {} + interfaces_ip[interface_name]['ipv4'][address].update({ + 'prefix_length': prefix + }) + elif unnumbered: + for interf in ipv4_interf_table_vrf: + interf_name = py23_compat.text_type(interf.get('intf-name', '')) + if interf_name == unnumbered: + address = napalm.base.helpers.ip(interf.get('prefix')) + prefix = int(interf.get('masklen', '')) + if interface_name not in interfaces_ip.keys(): + interfaces_ip[interface_name] = {} + if 'ipv4' not in interfaces_ip[interface_name].keys(): + interfaces_ip[interface_name]['ipv4'] = {} + if address not in interfaces_ip[interface_name].get('ipv4'): + interfaces_ip[interface_name]['ipv4'][address] = {} + interfaces_ip[interface_name]['ipv4'][address].update({ + 'prefix_length': prefix + }) + secondary_addresses = interface.get('TABLE_secondary_address', {})\ .get('ROW_secondary_address', []) if type(secondary_addresses) is dict: @@ -728,7 +747,10 @@ def get_interfaces_ip(self): for interface in ipv6_interf_table_vrf: interface_name = py23_compat.text_type(interface.get('intf-name', '')) - address = napalm.base.helpers.ip(interface.get('addr', '').split('/')[0]) + addr_str = interface.get('addr', '').split('/')[0] + if not addr_str: + continue + address = napalm.base.helpers.ip(addr_str) prefix = interface.get('prefix', '').split('/')[-1] if prefix: prefix = int(interface.get('prefix', '').split('/')[-1]) From 5481efce282a6e44fb1bccef63adca069f8f63b4 Mon Sep 17 00:00:00 2001 From: Tom Strickx Date: Wed, 24 Jan 2018 17:48:41 +0000 Subject: [PATCH 2/2] Extend tests for show_ip_interface Add an unnumbered interface to the tests. --- .../normal/expected_result.json | 7 ++++++ .../normal/show_ip_interface.json | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/test/nxos/mocked_data/test_get_interfaces_ip/normal/expected_result.json b/test/nxos/mocked_data/test_get_interfaces_ip/normal/expected_result.json index b56a3125c..ba5274b12 100644 --- a/test/nxos/mocked_data/test_get_interfaces_ip/normal/expected_result.json +++ b/test/nxos/mocked_data/test_get_interfaces_ip/normal/expected_result.json @@ -5,6 +5,13 @@ "prefix_length": 24 } } + }, + "Ethernet1/2": { + "ipv4": { + "192.168.1.100": { + "prefix_length": 24 + } + } }, "Ethernet1/7": { "ipv6": { diff --git a/test/nxos/mocked_data/test_get_interfaces_ip/normal/show_ip_interface.json b/test/nxos/mocked_data/test_get_interfaces_ip/normal/show_ip_interface.json index 11eebda7a..853d0db64 100644 --- a/test/nxos/mocked_data/test_get_interfaces_ip/normal/show_ip_interface.json +++ b/test/nxos/mocked_data/test_get_interfaces_ip/normal/show_ip_interface.json @@ -159,6 +159,30 @@ "urpf-mode": "none", "ip-ls-type": "none" } + }, { + "ROW_intf": { + "intf-name": "Ethernet1/2", + "proto-state": "up", + "link-state": "up", + "admin-state": "up", + "iod": "5", + "num-addr": "0", + "ip-disabled": "FALSE", + "num-maddr": "0", + "mtu": "1500", + "pref": "0", + "tag": "0", + "proxy-arp": "disabled", + "lcl-proxy-arp": "disabled", + "mrouting": "disabled", + "icmp-redirect": "enabled", + "dir-bcast": "disabled", + "ip-unreach": "disabled", + "port-unreach": "enabled", + "urpf-mode": "none", + "ip-ls-type": "none", + "unnum-intf": "loopback101" + } }, { "ROW_intf": { "intf-name": "Ethernet2/5",