Merged
调整硬盘厂商为ATA时通过ManufacturerOUI获取对应厂商名的逻辑,修复获取控制器下硬盘列表时,硬盘列表未更新到资源树上的问题 #487
调整硬盘厂商为ATA时通过ManufacturerOUI获取对应厂商名的逻辑,修复获取控制器下硬盘列表时,硬盘列表未更新到资源树上的问题 #487
Merged
XueyuansongAdd on Jul 10
Total: 6 files changed+105-116
@@ -1,5 +1,9 @@
1# Changelog1# Changelog
2All notable changes to this project will be documented in this file.2All notable changes to this project will be documented in this file.
3+## [1.81.27] - 2026-07-10
4+调整硬盘厂商为ATA时通过ManufacturerOUI获取对应厂商名的逻辑
5+修复获取控制器下硬盘列表时,硬盘列表未更新到资源树上的问题
6+ 
3## [1.81.26] - 2026-07-107## [1.81.26] - 2026-07-10
4反合BIWIN SS821 SATA SSD 和长江存储PE511 NVMe SSD8反合BIWIN SS821 SATA SSD 和长江存储PE511 NVMe SSD
5 9 
@@ -2,7 +2,7 @@
2 "name": "storage",2 "name": "storage",
3 "type": "application",3 "type": "application",
4 "deployConfig": "hardware.service",4 "deployConfig": "hardware.service",
5- "version": "1.81.26",5+ "version": "1.81.27",
6 "author": "Huawei",6 "author": "Huawei",
7 "license": "Mulan PSL v2",7 "license": "Mulan PSL v2",
8 "codeGenPolicy": {8 "codeGenPolicy": {
@@ -368,32 +368,27 @@ function c_handler_drives:update_hw_info(obj, data)
368 if not is_nil_or_null(data.PowerState) then368 if not is_nil_or_null(data.PowerState) then
369 obj.PowerState = self:get_val_or_default(data.PowerState, def.INVALID_U8)369 obj.PowerState = self:get_val_or_default(data.PowerState, def.INVALID_U8)
370 end370 end
371- 
372- -- 如果硬盘厂商为ATA则根据硬盘ManufacturerOUI判断厂商名
373- if not is_nil_or_null(data.ManufacturerOUI) and obj.Manufacturer == 'ATA' then
374- obj.Manufacturer = method_misc:get_manufacturer_name_by_oui(data.ManufacturerOUI)
375- end
376end371end
377 372 
378--- 部分不能直接获取到厂商,需要使用ManufacturerOUI转换373+-- 对于一些带内获取硬盘厂商为ATA的SATA盘,通过ManufacturerOUI获取对应的厂商名
379-function c_handler_drives:update_drive_manufacture(obj, data)374+function c_handler_drives:update_drive_manufacturer(obj, data)
380- if data.Oem and data.Oem.Huawei and data.Oem.Huawei.ManufacturerOUI then375+ if not is_nil_or_null(data.Manufacturer) and data.Manufacturer ~= 'ATA' then
381- local vendor_id = tonumber(data.Oem.Huawei.ManufacturerOUI, 16)376+ obj.Manufacturer = data.Manufacturer
382- if vendor_id then377+ return
383- local vendor_name = def.PD_VENDOR_ID_NAME_MAP[vendor_id]
384- if vendor_name then
385- obj.Manufacturer = vendor_name
386- return
387- end
388- end
389 end378 end
379+ -- data.Manufacturer 为 nil/null 或 'ATA',尝试通过 OUI 映射
H

🟡 需确认

原 update_hw_info 中使用顶层 data.ManufacturerOUI 进行 OUI 查找,新代码仅使用 data.Oem.Huawei.ManufacturerOUI。如果部分硬盘仅在顶层提供 ManufacturerOUI(Redfish 标准字段)而非 Oem.Huawei 扩展下,新逻辑会跳过 OUI 映射,厂商名保留为 ATA。

请确认:是否所有硬盘的 ManufacturerOUI 都在 data.Oem.Huawei 下?如果存在顶层有值但 Oem.Huawei 无值的情况,建议保留对顶层 data.ManufacturerOUI 的兜底查找。

likedislike
380+ if data.Oem and data.Oem.Huawei and not is_nil_or_null(data.Oem.Huawei.ManufacturerOUI) then
381+ obj.Manufacturer = method_misc:get_manufacturer_name_by_oui(data.Oem.Huawei.ManufacturerOUI)
382+ return
383+ end
384+ -- 无 OUI,用原值
390 if not is_nil_or_null(data.Manufacturer) then385 if not is_nil_or_null(data.Manufacturer) then
391 obj.Manufacturer = self:get_val_or_default(data.Manufacturer, def.INVALID_STRING)386 obj.Manufacturer = self:get_val_or_default(data.Manufacturer, def.INVALID_STRING)
392 end387 end
393end388end
394- 389+
395function c_handler_drives:update_drive_info(obj, data)390function c_handler_drives:update_drive_info(obj, data)
396- self:update_drive_manufacture(obj, data)391+ self:update_drive_manufacturer(obj, data)
397 392 
398 if not is_nil_or_null(data.Model) then393 if not is_nil_or_null(data.Model) then
399 obj.Model = self:get_val_or_default(data.Model, def.INVALID_STRING)394 obj.Model = self:get_val_or_default(data.Model, def.INVALID_STRING)
@@ -136,6 +136,87 @@ local pd_log_defs = {
136 }136 }
137}137}
138 138 
139+local pd_attri_id_wear = {
140+ ATA_SMART_ATTRIBUTE_ID_MEDIA_WEAROUT_INDICATOR = 233,
141+ ATA_SMART_ATTRIBUTE_ID_PERCENT_LIFETIME_REMAINING = 202,
142+ ATA_SMART_ATTRIBUTE_ID_LIFE_REMAINING = 245,
143+ ATA_SMART_ATTRIBUTE_ID_WEAR_LEVELING_COUNT = 177,
144+ ATA_SMART_ATTRIBUTE_ID_AVAILABLE_RESERVED_SPACE = 232,
145+}
146+ 
147+local pd_smart_defs = {
148+ PD_VENDOR_NAME_INTEL = 'INTEL',
149+ PD_VENDOR_NAME_SAMSUNG = 'SAMSUNG',
150+ PD_VENDOR_NAME_HUAWEI = 'HUAWEI',
151+ PD_VENDOR_NAME_AJ = 'UMIS',
152+ 
153+ VENDOR_ATTR_ID = {
154+ ['INTEL'] = 233,
155+ ['SAMSUNG'] = 177,
156+ ['MICRON'] = 202,
157+ ['SANDISK'] = 245,
158+ ['SEAGATE'] = 0,
159+ ['FUJITSU'] = 0,
160+ ['WDC'] = 0,
161+ ['HGST'] = 0,
162+ ['SMI'] = 231,
163+ ['LITEON ER2'] = 231,
164+ ['LITEON CVZ'] = 231,
165+ ['LITEON EGT'] = 245,
166+ ['LITEON'] = 245,
167+ ['PHISON'] = 231,
168+ ['SSSTC'] = 231,
169+ ['HYNIX'] = 231,
170+ ['HUAWEI'] = 231,
171+ ['YANGTZE MEMORY'] = 245,
172+ ['RAMAXEL'] = 231,
173+ ['UMIS'] = 231,
174+ ['DERA'] = 248,
175+ ['DATSSD'] = 233,
176+ ['HUADIAN'] = 232,
177+ ['LONGSYS'] = 202,
178+ ['PETAIO'] = 177,
179+ ['INNOGRIT'] = 202,
180+ ['UNIS'] = 232,
H

🟠 重要

VENDOR_ATTR_ID 中 ['BIWIN'] = 233 在从原位置移动到新位置时被遗漏了。对比删除块(原 235 行附近)与新增块,旧代码包含 ['BIWIN'] = 233,新代码缺失该条目。

pd_vendor_id_name_map 中存在 PD_VENDOR_ID_BIWIN 映射,说明 BIWIN 是已知厂商。移除该条目会导致 BIWIN 厂商硬盘的 SMART 磨损属性 ID 查找失败,影响寿命预测。

建议:补回 ['BIWIN'] = 233。

Suggestions
180
- ['UNIS'] = 232,
180
+ ['UNIS'] = 232,
181
+ ['BIWIN'] = 233,
182
+ },
Apply suggestion
likedislike
181+ ['BIWIN'] = 233
182+ },
183+ 
184+ ONE_HUNDRED_PERCENT = 100,
185+ 
186+ NAND_WRITTEN_ATTR_ID = {
187+ ['INTEL'] = 243,
188+ ['SAMSUNG'] = 251,
189+ ['HUAWEI'] = 245,
190+ },
191+ 
192+ HOST_WRITTEN_ATTR_ID = {
193+ ['INTEL'] = 241,
194+ ['SAMSUNG'] = 241,
195+ ['HUAWEI'] = 241,
196+ },
197+ 
198+ PERCENT_70 = 70,
199+ PERCENT_50 = 50,
200+ PERCENT_30 = 30,
201+ 
202+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_HOST_WRITTEN_L = 0x05, -- 用户区写入量低位
203+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_HOST_WRITTEN_H = 0x06, -- 用户区写入量高位
204+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_TOTAL_SPARE_BLOCK = 0x31, -- 用户区出厂时冗余块总数
205+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_VALID_SPARE_BLOCK = 0x33, -- 用户区当前有效冗余块个数
206+ HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_TOTAL_SPARE_BLOCK = 0x3A, -- 非用户区出厂时冗余块总数
207+ HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_VALID_SPARE_BLOCK = 0x3C, -- 非用户区当前有效冗余块个数
208+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_USED_LIFESPAN = 0x4E, -- 用户区根据P/E情况评估的已使用寿命
209+ HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_USED_LIFESPAN = 0x4F, -- 非用户区根据P/E情况评估的已使用寿命
210+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_NAND_WRITTEN_L = 0x52, -- 用户区nand flash写入量低位
211+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_NAND_WRITTEN_H = 0x53, -- 用户区nand flash写入量高位
212+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_PE_CYCLE = 0x5A, -- 用户区擦除次数规格值
213+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_ERASE_COUNT = 0x5B, -- 用户区擦除次数(最大,最小,平均)
214+ HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_WEAROUT = 0x5C, -- 用户区剩余磨损
215+ HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_PE_CYCLE = 0x67, -- 非用户区擦除次数规格值
216+ HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_ERASE_COUNT = 0x68, -- 非用户区擦除次数(最大,最小,平均)
217+ HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_WEAROUT = 0x69 -- 非用户区剩余磨损
218+}
219+ 
139local pd_vendor_id = {220local pd_vendor_id = {
140 PD_VENDOR_ID_INNOGRIT = 0xA84397,221 PD_VENDOR_ID_INNOGRIT = 0xA84397,
141 PD_VENDOR_ID_HIKSEMI = 0X4AC03F,222 PD_VENDOR_ID_HIKSEMI = 0X4AC03F,
@@ -235,86 +316,6 @@ local pd_vendor_id_name_map = {
235 [pd_vendor_id.PD_VENDOR_ID_BIWIN] = pd_vendor_name.PD_VENDOR_NAME_BIWIN,316 [pd_vendor_id.PD_VENDOR_ID_BIWIN] = pd_vendor_name.PD_VENDOR_NAME_BIWIN,
236}317}
237 318 
238-local pd_attri_id_wear = {
239- ATA_SMART_ATTRIBUTE_ID_MEDIA_WEAROUT_INDICATOR = 233,
240- ATA_SMART_ATTRIBUTE_ID_PERCENT_LIFETIME_REMAINING = 202,
241- ATA_SMART_ATTRIBUTE_ID_LIFE_REMAINING = 245,
242- ATA_SMART_ATTRIBUTE_ID_WEAR_LEVELING_COUNT = 177,
243- ATA_SMART_ATTRIBUTE_ID_AVAILABLE_RESERVED_SPACE = 232,
244-}
245- 
246-local pd_smart_defs = {
247- PD_VENDOR_NAME_INTEL = 'INTEL',
248- PD_VENDOR_NAME_SAMSUNG = 'SAMSUNG',
249- PD_VENDOR_NAME_HUAWEI = 'HUAWEI',
250- PD_VENDOR_NAME_AJ = 'UMIS',
251- 
252- VENDOR_ATTR_ID = {
253- ['INTEL'] = 233,
254- ['SAMSUNG'] = 177,
255- ['MICRON'] = 202,
256- ['SANDISK'] = 245,
257- ['SEAGATE'] = 0,
258- ['FUJITSU'] = 0,
259- ['WDC'] = 0,
260- ['HGST'] = 0,
261- ['SMI'] = 231,
262- ['LITEON ER2'] = 231,
263- ['LITEON CVZ'] = 231,
264- ['LITEON EGT'] = 245,
265- ['LITEON'] = 245,
266- ['PHISON'] = 231,
267- ['SSSTC'] = 231,
268- ['HYNIX'] = 231,
269- ['HUAWEI'] = 231,
270- ['YANGTZE MEMORY'] = 245,
271- ['RAMAXEL'] = 231,
272- ['UMIS'] = 231,
273- ['DERA'] = 248,
274- ['DATSSD'] = 233,
275- ['HUADIAN'] = 232,
276- ['LONGSYS'] = 202,
277- ['PETAIO'] = 177,
278- ['INNOGRIT'] = 202,
279- ['UNIS'] = 232,
280- ['BIWIN'] = 233
281- },
282- 
283- ONE_HUNDRED_PERCENT = 100,
284- 
285- NAND_WRITTEN_ATTR_ID = {
286- ['INTEL'] = 243,
287- ['SAMSUNG'] = 251,
288- ['HUAWEI'] = 245,
289- },
290- 
291- HOST_WRITTEN_ATTR_ID = {
292- ['INTEL'] = 241,
293- ['SAMSUNG'] = 241,
294- ['HUAWEI'] = 241,
295- },
296- 
297- PERCENT_70 = 70,
298- PERCENT_50 = 50,
299- PERCENT_30 = 30,
300- 
301- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_HOST_WRITTEN_L = 0x05, -- 用户区写入量低位
302- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_HOST_WRITTEN_H = 0x06, -- 用户区写入量高位
303- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_TOTAL_SPARE_BLOCK = 0x31, -- 用户区出厂时冗余块总数
304- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_VALID_SPARE_BLOCK = 0x33, -- 用户区当前有效冗余块个数
305- HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_TOTAL_SPARE_BLOCK = 0x3A, -- 非用户区出厂时冗余块总数
306- HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_VALID_SPARE_BLOCK = 0x3C, -- 非用户区当前有效冗余块个数
307- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_USED_LIFESPAN = 0x4E, -- 用户区根据P/E情况评估的已使用寿命
308- HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_USED_LIFESPAN = 0x4F, -- 非用户区根据P/E情况评估的已使用寿命
309- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_NAND_WRITTEN_L = 0x52, -- 用户区nand flash写入量低位
310- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_NAND_WRITTEN_H = 0x53, -- 用户区nand flash写入量高位
311- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_PE_CYCLE = 0x5A, -- 用户区擦除次数规格值
312- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_ERASE_COUNT = 0x5B, -- 用户区擦除次数(最大,最小,平均)
313- HW_DEFINED_SMART_ATTRIBUTE_ID_TLC_WEAROUT = 0x5C, -- 用户区剩余磨损
314- HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_PE_CYCLE = 0x67, -- 非用户区擦除次数规格值
315- HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_ERASE_COUNT = 0x68, -- 非用户区擦除次数(最大,最小,平均)
316- HW_DEFINED_SMART_ATTRIBUTE_ID_SLC_WEAROUT = 0x69 -- 非用户区剩余磨损
317-}
318 319 
319local common_def = {320local common_def = {
320 CTRL_OPTION = ctrl_option,321 CTRL_OPTION = ctrl_option,
@@ -245,23 +245,14 @@ function c_drive_collection:get_drive_by_device_id(ref_controller_id, device_id)
245 })245 })
246end246end
247 247 
248--- 以控制器Id为下标,注意不能多线程访问
249-local drive_list = {}
250- 
251function c_drive_collection:get_drives_by_controller_id(controller_id)248function c_drive_collection:get_drives_by_controller_id(controller_id)
252- if drive_list[controller_id] == nil then249+ local result = {}
253- drive_list[controller_id] = {}
254- else
255- for k, _ in pairs(drive_list[controller_id]) do
256- drive_list[controller_id][k] = nil
257- end
258- end
259 c_drive.collection:fold(function(acc, obj, key)250 c_drive.collection:fold(function(acc, obj, key)
260 if obj.RefControllerId == controller_id and obj.identify_pd ~= false and obj.presence ~= 0 then251 if obj.RefControllerId == controller_id and obj.identify_pd ~= false and obj.presence ~= 0 then
261- table.insert(drive_list[controller_id], obj.Name)252+ table.insert(result, obj.Name)
262 end253 end
263 end, {})254 end, {})
264- return drive_list[controller_id]255+ return result
265end256end
266 257 
267function c_drive_collection:get_drive_objs_by_controller_id(controller_id)258function c_drive_collection:get_drive_objs_by_controller_id(controller_id)
@@ -242,11 +242,9 @@ end
242 242 
243-- 根据 ManufacturerOUI 查找 ManufacturerName243-- 根据 ManufacturerOUI 查找 ManufacturerName
244function method_misc:get_manufacturer_name_by_oui(manufacturer_oui)244function method_misc:get_manufacturer_name_by_oui(manufacturer_oui)
245- for _, vendor in ipairs(common_def.DRIVE_VENDOR_TABLE) do245+ local vendor_id = tonumber(manufacturer_oui, 16)
246- local vendor_id = string.format("%X", vendor.vendor_id)246+ if vendor_id and common_def.PD_VENDOR_ID_NAME_MAP[vendor_id] then
247- if vendor_id == manufacturer_oui then247+ return common_def.PD_VENDOR_ID_NAME_MAP[vendor_id]
248- return vendor.vendor_name
249- end
250 end248 end
251 return 'ATA'249 return 'ATA'
252end250end