From c7ff5276d9906f9e7bd6d2230c672baf87a1d679 Mon Sep 17 00:00:00 2001 From: isabelmsft <67024108+isabelmsft@users.noreply.github.com> Date: Thu, 20 Jul 2023 15:56:47 -0700 Subject: [PATCH] [GCU] Update RDMA Platform Validator (#2913) --- .../field_operation_validators.py | 13 ++++++- .../gcu_field_operation_validators.conf.json | 17 ++++++++-- .../field_operation_validator_test.py | 34 ++++++++++++++++++- 3 files changed, 60 insertions(+), 4 deletions(-) diff --git a/generic_config_updater/field_operation_validators.py b/generic_config_updater/field_operation_validators.py index 72af9c8bd0..8f555d0c1a 100644 --- a/generic_config_updater/field_operation_validators.py +++ b/generic_config_updater/field_operation_validators.py @@ -31,9 +31,17 @@ def get_asic_name(): hwsku = output.rstrip('\n') if asic_type == 'mellanox' or asic_type == 'vs': spc1_hwskus = asic_mapping["mellanox_asics"]["spc1"] + spc2_hwskus = asic_mapping["mellanox_asics"]["spc2"] + spc3_hwskus = asic_mapping["mellanox_asics"]["spc3"] if hwsku.lower() in [spc1_hwsku.lower() for spc1_hwsku in spc1_hwskus]: asic = "spc1" return asic + if hwsku.lower() in [spc2_hwsku.lower() for spc2_hwsku in spc2_hwskus]: + asic = "spc2" + return asic + if hwsku.lower() in [spc3_hwsku.lower() for spc3_hwsku in spc3_hwskus]: + asic = "spc3" + return asic if asic_type == 'broadcom' or asic_type == 'vs': broadcom_asics = asic_mapping["broadcom_asics"] for asic_shorthand, hwskus in broadcom_asics.items(): @@ -75,7 +83,10 @@ def _get_fields_in_patch(): if 'value' in patch_element.keys() and isinstance(patch_element['value'], dict): for key in patch_element['value']: - cleaned_fields.append(cleaned_field+ '/' + key) + if len(cleaned_field) > 0: + cleaned_fields.append(cleaned_field + '/' + key) + else: + cleaned_fields.append(key) else: cleaned_fields.append(cleaned_field) diff --git a/generic_config_updater/gcu_field_operation_validators.conf.json b/generic_config_updater/gcu_field_operation_validators.conf.json index 2dcf1649b7..f598e0d300 100644 --- a/generic_config_updater/gcu_field_operation_validators.conf.json +++ b/generic_config_updater/gcu_field_operation_validators.conf.json @@ -17,7 +17,9 @@ "helper_data": { "rdma_config_update_validator": { "mellanox_asics": { - "spc1": [ "ACS-MSN2700", "ACS-MSN2740", "ACS-MSN2100", "ACS-MSN2410", "ACS-MSN2010", "Mellanox-SN2700", "Mellanox-SN2700-D48C8" ] + "spc1": [ "ACS-MSN2700", "ACS-MSN2740", "ACS-MSN2100", "ACS-MSN2410", "ACS-MSN2010", "Mellanox-SN2700", "Mellanox-SN2700-D48C8" ], + "spc2": [ "ACS-MSN3800", "Mellanox-SN3800-D112C8" ], + "spc3": [ "ACS-MSN4700", "ACS-MSN4600", "ACS-MSN4600C", "ACS-MSN4410", "Mellanox-SN4600C-D112C8", "Mellanox-SN4600C-C64" ] }, "broadcom_asics": { "th": [ "Force10-S6100", "Arista-7060CX-32S-C32", "Arista-7060CX-32S-C32-T1", "Arista-7060CX-32S-D48C8", "Celestica-DX010-C32", "Seastone-DX010" ], @@ -37,11 +39,14 @@ "restoration_time", "detection_time", "action", - "global/poll_interval" + "global/poll_interval", + "" ], "operations": ["remove", "add", "replace"], "platforms": { "spc1": "20181100", + "spc2": "20191100", + "spc3": "20220500", "td2": "20181100", "th": "20181100", "th2": "20181100", @@ -65,6 +70,8 @@ "operations": ["replace"], "platforms": { "spc1": "20191100", + "spc2": "20191100", + "spc3": "20220500", "td2": "", "th": "20221100", "th2": "20221100", @@ -86,6 +93,8 @@ "operations": ["replace"], "platforms": { "spc1": "20181100", + "spc2": "20191100", + "spc3": "20220500", "td2": "20181100", "th": "20181100", "th2": "20181100", @@ -100,6 +109,8 @@ "operations": ["replace"], "platforms": { "spc1": "20191100", + "spc2": "20191100", + "spc3": "20220500", "td2": "", "th": "20221100", "th2": "20221100", @@ -123,6 +134,8 @@ "operations": ["replace"], "platforms": { "spc1": "20181100", + "spc2": "20191100", + "spc3": "20220500", "td2": "20181100", "th": "20181100", "th2": "20181100", diff --git a/tests/generic_config_updater/field_operation_validator_test.py b/tests/generic_config_updater/field_operation_validator_test.py index 4ffe11d5bd..f381c593af 100644 --- a/tests/generic_config_updater/field_operation_validator_test.py +++ b/tests/generic_config_updater/field_operation_validator_test.py @@ -31,10 +31,26 @@ def test_rdma_config_update_validator_td3_asic_invalid_version(self): @patch("generic_config_updater.field_operation_validators.get_asic_name", mock.Mock(return_value="spc1")) @patch("os.path.exists", mock.Mock(return_value=True)) @patch("builtins.open", mock_open(read_data='{"tables": {"PFC_WD": {"validator_data": {"rdma_config_update_validator": {"PFCWD enable/disable": {"fields": ["detection_time", "action"], "operations": ["remove", "replace", "add"], "platforms": {"spc1": "20181100"}}}}}}}')) - def test_rdma_config_update_validator_spc_asic_valid_version(self): + def test_rdma_config_update_validator_spc_asic_valid_version_remove(self): patch_element = {"path": "/PFC_WD/Ethernet8/detection_time", "op": "remove"} assert generic_config_updater.field_operation_validators.rdma_config_update_validator(patch_element) == True + + @patch("sonic_py_common.device_info.get_sonic_version_info", mock.Mock(return_value={"build_version": "SONiC.20220530"})) + @patch("generic_config_updater.field_operation_validators.get_asic_name", mock.Mock(return_value="spc1")) + @patch("os.path.exists", mock.Mock(return_value=True)) + @patch("builtins.open", mock_open(read_data='{"tables": {"PFC_WD": {"validator_data": {"rdma_config_update_validator": {"PFCWD enable/disable": {"fields": ["detection_time", "restoration_time", "action"], "operations": ["remove", "replace", "add"], "platforms": {"spc1": "20181100"}}}}}}}')) + def test_rdma_config_update_validator_spc_asic_valid_version_add_pfcwd(self): + patch_element = {"path": "/PFC_WD/Ethernet8", "op": "add", "value": {"action": "drop", "detection_time": "300", "restoration_time": "200"}} + assert generic_config_updater.field_operation_validators.rdma_config_update_validator(patch_element) == True + @patch("sonic_py_common.device_info.get_sonic_version_info", mock.Mock(return_value={"build_version": "SONiC.20220530"})) + @patch("generic_config_updater.field_operation_validators.get_asic_name", mock.Mock(return_value="spc1")) + @patch("os.path.exists", mock.Mock(return_value=True)) + @patch("builtins.open", mock_open(read_data='{"tables": {"PFC_WD": {"validator_data": {"rdma_config_update_validator": {"PFCWD enable/disable": {"fields": ["detection_time", "action", ""], "operations": ["remove", "replace", "add"], "platforms": {"spc1": "20181100"}}}}}}}')) + def test_rdma_config_update_validator_spc_asic_valid_version(self): + patch_element = {"path": "/PFC_WD/Ethernet8", "op": "remove"} + assert generic_config_updater.field_operation_validators.rdma_config_update_validator(patch_element) == True + @patch("sonic_py_common.device_info.get_sonic_version_info", mock.Mock(return_value={"build_version": "SONiC.20220530"})) @patch("generic_config_updater.field_operation_validators.get_asic_name", mock.Mock(return_value="spc1")) @patch("os.path.exists", mock.Mock(return_value=True)) @@ -103,6 +119,22 @@ def test_get_asic_spc1(self, mock_popen, mock_get_sonic_version_info): mock_popen.return_value.communicate.return_value = ["Mellanox-SN2700-D48C8", 0] self.assertEqual(fov.get_asic_name(), "spc1") + @patch('sonic_py_common.device_info.get_sonic_version_info') + @patch('subprocess.Popen') + def test_get_asic_spc2(self, mock_popen, mock_get_sonic_version_info): + mock_get_sonic_version_info.return_value = {'asic_type': 'mellanox'} + mock_popen.return_value = mock.Mock() + mock_popen.return_value.communicate.return_value = ["ACS-MSN3800", 0] + self.assertEqual(fov.get_asic_name(), "spc2") + + @patch('sonic_py_common.device_info.get_sonic_version_info') + @patch('subprocess.Popen') + def test_get_asic_spc3(self, mock_popen, mock_get_sonic_version_info): + mock_get_sonic_version_info.return_value = {'asic_type': 'mellanox'} + mock_popen.return_value = mock.Mock() + mock_popen.return_value.communicate.return_value = ["Mellanox-SN4600C-C64", 0] + self.assertEqual(fov.get_asic_name(), "spc3") + @patch('sonic_py_common.device_info.get_sonic_version_info') @patch('subprocess.Popen') def test_get_asic_th(self, mock_popen, mock_get_sonic_version_info):