Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions sonic_platform_base/sonic_storage/ssd.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@

# Generic IDs

GENERIC_HEALTH_ID = 169
GENERIC_HEALTH_ID = [169, 231]
GENERIC_IO_READS_ID = 242
GENERIC_IO_WRITES_ID = 241
GENERIC_RESERVED_BLOCKS_ID = [170, 232]
Expand Down Expand Up @@ -53,6 +53,8 @@

INTEL_MEDIA_WEAROUT_INDICATOR_ID = 233

ATP_HEALTH_ID = 248

class SsdUtil(StorageCommon):
"""
Generic implementation of the SSD health API
Expand Down Expand Up @@ -85,6 +87,7 @@ def __init__(self, diskdev):
"Micron" : { "utility" : SMARTCTL, "parser" : self.parse_micron_info },
"Intel" : { "utility" : SMARTCTL, "parser" : self.parse_intel_info },
"Transcend" : { "utility" : SMARTCTL, "parser" : self.parse_generic_ssd_info },
"ATP" : { "utility" : SMARTCTL, "parser" : self.parse_atp_info },
}

self.dev = diskdev
Expand All @@ -100,12 +103,12 @@ def fetch_parse_info(self, diskdev):

# Known vendor part
if self.model:
# For some Virtium SSDs, parse_generic_ssd_info should be called.
# Since it was called above, no need to parse a specific vendor SSD info.
if self.model in ['Virtium VTPM24CEXI080-BM110006']:
vendor = self._parse_vendor()
# For Virtium, ATP NVMe SSD, parse_generic_ssd_info should be called.
# Skip here, otherwise data will be overwritten by N/A.
if vendor in ['Virtium', 'ATP'] and "nvme" in self.dev:
return

vendor = self._parse_vendor()
if vendor:
try:
self.fetch_vendor_ssd_info(diskdev, vendor)
Expand Down Expand Up @@ -189,10 +192,11 @@ def parse_generic_ssd_info(self):

health_raw = self._parse_re('Remaining_Lifetime_Perc\s*(.+?)\n', self.ssd_info)
if health_raw == NOT_AVAILABLE:
health_raw = self.parse_id_number(GENERIC_HEALTH_ID, self.ssd_info)
if health_raw == NOT_AVAILABLE:
self.health = NOT_AVAILABLE
else: self.health = health_raw.split()[-1]
for health_id in GENERIC_HEALTH_ID:
health_raw = self.parse_id_number(health_id, self.ssd_info)
if health_raw != NOT_AVAILABLE:
break
self.health = NOT_AVAILABLE if health_raw == NOT_AVAILABLE else health_raw.split()[-1]
else:
self.health = health_raw.split()[-1]

Expand Down Expand Up @@ -359,6 +363,11 @@ def parse_intel_info(self):
health_raw = self.parse_id_number(INTEL_MEDIA_WEAROUT_INDICATOR_ID, self.vendor_ssd_info)
self.health = NOT_AVAILABLE if health_raw == NOT_AVAILABLE else str(100 - float(health_raw.split()[-1]))

def parse_atp_info(self):
if self.vendor_ssd_info:
health_raw = self.parse_id_number(ATP_HEALTH_ID, self.vendor_ssd_info)
self.health = NOT_AVAILABLE if health_raw == NOT_AVAILABLE else health_raw.split()[-1]

def fetch_vendor_ssd_info(self, diskdev, model):
self.vendor_ssd_info = self._execute_shell(self.vendor_ssd_utility[model]["utility"].format(diskdev))

Expand Down
Loading
Loading