#!/usr/bin/env python r""" This module is the python counterpart to obmc_boot_test. """ from tally_sheet import * import gen_robot_print as grp import gen_robot_plug_in as grpi import state as st import os import time import subprocess from robot.utils import DotDict from robot.libraries.BuiltIn import BuiltIn from robot.libraries.OperatingSystem import OperatingSystem # Create boot_results_fields for use in creating boot_results. boot_results_fields = DotDict([('total', 0), ('pass', 0), ('fail', 0)]) # Create boot_results which is global to this module. boot_results = tally_sheet('boot type', boot_results_fields, 'boot_test_results') boot_results.set_sum_fields(['total', 'pass', 'fail']) boot_results.set_calc_fields(['total=pass+fail']) ############################################################################### def plug_in_setup(): r""" Initialize all plug-in environment variables for use by the plug-in programs. """ boot_pass = int(BuiltIn().get_variable_value("${boot_pass}")) if boot_pass > 1: test_really_running = 1 else: test_really_running = 0 BuiltIn().set_global_variable("${test_really_running}", test_really_running) next_boot = BuiltIn().get_variable_value("${next_boot}") BuiltIn().set_global_variable("${boot_type_desc}", next_boot) # Setting master_pid correctly influences the behavior of plug-ins like # DB_Logging program_pid = BuiltIn().get_variable_value("${program_pid}") try: master_pid = OperatingSystem().get_environment_variable( "AUTOBOOT_MASTER_PID") except RuntimeError: master_pid = program_pid if master_pid == "": master_pid = program_pid BuiltIn().set_global_variable("${master_pid}", master_pid) seconds = time.time() loc_time = time.localtime(seconds) time_string = time.strftime("%y%m%d.%H%M%S.", loc_time) openbmc_nickname = BuiltIn().get_variable_value("${openbmc_nickname}") openbmc_host = BuiltIn().get_variable_value("${openbmc_host}") if openbmc_nickname == "": openbmc_nickname = openbmc_host ffdc_prefix = openbmc_nickname ffdc_prefix += "." + time_string try: ffdc_dir_path = os.environ['FFDC_DIR_PATH'] # Add trailing slash. ffdc_dir_path = os.path.normpath(ffdc_dir_path) + os.sep except KeyError: ffdc_dir_path = "" BuiltIn().set_global_variable("${FFDC_DIR_PATH}", ffdc_dir_path) status_dir_path = os.environ.get('STATUS_DIR_PATH', "") if status_dir_path != "": # Add trailing slash. status_dir_path = os.path.normpath(status_dir_path) + os.sep BuiltIn().set_global_variable("${STATUS_DIR_PATH}", status_dir_path) base_tool_dir_path = os.environ.get('AUTOBOOT_BASE_TOOL_DIR_PATH', "/tmp") base_tool_dir_path = os.path.normpath(base_tool_dir_path) + os.sep BuiltIn().set_global_variable("${BASE_TOOL_DIR_PATH}", base_tool_dir_path) ffdc_list_file_path = base_tool_dir_path + openbmc_nickname +\ "/FFDC_FILE_LIST" BuiltIn().set_global_variable("${FFDC_LIST_FILE_PATH}", ffdc_list_file_path) # For each program parameter, set the corresponding AUTOBOOT_ environment # variable value. Also, set an AUTOBOOT_ environment variable for every # element in additional_values. additional_values = ["boot_type_desc", "boot_success", "boot_pass", "boot_fail", "test_really_running", "program_pid", "master_pid", "ffdc_prefix", "ffdc_dir_path", "status_dir_path", "base_tool_dir_path", "ffdc_list_file_path"] BuiltIn().set_global_variable("${ffdc_prefix}", ffdc_prefix) parm_list = BuiltIn().get_variable_value("@{parm_list}") plug_in_vars = parm_list + additional_values for var_name in plug_in_vars: var_value = BuiltIn().get_variable_value("${" + var_name + "}") var_name = var_name.upper() if var_value is None: var_value = "" OperatingSystem().set_environment_variable( "AUTOBOOT_" + var_name, var_value) debug = int(BuiltIn().get_variable_value("${debug}")) if debug: cmd_buf = "printenv | egrep AUTOBOOT_ | sort -u" grp.rpissuing(cmd_buf) sub_proc = subprocess.Popen(cmd_buf, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out_buf, err_buf = sub_proc.communicate() shell_rc = sub_proc.returncode grp.rprint(out_buf) ############################################################################### ############################################################################### def create_boot_results_table(): r""" Create our boot_results_table. """ # At some point we'll want to change to reading in our boot types from # some external source (e.g. file). boot_results.add_row('BMC Power On') boot_results.add_row('BMC Power Off') ############################################################################### ############################################################################### def update_boot_results_table(boot_type, boot_status): r""" Update our boot_results_table. This includes: - Updating the record for the given boot_type by incrementing the pass or fail field. - Calling the calc method to have the totals, etc. calculated. - Updating global variables boot_pass/boot_fail. Description of arguments: boot_type The type of boot just done (e.g. "BMC Power On"). boot_status The status of the boot just done. This should be equal to either "pass" or "fail" (case-insensitive). """ boot_results.inc_row_field(boot_type, boot_status.lower()) totals_line = boot_results.calc() # The caller of obmc_boot_test can pass boot_pass/boot_fail values because # the caller may have already done some testing (e.g. "BMC OOB"). For the # sake of DB logging done by plug-ins, we want to include these in our # overall totals. initial_boot_pass = int(BuiltIn().get_variable_value( "${initial_boot_pass}")) initial_boot_fail = int(BuiltIn().get_variable_value( "${initial_boot_fail}")) BuiltIn().set_global_variable("${boot_pass}", totals_line['pass'] + initial_boot_pass) BuiltIn().set_global_variable("${boot_fail}", totals_line['fail'] + initial_boot_fail) ############################################################################### ############################################################################### def print_boot_results_table(header_footer="\n"): r""" Print the formatted boot_resuls_table to the console. """ grp.rprint(header_footer) grp.rprint(boot_results.sprint_report()) grp.rprint(header_footer) ############################################################################### ############################################################################### def my_ffdc(): r""" Collect FFDC data. """ plug_in_setup() rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages( call_point='ffdc', stop_on_plug_in_failure=1) AUTOBOOT_FFDC_PREFIX = os.environ['AUTOBOOT_FFDC_PREFIX'] # FFDC_LOG_PATH is used by "FFDC" keyword. FFDC_DIR_PATH = BuiltIn().get_variable_value("${FFDC_DIR_PATH}") BuiltIn().set_global_variable("${FFDC_LOG_PATH}", FFDC_DIR_PATH) cmd_buf = ["FFDC", "ffdc_prefix=" + AUTOBOOT_FFDC_PREFIX] grp.rpissuing_keyword(cmd_buf) BuiltIn().run_keyword(*cmd_buf) state = st.get_state() BuiltIn().set_global_variable("${state}", state) cmd_buf = ["Print Defect Report"] grp.rpissuing_keyword(cmd_buf) BuiltIn().run_keyword(*cmd_buf) ###############################################################################