From ada0e85dfcb9a6087d3965f0faf8d11728857572 Mon Sep 17 00:00:00 2001 From: Prince George Date: Thu, 20 Jan 2022 16:14:41 +0000 Subject: [PATCH 1/7] Add FEC correctable and uncorrectable port stats Signed-off-by: Prince George --- scripts/portstat | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/scripts/portstat b/scripts/portstat index 45490d29ef..fa5cc44629 100755 --- a/scripts/portstat +++ b/scripts/portstat @@ -51,12 +51,12 @@ NStats = namedtuple("NStats", "rx_ok, rx_err, rx_drop, rx_ovr, tx_ok,\ rx_uca, rx_mca, rx_bca, rx_all,\ tx_64, tx_65_127, tx_128_255, tx_256_511, tx_512_1023, tx_1024_1518, tx_1519_2047, tx_2048_4095, tx_4096_9216, tx_9217_16383,\ tx_uca, tx_mca, tx_bca, tx_all,\ - rx_jbr, rx_frag, rx_usize, rx_ovrrun") + rx_jbr, rx_frag, rx_usize, rx_ovrrun, fec_corr, fec_uncorr") header_all = ['IFACE', 'STATE', 'RX_OK', 'RX_BPS', 'RX_PPS', 'RX_UTIL', 'RX_ERR', 'RX_DRP', 'RX_OVR', - 'TX_OK', 'TX_BPS', 'TX_PPS', 'TX_UTIL', 'TX_ERR', 'TX_DRP', 'TX_OVR'] + 'TX_OK', 'TX_BPS', 'TX_PPS', 'TX_UTIL', 'TX_ERR', 'TX_DRP', 'TX_OVR', 'FEC_CORR', 'FEC_UNCORR'] header_std = ['IFACE', 'STATE', 'RX_OK', 'RX_BPS', 'RX_UTIL', 'RX_ERR', 'RX_DRP', 'RX_OVR', 'TX_OK', 'TX_BPS', 'TX_UTIL', 'TX_ERR', 'TX_DRP', 'TX_OVR'] -header_errors_only = ['IFACE', 'STATE', 'RX_ERR', 'RX_DRP', 'RX_OVR', 'TX_ERR', 'TX_DRP', 'TX_OVR'] +header_errors_only = ['IFACE', 'STATE', 'RX_ERR', 'RX_DRP', 'RX_OVR', 'TX_ERR', 'TX_DRP', 'TX_OVR', 'FEC_CORR', 'FEC_UNCORR'] header_rates_only = ['IFACE', 'STATE', 'RX_OK', 'RX_BPS', 'RX_PPS', 'RX_UTIL', 'TX_OK', 'TX_BPS', 'TX_PPS', 'TX_UTIL'] rates_key_list = [ 'RX_BPS', 'RX_PPS', 'RX_UTIL', 'TX_BPS', 'TX_PPS', 'TX_UTIL' ] @@ -67,7 +67,7 @@ RateStats = namedtuple("RateStats", ratestat_fields) The order and count of statistics mentioned below needs to be in sync with the values in portstat script So, any fields added/deleted in here should be reflected in portstat script also """ -BUCKET_NUM = 42 +BUCKET_NUM = 44 counter_bucket_dict = { 0:['SAI_PORT_STAT_IF_IN_UCAST_PKTS', 'SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS'], 1:['SAI_PORT_STAT_IF_IN_ERRORS'], @@ -110,7 +110,9 @@ counter_bucket_dict = { 38:['SAI_PORT_STAT_ETHER_STATS_JABBERS'], 39:['SAI_PORT_STAT_ETHER_STATS_FRAGMENTS'], 40:['SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS'], - 41:['SAI_PORT_STAT_IP_IN_RECEIVES'] + 41:['SAI_PORT_STAT_IP_IN_RECEIVES'], + 42:['SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES'], + 43:['SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES'] } STATUS_NA = 'N/A' @@ -285,7 +287,9 @@ class Portstat(object): format_util(rates.tx_bps, port_speed), format_number_with_comma(data.tx_err), format_number_with_comma(data.tx_drop), - format_number_with_comma(data.tx_ovr))) + format_number_with_comma(data.tx_ovr), + format_number_with_comma(data.fec_corr), + format_number_with_comma(data.fec_uncorr))) elif errors_only: header = header_errors_only table.append((key, self.get_port_state(key), @@ -294,7 +298,9 @@ class Portstat(object): format_number_with_comma(data.rx_ovr), format_number_with_comma(data.tx_err), format_number_with_comma(data.tx_drop), - format_number_with_comma(data.tx_ovr))) + format_number_with_comma(data.tx_ovr), + format_number_with_comma(data.fec_corr), + format_number_with_comma(data.fec_uncorr))) elif rates_only: header = header_rates_only table.append((key, self.get_port_state(key), @@ -430,7 +436,9 @@ class Portstat(object): format_util(rates.tx_bps, port_speed), ns_diff(cntr.tx_err, old_cntr.tx_err), ns_diff(cntr.tx_drop, old_cntr.tx_drop), - ns_diff(cntr.tx_ovr, old_cntr.tx_ovr))) + ns_diff(cntr.tx_ovr, old_cntr.tx_ovr), + ns_diff(cntr.fec_corr, old_cntr.fec_corr), + ns_diff(cntr.fec_uncorr, old_cntr.fec_uncorr))) else: table.append((key, self.get_port_state(key), format_number_with_comma(cntr.rx_ok), @@ -446,7 +454,9 @@ class Portstat(object): format_util(rates.tx_bps, port_speed), format_number_with_comma(cntr.tx_err), format_number_with_comma(cntr.tx_drop), - format_number_with_comma(cntr.tx_ovr))) + format_number_with_comma(cntr.tx_ovr), + format_number_with_comma(cntr.fec_corr), + format_number_with_comma(cntr.fec_uncorr))) elif errors_only: header = header_errors_only if old_cntr is not None: @@ -456,7 +466,9 @@ class Portstat(object): ns_diff(cntr.rx_ovr, old_cntr.rx_ovr), ns_diff(cntr.tx_err, old_cntr.tx_err), ns_diff(cntr.tx_drop, old_cntr.tx_drop), - ns_diff(cntr.tx_ovr, old_cntr.tx_ovr))) + ns_diff(cntr.tx_ovr, old_cntr.tx_ovr), + ns_diff(cntr.fec_corr, old_cntr.fec_corr), + ns_diff(cntr.fec_uncorr, old_cntr.fec_uncorr))) else: table.append((key, self.get_port_state(key), format_number_with_comma(cntr.rx_err), @@ -464,7 +476,9 @@ class Portstat(object): format_number_with_comma(cntr.rx_ovr), format_number_with_comma(cntr.tx_err), format_number_with_comma(cntr.tx_drop), - format_number_with_comma(cntr.tx_ovr))) + format_number_with_comma(cntr.tx_ovr), + format_number_with_comma(cntr.fec_corr), + format_number_with_comma(cntr.fec_uncorr))) elif rates_only: header = header_rates_only if old_cntr is not None: @@ -639,4 +653,4 @@ Examples: portstat.cnstat_diff_print(cnstat_new_dict, cnstat_dict, ratestat_new_dict, intf_list, use_json, print_all, errors_only, rates_only, detail) if __name__ == "__main__": - main() + main() \ No newline at end of file From 9cc9f3eff26bc11f881255ecd09f86cb72bf1976 Mon Sep 17 00:00:00 2001 From: Prince George Date: Sat, 22 Jan 2022 11:00:08 +0000 Subject: [PATCH 2/7] fix pytest failures Signed-off-by: Prince George --- tests/portstat_test.py | 46 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/tests/portstat_test.py b/tests/portstat_test.py index 6429c4863a..62cc6e41e6 100644 --- a/tests/portstat_test.py +++ b/tests/portstat_test.py @@ -27,11 +27,11 @@ """ intf_counters_all = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR ---------- ------- ------- ------------ ----------- --------- -------- -------- -------- ------- ------------ ----------- --------- -------- -------- -------- -Ethernet0 D 8 2000.00 MB/s 247000.00/s 64.00% 10 100 N/A 10 1500.00 MB/s 183000.00/s 48.00% N/A N/A N/A -Ethernet4 N/A 4 204.80 KB/s 200.00/s N/A 0 1,000 N/A 40 204.85 KB/s 201.00/s N/A N/A N/A N/A -Ethernet8 N/A 6 1350.00 KB/s 9000.00/s N/A 100 10 N/A 60 13.37 MB/s 9000.00/s N/A N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR +--------- ------- ------- ------------ ----------- --------- -------- -------- -------- ------- ------------ ----------- --------- -------- -------- -------- ---------- ------------ +Ethernet0 D 8 2000.00 MB/s 247000.00/s 64.00% 10 100 N/A 10 1500.00 MB/s 183000.00/s 48.00% N/A N/A N/A N/A N/A +Ethernet4 N/A 4 204.80 KB/s 200.00/s N/A 0 1,000 N/A 40 204.85 KB/s 201.00/s N/A N/A N/A N/A N/A N/A +Ethernet8 N/A 6 1350.00 KB/s 9000.00/s N/A 100 10 N/A 60 13.37 MB/s 9000.00/s N/A N/A N/A N/A N/A N/A """ intf_counters_period = """\ @@ -80,30 +80,30 @@ """ multi_asic_external_intf_counters_printall = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR ---------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- -Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A -Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR +--------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ----------- +Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A +Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A """ multi_asic_intf_counters_printall = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR --------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- - Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A - Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A - Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A - Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A -Ethernet-BP256 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A -Ethernet-BP260 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR +-------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ----------- + Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A + Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A + Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A + Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A +Ethernet-BP256 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A +Ethernet-BP260 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A """ multi_asic_intf_counters_asic0_printall = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR ------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- - Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A - Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A -Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A -Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR +------------ ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ----------- + Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A + Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A +Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A +Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A """ multi_asic_intf_counters_period = """\ The rates are calculated within 3 seconds period From 63218455cc1ca20df03c16fdeb240c204feca8cd Mon Sep 17 00:00:00 2001 From: Prince George Date: Sat, 22 Jan 2022 13:19:50 +0000 Subject: [PATCH 3/7] fix pytest failure --- tests/portstat_test.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/portstat_test.py b/tests/portstat_test.py index 62cc6e41e6..63919235c5 100644 --- a/tests/portstat_test.py +++ b/tests/portstat_test.py @@ -81,14 +81,14 @@ multi_asic_external_intf_counters_printall = """\ IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR ---------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ----------- +--------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ------------ Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A """ multi_asic_intf_counters_printall = """\ IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR --------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ----------- +-------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ------------ Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A @@ -99,7 +99,7 @@ multi_asic_intf_counters_asic0_printall = """\ IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR ------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ----------- +------------ ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ------------ Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A From 397df8bbea2410db297e67fd9bb9adbe45c87d68 Mon Sep 17 00:00:00 2001 From: Prince George Date: Sat, 30 Jul 2022 00:01:57 +0000 Subject: [PATCH 4/7] Added separate command for fec stats --- scripts/portstat | 68 +++++++++++++++++++----------- show/interfaces/__init__.py | 33 +++++++++++---- tests/mock_tables/counters_db.json | 15 +++++-- tests/portstat_test.py | 33 ++++++++++++--- 4 files changed, 108 insertions(+), 41 deletions(-) diff --git a/scripts/portstat b/scripts/portstat index fa5cc44629..37525292d9 100755 --- a/scripts/portstat +++ b/scripts/portstat @@ -51,12 +51,14 @@ NStats = namedtuple("NStats", "rx_ok, rx_err, rx_drop, rx_ovr, tx_ok,\ rx_uca, rx_mca, rx_bca, rx_all,\ tx_64, tx_65_127, tx_128_255, tx_256_511, tx_512_1023, tx_1024_1518, tx_1519_2047, tx_2048_4095, tx_4096_9216, tx_9217_16383,\ tx_uca, tx_mca, tx_bca, tx_all,\ - rx_jbr, rx_frag, rx_usize, rx_ovrrun, fec_corr, fec_uncorr") + rx_jbr, rx_frag, rx_usize, rx_ovrrun,\ + fec_corr, fec_uncorr, fec_symbol_err") header_all = ['IFACE', 'STATE', 'RX_OK', 'RX_BPS', 'RX_PPS', 'RX_UTIL', 'RX_ERR', 'RX_DRP', 'RX_OVR', - 'TX_OK', 'TX_BPS', 'TX_PPS', 'TX_UTIL', 'TX_ERR', 'TX_DRP', 'TX_OVR', 'FEC_CORR', 'FEC_UNCORR'] + 'TX_OK', 'TX_BPS', 'TX_PPS', 'TX_UTIL', 'TX_ERR', 'TX_DRP', 'TX_OVR'] header_std = ['IFACE', 'STATE', 'RX_OK', 'RX_BPS', 'RX_UTIL', 'RX_ERR', 'RX_DRP', 'RX_OVR', 'TX_OK', 'TX_BPS', 'TX_UTIL', 'TX_ERR', 'TX_DRP', 'TX_OVR'] -header_errors_only = ['IFACE', 'STATE', 'RX_ERR', 'RX_DRP', 'RX_OVR', 'TX_ERR', 'TX_DRP', 'TX_OVR', 'FEC_CORR', 'FEC_UNCORR'] +header_errors_only = ['IFACE', 'STATE', 'RX_ERR', 'RX_DRP', 'RX_OVR', 'TX_ERR', 'TX_DRP', 'TX_OVR'] +header_fec_only = ['IFACE', 'STATE', 'FEC_CORR', 'FEC_UNCORR', 'FEC_SYMBOL_ERR'] header_rates_only = ['IFACE', 'STATE', 'RX_OK', 'RX_BPS', 'RX_PPS', 'RX_UTIL', 'TX_OK', 'TX_BPS', 'TX_PPS', 'TX_UTIL'] rates_key_list = [ 'RX_BPS', 'RX_PPS', 'RX_UTIL', 'TX_BPS', 'TX_PPS', 'TX_UTIL' ] @@ -67,7 +69,7 @@ RateStats = namedtuple("RateStats", ratestat_fields) The order and count of statistics mentioned below needs to be in sync with the values in portstat script So, any fields added/deleted in here should be reflected in portstat script also """ -BUCKET_NUM = 44 +BUCKET_NUM = 45 counter_bucket_dict = { 0:['SAI_PORT_STAT_IF_IN_UCAST_PKTS', 'SAI_PORT_STAT_IF_IN_NON_UCAST_PKTS'], 1:['SAI_PORT_STAT_IF_IN_ERRORS'], @@ -112,7 +114,8 @@ counter_bucket_dict = { 40:['SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS'], 41:['SAI_PORT_STAT_IP_IN_RECEIVES'], 42:['SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES'], - 43:['SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES'] + 43:['SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES'], + 44:['SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS'] } STATUS_NA = 'N/A' @@ -252,7 +255,7 @@ class Portstat(object): return STATUS_NA - def cnstat_print(self, cnstat_dict, ratestat_dict, intf_list, use_json, print_all, errors_only, rates_only, detail=False): + def cnstat_print(self, cnstat_dict, ratestat_dict, intf_list, use_json, print_all, errors_only, fec_stats_only, rates_only, detail=False): """ Print the cnstat. """ @@ -289,7 +292,8 @@ class Portstat(object): format_number_with_comma(data.tx_drop), format_number_with_comma(data.tx_ovr), format_number_with_comma(data.fec_corr), - format_number_with_comma(data.fec_uncorr))) + format_number_with_comma(data.fec_uncorr), + format_number_with_comma(data.fec_symbol_err))) elif errors_only: header = header_errors_only table.append((key, self.get_port_state(key), @@ -298,9 +302,13 @@ class Portstat(object): format_number_with_comma(data.rx_ovr), format_number_with_comma(data.tx_err), format_number_with_comma(data.tx_drop), - format_number_with_comma(data.tx_ovr), + format_number_with_comma(data.tx_ovr))) + elif fec_stats_only: + header = header_fec_only + table.append((key, self.get_port_state(key), format_number_with_comma(data.fec_corr), - format_number_with_comma(data.fec_uncorr))) + format_number_with_comma(data.fec_uncorr), + format_number_with_comma(data.fec_symbol_err))) elif rates_only: header = header_rates_only table.append((key, self.get_port_state(key), @@ -394,7 +402,10 @@ class Portstat(object): print("Time Since Counters Last Cleared............... " + str(cnstat_old_dict.get('time'))) - def cnstat_diff_print(self, cnstat_new_dict, cnstat_old_dict, ratestat_dict, intf_list, use_json, print_all, errors_only, rates_only, detail=False): + def cnstat_diff_print(self, cnstat_new_dict, cnstat_old_dict, + ratestat_dict, intf_list, use_json, + print_all, errors_only, fec_stats_only, + rates_only, detail=False): """ Print the difference between two cnstat results. """ @@ -436,9 +447,7 @@ class Portstat(object): format_util(rates.tx_bps, port_speed), ns_diff(cntr.tx_err, old_cntr.tx_err), ns_diff(cntr.tx_drop, old_cntr.tx_drop), - ns_diff(cntr.tx_ovr, old_cntr.tx_ovr), - ns_diff(cntr.fec_corr, old_cntr.fec_corr), - ns_diff(cntr.fec_uncorr, old_cntr.fec_uncorr))) + ns_diff(cntr.tx_ovr, old_cntr.tx_ovr))) else: table.append((key, self.get_port_state(key), format_number_with_comma(cntr.rx_ok), @@ -454,9 +463,7 @@ class Portstat(object): format_util(rates.tx_bps, port_speed), format_number_with_comma(cntr.tx_err), format_number_with_comma(cntr.tx_drop), - format_number_with_comma(cntr.tx_ovr), - format_number_with_comma(cntr.fec_corr), - format_number_with_comma(cntr.fec_uncorr))) + format_number_with_comma(cntr.tx_ovr))) elif errors_only: header = header_errors_only if old_cntr is not None: @@ -466,9 +473,7 @@ class Portstat(object): ns_diff(cntr.rx_ovr, old_cntr.rx_ovr), ns_diff(cntr.tx_err, old_cntr.tx_err), ns_diff(cntr.tx_drop, old_cntr.tx_drop), - ns_diff(cntr.tx_ovr, old_cntr.tx_ovr), - ns_diff(cntr.fec_corr, old_cntr.fec_corr), - ns_diff(cntr.fec_uncorr, old_cntr.fec_uncorr))) + ns_diff(cntr.tx_ovr, old_cntr.tx_ovr))) else: table.append((key, self.get_port_state(key), format_number_with_comma(cntr.rx_err), @@ -476,9 +481,20 @@ class Portstat(object): format_number_with_comma(cntr.rx_ovr), format_number_with_comma(cntr.tx_err), format_number_with_comma(cntr.tx_drop), - format_number_with_comma(cntr.tx_ovr), + format_number_with_comma(cntr.tx_ovr))) + elif fec_stats_only: + header = header_fec_only + if old_cntr is not None: + table.append((key, self.get_port_state(key), + ns_diff(cntr.fec_corr, old_cntr.fec_corr), + ns_diff(cntr.fec_uncorr, old_cntr.fec_uncorr), + ns_diff(cntr.fec_symbol_err, old_cntr.fec_symbol_err))) + else: + table.append((key, self.get_port_state(key), format_number_with_comma(cntr.fec_corr), - format_number_with_comma(cntr.fec_uncorr))) + format_number_with_comma(cntr.fec_uncorr), + format_number_with_comma(cntr.fec_symbol_err))) + elif rates_only: header = header_rates_only if old_cntr is not None: @@ -565,6 +581,7 @@ Examples: parser.add_argument('-d', '--delete', action='store_true', help='Delete saved stats, either the uid or the specified tag') parser.add_argument('-D', '--delete-all', action='store_true', help='Delete all saved stats') parser.add_argument('-e', '--errors', action='store_true', help='Display interface errors') + parser.add_argument('-f', '--fec-stats', action='store_true', help='Display FEC related statistics') parser.add_argument('-j', '--json', action='store_true', help='Display in JSON format') parser.add_argument('-r', '--raw', action='store_true', help='Raw stats (unmodified output of netstat)') parser.add_argument('-R', '--rate', action='store_true', help='Display interface rates') @@ -581,6 +598,7 @@ Examples: delete_saved_stats = args.delete delete_all_stats = args.delete_all errors_only = args.errors + fec_stats_only = args.fec_stats rates_only = args.rate use_json = args.json raw_stats = args.raw @@ -636,7 +654,7 @@ Examples: cnstat_cached_dict = pickle.load(open(cnstat_fqn_file, 'rb')) if not detail: print("Last cached time was " + str(cnstat_cached_dict.get('time'))) - portstat.cnstat_diff_print(cnstat_dict, cnstat_cached_dict, ratestat_dict, intf_list, use_json, print_all, errors_only, rates_only, detail) + portstat.cnstat_diff_print(cnstat_dict, cnstat_cached_dict, ratestat_dict, intf_list, use_json, print_all, errors_only, fec_stats_only, rates_only, detail) except IOError as e: print(e.errno, e) else: @@ -644,13 +662,13 @@ Examples: print("\nFile '%s' does not exist" % cnstat_fqn_file) print("Did you run 'portstat -c -t %s' to record the counters via tag %s?\n" % (tag_name, tag_name)) else: - portstat.cnstat_print(cnstat_dict, ratestat_dict, intf_list, use_json, print_all, errors_only, rates_only, detail) + portstat.cnstat_print(cnstat_dict, ratestat_dict, intf_list, use_json, print_all, errors_only, fec_stats_only, rates_only, detail) else: #wait for the specified time and then gather the new stats and output the difference. time.sleep(wait_time_in_seconds) print("The rates are calculated within %s seconds period" % wait_time_in_seconds) cnstat_new_dict, ratestat_new_dict = portstat.get_cnstat_dict() - portstat.cnstat_diff_print(cnstat_new_dict, cnstat_dict, ratestat_new_dict, intf_list, use_json, print_all, errors_only, rates_only, detail) + portstat.cnstat_diff_print(cnstat_new_dict, cnstat_dict, ratestat_new_dict, intf_list, use_json, print_all, errors_only, fec_stats_only, rates_only, detail) if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/show/interfaces/__init__.py b/show/interfaces/__init__.py index 7f218f41db..25cfd045e0 100644 --- a/show/interfaces/__init__.py +++ b/show/interfaces/__init__.py @@ -338,7 +338,7 @@ def expected(db, interfacename): @click.pass_context def mpls(ctx, interfacename, namespace, display): """Show Interface MPLS status""" - + #Edge case: Force show frontend interfaces on single asic if not (multi_asic.is_multi_asic()): if (display == 'frontend' or display == 'all' or display is None): @@ -346,7 +346,7 @@ def mpls(ctx, interfacename, namespace, display): else: print("Error: Invalid display option command for single asic") return - + display = "all" if interfacename else display masic = multi_asic_util.MultiAsic(display_option=display, namespace_option=namespace) ns_list = masic.get_ns_list_based_on_options() @@ -372,13 +372,13 @@ def mpls(ctx, interfacename, namespace, display): if (interfacename is not None): if (interfacename != ifname): continue - + intf_found = True - + if (display != "all"): if ("Loopback" in ifname): continue - + if ifname.startswith("Ethernet") and multi_asic.is_port_internal(ifname, ns): continue @@ -391,11 +391,11 @@ def mpls(ctx, interfacename, namespace, display): if 'mpls' not in mpls_intf or mpls_intf['mpls'] == 'disable': intfs_data.update({ifname: 'disable'}) else: - intfs_data.update({ifname: mpls_intf['mpls']}) - + intfs_data.update({ifname: mpls_intf['mpls']}) + # Check if interface is valid if (interfacename is not None and not intf_found): - ctx.fail('interface {} doesn`t exist'.format(interfacename)) + ctx.fail('interface {} doesn`t exist'.format(interfacename)) header = ['Interface', 'MPLS State'] body = [] @@ -558,6 +558,23 @@ def errors(verbose, period, namespace, display): clicommon.run_command(cmd, display_cmd=verbose) +# 'fec-stats' subcommand ("show interfaces counters errors") +@counters.command('fec-stats') +@click.option('-p', '--period') +@multi_asic_util.multi_asic_click_options +@click.option('--verbose', is_flag=True, help="Enable verbose output") +def fec_stats(verbose, period, namespace, display): + """Show interface counters fec-stats""" + cmd = "portstat -f" + if period is not None: + cmd += " -p {}".format(period) + + cmd += " -s {}".format(display) + if namespace is not None: + cmd += " -n {}".format(namespace) + + clicommon.run_command(cmd, display_cmd=verbose) + # 'rates' subcommand ("show interfaces counters rates") @counters.command() @click.option('-p', '--period') diff --git a/tests/mock_tables/counters_db.json b/tests/mock_tables/counters_db.json index e12e3347fd..03b29cdded 100644 --- a/tests/mock_tables/counters_db.json +++ b/tests/mock_tables/counters_db.json @@ -855,7 +855,10 @@ "SAI_PORT_STAT_ETHER_OUT_PKTS_9217_TO_16383_OCTETS": "0", "SAI_PORT_STAT_ETHER_STATS_FRAGMENTS": "0", "SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS": "0", - "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0" + "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0", + "SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "130402", + "SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "3", + "SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "4" }, "COUNTERS:oid:0x1000000000013": { "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "4", @@ -912,7 +915,10 @@ "SAI_PORT_STAT_ETHER_OUT_PKTS_9217_TO_16383_OCTETS": "0", "SAI_PORT_STAT_ETHER_STATS_FRAGMENTS": "0", "SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS": "0", - "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0" + "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0", + "SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "110412", + "SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "1", + "SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "0" }, "COUNTERS:oid:0x1000000000014": { "SAI_PORT_STAT_IF_IN_UCAST_PKTS": "6", @@ -969,7 +975,10 @@ "SAI_PORT_STAT_ETHER_OUT_PKTS_9217_TO_16383_OCTETS": "0", "SAI_PORT_STAT_ETHER_STATS_FRAGMENTS": "0", "SAI_PORT_STAT_ETHER_STATS_UNDERSIZE_PKTS": "0", - "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0" + "SAI_PORT_STAT_ETHER_STATS_JABBERS": "0", + "SAI_PORT_STAT_IF_IN_FEC_CORRECTABLE_FRAMES": "100317", + "SAI_PORT_STAT_IF_IN_FEC_NOT_CORRECTABLE_FRAMES": "0", + "SAI_PORT_STAT_IF_IN_FEC_SYMBOL_ERRORS": "0" }, "COUNTERS:oid:0x21000000000000": { "SAI_SWITCH_STAT_OUT_DROP_REASON_RANGE_BASE": "1000", diff --git a/tests/portstat_test.py b/tests/portstat_test.py index 63919235c5..5706813cce 100644 --- a/tests/portstat_test.py +++ b/tests/portstat_test.py @@ -27,11 +27,19 @@ """ intf_counters_all = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR ---------- ------- ------- ------------ ----------- --------- -------- -------- -------- ------- ------------ ----------- --------- -------- -------- -------- ---------- ------------ -Ethernet0 D 8 2000.00 MB/s 247000.00/s 64.00% 10 100 N/A 10 1500.00 MB/s 183000.00/s 48.00% N/A N/A N/A N/A N/A -Ethernet4 N/A 4 204.80 KB/s 200.00/s N/A 0 1,000 N/A 40 204.85 KB/s 201.00/s N/A N/A N/A N/A N/A N/A -Ethernet8 N/A 6 1350.00 KB/s 9000.00/s N/A 100 10 N/A 60 13.37 MB/s 9000.00/s N/A N/A N/A N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR +--------- ------- ------- ------------ ----------- --------- -------- -------- -------- ------- ------------ ----------- --------- -------- -------- -------- +Ethernet0 D 8 2000.00 MB/s 247000.00/s 64.00% 10 100 N/A 10 1500.00 MB/s 183000.00/s 48.00% N/A N/A N/A +Ethernet4 N/A 4 204.80 KB/s 200.00/s N/A 0 1,000 N/A 40 204.85 KB/s 201.00/s N/A N/A N/A N/A +Ethernet8 N/A 6 1350.00 KB/s 9000.00/s N/A 100 10 N/A 60 13.37 MB/s 9000.00/s N/A N/A N/A N/A +""" + +intf_fec_counters = """\ + IFACE STATE FEC_CORR FEC_UNCORR FEC_SYMBOL_ERR +----------- ------- ---------- ------------ ---------------- + Ethernet0 D 130,402 3 4 + Ethernet8 N/A 110,412 1 0 + Ethernet16 N/A 100,317 0 0 """ intf_counters_period = """\ @@ -258,6 +266,21 @@ def test_show_intf_counters_all(self): assert return_code == 0 assert result == intf_counters_all + def test_show_intf_fec_counters(self): + runner = CliRunner() + result = runner.invoke( + show.cli.commands["interfaces"].commands["counters"].commands["fec-stats"], []) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == intf_fec_counters + + return_code, result = get_result_and_return_code('portstat -f') + print("return_code: {}".format(return_code)) + print("result = {}".format(result)) + assert return_code == 0 + assert result == intf_fec_counters + def test_show_intf_counters_period(self): runner = CliRunner() result = runner.invoke(show.cli.commands["interfaces"].commands["counters"], [ From 419f739566745dfd1db16d902b9fc610a584819a Mon Sep 17 00:00:00 2001 From: Prince George Date: Wed, 3 Aug 2022 04:40:32 +0000 Subject: [PATCH 5/7] Fix test failure --- scripts/portstat | 5 +---- tests/portstat_test.py | 46 +++++++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/scripts/portstat b/scripts/portstat index 37525292d9..8323da17a8 100755 --- a/scripts/portstat +++ b/scripts/portstat @@ -290,10 +290,7 @@ class Portstat(object): format_util(rates.tx_bps, port_speed), format_number_with_comma(data.tx_err), format_number_with_comma(data.tx_drop), - format_number_with_comma(data.tx_ovr), - format_number_with_comma(data.fec_corr), - format_number_with_comma(data.fec_uncorr), - format_number_with_comma(data.fec_symbol_err))) + format_number_with_comma(data.tx_ovr))) elif errors_only: header = header_errors_only table.append((key, self.get_port_state(key), diff --git a/tests/portstat_test.py b/tests/portstat_test.py index 5706813cce..1a54666174 100644 --- a/tests/portstat_test.py +++ b/tests/portstat_test.py @@ -35,11 +35,11 @@ """ intf_fec_counters = """\ - IFACE STATE FEC_CORR FEC_UNCORR FEC_SYMBOL_ERR ------------ ------- ---------- ------------ ---------------- - Ethernet0 D 130,402 3 4 - Ethernet8 N/A 110,412 1 0 - Ethernet16 N/A 100,317 0 0 + IFACE STATE FEC_CORR FEC_UNCORR FEC_SYMBOL_ERR +--------- ------- ---------- ------------ ---------------- +Ethernet0 D 130,402 3 4 +Ethernet4 N/A 110,412 1 0 +Ethernet8 N/A 100,317 0 0 """ intf_counters_period = """\ @@ -88,30 +88,30 @@ """ multi_asic_external_intf_counters_printall = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR ---------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ------------ -Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A -Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR +--------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- +Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A +Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A """ multi_asic_intf_counters_printall = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR --------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ------------ - Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A - Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A - Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A - Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A -Ethernet-BP256 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A -Ethernet-BP260 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR +-------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- + Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A + Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A + Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A + Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A +Ethernet-BP256 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A +Ethernet-BP260 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A """ multi_asic_intf_counters_asic0_printall = """\ - IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR FEC_CORR FEC_UNCORR ------------- ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- ---------- ------------ - Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A - Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A -Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A -Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A N/A N/A + IFACE STATE RX_OK RX_BPS RX_PPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_PPS TX_UTIL TX_ERR TX_DRP TX_OVR +------------ ------- ------- -------- -------- --------- -------- -------- -------- ------- -------- -------- --------- -------- -------- -------- + Ethernet0 U 8 0.00 B/s 0.00/s 0.00% 10 100 N/A 10 0.00 B/s 0.00/s 0.00% N/A N/A N/A + Ethernet4 U 4 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 40 0.00 B/s 0.00/s 0.00% N/A N/A N/A +Ethernet-BP0 U 6 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 60 0.00 B/s 0.00/s 0.00% N/A N/A N/A +Ethernet-BP4 U 8 0.00 B/s 0.00/s 0.00% 0 1,000 N/A 80 0.00 B/s 0.00/s 0.00% N/A N/A N/A """ multi_asic_intf_counters_period = """\ The rates are calculated within 3 seconds period From 978900c8eaf6b9747b933b466d25fe6cfb28c400 Mon Sep 17 00:00:00 2001 From: Prince George Date: Wed, 3 Aug 2022 17:11:14 +0000 Subject: [PATCH 6/7] Fix LGTM warning --- scripts/portstat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/portstat b/scripts/portstat index 8323da17a8..3c3c5117f3 100755 --- a/scripts/portstat +++ b/scripts/portstat @@ -632,7 +632,7 @@ Examples: # Now decide what information to display if raw_stats: - portstat.cnstat_print(cnstat_dict, ratestat_dict, intf_list, use_json, print_all, errors_only, rates_only) + portstat.cnstat_print(cnstat_dict, ratestat_dict, intf_list, use_json, print_all, errors_only, fec_stats_only, rates_only) sys.exit(0) if save_fresh_stats: From 9793384f26bd4082c3c4041d91659dd1a5c0bb6c Mon Sep 17 00:00:00 2001 From: Prince George Date: Thu, 4 Aug 2022 00:49:31 +0000 Subject: [PATCH 7/7] Improve code coveraged --- tests/portstat_test.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/portstat_test.py b/tests/portstat_test.py index 1a54666174..2a70d0befc 100644 --- a/tests/portstat_test.py +++ b/tests/portstat_test.py @@ -42,6 +42,15 @@ Ethernet8 N/A 100,317 0 0 """ +intf_fec_counters_period = """\ +The rates are calculated within 3 seconds period + IFACE STATE FEC_CORR FEC_UNCORR FEC_SYMBOL_ERR +--------- ------- ---------- ------------ ---------------- +Ethernet0 D 0 0 0 +Ethernet4 N/A 0 0 0 +Ethernet8 N/A 0 0 0 +""" + intf_counters_period = """\ The rates are calculated within 3 seconds period IFACE STATE RX_OK RX_BPS RX_UTIL RX_ERR RX_DRP RX_OVR TX_OK TX_BPS TX_UTIL TX_ERR TX_DRP TX_OVR @@ -281,6 +290,24 @@ def test_show_intf_fec_counters(self): assert return_code == 0 assert result == intf_fec_counters + def test_show_intf_fec_counters_period(self): + runner = CliRunner() + result = runner.invoke(show.cli.commands["interfaces"].commands["counters"].commands["fec-stats"], + ["-p {}".format(TEST_PERIOD)]) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert result.output == intf_fec_counters_period + + return_code, result = get_result_and_return_code( + 'portstat -f -p {}'.format(TEST_PERIOD)) + print("return_code: {}".format(return_code)) + print("result = {}".format(result)) + assert return_code == 0 + assert result == intf_fec_counters_period + + + def test_show_intf_counters_period(self): runner = CliRunner() result = runner.invoke(show.cli.commands["interfaces"].commands["counters"], [