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 54efae78a..baf530c2a 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 @@ -56,7 +56,63 @@ class OpenBMCEventlogTask(ParallelNodesCommand): def clear_all_ev_records(self, **kw): node = kw['node'] + obmc = openbmc.OpenBMCRest(name=node, nodeinfo=kw['nodeinfo'], messager=self.callback, debugmode=self.debugmode, verbose=self.verbose) + try: + obmc.login() + obmc.clear_all_eventlog_records() + self.callback.info('%s: %s' % (node, "Logs cleared")) + + except (SelfServerException, SelfClientException) as e: + self.callback.error('%s' % e.message, node) + 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 635f37deb..5bdf8c678 100644 --- a/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py +++ b/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py @@ -236,7 +236,12 @@ RSPCONFIG_APIS = { }, } -EVENTLOG_URL = "/logging/enumerate" +EVENTLOG_URLS = { + "list": "/logging/enumerate", + "clear_all": "/logging/action/deleteAll", + "resolve": "/logging/entry/{}/attr/Resolved", +} + RAS_POLICY_TABLE = "/opt/ibm/ras/lib/policyTable.json" RAS_POLICY_MSG = "Install the OpenBMC RAS package to obtain more details logging messages." RAS_NOT_FOUND_MSG = " Not found in policy table: " @@ -624,7 +629,7 @@ class OpenBMCRest(object): # Extract all eventlog info and parse it def get_eventlog_info(self): - eventlog_data = self.request('GET', EVENTLOG_URL, cmd='get_eventlog_info') + eventlog_data = self.request('GET', EVENTLOG_URLS['list'], cmd='get_eventlog_info') return self.parse_eventlog_data(eventlog_data) @@ -649,6 +654,11 @@ class OpenBMCRest(object): id, event_log_line = self.parse_eventlog_data_record(value, ras_event_mapping) if int(id) != 0: eventlog_dict[str(id)] = event_log_line + + if not eventlog_dict: + # Nothing was returned from BMC + eventlog_dict['0'] ='No attributes returned from the BMC.' + return eventlog_dict except KeyError: error = 'Received wrong format response: %s' % eventlog_data @@ -714,6 +724,21 @@ class OpenBMCRest(object): formatted_line += LED_tag return id_str, formatted_line + # Clear all eventlog records + def clear_all_eventlog_records(self): + + 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] if 'set_url' not in attr_info: diff --git a/xCAT-openbmc-py/lib/python/agent/xcatagent/openbmc.py b/xCAT-openbmc-py/lib/python/agent/xcatagent/openbmc.py index c98a47bd0..25be9ecb9 100644 --- a/xCAT-openbmc-py/lib/python/agent/xcatagent/openbmc.py +++ b/xCAT-openbmc-py/lib/python/agent/xcatagent/openbmc.py @@ -444,7 +444,6 @@ class OpenBMCManager(base.BaseManager): # 3, run the subcommands runner = OpenBMCEventlogTask(nodesinfo, callback=self.messager, debugmode=self.debugmode, verbose=self.verbose) - self.messager.info('revetlog.py processing action=%s args=%s' % (action, args)) if action == 'clear': DefaultEventlogManager().clear_all_eventlog_records(runner) elif action == 'resolved': diff --git a/xCAT-test/autotest/testcase/UT_openbmc/reventlog_resolved_cases0 b/xCAT-test/autotest/testcase/UT_openbmc/reventlog_resolved_cases0 index c63d172dd..43b9a6410 100644 --- a/xCAT-test/autotest/testcase/UT_openbmc/reventlog_resolved_cases0 +++ b/xCAT-test/autotest/testcase/UT_openbmc/reventlog_resolved_cases0 @@ -33,3 +33,30 @@ cmd:reventlog $$CN resolved=-1 check:rc==1 check:output=~Error: Invalid ID= end + +start:reventlog_resolved_parse_error5 +description: Pass in a string +os:Linux +hcp:openbmc +cmd:reventlog $$CN resolved=abc +check:rc==1 +check:output=~Error: Invalid ID= +end + +start:reventlog_resolved_list +description: Pass in a list of ids +os:Linux +hcp:openbmc +cmd:reventlog $$CN resolved=100,101 +check:rc==0 +check:output=~Attempting to resolve the following log entries: 100,101... +end + +start:reventlog_resolved_LED +description: Pass in a LED keyword +os:Linux +hcp:openbmc +cmd:reventlog $$CN resolved=Led +check:rc==0 +check:output=~Attempting to resolve the following log entries: Led... +end