From 2a16b144f651f48097fa3940b6991ba78a7e8046 Mon Sep 17 00:00:00 2001 From: vaibhav-dahiya Date: Fri, 19 Feb 2021 20:22:20 +0000 Subject: [PATCH 1/7] [show] add support for show muxcable cableinfo Signed-off-by: vaibhav-dahiya --- show/muxcable.py | 33 +++++++++++++++++++++ utilities_common/platform_sfputil_helper.py | 10 +++++++ 2 files changed, 43 insertions(+) diff --git a/show/muxcable.py b/show/muxcable.py index 07443080ef..20d1f219c0 100644 --- a/show/muxcable.py +++ b/show/muxcable.py @@ -381,3 +381,36 @@ def eyeinfo(port, target): lane_data.append(res) click.echo(tabulate(lane_data, headers=headers)) sys.exit(EXIT_SUCCESS) + +@muxcable.command() +@click.argument('port', required=True, default=None) +def cableinfo(port): + """Show muxcable cable information""" + + if platform_sfputil is not None: + physical_port_list = platform_sfputil_helper.logical_port_name_to_physical_port_list(port) + + if not isinstance(physical_port_list, list): + click.echo("ERR: Unable to get a port on muxcable port") + sys.exit(EXIT_FAIL) + if len(physical_port_list) != 1: + click.echo("ERR: Unable to get a single port on muxcable") + sys.exit(EXIT_FAIL) + + physical_port = physical_port_list[0] + import sonic_y_cable.y_cable + res = sonic_y_cable.y_cable.get_pn_number_and_vendor_name(physical_port) + if res == False or res == -1: + click.echo("ERR: Unable to get cable info") + sys.exit(EXIT_FAIL) + headers = ['pin_number', 'vendor_name'] + lane_data = [] + pin = str(res[0].decode()) + vendor = str(res[1].decode()) + temp_list = [] + + temp_list.append(pin) + temp_list.append(vendor) + lane_data.append(temp_list) + click.echo(tabulate(lane_data, headers=headers)) + sys.exit(EXIT_SUCCESS) diff --git a/utilities_common/platform_sfputil_helper.py b/utilities_common/platform_sfputil_helper.py index 87f0863e9a..fbacdd4126 100644 --- a/utilities_common/platform_sfputil_helper.py +++ b/utilities_common/platform_sfputil_helper.py @@ -37,3 +37,13 @@ def platform_sfputil_read_porttab_mappings(): sys.exit(1) return 0 + +def logical_port_name_to_physical_port_list(port_name): + if port_name.startswith("Ethernet"): + if platform_sfputil.is_logical_port(port_name): + return platform_sfputil.get_logical_to_physical(port_name) + else: + click.echo("Invalid port '{}'".format(port_name)) + return None + else: + return [int(port_name)] From 51e0e080412acded34a220bfa0389d0da620c32a Mon Sep 17 00:00:00 2001 From: vaibhav-dahiya Date: Mon, 22 Feb 2021 18:11:35 +0000 Subject: [PATCH 2/7] add unit tests Signed-off-by: vaibhav-dahiya --- tests/muxcable_test.py | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/muxcable_test.py b/tests/muxcable_test.py index f6f35e7b8c..8d5cd62c80 100644 --- a/tests/muxcable_test.py +++ b/tests/muxcable_test.py @@ -13,6 +13,9 @@ sys.modules['sonic_y_cable'] = mock.Mock() sys.modules['y_cable'] = mock.Mock() sys.modules['sonic_y_cable.y_cable'] = mock.Mock() +sys.modules['platform_sfputil'] = mock.Mock() +sys.modules['platform_sfputil_helper'] = mock.Mock() +sys.modules['utilities_common.platform_sfputil_helper'] = mock.Mock() #sys.modules['os'] = mock.Mock() #sys.modules['os.geteuid'] = mock.Mock() #sys.modules['platform_sfputil'] = mock.Mock() @@ -487,6 +490,51 @@ def test_config_muxcable_disable_loopback(self): assert result.exit_code == 100 + @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(bytearray(b'CACL1X321P2PA1M'), bytearray(b'Credo ')))) + @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) + @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=[0])) + def test_show_muxcable_cableinfo(self): + runner = CliRunner() + db = Db() + + result = runner.invoke(show.cli.commands["muxcable"].commands["cableinfo"], + ["Ethernet0"], obj=db) + + assert result.exit_code == 0 + + @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(False))) + @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) + @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=[0])) + def test_show_muxcable_cableinfo_incorrect_port(self): + runner = CliRunner() + db = Db() + + result = runner.invoke(show.cli.commands["muxcable"].commands["cableinfo"], + ["Ethernet0"], obj=db) + assert result.exit_code == 1 + + @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(False))) + @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) + @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=0)) + def test_show_muxcable_cableinfo_incorrect_port_return_value(self): + runner = CliRunner() + db = Db() + + result = runner.invoke(show.cli.commands["muxcable"].commands["cableinfo"], + ["Ethernet0"], obj=db) + assert result.exit_code == 1 + + @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(False))) + @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) + @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=[0,1])) + def test_show_muxcable_cableinfo_incorrect_logical_port_return_value(self): + runner = CliRunner() + db = Db() + + result = runner.invoke(show.cli.commands["muxcable"].commands["cableinfo"], + ["Ethernet0"], obj=db) + assert result.exit_code == 1 + @classmethod def teardown_class(cls): os.environ['UTILITIES_UNIT_TESTING'] = "0" From d9181beaab6d091545875cab7e7465ca7e691330 Mon Sep 17 00:00:00 2001 From: vaibhav-dahiya Date: Mon, 22 Feb 2021 19:21:17 +0000 Subject: [PATCH 3/7] add some output comparsion in unit tests Signed-off-by: vaibhav-dahiya --- tests/muxcable_test.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/muxcable_test.py b/tests/muxcable_test.py index 8d5cd62c80..e45fa2fd8e 100644 --- a/tests/muxcable_test.py +++ b/tests/muxcable_test.py @@ -156,6 +156,13 @@ } """ +expected_muxcable_cableinfo_output = """\ +pin_number vendor_name +--------------- ------------- +CACL1X321P2PA1M Credo +""" + + class TestMuxcable(object): @classmethod @@ -501,6 +508,7 @@ def test_show_muxcable_cableinfo(self): ["Ethernet0"], obj=db) assert result.exit_code == 0 + assert result.output == expected_muxcable_cableinfo_output @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(False))) @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) From c0baa6b850bf8c41d983887062830392bda820a2 Mon Sep 17 00:00:00 2001 From: vaibhav-dahiya Date: Mon, 22 Feb 2021 19:23:56 +0000 Subject: [PATCH 4/7] align pep8 Signed-off-by: vaibhav-dahiya --- tests/muxcable_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/muxcable_test.py b/tests/muxcable_test.py index e45fa2fd8e..16253712ff 100644 --- a/tests/muxcable_test.py +++ b/tests/muxcable_test.py @@ -163,7 +163,6 @@ """ - class TestMuxcable(object): @classmethod def setup_class(cls): @@ -534,7 +533,7 @@ def test_show_muxcable_cableinfo_incorrect_port_return_value(self): @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(False))) @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) - @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=[0,1])) + @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=[0, 1])) def test_show_muxcable_cableinfo_incorrect_logical_port_return_value(self): runner = CliRunner() db = Db() From 86c6b1c227c10f11918fb8ea471f65a7a8b90cd6 Mon Sep 17 00:00:00 2001 From: vaibhav-dahiya Date: Thu, 25 Feb 2021 03:11:32 +0000 Subject: [PATCH 5/7] align with newer y_cable API's Signed-off-by: vaibhav-dahiya --- show/muxcable.py | 16 +++++++++------- tests/muxcable_test.py | 18 +++++++++++------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/show/muxcable.py b/show/muxcable.py index 20d1f219c0..f14b2c5791 100644 --- a/show/muxcable.py +++ b/show/muxcable.py @@ -399,18 +399,20 @@ def cableinfo(port): physical_port = physical_port_list[0] import sonic_y_cable.y_cable - res = sonic_y_cable.y_cable.get_pn_number_and_vendor_name(physical_port) - if res == False or res == -1: - click.echo("ERR: Unable to get cable info") + part = sonic_y_cable.y_cable.get_part_number(physical_port) + if part == False or part == -1: + click.echo("ERR: Unable to get cable info part number") + sys.exit(EXIT_FAIL) + vendor = sonic_y_cable.y_cable.get_vendor(physical_port) + if vendor == False or vendor == -1: + click.echo("ERR: Unable to get cable info vendor name") sys.exit(EXIT_FAIL) - headers = ['pin_number', 'vendor_name'] + headers = ['Vendor', 'Model'] lane_data = [] - pin = str(res[0].decode()) - vendor = str(res[1].decode()) temp_list = [] - temp_list.append(pin) temp_list.append(vendor) + temp_list.append(part) lane_data.append(temp_list) click.echo(tabulate(lane_data, headers=headers)) sys.exit(EXIT_SUCCESS) diff --git a/tests/muxcable_test.py b/tests/muxcable_test.py index 16253712ff..80968ec574 100644 --- a/tests/muxcable_test.py +++ b/tests/muxcable_test.py @@ -157,9 +157,9 @@ """ expected_muxcable_cableinfo_output = """\ -pin_number vendor_name ---------------- ------------- -CACL1X321P2PA1M Credo +Vendor Model +-------- --------------- +Credo CACL1X321P2PA1M """ @@ -496,7 +496,8 @@ def test_config_muxcable_disable_loopback(self): assert result.exit_code == 100 - @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(bytearray(b'CACL1X321P2PA1M'), bytearray(b'Credo ')))) + @mock.patch('sonic_y_cable.y_cable.get_part_number', mock.MagicMock(return_value=("CACL1X321P2PA1M"))) + @mock.patch('sonic_y_cable.y_cable.get_vendor', mock.MagicMock(return_value=("Credo "))) @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=[0])) def test_show_muxcable_cableinfo(self): @@ -509,7 +510,8 @@ def test_show_muxcable_cableinfo(self): assert result.exit_code == 0 assert result.output == expected_muxcable_cableinfo_output - @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(False))) + @mock.patch('sonic_y_cable.y_cable.get_part_number', mock.MagicMock(return_value=(False))) + @mock.patch('sonic_y_cable.y_cable.get_vendor', mock.MagicMock(return_value=(False))) @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=[0])) def test_show_muxcable_cableinfo_incorrect_port(self): @@ -520,7 +522,8 @@ def test_show_muxcable_cableinfo_incorrect_port(self): ["Ethernet0"], obj=db) assert result.exit_code == 1 - @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(False))) + @mock.patch('sonic_y_cable.y_cable.get_part_number', mock.MagicMock(return_value=(False))) + @mock.patch('sonic_y_cable.y_cable.get_vendor', mock.MagicMock(return_value=(False))) @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=0)) def test_show_muxcable_cableinfo_incorrect_port_return_value(self): @@ -531,7 +534,8 @@ def test_show_muxcable_cableinfo_incorrect_port_return_value(self): ["Ethernet0"], obj=db) assert result.exit_code == 1 - @mock.patch('sonic_y_cable.y_cable.get_pn_number_and_vendor_name', mock.MagicMock(return_value=(False))) + @mock.patch('sonic_y_cable.y_cable.get_part_number', mock.MagicMock(return_value=(False))) + @mock.patch('sonic_y_cable.y_cable.get_vendor', mock.MagicMock(return_value=(False))) @mock.patch('show.muxcable.platform_sfputil', mock.MagicMock(return_value=1)) @mock.patch('utilities_common.platform_sfputil_helper.logical_port_name_to_physical_port_list', mock.MagicMock(return_value=[0, 1])) def test_show_muxcable_cableinfo_incorrect_logical_port_return_value(self): From d79794a1b0a201c21ccf1256fda016f5283f6893 Mon Sep 17 00:00:00 2001 From: vaibhav-dahiya Date: Thu, 25 Feb 2021 04:28:06 +0000 Subject: [PATCH 6/7] fix the comments Signed-off-by: vaibhav-dahiya --- show/muxcable.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/show/muxcable.py b/show/muxcable.py index f14b2c5791..d727331737 100644 --- a/show/muxcable.py +++ b/show/muxcable.py @@ -399,8 +399,8 @@ def cableinfo(port): physical_port = physical_port_list[0] import sonic_y_cable.y_cable - part = sonic_y_cable.y_cable.get_part_number(physical_port) - if part == False or part == -1: + part_num = sonic_y_cable.y_cable.get_part_number(physical_port) + if part_num == False or part_num == -1: click.echo("ERR: Unable to get cable info part number") sys.exit(EXIT_FAIL) vendor = sonic_y_cable.y_cable.get_vendor(physical_port) @@ -408,11 +408,6 @@ def cableinfo(port): click.echo("ERR: Unable to get cable info vendor name") sys.exit(EXIT_FAIL) headers = ['Vendor', 'Model'] - lane_data = [] - temp_list = [] - temp_list.append(vendor) - temp_list.append(part) - lane_data.append(temp_list) - click.echo(tabulate(lane_data, headers=headers)) - sys.exit(EXIT_SUCCESS) + body = [[vendor, part_num]] + click.echo(tabulate(body, headers=headers)) From b7d35ba7b63a6068dba447d72b033653809492ae Mon Sep 17 00:00:00 2001 From: vaibhav-dahiya Date: Thu, 25 Feb 2021 04:31:54 +0000 Subject: [PATCH 7/7] aligning pep8 Signed-off-by: vaibhav-dahiya --- show/muxcable.py | 1 + 1 file changed, 1 insertion(+) diff --git a/show/muxcable.py b/show/muxcable.py index d727331737..8df8dc11d8 100644 --- a/show/muxcable.py +++ b/show/muxcable.py @@ -382,6 +382,7 @@ def eyeinfo(port, target): click.echo(tabulate(lane_data, headers=headers)) sys.exit(EXIT_SUCCESS) + @muxcable.command() @click.argument('port', required=True, default=None) def cableinfo(port):