def init_robot_file_path(robot_file_path): r""" Determine full path name for the file path passed in robot_file_path and return it. If robot_file_path contains a fully qualified path name, this function will verify that the file exists. If robot_file_path contains a relative path, this function will search for the file and set robot_file_path so that it contains the absolute path to the robot file. This function will search for the robot file using the raw_robot_file_search_path (defined above). Note that if ROBOT_TEST_BASE_DIR_PATH is not set, this function will call init_robot_test_base_dir_path to set it. Description of arguments: robot_file_path The absolute or relative path to a robot file. """ if not gv.valid_value(robot_file_path): raise ValueError('Programmer error.') try: if ROBOT_TEST_BASE_DIR_PATH is NONE: init_robot_test_base_dir_path() except NameError: init_robot_test_base_dir_path() if not re.match(r".*\.(robot|py)$", robot_file_path): # No suffix so we'll assign one of "\.robot". robot_file_path = robot_file_path + ".robot" abs_path = 0 if robot_file_path[0:1] == "/": abs_path = 1 gp.dprint_vars(abs_path, robot_file_path) if not abs_path: cmd_buf = "echo -n \"" + raw_robot_file_search_path + "\"" shell_rc, out_buf = gc.shell_cmd(cmd_buf, quiet=(not debug), print_output=0) robot_file_search_paths = out_buf gp.dpvar(robot_file_search_paths) robot_file_search_paths_list = robot_file_search_paths.split(':') for search_path in robot_file_search_paths_list: search_path = gm.add_trailing_slash(search_path) candidate_file_path = search_path + robot_file_path gp.dprint_var(candidate_file_path) if os.path.isfile(candidate_file_path): gp.dprint_timen("Found full path to " + robot_file_path + ".") robot_file_path = candidate_file_path break gp.dprint_var(robot_file_path) if not gv.valid_file_path(robot_file_path): raise ValueError('Programmer error.') return robot_file_path
def set_power_policy_method(): r""" Set the global bmc_power_policy_method to either 'Old' or 'New'. The power policy data has moved from an 'org' location to an 'xyz' location. This keyword will determine whether the new method of getting the power policy is valid and will set the global bmc_power_policy_method variable accordingly. If power_policy_setup is already set (by a prior call to this function), this keyword will simply return. If bmc_power_policy_method is "Old", this function will adjust the global policy variables from data/variables.py: RESTORE_LAST_STATE, ALWAYS_POWER_ON, ALWAYS_POWER_OFF. """ # Retrieve global variables. power_policy_setup = \ int(BuiltIn().get_variable_value("${power_policy_setup}", default=0)) bmc_power_policy_method = \ BuiltIn().get_variable_value("${bmc_power_policy_method}", default=0) gp.dpvar(power_policy_setup) # If this function has already been run once, we need not continue. if power_policy_setup: return gp.dpvar(bmc_power_policy_method, 1) # The user has not set bmc_power_policy_method via a -v parm so we will # determine what it should be. if bmc_power_policy_method == "": status, ret_values = grk.run_key_u("New Get Power Policy", ignore=1) if status == 'PASS': bmc_power_policy_method = 'New' else: bmc_power_policy_method = 'Old' gp.qpvar(bmc_power_policy_method) # For old style, we will rewrite these global variable settings to old # values. if bmc_power_policy_method == "Old": BuiltIn().set_global_variable("${RESTORE_LAST_STATE}", "RESTORE_LAST_STATE") BuiltIn().set_global_variable("${ALWAYS_POWER_ON}", "ALWAYS_POWER_ON") BuiltIn().set_global_variable("${ALWAYS_POWER_OFF}", "ALWAYS_POWER_OFF") # Set global variables to control subsequent calls to this function. BuiltIn().set_global_variable("${bmc_power_policy_method}", bmc_power_policy_method) BuiltIn().set_global_variable("${power_policy_setup}", 1)
def login_ssh(login_args={}, max_login_attempts=5): r""" Login on the latest open SSH connection. Retry on failure up to max_login_attempts. The caller is responsible for making sure there is an open SSH connection. Description of argument(s): login_args A dictionary containing the key/value pairs which are acceptable to the SSHLibrary login function as parms/args. At a minimum, this should contain a 'username' and a 'password' entry. max_login_attempts The max number of times to try logging in (in the event of login failures). """ global sshlib # Get connection data for debug output. connection = sshlib.get_connection() gp.dprintn(sprint_connection(connection)) for login_attempt_num in range(1, max_login_attempts + 1): gp.dprint_timen("Logging in to " + connection.host + ".") gp.dprint_var(login_attempt_num) try: out_buf = sshlib.login(**login_args) except Exception as login_exception: # Login will sometimes fail if the connection is new. except_type, except_value, except_traceback = sys.exc_info() gp.dprint_var(except_type) gp.dprint_varx("except_value", str(except_value)) if except_type is paramiko.ssh_exception.SSHException and\ re.match(r"No existing session", str(except_value)): continue else: # We don't tolerate any other error so break from loop and # re-raise exception. break # If we get to this point, the login has worked and we can return. gp.dpvar(out_buf) return # If we get to this point, the login has failed on all attempts so the # exception will be raised again. raise(login_exception)
def obmc_boot_test_py(loc_boot_stack=None, loc_stack_mode=None, loc_quiet=None): r""" Do main program processing. """ global save_stack # Process function parms. for parm_name in main_func_parm_list: # Get parm's value. cmd_buf = "parm_value = loc_" + parm_name exec(cmd_buf) gp.dpvar(parm_name) gp.dpvar(parm_value) if parm_value is None: # Parm was not specified by the calling function so set it to its # corresponding global value. cmd_buf = "loc_" + parm_name + " = BuiltIn().get_variable_value" +\ "(\"${" + parm_name + "}\")" gp.dpissuing(cmd_buf) exec(cmd_buf) else: # Save the global value on a stack. cmd_buf = "save_stack.push(BuiltIn().get_variable_value(\"${" +\ parm_name + "}\"), \"" + parm_name + "\")" gp.dpissuing(cmd_buf) exec(cmd_buf) # Set the global value to the passed value. cmd_buf = "BuiltIn().set_global_variable(\"${" + parm_name +\ "}\", loc_" + parm_name + ")" gp.dpissuing(cmd_buf) exec(cmd_buf) gp.dprintn(save_stack.sprint_obj()) setup() if ffdc_only: gp.qprint_timen("Caller requested ffdc_only.") pre_boot_plug_in_setup() grk.run_key_u("my_ffdc") return # Process caller's boot_stack. while (len(boot_stack) > 0): test_loop_body() gp.qprint_timen("Finished processing stack.") # Process caller's boot_list. if len(boot_list) > 0: for ix in range(1, max_num_tests + 1): test_loop_body() gp.qprint_timen("Completed all requested boot tests.") boot_pass, boot_fail = boot_results.return_total_pass_fail() if boot_fail > boot_fail_threshold: error_message = "Boot failures exceed the boot failure" +\ " threshold:\n" +\ gp.sprint_var(boot_fail) +\ gp.sprint_var(boot_fail_threshold) BuiltIn().fail(gp.sprint_error(error_message))
def obmc_boot_test_py(loc_boot_stack=None, loc_stack_mode=None, loc_quiet=None): r""" Do main program processing. """ global save_stack # Process function parms. for parm_name in main_func_parm_list: # Get parm's value. cmd_buf = "parm_value = loc_" + parm_name exec(cmd_buf) gp.dpvar(parm_name) gp.dpvar(parm_value) if parm_value is None: # Parm was not specified by the calling function so set it to its # corresponding global value. cmd_buf = "loc_" + parm_name + " = BuiltIn().get_variable_value" +\ "(\"${" + parm_name + "}\")" gp.dpissuing(cmd_buf) exec(cmd_buf) else: # Save the global value on a stack. cmd_buf = "save_stack.push(BuiltIn().get_variable_value(\"${" +\ parm_name + "}\"), \"" + parm_name + "\")" gp.dpissuing(cmd_buf) exec(cmd_buf) # Set the global value to the passed value. cmd_buf = "BuiltIn().set_global_variable(\"${" + parm_name +\ "}\", loc_" + parm_name + ")" gp.dpissuing(cmd_buf) exec(cmd_buf) gp.dprintn(save_stack.sprint_obj()) setup() init_boot_pass, init_boot_fail = boot_results.return_total_pass_fail() if ffdc_only: gp.qprint_timen("Caller requested ffdc_only.") pre_boot_plug_in_setup() grk.run_key_u("my_ffdc") return # Process caller's boot_stack. while (len(boot_stack) > 0): test_loop_body() gp.qprint_timen("Finished processing stack.") # Process caller's boot_list. if len(boot_list) > 0: for ix in range(1, max_num_tests + 1): test_loop_body() gp.qprint_timen("Completed all requested boot tests.") boot_pass, boot_fail = boot_results.return_total_pass_fail() new_fail = boot_fail - init_boot_fail if new_fail > boot_fail_threshold: error_message = "Boot failures exceed the boot failure" +\ " threshold:\n" +\ gp.sprint_var(new_fail) +\ gp.sprint_var(boot_fail_threshold) BuiltIn().fail(gp.sprint_error(error_message))