From 1bf95406b525c2ce1c1b20c199aa966476d35fb9 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Tue, 4 Feb 2025 11:55:16 -0500 Subject: [PATCH] Handle inventory for systemless redfish endpoint If an endpoint has no system, use chassis for data. Further, for SMM3, do some fixup on 'Model' versus 'SKU'. Change-Id: Ibf8d72381057d43f9ad59469078fd4899330c74f --- pyghmi/redfish/oem/generic.py | 44 ++++++++++++++++++++++--------- pyghmi/redfish/oem/lenovo/smm3.py | 15 +++++++++++ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/pyghmi/redfish/oem/generic.py b/pyghmi/redfish/oem/generic.py index 4967f8fe..a9ace6a2 100644 --- a/pyghmi/redfish/oem/generic.py +++ b/pyghmi/redfish/oem/generic.py @@ -688,15 +688,30 @@ class OEMHandler(object): for adp in self._get_adp_inventory(True, withids): yield adp + def _get_node_info(self): + nodeinfo = self._varsysinfo + if not nodeinfo: + overview = self._do_web_request('/redfish/v1/') + chassismembs = overview.get('Chassis', {}).get('@odata.id', None) + if not chassismembs: + return nodeinfo + chassislist = self._do_web_request(chassismembs) + chassismembs = chassislist.get('Members', []) + if len(chassismembs) == 1: + chassisurl = chassismembs[0]['@odata.id'] + nodeinfo = self._do_web_request(chassisurl) + return nodeinfo + def get_inventory_of_component(self, component): if component.lower() == 'system': + nodeinfo = self._get_node_info() sysinfo = { - 'UUID': self._varsysinfo.get('UUID', ''), - 'Serial Number': self._varsysinfo.get('SerialNumber', ''), - 'Manufacturer': self._varsysinfo.get('Manufacturer', ''), - 'Product name': self._varsysinfo.get('Model', ''), - 'Model': self._varsysinfo.get( - 'SKU', self._varsysinfo.get('PartNumber', '')), + 'UUID': nodeinfo.get('UUID', ''), + 'Serial Number': nodeinfo.get('SerialNumber', ''), + 'Manufacturer': nodeinfo.get('Manufacturer', ''), + 'Product name': nodeinfo.get('Model', ''), + 'Model': nodeinfo.get( + 'SKU', nodeinfo.get('PartNumber', '')), } if sysinfo['UUID'] and '-' not in sysinfo['UUID']: sysinfo['UUID'] = '-'.join(( @@ -711,13 +726,14 @@ class OEMHandler(object): return invpair[1] def get_inventory(self, withids=False): + nodeinfo = self._get_node_info() sysinfo = { - 'UUID': self._varsysinfo.get('UUID', ''), - 'Serial Number': self._varsysinfo.get('SerialNumber', ''), - 'Manufacturer': self._varsysinfo.get('Manufacturer', ''), - 'Product name': self._varsysinfo.get('Model', ''), - 'Model': self._varsysinfo.get( - 'SKU', self._varsysinfo.get('PartNumber', '')), + 'UUID': nodeinfo.get('UUID', ''), + 'Serial Number': nodeinfo.get('SerialNumber', ''), + 'Manufacturer': nodeinfo.get('Manufacturer', ''), + 'Product name': nodeinfo.get('Model', ''), + 'Model': nodeinfo.get( + 'SKU', nodeinfo.get('PartNumber', '')), } if sysinfo['UUID'] and '-' not in sysinfo['UUID']: sysinfo['UUID'] = '-'.join(( @@ -926,6 +942,8 @@ class OEMHandler(object): def _get_cpu_data(self, expand='.'): cpurl = self._varsysinfo.get('Processors', {}).get('@odata.id', None) + if not cpurl: + return {} return self._get_expanded_data(cpurl, expand) @@ -966,6 +984,8 @@ class OEMHandler(object): def _get_mem_data(self, expand='.'): memurl = self._varsysinfo.get('Memory', {}).get('@odata.id', None) + if not memurl: + return {} return self._get_expanded_data(memurl, expand) def _get_expanded_data(self, url, expand='.'): diff --git a/pyghmi/redfish/oem/lenovo/smm3.py b/pyghmi/redfish/oem/lenovo/smm3.py index 8330c859..ca480842 100644 --- a/pyghmi/redfish/oem/lenovo/smm3.py +++ b/pyghmi/redfish/oem/lenovo/smm3.py @@ -53,6 +53,21 @@ class OEMHandler(generic.OEMHandler): health = healthlookup.get(health, pygconst.Health.Critical) return {'health': health} + def _get_node_info(self): + nodeinfo = self._varsysinfo + if not nodeinfo: + overview = self._do_web_request('/redfish/v1/') + chassismembs = overview.get('Chassis', {}).get('@odata.id', None) + if not chassismembs: + return nodeinfo + chassislist = self._do_web_request(chassismembs) + chassismembs = chassislist.get('Members', []) + if len(chassismembs) == 1: + chassisurl = chassismembs[0]['@odata.id'] + nodeinfo = self._do_web_request(chassisurl) + nodeinfo['SKU'] = nodeinfo['Model'] + nodeinfo['Model'] = 'N1380 Enclosure' + return nodeinfo def reseat_bay(self, bay): bayid = _baytolabel(bay)