From 26be05fd30fe7a8e24d7185981469678b7932f0b Mon Sep 17 00:00:00 2001 From: Vlad Spoiala Date: Tue, 28 Jun 2022 18:20:53 +0300 Subject: [PATCH] Improve Whitley vs Purley storage API detection. Trying each API call in any order doesn't work correctly for all cases since the API call for Whitley incorrectly returns success on the newest Purley firmware and vice versa. The Whitley volume properties have some extra keys in them. Use one of the extra keys to differentiate between Purley and Whitley. Change-Id: Ia18631ec16107492e8753eb4312c56171ebd33f0 --- pyghmi/ipmi/oem/lenovo/imm.py | 17 +++++++++-------- pyghmi/redfish/oem/lenovo/xcc.py | 15 ++++++++------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/pyghmi/ipmi/oem/lenovo/imm.py b/pyghmi/ipmi/oem/lenovo/imm.py index 4c6c1bce..d0baa286 100644 --- a/pyghmi/ipmi/oem/lenovo/imm.py +++ b/pyghmi/ipmi/oem/lenovo/imm.py @@ -1444,7 +1444,7 @@ class XCCClient(IMMClient): url = '/api/function/raid_conf?params=raidlink_GetDefaultVolProp' args = (url, cid, 0, params['drives']) props = self.wc.grab_json_response(','.join([str(x) for x in args])) - if not props: # newer firmwarerequires raidlevel too + if not props: # newer firmware requires raidlevel too args = (url, cid, params['raidlevel'], 0, params['drives']) props = self.wc.grab_json_response(','.join([str(x) for x in args])) props = props['items'][0] @@ -1517,13 +1517,14 @@ class XCCClient(IMMClient): parms = {'raidlink_AddNewVolWithNaAsync': arglist} rsp = self.wc.grab_json_response(url, parms) if rsp['return'] == 14: # newer firmware - arglist = '{0},{1},{2},{3},{4},{5},{6},'.format( - cnum, params['raidlevel'], params['spans'], - params['perspan'], 0, params['drives'], params['hotspares']) - arglist += ''.join(vols) - parms = {'raidlink_AddNewVolWithNaAsync': arglist} - rsp = self.wc.grab_json_response(url, parms) - if not rsp: # Purley + if 'supported_cpwb' in props: # Whitley + arglist = '{0},{1},{2},{3},{4},{5},{6},'.format( + cnum, params['raidlevel'], params['spans'], + params['perspan'], 0, params['drives'], params['hotspares']) + arglist += ''.join(vols) + parms = {'raidlink_AddNewVolWithNaAsync': arglist} + rsp = self.wc.grab_json_response(url, parms) + else: # Purley if cid[2] == 2: cnum = cid[1] arglist = '{0},{1},{2},{3},{4},{5},'.format( diff --git a/pyghmi/redfish/oem/lenovo/xcc.py b/pyghmi/redfish/oem/lenovo/xcc.py index 31f1e6fb..17d25f70 100644 --- a/pyghmi/redfish/oem/lenovo/xcc.py +++ b/pyghmi/redfish/oem/lenovo/xcc.py @@ -642,13 +642,14 @@ class OEMHandler(generic.OEMHandler): parms = {'raidlink_AddNewVolWithNaAsync': arglist} rsp = self.wc.grab_json_response(url, parms) if rsp['return'] == 14: # newer firmware - arglist = '{0},{1},{2},{3},{4},{5},{6},'.format( - cnum, params['raidlevel'], params['spans'], - params['perspan'], 0, params['drives'], params['hotspares']) - arglist += ''.join(vols) - parms = {'raidlink_AddNewVolWithNaAsync': arglist} - rsp = self.wc.grab_json_response(url, parms) - if not rsp: # Purley + if 'supported_cpwb' in props: # Whitley + arglist = '{0},{1},{2},{3},{4},{5},{6},'.format( + cnum, params['raidlevel'], params['spans'], + params['perspan'], 0, params['drives'], params['hotspares']) + arglist += ''.join(vols) + parms = {'raidlink_AddNewVolWithNaAsync': arglist} + rsp = self.wc.grab_json_response(url, parms) + else: # Purley if cid[2] == 2: cnum = cid[1] arglist = '{0},{1},{2},{3},{4},{5},'.format(