예제 #1
0
    def get_transceiver_dom_info_dict(self, port_num):
        transceiver_dom_info_dict = {}

        dom_info_dict_keys = [
            'temperature',
            'voltage',
            'rx1power',
            'rx2power',
            'rx3power',
            'rx4power',
            'tx1bias',
            'tx2bias',
            'tx3bias',
            'tx4bias',
            'tx1power',
            'tx2power',
            'tx3power',
            'tx4power',
        ]
        transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A')

        if port_num in self.qsfp_ports:
            offset = 0
            offset_xcvr = 128
            file_path = self._get_port_eeprom_path(port_num,
                                                   self.IDENTITY_EEPROM_ADDR)
            if not self._sfp_eeprom_present(file_path, 0):
                return None

            try:
                sysfsfile_eeprom = io.open(file_path, mode="rb", buffering=0)
            except IOError:
                print("Error: reading sysfs file %s" % file_path)
                return None

            sfpd_obj = sff8436Dom()
            if sfpd_obj is None:
                return transceiver_dom_info_dict

            sfpi_obj = sff8436InterfaceId()
            if sfpi_obj is None:
                return transceiver_dom_info_dict

            # QSFP capability byte parse, through this byte can know whether it support tx_power or not.
            # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436,
            # need to add more code for determining the capability and version compliance
            # in SFF-8636 dom capability definitions evolving with the versions.
            qsfp_dom_capability_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET),
                XCVR_DOM_CAPABILITY_WIDTH)
            if qsfp_dom_capability_raw is not None:
                qspf_dom_capability_data = sfpi_obj.parse_qsfp_dom_capability(
                    qsfp_dom_capability_raw, 0)
            else:
                return transceiver_dom_info_dict

            dom_temperature_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset + QSFP_TEMPE_OFFSET),
                QSFP_TEMPE_WIDTH)
            if dom_temperature_raw is not None:
                dom_temperature_data = sfpd_obj.parse_temperature(
                    dom_temperature_raw, 0)
            else:
                return transceiver_dom_info_dict

            dom_voltage_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH)
            if dom_voltage_raw is not None:
                dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0)
            else:
                return transceiver_dom_info_dict

            qsfp_dom_rev_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset + QSFP_DOM_REV_OFFSET),
                QSFP_DOM_REV_WIDTH)
            if qsfp_dom_rev_raw is not None:
                qsfp_dom_rev_data = sfpd_obj.parse_sfp_dom_rev(
                    qsfp_dom_rev_raw, 0)
            else:
                return transceiver_dom_info_dict

            transceiver_dom_info_dict['temperature'] = dom_temperature_data[
                'data']['Temperature']['value']
            transceiver_dom_info_dict['voltage'] = dom_voltage_data['data'][
                'Vcc']['value']

            # The tx_power monitoring is only available on QSFP which compliant with SFF-8636
            # and claimed that it support tx_power with one indicator bit.
            dom_channel_monitor_data = {}
            qsfp_dom_rev = qsfp_dom_rev_data['data']['dom_rev']['value']
            qsfp_tx_power_support = qspf_dom_capability_data['data'][
                'Tx_power_support']['value']
            if (qsfp_dom_rev[0:8] != 'SFF-8636'
                    or (qsfp_dom_rev[0:8] == 'SFF-8636'
                        and qsfp_tx_power_support != 'on')):
                dom_channel_monitor_raw = self._read_eeprom_specific_bytes(
                    sysfsfile_eeprom, (offset + QSFP_CHANNL_MON_OFFSET),
                    QSFP_CHANNL_MON_WIDTH)
                if dom_channel_monitor_raw is not None:
                    dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(
                        dom_channel_monitor_raw, 0)
                else:
                    return transceiver_dom_info_dict

                transceiver_dom_info_dict['tx1power'] = 'N/A'
                transceiver_dom_info_dict['tx2power'] = 'N/A'
                transceiver_dom_info_dict['tx3power'] = 'N/A'
                transceiver_dom_info_dict['tx4power'] = 'N/A'
            else:
                dom_channel_monitor_raw = self._read_eeprom_specific_bytes(
                    sysfsfile_eeprom, (offset + QSFP_CHANNL_MON_OFFSET),
                    QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH)
                if dom_channel_monitor_raw is not None:
                    dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(
                        dom_channel_monitor_raw, 0)
                else:
                    return None

                transceiver_dom_info_dict[
                    'tx1power'] = dom_channel_monitor_data['data']['TX1Power'][
                        'value']
                transceiver_dom_info_dict[
                    'tx2power'] = dom_channel_monitor_data['data']['TX2Power'][
                        'value']
                transceiver_dom_info_dict[
                    'tx3power'] = dom_channel_monitor_data['data']['TX3Power'][
                        'value']
                transceiver_dom_info_dict[
                    'tx4power'] = dom_channel_monitor_data['data']['TX4Power'][
                        'value']

            try:
                sysfsfile_eeprom.close()
            except IOError:
                print("Error: closing sysfs file %s" % file_path)
                return None

            transceiver_dom_info_dict['temperature'] = dom_temperature_data[
                'data']['Temperature']['value']
            transceiver_dom_info_dict['voltage'] = dom_voltage_data['data'][
                'Vcc']['value']
            transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data[
                'data']['RX1Power']['value']
            transceiver_dom_info_dict['rx2power'] = dom_channel_monitor_data[
                'data']['RX2Power']['value']
            transceiver_dom_info_dict['rx3power'] = dom_channel_monitor_data[
                'data']['RX3Power']['value']
            transceiver_dom_info_dict['rx4power'] = dom_channel_monitor_data[
                'data']['RX4Power']['value']
            transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data[
                'data']['TX1Bias']['value']
            transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data[
                'data']['TX2Bias']['value']
            transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data[
                'data']['TX3Bias']['value']
            transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data[
                'data']['TX4Bias']['value']

        else:
            offset = 256
            file_path = self._get_port_eeprom_path(port_num,
                                                   self.DOM_EEPROM_ADDR)
            if not self._sfp_eeprom_present(file_path, 0):
                return None

        try:
            sysfsfile_eeprom = io.open(file_path, "rb", 0)
        except IOError:
            print("Error: reading sysfs file %s" % file_path)
            return None

        sfpd_obj = sff8472Dom(None, 1)
        if sfpd_obj is None:
            return transceiver_dom_info_dict

        dom_temperature_raw = self._read_eeprom_specific_bytes(
            sysfsfile_eeprom, (offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH)
        if dom_temperature_raw is not None:
            dom_temperature_data = sfpd_obj.parse_temperature(
                dom_temperature_raw, 0)
        else:
            return transceiver_dom_info_dict

        dom_voltage_raw = self._read_eeprom_specific_bytes(
            sysfsfile_eeprom, (offset + SFP_VOLT_OFFSET), SFP_VOLT_WIDTH)
        if dom_voltage_raw is not None:
            dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0)
        else:
            return transceiver_dom_info_dict

        dom_channel_monitor_raw = self._read_eeprom_specific_bytes(
            sysfsfile_eeprom, (offset + SFP_MODULE_THRESHOLD_OFFSET),
            SFP_MODULE_THRESHOLD_WIDTH)
        if dom_channel_monitor_raw is not None:
            dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(
                dom_channel_monitor_raw, 0)
        else:
            return transceiver_dom_info_dict

        try:
            sysfsfile_eeprom.close()
        except IOError:
            print("Error: closing sysfs file %s" % file_path)
            return None

        transceiver_dom_info_dict['temperature'] = dom_temperature_data[
            'data']['Temperature']['value']
        transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc'][
            'value']
        transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data[
            'data']['RXPower']['value']
        transceiver_dom_info_dict['rx2power'] = 'N/A'
        transceiver_dom_info_dict['rx3power'] = 'N/A'
        transceiver_dom_info_dict['rx4power'] = 'N/A'
        transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data[
            'data']['TXBias']['value']
        transceiver_dom_info_dict['tx2bias'] = 'N/A'
        transceiver_dom_info_dict['tx3bias'] = 'N/A'
        transceiver_dom_info_dict['tx4bias'] = 'N/A'
        transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data[
            'data']['TXPower']['value']
        transceiver_dom_info_dict['tx2power'] = 'N/A'
        transceiver_dom_info_dict['tx3power'] = 'N/A'
        transceiver_dom_info_dict['tx4power'] = 'N/A'

        return transceiver_dom_info_dict
