diff --git a/sonic_platform_base/sonic_storage/ssd.py b/sonic_platform_base/sonic_storage/ssd.py index 417068d68..c66c381f3 100644 --- a/sonic_platform_base/sonic_storage/ssd.py +++ b/sonic_platform_base/sonic_storage/ssd.py @@ -338,11 +338,11 @@ def parse_micron_info(self): if health_raw == NOT_AVAILABLE: average_erase_count = self.parse_id_number(MICRON_AVG_ERASE_COUNT_ID, self.vendor_ssd_info) - erase_fail_count = self.parse_id_number(MICRON_ERASE_FAIL_COUNT_ID, self.vendor_ssd_info) + nand_endurance = self._parse_re(r'(?m)NAND_Endurance.*?(\d+)\s*$', self.vendor_ssd_info) - if average_erase_count != NOT_AVAILABLE and erase_fail_count != NOT_AVAILABLE: + if average_erase_count != NOT_AVAILABLE and nand_endurance != NOT_AVAILABLE: try: - self.health = 100 - (float(average_erase_count) * 100 / float(nand_endurance)) + self.health = 100 - (float(average_erase_count.split()[-1]) * 100 / float(nand_endurance)) except (ValueError, ZeroDivisionError) as ex: self.log.log_info("SsdUtil parse_micron_info exception: {}".format(ex)) pass diff --git a/tests/test_ssd.py b/tests/test_ssd.py index 7259535fc..9d67424ff 100644 --- a/tests/test_ssd.py +++ b/tests/test_ssd.py @@ -1951,6 +1951,19 @@ def test_micron_ssd(self): assert(micron_ssd.get_disk_io_writes() == '9607694422') assert(micron_ssd.get_reserved_blocks() == '475') + def test_micron_ssd_health_from_nand_endurance(self): + micron_output = output_micron_ssd.replace( + "202 Percent_Lifetime_Used 0x0031 075 075 000 Pre-fail Offline - 25\n", + "202 Unknown_Attribute 0x0031 075 075 000 Pre-fail Offline - 25\n" + "999 NAND_Endurance 0x0032 100 100 000 Old_age Always - 3028\n" + ) + + with mock.patch('sonic_platform_base.sonic_storage.ssd.SsdUtil._execute_shell', + mock.MagicMock(return_value=micron_output)): + micron_ssd = SsdUtil('/dev/sda') + + assert micron_ssd.get_health() == 75.0 + @mock.patch('sonic_platform_base.sonic_storage.ssd.SsdUtil._execute_shell', mock.MagicMock(return_value=output_intel_ssd)) def test_intel_ssd(self):