Skip to content

Bug: [PMON] "is_replaceable" field is missing from TRANSCEIVER_INFO table of CMIS cables and impacting SNMP test #22213

Open
@keboliu

Description

@keboliu

Is it platform specific

generic

Importance or Severity

Critical

Description of the bug

after PR sonic-net/sonic-platform-daemons#590 merged, it removed the "is_replaceable" field from the TRANSCEIVER_INFO table of CMIS cables.

This field is referred by SNMP implementation https://github.com/sonic-net/sonic-snmpagent/blob/25f9e4fa16e8f4789f770b4c93537bb2026c8ec5/src/sonic_ax_impl/mibs/ietf/rfc2737.py#L103

@unique
class XcvrInfoDB(str, Enum):
    """
    Transceiver info keys
    """
    TYPE              = "type"
    VENDOR_REVISION   = "vendor_rev"
    SERIAL_NUMBER     = "serial"
    MANUFACTURE_NAME  = "manufacturer"
    MODEL_NAME        = "model"
    REPLACEABLE       = 'is_replaceable'

and SNMP test test_transceiver_info is failing:
https://github.com/sonic-net/sonic-mgmt/blob/master/tests/snmp/test_snmp_phy_entity.py#L559

Steps to Reproduce

the issue can be reproduced with the master image including PR sonic-net/sonic-platform-daemons#590 on a switch with a CMIS cable plugged in.

Actual Behavior and Expected Behavior

"is_replaceable" filed missing from the table:

{
   "model":"MCP1660-W00AE30 ",
   "media_interface_code":"Copper cable",
   "active_apsel_hostlane6":"N/A",
   "ext_identifier":"Power Class 1 (0.25W Max)",
   "hardware_rev":"0.0",
   "active_apsel_hostlane3":"N/A",
   "host_lane_assignment_option":"1",
   "connector":"No separable connector",
   "host_electrical_interface":"N/A",
   "encoding":"N/A",
   "type_abbrv_name":"QSFP-DD",
   "active_apsel_hostlane8":"N/A",
   "active_apsel_hostlane5":"N/A",
   "media_interface_technology":"Copper cable unequalized",
   "media_lane_assignment_option":"N/A",
   "active_apsel_hostlane1":"N/A",
   "media_lane_count":"0",
   "vendor_oui":"00-02-c9",
   "ext_rateselect_compliance":"N/A",
   "vendor_rev":"A3",
   "cable_type":"Length Cable Assembly(m)",
   "host_lane_count":"8",
   "active_apsel_hostlane2":"N/A",
   "specification_compliance":"passive_copper_media_interface",
   "application_advertisement":"{1: {'host_electrical_interface_id': '400G CR8', 'module_media_interface_id': 'Copper cable', 'media_lane_count': 8, 'host_lane_count': 8, 'host_lane_assignment_options': 1}, 2: {'host_electrical_interface_id': '200GBASE-CR4 (Clause 136)', 'module_media_interface_id': 'Copper cable', 'media_lane_count': 4, 'host_lane_count': 4, 'host_lane_assignment_options': 17}, 3: {'host_electrical_interface_id': '100GBASE-CR2 (Clause 136)', 'module_media_interface_id': 'Copper cable', 'media_lane_count': 2, 'host_lane_count': 2, 'host_lane_assignment_options': 85}, 4: {'host_electrical_interface_id': '100GBASE-CR4 (Clause 92)', 'module_media_interface_id': 'Copper cable', 'media_lane_count': 4, 'host_lane_count': 4, 'host_lane_assignment_options': 17}, 5: {'host_electrical_interface_id': '50GBASE-CR (Clause 126)', 'module_media_interface_id': 'Copper cable', 'media_lane_count': 1, 'host_lane_count': 1, 'host_lane_assignment_options': 255}, 6: {'host_electrical_interface_id': '50GBASE-CR2 (Ethernet Technology Consortium) with no FEC', 'module_media_interface_id': 'Copper cable', 'media_lane_count': 2, 'host_lane_count': 2, 'host_lane_assignment_options': 85}, 7: {'host_electrical_interface_id': '25GBASE-CR CA-N (Clause 110)', 'module_media_interface_id': 'Copper cable', 'media_lane_count': 1, 'host_lane_count': 1, 'host_lane_assignment_options': 255}, 8: {'host_electrical_interface_id': '1000BASE -CX(Clause 39)', 'module_media_interface_id': 'Copper cable', 'media_lane_count': 1, 'host_lane_count': 1, 'host_lane_assignment_options': 255}}",
   "vendor_date":"2021-05-14   ",
   "serial":"MT2120VS03862   ",
   "type":"QSFP-DD Double Density 8X Pluggable Transceiver",
   "nominal_bit_rate":"N/A",
   "cmis_rev":"4.0",
   "active_apsel_hostlane4":"N/A",
   "manufacturer":"Mellanox        ",
   "vdm_supported":"False",
   "cable_length":"0.5",
   "active_apsel_hostlane7":"N/A"
}

