blob: 47ddb1988f78be847cbffc20d35fa415ad8d412b [file] [log] [blame]
Michael Walsh769c2a12016-12-13 15:45:17 -06001#!/usr/bin/env python
2
3r"""
4This module is the python counterpart to openbmc_ffdc.robot..
5"""
6
7import os
8
9import gen_robot_print as grp
10import gen_valid as gv
11
12from robot.libraries.BuiltIn import BuiltIn
13
14
15###############################################################################
16def ffdc(ffdc_dir_path=None,
17 ffdc_prefix=None):
18
19 r"""
20 Gather First Failure Data Capture (FFDC).
21
22 This includes:
23 - Set global FFDC_TIME.
24 - Create FFDC work space directory.
25 - Write test info details.
26 - Call BMC methods to write/collect FFDC data.
27
28 Description of arguments:
29 ffdc_dir_path The dir path where FFDC data should be put.
30 ffdc_prefix The prefix to be given to each FFDC file name generated.
31 """
32
33 grp.rprint_timen("Collecting FFDC.")
34
35 # Note: Several subordinate functions like 'Get Test Dir and Name' and
36 # 'Header Message' expect global variable FFDC_TIME to be set.
37 cmd_buf = ["Get Current Time Stamp"]
38 grp.rpissuing_keyword(cmd_buf)
39 FFDC_TIME = BuiltIn().run_keyword(*cmd_buf)
40 BuiltIn().set_global_variable("${FFDC_TIME}", FFDC_TIME)
41
42 # Get default values for arguments.
43 ffdc_dir_path, ffdc_prefix = set_ffdc_defaults(ffdc_dir_path, ffdc_prefix)
44 grp.rprint_var(ffdc_dir_path)
45 grp.rprint_var(ffdc_prefix)
46
47 # LOG_PREFIX is used by subordinate functions.
48 LOG_PREFIX = ffdc_dir_path + ffdc_prefix
49 BuiltIn().set_global_variable("${LOG_PREFIX}", LOG_PREFIX)
50
51 cmd_buf = ["Create Directory", ffdc_dir_path]
52 grp.rpissuing_keyword(cmd_buf)
53 status, output = BuiltIn().run_keyword_and_ignore_error(*cmd_buf)
54 if status != "PASS":
55 error_message = grp.sprint_error_report("Create Directory failed with the following error:\n" + output)
56 BuiltIn().fail(error_message)
57
58 # FFDC_FILE_PATH is used by Header Message.
59 FFDC_FILE_PATH = ffdc_dir_path + ffdc_prefix + "BMC_general.txt"
60 BuiltIn().set_global_variable("${FFDC_FILE_PATH}", FFDC_FILE_PATH)
61
62 cmd_buf = ["Header Message"]
63 grp.rpissuing_keyword(cmd_buf)
64 BuiltIn().run_keyword(*cmd_buf)
65
66 cmd_buf = ["Call FFDC Methods"]
67 grp.rpissuing_keyword(cmd_buf)
68 BuiltIn().run_keyword(*cmd_buf)
69
70 grp.rprint_timen("Finished collecting FFDC.")
71
72###############################################################################
73
74
75###############################################################################
76def set_ffdc_defaults(ffdc_dir_path=None,
77 ffdc_prefix=None):
78
79 r"""
80 Set a default value for ffdc_dir_path and ffdc_prefix if they don't
81 already have values. Return both values.
82
83 Description of arguments:
84 ffdc_dir_path The dir path where FFDC data should be put.
85 ffdc_prefix The prefix to be given to each FFDC file name generated.
86
87 NOTE: If global variable ffdc_dir_path_style is set to ${1}, this function
88 will create default values in a newer way. Otherwise, its behavior
89 will remain unchanged.
90 """
91
92 ffdc_dir_path_style = BuiltIn().get_variable_value("${ffdc_dir_path_style}")
93
94 if ffdc_dir_path is None:
95 if ffdc_dir_path_style:
96 try:
97 ffdc_dir_path = os.environ['FFDC_DIR_PATH']
98 except KeyError:
99 ffdc_dir_path = os.path.dirname(
100 BuiltIn().get_variable_value("${LOG_FILE}")) + "/"
101 else:
102 FFDC_LOG_PATH = BuiltIn().get_variable_value("${FFDC_LOG_PATH}")
103 if FFDC_LOG_PATH is None:
104 FFDC_LOG_PATH = ""
105 if FFDC_LOG_PATH == "":
106 FFDC_LOG_PATH = os.path.dirname(
107 BuiltIn().get_variable_value("${LOG_FILE}")) + "/"
108 error_message = gv.svalid_value(FFDC_LOG_PATH,
109 var_name="FFDC_LOG_PATH")
110 if error_message != "":
111 error_message = grp.sprint_error_report(error_message)
112 BuiltIn().fail(error_message)
113 FFDC_LOG_PATH = os.path.normpath(FFDC_LOG_PATH) + os.sep
114
115 cmd_buf = ["Get Test Dir and Name"]
116 grp.rpissuing_keyword(cmd_buf)
117 suitename, testname = BuiltIn().run_keyword(*cmd_buf)
118
119 ffdc_dir_path = FFDC_LOG_PATH + suitename + "/" + testname + "/"
120
121 # Add trailing slash.
122 ffdc_dir_path = os.path.normpath(ffdc_dir_path) + os.sep
123
124 if ffdc_prefix is None:
125 FFDC_TIME = BuiltIn().get_variable_value("${FFDC_TIME}")
126 if ffdc_prefix is None:
127 if ffdc_dir_path_style:
128 OPENBMC_HOST = BuiltIn().get_variable_value("${OPENBMC_HOST}")
129 ffdc_prefix = OPENBMC_HOST + "." + FFDC_TIME[2:8] + "." +\
130 FFDC_TIME[8:14] + "."
131 else:
132 ffdc_prefix = FFDC_TIME + "_"
133
134 return ffdc_dir_path, ffdc_prefix
135
136###############################################################################