1#!/usr/bin/env python3
2
3r"""
4Check for stop conditions.  Return code of 2 if stop conditions are found.
5"""
6
7import sys
8import subprocess
9
10from gen_print import *
11from gen_valid import *
12from gen_arg import *
13from gen_misc import *
14from gen_cmd import *
15from gen_plug_in_utils import *
16from gen_call_robot import *
17
18# Set exit_on_error for gen_valid functions.
19set_exit_on_error(True)
20
21# Initialize default plug-in parms..
22STOP_REST_FAIL = 0
23STOP_COMMAND = ''
24stop_test_rc = 2
25STOP_VERIFY_HARDWARE_FAIL = 0
26
27
28# Create parser object to process command line parameters and args.
29parser = argparse.ArgumentParser(
30    usage='%(prog)s [OPTIONS]',
31    description="If the \"Stop\" plug-in is selected by the user, %(prog)s" +
32    " is called by OBMC Boot Test after each boot test.  If %(prog)s returns" +
33    " " + str(stop_test_rc) + ", then OBMC Boot Test will stop.  The user" +
34    " may set environment variable STOP_COMMAND to contain any valid bash" +
35    " command or program.  %(prog)s will run this stop command.  If the stop" +
36    " command returns non-zero, then %(prog)s will return " +
37    str(stop_test_rc) + ".  %(prog)s recognizes some special values for" +
38    " STOP_COMMAND: 1) \"FAIL\" means that OBMC Boot Test should stop" +
39    " whenever a boot test fails. 2) \"ALL\" means that OBMC Boot Test" +
40    " should stop after any boot test.  If environment variable" +
41    " STOP_REST_FAIL is set, OBMC Boot Test will stop if REST commands are" +
42    " no longer working.",
43    formatter_class=argparse.ArgumentDefaultsHelpFormatter,
44    prefix_chars='-+')
45
46# The stock_list will be passed to gen_get_options.  We populate it with the names of stock parm options we
47# want.  These stock parms are pre-defined by gen_get_options.
48stock_list = [("test_mode", get_plug_default("test_mode", 0)),
49              ("quiet", get_plug_default("quiet", 0)),
50              ("debug", get_plug_default("debug", 0))]
51
52
53def exit_function(signal_number=0,
54                  frame=None):
55    r"""
56    Execute whenever the program ends normally or with the signals that we catch (i.e. TERM, INT).
57
58    This function will be called by gen_exit_function().
59    """
60
61    process_robot_output_files()
62
63
64def validate_parms():
65    r"""
66    Validate program parameters, etc.
67
68    This function will be called by gen_setup().
69    """
70
71    get_plug_vars()
72
73
74def stop_check():
75    r"""
76    Stop this program with the stop check return code.
77    """
78
79    if MASTER_PID != PROGRAM_PID:
80        save_plug_in_value(stop_check_rc=stop_test_rc)
81    exit(stop_test_rc)
82
83
84def rest_fail():
85    r"""
86    If STOP_REST_FAIL, then this function will determine whether REST commands to the target are working.  If
87    not, this function will stop the program by returning stop_test_rc.
88    """
89
90    if not STOP_REST_FAIL:
91        return
92
93    print_timen("Checking to see whether REST commands are working.")
94    init_robot_out_parms(get_plug_in_package_name() + "." + pgm_name + ".")
95    lib_file_path = init_robot_file_path("lib/state.py") + ":" \
96        + init_robot_file_path("lib/gen_robot_print.py")
97    set_mod_global(lib_file_path)
98    timeout = '0 seconds'
99    interval = '1 second'
100    keyword_string = "${match_state}=  Create Dictionary  rest=1 ;" +\
101        " ${state}=  Wait State  ${match_state}  " + timeout + "  " +\
102        interval + "  quiet=${1} ; Rpvar  state"
103    set_mod_global(keyword_string)
104
105    cmd_buf = create_robot_cmd_string("extended/run_keyword.robot", OPENBMC_HOST, SSH_PORT, HTTPS_PORT,
106                                      REST_USERNAME, REST_PASSWORD, OPENBMC_USERNAME, OPENBMC_PASSWORD,
107                                      keyword_string, lib_file_path, quiet,
108                                      test_mode, debug, outputdir, output, log, report, loglevel)
109    if not robot_cmd_fnc(cmd_buf):
110        print_timen("The caller wishes to stop test execution if REST commands are failing.")
111        stop_check()
112    print_timen("REST commands are working so no reason as of yet to stop the test.")
113
114
115def esel_stop_check():
116    r"""
117    Run the esel_stop_check program to determine whether any eSEL entries found warrant stopping the test
118    run.  See esel_stop_check help text for details.
119    """
120
121    if STOP_ESEL_STOP_FILE_PATH == "":
122        return
123
124    cmd_buf = "esel_stop_check --esel_stop_file_path=" + STOP_ESEL_STOP_FILE_PATH
125    shell_rc, out_buf = shell_cmd(cmd_buf, show_err=0)
126    if shell_rc == stop_test_rc:
127        print_timen("The caller wishes to stop test execution based on the presence of certain esel entries.")
128        stop_check()
129
130
131def main():
132
133    gen_setup()
134
135    print_plug_in_header()
136
137    if STOP_COMMAND.upper() == "FAIL":
138        if AUTOBOOT_BOOT_SUCCESS == "0":
139            print_timen("The caller wishes to stop after each boot failure.")
140            stop_check()
141    elif STOP_COMMAND.upper() == "ALL":
142        print_timen("The caller wishes to stop after each boot test.")
143        stop_check()
144    elif len(STOP_COMMAND) > 0:
145        shell_rc, out_buf = shell_cmd(STOP_COMMAND, quiet=quiet, show_err=0)
146        if shell_rc != 0:
147            print_timen("The caller wishes to stop test execution.")
148            stop_check()
149
150    rest_fail()
151
152    esel_stop_check()
153
154    if STOP_VERIFY_HARDWARE_FAIL:
155        hardware_error_found = restore_plug_in_value(0, 'Verify_hardware')
156        if hardware_error_found:
157            print_timen("The caller wishes to stop test execution when the Verify_hardware plug-in detects a"
158                        + " hardware error.")
159            stop_check()
160
161    qprint_timen("The caller does not wish to stop the test run.")
162
163
164main()
165