From 65c66422e43a38feb8124779b47993e0d0b3cf64 Mon Sep 17 00:00:00 2001 From: Vlad Spoiala Date: Tue, 21 Mar 2023 19:53:37 +0200 Subject: [PATCH] Update storage code to handle 2023 XCC FW. Change-Id: I2a9d086b9fa792bb37e04ca93d2e18ef94bedabb --- pyghmi/ipmi/oem/lenovo/imm.py | 22 ++++++++++++++++++++-- pyghmi/redfish/oem/lenovo/xcc.py | 24 +++++++++++++++++++++--- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/pyghmi/ipmi/oem/lenovo/imm.py b/pyghmi/ipmi/oem/lenovo/imm.py index 6956c831..0d5ab46e 100644 --- a/pyghmi/ipmi/oem/lenovo/imm.py +++ b/pyghmi/ipmi/oem/lenovo/imm.py @@ -1489,12 +1489,21 @@ class XCCClient(IMMClient): def _create_array(self, pool): params = self._parse_array_spec(pool) cid = params['controller'].split(',')[0] + cslotno = params['controller'].split(',')[1] 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 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])) + elif 'return' in props and props['return'] == 22: + # Jan 2023 XCC FW - without controller slot number + args = (url, cid, params['raidlevel'], 0, params['drives']) + props = self.wc.grab_json_response(','.join([str(x) for x in args])) + if 'return' in props and props['return'] == 22: + # Jan 2023 XCC FW - with controller slot number + args = (url, cid, params['raidlevel'], 0, params['drives'], cslotno) + props = self.wc.grab_json_response(','.join([str(x) for x in args])) props = props['items'][0] volumes = pool.volumes remainingcap = params['capacity'] @@ -1565,14 +1574,23 @@ class XCCClient(IMMClient): parms = {'raidlink_AddNewVolWithNaAsync': arglist} rsp = self.wc.grab_json_response(url, parms) if rsp['return'] == 14: # newer firmware - if 'supported_cpwb' in props: # Whitley + if 'supported_cpwb' in props: # June 2022 XCC FW 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 not rsp: # Jan 2023 XCC FW + if cid[2] == 2: + cnum = cid[1] + arglist = '{0},{1},{2},{3},{4},{5},'.format( + cnum, params['raidlevel'], params['spans'], + params['perspan'], params['drives'], params['hotspares']) + arglist += ''.join(vols) + ',{0}'.format(cid[2]) + parms = {'raidlink_AddNewVolWithNaAsync': arglist} + rsp = self.wc.grab_json_response(url, parms) + else: # June 2022 XCC FW 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 7c61772b..784d90a3 100644 --- a/pyghmi/redfish/oem/lenovo/xcc.py +++ b/pyghmi/redfish/oem/lenovo/xcc.py @@ -811,12 +811,21 @@ class OEMHandler(generic.OEMHandler): def _create_array(self, pool): params = self._parse_array_spec(pool) cid = params['controller'].split(',')[0] + cslotno = params['controller'].split(',')[1] 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])) + elif 'return' in props and props['return'] == 22: + # Jan 2023 XCC FW - without controller slot number + args = (url, cid, params['raidlevel'], 0, params['drives']) + props = self.wc.grab_json_response(','.join([str(x) for x in args])) + if 'return' in props and props['return'] == 22: + # Jan 2023 XCC FW - with controller slot number + args = (url, cid, params['raidlevel'], 0, params['drives'], cslotno) + props = self.wc.grab_json_response(','.join([str(x) for x in args])) props = props['items'][0] volumes = pool.volumes remainingcap = params['capacity'] @@ -888,14 +897,23 @@ class OEMHandler(generic.OEMHandler): parms = {'raidlink_AddNewVolWithNaAsync': arglist} rsp = self.wc.grab_json_response(url, parms) if rsp['return'] == 14: # newer firmware - if 'supported_cpwb' in props: # Whitley + if 'supported_cpwb' in props: # June 2022 XCC FW 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 not rsp: # Jan 2023 XCC FW + if cid[2] == 2: + cnum = cid[1] + arglist = '{0},{1},{2},{3},{4},{5},'.format( + cnum, params['raidlevel'], params['spans'], + params['perspan'], params['drives'], params['hotspares']) + arglist += ''.join(vols) + ',{0}'.format(cid[2]) + parms = {'raidlink_AddNewVolWithNaAsync': arglist} + rsp = self.wc.grab_json_response(url, parms) + else: # June 2022 XCC FW if cid[2] == 2: cnum = cid[1] arglist = '{0},{1},{2},{3},{4},{5},'.format(