1*3ba8ecdcSMichael Walsh#!/usr/bin/env python 2*3ba8ecdcSMichael Walsh 3*3ba8ecdcSMichael Walshr""" 4*3ba8ecdcSMichael WalshCheck for stop conditions. Return code of 2 if stop conditions are found. 5*3ba8ecdcSMichael Walsh""" 6*3ba8ecdcSMichael Walsh 7*3ba8ecdcSMichael Walshimport sys 8*3ba8ecdcSMichael Walshimport subprocess 9*3ba8ecdcSMichael Walsh 10*3ba8ecdcSMichael Walshsave_path_0 = sys.path[0] 11*3ba8ecdcSMichael Walshdel sys.path[0] 12*3ba8ecdcSMichael Walsh 13*3ba8ecdcSMichael Walshfrom gen_print import * 14*3ba8ecdcSMichael Walshfrom gen_valid import * 15*3ba8ecdcSMichael Walshfrom gen_arg import * 16*3ba8ecdcSMichael Walshfrom gen_misc import * 17*3ba8ecdcSMichael Walshfrom gen_cmd import * 18*3ba8ecdcSMichael Walshfrom gen_plug_in_utils import * 19*3ba8ecdcSMichael Walshfrom gen_call_robot import * 20*3ba8ecdcSMichael Walsh 21*3ba8ecdcSMichael Walsh# Restore sys.path[0]. 22*3ba8ecdcSMichael Walshsys.path.insert(0, save_path_0) 23*3ba8ecdcSMichael Walsh 24*3ba8ecdcSMichael Walsh# Initialize. 25*3ba8ecdcSMichael WalshSTOP_REST_FAIL = '' 26*3ba8ecdcSMichael WalshSTOP_COMMAND = '' 27*3ba8ecdcSMichael Walshstop_test_rc = 2 28*3ba8ecdcSMichael Walsh 29*3ba8ecdcSMichael Walsh# Create parser object to process command line parameters and args. 30*3ba8ecdcSMichael Walsh 31*3ba8ecdcSMichael Walsh# Create parser object. 32*3ba8ecdcSMichael Walshparser = argparse.ArgumentParser( 33*3ba8ecdcSMichael Walsh usage='%(prog)s [OPTIONS]', 34*3ba8ecdcSMichael Walsh description="If the \"Stop\" plug-in is selected by the user, %(prog)s" + 35*3ba8ecdcSMichael Walsh " is called by OBMC Boot Test after each boot test. If %(prog)s returns" + 36*3ba8ecdcSMichael Walsh " " + str(stop_test_rc) + ", then OBMC Boot Test will stop. The user" + 37*3ba8ecdcSMichael Walsh " may set environment variable STOP_COMMAND to contain any valid bash" + 38*3ba8ecdcSMichael Walsh " command or program. %(prog)s will run this stop command. If the stop" + 39*3ba8ecdcSMichael Walsh " command returns non-zero, then %(prog)s will return " + 40*3ba8ecdcSMichael Walsh str(stop_test_rc) + ". %(prog)s recognizes some special values for" + 41*3ba8ecdcSMichael Walsh " STOP_COMMAND: 1) \"FAIL\" means that OBMC Boot Test should stop" + 42*3ba8ecdcSMichael Walsh " whenever a boot test fails. 2) \"ALL\" means that OBMC Boot Test" + 43*3ba8ecdcSMichael Walsh " should stop after any boot test. If environment variable" + 44*3ba8ecdcSMichael Walsh " STOP_REST_FAIL is set, OBMC Boot Test will stop if REST commands are" + 45*3ba8ecdcSMichael Walsh " no longer working.", 46*3ba8ecdcSMichael Walsh formatter_class=argparse.RawTextHelpFormatter, 47*3ba8ecdcSMichael Walsh prefix_chars='-+') 48*3ba8ecdcSMichael Walsh 49*3ba8ecdcSMichael Walsh# The stock_list will be passed to gen_get_options. We populate it with the 50*3ba8ecdcSMichael Walsh# names of stock parm options we want. These stock parms are pre-defined by 51*3ba8ecdcSMichael Walsh# gen_get_options. 52*3ba8ecdcSMichael Walshstock_list = [("test_mode", 0), 53*3ba8ecdcSMichael Walsh ("quiet", get_plug_default("quiet", 0)), 54*3ba8ecdcSMichael Walsh ("debug", get_plug_default("debug", 0))] 55*3ba8ecdcSMichael Walsh 56*3ba8ecdcSMichael Walsh 57*3ba8ecdcSMichael Walshdef exit_function(signal_number=0, 58*3ba8ecdcSMichael Walsh frame=None): 59*3ba8ecdcSMichael Walsh 60*3ba8ecdcSMichael Walsh r""" 61*3ba8ecdcSMichael Walsh Execute whenever the program ends normally or with the signals that we 62*3ba8ecdcSMichael Walsh catch (i.e. TERM, INT). 63*3ba8ecdcSMichael Walsh """ 64*3ba8ecdcSMichael Walsh 65*3ba8ecdcSMichael Walsh dprint_executing() 66*3ba8ecdcSMichael Walsh dprint_var(signal_number) 67*3ba8ecdcSMichael Walsh 68*3ba8ecdcSMichael Walsh qprint_pgm_footer() 69*3ba8ecdcSMichael Walsh 70*3ba8ecdcSMichael Walsh 71*3ba8ecdcSMichael Walshdef signal_handler(signal_number, 72*3ba8ecdcSMichael Walsh frame): 73*3ba8ecdcSMichael Walsh 74*3ba8ecdcSMichael Walsh r""" 75*3ba8ecdcSMichael Walsh Handle signals. Without a function to catch a SIGTERM or SIGINT, our 76*3ba8ecdcSMichael Walsh program would terminate immediately with return code 143 and without 77*3ba8ecdcSMichael Walsh calling our exit_function. 78*3ba8ecdcSMichael Walsh """ 79*3ba8ecdcSMichael Walsh 80*3ba8ecdcSMichael Walsh # Our convention is to set up exit_function with atexit.register() so 81*3ba8ecdcSMichael Walsh # there is no need to explicitly call exit_function from here. 82*3ba8ecdcSMichael Walsh 83*3ba8ecdcSMichael Walsh dprint_executing() 84*3ba8ecdcSMichael Walsh 85*3ba8ecdcSMichael Walsh # Calling exit prevents us from returning to the code that was running 86*3ba8ecdcSMichael Walsh # when we received the signal. 87*3ba8ecdcSMichael Walsh exit(0) 88*3ba8ecdcSMichael Walsh 89*3ba8ecdcSMichael Walsh 90*3ba8ecdcSMichael Walshdef validate_parms(): 91*3ba8ecdcSMichael Walsh 92*3ba8ecdcSMichael Walsh r""" 93*3ba8ecdcSMichael Walsh Validate program parameters, etc. Return True or False (i.e. pass/fail) 94*3ba8ecdcSMichael Walsh accordingly. 95*3ba8ecdcSMichael Walsh """ 96*3ba8ecdcSMichael Walsh 97*3ba8ecdcSMichael Walsh get_plug_vars() 98*3ba8ecdcSMichael Walsh 99*3ba8ecdcSMichael Walsh if not valid_value(AUTOBOOT_OPENBMC_HOST, ["", None]): 100*3ba8ecdcSMichael Walsh return False 101*3ba8ecdcSMichael Walsh 102*3ba8ecdcSMichael Walsh gen_post_validation(exit_function, signal_handler) 103*3ba8ecdcSMichael Walsh 104*3ba8ecdcSMichael Walsh return True 105*3ba8ecdcSMichael Walsh 106*3ba8ecdcSMichael Walsh 107*3ba8ecdcSMichael Walshdef rest_fail(): 108*3ba8ecdcSMichael Walsh 109*3ba8ecdcSMichael Walsh r""" 110*3ba8ecdcSMichael Walsh If STOP_REST_FAIL, then this function will determine whether REST commands 111*3ba8ecdcSMichael Walsh to the target are working. If not, this function will stop the program by 112*3ba8ecdcSMichael Walsh returning stop_test_rc. 113*3ba8ecdcSMichael Walsh """ 114*3ba8ecdcSMichael Walsh 115*3ba8ecdcSMichael Walsh if STOP_REST_FAIL != '1': 116*3ba8ecdcSMichael Walsh return 117*3ba8ecdcSMichael Walsh 118*3ba8ecdcSMichael Walsh print_timen("Checking to see whether REST commands are working.") 119*3ba8ecdcSMichael Walsh init_robot_out_parms(get_plug_in_package_name() + ".") 120*3ba8ecdcSMichael Walsh lib_file_path = init_robot_file_path("lib/state.py") 121*3ba8ecdcSMichael Walsh set_mod_global(lib_file_path) 122*3ba8ecdcSMichael Walsh timeout = '0 seconds' 123*3ba8ecdcSMichael Walsh interval = '1 second' 124*3ba8ecdcSMichael Walsh keyword_string = "${match_state}= Create Dictionary rest=1 ;" +\ 125*3ba8ecdcSMichael Walsh " ${state}= Wait State ${match_state} " + timeout + " " +\ 126*3ba8ecdcSMichael Walsh interval + " quiet=${1} ; Rpvar state" 127*3ba8ecdcSMichael Walsh set_mod_global(keyword_string) 128*3ba8ecdcSMichael Walsh 129*3ba8ecdcSMichael Walsh cmd_buf = create_robot_cmd_string("extended/run_keyword.robot", 130*3ba8ecdcSMichael Walsh OPENBMC_HOST, keyword_string, 131*3ba8ecdcSMichael Walsh lib_file_path, quiet, test_mode, debug, 132*3ba8ecdcSMichael Walsh outputdir, output, log, report, loglevel) 133*3ba8ecdcSMichael Walsh if not robot_cmd_fnc(cmd_buf): 134*3ba8ecdcSMichael Walsh print_timen("The caller wishes to stop test execution if REST" + 135*3ba8ecdcSMichael Walsh " commands are failing.") 136*3ba8ecdcSMichael Walsh exit(stop_test_rc) 137*3ba8ecdcSMichael Walsh print_timen("REST commands are working so no reason as of yet to stop" + 138*3ba8ecdcSMichael Walsh " the test.") 139*3ba8ecdcSMichael Walsh 140*3ba8ecdcSMichael Walsh 141*3ba8ecdcSMichael Walshdef esel_stop_check(): 142*3ba8ecdcSMichael Walsh 143*3ba8ecdcSMichael Walsh r""" 144*3ba8ecdcSMichael Walsh Run the esel_stop_check program to determine whether any eSEL entries 145*3ba8ecdcSMichael Walsh found warrent stopping the test run. See esel_stop_check help text for 146*3ba8ecdcSMichael Walsh details. 147*3ba8ecdcSMichael Walsh """ 148*3ba8ecdcSMichael Walsh 149*3ba8ecdcSMichael Walsh if STOP_ESEL_STOP_FILE_PATH == "": 150*3ba8ecdcSMichael Walsh return 151*3ba8ecdcSMichael Walsh 152*3ba8ecdcSMichael Walsh cmd_buf = "esel_stop_check --esel_stop_file_path=" +\ 153*3ba8ecdcSMichael Walsh STOP_ESEL_STOP_FILE_PATH 154*3ba8ecdcSMichael Walsh shell_rc, out_buf = cmd_fnc_u(cmd_buf, show_err=0) 155*3ba8ecdcSMichael Walsh if shell_rc == stop_test_rc: 156*3ba8ecdcSMichael Walsh print_timen("The caller wishes to stop test execution based on the" + 157*3ba8ecdcSMichael Walsh " presence of certain esel entries.") 158*3ba8ecdcSMichael Walsh exit(stop_test_rc) 159*3ba8ecdcSMichael Walsh 160*3ba8ecdcSMichael Walsh 161*3ba8ecdcSMichael Walshdef main(): 162*3ba8ecdcSMichael Walsh 163*3ba8ecdcSMichael Walsh if not gen_get_options(parser, stock_list): 164*3ba8ecdcSMichael Walsh return False 165*3ba8ecdcSMichael Walsh 166*3ba8ecdcSMichael Walsh if not validate_parms(): 167*3ba8ecdcSMichael Walsh return False 168*3ba8ecdcSMichael Walsh 169*3ba8ecdcSMichael Walsh qprint_pgm_header() 170*3ba8ecdcSMichael Walsh 171*3ba8ecdcSMichael Walsh if not debug: 172*3ba8ecdcSMichael Walsh qprint_vars(STOP_REST_FAIL, STOP_COMMAND, AUTOBOOT_BOOT_SUCCESS) 173*3ba8ecdcSMichael Walsh 174*3ba8ecdcSMichael Walsh dprint_plug_vars() 175*3ba8ecdcSMichael Walsh 176*3ba8ecdcSMichael Walsh rest_fail() 177*3ba8ecdcSMichael Walsh 178*3ba8ecdcSMichael Walsh esel_stop_check() 179*3ba8ecdcSMichael Walsh 180*3ba8ecdcSMichael Walsh if STOP_COMMAND.upper() == "FAIL": 181*3ba8ecdcSMichael Walsh if AUTOBOOT_BOOT_SUCCESS == "0": 182*3ba8ecdcSMichael Walsh print_timen("The caller wishes to stop after each boot failure.") 183*3ba8ecdcSMichael Walsh exit(stop_test_rc) 184*3ba8ecdcSMichael Walsh elif STOP_COMMAND.upper() == "ALL": 185*3ba8ecdcSMichael Walsh print_timen("The caller wishes to stop after each boot test.") 186*3ba8ecdcSMichael Walsh exit(stop_test_rc) 187*3ba8ecdcSMichael Walsh elif len(STOP_COMMAND) > 0: 188*3ba8ecdcSMichael Walsh shell_rc, out_buf = cmd_fnc_u(STOP_COMMAND, quiet=quiet, show_err=0) 189*3ba8ecdcSMichael Walsh if shell_rc != 0: 190*3ba8ecdcSMichael Walsh print_timen("The caller wishes to stop test execution.") 191*3ba8ecdcSMichael Walsh exit(stop_test_rc) 192*3ba8ecdcSMichael Walsh 193*3ba8ecdcSMichael Walsh qprint_timen("The caller does not wish to stop the test run.") 194*3ba8ecdcSMichael Walsh return True 195*3ba8ecdcSMichael Walsh 196*3ba8ecdcSMichael Walsh# Main 197*3ba8ecdcSMichael Walsh 198*3ba8ecdcSMichael Walshif not main(): 199*3ba8ecdcSMichael Walsh exit(1) 200