예제 #2
0
    def get_transceiver_dom_threshold_info_dict(self, port_num):
        transceiver_dom_threshold_info_dict = {}
        dom_info_dict_keys = [
            'temphighalarm', 'temphighwarning', 'templowalarm',
            'templowwarning', 'vcchighalarm', 'vcchighwarning', 'vcclowalarm',
            'vcclowwarning', 'rxpowerhighalarm', 'rxpowerhighwarning',
            'rxpowerlowalarm', 'rxpowerlowwarning', 'txpowerhighalarm',
            'txpowerhighwarning', 'txpowerlowalarm', 'txpowerlowwarning',
            'txbiashighalarm', 'txbiashighwarning', 'txbiaslowalarm',
            'txbiaslowwarning'
        ]
        transceiver_dom_threshold_info_dict = dict.fromkeys(
            dom_info_dict_keys, 'N/A')

        if port_num in self.qsfp_ports:
            file_path = self._get_port_eeprom_path(port_num,
                                                   self.IDENTITY_EEPROM_ADDR)
            if not self._sfp_eeprom_present(file_path, 0):
                return None

            try:
                sysfsfile_eeprom = io.open(file_path, mode="rb", buffering=0)
            except IOError:
                print("Error: reading sysfs file %s" % file_path)
                return None

            sfpd_obj = sff8436Dom()
            if sfpd_obj is None:
                return transceiver_dom_threshold_info_dict

            # Dom Threshold data starts from offset 384
            # Revert offset back to 0 once data is retrieved
            offset = 384
            dom_module_threshold_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset + QSFP_MODULE_THRESHOLD_OFFSET),
                QSFP_MODULE_THRESHOLD_WIDTH)
            if dom_module_threshold_raw is not None:
                dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(
                    dom_module_threshold_raw, 0)
            else:
                return transceiver_dom_threshold_info_dict

            dom_channel_threshold_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset + QSFP_CHANNL_THRESHOLD_OFFSET),
                QSFP_CHANNL_THRESHOLD_WIDTH)
            if dom_channel_threshold_raw is not None:
                dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values(
                    dom_channel_threshold_raw, 0)
            else:
                return transceiver_dom_threshold_info_dict

            try:
                sysfsfile_eeprom.close()
            except IOError:
                print("Error: closing sysfs file %s" % file_path)
                return None

            # Threshold Data
            transceiver_dom_threshold_info_dict[
                'temphighalarm'] = dom_module_threshold_data['data'][
                    'TempHighAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'temphighwarning'] = dom_module_threshold_data['data'][
                    'TempHighWarning']['value']
            transceiver_dom_threshold_info_dict[
                'templowalarm'] = dom_module_threshold_data['data'][
                    'TempLowAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'templowwarning'] = dom_module_threshold_data['data'][
                    'TempLowWarning']['value']
            transceiver_dom_threshold_info_dict[
                'vcchighalarm'] = dom_module_threshold_data['data'][
                    'VccHighAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'vcchighwarning'] = dom_module_threshold_data['data'][
                    'VccHighWarning']['value']
            transceiver_dom_threshold_info_dict[
                'vcclowalarm'] = dom_module_threshold_data['data'][
                    'VccLowAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'vcclowwarning'] = dom_module_threshold_data['data'][
                    'VccLowWarning']['value']
            transceiver_dom_threshold_info_dict[
                'rxpowerhighalarm'] = dom_channel_threshold_data['data'][
                    'RxPowerHighAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'rxpowerhighwarning'] = dom_channel_threshold_data['data'][
                    'RxPowerHighWarning']['value']
            transceiver_dom_threshold_info_dict[
                'rxpowerlowalarm'] = dom_channel_threshold_data['data'][
                    'RxPowerLowAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'rxpowerlowwarning'] = dom_channel_threshold_data['data'][
                    'RxPowerLowWarning']['value']
            transceiver_dom_threshold_info_dict[
                'txbiashighalarm'] = dom_channel_threshold_data['data'][
                    'TxBiasHighAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'txbiashighwarning'] = dom_channel_threshold_data['data'][
                    'TxBiasHighWarning']['value']
            transceiver_dom_threshold_info_dict[
                'txbiaslowalarm'] = dom_channel_threshold_data['data'][
                    'TxBiasLowAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'txbiaslowwarning'] = dom_channel_threshold_data['data'][
                    'TxBiasLowWarning']['value']

        else:
            offset = 256
            file_path = self._get_port_eeprom_path(port_num,
                                                   self.DOM_EEPROM_ADDR)
            if not self._sfp_eeprom_present(file_path, 0):
                return None

            try:
                sysfsfile_eeprom = io.open(file_path, "rb", 0)
            except IOError:
                print("Error: reading sysfs file %s" % file_path)
                return None

            sfpd_obj = sff8472Dom(None, 1)
            if sfpd_obj is None:
                return transceiver_dom_threshold_info_dict

            dom_module_threshold_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset + SFP_MODULE_THRESHOLD_OFFSET),
                SFP_MODULE_THRESHOLD_WIDTH)

            if dom_module_threshold_raw is not None:
                dom_module_threshold_data = sfpd_obj.parse_alarm_warning_threshold(
                    dom_module_threshold_raw, 0)
            else:
                return transceiver_dom_threshold_info_dict

            try:
                sysfsfile_eeprom.close()
            except IOError:
                print("Error: closing sysfs file %s" % file_path)
                return None

            #Threshold Data
            transceiver_dom_threshold_info_dict[
                'temphighalarm'] = dom_module_threshold_data['data'][
                    'TempHighAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'templowalarm'] = dom_module_threshold_data['data'][
                    'TempLowAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'temphighwarning'] = dom_module_threshold_data['data'][
                    'TempHighWarning']['value']
            transceiver_dom_threshold_info_dict[
                'templowwarning'] = dom_module_threshold_data['data'][
                    'TempLowWarning']['value']
            transceiver_dom_threshold_info_dict[
                'vcchighalarm'] = dom_module_threshold_data['data'][
                    'VoltageHighAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'vcclowalarm'] = dom_module_threshold_data['data'][
                    'VoltageLowAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'vcchighwarning'] = dom_module_threshold_data['data'][
                    'VoltageHighWarning']['value']
            transceiver_dom_threshold_info_dict[
                'vcclowwarning'] = dom_module_threshold_data['data'][
                    'VoltageLowWarning']['value']
            transceiver_dom_threshold_info_dict[
                'txbiashighalarm'] = dom_module_threshold_data['data'][
                    'BiasHighAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'txbiaslowalarm'] = dom_module_threshold_data['data'][
                    'BiasLowAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'txbiashighwarning'] = dom_module_threshold_data['data'][
                    'BiasHighWarning']['value']
            transceiver_dom_threshold_info_dict[
                'txbiaslowwarning'] = dom_module_threshold_data['data'][
                    'BiasLowWarning']['value']
            transceiver_dom_threshold_info_dict[
                'txpowerhighalarm'] = dom_module_threshold_data['data'][
                    'TXPowerHighAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'txpowerlowalarm'] = dom_module_threshold_data['data'][
                    'TXPowerLowAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'txpowerhighwarning'] = dom_module_threshold_data['data'][
                    'TXPowerHighWarning']['value']
            transceiver_dom_threshold_info_dict[
                'txpowerlowwarning'] = dom_module_threshold_data['data'][
                    'TXPowerLowWarning']['value']
            transceiver_dom_threshold_info_dict[
                'rxpowerhighalarm'] = dom_module_threshold_data['data'][
                    'RXPowerHighAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'rxpowerlowalarm'] = dom_module_threshold_data['data'][
                    'RXPowerLowAlarm']['value']
            transceiver_dom_threshold_info_dict[
                'rxpowerhighwarning'] = dom_module_threshold_data['data'][
                    'RXPowerHighWarning']['value']
            transceiver_dom_threshold_info_dict[
                'rxpowerlowwarning'] = dom_module_threshold_data['data'][
                    'RXPowerLowWarning']['value']

        return transceiver_dom_threshold_info_dict
