From 8491449266a8bbac581d88d835f2221b5ba1fc8e Mon Sep 17 00:00:00 2001 From: Mark Gurevich Date: Fri, 2 Mar 2018 10:26:20 -0500 Subject: [PATCH 1/4] [DO NOT MERGE} OpenBMC reventlog clear in Python --- .../agent/hwctl/executor/openbmc_eventlog.py | 9 +++++++++ .../lib/python/agent/hwctl/openbmc_client.py | 19 +++++++++++++++++-- .../lib/python/agent/xcatagent/openbmc.py | 1 - 3 files changed, 26 insertions(+), 3 deletions(-) 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 243b469f7..f582270e5 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 @@ -56,6 +56,15 @@ 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() + + except (SelfServerException, SelfClientException) as e: + self.callback.error('%s' % e.message, node) + + self.callback.info('%s: %s' % (node, "Logs cleared")) def resolve_ev_records(self, resolve_list, **kw): 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 8b1dc1605..892c687da 100644 --- a/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py +++ b/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py @@ -219,7 +219,11 @@ RSPCONFIG_APIS = { }, } -EVENTLOG_URL = "/logging/enumerate" +EVENTLOG_URLS = { + "list": "/logging/enumerate", + "clear_all": "/logging/action/deleteAll", +} + 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: " @@ -559,7 +563,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) @@ -584,6 +588,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 = 'Error: Received wrong format response: %s' % eventlog_data @@ -649,6 +658,12 @@ class OpenBMCRest(object): formatted_line += LED_tag return id_str, formatted_line + # Clear all eventlog records + def clear_all_eventlog_records(self): + + return self.request('POST', EVENTLOG_URLS['clear_all'], cmd='clear_all_eventlog_records') + + 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 6d382d140..629f9e781 100644 --- a/xCAT-openbmc-py/lib/python/agent/xcatagent/openbmc.py +++ b/xCAT-openbmc-py/lib/python/agent/xcatagent/openbmc.py @@ -872,7 +872,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': From 7cb0065a98fa6e84113346fc68680183a430f988 Mon Sep 17 00:00:00 2001 From: Mark Gurevich Date: Mon, 5 Mar 2018 09:18:19 -0500 Subject: [PATCH 2/4] Payload data for clear action --- .../lib/python/agent/hwctl/executor/openbmc_eventlog.py | 2 +- xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) 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 f582270e5..ee3ba2458 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 @@ -60,11 +60,11 @@ class OpenBMCEventlogTask(ParallelNodesCommand): 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) - self.callback.info('%s: %s' % (node, "Logs cleared")) def resolve_ev_records(self, resolve_list, **kw): 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 892c687da..8a9f4640d 100644 --- a/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py +++ b/xCAT-openbmc-py/lib/python/agent/hwctl/openbmc_client.py @@ -661,7 +661,8 @@ class OpenBMCRest(object): # Clear all eventlog records def clear_all_eventlog_records(self): - return self.request('POST', EVENTLOG_URLS['clear_all'], cmd='clear_all_eventlog_records') + payload = { "data": [] } + return self.request('POST', EVENTLOG_URLS['clear_all'], payload=payload, cmd='clear_all_eventlog_records') def set_apis_values(self, key, value): From 072a04fd846bc5ff064e5de2e58c57d7e0b18cd6 Mon Sep 17 00:00:00 2001 From: Mark Gurevich Date: Tue, 6 Mar 2018 15:43:42 -0500 Subject: [PATCH 3/4] OpenBMC reventlog resolved support --- .../agent/hwctl/executor/openbmc_eventlog.py | 49 ++++++++++++++++++- .../lib/python/agent/hwctl/openbmc_client.py | 11 ++++- 2 files changed, 58 insertions(+), 2 deletions(-) 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] From 706068f688f5d5939ccec26444e9478ef018627a Mon Sep 17 00:00:00 2001 From: Mark Gurevich Date: Thu, 8 Mar 2018 11:24:52 -0500 Subject: [PATCH 4/4] UT cases --- .../UT_openbmc/reventlog_resolved_cases0 | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) 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