diff --git a/xCAT-openbmc-py/lib/python/agent/hwctl/executor/openbmc_eventlog.py b/xCAT-openbmc-py/lib/python/agent/hwctl/executor/openbmc_eventlog.py index ee3ba2458..fdfa7097d 100644 --- a/xCAT-openbmc-py/lib/python/agent/hwctl/executor/openbmc_eventlog.py +++ b/xCAT-openbmc-py/lib/python/agent/hwctl/executor/openbmc_eventlog.py @@ -26,7 +26,7 @@ class OpenBMCEventlogTask(ParallelNodesCommand): number_to_display = 0 try: # Number of records to display from the end - number_to_display = 0-int(num_to_display[0]) + number_to_display = 0-int(num_to_display) except Exception: # All records to display number_to_display = 0 @@ -69,3 +69,50 @@ class OpenBMCEventlogTask(ParallelNodesCommand): def resolve_ev_records(self, resolve_list, **kw): node = kw['node'] + obmc = openbmc.OpenBMCRest(name=node, nodeinfo=kw['nodeinfo'], messager=self.callback, debugmode=self.debugmode, verbose=self.verbose) + try: + obmc.login() + + # Get all eventlog records + eventlog_info_dict = obmc.get_eventlog_info() + + keys = eventlog_info_dict.keys() + # Sort the keys in natural order + keys.sort(key=lambda x : int(x[0:])) + + resolved, ids = resolve_list.split('=') + eventlog_ids_to_resolve = [] + if ids.upper() == "LED": + + # loop through eventlog_info_dict and collect LED ids to be resolved into a eventlog_ids_to_resolve array + for key in list(keys): + if "[LED]" in eventlog_info_dict[key]: + if "Resolved: 0" in eventlog_info_dict[key]: + eventlog_ids_to_resolve.append(key) + else: + if self.verbose: + self.callback.info('%s: Not resolving already resolved eventlog ID %s' % (node, key)) + else: + # loop through list of ids and collect ids to resolve into a eventlog_ids_to_resolve array + for id_to_resolve in ids.split(','): + if id_to_resolve in eventlog_info_dict: + if "Resolved: 0" in eventlog_info_dict[id_to_resolve]: + eventlog_ids_to_resolve.append(id_to_resolve) + else: + if self.verbose: + self.callback.info('%s: Not resolving already resolved eventlog ID %s' % (node, id_to_resolve)) + else: + self.callback.info('%s: Invalid ID: %s' % (node, id_to_resolve)) + + if len(eventlog_ids_to_resolve) == 0: + # At the end and there are no entries to resolve + self.callback.info('%s: No event log entries needed to be resolved' % node) + else: + # Resolve entries that were collected into the eventlog_ids_to_resolve array + obmc.resolve_event_log_entries(eventlog_ids_to_resolve) + for entry in eventlog_ids_to_resolve: + self.callback.info('%s: Resolved %s' % (node, entry)) + + except (SelfServerException, SelfClientException) as e: + self.callback.error('%s' % e.message, node) + diff --git a/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py b/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py index 8a9f4640d..0a1323220 100644 --- a/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py +++ b/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py @@ -220,8 +220,9 @@ RSPCONFIG_APIS = { } EVENTLOG_URLS = { - "list": "/logging/enumerate", + "list": "/logging/enumerate", "clear_all": "/logging/action/deleteAll", + "resolve": "/logging/entry/{}/attr/Resolved", } RAS_POLICY_TABLE = "/opt/ibm/ras/lib/policyTable.json" @@ -664,6 +665,14 @@ class OpenBMCRest(object): payload = { "data": [] } return self.request('POST', EVENTLOG_URLS['clear_all'], payload=payload, cmd='clear_all_eventlog_records') + # Resolve eventlog records + def resolve_event_log_entries(self, eventlog_ids_to_resolve): + + payload = { "data": "1" } + for event_id in eventlog_ids_to_resolve: + self.request('PUT', EVENTLOG_URLS['resolve'].format(event_id), payload=payload, cmd='resolve_event_log_entries') + + return def set_apis_values(self, key, value): attr_info = RSPCONFIG_APIS[key]