blob: 80a5c96ad2f919322101596b9c4aec464c5a5399 [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
George Keishing3f7f12c2017-03-02 06:14:41 -060033 # Check if Ping and SSH connection is alive
34 OPENBMC_HOST = BuiltIn().get_variable_value("${OPENBMC_HOST}")
35 cmd_buf = ["Ping Host", OPENBMC_HOST]
36 grp.rpissuing_keyword(cmd_buf)
37 status_ping = BuiltIn().run_keyword_and_return_status(*cmd_buf)
38 grp.rprint_var(status_ping)
39 if status_ping == True:
40 status_ssh = \
41 BuiltIn().run_keyword_and_return_status("Open Connection And Log In")
42 grp.rprint_var(status_ssh)
43 if status_ssh != True:
44 grp.rprint_error("BMC is not communicating. \
45 Aborting FFDC collection.\n")
46 BuiltIn().run_keyword_and_return_status("Close All Connections")
47 return
48
Michael Walsh769c2a12016-12-13 15:45:17 -060049 grp.rprint_timen("Collecting FFDC.")
50
51 # Note: Several subordinate functions like 'Get Test Dir and Name' and
52 # 'Header Message' expect global variable FFDC_TIME to be set.
53 cmd_buf = ["Get Current Time Stamp"]
Michael Walsha0364ae2017-01-10 11:24:42 -060054 grp.rdpissuing_keyword(cmd_buf)
Michael Walsh769c2a12016-12-13 15:45:17 -060055 FFDC_TIME = BuiltIn().run_keyword(*cmd_buf)
56 BuiltIn().set_global_variable("${FFDC_TIME}", FFDC_TIME)
57
58 # Get default values for arguments.
59 ffdc_dir_path, ffdc_prefix = set_ffdc_defaults(ffdc_dir_path, ffdc_prefix)
60 grp.rprint_var(ffdc_dir_path)
61 grp.rprint_var(ffdc_prefix)
62
63 # LOG_PREFIX is used by subordinate functions.
64 LOG_PREFIX = ffdc_dir_path + ffdc_prefix
65 BuiltIn().set_global_variable("${LOG_PREFIX}", LOG_PREFIX)
66
67 cmd_buf = ["Create Directory", ffdc_dir_path]
68 grp.rpissuing_keyword(cmd_buf)
69 status, output = BuiltIn().run_keyword_and_ignore_error(*cmd_buf)
70 if status != "PASS":
Michael Walsha0364ae2017-01-10 11:24:42 -060071 error_message = grp.sprint_error_report("Create Directory failed" +
72 " with the following" +
73 " error:\n" + output)
Michael Walsh769c2a12016-12-13 15:45:17 -060074 BuiltIn().fail(error_message)
75
76 # FFDC_FILE_PATH is used by Header Message.
77 FFDC_FILE_PATH = ffdc_dir_path + ffdc_prefix + "BMC_general.txt"
78 BuiltIn().set_global_variable("${FFDC_FILE_PATH}", FFDC_FILE_PATH)
79
80 cmd_buf = ["Header Message"]
81 grp.rpissuing_keyword(cmd_buf)
82 BuiltIn().run_keyword(*cmd_buf)
83
84 cmd_buf = ["Call FFDC Methods"]
85 grp.rpissuing_keyword(cmd_buf)
86 BuiltIn().run_keyword(*cmd_buf)
87
88 grp.rprint_timen("Finished collecting FFDC.")
89
90###############################################################################
91
92
93###############################################################################
94def set_ffdc_defaults(ffdc_dir_path=None,
95 ffdc_prefix=None):
96
97 r"""
98 Set a default value for ffdc_dir_path and ffdc_prefix if they don't
99 already have values. Return both values.
100
101 Description of arguments:
102 ffdc_dir_path The dir path where FFDC data should be put.
103 ffdc_prefix The prefix to be given to each FFDC file name generated.
104
105 NOTE: If global variable ffdc_dir_path_style is set to ${1}, this function
106 will create default values in a newer way. Otherwise, its behavior
107 will remain unchanged.
108 """
109
Michael Walsha0364ae2017-01-10 11:24:42 -0600110 ffdc_dir_path_style = BuiltIn().get_variable_value(
111 "${ffdc_dir_path_style}")
Michael Walsh769c2a12016-12-13 15:45:17 -0600112
113 if ffdc_dir_path is None:
114 if ffdc_dir_path_style:
115 try:
116 ffdc_dir_path = os.environ['FFDC_DIR_PATH']
117 except KeyError:
118 ffdc_dir_path = os.path.dirname(
119 BuiltIn().get_variable_value("${LOG_FILE}")) + "/"
120 else:
121 FFDC_LOG_PATH = BuiltIn().get_variable_value("${FFDC_LOG_PATH}")
122 if FFDC_LOG_PATH is None:
123 FFDC_LOG_PATH = ""
124 if FFDC_LOG_PATH == "":
125 FFDC_LOG_PATH = os.path.dirname(
126 BuiltIn().get_variable_value("${LOG_FILE}")) + "/"
127 error_message = gv.svalid_value(FFDC_LOG_PATH,
128 var_name="FFDC_LOG_PATH")
129 if error_message != "":
130 error_message = grp.sprint_error_report(error_message)
131 BuiltIn().fail(error_message)
132 FFDC_LOG_PATH = os.path.normpath(FFDC_LOG_PATH) + os.sep
133
134 cmd_buf = ["Get Test Dir and Name"]
135 grp.rpissuing_keyword(cmd_buf)
136 suitename, testname = BuiltIn().run_keyword(*cmd_buf)
137
138 ffdc_dir_path = FFDC_LOG_PATH + suitename + "/" + testname + "/"
139
140 # Add trailing slash.
141 ffdc_dir_path = os.path.normpath(ffdc_dir_path) + os.sep
142
143 if ffdc_prefix is None:
144 FFDC_TIME = BuiltIn().get_variable_value("${FFDC_TIME}")
145 if ffdc_prefix is None:
146 if ffdc_dir_path_style:
147 OPENBMC_HOST = BuiltIn().get_variable_value("${OPENBMC_HOST}")
Michael Walsha0364ae2017-01-10 11:24:42 -0600148 OPENBMC_NICKNAME = BuiltIn().get_variable_value(
149 "${OPENBMC_NICKNAME}", default=OPENBMC_HOST)
150 ffdc_prefix = OPENBMC_NICKNAME + "." + FFDC_TIME[2:8] + "." +\
Michael Walsh769c2a12016-12-13 15:45:17 -0600151 FFDC_TIME[8:14] + "."
152 else:
153 ffdc_prefix = FFDC_TIME + "_"
154
155 return ffdc_dir_path, ffdc_prefix
156
157###############################################################################