From 65b33fbe65ed9c375e1d74442897188a54403093 Mon Sep 17 00:00:00 2001 From: Victor Pavlushin Date: Tue, 22 Oct 2019 09:07:52 +0700 Subject: [PATCH 1/7] For Vlan interfaces nxos driver, the state is not correctly defined (related to json output). There are no admin_state and state fields for them. Example: { "interface": "Vlan120", "svi_admin_state": "up", "svi_line_proto": "up", "svi_mac": "002a.6ad3.0000", "svi_desc": "", "svi_ip_addr": "192.168.0.10", "svi_ip_mask": "24", "svi_mtu": "1500", "svi_bw": "1000000", "svi_delay": "10" }, { "interface": "Vlan198", "svi_admin_state": "down", "state_rsn_desc": "Administratively down", "svi_line_proto": "down", "svi_mac": "002a.6ad3.0000", "svi_ip_addr": "192.168.0.11", "svi_ip_mask": "24", "svi_mtu": "1500", "svi_bw": "1000000", "svi_delay": "10" }, --- napalm/nxos/nxos.py | 31 ++++++++++++++++--- .../normal/expected_result.json | 6 ++-- .../vlan_interface/expected_result.json | 20 ++++++++++++ .../vlan_interface/show_interface.json | 30 ++++++++++++++++++ 4 files changed, 79 insertions(+), 8 deletions(-) create mode 100644 test/nxos/mocked_data/test_get_interfaces/vlan_interface/expected_result.json create mode 100644 test/nxos/mocked_data/test_get_interfaces/vlan_interface/show_interface.json diff --git a/napalm/nxos/nxos.py b/napalm/nxos/nxos.py index 76f2daa7a..b22342bfb 100644 --- a/napalm/nxos/nxos.py +++ b/napalm/nxos/nxos.py @@ -818,17 +818,38 @@ def get_interfaces(self): for interface_details in interfaces_body: interface_name = interface_details.get("interface") - interface_mtu = interface_details.get("eth_mtu", 0) - interface_mtu = int(interface_mtu) + + if interface_details.get("eth_mtu"): + interface_mtu = int(interface_details["eth_mtu"]) + elif interface_details.get("eth_mtu"): + interface_mtu = int(interface_details["svi_mtu"]) + else: + interface_mtu = int(interface_mtu) + # Earlier version of Nexus returned a list for 'eth_bw' (observed on 7.1(0)N1(1a)) - interface_speed = interface_details.get("eth_bw", 0) + if interface_details.get("eth_bw"): + interface_speed = interface_details["eth_bw"] + elif interface_details.get("svi_bw"): + interface_speed = interface_details["svi_bw"] + else: + interface_speed = 0 if isinstance(interface_speed, list): interface_speed = interface_speed[0] - interface_speed = int(interface_speed / 1000) + interface_speed = int(int(interface_speed) / 1000) + if "admin_state" in interface_details: is_up = interface_details.get("admin_state", "") == "up" + elif "svi_admin_state" in interface_details: + is_up = interface_details.get("svi_admin_state", "") == "up" else: is_up = interface_details.get("state", "") == "up" + if interface_details.get("eth_hw_addr"): + mac_address = interface_details["eth_hw_addr"] + elif interface_details.get("svi_mac"): + mac_address = interface_details["svi_mac"] + else: + mac_address = None + interfaces[interface_name] = { "is_up": is_up, "is_enabled": (interface_details.get("state") == "up"), @@ -839,7 +860,7 @@ def get_interfaces(self): "speed": interface_speed, "mtu": interface_mtu, "mac_address": napalm.base.helpers.convert( - napalm.base.helpers.mac, interface_details.get("eth_hw_addr") + napalm.base.helpers.mac, mac_address ), } return interfaces diff --git a/test/nxos/mocked_data/test_get_interfaces/normal/expected_result.json b/test/nxos/mocked_data/test_get_interfaces/normal/expected_result.json index 78b559808..691cf62a0 100644 --- a/test/nxos/mocked_data/test_get_interfaces/normal/expected_result.json +++ b/test/nxos/mocked_data/test_get_interfaces/normal/expected_result.json @@ -265,9 +265,9 @@ "description": "", "last_flapped": -1.0, "is_up": false, - "mac_address": "", - "mtu": 0, - "speed": 0 + "mac_address": "2C:C2:60:1C:7B:94", + "mtu": 1500, + "speed": 1000 }, "Ethernet3/47": { "is_enabled": false, diff --git a/test/nxos/mocked_data/test_get_interfaces/vlan_interface/expected_result.json b/test/nxos/mocked_data/test_get_interfaces/vlan_interface/expected_result.json new file mode 100644 index 000000000..25911e3eb --- /dev/null +++ b/test/nxos/mocked_data/test_get_interfaces/vlan_interface/expected_result.json @@ -0,0 +1,20 @@ +{ + "Vlan120": { + "is_enabled": true, + "description": "", + "last_flapped": -1.0, + "is_up": true, + "mac_address": "00:2A:6A:D3:00:00", + "mtu": 1500, + "speed": 1000 + }, + "Vlan198": { + "is_enabled": false, + "description": "", + "last_flapped": -1.0, + "is_up": false, + "mac_address": "00:2A:6A:D3:00:00", + "mtu": 1500, + "speed": 1000 + } +} diff --git a/test/nxos/mocked_data/test_get_interfaces/vlan_interface/show_interface.json b/test/nxos/mocked_data/test_get_interfaces/vlan_interface/show_interface.json new file mode 100644 index 000000000..200ace9c0 --- /dev/null +++ b/test/nxos/mocked_data/test_get_interfaces/vlan_interface/show_interface.json @@ -0,0 +1,30 @@ +{ + "TABLE_interface": { + "ROW_interface": [ + { + "interface": "Vlan120", + "svi_admin_state": "up", + "svi_line_proto": "up", + "svi_mac": "002a.6ad3.0000", + "svi_desc": "", + "svi_ip_addr": "192.168.0.10", + "svi_ip_mask": "24", + "svi_mtu": "1500", + "svi_bw": "1000000", + "svi_delay": "10" + }, + { + "interface": "Vlan198", + "svi_admin_state": "down", + "state_rsn_desc": "Administratively down", + "svi_line_proto": "down", + "svi_mac": "002a.6ad3.0000", + "svi_ip_addr": "192.168.0.11", + "svi_ip_mask": "24", + "svi_mtu": "1500", + "svi_bw": "1000000", + "svi_delay": "10" + } + ] + } +} From 1c01f7b1edc480c6184df535ba316d0c7da6cc4a Mon Sep 17 00:00:00 2001 From: Victor Pavlushin Date: Tue, 22 Oct 2019 09:19:02 +0700 Subject: [PATCH 2/7] misprint --- napalm/nxos/nxos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/napalm/nxos/nxos.py b/napalm/nxos/nxos.py index b22342bfb..ee808a1e6 100644 --- a/napalm/nxos/nxos.py +++ b/napalm/nxos/nxos.py @@ -824,7 +824,7 @@ def get_interfaces(self): elif interface_details.get("eth_mtu"): interface_mtu = int(interface_details["svi_mtu"]) else: - interface_mtu = int(interface_mtu) + interface_mtu = 0 # Earlier version of Nexus returned a list for 'eth_bw' (observed on 7.1(0)N1(1a)) if interface_details.get("eth_bw"): From ff8d9b9a60cb8c59ef7a25e1654f7dc78c5b2d55 Mon Sep 17 00:00:00 2001 From: Victor Pavlushin Date: Tue, 22 Oct 2019 09:47:27 +0700 Subject: [PATCH 3/7] Because this is a virtual interface, then is_up == is_enabled, from my point of view. --- napalm/nxos/nxos.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/napalm/nxos/nxos.py b/napalm/nxos/nxos.py index ee808a1e6..a555bec5e 100644 --- a/napalm/nxos/nxos.py +++ b/napalm/nxos/nxos.py @@ -852,7 +852,8 @@ def get_interfaces(self): interfaces[interface_name] = { "is_up": is_up, - "is_enabled": (interface_details.get("state") == "up"), + "is_enabled": (interface_details.get("state") == "up" or + interface_details.get("svi_admin_state") == "up"), "description": str(interface_details.get("desc", "").strip('"')), "last_flapped": self._compute_timestamp( interface_details.get("eth_link_flapped", "") From bd3087ad06c030d3f880ee0c475490e13f396bca Mon Sep 17 00:00:00 2001 From: Victor Pavlushin Date: Tue, 22 Oct 2019 09:57:30 +0700 Subject: [PATCH 4/7] black test --- napalm/nxos/nxos.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/napalm/nxos/nxos.py b/napalm/nxos/nxos.py index a555bec5e..07a7bd3a7 100644 --- a/napalm/nxos/nxos.py +++ b/napalm/nxos/nxos.py @@ -852,8 +852,10 @@ def get_interfaces(self): interfaces[interface_name] = { "is_up": is_up, - "is_enabled": (interface_details.get("state") == "up" or - interface_details.get("svi_admin_state") == "up"), + "is_enabled": ( + interface_details.get("state") == "up" + or interface_details.get("svi_admin_state") == "up" + ), "description": str(interface_details.get("desc", "").strip('"')), "last_flapped": self._compute_timestamp( interface_details.get("eth_link_flapped", "") From 071724ff32ef522b9243550c64eb278e98af934c Mon Sep 17 00:00:00 2001 From: Victor Pavlushin Date: Tue, 22 Oct 2019 10:10:58 +0700 Subject: [PATCH 5/7] misprint --- napalm/nxos/nxos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/napalm/nxos/nxos.py b/napalm/nxos/nxos.py index 07a7bd3a7..eee54bdb9 100644 --- a/napalm/nxos/nxos.py +++ b/napalm/nxos/nxos.py @@ -821,7 +821,7 @@ def get_interfaces(self): if interface_details.get("eth_mtu"): interface_mtu = int(interface_details["eth_mtu"]) - elif interface_details.get("eth_mtu"): + elif interface_details.get("svi_mtu"): interface_mtu = int(interface_details["svi_mtu"]) else: interface_mtu = 0 From 3e306be2006174ba5184dd210a83168a5fb4a6c5 Mon Sep 17 00:00:00 2001 From: Victor Pavlushin Date: Tue, 22 Oct 2019 11:42:43 +0700 Subject: [PATCH 6/7] I have extra characters on some devices --- napalm/nxos/nxos.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/napalm/nxos/nxos.py b/napalm/nxos/nxos.py index eee54bdb9..113c72511 100644 --- a/napalm/nxos/nxos.py +++ b/napalm/nxos/nxos.py @@ -846,10 +846,11 @@ def get_interfaces(self): if interface_details.get("eth_hw_addr"): mac_address = interface_details["eth_hw_addr"] elif interface_details.get("svi_mac"): - mac_address = interface_details["svi_mac"] + mac_address = interface_details["svi_mac"].strip() else: mac_address = None - + print(interface_name) + print(mac_address) interfaces[interface_name] = { "is_up": is_up, "is_enabled": ( From b8753e1ba2a3d3ff56b79d39445326d30047d533 Mon Sep 17 00:00:00 2001 From: Victor Pavlushin Date: Tue, 22 Oct 2019 11:45:49 +0700 Subject: [PATCH 7/7] Removed debug output --- napalm/nxos/nxos.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/napalm/nxos/nxos.py b/napalm/nxos/nxos.py index 113c72511..794fe7383 100644 --- a/napalm/nxos/nxos.py +++ b/napalm/nxos/nxos.py @@ -849,8 +849,6 @@ def get_interfaces(self): mac_address = interface_details["svi_mac"].strip() else: mac_address = None - print(interface_name) - print(mac_address) interfaces[interface_name] = { "is_up": is_up, "is_enabled": (