#!/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)

###############################################################################
