From 74ddd4e8a17c0ecd94adc3202bd0a6f32dfb1432 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Tue, 20 Jun 2023 03:05:02 +0800 Subject: [PATCH 1/3] Fix issue: should use 'Value' column to calculate the health percentage (#381) --- sonic_platform_base/sonic_ssd/ssd_generic.py | 6 +-- tests/ssd_generic_test.py | 56 ++++++++++---------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/sonic_platform_base/sonic_ssd/ssd_generic.py b/sonic_platform_base/sonic_ssd/ssd_generic.py index 95ed5c332..1541d31f3 100644 --- a/sonic_platform_base/sonic_ssd/ssd_generic.py +++ b/sonic_platform_base/sonic_ssd/ssd_generic.py @@ -124,7 +124,7 @@ def parse_innodisk_info(self): if self.vendor_ssd_info: self.health = self._parse_re('Health:\s*(.+?)%', self.vendor_ssd_info) self.temperature = self._parse_re('Temperature\s*\[\s*(.+?)\]', self.vendor_ssd_info) - + if self.health == NOT_AVAILABLE: health_raw = self.parse_id_number(INNODISK_HEALTH_ID) if health_raw == NOT_AVAILABLE: @@ -150,10 +150,10 @@ def parse_virtium_info(self): pass else: try: - self.health = float(self._parse_re('Remaining_Life_Left\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info)) + self.health = float(self._parse_re('Remaining_Life_Left\s*\d*\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info)) except ValueError: pass - + def fetch_vendor_ssd_info(self, diskdev, model): self.vendor_ssd_info = self._execute_shell(self.vendor_ssd_utility[model]["utility"].format(diskdev)) diff --git a/tests/ssd_generic_test.py b/tests/ssd_generic_test.py index 630d59c6f..889205e11 100644 --- a/tests/ssd_generic_test.py +++ b/tests/ssd_generic_test.py @@ -98,7 +98,7 @@ Offline data collection status: (0x00) Offline data collection activity was never started. Auto Offline Data Collection: Disabled. -Total time to complete Offline +Total time to complete Offline data collection: ( 32) seconds. Offline data collection capabilities: (0x00) Offline data collection not supported. @@ -178,7 +178,7 @@ Offline data collection status: (0x00) Offline data collection activity was never started. Auto Offline Data Collection: Disabled. -Total time to complete Offline +Total time to complete Offline data collection: ( 32) seconds. Offline data collection capabilities: (0x00) Offline data collection not supported. @@ -232,29 +232,29 @@ output_Innodisk_vendor_info = """******************************************************************************************** * Innodisk iSMART V3.9.41 2018/05/25 * ******************************************************************************************** -Model Name: InnoDisk Corp. - mSATA 3ME -FW Version: S140714 +Model Name: InnoDisk Corp. - mSATA 3ME +FW Version: S140714 Serial Number: 20171126AAAA11730156 -Health: 82.34% +Health: 82.34% Capacity: 29.818199 GB -P/E Cycle: 3000 -Lifespan : 0 (Years : 0 Months : 0 Days : 0) -Write Protect: Disable -InnoRobust: Enable +P/E Cycle: 3000 +Lifespan : 0 (Years : 0 Months : 0 Days : 0) +Write Protect: Disable +InnoRobust: Enable -------------------------------------------------------------------------------------------- -ID SMART Attributes Value Raw Value +ID SMART Attributes Value Raw Value -------------------------------------------------------------------------------------------- -[09] Power On Hours [32474] [0902006464DA7E0000000000] -[0C] Power Cycle Count [ 297] [0C0200646429010000000000] -[AA] Total Bad Block Count [ 47] [AA0300646400002F00000000] -[AD] Erase Count Max. [ 7280] [AD02006464181C701C000000] -[AD] Erase Count Avg. [ 7192] [AD02006464181C701C000000] -[C2] Temperature [ 0] [000000000000000000000000] -[EB] Later Bad Block [ 0] [EB0200640000000000000000] -[EB] Read Block [ 0] [EB0200640000000000000000] -[EB] Write Block [ 0] [EB0200640000000000000000] -[EB] Erase Block [ 0] [EB0200640000000000000000] -[EC] Unstable Power Count [ 0] [EC0200646400000000000000] +[09] Power On Hours [32474] [0902006464DA7E0000000000] +[0C] Power Cycle Count [ 297] [0C0200646429010000000000] +[AA] Total Bad Block Count [ 47] [AA0300646400002F00000000] +[AD] Erase Count Max. [ 7280] [AD02006464181C701C000000] +[AD] Erase Count Avg. [ 7192] [AD02006464181C701C000000] +[C2] Temperature [ 0] [000000000000000000000000] +[EB] Later Bad Block [ 0] [EB0200640000000000000000] +[EB] Read Block [ 0] [EB0200640000000000000000] +[EB] Write Block [ 0] [EB0200640000000000000000] +[EB] Erase Block [ 0] [EB0200640000000000000000] +[EC] Unstable Power Count [ 0] [EC0200646400000000000000] """ output_lack_info_ssd = """smartctl 7.2 2020-12-30 r5155 [x86_64-linux-5.10.0-8-2-amd64] (local build) @@ -292,7 +292,7 @@ Offline data collection status: (0x02) Offline data collection activity was completed without error. Auto Offline Data Collection: Disabled. -Total time to complete Offline +Total time to complete Offline data collection: ( 32) seconds. Offline data collection capabilities: (0x00) Offline data collection not supported. @@ -372,9 +372,9 @@ was never started. Auto Offline Data Collection: Disabled. Self-test execution status: ( 0) The previous self-test routine completed - without error or no self-test has ever + without error or no self-test has ever been run. -Total time to complete Offline +Total time to complete Offline data collection: ( 0) seconds. Offline data collection capabilities: (0x73) SMART execute Offline immediate. @@ -390,7 +390,7 @@ Supports SMART auto save timer. Error logging capability: (0x01) Error logging supported. General Purpose Logging supported. -Short self-test routine +Short self-test routine recommended polling time: ( 2) minutes. Extended self-test routine recommended polling time: ( 15) minutes. @@ -484,7 +484,7 @@ 241 Total_LBAs_Written 0 302116658 100 100 0 242 Total_LBAs_Read 0 45608497 100 100 0 247 Reserved_Attribute 0 347463680 100 100 0 -248 Remaining_Life_Left 0 1 100 100 0 +248 Remaining_Life_Left 0 0 1 100 0 """ output_virtium_no_remain_life = """ @@ -599,7 +599,7 @@ def test_Innodisk_missing_names_ssd(self): Innodisk_ssd.parse_vendor_ssd_info('InnoDisk') assert(Innodisk_ssd.get_health() == '94') assert(Innodisk_ssd.get_temperature() == '39') - + @mock.patch('sonic_platform_base.sonic_ssd.ssd_generic.SsdUtil._execute_shell', mock.MagicMock(return_value=output_Innodisk_missing_names_ssd)) def test_Innodisk_missing_names_ssd_2(self): # Test parsing Innodisk ssd info @@ -608,7 +608,7 @@ def test_Innodisk_missing_names_ssd_2(self): Innodisk_ssd.parse_vendor_ssd_info('InnoDisk') assert(Innodisk_ssd.get_health() == '94') assert(Innodisk_ssd.get_temperature() == '39') - + @mock.patch('sonic_platform_base.sonic_ssd.ssd_generic.SsdUtil._execute_shell') def test_virtium_ssd(self, mock_exec): From 4d270f07e040e35b7fc90be6e38bd5feb6e163ed Mon Sep 17 00:00:00 2001 From: Mai Bui Date: Mon, 19 Jun 2023 17:41:42 -0400 Subject: [PATCH 2/3] [actions] Support Semgrep by Github Actions (#383) **Why I did it** [Semgrep](https://github.com/returntocorp/semgrep) is a static analysis tool to find security vulnerabilities. When opening a PR or commtting to PR, Semgrep performs a diff-aware scanning, which scans changed files in PRs. When merging PR, Semgrep performs a full scan on master branch and report all findings. Ref: - [Supported Language](https://semgrep.dev/docs/supported-languages/#language-maturity) - [Semgrep Rules](https://registry.semgrep.dev/rule) **How I did it** Integrate Semgrep into this repository by committing a job configuration file --- .github/workflows/semgrep.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/semgrep.yml diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml new file mode 100644 index 000000000..975769a50 --- /dev/null +++ b/.github/workflows/semgrep.yml @@ -0,0 +1,22 @@ +name: Semgrep + +on: + pull_request: {} + push: + branches: + - master + - '201[7-9][0-1][0-9]' + - '202[0-9][0-1][0-9]' + +jobs: + semgrep: + if: github.repository_owner == 'sonic-net' + name: Semgrep + runs-on: ubuntu-latest + container: + image: returntocorp/semgrep + steps: + - uses: actions/checkout@v3 + - run: semgrep ci + env: + SEMGREP_RULES: p/default From 10af810fa1d40347ab8556e79374e6c94a99a22d Mon Sep 17 00:00:00 2001 From: snider-nokia <76123698+snider-nokia@users.noreply.github.com> Date: Fri, 30 Jun 2023 17:49:39 -0400 Subject: [PATCH 3/3] More prevention of fatal exception caused by VDM dictionary missing fields when a transceiver has just been pulled (#376) --- .../sonic_xcvr/api/public/c_cmis.py | 159 ++++++++---------- 1 file changed, 69 insertions(+), 90 deletions(-) diff --git a/sonic_platform_base/sonic_xcvr/api/public/c_cmis.py b/sonic_platform_base/sonic_xcvr/api/public/c_cmis.py index 82447929c..6a94df544 100644 --- a/sonic_platform_base/sonic_xcvr/api/public/c_cmis.py +++ b/sonic_platform_base/sonic_xcvr/api/public/c_cmis.py @@ -361,21 +361,15 @@ def get_transceiver_bulk_status(self): trans_dom['bias_yp'] = self.vdm_dict['Modulator Bias Y_Phase [%]'][1][0] trans_dom['cd_shortlink'] = self.vdm_dict['CD high granularity, short link [ps/nm]'][1][0] trans_dom['cd_longlink'] = self.vdm_dict['CD low granularity, long link [ps/nm]'][1][0] - except KeyError: - pass - trans_dom['dgd'] = self.vdm_dict['DGD [ps]'][1][0] - try: + trans_dom['dgd'] = self.vdm_dict['DGD [ps]'][1][0] trans_dom['sopmd'] = self.vdm_dict['SOPMD [ps^2]'][1][0] - except KeyError: - pass - trans_dom['soproc'] = self.vdm_dict['SOP ROC [krad/s]'][1][0] - trans_dom['pdl'] = self.vdm_dict['PDL [dB]'][1][0] - trans_dom['osnr'] = self.vdm_dict['OSNR [dB]'][1][0] - trans_dom['esnr'] = self.vdm_dict['eSNR [dB]'][1][0] - trans_dom['cfo'] = self.vdm_dict['CFO [MHz]'][1][0] - trans_dom['tx_curr_power'] = self.vdm_dict['Tx Power [dBm]'][1][0] - trans_dom['rx_tot_power'] = self.vdm_dict['Rx Total Power [dBm]'][1][0] - try: + trans_dom['soproc'] = self.vdm_dict['SOP ROC [krad/s]'][1][0] + trans_dom['pdl'] = self.vdm_dict['PDL [dB]'][1][0] + trans_dom['osnr'] = self.vdm_dict['OSNR [dB]'][1][0] + trans_dom['esnr'] = self.vdm_dict['eSNR [dB]'][1][0] + trans_dom['cfo'] = self.vdm_dict['CFO [MHz]'][1][0] + trans_dom['tx_curr_power'] = self.vdm_dict['Tx Power [dBm]'][1][0] + trans_dom['rx_tot_power'] = self.vdm_dict['Rx Total Power [dBm]'][1][0] trans_dom['rx_sig_power'] = self.vdm_dict['Rx Signal Power [dBm]'][1][0] except KeyError: pass @@ -529,44 +523,38 @@ def get_transceiver_threshold_info(self): trans_dom_th['cdlonglowalarm'] = self.vdm_dict['CD low granularity, long link [ps/nm]'][1][2] trans_dom_th['cdlonghighwarning'] = self.vdm_dict['CD low granularity, long link [ps/nm]'][1][3] trans_dom_th['cdlonglowwarning'] = self.vdm_dict['CD low granularity, long link [ps/nm]'][1][4] - except KeyError: - pass - trans_dom_th['dgdhighalarm'] = self.vdm_dict['DGD [ps]'][1][1] - trans_dom_th['dgdlowalarm'] = self.vdm_dict['DGD [ps]'][1][2] - trans_dom_th['dgdhighwarning'] = self.vdm_dict['DGD [ps]'][1][3] - trans_dom_th['dgdlowwarning'] = self.vdm_dict['DGD [ps]'][1][4] - try: + trans_dom_th['dgdhighalarm'] = self.vdm_dict['DGD [ps]'][1][1] + trans_dom_th['dgdlowalarm'] = self.vdm_dict['DGD [ps]'][1][2] + trans_dom_th['dgdhighwarning'] = self.vdm_dict['DGD [ps]'][1][3] + trans_dom_th['dgdlowwarning'] = self.vdm_dict['DGD [ps]'][1][4] trans_dom_th['sopmdhighalarm'] = self.vdm_dict['SOPMD [ps^2]'][1][1] trans_dom_th['sopmdlowalarm'] = self.vdm_dict['SOPMD [ps^2]'][1][2] trans_dom_th['sopmdhighwarning'] = self.vdm_dict['SOPMD [ps^2]'][1][3] trans_dom_th['sopmdlowwarning'] = self.vdm_dict['SOPMD [ps^2]'][1][4] - except KeyError: - pass - trans_dom_th['pdlhighalarm'] = self.vdm_dict['PDL [dB]'][1][1] - trans_dom_th['pdllowalarm'] = self.vdm_dict['PDL [dB]'][1][2] - trans_dom_th['pdlhighwarning'] = self.vdm_dict['PDL [dB]'][1][3] - trans_dom_th['pdllowwarning'] = self.vdm_dict['PDL [dB]'][1][4] - trans_dom_th['osnrhighalarm'] = self.vdm_dict['OSNR [dB]'][1][1] - trans_dom_th['osnrlowalarm'] = self.vdm_dict['OSNR [dB]'][1][2] - trans_dom_th['osnrhighwarning'] = self.vdm_dict['OSNR [dB]'][1][3] - trans_dom_th['osnrlowwarning'] = self.vdm_dict['OSNR [dB]'][1][4] - trans_dom_th['esnrhighalarm'] = self.vdm_dict['eSNR [dB]'][1][1] - trans_dom_th['esnrlowalarm'] = self.vdm_dict['eSNR [dB]'][1][2] - trans_dom_th['esnrhighwarning'] = self.vdm_dict['eSNR [dB]'][1][3] - trans_dom_th['esnrlowwarning'] = self.vdm_dict['eSNR [dB]'][1][4] - trans_dom_th['cfohighalarm'] = self.vdm_dict['CFO [MHz]'][1][1] - trans_dom_th['cfolowalarm'] = self.vdm_dict['CFO [MHz]'][1][2] - trans_dom_th['cfohighwarning'] = self.vdm_dict['CFO [MHz]'][1][3] - trans_dom_th['cfolowwarning'] = self.vdm_dict['CFO [MHz]'][1][4] - trans_dom_th['txcurrpowerhighalarm'] = self.vdm_dict['Tx Power [dBm]'][1][1] - trans_dom_th['txcurrpowerlowalarm'] = self.vdm_dict['Tx Power [dBm]'][1][2] - trans_dom_th['txcurrpowerhighwarning'] = self.vdm_dict['Tx Power [dBm]'][1][3] - trans_dom_th['txcurrpowerlowwarning'] = self.vdm_dict['Tx Power [dBm]'][1][4] - trans_dom_th['rxtotpowerhighalarm'] = self.vdm_dict['Rx Total Power [dBm]'][1][1] - trans_dom_th['rxtotpowerlowalarm'] = self.vdm_dict['Rx Total Power [dBm]'][1][2] - trans_dom_th['rxtotpowerhighwarning'] = self.vdm_dict['Rx Total Power [dBm]'][1][3] - trans_dom_th['rxtotpowerlowwarning'] = self.vdm_dict['Rx Total Power [dBm]'][1][4] - try: + trans_dom_th['pdlhighalarm'] = self.vdm_dict['PDL [dB]'][1][1] + trans_dom_th['pdllowalarm'] = self.vdm_dict['PDL [dB]'][1][2] + trans_dom_th['pdlhighwarning'] = self.vdm_dict['PDL [dB]'][1][3] + trans_dom_th['pdllowwarning'] = self.vdm_dict['PDL [dB]'][1][4] + trans_dom_th['osnrhighalarm'] = self.vdm_dict['OSNR [dB]'][1][1] + trans_dom_th['osnrlowalarm'] = self.vdm_dict['OSNR [dB]'][1][2] + trans_dom_th['osnrhighwarning'] = self.vdm_dict['OSNR [dB]'][1][3] + trans_dom_th['osnrlowwarning'] = self.vdm_dict['OSNR [dB]'][1][4] + trans_dom_th['esnrhighalarm'] = self.vdm_dict['eSNR [dB]'][1][1] + trans_dom_th['esnrlowalarm'] = self.vdm_dict['eSNR [dB]'][1][2] + trans_dom_th['esnrhighwarning'] = self.vdm_dict['eSNR [dB]'][1][3] + trans_dom_th['esnrlowwarning'] = self.vdm_dict['eSNR [dB]'][1][4] + trans_dom_th['cfohighalarm'] = self.vdm_dict['CFO [MHz]'][1][1] + trans_dom_th['cfolowalarm'] = self.vdm_dict['CFO [MHz]'][1][2] + trans_dom_th['cfohighwarning'] = self.vdm_dict['CFO [MHz]'][1][3] + trans_dom_th['cfolowwarning'] = self.vdm_dict['CFO [MHz]'][1][4] + trans_dom_th['txcurrpowerhighalarm'] = self.vdm_dict['Tx Power [dBm]'][1][1] + trans_dom_th['txcurrpowerlowalarm'] = self.vdm_dict['Tx Power [dBm]'][1][2] + trans_dom_th['txcurrpowerhighwarning'] = self.vdm_dict['Tx Power [dBm]'][1][3] + trans_dom_th['txcurrpowerlowwarning'] = self.vdm_dict['Tx Power [dBm]'][1][4] + trans_dom_th['rxtotpowerhighalarm'] = self.vdm_dict['Rx Total Power [dBm]'][1][1] + trans_dom_th['rxtotpowerlowalarm'] = self.vdm_dict['Rx Total Power [dBm]'][1][2] + trans_dom_th['rxtotpowerhighwarning'] = self.vdm_dict['Rx Total Power [dBm]'][1][3] + trans_dom_th['rxtotpowerlowwarning'] = self.vdm_dict['Rx Total Power [dBm]'][1][4] trans_dom_th['rxsigpowerhighalarm'] = self.vdm_dict['Rx Signal Power [dBm]'][1][1] trans_dom_th['rxsigpowerlowalarm'] = self.vdm_dict['Rx Signal Power [dBm]'][1][2] trans_dom_th['rxsigpowerhighwarning'] = self.vdm_dict['Rx Signal Power [dBm]'][1][3] @@ -784,61 +772,52 @@ def get_transceiver_status(self): trans_status['biasyplowalarm_flag'] = self.vdm_dict['Modulator Bias Y_Phase [%]'][1][6] trans_status['biasyphighwarning_flag'] = self.vdm_dict['Modulator Bias Y_Phase [%]'][1][7] trans_status['biasyplowwarning_flag'] = self.vdm_dict['Modulator Bias Y_Phase [%]'][1][8] - except KeyError: - pass - trans_status['cdshorthighalarm_flag'] = self.vdm_dict['CD high granularity, short link [ps/nm]'][1][5] - trans_status['cdshortlowalarm_flag'] = self.vdm_dict['CD high granularity, short link [ps/nm]'][1][6] - trans_status['cdshorthighwarning_flag'] = self.vdm_dict['CD high granularity, short link [ps/nm]'][1][7] - trans_status['cdshortlowwarning_flag'] = self.vdm_dict['CD high granularity, short link [ps/nm]'][1][8] - try: + trans_status['cdshorthighalarm_flag'] = self.vdm_dict['CD high granularity, short link [ps/nm]'][1][5] + trans_status['cdshortlowalarm_flag'] = self.vdm_dict['CD high granularity, short link [ps/nm]'][1][6] + trans_status['cdshorthighwarning_flag'] = self.vdm_dict['CD high granularity, short link [ps/nm]'][1][7] + trans_status['cdshortlowwarning_flag'] = self.vdm_dict['CD high granularity, short link [ps/nm]'][1][8] trans_status['cdlonghighalarm_flag'] = self.vdm_dict['CD low granularity, long link [ps/nm]'][1][5] trans_status['cdlonglowalarm_flag'] = self.vdm_dict['CD low granularity, long link [ps/nm]'][1][6] trans_status['cdlonghighwarning_flag'] = self.vdm_dict['CD low granularity, long link [ps/nm]'][1][7] trans_status['cdlonglowwarning_flag'] = self.vdm_dict['CD low granularity, long link [ps/nm]'][1][8] - except KeyError: - pass - trans_status['dgdhighalarm_flag'] = self.vdm_dict['DGD [ps]'][1][5] - trans_status['dgdlowalarm_flag'] = self.vdm_dict['DGD [ps]'][1][6] - trans_status['dgdhighwarning_flag'] = self.vdm_dict['DGD [ps]'][1][7] - trans_status['dgdlowwarning_flag'] = self.vdm_dict['DGD [ps]'][1][8] - try: + trans_status['dgdhighalarm_flag'] = self.vdm_dict['DGD [ps]'][1][5] + trans_status['dgdlowalarm_flag'] = self.vdm_dict['DGD [ps]'][1][6] + trans_status['dgdhighwarning_flag'] = self.vdm_dict['DGD [ps]'][1][7] + trans_status['dgdlowwarning_flag'] = self.vdm_dict['DGD [ps]'][1][8] trans_status['sopmdhighalarm_flag'] = self.vdm_dict['SOPMD [ps^2]'][1][5] trans_status['sopmdlowalarm_flag'] = self.vdm_dict['SOPMD [ps^2]'][1][6] trans_status['sopmdhighwarning_flag'] = self.vdm_dict['SOPMD [ps^2]'][1][7] trans_status['sopmdlowwarning_flag'] = self.vdm_dict['SOPMD [ps^2]'][1][8] - except KeyError: - pass - trans_status['pdlhighalarm_flag'] = self.vdm_dict['PDL [dB]'][1][5] - trans_status['pdllowalarm_flag'] = self.vdm_dict['PDL [dB]'][1][6] - trans_status['pdlhighwarning_flag'] = self.vdm_dict['PDL [dB]'][1][7] - trans_status['pdllowwarning_flag'] = self.vdm_dict['PDL [dB]'][1][8] - trans_status['osnrhighalarm_flag'] = self.vdm_dict['OSNR [dB]'][1][5] - trans_status['osnrlowalarm_flag'] = self.vdm_dict['OSNR [dB]'][1][6] - trans_status['osnrhighwarning_flag'] = self.vdm_dict['OSNR [dB]'][1][7] - trans_status['osnrlowwarning_flag'] = self.vdm_dict['OSNR [dB]'][1][8] - trans_status['esnrhighalarm_flag'] = self.vdm_dict['eSNR [dB]'][1][5] - trans_status['esnrlowalarm_flag'] = self.vdm_dict['eSNR [dB]'][1][6] - trans_status['esnrhighwarning_flag'] = self.vdm_dict['eSNR [dB]'][1][7] - trans_status['esnrlowwarning_flag'] = self.vdm_dict['eSNR [dB]'][1][8] - trans_status['cfohighalarm_flag'] = self.vdm_dict['CFO [MHz]'][1][5] - trans_status['cfolowalarm_flag'] = self.vdm_dict['CFO [MHz]'][1][6] - trans_status['cfohighwarning_flag'] = self.vdm_dict['CFO [MHz]'][1][7] - trans_status['cfolowwarning_flag'] = self.vdm_dict['CFO [MHz]'][1][8] - trans_status['txcurrpowerhighalarm_flag'] = self.vdm_dict['Tx Power [dBm]'][1][5] - trans_status['txcurrpowerlowalarm_flag'] = self.vdm_dict['Tx Power [dBm]'][1][6] - trans_status['txcurrpowerhighwarning_flag'] = self.vdm_dict['Tx Power [dBm]'][1][7] - trans_status['txcurrpowerlowwarning_flag'] = self.vdm_dict['Tx Power [dBm]'][1][8] - trans_status['rxtotpowerhighalarm_flag'] = self.vdm_dict['Rx Total Power [dBm]'][1][5] - trans_status['rxtotpowerlowalarm_flag'] = self.vdm_dict['Rx Total Power [dBm]'][1][6] - trans_status['rxtotpowerhighwarning_flag'] = self.vdm_dict['Rx Total Power [dBm]'][1][7] - trans_status['rxtotpowerlowwarning_flag'] = self.vdm_dict['Rx Total Power [dBm]'][1][8] - try: + trans_status['pdlhighalarm_flag'] = self.vdm_dict['PDL [dB]'][1][5] + trans_status['pdllowalarm_flag'] = self.vdm_dict['PDL [dB]'][1][6] + trans_status['pdlhighwarning_flag'] = self.vdm_dict['PDL [dB]'][1][7] + trans_status['pdllowwarning_flag'] = self.vdm_dict['PDL [dB]'][1][8] + trans_status['osnrhighalarm_flag'] = self.vdm_dict['OSNR [dB]'][1][5] + trans_status['osnrlowalarm_flag'] = self.vdm_dict['OSNR [dB]'][1][6] + trans_status['osnrhighwarning_flag'] = self.vdm_dict['OSNR [dB]'][1][7] + trans_status['osnrlowwarning_flag'] = self.vdm_dict['OSNR [dB]'][1][8] + trans_status['esnrhighalarm_flag'] = self.vdm_dict['eSNR [dB]'][1][5] + trans_status['esnrlowalarm_flag'] = self.vdm_dict['eSNR [dB]'][1][6] + trans_status['esnrhighwarning_flag'] = self.vdm_dict['eSNR [dB]'][1][7] + trans_status['esnrlowwarning_flag'] = self.vdm_dict['eSNR [dB]'][1][8] + trans_status['cfohighalarm_flag'] = self.vdm_dict['CFO [MHz]'][1][5] + trans_status['cfolowalarm_flag'] = self.vdm_dict['CFO [MHz]'][1][6] + trans_status['cfohighwarning_flag'] = self.vdm_dict['CFO [MHz]'][1][7] + trans_status['cfolowwarning_flag'] = self.vdm_dict['CFO [MHz]'][1][8] + trans_status['txcurrpowerhighalarm_flag'] = self.vdm_dict['Tx Power [dBm]'][1][5] + trans_status['txcurrpowerlowalarm_flag'] = self.vdm_dict['Tx Power [dBm]'][1][6] + trans_status['txcurrpowerhighwarning_flag'] = self.vdm_dict['Tx Power [dBm]'][1][7] + trans_status['txcurrpowerlowwarning_flag'] = self.vdm_dict['Tx Power [dBm]'][1][8] + trans_status['rxtotpowerhighalarm_flag'] = self.vdm_dict['Rx Total Power [dBm]'][1][5] + trans_status['rxtotpowerlowalarm_flag'] = self.vdm_dict['Rx Total Power [dBm]'][1][6] + trans_status['rxtotpowerhighwarning_flag'] = self.vdm_dict['Rx Total Power [dBm]'][1][7] + trans_status['rxtotpowerlowwarning_flag'] = self.vdm_dict['Rx Total Power [dBm]'][1][8] trans_status['rxsigpowerhighalarm_flag'] = self.vdm_dict['Rx Signal Power [dBm]'][1][5] trans_status['rxsigpowerlowalarm_flag'] = self.vdm_dict['Rx Signal Power [dBm]'][1][6] trans_status['rxsigpowerhighwarning_flag'] = self.vdm_dict['Rx Signal Power [dBm]'][1][7] trans_status['rxsigpowerlowwarning_flag'] = self.vdm_dict['Rx Signal Power [dBm]'][1][8] except KeyError: - helper_logger.log_debug('Rx Signal Power [dBm] not present in VDM') + helper_logger.log_debug('fields not present in VDM') return trans_status def get_transceiver_pm(self):