Relevant log output

def test_transceiver_info(duthosts, enum_rand_one_per_hwsku_hostname, snmp_physical_entity_and_sensor_info):
        """
        Verify transceiver information in physical entity mib with redis database
        :param duthost: DUT host object
        :param snmp_physical_entity_info: Physical entity information from snmp fact
        :return:
        """
        snmp_physical_entity_info = snmp_physical_entity_and_sensor_info["entity_mib"]
        duthost = duthosts[enum_rand_one_per_hwsku_hostname]
        keys = redis_get_keys(duthost, STATE_DB, XCVR_KEY_TEMPLATE.format('*'))
        # Ignore the test if the platform does not have interfaces (e.g Supervisor)
        if not keys:
            pytest.skip('Transceiver information does not exist in DB, skipping this test')
        name_to_snmp_facts = {}
        for oid, values in list(snmp_physical_entity_info.items()):
            values['oid'] = oid
            name_to_snmp_facts[values['entPhysName']] = values
    
        transceiver_rev_key = "vendor_rev"
        release_list = ["201911", "202012", "202106", "202111"]
        if any(release in duthost.os_version for release in release_list):
            transceiver_rev_key = "hardware_rev"
    
        for key in keys:
            name = key.split(TABLE_NAME_SEPARATOR_VBAR)[-1]
            assert name in name_to_snmp_facts, 'Cannot find port {} in physical entity mib'.format(
                name)
            transceiver_info = redis_hgetall(duthost, STATE_DB, key)
            transceiver_snmp_fact = name_to_snmp_facts[name]
            assert transceiver_snmp_fact['entPhysDescr'] is not None
            assert transceiver_snmp_fact['entPhysContainedIn'] == CHASSIS_SUB_ID
            assert transceiver_snmp_fact['entPhysClass'] == PHYSICAL_CLASS_PORT
            assert transceiver_snmp_fact['entPhyParentRelPos'] == -1
            assert transceiver_snmp_fact['entPhysName'] == name
            assert transceiver_snmp_fact['entPhysHwVer'] == transceiver_info[transceiver_rev_key]
            assert transceiver_snmp_fact['entPhysFwVer'] == ''
            assert transceiver_snmp_fact['entPhysSwVer'] == ''
            assert transceiver_snmp_fact['entPhysSerialNum'] == transceiver_info['serial']
            assert transceiver_snmp_fact['entPhysMfgName'] == transceiver_info['manufacturer']
            assert transceiver_snmp_fact['entPhysModelName'] == transceiver_info['model']
>           assert transceiver_snmp_fact['entPhysIsFRU'] == REPLACEABLE if transceiver_info[
                'is_replaceable'] == 'True' else NOT_REPLACEABLE
E           KeyError: 'is_replaceable'

Output of show version, show techsupport

Attach files (if any)

No response

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions