blob: 1f00683d4a8bd94952dddb692ddfcea2210ebb01 [file] [log] [blame]
George Keishinge7e91712021-09-03 11:28:44 -05001#!/usr/bin/env python3
Michael Walshe11a1362017-10-19 15:35:26 -05002
3r"""
4This file contains functions which are useful for processing BMC dumps.
5"""
6
Patrick Williams20f38712022-12-08 06:18:26 -06007import imp
Michael Walsh4f3ce172017-10-19 17:28:49 -05008import os
Michael Walshe11a1362017-10-19 15:35:26 -05009import sys
Patrick Williams20f38712022-12-08 06:18:26 -060010
11import bmc_ssh_utils as bsu
12import gen_misc as gm
13import gen_print as gp
14import gen_robot_keyword as grk
Patrick Williams20f38712022-12-08 06:18:26 -060015from robot.libraries.BuiltIn import BuiltIn
16
17base_path = (
18 os.path.dirname(os.path.dirname(imp.find_module("gen_robot_print")[1]))
19 + os.sep
20)
Michael Walshe11a1362017-10-19 15:35:26 -050021sys.path.append(base_path + "data/")
Patrick Williams20f38712022-12-08 06:18:26 -060022import variables as var # NOQA
Michael Walshe11a1362017-10-19 15:35:26 -050023
24
25def get_dump_dict(quiet=None):
Michael Walshe11a1362017-10-19 15:35:26 -050026 r"""
27 Get dump information and return as an ordered dictionary where the keys
28 are the dump IDs and the values are the full path names of the dumps.
29
30 Example robot program call:
31
32 ${dump_dict}= Get Dump Dict
Michael Walsh39c00512019-07-17 10:54:06 -050033 Rprint Vars dump_dict
Michael Walshe11a1362017-10-19 15:35:26 -050034
35 Example output:
36
37 dump_dict:
Joy Onyerikwu004ad3c2018-06-11 16:29:56 -050038 [1]:
39 /var/lib/phosphor-debug-collector/dumps/1/obmcdump_1_1508255216.tar.xz
40 [2]:
41 /var/lib/phosphor-debug-collector/dumps/2/obmcdump_2_1508255245.tar.xz
42 [3]:
43 /var/lib/phosphor-debug-collector/dumps/3/obmcdump_3_1508255267.tar.xz
44 [4]:
45 /var/lib/phosphor-debug-collector/dumps/4/obmcdump_4_1508255283.tar.xz
Michael Walshe11a1362017-10-19 15:35:26 -050046
47 Description of argument(s):
48 quiet If quiet is set to 1, this function will
49 NOT write status messages to stdout.
50 """
51
52 quiet = int(gp.get_var_value(quiet, 1))
George Keishingbd8ec922022-03-31 13:39:35 -050053 cmd_buf = "find /var/lib/phosphor-debug-collector/ -maxdepth 4 -type f"
Michael Walshe11a1362017-10-19 15:35:26 -050054 output, stderr, rc = bsu.bmc_execute_command(cmd_buf, quiet=quiet)
55
George Keishingbd8ec922022-03-31 13:39:35 -050056 BuiltIn().log_to_console(output)
57 return output.split("\n")
Michael Walshe11a1362017-10-19 15:35:26 -050058
59
Patrick Williams20f38712022-12-08 06:18:26 -060060def valid_dump(dump_id, dump_dict=None, quiet=None):
Michael Walshe11a1362017-10-19 15:35:26 -050061 r"""
62 Verify that dump_id is a valid. If it is not valid, issue robot failure
63 message.
64
65 A dump is valid if the indicated dump_id refers to an existing dump with a
66 valid associated dump file.
67
68 Description of argument(s):
69 dump_id A dump ID (e.g. "1", "2", etc.)
70 dump_dict A dump dictionary such as the one returned
71 by get_dump_dict. If this value is None,
72 this function will call get_dump_dict on
73 the caller's behalf.
74 quiet If quiet is set to 1, this function will
75 NOT write status messages to stdout.
76 """
77
78 if dump_dict is None:
79 dump_dict = get_dump_dict(quiet=quiet)
80
81 if dump_id not in dump_dict:
Patrick Williams20f38712022-12-08 06:18:26 -060082 message = (
83 "The specified dump ID was not found among the existing"
Michael Walshe11a1362017-10-19 15:35:26 -050084 + " dumps:\n"
Patrick Williams20f38712022-12-08 06:18:26 -060085 )
Michael Walshe11a1362017-10-19 15:35:26 -050086 message += gp.sprint_var(dump_id)
87 message += gp.sprint_var(dump_dict)
88 BuiltIn().fail(gp.sprint_error(message))
89
90 if not dump_dict[dump_id].endswith("tar.xz"):
Patrick Williams20f38712022-12-08 06:18:26 -060091 message = (
92 'There is no "tar.xz" file associated with the given'
Michael Walshe11a1362017-10-19 15:35:26 -050093 + " dump_id:\n"
Patrick Williams20f38712022-12-08 06:18:26 -060094 )
Michael Walshe11a1362017-10-19 15:35:26 -050095 message += gp.sprint_var(dump_id)
96 dump_file_path = dump_dict[dump_id]
97 message += gp.sprint_var(dump_file_path)
98 BuiltIn().fail(gp.sprint_error(message))
Michael Walsh4f3ce172017-10-19 17:28:49 -050099
100
Patrick Williams20f38712022-12-08 06:18:26 -0600101def scp_dumps(targ_dir_path, targ_file_prefix="", dump_dict=None, quiet=None):
Michael Walsh4f3ce172017-10-19 17:28:49 -0500102 r"""
103 SCP all dumps from the BMC to the indicated directory on the local system
104 and return a list of the new files.
105
106 Description of argument(s):
107 targ_dir_path The path of the directory to receive the
108 dump files.
George Keishinge16f1582022-12-15 07:32:21 -0600109 targ_file_prefix Prefix which will be prepended to each
Michael Walsh4f3ce172017-10-19 17:28:49 -0500110 target file's name.
111 dump_dict A dump dictionary such as the one returned
112 by get_dump_dict. If this value is None,
113 this function will call get_dump_dict on
114 the caller's behalf.
115 quiet If quiet is set to 1, this function will
116 NOT write status messages to stdout.
117 """
118
119 targ_dir_path = gm.add_trailing_slash(targ_dir_path)
120
121 if dump_dict is None:
George Keishingbd8ec922022-03-31 13:39:35 -0500122 dump_list = get_dump_dict(quiet=quiet)
Michael Walsh4f3ce172017-10-19 17:28:49 -0500123
124 status, ret_values = grk.run_key("Open Connection for SCP", quiet=quiet)
125
126 dump_file_list = []
George Keishingbd8ec922022-03-31 13:39:35 -0500127 for file_path in dump_list:
Patrick Williams20f38712022-12-08 06:18:26 -0600128 targ_file_path = (
129 targ_dir_path + targ_file_prefix + os.path.basename(file_path)
130 )
131 status, ret_values = grk.run_key(
132 "scp.Get File " + file_path + " " + targ_file_path, quiet=quiet
133 )
George Keishing1165a022021-05-19 06:23:13 -0500134 dump_file_list.append(targ_file_path)
135
136 return dump_file_list