1e7e9171eSGeorge Keishing#!/usr/bin/env python3
2369b75c1SMichael Walsh
3*20f38712SPatrick Williamsfrom gen_arg import *
4*20f38712SPatrick Williamsfrom gen_call_robot import *
5*20f38712SPatrick Williamsfrom gen_cmd import *
6*20f38712SPatrick Williamsfrom gen_misc import *
7*20f38712SPatrick Williamsfrom gen_plug_in_utils import *
8369b75c1SMichael Walshfrom gen_print import *
9369b75c1SMichael Walshfrom gen_valid import *
10369b75c1SMichael Walshfrom var_funcs import *
11369b75c1SMichael Walsh
12369b75c1SMichael Walsh# Set exit_on_error for gen_valid functions.
13369b75c1SMichael Walshset_exit_on_error(True)
14369b75c1SMichael Walshignore_err = 0
15369b75c1SMichael Walsh
16369b75c1SMichael Walsh
17369b75c1SMichael Walshparser = argparse.ArgumentParser(
18*20f38712SPatrick Williams    usage="%(prog)s [OPTIONS]",
19369b75c1SMichael Walsh    description="%(prog)s will calculate the value of num_err_logs and"
20369b75c1SMichael Walsh    + " save it as a plug-in value for the benefit of the FFDC plug-in."
21369b75c1SMichael Walsh    + "  The FFDC plug-in can use that data to decide whether to collect"
22369b75c1SMichael Walsh    + " FFDC data.",
23369b75c1SMichael Walsh    formatter_class=argparse.ArgumentDefaultsHelpFormatter,
24*20f38712SPatrick Williams    prefix_chars="-+",
25*20f38712SPatrick Williams)
26369b75c1SMichael Walsh
27369b75c1SMichael Walsh# The stock_list will be passed to gen_get_options.  We populate it with the names of stock parm options we
28369b75c1SMichael Walsh# want.  These stock parms are pre-defined by gen_get_options.
29*20f38712SPatrick Williamsstock_list = [
30*20f38712SPatrick Williams    ("test_mode", 0),
31369b75c1SMichael Walsh    ("quiet", get_plug_default("quiet", 0)),
32*20f38712SPatrick Williams    ("debug", get_plug_default("debug", 0)),
33*20f38712SPatrick Williams]
34369b75c1SMichael Walsh
35369b75c1SMichael Walsh
36*20f38712SPatrick Williamsdef exit_function(signal_number=0, frame=None):
37369b75c1SMichael Walsh    r"""
38369b75c1SMichael Walsh    Execute whenever the program ends normally or with the signals that we catch (i.e. TERM, INT).
39369b75c1SMichael Walsh
40369b75c1SMichael Walsh    This function will be called by gen_exit_function().
41369b75c1SMichael Walsh    """
42369b75c1SMichael Walsh
43369b75c1SMichael Walsh    process_robot_output_files()
44369b75c1SMichael Walsh
45369b75c1SMichael Walsh
46369b75c1SMichael Walshdef validate_parms():
47369b75c1SMichael Walsh    r"""
48369b75c1SMichael Walsh    Validate program parameters, etc.
49369b75c1SMichael Walsh
50369b75c1SMichael Walsh    This function will be called by gen_setup().
51369b75c1SMichael Walsh    """
52369b75c1SMichael Walsh
53369b75c1SMichael Walsh    get_plug_vars()
54369b75c1SMichael Walsh
55369b75c1SMichael Walsh    global AUTOSCRIPT_STATUS_FILE_PATH
56369b75c1SMichael Walsh    # AUTOSCRIPT_STATUS_FILE_PATH is set when we're called by autoscript.  For this program to work
57369b75c1SMichael Walsh    # correctly, it must be called with autoscript.
58*20f38712SPatrick Williams    AUTOSCRIPT_STATUS_FILE_PATH = os.environ.get(
59*20f38712SPatrick Williams        "AUTOSCRIPT_STATUS_FILE_PATH", ""
60*20f38712SPatrick Williams    )
61369b75c1SMichael Walsh    valid_value(AUTOSCRIPT_STATUS_FILE_PATH)
62369b75c1SMichael Walsh    valid_value(AUTOBOOT_OPENBMC_HOST)
63369b75c1SMichael Walsh
64369b75c1SMichael Walsh
65369b75c1SMichael Walshdef main():
66369b75c1SMichael Walsh    gen_setup()
67369b75c1SMichael Walsh
68369b75c1SMichael Walsh    print_plug_in_header()
69369b75c1SMichael Walsh
70369b75c1SMichael Walsh    # Get the number of error logs from the BMC.
71369b75c1SMichael Walsh    init_robot_out_parms(get_plug_in_package_name() + "." + pgm_name + ".")
72*20f38712SPatrick Williams    high_sev_elogs_file_path = (
73*20f38712SPatrick Williams        AUTOBOOT_FFDC_DIR_PATH
74*20f38712SPatrick Williams        + AUTOBOOT_FFDC_PREFIX
75*20f38712SPatrick Williams        + "high_severity_errorlog.json"
76*20f38712SPatrick Williams    )
77369b75c1SMichael Walsh    lib_file_path = init_robot_file_path("lib/logging_utils.robot")
78369b75c1SMichael Walsh    lib_file_path += ":" + init_robot_file_path("lib/gen_robot_print.py")
79369b75c1SMichael Walsh    set_mod_global(lib_file_path)
80369b75c1SMichael Walsh
81*20f38712SPatrick Williams    REDFISH_SUPPORT_TRANS_STATE = int(
82*20f38712SPatrick Williams        os.environ.get("REDFISH_SUPPORT_TRANS_STATE", 0)
83*20f38712SPatrick Williams    )
842720764fSDavid Shaw    if not REDFISH_SUPPORT_TRANS_STATE:
852720764fSDavid Shaw        try:
862720764fSDavid Shaw            from robot.libraries.BuiltIn import BuiltIn
87*20f38712SPatrick Williams
88*20f38712SPatrick Williams            REDFISH_SUPPORT_TRANS_STATE = int(
89*20f38712SPatrick Williams                BuiltIn().get_variable_value(
90*20f38712SPatrick Williams                    "${REDFISH_SUPPORT_TRANS_STATE}", default=0
91*20f38712SPatrick Williams                )
92*20f38712SPatrick Williams            )
93a57fef4aSPatrick Williams        except Exception:
942720764fSDavid Shaw            pass
952720764fSDavid Shaw
96*20f38712SPatrick Williams    keyword_redfish_strings = [
97*20f38712SPatrick Williams        (
98*20f38712SPatrick Williams            "${error_logs}=  Get Redfish Event Logs "
99*20f38712SPatrick Williams            " &{filter_low_severity_errlogs}"
100*20f38712SPatrick Williams        ),
1012720764fSDavid Shaw        "${num_error_logs}=  Get Length  ${error_logs}",
1022720764fSDavid Shaw        "Rprint Vars  num_error_logs",
103*20f38712SPatrick Williams        (
104*20f38712SPatrick Williams            "${json_string}=  Evaluate  json.dumps($error_logs, indent=4) "
105*20f38712SPatrick Williams            " modules=json"
106*20f38712SPatrick Williams        ),
107*20f38712SPatrick Williams        "Append To File  " + high_sev_elogs_file_path + "  ${json_string}",
1082720764fSDavid Shaw    ]
1092720764fSDavid Shaw
110*20f38712SPatrick Williams    keyword_strings = [
111d4fbcf9bSmichael        "${error_logs}=  Get Error Logs  &{filter_low_severity_errlogs}",
112d4fbcf9bSmichael        "${num_error_logs}=  Get Length  ${error_logs}",
113d4fbcf9bSmichael        "Rprint Vars  num_error_logs",
114*20f38712SPatrick Williams        (
115*20f38712SPatrick Williams            "${json_string}=  Evaluate  json.dumps($error_logs, indent=4) "
116*20f38712SPatrick Williams            " modules=json"
117*20f38712SPatrick Williams        ),
118*20f38712SPatrick Williams        "Append To File  " + high_sev_elogs_file_path + "  ${json_string}",
119d4fbcf9bSmichael    ]
120369b75c1SMichael Walsh
1212720764fSDavid Shaw    if REDFISH_SUPPORT_TRANS_STATE:
122*20f38712SPatrick Williams        keyword_string = " ; ".join(keyword_redfish_strings)
1232720764fSDavid Shaw    else:
124*20f38712SPatrick Williams        keyword_string = " ; ".join(keyword_strings)
1252720764fSDavid Shaw
126d4fbcf9bSmichael    set_mod_global(keyword_string)
127*20f38712SPatrick Williams    cmd_buf = create_robot_cmd_string(
128*20f38712SPatrick Williams        "extended/run_keyword.robot",
129*20f38712SPatrick Williams        OPENBMC_HOST,
130*20f38712SPatrick Williams        SSH_PORT,
131*20f38712SPatrick Williams        HTTPS_PORT,
132*20f38712SPatrick Williams        OPENBMC_USERNAME,
133*20f38712SPatrick Williams        OPENBMC_PASSWORD,
134*20f38712SPatrick Williams        keyword_string,
135*20f38712SPatrick Williams        lib_file_path,
136*20f38712SPatrick Williams        quiet,
137*20f38712SPatrick Williams        test_mode,
138*20f38712SPatrick Williams        debug,
139*20f38712SPatrick Williams        outputdir,
140*20f38712SPatrick Williams        output,
141*20f38712SPatrick Williams        log,
142*20f38712SPatrick Williams        report,
143*20f38712SPatrick Williams    )
144369b75c1SMichael Walsh    if not robot_cmd_fnc(cmd_buf):
145369b75c1SMichael Walsh        exit(1)
146369b75c1SMichael Walsh    # The output contains the num_error_logs value which we will isolate with egrep.
147*20f38712SPatrick Williams    rc, out_buf = shell_cmd(
148*20f38712SPatrick Williams        "egrep '^num_error_logs:[ ]' " + AUTOSCRIPT_STATUS_FILE_PATH,
149*20f38712SPatrick Williams        quiet=1,
150*20f38712SPatrick Williams        print_output=0,
151*20f38712SPatrick Williams    )
152369b75c1SMichael Walsh    result = key_value_outbuf_to_dict(out_buf)
153*20f38712SPatrick Williams    num_error_logs = int(result["num_error_logs"])
154369b75c1SMichael Walsh    save_plug_in_value(num_error_logs)
155d4fbcf9bSmichael    if num_error_logs > 0:
156*20f38712SPatrick Williams        qprint_timen(
157*20f38712SPatrick Williams            "Adding the name of our high severity error logs FFDC file "
158*20f38712SPatrick Williams            + "to the appropriate file list."
159*20f38712SPatrick Williams        )
160*20f38712SPatrick Williams        shell_cmd(
161*20f38712SPatrick Williams            "echo "
162*20f38712SPatrick Williams            + high_sev_elogs_file_path
163*20f38712SPatrick Williams            + " > "
164*20f38712SPatrick Williams            + AUTOBOOT_FFDC_LIST_FILE_PATH
165*20f38712SPatrick Williams        )
166d4fbcf9bSmichael    else:
167d4fbcf9bSmichael        os.remove(high_sev_elogs_file_path)
168369b75c1SMichael Walsh
169369b75c1SMichael Walsh
170369b75c1SMichael Walshmain()
171