From 18ffc8953036716516d75b7d95711a41b44688b1 Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Sun, 3 Jan 2021 11:14:06 +0100 Subject: [PATCH 01/18] get_ntp_associations: fix typo on FAIL or SUCCESS logging message --- napalm_aoscx/aoscx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index bf096f7..157d042 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -866,11 +866,11 @@ def _get_ntp_associations(self, params={}, **kwargs): associations_dict[server_name] = {} if not common_ops._response_ok(response, "GET"): - logging.warning("FAIL: Getting dictionary of resource utilization info failed with status code %d: %s" + logging.warning("FAIL: Getting dictionary of NTP associations information failed with status code %d: %s" % (response.status_code, response.text)) associations_dict = {} else: - logging.info("SUCCESS: Getting dictionary of resource utilization information succeeded") + logging.info("SUCCESS: Getting dictionary of NTP associations information succeeded") associations_dict = response.json() return associations_dict From 89f5078b3b5dae8ffd74572132dd306f24e0908f Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Tue, 29 Dec 2020 21:32:40 +0100 Subject: [PATCH 02/18] README(.md): remove get_route_to (not yet available) Signed-off-by: Alexis La Goutte --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 776d593..85c861a 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ may have not been properly tested in older versions. * get_lldp_neighbors_detail - Get LLDP Neighbor details from a device. * get_mac_address_table - Get the MAC Address table from a device. * get_ntp_servers - Gets NTP information from a network device. - * get_route_to - Shows an IP route on a device. * get_snmp_information - Get the SNMP information of a device. * is_alive - Check to see if the connection to the device is up. * ping - Execute a ping command from the device. From 9e73aa442fc0e808e3b1eea8c395675f5485af0c Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Tue, 29 Dec 2020 19:28:47 +0100 Subject: [PATCH 03/18] get_lldp_neighbors: remove extra colon on port return value Fix #7 Signed-off-by: Alexis La Goutte --- napalm_aoscx/aoscx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index bf096f7..a240af4 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -256,7 +256,7 @@ def get_lldp_neighbors(self): lldp_brief_return[interface_name].append( { 'hostname': interface_details['neighbor_info']['chassis_name'], - 'port:': interface_details['port_id'] + 'port': interface_details['port_id'] } ) From 4019d7e0a5987470e181e516567f41595c8d317f Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Tue, 29 Dec 2020 19:02:10 +0100 Subject: [PATCH 04/18] get_arp_table: missing import vrf and arp from pyaoscx Signed-off-by: Alexis La Goutte --- napalm_aoscx/aoscx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index bf096f7..ff4e393 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -49,7 +49,7 @@ # Aruba AOS-CX lib import pyaoscx -from pyaoscx import session, interface, system, common_ops, port, lldp, mac +from pyaoscx import session, interface, system, common_ops, port, lldp, mac, vrf, arp class AOSCXDriver(NetworkDriver): """NAPALM driver for Aruba AOS-CX.""" From 6d8a5f866cf9c690108395eeb4ef97de8a66a931 Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Tue, 29 Dec 2020 19:22:23 +0100 Subject: [PATCH 05/18] get_arp_table: return IP(v4) Address (and not MAC Address) for ip field... Signed-off-by: Alexis La Goutte --- napalm_aoscx/aoscx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index ff4e393..a156cbc 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -428,7 +428,7 @@ def get_arp_table(self, vrf=""): { 'interface': entry['Physical Port'], 'mac': entry['MAC Address'], - 'ip': entry['MAC Address'], + 'ip': entry['IPv4 Address'], 'age': 0.0 } ) From fd03d0b6b3c22b865196a1daa6670581852ead6f Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Sun, 3 Jan 2021 12:02:40 +0100 Subject: [PATCH 06/18] get_arp_table: need to remove '/rest/v1/system/vrfs/' from vrf name Signed-off-by: Alexis La Goutte --- napalm_aoscx/aoscx.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index a156cbc..580b4a0 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -422,7 +422,9 @@ def get_arp_table(self, vrf=""): if vrf in vrf_list: vrf_list = [vrf] for vrf_entry in vrf_list: - arp_list = pyaoscx.arp.get_arp_entries(vrf_entry, **self.session_info) + #remove '/rest/v1/system/vrfs' from vrf name... + myvrf = vrf_entry.replace('/rest/v1/system/vrfs/','') + arp_list = pyaoscx.arp.get_arp_entries(myvrf, **self.session_info) for entry in arp_list: arp_entries.append( { From d7f698865be52df705143b1a12a678e1fefa9405 Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Sun, 3 Jan 2021 12:10:23 +0100 Subject: [PATCH 07/18] get_arp_table: prepend vrf name when specify vrf for found on vrf list --- napalm_aoscx/aoscx.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index 580b4a0..fa0c529 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -419,6 +419,8 @@ def get_arp_table(self, vrf=""): """ arp_entries = [] vrf_list = pyaoscx.vrf.get_all_vrfs(**self.session_info) + #prepend vrf + vrf = '/rest/v1/system/vrfs/' + vrf if vrf in vrf_list: vrf_list = [vrf] for vrf_entry in vrf_list: From a789f59ff963ebe4641c315933bd655bd0d33bf0 Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Wed, 6 Jan 2021 20:57:11 +0100 Subject: [PATCH 08/18] get_facts: fix when there is not hostname define on the switch by default, it is possible to the switch don't have (host)name... --- napalm_aoscx/aoscx.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index bf096f7..d09d16b 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -117,6 +117,10 @@ def get_facts(self): productinfo = pyaoscx.system.get_product_info(**self.session_info) uptime_seconds = (int(systeminfo['boot_time']))/1000 + if 'hostname' not in systeminfo: + hostname = "ArubaCX" + else: + hostname = systeminfo['hostname'] fact_info = { 'uptime': uptime_seconds, @@ -124,8 +128,8 @@ def get_facts(self): 'os_version': systeminfo['software_info']['build_id'], 'serial_number': productinfo['product_info']['serial_number'], 'model': productinfo['product_info']['product_name'], - 'hostname': systeminfo['hostname'], - 'fqdn':systeminfo['hostname'], + 'hostname': hostname, + 'fqdn': hostname, 'interface_list': pyaoscx.interface.get_all_interface_names(**self.session_info) } return fact_info From 3430b72022b0e5c6d7a794c9067ac516450a025c Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Wed, 6 Jan 2021 21:37:16 +0100 Subject: [PATCH 09/18] get_environement fix KeyError: 'cpu' when use with VSF File napalm-aruba-cx/napalm_aoscx/aoscx.py, line 400, in get_environment '%usage': mm['resource_utilization']['cpu'] KeyError: 'cpu' Signed-off-by: Alexis La Goutte --- napalm_aoscx/aoscx.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index bf096f7..349b941 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -382,9 +382,14 @@ def get_environment(self): cpu_dict = {} mem_dict = {} for mm in resources_details: + if 'cpu' not in mm['resource_utilization']: + cpu = 'N/A' + else: + cpu = mm['resource_utilization']['cpu'] + new_dict = { mm['name']: { - '%usage': mm['resource_utilization']['cpu'] + '%usage': cpu } } cpu_dict.update(new_dict) From 83102db37782d61d72860505473b25bca192d79e Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Thu, 7 Jan 2021 20:44:57 +0100 Subject: [PATCH 10/18] get_environment: fix KeyError 'memory' whe use with VSF File "napalm-aruba-cx/napalm_aoscx/aoscx.py", line 398, in get_environment 'used_ram': mm['resource_utilization']['memory'] KeyError: 'memory --- napalm_aoscx/aoscx.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index 349b941..b172e1e 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -393,9 +393,15 @@ def get_environment(self): } } cpu_dict.update(new_dict) + + if 'memory' not in mm['resource_utilization']: + memory = 'N/A' + else: + memory = mm['resource_utilization']['memory'] + mem_dict = { 'available_ram': 'N/A', - 'used_ram': mm['resource_utilization']['memory'] + 'used_ram': memory } environment = { From d848dc90436e85d9c355a03b54e721e11c630db0 Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Thu, 7 Jan 2021 20:49:08 +0100 Subject: [PATCH 11/18] get_environment: like for CPU, there is multiple value for memory when use VSF one value by stack member on VSF --- napalm_aoscx/aoscx.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index b172e1e..bfc3aeb 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -399,10 +399,13 @@ def get_environment(self): else: memory = mm['resource_utilization']['memory'] - mem_dict = { - 'available_ram': 'N/A', - 'used_ram': memory + new_dict = { + mm['name']: { + 'available_ram': 'N/A', + 'used_ram': memory + } } + mem_dict.update(new_dict) environment = { 'fans': fan_dict, From 12560ca9434db2a445b75d2a2b22ca2ff2889c0e Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Thu, 7 Jan 2021 21:08:40 +0100 Subject: [PATCH 12/18] get_config: fix KeyError url File "napalm-aruba-cx/napalm_aoscx/aoscx.py", line 625, in get_config config_dict['running'] = self._get_json_configuration("running-config") File "napalm-aruba-cx/napalm_aoscx/aoscx.py", line 904, in _get_json_configuration target_url = kwargs["url"] + "fullconfigs/{}".format(checkpoint) KeyError: 'url' issue also reported on #5 Signed-off-by: Alexis La Goutte --- napalm_aoscx/aoscx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index bf096f7..a365d76 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -608,9 +608,9 @@ def get_config(self, retrieve="all", full=False): "candidate": "" } if retrieve in ["running", "all"]: - config_dict['running'] = self._get_json_configuration("running-config") + config_dict['running'] = self._get_json_configuration("running-config", **self.session_info) if retrieve in ["startup", "all"]: - config_dict['startup'] = self._get_json_configuration("startup-config") + config_dict['startup'] = self._get_json_configuration("startup-config", **self.session_info) if retrieve in ["candidate", "all"]: config_dict['candidate'] = self.candidate_config From 143024e5d07ad5b032af50e298cc07af2562889b Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Sun, 17 Jan 2021 14:03:47 +0100 Subject: [PATCH 13/18] get_facts: fix when use on Virtual CX (OVA) There is no productinfo... Signed-off-by: Alexis La Goutte --- napalm_aoscx/aoscx.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index d03f0b0..9d473f3 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -114,7 +114,16 @@ def get_facts(self): * interface_list - List of the interfaces of the device """ systeminfo = pyaoscx.system.get_system_info(**self.session_info) - productinfo = pyaoscx.system.get_product_info(**self.session_info) + if systeminfo['platform_name'] == 'X86-64': #it is Virtual CX (OVA) + #there is no product_info on Virtual CX (OVA)... + productinfo = dict( + product_info = dict ( + serial_number = "N/A", + product_name = "VirtualCX (OVA)", + ) + ) + else: + productinfo = pyaoscx.system.get_product_info(**self.session_info) uptime_seconds = (int(systeminfo['boot_time']))/1000 if 'hostname' not in systeminfo: From 9fd87ce9b2d61b4860db535fb12fc4cedda55fa5 Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Mon, 26 Apr 2021 21:51:27 +0200 Subject: [PATCH 14/18] get_interfaces_counters: remove debug print (interface name) --- napalm_aoscx/aoscx.py | 1 - 1 file changed, 1 deletion(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index d03f0b0..0c5984a 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -209,7 +209,6 @@ def get_interfaces_counters(self): interface_list = pyaoscx.interface.get_all_interface_names(**self.session_info) for line in interface_list: interface_details = pyaoscx.interface.get_interface(line, **self.session_info) - print(interface_details['name']) interface_stats_dictionary.update( { line: { From f91ef1964fbf8b35e08686916fb8e9c397ebe484 Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Thu, 29 Apr 2021 21:08:22 +0200 Subject: [PATCH 15/18] get_interfaces_counters: set intf_counter array with all counters and check if field is available on statistics --- napalm_aoscx/aoscx.py | 89 +++++++++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 25 deletions(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index 0c5984a..0051fb8 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -208,31 +208,70 @@ def get_interfaces_counters(self): interface_stats_dictionary = {} interface_list = pyaoscx.interface.get_all_interface_names(**self.session_info) for line in interface_list: - interface_details = pyaoscx.interface.get_interface(line, **self.session_info) - interface_stats_dictionary.update( - { - line: { - 'tx_errors': -1, - 'rx_errors': -1, - 'tx_discards': -1, - 'rx_discards': -1, - 'tx_octets': interface_details['statistics']['tx_bytes'], - 'rx_octets': interface_details['statistics']['rx_bytes'], - 'tx_unicast_packets': - interface_details['statistics']['if_hc_out_unicast_packets'], - 'rx_unicast_packets': - interface_details['statistics']['if_hc_in_unicast_packets'], - 'tx_multicast_packets': - interface_details['statistics']['if_out_multicast_packets'], - 'rx_multicast_packets': - interface_details['statistics']['if_in_multicast_packets'], - 'tx_broadcast_packets': - interface_details['statistics']['if_out_broadcast_packets'], - 'rx_broadcast_packets': - interface_details['statistics']['if_in_broadcast_packets'] - } - } - ) + interface_details = pyaoscx.interface.get_interface( + line, **self.session_info) + intf_counter = { + 'tx_errors': 0, + 'rx_errors': 0, + 'tx_discards': 0, + 'rx_discards': 0, + 'tx_octets': 0, + 'rx_octets': 0, + 'tx_unicast_packets': 0, + 'rx_unicast_packets': 0, + 'tx_multicast_packets': 0, + 'rx_multicast_packets': 0, + 'tx_broadcast_packets': 0, + 'rx_broadcast_packets': 0 + } + if 'tx_bytes' in interface_details['statistics']: + intf_counter['tx_octets'] = interface_details['statistics']['tx_bytes'] + + if 'rx_bytes' in interface_details['statistics']: + intf_counter['rx_octets'] = interface_details['statistics']['rx_bytes'] + + if 'if_hc_out_unicast_packets' in interface_details['statistics']: + intf_counter['tx_unicast_packets'] = interface_details['statistics']['if_hc_out_unicast_packets'] + + if 'if_hc_in_unicast_packets' in interface_details['statistics']: + intf_counter['rx_unicast_packets'] = interface_details['statistics']['if_hc_in_unicast_packets'] + + if 'if_out_multicast_packets' in interface_details['statistics']: + intf_counter['tx_multicast_packets'] = interface_details['statistics']['if_out_multicast_packets'] + + if 'if_in_multicast_packets' in interface_details['statistics']: + intf_counter['rx_multicast_packets'] = interface_details['statistics']['if_in_multicast_packets'] + + if 'if_out_broadcast_packets' in interface_details['statistics']: + intf_counter['rx_bytes'] = interface_details['statistics']['if_out_broadcast_packets'] + + if 'if_in_broadcast_packets' in interface_details['statistics']: + intf_counter['rx_broadcast_packets'] = interface_details['statistics']['if_in_broadcast_packets'] + + interface_stats_dictionary.update({ + line: intf_counter + }) + """ + 'tx_errors': -1, + 'rx_errors': -1, + 'tx_discards': -1, + 'rx_discards': -1, + 'tx_octets': interface_details['statistics']['tx_bytes'], + 'rx_octets': interface_details['statistics']['rx_bytes'], + 'tx_unicast_packets': + interface_details['statistics']['if_hc_out_unicast_packets'], + 'rx_unicast_packets': + interface_details['statistics']['if_hc_in_unicast_packets'], + 'tx_multicast_packets': + interface_details['statistics']['if_out_multicast_packets'], + 'rx_multicast_packets': + interface_details['statistics']['if_in_multicast_packets'], + 'tx_broadcast_packets': + interface_details['statistics']['if_out_broadcast_packets'], + 'rx_broadcast_packets': + interface_details['statistics']['if_in_broadcast_packets'] + """ + return interface_stats_dictionary def get_lldp_neighbors(self): From 160a4f95f9949204a8ff5d998c14d506a331688f Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Sat, 1 May 2021 15:39:46 +0200 Subject: [PATCH 16/18] get_interfaces_counters: Add RX/TX Errors and Dropped fields --- napalm_aoscx/aoscx.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index 0051fb8..ca41245 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -187,8 +187,7 @@ def get_interfaces_counters(self): """ Implementation of NAPALM method get_interfaces_counters. This gives statistic information for all interfaces that are on the switch. - Note: Not currently implementing tx_errors, rx_errors, rx_discards, and tx_discards, and - those values will return -1. + Note: rx_discards, and tx_discards are equal to rx/tx dropped counters on Aruba CX :return: Returns a dictionary of dictionaries where the first key is an interface name and the inner dictionary contains the following keys: @@ -248,6 +247,18 @@ def get_interfaces_counters(self): if 'if_in_broadcast_packets' in interface_details['statistics']: intf_counter['rx_broadcast_packets'] = interface_details['statistics']['if_in_broadcast_packets'] + if 'tx_errors' in interface_details['statistics']: + intf_counter['tx_errors'] = interface_details['statistics']['tx_errors'] + + if 'rx_errors' in interface_details['statistics']: + intf_counter['rx_errors'] = interface_details['statistics']['rx_errors'] + + if 'tx_dropped' in interface_details['statistics']: + intf_counter['tx_discards'] = interface_details['statistics']['tx_dropped'] + + if 'rx_dropped' in interface_details['statistics']: + intf_counter['rx_discards'] = interface_details['statistics']['rx_dropped'] + interface_stats_dictionary.update({ line: intf_counter }) From 4cc628506272127a58df637f70432cf487ca528c Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Sat, 1 May 2021 15:40:07 +0200 Subject: [PATCH 17/18] get_interfaces_counters: remove no longer needed comment --- napalm_aoscx/aoscx.py | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index ca41245..278b647 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -262,26 +262,6 @@ def get_interfaces_counters(self): interface_stats_dictionary.update({ line: intf_counter }) - """ - 'tx_errors': -1, - 'rx_errors': -1, - 'tx_discards': -1, - 'rx_discards': -1, - 'tx_octets': interface_details['statistics']['tx_bytes'], - 'rx_octets': interface_details['statistics']['rx_bytes'], - 'tx_unicast_packets': - interface_details['statistics']['if_hc_out_unicast_packets'], - 'rx_unicast_packets': - interface_details['statistics']['if_hc_in_unicast_packets'], - 'tx_multicast_packets': - interface_details['statistics']['if_out_multicast_packets'], - 'rx_multicast_packets': - interface_details['statistics']['if_in_multicast_packets'], - 'tx_broadcast_packets': - interface_details['statistics']['if_out_broadcast_packets'], - 'rx_broadcast_packets': - interface_details['statistics']['if_in_broadcast_packets'] - """ return interface_stats_dictionary From 7d3cc877c1fe05711215f0c3c06ac2be38068d4b Mon Sep 17 00:00:00 2001 From: Alexis La Goutte Date: Sat, 1 May 2021 15:47:32 +0200 Subject: [PATCH 18/18] get_interfaces_counters: only query interfaces statistics less data and more fast --- napalm_aoscx/aoscx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/napalm_aoscx/aoscx.py b/napalm_aoscx/aoscx.py index 278b647..44e45dc 100644 --- a/napalm_aoscx/aoscx.py +++ b/napalm_aoscx/aoscx.py @@ -208,7 +208,7 @@ def get_interfaces_counters(self): interface_list = pyaoscx.interface.get_all_interface_names(**self.session_info) for line in interface_list: interface_details = pyaoscx.interface.get_interface( - line, **self.session_info) + line, selector="statistics", **self.session_info) intf_counter = { 'tx_errors': 0, 'rx_errors': 0,