diff --git a/sonic-xcvrd/tests/media_settings.json b/sonic-xcvrd/tests/media_settings.json index 8bdc0e7aa..35f0313d1 100644 --- a/sonic-xcvrd/tests/media_settings.json +++ b/sonic-xcvrd/tests/media_settings.json @@ -436,6 +436,28 @@ "lane3":"0x144808" } } + }, + "33": { + "fiber": { + "speed:50G": { + "preemphasis": { + "lane0":"0x144808", + "lane1":"0x144808", + "lane2":"0x144808", + "lane3":"0x144808" + } + } + }, + "copper": { + "speed:50G": { + "preemphasis": { + "lane0":"0x144808", + "lane1":"0x144808", + "lane2":"0x144808", + "lane3":"0x144808" + } + } + } } } } diff --git a/sonic-xcvrd/tests/test_xcvrd.py b/sonic-xcvrd/tests/test_xcvrd.py index 43ccfbb10..6cf294015 100644 --- a/sonic-xcvrd/tests/test_xcvrd.py +++ b/sonic-xcvrd/tests/test_xcvrd.py @@ -49,6 +49,10 @@ global_media_settings = media_settings_with_comma_dict['GLOBAL_MEDIA_SETTINGS'].pop('1-32') media_settings_with_comma_dict['GLOBAL_MEDIA_SETTINGS']['1-5,6,7-20,21-32'] = global_media_settings +port_settings_with_comma_dict = copy.deepcopy(media_settings_dict) +port_media_settings = port_settings_with_comma_dict['PORT_MEDIA_SETTINGS'].pop('33') +port_settings_with_comma_dict['PORT_MEDIA_SETTINGS']['33'] = port_media_settings + media_settings_with_regular_expression_dict = copy.deepcopy(media_settings_dict) media_settings_with_regular_expression_dict['GLOBAL_MEDIA_SETTINGS']['1-32'] = {} # Generate regular expression patterns for QSFP28-40GBASE-CR4-xxM and QSFP+-40GBASE-CR4-xxM that have the same pre-emphasis value @@ -1227,18 +1231,21 @@ def test_get_media_settings_key(self, mock_is_cmis_api, mock_chassis): 'cable_type': 'Length Cable Assembly(m)', 'cable_length': '255', 'specification_compliance': "{'10/40G Ethernet Compliance Code': '10GBase-SR'}", - 'type_abbrv_name': 'QSFP+' + 'type_abbrv_name': 'QSFP+', + 'media_type_key': 'fiber' } } # Test a good 'specification_compliance' value result = media_settings_parser.get_media_settings_key(0, xcvr_info_dict, 100000, 2) - assert result == { 'vendor_key': 'MOLEX-1064141421', 'media_key': 'QSFP+-10GBase-SR-255M', 'lane_speed_key': 'speed:50G', 'medium_lane_speed_key': 'COPPER50'} + assert result == { 'vendor_key': 'MOLEX-1064141421', 'media_key': 'QSFP+-10GBase-SR-255M', 'lane_speed_key': 'speed:50G', 'medium_lane_speed_key': 'COPPER50', 'media_type_key': 'fiber'} + # Test a bad 'specification_compliance' value xcvr_info_dict[0]['specification_compliance'] = 'N/A' + xcvr_info_dict[0]['media_type_key'] = 'copper' result = media_settings_parser.get_media_settings_key(0, xcvr_info_dict, 100000, 2) - assert result == { 'vendor_key': 'MOLEX-1064141421', 'media_key': 'QSFP+-*', 'lane_speed_key': 'speed:50G', 'medium_lane_speed_key': 'COPPER50'} + assert result == { 'vendor_key': 'MOLEX-1064141421', 'media_key': 'QSFP+-*', 'lane_speed_key': 'speed:50G', 'medium_lane_speed_key': 'COPPER50', 'media_type_key': 'copper'} # TODO: Ensure that error message was logged xcvr_info_dict_for_qsfp28 = { @@ -1260,6 +1267,7 @@ def test_get_media_settings_key(self, mock_is_cmis_api, mock_chassis): "vendor_date": "2020-11-11", "vendor_oui": "00-77-7a", "application_advertisement": "N/A", + "media_type_key": 'copper', } } result = media_settings_parser.get_media_settings_key( @@ -1270,6 +1278,7 @@ def test_get_media_settings_key(self, mock_is_cmis_api, mock_chassis): "media_key": "QSFP28-100GBASE-SR4 or 25GBASE-SR-50.0M", "lane_speed_key": "speed:25G", "medium_lane_speed_key": "COPPER25", + 'media_type_key': 'copper', } mock_is_cmis_api.return_value = True @@ -1280,7 +1289,8 @@ def test_get_media_settings_key(self, mock_is_cmis_api, mock_chassis): 'cable_type': 'Length Cable Assembly(m)', 'cable_length': '255', 'specification_compliance': "sm_media_interface", - 'type_abbrv_name': 'QSFP-DD' + 'type_abbrv_name': 'QSFP-DD', + "media_type_key": 'copper' } } @@ -1297,7 +1307,7 @@ def test_get_media_settings_key(self, mock_is_cmis_api, mock_chassis): mock_api.get_application_advertisement = MagicMock(return_value=mock_app_adv_value) result = media_settings_parser.get_media_settings_key(0, xcvr_info_dict, 100000, 2) - assert result == { 'vendor_key': 'MOLEX-1064141421', 'media_key': 'QSFP-DD-sm_media_interface', 'lane_speed_key': 'speed:100GBASE-CR2', 'medium_lane_speed_key': 'COPPER50' } + assert result == { 'vendor_key': 'MOLEX-1064141421', 'media_key': 'QSFP-DD-sm_media_interface', 'lane_speed_key': 'speed:100GBASE-CR2', 'medium_lane_speed_key': 'COPPER50','media_type_key': 'copper'} @pytest.mark.parametrize("data_found, data, expected", [ (True, [('speed', '400000'), ('lanes', '1,2,3,4,5,6,7,8'), ('mtu', '9100')], (400000, 8, 0)), @@ -1401,7 +1411,8 @@ def test_is_si_per_speed_supported(self): (media_settings_with_regular_expression_dict, 7, {'vendor_key': 'UNKOWN', 'media_key': 'QSFP+-40GBASE-CR4-2M', 'lane_speed_key': 'UNKOWN','medium_lane_speed_key': 'COPPER50'}, {'preemphasis': {'lane0': '0x18420A', 'lane1': '0x18420A', 'lane2': '0x18420A', 'lane3': '0x18420A'}}), (media_settings_with_regular_expression_dict, 7, {'vendor_key': 'UNKOWN', 'media_key': 'QSFP+-40GBASE-CR4-10M', 'lane_speed_key': 'UNKOWN', 'medium_lane_speed_key': 'COPPER50'}, {'preemphasis': {'lane0': '0x1A400A', 'lane1': '0x1A400A', 'lane2': '0x1A400A', 'lane3': '0x1A400A'}}), (media_settings_global_medium_lane_key, 7, {'vendor_key': 'MISSING', 'media_key': 'MISSING', 'lane_speed_key': 'MISSING', 'medium_lane_speed_key': 'COPPER50'}, {'idriver': {'lane0': '0x0000000d', 'lane1': '0x0000000d', 'lane2': '0x0000000d', 'lane3': '0x0000000d'}, 'pre1': {'lane0': '0x0000000d', 'lane1': '0x0000000d', 'lane2': '0x0000000d', 'lane3': '0x0000000d'}, 'ob_m2lp': {'lane0': '0x0000000d', 'lane1': '0x0000000d', 'lane2': '0x0000000d', 'lane3': '0x0000000d'}}), - (media_settings_port_medium_lane_key, 7, {'vendor_key': 'MISSING', 'media_key': 'MISSING', 'lane_speed_key': 'MISSING', 'medium_lane_speed_key': 'COPPER25'}, {'idriver': {'lane0': '0x0000000f', 'lane1': '0x0000000d', 'lane2': '0x0000000d', 'lane3': '0x0000000d'}, 'pre1': {'lane0': '0x0000000d', 'lane1': '0x0000000d', 'lane2': '0x0000000d', 'lane3': '0x0000000d'}, 'ob_m2lp': {'lane0': '0x0000000d', 'lane1': '0x0000000d', 'lane2': '0x0000000d', 'lane3': '0x0000000d'}}), + (media_settings_port_medium_lane_key, 7, {'vendor_key': 'MISSING', 'media_key': 'MISSING', 'lane_speed_key': 'MISSING', 'medium_lane_speed_key': 'COPPER25'}, {'idriver': {'lane0': '0x0000000f', 'lane1': '0x0000000d', 'lane2': '0x0000000d', 'lane3': '0x0000000d'}, 'pre1': {'lane0': '0x0000000d', 'lane1': '0x0000000d', 'lane2': '0x0000000d', 'lane3': '0x0000000d'}, 'ob_m2lp': {'lane0': '0x0000000d', 'lane1': '0x0000000d', 'lane2': '0x0000000d', 'lane3': '0x0000000d'}}), + (port_settings_with_comma_dict, 33, {'vendor_key': 'UNKOWN', 'media_key': 'UNKOWN', 'lane_speed_key': 'speed:50G', 'medium_lane_speed_key': 'COPPER25', 'media_type_key': 'fiber'}, {'preemphasis': {'lane0': '0x144808', 'lane1': '0x144808', 'lane2': '0x144808', 'lane3': '0x144808'}}) ]) def test_get_media_settings_value(self, media_settings_dict, port, key, expected): with patch('xcvrd.xcvrd_utilities.media_settings_parser.g_dict', media_settings_dict): diff --git a/sonic-xcvrd/xcvrd/xcvrd_utilities/media_settings_parser.py b/sonic-xcvrd/xcvrd/xcvrd_utilities/media_settings_parser.py index 7428019eb..fc74d39e7 100644 --- a/sonic-xcvrd/xcvrd/xcvrd_utilities/media_settings_parser.py +++ b/sonic-xcvrd/xcvrd/xcvrd_utilities/media_settings_parser.py @@ -20,6 +20,7 @@ MEDIA_KEY = 'media_key' LANE_SPEED_KEY = 'lane_speed_key' MEDIUM_LANE_SPEED_KEY = 'medium_lane_speed_key' +MEDIA_TYPE_KEY = 'media_type_key' DEFAULT_KEY = 'Default' # This is useful if default value is desired when no match is found for lane speed key LANE_SPEED_DEFAULT_KEY = LANE_SPEED_KEY_PREFIX + DEFAULT_KEY @@ -146,6 +147,20 @@ def get_media_settings_key(physical_port, transceiver_dict, port_speed, lane_cou else: media_key += '-' + '*' + media_type_ex = "fiber" + try: + if (type(media_len) != int) and (type(media_len) != float): + media_len = None + for key, value in transceiver_dict[physical_port].items(): + if type(value) != str: + continue + if value.lower().find("copper") >=0: + media_type_ex = "copper" + break + except Exception as e: + helper_logger.log_error("Invalid value for port {}: {}".format(physical_port, str(e))) + helper_logger.log_error("media_type {}".format(media_type_ex)) + lane_speed_key = get_lane_speed_key(physical_port, port_speed, lane_count) medium = "COPPER" if get_is_copper(physical_port) else "OPTICAL" speed = int(int(int(port_speed) /lane_count)/1000) @@ -155,7 +170,8 @@ def get_media_settings_key(physical_port, transceiver_dict, port_speed, lane_cou VENDOR_KEY: vendor_key, MEDIA_KEY: media_key, LANE_SPEED_KEY: lane_speed_key, - MEDIUM_LANE_SPEED_KEY: medium_lane_speed_key + MEDIUM_LANE_SPEED_KEY: medium_lane_speed_key, + MEDIA_TYPE_KEY: media_type_ex } @@ -277,6 +293,7 @@ def get_media_settings(key, media_dict): for keys in g_dict[PORT_MEDIA_SETTINGS_KEY]: if int(keys) == physical_port: media_dict = g_dict[PORT_MEDIA_SETTINGS_KEY][keys] + helper_logger.log_notice("port {} media_dict {}".format(physical_port, media_dict)) break if len(media_dict) == 0: @@ -294,6 +311,14 @@ def get_media_settings(key, media_dict): return get_media_settings_for_speed(media_dict[DEFAULT_KEY], lane_speed_key) elif len(default_dict) != 0: return default_dict + else: + if "copper" in key[MEDIA_TYPE_KEY]: + media_dict = media_dict["copper"] + else: + media_dict = media_dict["fiber"] + helper_logger.log_notice("media_settings lane speed {}".format(lane_speed_key)) + helper_logger.log_notice("port {} media_dict {}".format(physical_port, media_dict)) + return get_media_settings_for_speed(media_dict, lane_speed_key) else: if len(default_dict) != 0: return default_dict