blob: eb379a4e82bc8aff75ec715d884dd1a9b2c69df8 [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
Michael Walsh55302292017-01-10 11:43:02 -06009import gen_robot_plug_in as grpi
10import state as st
Michael Walsh0bbd8602016-11-22 11:31:49 -060011
12import os
13import time
14import subprocess
15
16from robot.utils import DotDict
17from robot.libraries.BuiltIn import BuiltIn
18from robot.libraries.OperatingSystem import OperatingSystem
19
20# Create boot_results_fields for use in creating boot_results.
21boot_results_fields = DotDict([('total', 0), ('pass', 0), ('fail', 0)])
22# Create boot_results which is global to this module.
23boot_results = tally_sheet('boot type',
24 boot_results_fields,
25 'boot_test_results')
26
27boot_results.set_sum_fields(['total', 'pass', 'fail'])
28boot_results.set_calc_fields(['total=pass+fail'])
29
30
31###############################################################################
Michael Walsh0bbd8602016-11-22 11:31:49 -060032def plug_in_setup():
33
34 r"""
35 Initialize all plug-in environment variables for use by the plug-in
36 programs.
37 """
38
39 boot_pass = int(BuiltIn().get_variable_value("${boot_pass}"))
40 if boot_pass > 1:
41 test_really_running = 1
42 else:
43 test_really_running = 0
44
45 BuiltIn().set_global_variable("${test_really_running}",
46 test_really_running)
47
48 next_boot = BuiltIn().get_variable_value("${next_boot}")
49 BuiltIn().set_global_variable("${boot_type_desc}", next_boot)
50
51 # Setting master_pid correctly influences the behavior of plug-ins like
52 # DB_Logging
53 program_pid = BuiltIn().get_variable_value("${program_pid}")
54 try:
55 master_pid = OperatingSystem().get_environment_variable(
56 "AUTOBOOT_MASTER_PID")
57 except RuntimeError:
58 master_pid = program_pid
59 if master_pid == "":
60 master_pid = program_pid
61
62 BuiltIn().set_global_variable("${master_pid}", master_pid)
63
64 seconds = time.time()
65 loc_time = time.localtime(seconds)
66 time_string = time.strftime("%y%m%d.%H%M%S.", loc_time)
67
68 openbmc_nickname = BuiltIn().get_variable_value("${openbmc_nickname}")
Michael Walsh769c2a12016-12-13 15:45:17 -060069 openbmc_host = BuiltIn().get_variable_value("${openbmc_host}")
Michael Walsh0bbd8602016-11-22 11:31:49 -060070 if openbmc_nickname == "":
Michael Walsh55302292017-01-10 11:43:02 -060071 openbmc_nickname = openbmc_host
72 ffdc_prefix = openbmc_nickname
Michael Walsh0bbd8602016-11-22 11:31:49 -060073
74 ffdc_prefix += "." + time_string
75
Michael Walsh86de0d22016-12-05 10:13:15 -060076 try:
77 ffdc_dir_path = os.environ['FFDC_DIR_PATH']
78 # Add trailing slash.
79 ffdc_dir_path = os.path.normpath(ffdc_dir_path) + os.sep
80 except KeyError:
81 ffdc_dir_path = ""
Michael Walsh0bbd8602016-11-22 11:31:49 -060082 BuiltIn().set_global_variable("${FFDC_DIR_PATH}", ffdc_dir_path)
83
Michael Walsh55302292017-01-10 11:43:02 -060084 status_dir_path = os.environ.get('STATUS_DIR_PATH', "")
85 if status_dir_path != "":
86 # Add trailing slash.
87 status_dir_path = os.path.normpath(status_dir_path) + os.sep
88 BuiltIn().set_global_variable("${STATUS_DIR_PATH}", status_dir_path)
89
90 base_tool_dir_path = os.environ.get('AUTOBOOT_BASE_TOOL_DIR_PATH', "/tmp")
Michael Walsh4c9a6452016-12-13 16:03:11 -060091 base_tool_dir_path = os.path.normpath(base_tool_dir_path) + os.sep
92 BuiltIn().set_global_variable("${BASE_TOOL_DIR_PATH}", base_tool_dir_path)
93
Michael Walsh55302292017-01-10 11:43:02 -060094 ffdc_list_file_path = base_tool_dir_path + openbmc_nickname +\
95 "/FFDC_FILE_LIST"
Michael Walsh4c9a6452016-12-13 16:03:11 -060096
97 BuiltIn().set_global_variable("${FFDC_LIST_FILE_PATH}",
98 ffdc_list_file_path)
99
Michael Walsh0bbd8602016-11-22 11:31:49 -0600100 # For each program parameter, set the corresponding AUTOBOOT_ environment
101 # variable value. Also, set an AUTOBOOT_ environment variable for every
102 # element in additional_values.
103 additional_values = ["boot_type_desc", "boot_success", "boot_pass",
104 "boot_fail", "test_really_running", "program_pid",
Michael Walsh4c9a6452016-12-13 16:03:11 -0600105 "master_pid", "ffdc_prefix", "ffdc_dir_path",
Michael Walsh55302292017-01-10 11:43:02 -0600106 "status_dir_path", "base_tool_dir_path",
107 "ffdc_list_file_path"]
Michael Walsh0bbd8602016-11-22 11:31:49 -0600108 BuiltIn().set_global_variable("${ffdc_prefix}", ffdc_prefix)
109
110 parm_list = BuiltIn().get_variable_value("@{parm_list}")
111
112 plug_in_vars = parm_list + additional_values
113
114 for var_name in plug_in_vars:
115 var_value = BuiltIn().get_variable_value("${" + var_name + "}")
116 var_name = var_name.upper()
117 if var_value is None:
118 var_value = ""
119 OperatingSystem().set_environment_variable(
120 "AUTOBOOT_" + var_name, var_value)
121
122 debug = int(BuiltIn().get_variable_value("${debug}"))
123 if debug:
124 cmd_buf = "printenv | egrep AUTOBOOT_ | sort -u"
125 grp.rpissuing(cmd_buf)
126 sub_proc = subprocess.Popen(cmd_buf, shell=True,
127 stdout=subprocess.PIPE,
128 stderr=subprocess.STDOUT)
129 out_buf, err_buf = sub_proc.communicate()
130 shell_rc = sub_proc.returncode
131 grp.rprint(out_buf)
132
133###############################################################################
134
135
136###############################################################################
137def create_boot_results_table():
138
139 r"""
140 Create our boot_results_table.
141 """
142
143 # At some point we'll want to change to reading in our boot types from
144 # some external source (e.g. file).
145
146 boot_results.add_row('BMC Power On')
147 boot_results.add_row('BMC Power Off')
148
149###############################################################################
150
151
152###############################################################################
153def update_boot_results_table(boot_type,
154 boot_status):
155
156 r"""
157 Update our boot_results_table. This includes:
158 - Updating the record for the given boot_type by incrementing the pass or
159 fail field.
160 - Calling the calc method to have the totals, etc. calculated.
161 - Updating global variables boot_pass/boot_fail.
162
163 Description of arguments:
164 boot_type The type of boot just done (e.g. "BMC Power On").
165 boot_status The status of the boot just done. This should be equal to
166 either "pass" or "fail" (case-insensitive).
167 """
168
169 boot_results.inc_row_field(boot_type, boot_status.lower())
170 totals_line = boot_results.calc()
171
172 # The caller of obmc_boot_test can pass boot_pass/boot_fail values because
173 # the caller may have already done some testing (e.g. "BMC OOB"). For the
174 # sake of DB logging done by plug-ins, we want to include these in our
175 # overall totals.
176 initial_boot_pass = int(BuiltIn().get_variable_value(
177 "${initial_boot_pass}"))
178 initial_boot_fail = int(BuiltIn().get_variable_value(
179 "${initial_boot_fail}"))
180
181 BuiltIn().set_global_variable("${boot_pass}",
182 totals_line['pass'] + initial_boot_pass)
183 BuiltIn().set_global_variable("${boot_fail}",
184 totals_line['fail'] + initial_boot_fail)
185
186###############################################################################
187
188
189###############################################################################
190def print_boot_results_table(header_footer="\n"):
191
192 r"""
193 Print the formatted boot_resuls_table to the console.
194 """
195
196 grp.rprint(header_footer)
197 grp.rprint(boot_results.sprint_report())
198 grp.rprint(header_footer)
199
200###############################################################################
Michael Walsh55302292017-01-10 11:43:02 -0600201
202
203###############################################################################
204def my_ffdc():
205
206 r"""
207 Collect FFDC data.
208 """
209
210 plug_in_setup()
211 rc, shell_rc, failed_plug_in_name = grpi.rprocess_plug_in_packages(
212 call_point='ffdc', stop_on_plug_in_failure=1)
213
214 AUTOBOOT_FFDC_PREFIX = os.environ['AUTOBOOT_FFDC_PREFIX']
215
216 # FFDC_LOG_PATH is used by "FFDC" keyword.
217 FFDC_DIR_PATH = BuiltIn().get_variable_value("${FFDC_DIR_PATH}")
218 BuiltIn().set_global_variable("${FFDC_LOG_PATH}",
219 FFDC_DIR_PATH)
220
221 cmd_buf = ["FFDC", "ffdc_prefix=" + AUTOBOOT_FFDC_PREFIX]
222 grp.rpissuing_keyword(cmd_buf)
223 BuiltIn().run_keyword(*cmd_buf)
224
225 state = st.get_state()
226 BuiltIn().set_global_variable("${state}",
227 state)
228
229 cmd_buf = ["Print Defect Report"]
230 grp.rpissuing_keyword(cmd_buf)
231 BuiltIn().run_keyword(*cmd_buf)
232
233###############################################################################