blob: 3bbc299f132e052d6fa3d837e267c02644d41d5c [file] [log] [blame]
George Keishinge7e91712021-09-03 11:28:44 -05001#!/usr/bin/env python3
Michael Walsh3ba8ecd2018-04-24 11:33:25 -05002
3r"""
4Check for stop conditions. Return code of 2 if stop conditions are found.
5"""
6
7import sys
8import subprocess
Michael Sheposb3dffe82022-01-06 07:17:16 -06009import os
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050010
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050011from gen_print import *
12from gen_valid import *
13from gen_arg import *
14from gen_misc import *
15from gen_cmd import *
16from gen_plug_in_utils import *
17from gen_call_robot import *
18
Michael Walsh2ea965c2019-08-01 16:14:25 -050019# Set exit_on_error for gen_valid functions.
20set_exit_on_error(True)
21
Michael Walsh71fec432020-04-09 17:25:31 -050022# Initialize default plug-in parms..
23STOP_REST_FAIL = 0
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050024STOP_COMMAND = ''
25stop_test_rc = 2
Michael Walsh71fec432020-04-09 17:25:31 -050026STOP_VERIFY_HARDWARE_FAIL = 0
27
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050028
29# Create parser object to process command line parameters and args.
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050030parser = argparse.ArgumentParser(
31 usage='%(prog)s [OPTIONS]',
32 description="If the \"Stop\" plug-in is selected by the user, %(prog)s" +
33 " is called by OBMC Boot Test after each boot test. If %(prog)s returns" +
34 " " + str(stop_test_rc) + ", then OBMC Boot Test will stop. The user" +
35 " may set environment variable STOP_COMMAND to contain any valid bash" +
36 " command or program. %(prog)s will run this stop command. If the stop" +
37 " command returns non-zero, then %(prog)s will return " +
38 str(stop_test_rc) + ". %(prog)s recognizes some special values for" +
39 " STOP_COMMAND: 1) \"FAIL\" means that OBMC Boot Test should stop" +
40 " whenever a boot test fails. 2) \"ALL\" means that OBMC Boot Test" +
41 " should stop after any boot test. If environment variable" +
42 " STOP_REST_FAIL is set, OBMC Boot Test will stop if REST commands are" +
43 " no longer working.",
Michael Walsh8d6bf602020-05-05 13:56:50 -050044 formatter_class=argparse.ArgumentDefaultsHelpFormatter,
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050045 prefix_chars='-+')
46
Michael Walsh410b1782019-10-22 15:56:18 -050047# The stock_list will be passed to gen_get_options. We populate it with the names of stock parm options we
48# want. These stock parms are pre-defined by gen_get_options.
Michael Walsh1ea9b7a2020-04-02 13:39:25 -050049stock_list = [("test_mode", get_plug_default("test_mode", 0)),
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050050 ("quiet", get_plug_default("quiet", 0)),
51 ("debug", get_plug_default("debug", 0))]
52
53
54def exit_function(signal_number=0,
55 frame=None):
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050056 r"""
Michael Walsh410b1782019-10-22 15:56:18 -050057 Execute whenever the program ends normally or with the signals that we catch (i.e. TERM, INT).
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050058
Michael Walsh71fec432020-04-09 17:25:31 -050059 This function will be called by gen_exit_function().
60 """
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050061
Michael Walsha0ce75a2018-07-31 13:54:29 -050062 process_robot_output_files()
63
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050064
65def validate_parms():
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050066 r"""
Michael Walsh71fec432020-04-09 17:25:31 -050067 Validate program parameters, etc.
68
69 This function will be called by gen_setup().
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050070 """
71
72 get_plug_vars()
73
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050074
Michael Walsh2ce1dba2019-02-05 19:29:28 +000075def stop_check():
76 r"""
77 Stop this program with the stop check return code.
78 """
79
80 if MASTER_PID != PROGRAM_PID:
Michael Walshc213d492019-11-20 14:26:05 -060081 save_plug_in_value(stop_check_rc=stop_test_rc)
Michael Walsh2ce1dba2019-02-05 19:29:28 +000082 exit(stop_test_rc)
83
84
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050085def rest_fail():
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050086 r"""
Michael Walsh410b1782019-10-22 15:56:18 -050087 If STOP_REST_FAIL, then this function will determine whether REST commands to the target are working. If
88 not, this function will stop the program by returning stop_test_rc.
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050089 """
90
Michael Walsh71fec432020-04-09 17:25:31 -050091 if not STOP_REST_FAIL:
Michael Walsh3ba8ecd2018-04-24 11:33:25 -050092 return
93
Michael Sheposb3dffe82022-01-06 07:17:16 -060094 REDFISH_SUPPORT_TRANS_STATE = int(os.environ.get('REDFISH_SUPPORT_TRANS_STATE', 0)) or \
95 int(os.environ.get('AUTOBOOT_REDFISH_SUPPORT_TRANS_STATE', 0))
96
97 if REDFISH_SUPPORT_TRANS_STATE:
98 interface = "redfish"
99 else:
100 interface = "rest"
101
102 print_timen("Checking to see whether %s commands are working." % interface)
Michael Walsh8ab9aea2018-11-01 16:30:45 -0500103 init_robot_out_parms(get_plug_in_package_name() + "." + pgm_name + ".")
Michael Sheposb3dffe82022-01-06 07:17:16 -0600104 lib_file_path = init_robot_file_path("lib/utils.robot") + ":" \
Michael Walsh8ab9aea2018-11-01 16:30:45 -0500105 + init_robot_file_path("lib/gen_robot_print.py")
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500106 set_mod_global(lib_file_path)
107 timeout = '0 seconds'
108 interval = '1 second'
Michael Sheposb3dffe82022-01-06 07:17:16 -0600109 keyword_string = "${match_state}= Create Dictionary %s=1 ;" % interface +\
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500110 " ${state}= Wait State ${match_state} " + timeout + " " +\
111 interval + " quiet=${1} ; Rpvar state"
112 set_mod_global(keyword_string)
Michael Walsh046fe222019-11-08 14:33:53 -0600113 cmd_buf = create_robot_cmd_string("extended/run_keyword.robot", OPENBMC_HOST, SSH_PORT, HTTPS_PORT,
Michael Sheposa7d66142021-01-11 11:19:51 -0600114 REST_USERNAME, REST_PASSWORD, OPENBMC_USERNAME, OPENBMC_PASSWORD,
Michael Sheposb3dffe82022-01-06 07:17:16 -0600115 REDFISH_SUPPORT_TRANS_STATE, keyword_string, lib_file_path, quiet,
Michael Walsh046fe222019-11-08 14:33:53 -0600116 test_mode, debug, outputdir, output, log, report, loglevel)
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500117 if not robot_cmd_fnc(cmd_buf):
Michael Sheposb3dffe82022-01-06 07:17:16 -0600118 print_timen("The caller wishes to stop test execution if %s commands are failing." % interface)
Michael Walsh2ce1dba2019-02-05 19:29:28 +0000119 stop_check()
Michael Sheposb3dffe82022-01-06 07:17:16 -0600120 print_timen("%s commands are working so no reason as of yet to stop the test." % interface)
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500121
122
123def esel_stop_check():
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500124 r"""
Michael Walsh410b1782019-10-22 15:56:18 -0500125 Run the esel_stop_check program to determine whether any eSEL entries found warrant stopping the test
126 run. See esel_stop_check help text for details.
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500127 """
128
129 if STOP_ESEL_STOP_FILE_PATH == "":
130 return
131
Michael Walsh71fec432020-04-09 17:25:31 -0500132 cmd_buf = "esel_stop_check --esel_stop_file_path=" + STOP_ESEL_STOP_FILE_PATH
133 shell_rc, out_buf = shell_cmd(cmd_buf, show_err=0)
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500134 if shell_rc == stop_test_rc:
Michael Walsh71fec432020-04-09 17:25:31 -0500135 print_timen("The caller wishes to stop test execution based on the presence of certain esel entries.")
Michael Walsh2ce1dba2019-02-05 19:29:28 +0000136 stop_check()
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500137
138
139def main():
140
Michael Walsh71fec432020-04-09 17:25:31 -0500141 gen_setup()
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500142
Michael Walsh80caea02019-06-21 11:31:41 -0500143 print_plug_in_header()
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500144
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500145 if STOP_COMMAND.upper() == "FAIL":
146 if AUTOBOOT_BOOT_SUCCESS == "0":
147 print_timen("The caller wishes to stop after each boot failure.")
Michael Walsh2ce1dba2019-02-05 19:29:28 +0000148 stop_check()
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500149 elif STOP_COMMAND.upper() == "ALL":
150 print_timen("The caller wishes to stop after each boot test.")
Michael Walsh2ce1dba2019-02-05 19:29:28 +0000151 stop_check()
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500152 elif len(STOP_COMMAND) > 0:
Michael Walsh71fec432020-04-09 17:25:31 -0500153 shell_rc, out_buf = shell_cmd(STOP_COMMAND, quiet=quiet, show_err=0)
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500154 if shell_rc != 0:
155 print_timen("The caller wishes to stop test execution.")
Michael Walsh2ce1dba2019-02-05 19:29:28 +0000156 stop_check()
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500157
Michael Walsh3c4869a2019-07-17 10:29:31 -0500158 rest_fail()
159
160 esel_stop_check()
161
Michael Walsh71fec432020-04-09 17:25:31 -0500162 if STOP_VERIFY_HARDWARE_FAIL:
163 hardware_error_found = restore_plug_in_value(0, 'Verify_hardware')
164 if hardware_error_found:
165 print_timen("The caller wishes to stop test execution when the Verify_hardware plug-in detects a"
166 + " hardware error.")
167 stop_check()
168
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500169 qprint_timen("The caller does not wish to stop the test run.")
Michael Walsh3ba8ecd2018-04-24 11:33:25 -0500170
Joy Onyerikwu004ad3c2018-06-11 16:29:56 -0500171
Michael Walsh71fec432020-04-09 17:25:31 -0500172main()