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