blob: 72c04995d5fa1e516db36fbe4af9220776623bab [file] [log] [blame]
Michael Walsh0bbd8602016-11-22 11:31:49 -06001#!/usr/bin/env python
2
3r"""
4This module is the python counterpart to obmc_boot_test.
5"""
6
7from tally_sheet import *
8import gen_robot_print as grp
9
10import os
11import time
12import subprocess
13
14from robot.utils import DotDict
15from robot.libraries.BuiltIn import BuiltIn
16from robot.libraries.OperatingSystem import OperatingSystem
17
18# Create boot_results_fields for use in creating boot_results.
19boot_results_fields = DotDict([('total', 0), ('pass', 0), ('fail', 0)])
20# Create boot_results which is global to this module.
21boot_results = tally_sheet('boot type',
22 boot_results_fields,
23 'boot_test_results')
24
25boot_results.set_sum_fields(['total', 'pass', 'fail'])
26boot_results.set_calc_fields(['total=pass+fail'])
27
28
29###############################################################################
30def add_trailing_slash(path):
31
32 r"""
33 Add a trailing slash to path if it doesn't already have one and return it.
34
35 """
36
37 return os.path.normpath(path) + os.path.sep
38
39###############################################################################
40
41
42###############################################################################
43def plug_in_setup():
44
45 r"""
46 Initialize all plug-in environment variables for use by the plug-in
47 programs.
48 """
49
50 boot_pass = int(BuiltIn().get_variable_value("${boot_pass}"))
51 if boot_pass > 1:
52 test_really_running = 1
53 else:
54 test_really_running = 0
55
56 BuiltIn().set_global_variable("${test_really_running}",
57 test_really_running)
58
59 next_boot = BuiltIn().get_variable_value("${next_boot}")
60 BuiltIn().set_global_variable("${boot_type_desc}", next_boot)
61
62 # Setting master_pid correctly influences the behavior of plug-ins like
63 # DB_Logging
64 program_pid = BuiltIn().get_variable_value("${program_pid}")
65 try:
66 master_pid = OperatingSystem().get_environment_variable(
67 "AUTOBOOT_MASTER_PID")
68 except RuntimeError:
69 master_pid = program_pid
70 if master_pid == "":
71 master_pid = program_pid
72
73 BuiltIn().set_global_variable("${master_pid}", master_pid)
74
75 seconds = time.time()
76 loc_time = time.localtime(seconds)
77 time_string = time.strftime("%y%m%d.%H%M%S.", loc_time)
78
79 openbmc_nickname = BuiltIn().get_variable_value("${openbmc_nickname}")
80 if openbmc_nickname == "":
81 openbmc_host = BuiltIn().get_variable_value("${openbmc_host}")
82 ffdc_prefix = openbmc_host
83 else:
84 ffdc_prefix = openbmc_nickname
85
86 ffdc_prefix += "." + time_string
87
Michael Walsh86de0d22016-12-05 10:13:15 -060088 try:
89 ffdc_dir_path = os.environ['FFDC_DIR_PATH']
90 # Add trailing slash.
91 ffdc_dir_path = os.path.normpath(ffdc_dir_path) + os.sep
92 except KeyError:
93 ffdc_dir_path = ""
Michael Walsh0bbd8602016-11-22 11:31:49 -060094 BuiltIn().set_global_variable("${FFDC_DIR_PATH}", ffdc_dir_path)
95
Michael Walsh4c9a6452016-12-13 16:03:11 -060096 try:
97 base_tool_dir_path = os.environ['AUTOBOOT_BASE_TOOL_DIR_PATH']
98 except KeyError:
99 base_tool_dir_path = "/tmp/"
100 base_tool_dir_path = os.path.normpath(base_tool_dir_path) + os.sep
101 BuiltIn().set_global_variable("${BASE_TOOL_DIR_PATH}", base_tool_dir_path)
102
103 ffdc_list_file_path = base_tool_dir_path + openbmc_host + "/FFDC_FILE_LIST"
104
105 BuiltIn().set_global_variable("${FFDC_LIST_FILE_PATH}",
106 ffdc_list_file_path)
107
Michael Walsh0bbd8602016-11-22 11:31:49 -0600108 # For each program parameter, set the corresponding AUTOBOOT_ environment
109 # variable value. Also, set an AUTOBOOT_ environment variable for every
110 # element in additional_values.
111 additional_values = ["boot_type_desc", "boot_success", "boot_pass",
112 "boot_fail", "test_really_running", "program_pid",
Michael Walsh4c9a6452016-12-13 16:03:11 -0600113 "master_pid", "ffdc_prefix", "ffdc_dir_path",
114 "base_tool_dir_path", "ffdc_list_file_path"]
Michael Walsh0bbd8602016-11-22 11:31:49 -0600115 BuiltIn().set_global_variable("${ffdc_prefix}", ffdc_prefix)
116
117 parm_list = BuiltIn().get_variable_value("@{parm_list}")
118
119 plug_in_vars = parm_list + additional_values
120
121 for var_name in plug_in_vars:
122 var_value = BuiltIn().get_variable_value("${" + var_name + "}")
123 var_name = var_name.upper()
124 if var_value is None:
125 var_value = ""
126 OperatingSystem().set_environment_variable(
127 "AUTOBOOT_" + var_name, var_value)
128
129 debug = int(BuiltIn().get_variable_value("${debug}"))
130 if debug:
131 cmd_buf = "printenv | egrep AUTOBOOT_ | sort -u"
132 grp.rpissuing(cmd_buf)
133 sub_proc = subprocess.Popen(cmd_buf, shell=True,
134 stdout=subprocess.PIPE,
135 stderr=subprocess.STDOUT)
136 out_buf, err_buf = sub_proc.communicate()
137 shell_rc = sub_proc.returncode
138 grp.rprint(out_buf)
139
140###############################################################################
141
142
143###############################################################################
144def create_boot_results_table():
145
146 r"""
147 Create our boot_results_table.
148 """
149
150 # At some point we'll want to change to reading in our boot types from
151 # some external source (e.g. file).
152
153 boot_results.add_row('BMC Power On')
154 boot_results.add_row('BMC Power Off')
155
156###############################################################################
157
158
159###############################################################################
160def update_boot_results_table(boot_type,
161 boot_status):
162
163 r"""
164 Update our boot_results_table. This includes:
165 - Updating the record for the given boot_type by incrementing the pass or
166 fail field.
167 - Calling the calc method to have the totals, etc. calculated.
168 - Updating global variables boot_pass/boot_fail.
169
170 Description of arguments:
171 boot_type The type of boot just done (e.g. "BMC Power On").
172 boot_status The status of the boot just done. This should be equal to
173 either "pass" or "fail" (case-insensitive).
174 """
175
176 boot_results.inc_row_field(boot_type, boot_status.lower())
177 totals_line = boot_results.calc()
178
179 # The caller of obmc_boot_test can pass boot_pass/boot_fail values because
180 # the caller may have already done some testing (e.g. "BMC OOB"). For the
181 # sake of DB logging done by plug-ins, we want to include these in our
182 # overall totals.
183 initial_boot_pass = int(BuiltIn().get_variable_value(
184 "${initial_boot_pass}"))
185 initial_boot_fail = int(BuiltIn().get_variable_value(
186 "${initial_boot_fail}"))
187
188 BuiltIn().set_global_variable("${boot_pass}",
189 totals_line['pass'] + initial_boot_pass)
190 BuiltIn().set_global_variable("${boot_fail}",
191 totals_line['fail'] + initial_boot_fail)
192
193###############################################################################
194
195
196###############################################################################
197def print_boot_results_table(header_footer="\n"):
198
199 r"""
200 Print the formatted boot_resuls_table to the console.
201 """
202
203 grp.rprint(header_footer)
204 grp.rprint(boot_results.sprint_report())
205 grp.rprint(header_footer)
206
207###############################################################################