From f1b5ec1eedc42c70d5d7c1f62fe2ef1772efbd78 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Fri, 15 May 2020 12:32:46 +0300 Subject: [PATCH 01/22] [rfc1213] Interface MIB add l3 vlan interfaces Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/__init__.py | 40 ++++++++++++++++++++++++++ src/sonic_ax_impl/mibs/ietf/rfc1213.py | 17 +++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 7e199644c..1792e2501 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -241,6 +241,46 @@ def init_sync_d_interface_tables(db_conn): return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map +def init_sync_d_rif_tables(db_conn): + """ + Initializes interface maps for SyncD-connected MIB(s). + :return: tuple(if_name_map, if_id_map, oid_map, if_alias_map) + """ + + rif_port_map = port_util.get_rif_port_map(db_conn) + + logger.debug("Rif port map:\n" + pprint.pformat(rif_port_map, indent=2)) + + if not rif_port_map: + return {} + + return rif_port_map + + +def init_sync_d_vlan_tables(db_conn): + """ + Initializes interface maps for SyncD-connected MIB(s). + :return: tuple(if_name_map, if_id_map, oid_map, if_alias_map) + """ + + vlan_name_map = port_util.get_vlan_interface_oid_map(db_conn) + + logger.debug("Vlan oid map:\n" + pprint.pformat(vlan_name_map, indent=2)) + + # { OID -> sai_id } + oid_sai_map = {get_index(if_name): sai_id for if_name, sai_id in vlan_name_map.items() + # only map the interface if it's a style understood to be a SONiC interface. + if get_index(if_name) is not None} + logger.debug("OID sai map:\n" + pprint.pformat(oid_sai_map, indent=2)) + + # { OID -> if_name (SONiC) } + oid_name_map = {get_index(if_name): if_name for if_name, sai_id in vlan_name_map.items() + # only map the interface if it's a style understood to be a SONiC interface. + if get_index(if_name) is not None} + + logger.debug("OID name map:\n" + pprint.pformat(oid_name_map, indent=2)) + + return vlan_name_map, oid_sai_map, oid_name_map def init_sync_d_lag_tables(db_conn): """ diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index 30191656e..1cba9341f 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -48,7 +48,8 @@ class DbTables(int, Enum): class IfTypes(int, Enum): """ IANA ifTypes """ ethernetCsmacd = 6 - ieee8023adLag = 161 + l3ipvlan = 136 + ieee8023adLag = 161 class ArpUpdater(MIBUpdater): def __init__(self): @@ -159,6 +160,8 @@ def __init__(self): self.oid_lag_name_map = {} self.mgmt_oid_name_map = {} self.mgmt_alias_map = {} + self.vlan_oid_name_map = {} + self.vlan_name_map = {} # cache of interface counters self.if_counters = {} @@ -182,6 +185,10 @@ def reinit_data(self): self.mgmt_oid_name_map, \ self.mgmt_alias_map = mibs.init_mgmt_interface_tables(self.db_conn) + self.vlan_name_map, \ + self.vlan_oid_sai_map, \ + self.vlan_oid_name_map = mibs.init_sync_d_vlan_tables(self.db_conn) + def update_data(self): """ Update redis (caches config) @@ -197,7 +204,8 @@ def update_data(self): self.if_range = sorted(list(self.oid_sai_map.keys()) + list(self.oid_lag_name_map.keys()) + - list(self.mgmt_oid_name_map.keys())) + list(self.mgmt_oid_name_map.keys()) + + list(self.vlan_oid_name_map.keys())) self.if_range = [(i,) for i in self.if_range] def get_next(self, sub_id): @@ -241,6 +249,8 @@ def interface_description(self, sub_id): return self.oid_lag_name_map[oid] elif oid in self.mgmt_oid_name_map: return self.mgmt_alias_map[self.mgmt_oid_name_map[oid]] + elif oid in self.vlan_oid_name_map: + return self.vlan_name_map[self.vlan_oid_name_map[oid]] return self.if_alias_map[self.oid_name_map[oid]] @@ -417,6 +427,7 @@ def get_if_type(self, sub_id): ethernetCsmacd(6), -- for all ethernet-like interfaces, -- regardless of speed, as per RFC3635 + l3ipvlan(136) -- Layer 3 Virtual LAN using IP ieee8023adLag(161) -- IEEE 802.3ad Link Aggregate """ oid = self.get_oid(sub_id) @@ -425,6 +436,8 @@ def get_if_type(self, sub_id): if oid in self.oid_lag_name_map: return IfTypes.ieee8023adLag + elif oid in self.oid_vlan_name_map: + return IfTypes.l3ipvlan else: return IfTypes.ethernetCsmacd From 029a9925ed4a22c2cff2daa7626478ae426c20c5 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Fri, 15 May 2020 16:33:55 +0300 Subject: [PATCH 02/22] [rfc1213] aggregate rifcounters on top of l2 counters Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/__init__.py | 27 ++++++++++++++++++++--- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 30 +++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 1792e2501..26f7b219b 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -41,6 +41,15 @@ "tx4power": 43, } +RIF_COUNTERS_AGGR_MAP = { + b"SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": b"SAI_PORT_STAT_IF_IN_OCTETS", + b"SAI_PORT_STAT_IF_IN_UCAST_PKTS": b"SAI_ROUTER_INTERFACE_STAT_IN_PACKETS", + b"SAI_PORT_STAT_IF_IN_ERRORS": b"SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS", + b"SAI_PORT_STAT_IF_OUT_OCTETS": b"SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS", + b"SAI_PORT_STAT_IF_OUT_UCAST_PKTS": b"SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS", + b"SAI_PORT_STAT_IF_OUT_ERRORS": b"SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS" +} + # IfIndex to OID multiplier for transceiver IFINDEX_SUB_ID_MULTIPLIER = 1000 @@ -182,6 +191,15 @@ def init_mgmt_interface_tables(db_conn): return oid_name_map, if_alias_map +def get_counters_keys(db_conn): + + + db_conn.connect(COUNTERS_DB) + counters_keys = db_conn.keys(COUNTERS_DB, counter_table(b'*')) + if counters_keys: + counters_keys = [key.strip(b'COUNTERS:oid:0x') for key in counters_keys] + + return counters_keys # TODO: the function name include interface, but only return port by design. Fix the design or the name def init_sync_d_interface_tables(db_conn): @@ -241,18 +259,21 @@ def init_sync_d_interface_tables(db_conn): return if_name_map, if_alias_map, if_id_map, oid_sai_map, oid_name_map + def init_sync_d_rif_tables(db_conn): """ Initializes interface maps for SyncD-connected MIB(s). :return: tuple(if_name_map, if_id_map, oid_map, if_alias_map) """ + counters_keys = get_counters_keys(db_conn) rif_port_map = port_util.get_rif_port_map(db_conn) - - logger.debug("Rif port map:\n" + pprint.pformat(rif_port_map, indent=2)) - + if not rif_port_map: return {} + rif_port_map = {rif: port for rif, port in rif_port_map.items() + if rif in counters_keys} + logger.debug("Rif port map:\n" + pprint.pformat(rif_port_map, indent=2)) return rif_port_map diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index 1cba9341f..518fb4889 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -4,6 +4,7 @@ from bisect import bisect_right from sonic_ax_impl import mibs +from sonic_ax_impl import logger from ax_interface.mib import MIBMeta, ValueType, MIBUpdater, MIBEntry, SubtreeMIBEntry, OverlayAdpaterMIBEntry, OidMIBEntry from ax_interface.encodings import ObjectIdentifier from ax_interface.util import mac_decimals, ip2tuple_v4 @@ -162,6 +163,7 @@ def __init__(self): self.mgmt_alias_map = {} self.vlan_oid_name_map = {} self.vlan_name_map = {} + self.rif_port_map = {} # cache of interface counters self.if_counters = {} @@ -171,6 +173,7 @@ def __init__(self): self.if_id_map = {} self.oid_sai_map = {} self.oid_name_map = {} + self.rif_counters = {} def reinit_data(self): """ @@ -189,15 +192,25 @@ def reinit_data(self): self.vlan_oid_sai_map, \ self.vlan_oid_name_map = mibs.init_sync_d_vlan_tables(self.db_conn) + self.rif_port_map = mibs.init_sync_d_rif_tables(self.db_conn) + def update_data(self): """ Update redis (caches config) Pulls the table references for each interface. """ + self.if_counters = \ {sai_id: self.db_conn.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) for sai_id in self.if_id_map} + self.rif_counters = \ + {sai_id: self.db_conn.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) + for sai_id in self.rif_port_map} + + if self.rif_counters: + self.aggregate_counters() + self.lag_name_if_name_map, \ self.if_name_lag_name_map, \ self.oid_lag_name_map = mibs.init_sync_d_lag_tables(self.db_conn) @@ -274,6 +287,21 @@ def _get_counter(self, oid, table_name): mibs.logger.warning("SyncD 'COUNTERS_DB' missing attribute '{}'.".format(e)) return None + def aggregate_counters(self): + """ + For ports with l3 router interfaces l3 drops may be counted separately (RIF counters) + Get l2 and l3 (if any) counters from redis, add l3 counters to l2 counters cache according to mapping + """ + + for rif_sai_id, port_sai_id in self.rif_port_map.items(): + for rif_counter_name, port_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): + try: + self.if_counters[port_sai_id][port_counter_name] = \ + int(self.if_counters[port_sai_id][port_counter_name]) + \ + int(self.rif_counters[rif_sai_id][rif_counter_name]) + except KeyError as e: + logger.warning("Not able to aggregate counters for {} and {}\n {}".format(port_sai_id, rif_sai_id, e)) + def get_counter(self, sub_id, table_name): """ :param sub_id: The 1-based sub-identifier query. @@ -436,7 +464,7 @@ def get_if_type(self, sub_id): if oid in self.oid_lag_name_map: return IfTypes.ieee8023adLag - elif oid in self.oid_vlan_name_map: + elif oid in self.vlan_oid_name_map: return IfTypes.l3ipvlan else: return IfTypes.ethernetCsmacd From 5d3421f90cb5f58a971c645ee3b3695f39f044b6 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Thu, 28 May 2020 19:22:49 +0300 Subject: [PATCH 03/22] fix issues Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/__init__.py | 10 ++++----- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 28 +++++++++++++++++++++----- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 26f7b219b..6547b4162 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -43,11 +43,11 @@ RIF_COUNTERS_AGGR_MAP = { b"SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": b"SAI_PORT_STAT_IF_IN_OCTETS", - b"SAI_PORT_STAT_IF_IN_UCAST_PKTS": b"SAI_ROUTER_INTERFACE_STAT_IN_PACKETS", - b"SAI_PORT_STAT_IF_IN_ERRORS": b"SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS", - b"SAI_PORT_STAT_IF_OUT_OCTETS": b"SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS", - b"SAI_PORT_STAT_IF_OUT_UCAST_PKTS": b"SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS", - b"SAI_PORT_STAT_IF_OUT_ERRORS": b"SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS" + b"SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": b"SAI_PORT_STAT_IF_IN_UCAST_PKTS", + b"SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": b"SAI_PORT_STAT_IF_IN_ERRORS", + b"SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": b"SAI_PORT_STAT_IF_OUT_OCTETS", + b"SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": b"SAI_PORT_STAT_IF_OUT_UCAST_PKTS", + b"SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": b"SAI_PORT_STAT_IF_OUT_ERRORS" } # IfIndex to OID multiplier for transceiver diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index 518fb4889..6aaed9ed6 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -199,14 +199,15 @@ def update_data(self): Update redis (caches config) Pulls the table references for each interface. """ - self.if_counters = \ {sai_id: self.db_conn.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) for sai_id in self.if_id_map} + rif_sai_ids = list(self.rif_port_map.keys()) + list(self.vlan_name_map.values()) + self.rif_counters = \ {sai_id: self.db_conn.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) - for sai_id in self.rif_port_map} + for sai_id in rif_sai_ids} if self.rif_counters: self.aggregate_counters() @@ -263,7 +264,7 @@ def interface_description(self, sub_id): elif oid in self.mgmt_oid_name_map: return self.mgmt_alias_map[self.mgmt_oid_name_map[oid]] elif oid in self.vlan_oid_name_map: - return self.vlan_name_map[self.vlan_oid_name_map[oid]] + return self.vlan_oid_name_map[oid] return self.if_alias_map[self.oid_name_map[oid]] @@ -273,7 +274,13 @@ def _get_counter(self, oid, table_name): :param table_name: the redis table (either IntEnum or string literal) to query. :return: the counter for the respective sub_id/table. """ - sai_id = self.oid_sai_map[oid] + sai_id = '' + if oid in self.oid_sai_map: + sai_id = self.oid_sai_map[oid] + elif oid in self.vlan_oid_sai_map: + sai_id = self.vlan_oid_sai_map[oid] + else: + logger.warning("Unexpected oid {}".format(oid)) # Enum.name or table_name = 'name_of_the_table' _table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8') @@ -291,6 +298,8 @@ def aggregate_counters(self): """ For ports with l3 router interfaces l3 drops may be counted separately (RIF counters) Get l2 and l3 (if any) counters from redis, add l3 counters to l2 counters cache according to mapping + + For l3vlan map l3 counters to l2 counters """ for rif_sai_id, port_sai_id in self.rif_port_map.items(): @@ -300,7 +309,16 @@ def aggregate_counters(self): int(self.if_counters[port_sai_id][port_counter_name]) + \ int(self.rif_counters[rif_sai_id][rif_counter_name]) except KeyError as e: - logger.warning("Not able to aggregate counters for {} and {}\n {}".format(port_sai_id, rif_sai_id, e)) + logger.warning("Not able to aggregate counters for {}: {}\n {}".format(rif_sai_id, rif_counter_name, e)) + + for vlan_sai_id in self.vlan_name_map.values(): + for rif_counter_name, port_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): + try: + self.if_counters.setdefault(vlan_sai_id, {}) + self.if_counters[vlan_sai_id][port_counter_name] = \ + int(self.rif_counters[vlan_sai_id][rif_counter_name]) + except KeyError as e: + logger.warning("Not able to aggregate counters for {}: {}\n {}".format(vlan_sai_id, rif_counter_name, e)) def get_counter(self, sub_id, table_name): """ From f0e4048675fa0a3904fd33a87b3a94ef2eb68904 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Thu, 28 May 2020 19:25:40 +0300 Subject: [PATCH 04/22] add unittests Signed-off-by: Mykola Faryma --- tests/test_interfaces.py | 273 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 273 insertions(+) diff --git a/tests/test_interfaces.py b/tests/test_interfaces.py index 5b54dec3d..358370f9b 100644 --- a/tests/test_interfaces.py +++ b/tests/test_interfaces.py @@ -362,3 +362,276 @@ def test_in_octets_override(self): self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 1)))) self.assertEqual(value0.data, 54321) + + def test_vlan_iface(self): + """ + Test that vlan interface is present in the MIB + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 2999)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 3000)))) + self.assertEqual(value0.data, 2999) + + def test_vlan_iface_description(self): + """ + Test vlan interface description (which is simply the name) + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.OCTET_STRING) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 3000)))) + self.assertEqual(str(value0.data), 'Vlan1000') + + def test_if_type_l3vlan(self): + """ + For l3vlan the type shpuld be 136 + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 2000)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 3000)))) + self.assertEqual(value0.data, 136) + + def test_in_octets_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 21)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 21)))) + self.assertEqual(value0.data, 2148) + + def test_in_ucast_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 21)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 21)))) + self.assertEqual(value0.data, 110) + + def test_in_errors_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 21)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 21)))) + self.assertEqual(value0.data, 101) + + def test_out_octets_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 21)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 21)))) + self.assertEqual(value0.data, 4196) + + def test_out_ucast_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 21)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 21)))) + self.assertEqual(value0.data, 120) + + def test_out_errors_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 21)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 21)))) + self.assertEqual(value0.data, 102) + + def test_in_octets_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 3000)))) + self.assertEqual(value0.data, 2048) + + def test_in_ucast_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 3000)))) + self.assertEqual(value0.data, 10) + + def test_in_errors_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 3000)))) + self.assertEqual(value0.data, 1) + + def test_out_octets_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 3000)))) + self.assertEqual(value0.data, 4096) + + def test_out_ucast_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 3000)))) + self.assertEqual(value0.data, 20) + + def test_out_errors_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 3000)))) + self.assertEqual(value0.data, 2) \ No newline at end of file From 2a35053c7860789c8cf15901dc9df3db4c2aa918 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Fri, 29 May 2020 12:29:33 +0300 Subject: [PATCH 05/22] add mock data Signed-off-by: Mykola Faryma --- tests/mock_tables/asic_db.json | 4 +++ tests/mock_tables/counters_db.json | 40 +++++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/tests/mock_tables/asic_db.json b/tests/mock_tables/asic_db.json index bdec0aeb5..c9627a2f2 100644 --- a/tests/mock_tables/asic_db.json +++ b/tests/mock_tables/asic_db.json @@ -16,5 +16,9 @@ "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000008", "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:0x6000000000015": { + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x1000000000015" } } diff --git a/tests/mock_tables/counters_db.json b/tests/mock_tables/counters_db.json index 0ec1fa1c7..89a9ca6bb 100644 --- a/tests/mock_tables/counters_db.json +++ b/tests/mock_tables/counters_db.json @@ -2280,6 +2280,34 @@ "COUNTERS_LAG_NAME_MAP": { "PortChannel01": "oid:0x1000000000023" }, + "COUNTERS_RIF_NAME_MAP": { + "Ethernet20": "oid:0x6000000000015", + "Vlan1000": "oid:0x60000000005d0" + }, + "COUNTERS_RIF_TYPE_MAP": { + "oid:0x6000000000015": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x60000000005d0": "SAI_ROUTER_INTERFACE_TYPE_VLAN" + }, + "COUNTERS:oid:0x6000000000015": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "10", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "2048", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "1", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "55", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "20", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "4096", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "2", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "110" + }, + "COUNTERS:oid:0x60000000005d0": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "10", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "2048", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "1", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "55", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "20", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "4096", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "2", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "110" + }, "COUNTERS:oid:0x1000000000009": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", @@ -2997,14 +3025,14 @@ "COUNTERS:oid:0x1000000000015": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", - "SAI_PORT_STAT_IF_OUT_ERRORS": "0", + "SAI_PORT_STAT_IF_OUT_ERRORS": "100", "SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_PKTS_1519_TO_2047_OCTETS": "0", "SAI_PORT_STAT_IP_IN_RECEIVES": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_64_OCTETS": "0", "SAI_PORT_STAT_IPV6_OUT_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_4096_TO_9216_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_ERRORS": "0", + "SAI_PORT_STAT_IF_IN_ERRORS": "100", "SAI_PORT_STAT_ETHER_STATS_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_BROADCAST_PKTS": "0", "SAI_PORT_STAT_IF_IN_DISCARDS": "0", @@ -3036,7 +3064,7 @@ "SAI_PORT_STAT_ETHER_STATS_DROP_EVENTS": "0", "SAI_PORT_STAT_IPV6_OUT_MCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS": "0", - "SAI_PORT_STAT_IF_OUT_OCTETS": "0", + "SAI_PORT_STAT_IF_OUT_OCTETS": "100", "SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_9217_TO_16383_OCTETS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_1024_TO_1518_OCTETS": "0", @@ -3051,17 +3079,17 @@ "SAI_PORT_STAT_ETHER_IN_PKTS_256_TO_511_OCTETS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_2048_TO_4095_OCTETS": "0", "SAI_PORT_STAT_ETHER_STATS_OCTETS": "0", - "SAI_PORT_STAT_IF_OUT_UCAST_PKTS": "0", + "SAI_PORT_STAT_IF_OUT_UCAST_PKTS": "100", "SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_128_TO_255_OCTETS": "0", "SAI_PORT_STAT_ETHER_STATS_PKTS_64_OCTETS": "0", "SAI_PORT_STAT_IP_OUT_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "0", + "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "100", "SAI_PORT_STAT_ETHER_OUT_PKTS_9217_TO_16383_OCTETS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_2048_TO_4095_OCTETS": "0", "SAI_PORT_STAT_IP_OUT_NON_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0", - "SAI_PORT_STAT_IF_IN_OCTETS": "0", + "SAI_PORT_STAT_IF_IN_OCTETS": "100", "SAI_PORT_STAT_IPV6_IN_MCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_PKTS_65_TO_127_OCTETS": "0", "SAI_PORT_STAT_IF_OUT_QLEN": "0", From 0999b4b10fbeababf464016e5b1b4c75959a0916 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Fri, 29 May 2020 12:40:01 +0300 Subject: [PATCH 06/22] cleanup Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/__init__.py | 17 +++++++++-------- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 5 ++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 6547b4162..c8a6260bc 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -192,8 +192,10 @@ def init_mgmt_interface_tables(db_conn): return oid_name_map, if_alias_map def get_counters_keys(db_conn): - - + """ + Gets list of all the oids present in COUNTERS table + :return: list + """ db_conn.connect(COUNTERS_DB) counters_keys = db_conn.keys(COUNTERS_DB, counter_table(b'*')) if counters_keys: @@ -262,13 +264,12 @@ def init_sync_d_interface_tables(db_conn): def init_sync_d_rif_tables(db_conn): """ - Initializes interface maps for SyncD-connected MIB(s). - :return: tuple(if_name_map, if_id_map, oid_map, if_alias_map) + Initializes map of RIF SAI oids to port SAI oid. + :return: dict """ - counters_keys = get_counters_keys(db_conn) rif_port_map = port_util.get_rif_port_map(db_conn) - + if not rif_port_map: return {} rif_port_map = {rif: port for rif, port in rif_port_map.items() @@ -280,8 +281,8 @@ def init_sync_d_rif_tables(db_conn): def init_sync_d_vlan_tables(db_conn): """ - Initializes interface maps for SyncD-connected MIB(s). - :return: tuple(if_name_map, if_id_map, oid_map, if_alias_map) + Initializes vlan interface maps for SyncD-connected MIB(s). + :return: tuple(vlan_name_map, oid_sai_map, oid_name_map) """ vlan_name_map = port_util.get_vlan_interface_oid_map(db_conn) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index 6aaed9ed6..6f50fa914 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -209,7 +209,7 @@ def update_data(self): {sai_id: self.db_conn.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) for sai_id in rif_sai_ids} - if self.rif_counters: + if self.rif_counters: self.aggregate_counters() self.lag_name_if_name_map, \ @@ -301,7 +301,6 @@ def aggregate_counters(self): For l3vlan map l3 counters to l2 counters """ - for rif_sai_id, port_sai_id in self.rif_port_map.items(): for rif_counter_name, port_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): try: @@ -318,7 +317,7 @@ def aggregate_counters(self): self.if_counters[vlan_sai_id][port_counter_name] = \ int(self.rif_counters[vlan_sai_id][rif_counter_name]) except KeyError as e: - logger.warning("Not able to aggregate counters for {}: {}\n {}".format(vlan_sai_id, rif_counter_name, e)) + logger.warning("Not able to aggregate counters for {}: {}\n {}".format(vlan_sai_id, rif_counter_name, e)) def get_counter(self, sub_id, table_name): """ From cbf06e302700ab22c8d84c1ee4d80fba0d7469cc Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Mon, 1 Jun 2020 18:01:28 +0300 Subject: [PATCH 07/22] lag rif fixes Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/__init__.py | 42 +++++++++++--------------- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 29 ++++++++++++------ 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index c8a6260bc..7440a140d 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -42,12 +42,12 @@ } RIF_COUNTERS_AGGR_MAP = { - b"SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": b"SAI_PORT_STAT_IF_IN_OCTETS", - b"SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": b"SAI_PORT_STAT_IF_IN_UCAST_PKTS", - b"SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": b"SAI_PORT_STAT_IF_IN_ERRORS", - b"SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": b"SAI_PORT_STAT_IF_OUT_OCTETS", - b"SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": b"SAI_PORT_STAT_IF_OUT_UCAST_PKTS", - b"SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": b"SAI_PORT_STAT_IF_OUT_ERRORS" + b"SAI_PORT_STAT_IF_IN_OCTETS": b"SAI_ROUTER_INTERFACE_STAT_IN_OCTETS", + b"SAI_PORT_STAT_IF_IN_UCAST_PKTS": b"SAI_ROUTER_INTERFACE_STAT_IN_PACKETS", + b"SAI_PORT_STAT_IF_IN_ERRORS": b"SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS", + b"SAI_PORT_STAT_IF_OUT_OCTETS": b"SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS", + b"SAI_PORT_STAT_IF_OUT_UCAST_PKTS": b"SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS", + b"SAI_PORT_STAT_IF_OUT_ERRORS": b"SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS" } # IfIndex to OID multiplier for transceiver @@ -191,17 +191,6 @@ def init_mgmt_interface_tables(db_conn): return oid_name_map, if_alias_map -def get_counters_keys(db_conn): - """ - Gets list of all the oids present in COUNTERS table - :return: list - """ - db_conn.connect(COUNTERS_DB) - counters_keys = db_conn.keys(COUNTERS_DB, counter_table(b'*')) - if counters_keys: - counters_keys = [key.strip(b'COUNTERS:oid:0x') for key in counters_keys] - - return counters_keys # TODO: the function name include interface, but only return port by design. Fix the design or the name def init_sync_d_interface_tables(db_conn): @@ -267,16 +256,14 @@ def init_sync_d_rif_tables(db_conn): Initializes map of RIF SAI oids to port SAI oid. :return: dict """ - counters_keys = get_counters_keys(db_conn) rif_port_map = port_util.get_rif_port_map(db_conn) if not rif_port_map: return {} - rif_port_map = {rif: port for rif, port in rif_port_map.items() - if rif in counters_keys} + port_rif_map = {port: rif for rif, port in rif_port_map.items()} logger.debug("Rif port map:\n" + pprint.pformat(rif_port_map, indent=2)) - return rif_port_map + return rif_port_map, port_rif_map def init_sync_d_vlan_tables(db_conn): @@ -290,13 +277,13 @@ def init_sync_d_vlan_tables(db_conn): logger.debug("Vlan oid map:\n" + pprint.pformat(vlan_name_map, indent=2)) # { OID -> sai_id } - oid_sai_map = {get_index(if_name): sai_id for if_name, sai_id in vlan_name_map.items() + oid_sai_map = {get_index(if_name): sai_id for sai_id, if_name in vlan_name_map.items() # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None} logger.debug("OID sai map:\n" + pprint.pformat(oid_sai_map, indent=2)) # { OID -> if_name (SONiC) } - oid_name_map = {get_index(if_name): if_name for if_name, sai_id in vlan_name_map.items() + oid_name_map = {get_index(if_name): if_name for sai_id, if_name in vlan_name_map.items() # only map the interface if it's a style understood to be a SONiC interface. if get_index(if_name) is not None} @@ -318,14 +305,19 @@ def init_sync_d_lag_tables(db_conn): if_name_lag_name_map = {} # { OID -> lag_name (SONiC) } oid_lag_name_map = {} + # { lag_name (SONiC) -> lag_oid (SAI) } + lag_sai_map = {} db_conn.connect(APPL_DB) - lag_entries = db_conn.keys(APPL_DB, b"LAG_TABLE:*") if not lag_entries: return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map + db_conn.connect(COUNTERS_DB) + lag_sai_map = db_conn.get_all(COUNTERS_DB, b"COUNTERS_LAG_NAME_MAP") + lag_sai_map = {name: sai_id.lstrip(b"oid:0x") for name, sai_id in lag_sai_map.items()} + for lag_entry in lag_entries: lag_name = lag_entry[len(b"LAG_TABLE:"):] lag_members = db_conn.keys(APPL_DB, b"LAG_MEMBER_TABLE:%s:*" % lag_name) @@ -346,7 +338,7 @@ def member_name_str(val, lag_name): if idx: oid_lag_name_map[idx] = if_name - return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map + return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, lag_sai_map def init_sync_d_queue_tables(db_conn): """ diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index 6f50fa914..646fd0d91 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -159,11 +159,13 @@ def __init__(self): self.lag_name_if_name_map = {} self.if_name_lag_name_map = {} self.oid_lag_name_map = {} + self.lag_sai_map = {} self.mgmt_oid_name_map = {} self.mgmt_alias_map = {} self.vlan_oid_name_map = {} self.vlan_name_map = {} self.rif_port_map = {} + self.port_rif_map = {} # cache of interface counters self.if_counters = {} @@ -192,7 +194,8 @@ def reinit_data(self): self.vlan_oid_sai_map, \ self.vlan_oid_name_map = mibs.init_sync_d_vlan_tables(self.db_conn) - self.rif_port_map = mibs.init_sync_d_rif_tables(self.db_conn) + self.rif_port_map, \ + self.port_rif_map = mibs.init_sync_d_rif_tables(self.db_conn) def update_data(self): """ @@ -203,7 +206,7 @@ def update_data(self): {sai_id: self.db_conn.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) for sai_id in self.if_id_map} - rif_sai_ids = list(self.rif_port_map.keys()) + list(self.vlan_name_map.values()) + rif_sai_ids = list(self.rif_port_map) + list(self.vlan_name_map) self.rif_counters = \ {sai_id: self.db_conn.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) @@ -214,7 +217,8 @@ def update_data(self): self.lag_name_if_name_map, \ self.if_name_lag_name_map, \ - self.oid_lag_name_map = mibs.init_sync_d_lag_tables(self.db_conn) + self.oid_lag_name_map, \ + self.lag_sai_map = mibs.init_sync_d_lag_tables(self.db_conn) self.if_range = sorted(list(self.oid_sai_map.keys()) + list(self.oid_lag_name_map.keys()) + @@ -302,16 +306,14 @@ def aggregate_counters(self): For l3vlan map l3 counters to l2 counters """ for rif_sai_id, port_sai_id in self.rif_port_map.items(): - for rif_counter_name, port_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): - try: + if port_sai_id in self.if_id_map: + for port_counter_name, rif_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): self.if_counters[port_sai_id][port_counter_name] = \ int(self.if_counters[port_sai_id][port_counter_name]) + \ int(self.rif_counters[rif_sai_id][rif_counter_name]) - except KeyError as e: - logger.warning("Not able to aggregate counters for {}: {}\n {}".format(rif_sai_id, rif_counter_name, e)) - for vlan_sai_id in self.vlan_name_map.values(): - for rif_counter_name, port_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): + for vlan_sai_id in self.vlan_name_map: + for port_counter_name, rif_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): try: self.if_counters.setdefault(vlan_sai_id, {}) self.if_counters[vlan_sai_id][port_counter_name] = \ @@ -338,7 +340,14 @@ def get_counter(self, sub_id, table_name): counter_value = 0 for lag_member in self.lag_name_if_name_map[self.oid_lag_name_map[oid]]: counter_value += self._get_counter(mibs.get_index(lag_member), table_name) - + # import pdb; pdb.set_trace() + sai_lag_id = self.lag_sai_map[self.oid_lag_name_map[oid]] + sai_lag_rif_id = self.port_rif_map[sai_lag_id] + if sai_lag_rif_id in self.rif_port_map: + _table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8') + if _table_name in mibs.RIF_COUNTERS_AGGR_MAP: + rif_table_name = mibs.RIF_COUNTERS_AGGR_MAP[_table_name] + counter_value += int(self.rif_counters[sai_lag_rif_id][rif_table_name]) # truncate to 32-bit counter return counter_value & 0x00000000ffffffff else: From 7c969b710d83b8d53468047b85208f4d99393a3a Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Mon, 1 Jun 2020 18:01:47 +0300 Subject: [PATCH 08/22] add more unittests Signed-off-by: Mykola Faryma --- tests/mock_tables/asic_db.json | 32 +++++++++ tests/mock_tables/counters_db.json | 65 +++++++++++++++-- tests/test_interfaces.py | 110 ++++++++++++++++++++++++++++- 3 files changed, 199 insertions(+), 8 deletions(-) diff --git a/tests/mock_tables/asic_db.json b/tests/mock_tables/asic_db.json index c9627a2f2..b5d7476a0 100644 --- a/tests/mock_tables/asic_db.json +++ b/tests/mock_tables/asic_db.json @@ -20,5 +20,37 @@ "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:0x6000000000015": { "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_PORT", "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x1000000000015" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:0x60000000005d0": { + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_VLAN", + "SAI_ROUTER_INTERFACE_ATTR_VLAN_ID": "oid:0x26000000005d0" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:0x6000000000006": { + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x2000000000006" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:0x6000000000005": { + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x2000000000005" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:0x6000000000004": { + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x2000000000004" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:0x6000000000003": { + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x2000000000003" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_LAG:oid:0x2000000000006": { + "NULL": "NULL" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_LAG:oid:0x2000000000005": { + "NULL": "NULL" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_LAG:oid:0x2000000000004": { + "NULL": "NULL" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_LAG:oid:0x2000000000003": { + "NULL": "NULL" } } diff --git a/tests/mock_tables/counters_db.json b/tests/mock_tables/counters_db.json index 89a9ca6bb..2ca2800dd 100644 --- a/tests/mock_tables/counters_db.json +++ b/tests/mock_tables/counters_db.json @@ -920,14 +920,14 @@ "COUNTERS:oid:0x1000000000006": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", - "SAI_PORT_STAT_IF_OUT_ERRORS": "0", + "SAI_PORT_STAT_IF_OUT_ERRORS": "100", "SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_PKTS_1519_TO_2047_OCTETS": "0", "SAI_PORT_STAT_IP_IN_RECEIVES": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_64_OCTETS": "0", "SAI_PORT_STAT_IPV6_OUT_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_4096_TO_9216_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_ERRORS": "0", + "SAI_PORT_STAT_IF_IN_ERRORS": "100", "SAI_PORT_STAT_ETHER_STATS_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_BROADCAST_PKTS": "0", "SAI_PORT_STAT_IF_IN_DISCARDS": "0", @@ -959,7 +959,7 @@ "SAI_PORT_STAT_ETHER_STATS_DROP_EVENTS": "0", "SAI_PORT_STAT_IPV6_OUT_MCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS": "0", - "SAI_PORT_STAT_IF_OUT_OCTETS": "0", + "SAI_PORT_STAT_IF_OUT_OCTETS": "100", "SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_9217_TO_16383_OCTETS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_1024_TO_1518_OCTETS": "0", @@ -974,17 +974,17 @@ "SAI_PORT_STAT_ETHER_IN_PKTS_256_TO_511_OCTETS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_2048_TO_4095_OCTETS": "0", "SAI_PORT_STAT_ETHER_STATS_OCTETS": "0", - "SAI_PORT_STAT_IF_OUT_UCAST_PKTS": "0", + "SAI_PORT_STAT_IF_OUT_UCAST_PKTS": "100", "SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_128_TO_255_OCTETS": "0", "SAI_PORT_STAT_ETHER_STATS_PKTS_64_OCTETS": "0", "SAI_PORT_STAT_IP_OUT_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "0", + "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "100", "SAI_PORT_STAT_ETHER_OUT_PKTS_9217_TO_16383_OCTETS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_2048_TO_4095_OCTETS": "0", "SAI_PORT_STAT_IP_OUT_NON_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0", - "SAI_PORT_STAT_IF_IN_OCTETS": "0", + "SAI_PORT_STAT_IF_IN_OCTETS": "100", "SAI_PORT_STAT_IPV6_IN_MCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_PKTS_65_TO_127_OCTETS": "0", "SAI_PORT_STAT_IF_OUT_QLEN": "0", @@ -2278,14 +2278,25 @@ "Ethernet68": "oid:0x1000000000020" }, "COUNTERS_LAG_NAME_MAP": { - "PortChannel01": "oid:0x1000000000023" + "PortChannel01": "oid:0x2000000000006", + "PortChannel02": "oid:0x2000000000005", + "PortChannel03": "oid:0x2000000000004", + "PortChannel04": "oid:0x2000000000003" }, "COUNTERS_RIF_NAME_MAP": { "Ethernet20": "oid:0x6000000000015", + "PortChannel01": "oid:0x6000000000006", + "PortChannel02": "oid:0x6000000000005", + "PortChannel03": "oid:0x6000000000004", + "PortChannel04": "oid:0x6000000000003", "Vlan1000": "oid:0x60000000005d0" }, "COUNTERS_RIF_TYPE_MAP": { "oid:0x6000000000015": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x6000000000006": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x6000000000005": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x6000000000004": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x6000000000003": "SAI_ROUTER_INTERFACE_TYPE_PORT", "oid:0x60000000005d0": "SAI_ROUTER_INTERFACE_TYPE_VLAN" }, "COUNTERS:oid:0x6000000000015": { @@ -2308,6 +2319,46 @@ "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "2", "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "110" }, + "COUNTERS:oid:0x6000000000006": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "6", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "116", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "6", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "226", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "12", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "212", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "6", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "336" + }, + "COUNTERS:oid:0x6000000000005": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "0", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "0" + }, + "COUNTERS:oid:0x6000000000004": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "0", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "0" + }, + "COUNTERS:oid:0x6000000000003": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "0", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "0", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "0" + }, "COUNTERS:oid:0x1000000000009": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", diff --git a/tests/test_interfaces.py b/tests/test_interfaces.py index 358370f9b..1a08d3c10 100644 --- a/tests/test_interfaces.py +++ b/tests/test_interfaces.py @@ -634,4 +634,112 @@ def test_out_errors_vlan(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 3000)))) - self.assertEqual(value0.data, 2) \ No newline at end of file + self.assertEqual(value0.data, 2) + + def test_in_octets_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 1001)))) + self.assertEqual(value0.data, 216) + + def test_in_ucast_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 1001)))) + self.assertEqual(value0.data, 106) + + def test_in_errors_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 1001)))) + self.assertEqual(value0.data, 106) + + def test_out_octets_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 1001)))) + self.assertEqual(value0.data, 312) + + def test_out_ucast_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 1001)))) + self.assertEqual(value0.data, 112) + + def test_out_errors_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 1001)))) + self.assertEqual(value0.data, 106) \ No newline at end of file From b5c46323cbf4e901d52325bfc98a884b50692cff Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Mon, 1 Jun 2020 18:32:49 +0300 Subject: [PATCH 09/22] update test_mibs.py Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/ietf/rfc2863.py | 2 +- src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py | 2 +- tests/test_mibs.py | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc2863.py b/src/sonic_ax_impl/mibs/ietf/rfc2863.py index 0da476455..cffb30ced 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc2863.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc2863.py @@ -78,7 +78,7 @@ def reinit_data(self): self.lag_name_if_name_map, \ self.if_name_lag_name_map, \ - self.oid_lag_name_map = mibs.init_sync_d_lag_tables(self.db_conn) + self.oid_lag_name_map, _ = mibs.init_sync_d_lag_tables(self.db_conn) self.mgmt_oid_name_map, \ self.mgmt_alias_map = mibs.init_mgmt_interface_tables(self.db_conn) diff --git a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py index d42f60225..fb11c2db5 100644 --- a/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py +++ b/src/sonic_ax_impl/mibs/vendor/cisco/ciscoPfcExtMIB.py @@ -50,7 +50,7 @@ def update_data(self): self.lag_name_if_name_map, \ self.if_name_lag_name_map, \ - self.oid_lag_name_map = mibs.init_sync_d_lag_tables(self.db_conn) + self.oid_lag_name_map, _ = mibs.init_sync_d_lag_tables(self.db_conn) self.if_range = sorted(list(self.oid_sai_map.keys()) + list(self.oid_lag_name_map.keys())) self.if_range = [(i,) for i in self.if_range] diff --git a/tests/test_mibs.py b/tests/test_mibs.py index 9f77032ad..0056debee 100644 --- a/tests/test_mibs.py +++ b/tests/test_mibs.py @@ -19,7 +19,8 @@ def test_init_sync_d_lag_tables(self): lag_name_if_name_map, \ if_name_lag_name_map, \ - oid_lag_name_map = mibs.init_sync_d_lag_tables(db_conn) + oid_lag_name_map, \ + lag_sai_map = mibs.init_sync_d_lag_tables(db_conn) self.assertTrue(b"PortChannel04" in lag_name_if_name_map) self.assertTrue(lag_name_if_name_map[b"PortChannel04"] == [b"Ethernet124"]) @@ -28,3 +29,4 @@ def test_init_sync_d_lag_tables(self): self.assertTrue(b"PortChannel_Temp" in lag_name_if_name_map) self.assertTrue(lag_name_if_name_map[b"PortChannel_Temp"] == []) + self.assertTrue(lag_sai_map[b"PortChannel01"] == b"2000000000006") From 167ece702c0d1aef4dfafeafd59a76306706a0a3 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Sat, 6 Jun 2020 17:48:11 +0300 Subject: [PATCH 10/22] fix comments Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index 7770c23c7..60ea74448 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -344,13 +344,12 @@ def get_counter(self, sub_id, table_name): counter_value = 0 for lag_member in self.lag_name_if_name_map[self.oid_lag_name_map[oid]]: counter_value += self._get_counter(mibs.get_index(lag_member), table_name) - # import pdb; pdb.set_trace() sai_lag_id = self.lag_sai_map[self.oid_lag_name_map[oid]] sai_lag_rif_id = self.port_rif_map[sai_lag_id] if sai_lag_rif_id in self.rif_port_map: - _table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8') - if _table_name in mibs.RIF_COUNTERS_AGGR_MAP: - rif_table_name = mibs.RIF_COUNTERS_AGGR_MAP[_table_name] + table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8') + if table_name in mibs.RIF_COUNTERS_AGGR_MAP: + rif_table_name = mibs.RIF_COUNTERS_AGGR_MAP[table_name] counter_value += int(self.rif_counters[sai_lag_rif_id][rif_table_name]) # truncate to 32-bit counter return counter_value & 0x00000000ffffffff From 91248333eec39d64ff561c19ec68fee45cd6e7e6 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Sat, 6 Jun 2020 18:03:21 +0300 Subject: [PATCH 11/22] update namespace/test_mibs.py unittest Signed-off-by: Mykola Faryma --- tests/namespace/test_mibs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/namespace/test_mibs.py b/tests/namespace/test_mibs.py index b461d09ed..8b87ac533 100644 --- a/tests/namespace/test_mibs.py +++ b/tests/namespace/test_mibs.py @@ -20,7 +20,8 @@ def test_init_namespace_sync_d_lag_tables(self): lag_name_if_name_map, \ if_name_lag_name_map, \ - oid_lag_name_map = Namespace.init_namespace_sync_d_lag_tables(dbs) + oid_lag_name_map, \ + lag_sai_map = Namespace.init_namespace_sync_d_lag_tables(dbs) #PortChannel in asic0 Namespace self.assertTrue(b"PortChannel01" in lag_name_if_name_map) self.assertTrue(b"Ethernet-BP0" in lag_name_if_name_map[b"PortChannel01"]) @@ -32,6 +33,7 @@ def test_init_namespace_sync_d_lag_tables(self): self.assertTrue(b"PortChannel_Temp" in lag_name_if_name_map) self.assertTrue(lag_name_if_name_map[b"PortChannel_Temp"] == []) + self.assertTrue(lag_sai_map[b"PortChannel01"] == b"2000000000006") @classmethod def tearDownClass(cls): From ed9409f44c84fa862cc4b16046f1a01ffb07499b Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Wed, 10 Jun 2020 19:09:22 +0300 Subject: [PATCH 12/22] [rfc1213] add vlan interface admin_status Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/__init__.py | 8 ++++++++ src/sonic_ax_impl/mibs/ietf/rfc1213.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 003f5f058..7b04d20ba 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -122,6 +122,14 @@ def if_entry_table(if_name): return b'PORT_TABLE:' + if_name +def vlan_entry_table(if_name): + """ + :param if_name: given interface to cast. + :return: VLAN_TABLE key. + """ + return b'VLAN_TABLE:' + if_name + + def lag_entry_table(lag_name): """ :param lag_name: given lag to cast. diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index 60ea74448..b19749884 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -380,6 +380,8 @@ def _get_if_entry(self, sub_id): elif oid in self.mgmt_oid_name_map: if_table = mibs.mgmt_if_entry_table(self.mgmt_oid_name_map[oid]) db = mibs.CONFIG_DB + elif oid in self.vlan_oid_name_map: + if_table = mibs.vlan_entry_table(self.vlan_oid_name_map[oid]) elif oid in self.oid_name_map: if_table = mibs.if_entry_table(self.oid_name_map[oid]) else: From b141e510a3e5b011620826a645ab258a0d8e3824 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Tue, 16 Jun 2020 14:29:32 +0300 Subject: [PATCH 13/22] only aggregate errors Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/__init__.py | 34 ++++++++++++++++++++++++++ src/sonic_ax_impl/mibs/ietf/rfc1213.py | 14 +++++------ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 7b04d20ba..58bc72f80 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -52,6 +52,11 @@ b"SAI_PORT_STAT_IF_OUT_ERRORS": b"SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS" } +RIF_DROPS_AGGR_MAP = { + b"SAI_PORT_STAT_IF_IN_ERRORS": b"SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS", + b"SAI_PORT_STAT_IF_OUT_ERRORS": b"SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS" +} + # IfIndex to OID multiplier for transceiver IFINDEX_SUB_ID_MULTIPLIER = 1000 @@ -617,6 +622,35 @@ def init_namespace_sync_d_lag_tables(dbs): return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, lag_sai_map + @staticmethod + def init_namespace_sync_d_rif_tables(dbs): + rif_port_map = {} + port_rif_map = {} + + for db_conn in Namespace.get_non_host_dbs(dbs): + rif_port_map_ns, \ + port_rif_map_ns = init_sync_d_rif_tables(db_conn) + rif_port_map.update(rif_port_map_ns) + port_rif_map.update(port_rif_map_ns) + + return rif_port_map, port_rif_map + + @staticmethod + def init_namespace_sync_d_vlan_tables(dbs): + vlan_name_map = {} + oid_sai_map = {} + oid_name_map = {} + + for db_conn in Namespace.get_non_host_dbs(dbs): + vlan_name_map_ns, \ + oid_sai_map_ns, \ + oid_name_map_ns = init_sync_d_vlan_tables(db_conn) + vlan_name_map.update(vlan_name_map_ns) + oid_sai_map.update(oid_sai_map_ns) + oid_name_map.update(oid_name_map_ns) + + return vlan_name_map, oid_sai_map, oid_name_map + @staticmethod def init_namespace_sync_d_queue_tables(dbs): port_queues_map = {} diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index b19749884..6333b966e 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -196,10 +196,10 @@ def reinit_data(self): self.vlan_name_map, \ self.vlan_oid_sai_map, \ - self.vlan_oid_name_map = mibs.init_sync_d_vlan_tables(self.db_conn) + self.vlan_oid_name_map = Namespace.init_namespace_sync_d_vlan_tables(self.db_conn) self.rif_port_map, \ - self.port_rif_map = mibs.init_sync_d_rif_tables(self.db_conn) + self.port_rif_map = Namespace.init_namespace_sync_d_rif_tables(self.db_conn) def update_data(self): """ @@ -213,7 +213,7 @@ def update_data(self): rif_sai_ids = list(self.rif_port_map) + list(self.vlan_name_map) self.rif_counters = \ - {sai_id: self.db_conn.get_all(mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) + {sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) for sai_id in rif_sai_ids} if self.rif_counters: @@ -305,13 +305,13 @@ def _get_counter(self, oid, table_name): def aggregate_counters(self): """ For ports with l3 router interfaces l3 drops may be counted separately (RIF counters) - Get l2 and l3 (if any) counters from redis, add l3 counters to l2 counters cache according to mapping + add l3 drops to l2 drop counters cache according to mapping For l3vlan map l3 counters to l2 counters """ for rif_sai_id, port_sai_id in self.rif_port_map.items(): if port_sai_id in self.if_id_map: - for port_counter_name, rif_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): + for port_counter_name, rif_counter_name in mibs.RIF_DROPS_AGGR_MAP.items(): self.if_counters[port_sai_id][port_counter_name] = \ int(self.if_counters[port_sai_id][port_counter_name]) + \ int(self.rif_counters[rif_sai_id][rif_counter_name]) @@ -348,8 +348,8 @@ def get_counter(self, sub_id, table_name): sai_lag_rif_id = self.port_rif_map[sai_lag_id] if sai_lag_rif_id in self.rif_port_map: table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8') - if table_name in mibs.RIF_COUNTERS_AGGR_MAP: - rif_table_name = mibs.RIF_COUNTERS_AGGR_MAP[table_name] + if table_name in mibs.RIF_DROPS_AGGR_MAP: + rif_table_name = mibs.RIF_DROPS_AGGR_MAP[table_name] counter_value += int(self.rif_counters[sai_lag_rif_id][rif_table_name]) # truncate to 32-bit counter return counter_value & 0x00000000ffffffff From 80935af125bc188bd7b052616ce68d3034313d4a Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Tue, 16 Jun 2020 14:30:06 +0300 Subject: [PATCH 14/22] add vlan subinterface unitttests Signed-off-by: Mykola Faryma --- tests/mock_tables/asic_db.json | 10 +++ tests/mock_tables/counters_db.json | 24 ++++++ tests/test_interfaces.py | 124 +++++++++++++++++++++++++++-- 3 files changed, 150 insertions(+), 8 deletions(-) diff --git a/tests/mock_tables/asic_db.json b/tests/mock_tables/asic_db.json index b5d7476a0..f79f5fe01 100644 --- a/tests/mock_tables/asic_db.json +++ b/tests/mock_tables/asic_db.json @@ -41,6 +41,16 @@ "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_PORT", "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x2000000000003" }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x6000000001abc": { + "SAI_ROUTER_INTERFACE_ATTR_OUTER_VLAN_ID": "101", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x1000000000017", + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_SUB_PORT" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x6000000001abd": { + "SAI_ROUTER_INTERFACE_ATTR_OUTER_VLAN_ID": "102", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x1000000000017", + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_SUB_PORT" + }, "ASIC_STATE:SAI_OBJECT_TYPE_LAG:oid:0x2000000000006": { "NULL": "NULL" }, diff --git a/tests/mock_tables/counters_db.json b/tests/mock_tables/counters_db.json index 2ca2800dd..5003e4f12 100644 --- a/tests/mock_tables/counters_db.json +++ b/tests/mock_tables/counters_db.json @@ -2285,6 +2285,8 @@ }, "COUNTERS_RIF_NAME_MAP": { "Ethernet20": "oid:0x6000000000015", + "Ethernet8.101": "oid:0x6000000001abc", + "Ethernet8.102": "oid:0x6000000001abd", "PortChannel01": "oid:0x6000000000006", "PortChannel02": "oid:0x6000000000005", "PortChannel03": "oid:0x6000000000004", @@ -2293,6 +2295,8 @@ }, "COUNTERS_RIF_TYPE_MAP": { "oid:0x6000000000015": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x6000000001abc": "SAI_ROUTER_INTERFACE_TYPE_SUB_PORT", + "oid:0x6000000001abd": "SAI_ROUTER_INTERFACE_TYPE_SUB_PORT", "oid:0x6000000000006": "SAI_ROUTER_INTERFACE_TYPE_PORT", "oid:0x6000000000005": "SAI_ROUTER_INTERFACE_TYPE_PORT", "oid:0x6000000000004": "SAI_ROUTER_INTERFACE_TYPE_PORT", @@ -2349,6 +2353,26 @@ "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "0", "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "0" }, + "COUNTERS:oid:0x6000000001abc": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "101", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "101", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "101", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "101", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "101", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "101", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "101", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "101" + }, + "COUNTERS:oid:0x6000000001abd": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "102", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "102", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "102", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "102", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "102", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "102", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "102", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "102" + }, "COUNTERS:oid:0x6000000000003": { "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "0", "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "0", diff --git a/tests/test_interfaces.py b/tests/test_interfaces.py index 6159345d5..3e357fb3f 100644 --- a/tests/test_interfaces.py +++ b/tests/test_interfaces.py @@ -439,7 +439,7 @@ def test_in_octets_rif(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 21)))) - self.assertEqual(value0.data, 2148) + self.assertEqual(value0.data, 100) def test_in_ucast_rif(self): """ @@ -457,7 +457,7 @@ def test_in_ucast_rif(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 21)))) - self.assertEqual(value0.data, 110) + self.assertEqual(value0.data, 100) def test_in_errors_rif(self): """ @@ -493,7 +493,7 @@ def test_out_octets_rif(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 21)))) - self.assertEqual(value0.data, 4196) + self.assertEqual(value0.data, 100) def test_out_ucast_rif(self): """ @@ -511,7 +511,7 @@ def test_out_ucast_rif(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 21)))) - self.assertEqual(value0.data, 120) + self.assertEqual(value0.data, 100) def test_out_errors_rif(self): """ @@ -639,6 +639,114 @@ def test_out_errors_vlan(self): self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 3000)))) self.assertEqual(value0.data, 2) + def test_in_octets_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 9)))) + self.assertEqual(value0.data, 0) + + def test_in_ucast_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 9)))) + self.assertEqual(value0.data, 0) + + def test_in_errors_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 9)))) + self.assertEqual(value0.data, 203) + + def test_out_octets_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 9)))) + self.assertEqual(value0.data, 0) + + def test_out_ucast_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 9)))) + self.assertEqual(value0.data, 0) + + def test_out_errors_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 9)))) + self.assertEqual(value0.data, 203) + def test_in_octets_portchannel(self): """ For a l3 portchannel interface value is accumulated on members plus added Rif counters @@ -655,7 +763,7 @@ def test_in_octets_portchannel(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 1001)))) - self.assertEqual(value0.data, 216) + self.assertEqual(value0.data, 100) def test_in_ucast_portchannel(self): """ @@ -673,7 +781,7 @@ def test_in_ucast_portchannel(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 1001)))) - self.assertEqual(value0.data, 106) + self.assertEqual(value0.data, 100) def test_in_errors_portchannel(self): """ @@ -709,7 +817,7 @@ def test_out_octets_portchannel(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 1001)))) - self.assertEqual(value0.data, 312) + self.assertEqual(value0.data, 100) def test_out_ucast_portchannel(self): """ @@ -727,7 +835,7 @@ def test_out_ucast_portchannel(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 1001)))) - self.assertEqual(value0.data, 112) + self.assertEqual(value0.data, 100) def test_out_errors_portchannel(self): """ From 89616da40f9eba5097290b5924655711ce79cd49 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Mon, 22 Jun 2020 21:17:19 +0300 Subject: [PATCH 15/22] fix init_sync_d_lag Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 58bc72f80..32dbb76dc 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -329,7 +329,7 @@ def init_sync_d_lag_tables(db_conn): lag_entries = db_conn.keys(APPL_DB, b"LAG_TABLE:*") if not lag_entries: - return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map + return lag_name_if_name_map, if_name_lag_name_map, oid_lag_name_map, lag_sai_map db_conn.connect(COUNTERS_DB) lag_sai_map = db_conn.get_all(COUNTERS_DB, b"COUNTERS_LAG_NAME_MAP") From 0116f85872595b8e82f480fae09f5105d4099681 Mon Sep 17 00:00:00 2001 From: Mykola Faryma Date: Wed, 24 Jun 2020 19:07:33 +0300 Subject: [PATCH 16/22] update namespace mib test Signed-off-by: Mykola Faryma --- tests/namespace/test_mibs.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/namespace/test_mibs.py b/tests/namespace/test_mibs.py index 8b87ac533..bf94fb4d6 100644 --- a/tests/namespace/test_mibs.py +++ b/tests/namespace/test_mibs.py @@ -33,7 +33,6 @@ def test_init_namespace_sync_d_lag_tables(self): self.assertTrue(b"PortChannel_Temp" in lag_name_if_name_map) self.assertTrue(lag_name_if_name_map[b"PortChannel_Temp"] == []) - self.assertTrue(lag_sai_map[b"PortChannel01"] == b"2000000000006") @classmethod def tearDownClass(cls): From 5d2110dc46969466a0e89f7a21d040688196d180 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 24 Jun 2020 17:34:38 +0000 Subject: [PATCH 17/22] add namespace mock table data Signed-off-by: Mykola Faryma --- src/sonic_ax_impl/mibs/__init__.py | 2 +- tests/mock_tables/asic0/counters_db.json | 6 ++++++ tests/mock_tables/asic1/counters_db.json | 6 ++++++ tests/mock_tables/asic2/counters_db.json | 6 ++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 32dbb76dc..b5ec9eb7b 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -275,7 +275,7 @@ def init_sync_d_rif_tables(db_conn): rif_port_map = port_util.get_rif_port_map(db_conn) if not rif_port_map: - return {} + return {}, {} port_rif_map = {port: rif for rif, port in rif_port_map.items()} logger.debug("Rif port map:\n" + pprint.pformat(rif_port_map, indent=2)) diff --git a/tests/mock_tables/asic0/counters_db.json b/tests/mock_tables/asic0/counters_db.json index 282a4b952..c54b92074 100644 --- a/tests/mock_tables/asic0/counters_db.json +++ b/tests/mock_tables/asic0/counters_db.json @@ -314,6 +314,12 @@ "COUNTERS_LAG_NAME_MAP": { "PortChannel01": "oid:0x1000000000007" }, + "COUNTERS_RIF_NAME_MAP": { + "PortChannel01": "oid:0x6000000000006" + }, + "COUNTERS_RIF_TYPE_MAP": { + "oid:0x6000000000006": "SAI_ROUTER_INTERFACE_TYPE_PORT" + }, "COUNTERS:oid:0x1000000000004": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", diff --git a/tests/mock_tables/asic1/counters_db.json b/tests/mock_tables/asic1/counters_db.json index cd56a10fe..3a36d0850 100644 --- a/tests/mock_tables/asic1/counters_db.json +++ b/tests/mock_tables/asic1/counters_db.json @@ -110,6 +110,12 @@ "COUNTERS_LAG_NAME_MAP": { "PortChannel02": "oid:0x1000000000012" }, + "COUNTERS_RIF_TYPE_MAP": { + "oid:0x6000000000012": "SAI_ROUTER_INTERFACE_TYPE_PORT" + }, + "COUNTERS_RIF_NAME_MAP": { + "PortChannel02": "oid:0x6000000000012" + }, "COUNTERS:oid:0x1000000000009": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", diff --git a/tests/mock_tables/asic2/counters_db.json b/tests/mock_tables/asic2/counters_db.json index 20febebe6..06eb3b2cb 100644 --- a/tests/mock_tables/asic2/counters_db.json +++ b/tests/mock_tables/asic2/counters_db.json @@ -621,6 +621,12 @@ "PortChannel03": "oid:0x1000000000017", "PortChannel04": "oid:0x1000000000018" }, + "COUNTERS_RIF_NAME_MAP": { + "PortChannel03": "oid:0x6000000000017" + }, + "COUNTERS_RIF_TYPE_MAP": { + "oid:0x6000000000017": "SAI_ROUTER_INTERFACE_TYPE_PORT" + }, "COUNTERS_QUEUE_NAME_MAP": { "Ethernet-BP16:0": "oid:0x15000000000330", "Ethernet-BP16:1": "oid:0x15000000000331", From 76fb56594f60a8a4f887cdd4b43e3087189d1ba1 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak Date: Fri, 9 Oct 2020 13:52:40 +0300 Subject: [PATCH 18/22] Fix exception when RIF counters are not available. Fix for the following error in syslog: Oct 9 10:07:21.427210 mts-sonic-dut ERR snmp#snmp-subagent [ax_interface] ERROR: MIBUpdater.start() caught an unexpected exception during update_data()#012Traceback (most recent call last):#012 File "/usr/local/lib/python3.7/dist-packa ges/ax_interface/mib.py", line 43, in start#012 self.update_data()#012 File "/usr/local/lib/python3.7/dist-packages/sonic_ax_impl/mibs/ietf/rfc1213.py", line 245, in update_data#012 self.update_rif_counters()#012 File "/usr/local /lib/python3.7/dist-packages/sonic_ax_impl/mibs/ietf/rfc1213.py", line 271, in update_rif_counters#012 for sai_id in rif_sai_ids}#012 File "/usr/local/lib/python3.7/dist-packages/sonic_ax_impl/mibs/ietf/rfc1213.py", line 271, in #012 for sai_id in rif_sai_ids}#012 File "/usr/local/lib/python3.7/dist-packages/sonic_ax_impl/mibs/__init__.py", line 627, in dbs_get_all#012 ns_result = db_conn.get_all(db_name, _hash, *args, **tmp_kwargs)#012 File "/usr/ local/lib/python3.7/dist-packages/swsssdk/dbconnector.py", line 295, in get_all#012 return self.dbintf.get_all(db_name, _hash, *args, **kwargs)#012 File "/usr/local/lib/python3.7/dist-packages/swsssdk/interface.py", line 38, in wrapp ed#012 ret_data = f(inst, db_name, *args, **kwargs)#012 File "/usr/local/lib/python3.7/dist-packages/swsssdk/interface.py", line 314, in get_all#012 raise UnavailableDataError(message, _hash)#012swsssdk.exceptions.UnavailableDataE rror: Key 'b'COUNTERS:oid:0x60000000005d3'' unavailable in database 'COUNTERS_DB' Signed-off-by: Stepan Blyshchak --- src/sonic_ax_impl/mibs/__init__.py | 1 - src/sonic_ax_impl/mibs/ietf/rfc1213.py | 36 ++++++++------------------ 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index dba6ae0a5..b5cc100dd 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -6,7 +6,6 @@ from swsssdk import SonicDBConfig from swsssdk import port_util from swsssdk.port_util import get_index, get_index_from_str -from swsssdk import exceptions from ax_interface.mib import MIBUpdater from ax_interface.util import oid2tuple from sonic_ax_impl import logger diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index eb1ac7c7c..016afe5e3 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -5,7 +5,7 @@ from sonic_ax_impl import mibs from sonic_ax_impl import logger -from sonic_ax_impl.mibs import Namespace, exceptions +from sonic_ax_impl.mibs import Namespace from ax_interface.mib import MIBMeta, ValueType, MIBUpdater, MIBEntry, SubtreeMIBEntry, OverlayAdpaterMIBEntry, OidMIBEntry from ax_interface.encodings import ObjectIdentifier from ax_interface.util import mac_decimals, ip2tuple_v4 @@ -244,8 +244,7 @@ def update_data(self): self.update_if_counters() self.update_rif_counters() - if self.rif_counters: - self.aggregate_counters() + self.aggregate_counters() self.lag_name_if_name_map, \ self.if_name_lag_name_map, \ @@ -267,15 +266,9 @@ def update_if_counters(self): def update_rif_counters(self): rif_sai_ids = list(self.rif_port_map) + list(self.vlan_name_map) - try: - self.rif_counters = \ - {sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=True) - for sai_id in rif_sai_ids} - except exceptions.UnavailableDataError: - # Failed to get all or some RIF counters, assuming RIF counters - # are either not populated in DB or not supported by platform. - # Leaving self.rif_counters empty. - pass + self.rif_counters = \ + {sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=False) + for sai_id in rif_sai_ids} def get_next(self, sub_id): """ @@ -329,13 +322,6 @@ def _get_counter(self, oid, table_name): :param table_name: the redis table (either IntEnum or string literal) to query. :return: the counter for the respective sub_id/table. """ - sai_id = '' - if oid in self.oid_name_map: - sai_id = self.if_name_map[self.oid_name_map[oid]] - elif oid in self.vlan_oid_sai_map: - sai_id = self.vlan_oid_sai_map[oid] - else: - logger.warning("Unexpected oid {}".format(oid)) # Enum.name or table_name = 'name_of_the_table' _table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8') @@ -366,13 +352,13 @@ def aggregate_counters(self): for vlan_sai_id, vlan_name in self.vlan_name_map.items(): for port_counter_name, rif_counter_name in mibs.RIF_COUNTERS_AGGR_MAP.items(): - try: - vlan_idx = mibs.get_index_from_str(vlan_name.decode()) + vlan_idx = mibs.get_index_from_str(vlan_name.decode()) + vlan_rif_counters = self.rif_counters[vlan_sai_id] + if rif_counter_name in vlan_rif_counters: self.if_counters.setdefault(vlan_idx, {}) self.if_counters[vlan_idx][port_counter_name] = \ - int(self.rif_counters[vlan_sai_id][rif_counter_name]) - except KeyError as e: - logger.warning("Not able to aggregate counters for {}: {}\n {}".format(vlan_sai_id, rif_counter_name, e)) + int(vlan_rif_counters[rif_counter_name]) + def get_counter(self, sub_id, table_name): """ @@ -399,7 +385,7 @@ def get_counter(self, sub_id, table_name): table_name = bytes(getattr(table_name, 'name', table_name), 'utf-8') if table_name in mibs.RIF_DROPS_AGGR_MAP: rif_table_name = mibs.RIF_DROPS_AGGR_MAP[table_name] - counter_value += int(self.rif_counters[sai_lag_rif_id][rif_table_name]) + counter_value += int(self.rif_counters[sai_lag_rif_id].get(rif_table_name, 0)) # truncate to 32-bit counter return counter_value & 0x00000000ffffffff else: From b22236b4edc88c98f0d39d180e5215434883c8a5 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak Date: Fri, 9 Oct 2020 14:10:58 +0300 Subject: [PATCH 19/22] make rif key unique in multi-asic env Signed-off-by: Stepan Blyshchak --- src/sonic_ax_impl/mibs/__init__.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index b5cc100dd..5e8a6e623 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -305,10 +305,7 @@ def init_sync_d_rif_tables(db_conn): Initializes map of RIF SAI oids to port SAI oid. :return: dict """ - rif_port_map = port_util.get_rif_port_map(db_conn) - - if not rif_port_map: - return {}, {} + rif_port_map = {get_sai_id_key(db_conn.namespace, rif): port for rif, port in port_util.get_rif_port_map(db_conn).items()} port_rif_map = {port: rif for rif, port in rif_port_map.items()} logger.debug("Rif port map:\n" + pprint.pformat(rif_port_map, indent=2)) From 068f53004816a16615242fb7dff1b4570fe36a0f Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak Date: Wed, 4 Nov 2020 04:01:27 +0200 Subject: [PATCH 20/22] support multi-asic devices & unit test for multi-asic Signed-off-by: Stepan Blyshchak --- src/sonic_ax_impl/mibs/__init__.py | 5 +- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 4 +- tests/mock_tables/asic0/asic_db.json | 7 + tests/mock_tables/asic0/counters_db.json | 50 ++- tests/mock_tables/asic1/appl_db.json | 6 +- tests/mock_tables/asic1/asic_db.json | 14 + tests/mock_tables/asic1/counters_db.json | 151 ++++++- tests/namespace/test_interfaces.py | 491 ++++++++++++++++++++++- tests/test_interfaces.py | 6 +- 9 files changed, 713 insertions(+), 21 deletions(-) diff --git a/src/sonic_ax_impl/mibs/__init__.py b/src/sonic_ax_impl/mibs/__init__.py index 8f1ea4edb..7e4b8609d 100644 --- a/src/sonic_ax_impl/mibs/__init__.py +++ b/src/sonic_ax_impl/mibs/__init__.py @@ -306,7 +306,8 @@ def init_sync_d_rif_tables(db_conn): Initializes map of RIF SAI oids to port SAI oid. :return: dict """ - rif_port_map = {get_sai_id_key(db_conn.namespace, rif): port for rif, port in port_util.get_rif_port_map(db_conn).items()} + rif_port_map = {get_sai_id_key(db_conn.namespace, rif): get_sai_id_key(db_conn.namespace, port) + for rif, port in port_util.get_rif_port_map(db_conn).items()} port_rif_map = {port: rif for rif, port in rif_port_map.items()} logger.debug("Rif port map:\n" + pprint.pformat(rif_port_map, indent=2)) @@ -365,7 +366,7 @@ def init_sync_d_lag_tables(db_conn): db_conn.connect(COUNTERS_DB) lag_sai_map = db_conn.get_all(COUNTERS_DB, "COUNTERS_LAG_NAME_MAP") - lag_sai_map = {name: sai_id.lstrip("oid:0x") for name, sai_id in lag_sai_map.items()} + lag_sai_map = {name: get_sai_id_key(db_conn.namespace, sai_id.lstrip("oid:0x")) for name, sai_id in lag_sai_map.items()} for lag_entry in lag_entries: lag_name = lag_entry[len("LAG_TABLE:"):] diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index f067110f0..ac393ce65 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -267,7 +267,9 @@ def update_if_counters(self): def update_rif_counters(self): rif_sai_ids = list(self.rif_port_map) + list(self.vlan_name_map) self.rif_counters = \ - {sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, mibs.counter_table(sai_id), blocking=False) + {sai_id: Namespace.dbs_get_all(self.db_conn, mibs.COUNTERS_DB, + mibs.counter_table(mibs.split_sai_id_key(sai_id)[1]), + blocking=False) for sai_id in rif_sai_ids} def get_next(self, sub_id): diff --git a/tests/mock_tables/asic0/asic_db.json b/tests/mock_tables/asic0/asic_db.json index 590918051..81f5ca798 100644 --- a/tests/mock_tables/asic0/asic_db.json +++ b/tests/mock_tables/asic0/asic_db.json @@ -23,5 +23,12 @@ "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000005", "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x6000000000006": { + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x1000000000007" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_LAG:oid:0x1000000000007": { + "NULL": "NULL" } } diff --git a/tests/mock_tables/asic0/counters_db.json b/tests/mock_tables/asic0/counters_db.json index c54b92074..f1748c808 100644 --- a/tests/mock_tables/asic0/counters_db.json +++ b/tests/mock_tables/asic0/counters_db.json @@ -206,14 +206,14 @@ "COUNTERS:oid:0x1000000000005": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", - "SAI_PORT_STAT_IF_OUT_ERRORS": "0", + "SAI_PORT_STAT_IF_OUT_ERRORS": "100", "SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_PKTS_1519_TO_2047_OCTETS": "0", "SAI_PORT_STAT_IP_IN_RECEIVES": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_64_OCTETS": "0", "SAI_PORT_STAT_IPV6_OUT_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_4096_TO_9216_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_ERRORS": "0", + "SAI_PORT_STAT_IF_IN_ERRORS": "100", "SAI_PORT_STAT_ETHER_STATS_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_BROADCAST_PKTS": "0", "SAI_PORT_STAT_IF_IN_DISCARDS": "0", @@ -245,7 +245,7 @@ "SAI_PORT_STAT_ETHER_STATS_DROP_EVENTS": "0", "SAI_PORT_STAT_IPV6_OUT_MCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS": "0", - "SAI_PORT_STAT_IF_OUT_OCTETS": "0", + "SAI_PORT_STAT_IF_OUT_OCTETS": "100", "SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_9217_TO_16383_OCTETS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_1024_TO_1518_OCTETS": "0", @@ -260,17 +260,17 @@ "SAI_PORT_STAT_ETHER_IN_PKTS_256_TO_511_OCTETS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_2048_TO_4095_OCTETS": "0", "SAI_PORT_STAT_ETHER_STATS_OCTETS": "0", - "SAI_PORT_STAT_IF_OUT_UCAST_PKTS": "0", + "SAI_PORT_STAT_IF_OUT_UCAST_PKTS": "100", "SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS": "0", "SAI_PORT_STAT_ETHER_OUT_PKTS_128_TO_255_OCTETS": "0", "SAI_PORT_STAT_ETHER_STATS_PKTS_64_OCTETS": "0", "SAI_PORT_STAT_IP_OUT_OCTETS": "0", - "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "0", + "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "100", "SAI_PORT_STAT_ETHER_OUT_PKTS_9217_TO_16383_OCTETS": "0", "SAI_PORT_STAT_ETHER_IN_PKTS_2048_TO_4095_OCTETS": "0", "SAI_PORT_STAT_IP_OUT_NON_UCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0", - "SAI_PORT_STAT_IF_IN_OCTETS": "0", + "SAI_PORT_STAT_IF_IN_OCTETS": "100", "SAI_PORT_STAT_IPV6_IN_MCAST_PKTS": "0", "SAI_PORT_STAT_ETHER_STATS_PKTS_65_TO_127_OCTETS": "0", "SAI_PORT_STAT_IF_OUT_QLEN": "0", @@ -315,10 +315,44 @@ "PortChannel01": "oid:0x1000000000007" }, "COUNTERS_RIF_NAME_MAP": { - "PortChannel01": "oid:0x6000000000006" + "Ethernet0": "oid:0x6000000000015", + "PortChannel01": "oid:0x6000000000006", + "Vlan1000": "oid:0x60000000005d0" }, "COUNTERS_RIF_TYPE_MAP": { - "oid:0x6000000000006": "SAI_ROUTER_INTERFACE_TYPE_PORT" + "oid:0x6000000000015": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x6000000000006": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x60000000005d0": "SAI_ROUTER_INTERFACE_TYPE_VLAN" + }, + "COUNTERS:oid:0x6000000000006": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "6", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "116", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "6", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "226", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "12", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "212", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "6", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "336" + }, + "COUNTERS:oid:0x6000000000015": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "10", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "2048", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "1", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "55", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "20", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "4096", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "2", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "110" + }, + "COUNTERS:oid:0x60000000005d0": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "10", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "2048", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "1", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "55", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "20", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "4096", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "2", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "110" }, "COUNTERS:oid:0x1000000000004": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", diff --git a/tests/mock_tables/asic1/appl_db.json b/tests/mock_tables/asic1/appl_db.json index 3c03bcc12..aa91c5382 100644 --- a/tests/mock_tables/asic1/appl_db.json +++ b/tests/mock_tables/asic1/appl_db.json @@ -45,13 +45,17 @@ "speed": 1000, "alias": "etp6" }, + "PORT_TABLE:Ethernet16": { + "speed": 1000, + "alias": "etp16" + }, "PORT_TABLE:Ethernet-BP8": { "alias": "etp7" }, "PORT_TABLE:Ethernet-BP12": { "description": "snowflake", "alias": "etp8", - "speed": 1000 + "speed": 1000 }, "ROUTE_TABLE:0.0.0.0/0": { "ifname": "Ethernet8,Ethernet12", diff --git a/tests/mock_tables/asic1/asic_db.json b/tests/mock_tables/asic1/asic_db.json index 9da04af83..4650923fb 100644 --- a/tests/mock_tables/asic1/asic_db.json +++ b/tests/mock_tables/asic1/asic_db.json @@ -7,5 +7,19 @@ "SAI_BRIDGE_PORT_ATTR_TYPE": "SAI_BRIDGE_PORT_TYPE_PORT", "SAI_BRIDGE_PORT_ATTR_PORT_ID": "oid:0x1000000000005", "SAI_BRIDGE_PORT_ATTR_ADMIN_STATE": "true" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x6000000000015": { + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x1000000000003" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x6000000001abc": { + "SAI_ROUTER_INTERFACE_ATTR_OUTER_VLAN_ID": "101", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x1000000000010", + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_SUB_PORT" + }, + "ASIC_STATE:SAI_OBJECT_TYPE_ROUTER_INTERFACE:oid:0x6000000001abd": { + "SAI_ROUTER_INTERFACE_ATTR_OUTER_VLAN_ID": "102", + "SAI_ROUTER_INTERFACE_ATTR_PORT_ID": "oid:0x1000000000010", + "SAI_ROUTER_INTERFACE_ATTR_TYPE": "SAI_ROUTER_INTERFACE_TYPE_SUB_PORT" } } diff --git a/tests/mock_tables/asic1/counters_db.json b/tests/mock_tables/asic1/counters_db.json index 3f979ec29..7304ffe10 100644 --- a/tests/mock_tables/asic1/counters_db.json +++ b/tests/mock_tables/asic1/counters_db.json @@ -309,18 +309,27 @@ "Ethernet8": "oid:0x1000000000003", "Ethernet12": "oid:0x1000000000004", "Ethernet-BP8": "oid:0x1000000000005", - "Ethernet-BP12": "oid:0x1000000000006" + "Ethernet-BP12": "oid:0x1000000000006", + "Ethernet16": "oid:0x1000000000010" }, "COUNTERS_LAG_NAME_MAP": { "PortChannel02": "oid:0x1000000000007" }, "COUNTERS_RIF_TYPE_MAP": { - "oid:0x6000000000012": "SAI_ROUTER_INTERFACE_TYPE_PORT" + "oid:0x6000000000015": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x6000000000012": "SAI_ROUTER_INTERFACE_TYPE_PORT", + "oid:0x6000000001abc": "SAI_ROUTER_INTERFACE_TYPE_SUB_PORT", + "oid:0x6000000001abd": "SAI_ROUTER_INTERFACE_TYPE_SUB_PORT", + "oid:0x60000000005d1": "SAI_ROUTER_INTERFACE_TYPE_VLAN" }, "COUNTERS_RIF_NAME_MAP": { - "PortChannel02": "oid:0x6000000000012" + "Ethernet8": "oid:0x6000000000015", + "PortChannel02": "oid:0x6000000000012", + "Vlan1001": "oid:0x60000000005d1", + "Ethernet16.101": "oid:0x6000000001abc", + "Ethernet16.102": "oid:0x6000000001abd" }, - "COUNTERS:oid:0x1000000000004": { + "COUNTERS:oid:0x1000000000010": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", "SAI_PORT_STAT_IF_OUT_ERRORS": "0", @@ -422,7 +431,37 @@ "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" }, - "COUNTERS:oid:0x1000000000003": { + "COUNTERS:oid:0x6000000001abc": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "101", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "101", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "101", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "101", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "101", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "101", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "101", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "101" + }, + "COUNTERS:oid:0x6000000001abd": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "102", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "102", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "102", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "102", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "102", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "102", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "102", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "102" + }, + "COUNTERS:oid:0x6000000000015": { + "SAI_ROUTER_INTERFACE_STAT_IN_PACKETS": "10", + "SAI_ROUTER_INTERFACE_STAT_IN_OCTETS": "2048", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_PACKETS": "1", + "SAI_ROUTER_INTERFACE_STAT_IN_ERROR_OCTETS": "55", + "SAI_ROUTER_INTERFACE_STAT_OUT_PACKETS": "20", + "SAI_ROUTER_INTERFACE_STAT_OUT_OCTETS": "4096", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_PACKETS": "2", + "SAI_ROUTER_INTERFACE_STAT_OUT_ERROR_OCTETS": "110" + }, + "COUNTERS:oid:0x1000000000004": { "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", "SAI_PORT_STAT_IF_OUT_ERRORS": "0", @@ -508,6 +547,108 @@ "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", + "SAI_PORT_STAT_PFC_0_TX_PKTS": "1", + "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", + "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", + "SAI_PORT_STAT_PFC_2_RX_PKTS": "3", + "SAI_PORT_STAT_PFC_2_TX_PKTS": "3", + "SAI_PORT_STAT_PFC_3_RX_PKTS": "4", + "SAI_PORT_STAT_PFC_3_TX_PKTS": "4", + "SAI_PORT_STAT_PFC_4_RX_PKTS": "5", + "SAI_PORT_STAT_PFC_4_TX_PKTS": "5", + "SAI_PORT_STAT_PFC_5_RX_PKTS": "6", + "SAI_PORT_STAT_PFC_5_TX_PKTS": "6", + "SAI_PORT_STAT_PFC_6_RX_PKTS": "7", + "SAI_PORT_STAT_PFC_6_TX_PKTS": "7", + "SAI_PORT_STAT_PFC_7_RX_PKTS": "8", + "SAI_PORT_STAT_PFC_7_TX_PKTS": "8" + }, + "COUNTERS:oid:0x1000000000003": { + "SAI_PORT_STAT_ETHER_STATS_TX_NO_ERRORS": "0", + "SAI_PORT_STAT_ETHER_STATS_OVERSIZE_PKTS": "0", + "SAI_PORT_STAT_IF_OUT_ERRORS": "100", + "SAI_PORT_STAT_ETHER_TX_OVERSIZE_PKTS": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_1519_TO_2047_OCTETS": "0", + "SAI_PORT_STAT_IP_IN_RECEIVES": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_64_OCTETS": "0", + "SAI_PORT_STAT_IPV6_OUT_UCAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_OUT_PKTS_4096_TO_9216_OCTETS": "0", + "SAI_PORT_STAT_IF_IN_ERRORS": "100", + "SAI_PORT_STAT_ETHER_STATS_PKTS": "0", + "SAI_PORT_STAT_ETHER_STATS_BROADCAST_PKTS": "0", + "SAI_PORT_STAT_IF_IN_DISCARDS": "0", + "SAI_PORT_STAT_IP_OUT_DISCARDS": "0", + "SAI_PORT_STAT_IF_IN_UNKNOWN_PROTOS": "0", + "SAI_PORT_STAT_IPV6_IN_DISCARDS": "0", + "SAI_PORT_STAT_IPV6_OUT_DISCARDS": "0", + "SAI_PORT_STAT_IPV6_IN_OCTETS": "0", + "SAI_PORT_STAT_ETHER_OUT_PKTS_65_TO_127_OCTETS": "0", + "SAI_PORT_STAT_IF_IN_BROADCAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_1519_TO_2047_OCTETS": "0", + "SAI_PORT_STAT_IF_OUT_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_OUT_PKTS_512_TO_1023_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_256_TO_511_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_9217_TO_16383_OCTETS": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_512_TO_1023_OCTETS": "0", + "SAI_PORT_STAT_IPV6_IN_NON_UCAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_4096_TO_9216_OCTETS": "0", + "SAI_PORT_STAT_IF_OUT_BROADCAST_PKTS": "0", + "SAI_PORT_STAT_IPV6_OUT_NON_UCAST_PKTS": "0", + "SAI_PORT_STAT_IF_IN_VLAN_DISCARDS": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_65_TO_127_OCTETS": "0", + "SAI_PORT_STAT_IP_IN_NON_UCAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_STATS_FRAGMENTS": "0", + "SAI_PORT_STAT_IPV6_IN_UCAST_PKTS": "0", + "SAI_PORT_STAT_IPV6_IN_RECEIVES": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_4096_TO_9216_OCTETS": "0", + "SAI_PORT_STAT_IF_OUT_DISCARDS": "0", + "SAI_PORT_STAT_ETHER_STATS_DROP_EVENTS": "0", + "SAI_PORT_STAT_IPV6_OUT_MCAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_RX_OVERSIZE_PKTS": "0", + "SAI_PORT_STAT_IF_OUT_OCTETS": "100", + "SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_9217_TO_16383_OCTETS": "0", + "SAI_PORT_STAT_ETHER_OUT_PKTS_1024_TO_1518_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_2048_TO_4095_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_512_TO_1023_OCTETS": "0", + "SAI_PORT_STAT_ETHER_OUT_PKTS_1519_TO_2047_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_RX_NO_ERRORS": "0", + "SAI_PORT_STAT_ETHER_OUT_PKTS_64_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_COLLISIONS": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_1024_TO_1518_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_1024_TO_1518_OCTETS": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_256_TO_511_OCTETS": "0", + "SAI_PORT_STAT_ETHER_OUT_PKTS_2048_TO_4095_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_OCTETS": "0", + "SAI_PORT_STAT_IF_OUT_UCAST_PKTS": "100", + "SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS": "0", + "SAI_PORT_STAT_ETHER_OUT_PKTS_128_TO_255_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_64_OCTETS": "0", + "SAI_PORT_STAT_IP_OUT_OCTETS": "0", + "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "100", + "SAI_PORT_STAT_ETHER_OUT_PKTS_9217_TO_16383_OCTETS": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_2048_TO_4095_OCTETS": "0", + "SAI_PORT_STAT_IP_OUT_NON_UCAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0", + "SAI_PORT_STAT_IF_IN_OCTETS": "100", + "SAI_PORT_STAT_IPV6_IN_MCAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_65_TO_127_OCTETS": "0", + "SAI_PORT_STAT_IF_OUT_QLEN": "0", + "SAI_PORT_STAT_ETHER_STATS_PKTS_128_TO_255_OCTETS": "0", + "SAI_PORT_STAT_IP_IN_DISCARDS": "0", + "SAI_PORT_STAT_IPV6_OUT_OCTETS": "0", + "SAI_PORT_STAT_IF_OUT_NON_UCAST_PKTS": "0", + "SAI_PORT_STAT_IP_IN_OCTETS": "0", + "SAI_PORT_STAT_ETHER_OUT_PKTS_256_TO_511_OCTETS": "0", + "SAI_PORT_STAT_ETHER_STATS_CRC_ALIGN_ERRORS": "0", + "SAI_PORT_STAT_IP_OUT_UCAST_PKTS": "0", + "SAI_PORT_STAT_IP_IN_UCAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_STATS_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_ETHER_IN_PKTS_128_TO_255_OCTETS": "0", + "SAI_PORT_STAT_IF_IN_MULTICAST_PKTS": "0", + "SAI_PORT_STAT_PAUSE_RX_PKTS": "0", + "SAI_PORT_STAT_PAUSE_TX_PKTS": "0", + "SAI_PORT_STAT_PFC_0_RX_PKTS": "1", "SAI_PORT_STAT_PFC_0_TX_PKTS": "209347219842134092490", "SAI_PORT_STAT_PFC_1_RX_PKTS": "2", "SAI_PORT_STAT_PFC_1_TX_PKTS": "2", diff --git a/tests/namespace/test_interfaces.py b/tests/namespace/test_interfaces.py index ea51339f8..b9b0c192f 100644 --- a/tests/namespace/test_interfaces.py +++ b/tests/namespace/test_interfaces.py @@ -237,7 +237,7 @@ def test_if_type_portchannel(self): self.assertEqual(value0.data, 161) def test_getnextpdu_first_bp_ifindex(self): - oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 1,1004)) + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 8999)) get_pdu = GetNextPDU( header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), oids=[oid] @@ -367,6 +367,495 @@ def test_in_octets_override(self): self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 1)))) self.assertEqual(value0.data, 54321) + def test_vlan_iface(self): + """ + Test that vlan interface is present in the MIB + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 2999)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 1, 3000)))) + self.assertEqual(value0.data, 2999) + + def test_vlan_iface_description(self): + """ + Test vlan interface description (which is simply the name) + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.OCTET_STRING) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 2, 3000)))) + self.assertEqual(str(value0.data), 'Vlan1000') + + def test_if_type_l3vlan(self): + """ + For l3vlan the type shpuld be 136 + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 2000)) + get_pdu = GetNextPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + encoded = get_pdu.encode() + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.INTEGER) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 3, 3000)))) + self.assertEqual(value0.data, 136) + + def test_in_octets_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 9)))) + self.assertEqual(value0.data, 100) + + def test_in_ucast_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 9)))) + self.assertEqual(value0.data, 100) + + def test_in_errors_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 9)))) + self.assertEqual(value0.data, 101) + + def test_out_octets_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 9)))) + self.assertEqual(value0.data, 100) + + def test_out_ucast_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 9)))) + self.assertEqual(value0.data, 100) + + def test_out_errors_rif(self): + """ + For a port with RIF the counter values are aggregated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 9)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 9)))) + self.assertEqual(value0.data, 102) + + def test_in_octets_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 3000)))) + self.assertEqual(value0.data, 2048) + + def test_in_ucast_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 3000)))) + self.assertEqual(value0.data, 10) + + def test_in_errors_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 3000)))) + self.assertEqual(value0.data, 1) + + def test_out_octets_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 3000)))) + self.assertEqual(value0.data, 4096) + + def test_out_ucast_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 3000)))) + self.assertEqual(value0.data, 20) + + def test_out_errors_vlan(self): + """ + For a l3 Vlan values are mapped from RIF stats + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 3000)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 3000)))) + self.assertEqual(value0.data, 2) + + def test_in_octets_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 17)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 17)))) + self.assertEqual(value0.data, 0) + + def test_in_ucast_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 17)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 17)))) + self.assertEqual(value0.data, 0) + + def test_in_errors_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 17)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 17)))) + self.assertEqual(value0.data, 203) + + def test_out_octets_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 17)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 17)))) + self.assertEqual(value0.data, 0) + + def test_out_ucast_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 17)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 17)))) + self.assertEqual(value0.data, 0) + + def test_out_errors_vlan_subinterface(self): + """ + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 17)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 17)))) + self.assertEqual(value0.data, 203) + + def test_in_octets_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 1001)))) + self.assertEqual(value0.data, 100) + + def test_in_ucast_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 11, 1001)))) + self.assertEqual(value0.data, 100) + + def test_in_errors_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 14, 1001)))) + self.assertEqual(value0.data, 106) + + def test_out_octets_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 16, 1001)))) + self.assertEqual(value0.data, 100) + + def test_out_ucast_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 17, 1001)))) + self.assertEqual(value0.data, 100) + + def test_out_errors_portchannel(self): + """ + For a l3 portchannel interface value is accumulated on members plus added Rif counters + """ + oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 1001)) + get_pdu = GetPDU( + header=PDUHeader(1, PduTypes.GET, 16, 0, 42, 0, 0, 0), + oids=[oid] + ) + + response = get_pdu.make_response(self.lut) + print(response) + + value0 = response.values[0] + self.assertEqual(value0.type_, ValueType.COUNTER_32) + self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 1001)))) + self.assertEqual(value0.data, 106) + @classmethod def tearDownClass(cls): tests.mock_tables.dbconnector.clean_up_config() diff --git a/tests/test_interfaces.py b/tests/test_interfaces.py index 3e357fb3f..cb654c642 100644 --- a/tests/test_interfaces.py +++ b/tests/test_interfaces.py @@ -641,7 +641,7 @@ def test_out_errors_vlan(self): def test_in_octets_vlan_subinterface(self): """ - For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated + For a port with multiple vlan subinterfaces (RIF) all RIF drops are accumulated """ oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 9)) get_pdu = GetPDU( @@ -749,7 +749,7 @@ def test_out_errors_vlan_subinterface(self): def test_in_octets_portchannel(self): """ - For a l3 portchannel interface value is accumulated on members plus added Rif counters + For a l3 portchannel interface value is accumulated on members plus added Rif counters """ oid = ObjectIdentifier(11, 0, 0, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 10, 1001)) get_pdu = GetPDU( @@ -853,4 +853,4 @@ def test_out_errors_portchannel(self): value0 = response.values[0] self.assertEqual(value0.type_, ValueType.COUNTER_32) self.assertEqual(str(value0.name), str(ObjectIdentifier(11, 0, 1, 0, (1, 3, 6, 1, 2, 1, 2, 2, 1, 20, 1001)))) - self.assertEqual(value0.data, 106) \ No newline at end of file + self.assertEqual(value0.data, 106) From 144658ff6fe25c1db9417de703d3f9de58c303d4 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak Date: Wed, 4 Nov 2020 04:02:58 +0200 Subject: [PATCH 21/22] merge import lines Signed-off-by: Stepan Blyshchak --- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index ac393ce65..bda743c07 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -3,8 +3,7 @@ from enum import unique, Enum from bisect import bisect_right -from sonic_ax_impl import mibs -from sonic_ax_impl import logger +from sonic_ax_impl import mibs, logger from sonic_ax_impl.mibs import Namespace from ax_interface.mib import MIBMeta, ValueType, MIBUpdater, MIBEntry, SubtreeMIBEntry, OverlayAdpaterMIBEntry, OidMIBEntry from ax_interface.encodings import ObjectIdentifier From 196033f05c3ccd88d8289e9971b1de6c05762f24 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak Date: Wed, 4 Nov 2020 10:28:21 +0200 Subject: [PATCH 22/22] remove unused report Signed-off-by: Stepan Blyshchak --- src/sonic_ax_impl/mibs/ietf/rfc1213.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic_ax_impl/mibs/ietf/rfc1213.py b/src/sonic_ax_impl/mibs/ietf/rfc1213.py index bda743c07..0fee186a5 100644 --- a/src/sonic_ax_impl/mibs/ietf/rfc1213.py +++ b/src/sonic_ax_impl/mibs/ietf/rfc1213.py @@ -3,7 +3,7 @@ from enum import unique, Enum from bisect import bisect_right -from sonic_ax_impl import mibs, logger +from sonic_ax_impl import mibs from sonic_ax_impl.mibs import Namespace from ax_interface.mib import MIBMeta, ValueType, MIBUpdater, MIBEntry, SubtreeMIBEntry, OverlayAdpaterMIBEntry, OidMIBEntry from ax_interface.encodings import ObjectIdentifier