Skip to content

Commit ade83aa

Browse files
[202205] Fix issue: should use 'Value' column to calculate the health percentage for Virtium SSD (#385)
Backport commits: 07ccd27 Fix issue: should use 'Value' column to calculate the health percentage 6d2d7a3 [ssd_generic] Get health status from Remaining_Life_Left field for virtium SSD (#344) feb5036 [SSD] deduce vendor name from part number (#322) Description Currently, we are using "Low Raw" column to calculate SSD health, but "Value"column should be used according to vendor document. Motivation and Context Fix issue that SSD health display wrong value How Has This Been Tested? Manual test Unit test
1 parent 6a38e71 commit ade83aa

File tree

2 files changed

+257
-33
lines changed

2 files changed

+257
-33
lines changed

sonic_platform_base/sonic_ssd/ssd_generic.py

+24-9
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ def __init__(self, diskdev):
5252

5353
# Known vendor part
5454
if self.model:
55-
model_short = self.model.split()[0]
56-
if model_short in self.vendor_ssd_utility:
57-
self.fetch_vendor_ssd_info(diskdev, model_short)
58-
self.parse_vendor_ssd_info(model_short)
55+
vendor = self._parse_vendor()
56+
if vendor:
57+
self.fetch_vendor_ssd_info(diskdev, vendor)
58+
self.parse_vendor_ssd_info(vendor)
5959
else:
6060
# No handler registered for this disk model
6161
pass
@@ -72,6 +72,15 @@ def _parse_re(self, pattern, buffer):
7272
res_list = re.findall(pattern, buffer)
7373
return res_list[0] if res_list else NOT_AVAILABLE
7474

75+
def _parse_vendor(self):
76+
model_short = self.model.split()[0]
77+
if model_short in self.vendor_ssd_utility:
78+
return model_short
79+
elif self.model.startswith('VSF'):
80+
return 'Virtium'
81+
else:
82+
return None
83+
7584
def fetch_generic_ssd_info(self, diskdev):
7685
self.ssd_info = self._execute_shell(self.vendor_ssd_utility["Generic"]["utility"].format(diskdev))
7786

@@ -115,7 +124,7 @@ def parse_innodisk_info(self):
115124
if self.vendor_ssd_info:
116125
self.health = self._parse_re('Health:\s*(.+?)%', self.vendor_ssd_info)
117126
self.temperature = self._parse_re('Temperature\s*\[\s*(.+?)\]', self.vendor_ssd_info)
118-
127+
119128
if self.health == NOT_AVAILABLE:
120129
health_raw = self.parse_id_number(INNODISK_HEALTH_ID)
121130
if health_raw == NOT_AVAILABLE:
@@ -134,10 +143,16 @@ def parse_virtium_info(self):
134143
self.temperature = self._parse_re('Temperature_Celsius\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info)
135144
nand_endurance = self._parse_re('NAND_Endurance\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info)
136145
avg_erase_count = self._parse_re('Average_Erase_Count\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info)
137-
try:
138-
self.health = 100 - (float(avg_erase_count) * 100 / float(nand_endurance))
139-
except (ValueError, ZeroDivisionError):
140-
pass
146+
if nand_endurance != NOT_AVAILABLE and avg_erase_count != NOT_AVAILABLE:
147+
try:
148+
self.health = 100 - (float(avg_erase_count) * 100 / float(nand_endurance))
149+
except (ValueError, ZeroDivisionError):
150+
pass
151+
else:
152+
try:
153+
self.health = float(self._parse_re('Remaining_Life_Left\s*\d*\s*\d*\s*(\d+?)\s+', self.vendor_ssd_info))
154+
except ValueError:
155+
pass
141156

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

0 commit comments

Comments
 (0)