def post_stack(): r""" Process post_stack plug-in programs. """ if not call_post_stack_plug: # The caller does not wish to have post_stack plug-in processing done. return global boot_success # NOTE: A post_stack call-point failure is NOT counted as a boot failure. pre_boot_plug_in_setup() # For the purposes of the following plug-ins, mark the "boot" as a success. boot_success = 1 plug_in_setup() rc, shell_rc, failed_plug_in_name, history =\ grpi.rprocess_plug_in_packages(call_point='post_stack', stop_on_plug_in_failure=0, return_history=True) last_ten.extend(history) # Trim list to max number of entries. del last_ten[:max(0, len(last_ten) - max_boot_history)] if rc != 0: boot_success = 0 plug_in_setup() rc, shell_rc, failed_plug_in_name =\ grpi.rprocess_plug_in_packages(call_point='ffdc_check', shell_rc=dump_ffdc_rc(), stop_on_plug_in_failure=1, stop_on_non_zero_rc=1) if shell_rc == dump_ffdc_rc(): status, ret_values = grk.run_key_u("my_ffdc", ignore=1) if status != 'PASS': gp.qprint_error("Call to my_ffdc failed.\n") # Leave a record for caller that "soft" errors occurred. soft_errors = 1 gpu.save_plug_in_value(soft_errors, pgm_name) plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='stop_check', shell_rc=stop_test_rc(), stop_on_non_zero_rc=1) if shell_rc == stop_test_rc(): message = "Stopping as requested by user.\n" gp.print_time(message) BuiltIn().fail(message)
def obmc_boot_test_teardown(): r""" Clean up after the Main keyword. """ if cp_setup_called: plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='cleanup', stop_on_plug_in_failure=0) if 'boot_results_file_path' in globals(): # Save boot_results object to a file in case it is needed again. gp.qprint_timen("Saving boot_results to the following path.") gp.qprint_var(boot_results_file_path) pickle.dump(boot_results, open(boot_results_file_path, 'wb'), pickle.HIGHEST_PROTOCOL) global save_stack # Restore any global values saved on the save_stack. for parm_name in main_func_parm_list: # Get the parm_value if it was saved on the stack. try: parm_value = save_stack.pop(parm_name) except: # If it was not saved, no further action is required. continue # Restore the saved value. cmd_buf = "BuiltIn().set_global_variable(\"${" + parm_name +\ "}\", parm_value)" gp.dpissuing(cmd_buf) exec(cmd_buf) gp.dprintn(save_stack.sprint_obj())
def setup(): r""" Do general program setup tasks. """ global cp_setup_called gp.qprintn() robot_pgm_dir_path = os.path.dirname(__file__) + os.sep repo_bin_path = robot_pgm_dir_path.replace("/lib/", "/bin/") # If we can't find process_plug_in_packages.py, ssh_pw or # validate_plug_ins.py, then we don't have our repo bin in PATH. shell_rc, out_buf = gc.cmd_fnc_u("which process_plug_in_packages.py" + " ssh_pw validate_plug_ins.py", quiet=1, print_output=0, show_err=0) if shell_rc != 0: os.environ['PATH'] = repo_bin_path + ":" + os.environ.get('PATH', "") # Likewise, our repo lib subdir needs to be in sys.path and PYTHONPATH. if robot_pgm_dir_path not in sys.path: sys.path.append(robot_pgm_dir_path) PYTHONPATH = os.environ.get("PYTHONPATH", "") if PYTHONPATH == "": os.environ['PYTHONPATH'] = robot_pgm_dir_path else: os.environ['PYTHONPATH'] = robot_pgm_dir_path + ":" + PYTHONPATH validate_parms() grp.rqprint_pgm_header() grk.run_key("Set BMC Power Policy RESTORE_LAST_STATE") initial_plug_in_setup() plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='setup') if rc != 0: error_message = "Plug-in setup failed.\n" grp.rprint_error_report(error_message) BuiltIn().fail(error_message) # Setting cp_setup_called lets our Teardown know that it needs to call # the cleanup plug-in call point. cp_setup_called = 1 # Keyword "FFDC" will fail if TEST_MESSAGE is not set. BuiltIn().set_global_variable("${TEST_MESSAGE}", "${EMPTY}") # FFDC_LOG_PATH is used by "FFDC" keyword. BuiltIn().set_global_variable("${FFDC_LOG_PATH}", ffdc_dir_path) # Also printed by FFDC. global host_name global host_ip host = socket.gethostname() host_name, host_ip = gm.get_host_name_ip(host) gp.dprint_var(boot_table, 1) gp.dprint_var(boot_lists)
def my_ffdc(): r""" Collect FFDC data. """ global state plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc', stop_on_plug_in_failure=0) AUTOBOOT_FFDC_PREFIX = os.environ['AUTOBOOT_FFDC_PREFIX'] status, ffdc_file_list = grk.run_key_u( "FFDC ffdc_prefix=" + AUTOBOOT_FFDC_PREFIX + " ffdc_function_list=" + ffdc_function_list, ignore=1) if status != 'PASS': gp.qprint_error("Call to ffdc failed.\n") if type(ffdc_file_list) is not list: ffdc_file_list = [] # Leave a record for caller that "soft" errors occurred. soft_errors = 1 gpu.save_plug_in_value(soft_errors, pgm_name) my_get_state() print_defect_report(ffdc_file_list)
def obmc_boot_test_teardown(): r""" Clean up after the Main keyword. """ if cp_setup_called: plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='cleanup', stop_on_plug_in_failure=0) if 'boot_results_file_path' in globals(): # Save boot_results object to a file in case it is needed again. gp.qprint_timen("Saving boot_results to the following path.") gp.qprint_var(boot_results_file_path) pickle.dump(boot_results, open(boot_results_file_path, 'wb'), pickle.HIGHEST_PROTOCOL) global save_stack # Restore any global values saved on the save_stack. for parm_name in main_func_parm_list: # Get the parm_value if it was saved on the stack. try: parm_value = save_stack.pop(parm_name) except BaseException: # If it was not saved, no further action is required. continue # Restore the saved value. cmd_buf = "BuiltIn().set_global_variable(\"${" + parm_name +\ "}\", parm_value)" gp.dpissuing(cmd_buf) exec(cmd_buf) gp.dprintn(save_stack.sprint_obj())
def obmc_boot_test_teardown(): r""" Clean up after the Main keyword. """ if cp_setup_called: plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='cleanup', stop_on_plug_in_failure=0) if 'boot_results_file_path' in globals(): # Save boot_results object to a file in case it is needed again. gp.qprint_timen("Saving boot_results to the following path.") gp.qprint_var(boot_results_file_path) pickle.dump(boot_results, open(boot_results_file_path, 'wb'), pickle.HIGHEST_PROTOCOL)
def obmc_boot_test_teardown(): r""" Clean up after the Main keyword. """ if cp_setup_called: plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='cleanup', stop_on_plug_in_failure=0) if 'boot_results_file_path' in globals(): # Save boot_results object to a file in case it is needed again. gp.qprint_timen("Saving boot_results to the following path.") gp.qprint_var(boot_results_file_path) pickle.dump(boot_results, open(boot_results_file_path, 'wb'), pickle.HIGHEST_PROTOCOL)
def my_ffdc(): r""" Collect FFDC data. """ global state plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc', stop_on_plug_in_failure=0) AUTOBOOT_FFDC_PREFIX = os.environ['AUTOBOOT_FFDC_PREFIX'] status, ffdc_file_list = grk.run_key_u("FFDC ffdc_prefix=" + AUTOBOOT_FFDC_PREFIX + " ffdc_function_list=" + ffdc_function_list, ignore=1) if status != 'PASS': gp.qprint_error("Call to ffdc failed.\n") my_get_state() print_defect_report(ffdc_file_list)
def my_ffdc(): r""" Collect FFDC data. """ global state plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc', stop_on_plug_in_failure=0) AUTOBOOT_FFDC_PREFIX = os.environ['AUTOBOOT_FFDC_PREFIX'] status, ret_values = grk.run_key_u( "FFDC ffdc_prefix=" + AUTOBOOT_FFDC_PREFIX + " ffdc_function_list=" + ffdc_function_list, ignore=1) if status != 'PASS': gp.qprint_error("Call to ffdc failed.\n") my_get_state() print_defect_report()
def test_loop_body(): r""" The main loop body for the loop in main_py. Description of arguments: boot_count The iteration number (starts at 1). """ global boot_count global state global next_boot global boot_success gp.qprintn() next_boot = select_boot() if next_boot == "": return True boot_count += 1 gp.qprint_timen("Starting boot " + str(boot_count) + ".") pre_boot_plug_in_setup() cmd_buf = ["run_boot", next_boot] boot_status, msg = BuiltIn().run_keyword_and_ignore_error(*cmd_buf) if boot_status == "FAIL": gp.qprint(msg) gp.qprintn() if boot_status == "PASS": boot_success = 1 gp.qprint_timen("BOOT_SUCCESS: \"" + next_boot + "\" succeeded.") else: boot_success = 0 gp.qprint_timen("BOOT_FAILED: \"" + next_boot + "\" failed.") boot_results.update(next_boot, boot_status) plug_in_setup() # NOTE: A post_test_case call point failure is NOT counted as a boot # failure. rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='post_test_case', stop_on_plug_in_failure=0) plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc_check', shell_rc=0x00000200, stop_on_plug_in_failure=1, stop_on_non_zero_rc=1) if boot_status != "PASS" or ffdc_check == "All" or shell_rc == 0x00000200: status, ret_values = grk.run_key_u("my_ffdc", ignore=1) if status != 'PASS': gp.print_error("Call to my_ffdc failed.\n") # We need to purge error logs between boots or they build up. grk.run_key("Delete Error logs", ignore=1) boot_results.print_report() gp.qprint_timen("Finished boot " + str(boot_count) + ".") plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='stop_check') if rc != 0: error_message = "Stopping as requested by user.\n" grp.rprint_error_report(error_message) BuiltIn().fail(error_message) # This should help prevent ConnectionErrors. grk.run_key_u("Close All Connections") return True
def test_loop_body(): r""" The main loop body for the loop in main_py. Description of arguments: boot_count The iteration number (starts at 1). """ global boot_count global state global next_boot global boot_success global boot_end_time gp.qprintn() next_boot = select_boot() if next_boot == "": return True boot_count += 1 gp.qprint_timen("Starting boot " + str(boot_count) + ".") pre_boot_plug_in_setup() cmd_buf = ["run_boot", next_boot] boot_status, msg = BuiltIn().run_keyword_and_ignore_error(*cmd_buf) if boot_status == "FAIL": gp.qprint(msg) gp.qprintn() if boot_status == "PASS": boot_success = 1 completion_msg = gp.sprint_timen("BOOT_SUCCESS: \"" + next_boot + "\" succeeded.") else: boot_success = 0 completion_msg = gp.sprint_timen("BOOT_FAILED: \"" + next_boot + "\" failed.") # Set boot_end_time for use by plug-ins. boot_end_time = completion_msg[1:33] gp.qprint_var(boot_end_time) gp.qprint(completion_msg) boot_results.update(next_boot, boot_status) plug_in_setup() # NOTE: A post_test_case call point failure is NOT counted as a boot # failure. rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='post_test_case', stop_on_plug_in_failure=0) plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc_check', shell_rc=0x00000200, stop_on_plug_in_failure=1, stop_on_non_zero_rc=1) if boot_status != "PASS" or ffdc_check == "All" or shell_rc == 0x00000200: status, ret_values = grk.run_key_u("my_ffdc", ignore=1) if status != 'PASS': gp.qprint_error("Call to my_ffdc failed.\n") # We need to purge error logs between boots or they build up. grk.run_key("Delete Error logs", ignore=1) boot_results.print_report() gp.qprint_timen("Finished boot " + str(boot_count) + ".") plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='stop_check') if rc != 0: error_message = "Stopping as requested by user.\n" grp.rprint_error_report(error_message) BuiltIn().fail(error_message) # This should help prevent ConnectionErrors. grk.run_key_u("Close All Connections") return True
def run_boot(boot): r""" Run the specified boot. Description of arguments: boot The name of the boot test to be performed. """ global state print_test_start_message(boot) plug_in_setup() rc, shell_rc, failed_plug_in_name = \ grpi.rprocess_plug_in_packages(call_point="pre_boot") if rc != 0: error_message = "Plug-in failed with non-zero return code.\n" +\ gp.sprint_var(rc, 1) BuiltIn().fail(gp.sprint_error(error_message)) if test_mode: # In test mode, we'll pretend the boot worked by assigning its # required end state to the default state value. state = st.strip_anchor_state(boot_table[boot]['end']) else: # Assertion: We trust that the state data was made fresh by the # caller. gp.qprintn() if boot_table[boot]['method_type'] == "keyword": rk.my_run_keywords(boot_table[boot].get('lib_file_path', ''), boot_table[boot]['method'], quiet=quiet) if boot_table[boot]['bmc_reboot']: st.wait_for_comm_cycle(int(state['epoch_seconds'])) plug_in_setup() rc, shell_rc, failed_plug_in_name = \ grpi.rprocess_plug_in_packages(call_point="post_reboot") if rc != 0: error_message = "Plug-in failed with non-zero return code.\n" error_message += gp.sprint_var(rc, 1) BuiltIn().fail(gp.sprint_error(error_message)) else: match_state = st.anchor_state(state) del match_state['epoch_seconds'] # Wait for the state to change in any way. st.wait_state(match_state, wait_time=state_change_timeout, interval="10 seconds", invert=1) gp.qprintn() if boot_table[boot]['end']['chassis'] == "Off": boot_timeout = power_off_timeout else: boot_timeout = power_on_timeout st.wait_state(boot_table[boot]['end'], wait_time=boot_timeout, interval="10 seconds") plug_in_setup() rc, shell_rc, failed_plug_in_name = \ grpi.rprocess_plug_in_packages(call_point="post_boot") if rc != 0: error_message = "Plug-in failed with non-zero return code.\n" +\ gp.sprint_var(rc, 1) BuiltIn().fail(gp.sprint_error(error_message))
def setup(): r""" Do general program setup tasks. """ global cp_setup_called gp.qprintn() robot_pgm_dir_path = os.path.dirname(__file__) + os.sep repo_bin_path = robot_pgm_dir_path.replace("/lib/", "/bin/") # If we can't find process_plug_in_packages.py, ssh_pw or # validate_plug_ins.py, then we don't have our repo bin in PATH. shell_rc, out_buf = gc.cmd_fnc_u("which process_plug_in_packages.py" + " ssh_pw validate_plug_ins.py", quiet=1, print_output=0, show_err=0) if shell_rc != 0: os.environ['PATH'] = repo_bin_path + ":" + os.environ.get('PATH', "") # Likewise, our repo lib subdir needs to be in sys.path and PYTHONPATH. if robot_pgm_dir_path not in sys.path: sys.path.append(robot_pgm_dir_path) PYTHONPATH = os.environ.get("PYTHONPATH", "") if PYTHONPATH == "": os.environ['PYTHONPATH'] = robot_pgm_dir_path else: os.environ['PYTHONPATH'] = robot_pgm_dir_path + ":" + PYTHONPATH validate_parms() grp.rqprint_pgm_header() grk.run_key("Set BMC Power Policy RESTORE_LAST_STATE") initial_plug_in_setup() plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='setup') if rc != 0: error_message = "Plug-in setup failed.\n" grp.rprint_error_report(error_message) BuiltIn().fail(error_message) # Setting cp_setup_called lets our Teardown know that it needs to call # the cleanup plug-in call point. cp_setup_called = 1 # Keyword "FFDC" will fail if TEST_MESSAGE is not set. BuiltIn().set_global_variable("${TEST_MESSAGE}", "${EMPTY}") # FFDC_LOG_PATH is used by "FFDC" keyword. BuiltIn().set_global_variable("${FFDC_LOG_PATH}", ffdc_dir_path) # Also printed by FFDC. global host_name global host_ip host = socket.gethostname() host_name, host_ip = gm.get_host_name_ip(host) gp.dprint_var(boot_table, 1) gp.dprint_var(boot_lists)
def print_defect_report(): r""" Print a defect report. """ # Making deliberate choice to NOT run plug_in_setup(). We don't want # ffdc_prefix updated. rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc_report', stop_on_plug_in_failure=0) # At some point I'd like to have the 'Call FFDC Methods' return a list # of files it has collected. In that case, the following "ls" command # would no longer be needed. For now, however, glob shows the files # named in FFDC_LIST_FILE_PATH so I will refrain from printing those # out (so we don't see duplicates in the list). # Get additional header data which may have been created by ffdc plug-ins. # Also, delete the individual header files to cleanup. cmd_buf = "file_list=$(cat " + ffdc_report_list_path + " 2>/dev/null)" +\ " ; [ ! -z \"${file_list}\" ] && cat ${file_list}" +\ " 2>/dev/null ; rm -rf ${file_list} 2>/dev/null || :" shell_rc, more_header_info = gc.cmd_fnc_u(cmd_buf, print_output=0, show_err=0) # Get additional header data which may have been created by ffdc plug-ins. # Also, delete the individual header files to cleanup. cmd_buf = "file_list=$(cat " + ffdc_summary_list_path + " 2>/dev/null)" +\ " ; [ ! -z \"${file_list}\" ] && cat ${file_list}" +\ " 2>/dev/null ; rm -rf ${file_list} 2>/dev/null || :" shell_rc, ffdc_summary_info = gc.cmd_fnc_u(cmd_buf, print_output=0, show_err=0) LOG_PREFIX = BuiltIn().get_variable_value("${LOG_PREFIX}") output = '\n'.join(sorted(glob.glob(LOG_PREFIX + '*'))) try: ffdc_list = open(ffdc_list_file_path, 'r') except IOError: ffdc_list = "" # Open ffdc_file_list for writing. We will write a complete list of # FFDC files to it for possible use by plug-ins like cp_stop_check. ffdc_list_file = open(ffdc_list_file_path, 'w') gp.qprintn() # indent=0, width=90, linefeed=1, char="=" gp.qprint_dashes(0, 90, 1, "=") gp.qprintn("Copy this data to the defect:\n") if len(more_header_info) > 0: gp.qprintn(more_header_info) gp.qpvars(host_name, host_ip, openbmc_nickname, openbmc_host, openbmc_host_name, openbmc_ip, openbmc_username, openbmc_password, os_host, os_host_name, os_ip, os_username, os_password, pdu_host, pdu_host_name, pdu_ip, pdu_username, pdu_password, pdu_slot_no, openbmc_serial_host, openbmc_serial_host_name, openbmc_serial_ip, openbmc_serial_port) gp.qprintn() print_last_boots() gp.qprintn() gp.qprint_var(state) gp.qprintn() gp.qprintn("FFDC data files:") if status_file_path != "": gp.qprintn(status_file_path) ffdc_list_file.write(status_file_path + "\n") gp.qprintn(output) # gp.qprintn(ffdc_list) gp.qprintn() if len(ffdc_summary_info) > 0: gp.qprintn(ffdc_summary_info) gp.qprint_dashes(0, 90, 1, "=") ffdc_list_file.write(output + "\n") ffdc_list_file.close()
def print_defect_report(ffdc_file_list): r""" Print a defect report. Description of argument(s): ffdc_file_list A list of files which were collected by our ffdc functions. """ # Making deliberate choice to NOT run plug_in_setup(). We don't want # ffdc_prefix updated. rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc_report', stop_on_plug_in_failure=0) # Get additional header data which may have been created by ffdc plug-ins. # Also, delete the individual header files to cleanup. cmd_buf = "file_list=$(cat " + ffdc_report_list_path + " 2>/dev/null)" +\ " ; [ ! -z \"${file_list}\" ] && cat ${file_list}" +\ " 2>/dev/null ; rm -rf ${file_list} 2>/dev/null || :" shell_rc, more_header_info = gc.cmd_fnc_u(cmd_buf, print_output=0, show_err=0) # Get additional summary data which may have been created by ffdc plug-ins. # Also, delete the individual header files to cleanup. cmd_buf = "file_list=$(cat " + ffdc_summary_list_path + " 2>/dev/null)" +\ " ; [ ! -z \"${file_list}\" ] && cat ${file_list}" +\ " 2>/dev/null ; rm -rf ${file_list} 2>/dev/null || :" shell_rc, ffdc_summary_info = gc.cmd_fnc_u(cmd_buf, print_output=0, show_err=0) # ffdc_list_file_path contains a list of any ffdc files created by plug- # ins, etc. Read that data into a list. try: plug_in_ffdc_list = \ open(ffdc_list_file_path, 'r').read().rstrip("\n").split("\n") plug_in_ffdc_list = filter(None, plug_in_ffdc_list) except IOError: plug_in_ffdc_list = [] # Combine the files from plug_in_ffdc_list with the ffdc_file_list passed # in. Eliminate duplicates and sort the list. ffdc_file_list = sorted(set(ffdc_file_list + plug_in_ffdc_list)) if status_file_path != "": ffdc_file_list.insert(0, status_file_path) # Convert the list to a printable list. printable_ffdc_file_list = "\n".join(ffdc_file_list) # Open ffdc_file_list for writing. We will write a complete list of # FFDC files to it for possible use by plug-ins like cp_stop_check. ffdc_list_file = open(ffdc_list_file_path, 'w') ffdc_list_file.write(printable_ffdc_file_list + "\n") ffdc_list_file.close() indent = 0 width = 90 linefeed = 1 char = "=" gp.qprintn() gp.qprint_dashes(indent, width, linefeed, char) gp.qprintn("Copy this data to the defect:\n") if len(more_header_info) > 0: gp.qprintn(more_header_info) gp.qpvars(host_name, host_ip, openbmc_nickname, openbmc_host, openbmc_host_name, openbmc_ip, openbmc_username, openbmc_password, os_host, os_host_name, os_ip, os_username, os_password, pdu_host, pdu_host_name, pdu_ip, pdu_username, pdu_password, pdu_slot_no, openbmc_serial_host, openbmc_serial_host_name, openbmc_serial_ip, openbmc_serial_port) gp.qprintn() print_last_boots() gp.qprintn() gp.qprint_var(state) gp.qprintn() gp.qprintn("FFDC data files:") gp.qprintn(printable_ffdc_file_list) gp.qprintn() if len(ffdc_summary_info) > 0: gp.qprintn(ffdc_summary_info) gp.qprint_dashes(indent, width, linefeed, char)
def test_loop_body(): r""" The main loop body for the loop in main_py. Description of arguments: boot_count The iteration number (starts at 1). """ global boot_count global state global next_boot global boot_success global boot_end_time gp.qprintn() next_boot = select_boot() if next_boot == "": return True boot_count += 1 gp.qprint_timen("Starting boot " + str(boot_count) + ".") pre_boot_plug_in_setup() cmd_buf = ["run_boot", next_boot] boot_status, msg = BuiltIn().run_keyword_and_ignore_error(*cmd_buf) if boot_status == "FAIL": gp.qprint(msg) gp.qprintn() if boot_status == "PASS": boot_success = 1 completion_msg = gp.sprint_timen("BOOT_SUCCESS: \"" + next_boot + "\" succeeded.") else: boot_success = 0 completion_msg = gp.sprint_timen("BOOT_FAILED: \"" + next_boot + "\" failed.") # Set boot_end_time for use by plug-ins. boot_end_time = completion_msg[1:33] gp.qprint_var(boot_end_time) gp.qprint(completion_msg) boot_results.update(next_boot, boot_status) plug_in_setup() # NOTE: A post_test_case call point failure is NOT counted as a boot # failure. rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='post_test_case', stop_on_plug_in_failure=0) plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc_check', shell_rc=dump_ffdc_rc(), stop_on_plug_in_failure=1, stop_on_non_zero_rc=1) if ffdc_check == "All" or\ shell_rc == dump_ffdc_rc(): status, ret_values = grk.run_key_u("my_ffdc", ignore=1) if status != 'PASS': gp.qprint_error("Call to my_ffdc failed.\n") # Leave a record for caller that "soft" errors occurred. soft_errors = 1 gpu.save_plug_in_value(soft_errors, pgm_name) if delete_errlogs: # print error logs before delete status, error_logs = grk.run_key_u("Get Error Logs") pels = pel.peltool("-l", ignore_err=1) log.print_error_logs(error_logs, "AdditionalData Message Severity") gp.qprint_var(pels) # We need to purge error logs between boots or they build up. grk.run_key(delete_errlogs_cmd, ignore=1) grk.run_key(delete_bmcdump_cmd, ignore=1) boot_results.print_report() gp.qprint_timen("Finished boot " + str(boot_count) + ".") plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='stop_check', shell_rc=stop_test_rc(), stop_on_non_zero_rc=1) if shell_rc == stop_test_rc(): message = "Stopping as requested by user.\n" gp.qprint_time(message) BuiltIn().fail(message) # This should help prevent ConnectionErrors. # Purge all redfish and REST connection sessions. if redfish_delete_sessions: grk.run_key_u("Close All Connections", ignore=1) grk.run_key_u("Delete All Redfish Sessions", ignore=1) return True
def print_defect_report(): r""" Print a defect report. """ # Making deliberate choice to NOT run plug_in_setup(). We don't want # ffdc_prefix updated. rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc_report', stop_on_plug_in_failure=0) # At some point I'd like to have the 'Call FFDC Methods' return a list # of files it has collected. In that case, the following "ls" command # would no longer be needed. For now, however, glob shows the files # named in FFDC_LIST_FILE_PATH so I will refrain from printing those # out (so we don't see duplicates in the list). # Get additional header data which may have been created by ffdc plug-ins. # Also, delete the individual header files to cleanup. cmd_buf = "file_list=$(cat " + ffdc_report_list_path + " 2>/dev/null)" +\ " ; [ ! -z \"${file_list}\" ] && cat ${file_list}" +\ " 2>/dev/null ; rm -rf ${file_list} 2>/dev/null || :" shell_rc, more_header_info = gc.cmd_fnc_u(cmd_buf, print_output=0, show_err=0) # Get additional header data which may have been created by ffdc plug-ins. # Also, delete the individual header files to cleanup. cmd_buf = "file_list=$(cat " + ffdc_summary_list_path + " 2>/dev/null)" +\ " ; [ ! -z \"${file_list}\" ] && cat ${file_list}" +\ " 2>/dev/null ; rm -rf ${file_list} 2>/dev/null || :" shell_rc, ffdc_summary_info = gc.cmd_fnc_u(cmd_buf, print_output=0, show_err=0) LOG_PREFIX = BuiltIn().get_variable_value("${LOG_PREFIX}") output = '\n'.join(sorted(glob.glob(LOG_PREFIX + '*'))) try: ffdc_list = open(ffdc_list_file_path, 'r') except IOError: ffdc_list = "" # Open ffdc_file_list for writing. We will write a complete list of # FFDC files to it for possible use by plug-ins like cp_stop_check. ffdc_list_file = open(ffdc_list_file_path, 'w') gp.qprintn() # indent=0, width=90, linefeed=1, char="=" gp.qprint_dashes(0, 90, 1, "=") gp.qprintn("Copy this data to the defect:\n") if len(more_header_info) > 0: gp.printn(more_header_info) gp.qpvars(host_name, host_ip, openbmc_nickname, openbmc_host, openbmc_host_name, openbmc_ip, openbmc_username, openbmc_password, os_host, os_host_name, os_ip, os_username, os_password, pdu_host, pdu_host_name, pdu_ip, pdu_username, pdu_password, pdu_slot_no, openbmc_serial_host, openbmc_serial_host_name, openbmc_serial_ip, openbmc_serial_port) gp.qprintn() print_last_boots() gp.qprintn() gp.qprint_var(state) gp.qprintn() gp.qprintn("FFDC data files:") if status_file_path != "": gp.qprintn(status_file_path) ffdc_list_file.write(status_file_path + "\n") gp.qprintn(output) # gp.qprintn(ffdc_list) gp.qprintn() if len(ffdc_summary_info) > 0: gp.printn(ffdc_summary_info) gp.qprint_dashes(0, 90, 1, "=") ffdc_list_file.write(output + "\n") ffdc_list_file.close()
def print_defect_report(ffdc_file_list): r""" Print a defect report. Description of argument(s): ffdc_file_list A list of files which were collected by our ffdc functions. """ # Making deliberate choice to NOT run plug_in_setup(). We don't want # ffdc_prefix updated. rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc_report', stop_on_plug_in_failure=0) # Get additional header data which may have been created by ffdc plug-ins. # Also, delete the individual header files to cleanup. cmd_buf = "file_list=$(cat " + ffdc_report_list_path + " 2>/dev/null)" +\ " ; [ ! -z \"${file_list}\" ] && cat ${file_list}" +\ " 2>/dev/null ; rm -rf ${file_list} 2>/dev/null || :" shell_rc, more_header_info = gc.cmd_fnc_u(cmd_buf, print_output=0, show_err=0) # Get additional summary data which may have been created by ffdc plug-ins. # Also, delete the individual header files to cleanup. cmd_buf = "file_list=$(cat " + ffdc_summary_list_path + " 2>/dev/null)" +\ " ; [ ! -z \"${file_list}\" ] && cat ${file_list}" +\ " 2>/dev/null ; rm -rf ${file_list} 2>/dev/null || :" shell_rc, ffdc_summary_info = gc.cmd_fnc_u(cmd_buf, print_output=0, show_err=0) # ffdc_list_file_path contains a list of any ffdc files created by plug- # ins, etc. Read that data into a list. try: plug_in_ffdc_list = \ open(ffdc_list_file_path, 'r').read().rstrip("\n").split("\n") plug_in_ffdc_list = filter(None, plug_in_ffdc_list) except IOError: plug_in_ffdc_list = [] # Combine the files from plug_in_ffdc_list with the ffdc_file_list passed # in. Eliminate duplicates and sort the list. ffdc_file_list = sorted(set(ffdc_file_list + plug_in_ffdc_list)) if status_file_path != "": ffdc_file_list.insert(0, status_file_path) # Convert the list to a printable list. printable_ffdc_file_list = "\n".join(ffdc_file_list) # Open ffdc_file_list for writing. We will write a complete list of # FFDC files to it for possible use by plug-ins like cp_stop_check. ffdc_list_file = open(ffdc_list_file_path, 'w') ffdc_list_file.write(printable_ffdc_file_list + "\n") ffdc_list_file.close() indent = 0 width = 90 linefeed = 1 char = "=" gp.qprintn() gp.qprint_dashes(indent, width, linefeed, char) gp.qprintn("Copy this data to the defect:\n") if len(more_header_info) > 0: gp.qprintn(more_header_info) gp.qpvars(host_name, host_ip, openbmc_nickname, openbmc_host, openbmc_host_name, openbmc_ip, openbmc_username, openbmc_password, os_host, os_host_name, os_ip, os_username, os_password, pdu_host, pdu_host_name, pdu_ip, pdu_username, pdu_password, pdu_slot_no, openbmc_serial_host, openbmc_serial_host_name, openbmc_serial_ip, openbmc_serial_port) gp.qprintn() print_last_boots() gp.qprintn() gp.qprint_var(state) gp.qprintn() gp.qprintn("FFDC data files:") gp.qprintn(printable_ffdc_file_list) gp.qprintn() if len(ffdc_summary_info) > 0: gp.qprintn(ffdc_summary_info) gp.qprint_dashes(indent, width, linefeed, char)
def run_boot(boot): r""" Run the specified boot. Description of arguments: boot The name of the boot test to be performed. """ global state print_test_start_message(boot) plug_in_setup() rc, shell_rc, failed_plug_in_name = \ grpi.rprocess_plug_in_packages(call_point="pre_boot") if rc != 0: error_message = "Plug-in failed with non-zero return code.\n" +\ gp.sprint_var(rc, 1) BuiltIn().fail(gp.sprint_error(error_message)) if test_mode: # In test mode, we'll pretend the boot worked by assigning its # required end state to the default state value. state = st.strip_anchor_state(boot_table[boot]['end']) else: # Assertion: We trust that the state data was made fresh by the # caller. gp.qprintn() if boot_table[boot]['method_type'] == "keyword": rk.my_run_keywords(boot_table[boot].get('lib_file_path', ''), boot_table[boot]['method'], quiet=quiet) if boot_table[boot]['bmc_reboot']: st.wait_for_comm_cycle(int(state['epoch_seconds'])) plug_in_setup() rc, shell_rc, failed_plug_in_name = \ grpi.rprocess_plug_in_packages(call_point="post_reboot") if rc != 0: error_message = "Plug-in failed with non-zero return code.\n" error_message += gp.sprint_var(rc, 1) BuiltIn().fail(gp.sprint_error(error_message)) else: match_state = st.anchor_state(state) del match_state['epoch_seconds'] # Wait for the state to change in any way. st.wait_state(match_state, wait_time=state_change_timeout, interval="10 seconds", invert=1) gp.qprintn() if boot_table[boot]['end']['chassis'] == "Off": boot_timeout = power_off_timeout else: boot_timeout = power_on_timeout st.wait_state(boot_table[boot]['end'], wait_time=boot_timeout, interval="10 seconds") plug_in_setup() rc, shell_rc, failed_plug_in_name = \ grpi.rprocess_plug_in_packages(call_point="post_boot") if rc != 0: error_message = "Plug-in failed with non-zero return code.\n" +\ gp.sprint_var(rc, 1) BuiltIn().fail(gp.sprint_error(error_message))