#!/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 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 add_trailing_slash(path): r""" Add a trailing slash to path if it doesn't already have one and return it. """ return os.path.normpath(path) + os.path.sep ############################################################################### ############################################################################### 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}") if openbmc_nickname == "": openbmc_host = BuiltIn().get_variable_value("${openbmc_host}") ffdc_prefix = openbmc_host else: 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) # 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"] 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) ###############################################################################