1#!/usr/bin/env python 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.RawTextHelpFormatter, 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, keyword_string, lib_file_path, quiet, 107 test_mode, debug, outputdir, output, log, report, loglevel) 108 if not robot_cmd_fnc(cmd_buf): 109 print_timen("The caller wishes to stop test execution if REST commands are failing.") 110 stop_check() 111 print_timen("REST commands are working so no reason as of yet to stop the test.") 112 113 114def esel_stop_check(): 115 r""" 116 Run the esel_stop_check program to determine whether any eSEL entries found warrant stopping the test 117 run. See esel_stop_check help text for details. 118 """ 119 120 if STOP_ESEL_STOP_FILE_PATH == "": 121 return 122 123 cmd_buf = "esel_stop_check --esel_stop_file_path=" + STOP_ESEL_STOP_FILE_PATH 124 shell_rc, out_buf = shell_cmd(cmd_buf, show_err=0) 125 if shell_rc == stop_test_rc: 126 print_timen("The caller wishes to stop test execution based on the presence of certain esel entries.") 127 stop_check() 128 129 130def main(): 131 132 gen_setup() 133 134 print_plug_in_header() 135 136 if STOP_COMMAND.upper() == "FAIL": 137 if AUTOBOOT_BOOT_SUCCESS == "0": 138 print_timen("The caller wishes to stop after each boot failure.") 139 stop_check() 140 elif STOP_COMMAND.upper() == "ALL": 141 print_timen("The caller wishes to stop after each boot test.") 142 stop_check() 143 elif len(STOP_COMMAND) > 0: 144 shell_rc, out_buf = shell_cmd(STOP_COMMAND, quiet=quiet, show_err=0) 145 if shell_rc != 0: 146 print_timen("The caller wishes to stop test execution.") 147 stop_check() 148 149 rest_fail() 150 151 esel_stop_check() 152 153 if STOP_VERIFY_HARDWARE_FAIL: 154 hardware_error_found = restore_plug_in_value(0, 'Verify_hardware') 155 if hardware_error_found: 156 print_timen("The caller wishes to stop test execution when the Verify_hardware plug-in detects a" 157 + " hardware error.") 158 stop_check() 159 160 qprint_timen("The caller does not wish to stop the test run.") 161 162 163main() 164