예제 #3
0
    def get_transceiver_dom_info_dict(self, port_num):
        if port_num in self.qsfp_ports:
            return SfpUtilBase.get_transceiver_dom_info_dict(self, port_num)
        else:
            transceiver_dom_info_dict = {}

            offset = 0
            file_path = self._get_port_eeprom_path(port_num, self.DOM_EEPROM_ADDR)
            if not self._sfp_eeprom_present(file_path, 0):
                return None

            try:
                sysfsfile_eeprom = open(file_path, "rb")
            except IOError:
                print("Error: reading sysfs file %s" % file_path)
                return None

            sfpd_obj = sff8472Dom(None, 1)
            if sfpd_obj is None:
                return None

            dom_temperature_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset + SFP_TEMPE_OFFSET), SFP_TEMPE_WIDTH)
            if dom_temperature_raw is not None:
                print(dom_temperature_raw)
                dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0)
                print(dom_temperature_data)
            else:
                return None

            dom_voltage_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset + SFP_VLOT_OFFSET), SFP_VOLT_WIDTH)
            if dom_voltage_raw is not None:
                print(dom_voltage_raw)
                dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0)
            else:
                return None

            dom_channel_monitor_raw = self._read_eeprom_specific_bytes(
                sysfsfile_eeprom, (offset + SFP_CHANNL_MON_OFFSET), SFP_CHANNL_MON_WIDTH)
            if dom_channel_monitor_raw is not None:
                dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_channel_monitor_raw, 0)
            else:
                return None

            try:
                sysfsfile_eeprom.close()
            except IOError:
                print("Error: closing sysfs file %s" % file_path)
                return None

            transceiver_dom_info_dict['temperature'] = dom_temperature_data['data']['Temperature']['value']
            transceiver_dom_info_dict['voltage'] = dom_voltage_data['data']['Vcc']['value']
            transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RXPower']['value']
            transceiver_dom_info_dict['rx2power'] = 'N/A'
            transceiver_dom_info_dict['rx3power'] = 'N/A'
            transceiver_dom_info_dict['rx4power'] = 'N/A'
            transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TXBias']['value']
            transceiver_dom_info_dict['tx2bias'] = 'N/A'
            transceiver_dom_info_dict['tx3bias'] = 'N/A'
            transceiver_dom_info_dict['tx4bias'] = 'N/A'
            transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TXPower']['value']
            transceiver_dom_info_dict['tx2power'] = 'N/A'
            transceiver_dom_info_dict['tx3power'] = 'N/A'
            transceiver_dom_info_dict['tx4power'] = 'N/A'

            return transceiver_dom_info_dict