blob: 47586e5e0b8c1f314cc7f219fe203e093fba706e [file] [log] [blame]
Chris Austenb29d2e82016-06-07 12:25:35 -05001#!/usr/bin/python -u
2import sys
3from robot.libraries.BuiltIn import BuiltIn
4import imp
5import string
Rahul Maheshwari757d80c2016-10-17 01:09:55 -05006import random
Michael Walsh8b270ec2017-01-31 12:07:08 -06007import subprocess
8from robot.utils import DotDict
9
Chris Austenb29d2e82016-06-07 12:25:35 -050010
Rahul Maheshwari757d80c2016-10-17 01:09:55 -050011def random_mac():
12 r"""
13 Return random mac address in the following format.
14 Example: 00:01:6C:80:02:78
15 """
16 return ":".join(map(lambda x: "%02x" % x, (random.randint(0x00, 0xff)
17 for _ in range(6))))
18
19def random_ip():
20 r"""
21 Return random ip address in the following format.
22 Example: 9.3.128.100
23 """
24 return ".".join(map(str, (random.randint(0, 255)
25 for _ in range(4))))
Chris Austenb29d2e82016-06-07 12:25:35 -050026
27def get_sensor(module_name, value):
Gunnar Millsbb398ac2016-11-14 11:50:22 -060028 m = imp.load_source('module.name', module_name)
Chris Austenb29d2e82016-06-07 12:25:35 -050029
Gunnar Millsbb398ac2016-11-14 11:50:22 -060030 for i in m.ID_LOOKUP['SENSOR']:
Chris Austenb29d2e82016-06-07 12:25:35 -050031
Gunnar Millsbb398ac2016-11-14 11:50:22 -060032 if m.ID_LOOKUP['SENSOR'][i] == value:
33 return i
Chris Austenb29d2e82016-06-07 12:25:35 -050034
Gunnar Millsbb398ac2016-11-14 11:50:22 -060035 return 0xFF
36
Chris Austenb29d2e82016-06-07 12:25:35 -050037
38def get_inventory_sensor (module_name, value):
Gunnar Millsbb398ac2016-11-14 11:50:22 -060039 m = imp.load_source('module.name', module_name)
Chris Austenb29d2e82016-06-07 12:25:35 -050040
Gunnar Millsbb398ac2016-11-14 11:50:22 -060041 value = string.replace(value, m.INVENTORY_ROOT, '<inventory_root>')
Chris Austenb29d2e82016-06-07 12:25:35 -050042
Gunnar Millsbb398ac2016-11-14 11:50:22 -060043 for i in m.ID_LOOKUP['SENSOR']:
Chris Austenb29d2e82016-06-07 12:25:35 -050044
Gunnar Millsbb398ac2016-11-14 11:50:22 -060045 if m.ID_LOOKUP['SENSOR'][i] == value:
46 return i
Chris Austenb29d2e82016-06-07 12:25:35 -050047
Gunnar Millsbb398ac2016-11-14 11:50:22 -060048 return 0xFF
Chris Austenb29d2e82016-06-07 12:25:35 -050049
50
51################################################################
Gunnar Millsbb398ac2016-11-14 11:50:22 -060052# This will return the URI's of the FRU type
Chris Austenb29d2e82016-06-07 12:25:35 -050053#
54# i.e. get_inventory_list('../data/Palmetto.py')
55#
56# [/org/openbmc/inventory//system/chassis/motherboard/cpu0/core0,
57# /org/openbmc/inventory/system/chassis/motherboard/dimm0]
58################################################################
59def get_inventory_list(module_name):
60
Gunnar Millsbb398ac2016-11-14 11:50:22 -060061 l = []
62 m = imp.load_source('module.name', module_name)
Chris Austenb29d2e82016-06-07 12:25:35 -050063
Gunnar Millsbb398ac2016-11-14 11:50:22 -060064
65 for i in m.ID_LOOKUP['FRU']:
66 s = m.ID_LOOKUP['FRU'][i]
67 s = s.replace('<inventory_root>',m.INVENTORY_ROOT)
68 l.append(s)
69
70 return l
Chris Austenb29d2e82016-06-07 12:25:35 -050071
72
73################################################################
Gunnar Millsbb398ac2016-11-14 11:50:22 -060074# This will return the URI's of the FRU type
Chris Austenb29d2e82016-06-07 12:25:35 -050075#
76# i.e. get_inventory_fru_type_list('../data/Barreleye.py', 'CPU')
77#
78# [/org/openbmc/inventory//system/chassis/motherboard/cpu0,
79# /org/openbmc/inventory//system/chassis/motherboard/cpu1]
80################################################################
81def get_inventory_fru_type_list(module_name, fru):
Gunnar Millsbb398ac2016-11-14 11:50:22 -060082 l = []
83 m = imp.load_source('module.name', module_name)
Chris Austenb29d2e82016-06-07 12:25:35 -050084
Gunnar Millsbb398ac2016-11-14 11:50:22 -060085 for i in m.FRU_INSTANCES.keys():
86 if m.FRU_INSTANCES[i]['fru_type'] == fru:
87 s = i.replace('<inventory_root>',m.INVENTORY_ROOT)
88 l.append(s)
89
90 return l
Chris Austenb29d2e82016-06-07 12:25:35 -050091
92
93################################################################
94# This will return the URI's of the FRU type that contain VPD
95#
96# i.e. get_vpd_inventory_list('../data/Palmetto.py', 'DIMM')
97#
98# [/org/openbmc/inventory/system/chassis/motherboard/dimm0,
99# /org/openbmc/inventory/system/chassis/motherboard/dimm1]
100################################################################
101def get_vpd_inventory_list(module_name, fru):
Gunnar Millsbb398ac2016-11-14 11:50:22 -0600102 l = []
103 m = imp.load_source('module.name', module_name)
Chris Austenb29d2e82016-06-07 12:25:35 -0500104
Gunnar Millsbb398ac2016-11-14 11:50:22 -0600105 for i in m.ID_LOOKUP['FRU_STR']:
106 x = m.ID_LOOKUP['FRU_STR'][i]
Chris Austenb29d2e82016-06-07 12:25:35 -0500107
Gunnar Millsbb398ac2016-11-14 11:50:22 -0600108 if m.FRU_INSTANCES[x]['fru_type'] == fru:
109 s = x.replace('<inventory_root>',m.INVENTORY_ROOT)
110 l.append(s)
111
112 return l
Chris Austenb29d2e82016-06-07 12:25:35 -0500113
114
115def call_keyword(keyword):
116 return BuiltIn().run_keyword(keyword)
117
118
119def main():
Gunnar Millsbb398ac2016-11-14 11:50:22 -0600120 print get_vpd_inventory_list('../data/Palmetto.py', 'DIMM')
Chris Austenb29d2e82016-06-07 12:25:35 -0500121
122
123if __name__ == "__main__":
Gunnar Millsbb398ac2016-11-14 11:50:22 -0600124 main()
Michael Walsh8b270ec2017-01-31 12:07:08 -0600125
126
127###############################################################################
128def get_mtr_report(host=""):
129
130 r"""
131 Get an mtr report and return it as a dictionary of dictionaries.
132
133 The key for the top level dictionary will be the host DNS name. The key
134 for the next level dictionary will be the field of a given row of the
135 report.
136
137 Example result:
138
139 report:
George Keishingfb4b1252017-06-15 00:05:45 -0500140 report[host_dummy-dnsname.com]:
141 report[host_dummy-dnsname.com][row_num]: 1
142 report[host_dummy-dnsname.com][host]: host_dummy-dnsname.com
143 report[host_dummy-dnsname.com][loss]: 0.0
144 report[host_dummy-dnsname.com][snt]: 10
145 report[host_dummy-dnsname.com][last]: 0.2
146 report[host_dummy-dnsname.com][avg]: 3.5
147 report[host_dummy-dnsname.com][best]: 0.2
148 report[host_dummy-dnsname.com][wrst]: 32.5
149 report[host_dummy-dnsname.com][stdev]: 10.2
150 report[bmc-dummy-dnsname.com]:
151 report[bmc-dummy-dnsname.com][row_num]: 2
152 report[bmc-dummy-dnsname.com][host]: bmc-dummy-dnsname.com
153 report[bmc-dummy-dnsname.com][loss]: 0.0
154 report[bmc-dummy-dnsname.com][snt]: 10
155 report[bmc-dummy-dnsname.com][last]: 0.5
156 report[bmc-dummy-dnsname.com][avg]: 0.5
157 report[bmc-dummy-dnsname.com][best]: 0.5
158 report[bmc-dummy-dnsname.com][wrst]: 0.5
159 report[bmc-dummy-dnsname.com][stdev]: 0.0
Michael Walsh8b270ec2017-01-31 12:07:08 -0600160
161 Description of arguments:
162 host The DNS name or IP address to be passed to the mtr command.
163 """
164
165 # Run the mtr command. Exlude the header line. Trim leading space from
166 # each line. Change all multiple spaces delims to single space delims.
167 cmd_buf = "mtr --report " + host +\
168 " | tail -n +2 | sed -r -e 's/^[ ]+//g' -e 's/[ ]+/ /g'"
169 sub_proc = subprocess.Popen(cmd_buf, shell=True, stdout=subprocess.PIPE,
170 stderr=subprocess.STDOUT)
171 out_buf, err_buf = sub_proc.communicate()
172 shell_rc = sub_proc.returncode
173
174 # Split the output by line.
175 rows = out_buf.rstrip('\n').split("\n")
176
177 # Initialize report dictionary.
178 report = DotDict()
179 for row in rows:
180 # Process each row of mtr output.
181 # Create a list of fields by splitting on space delimiter.
182 row_list = row.split(" ")
183 # Create dictionary for the row.
184 row = DotDict()
185 row['row_num'] = row_list[0].rstrip('.')
186 row['host'] = row_list[1]
187 row['loss'] = row_list[2].rstrip('%')
188 row['snt'] = row_list[3]
189 row['last'] = row_list[4]
190 row['avg'] = row_list[5]
191 row['best'] = row_list[6]
192 row['wrst'] = row_list[7]
193 row['stdev'] = row_list[8]
194 report[row['host']] = row
195
196 # Return the full report as dictionary of dictionaries.
197 return report
198
199###############################################################################
200
201
202###############################################################################
203def get_mtr_row(host=""):
204
205 r"""
206 Run an mtr report and get a specified row and return it as a dictionary.
207
208 Example result:
209
210 row:
211 row[row_num]: 2
George Keishingfb4b1252017-06-15 00:05:45 -0500212 row[host]: bmc-dummy-dnsname.com
Michael Walsh8b270ec2017-01-31 12:07:08 -0600213 row[loss]: 0.0
214 row[snt]: 10
215 row[last]: 0.5
216 row[avg]: 0.5
217 row[best]: 0.4
218 row[wrst]: 0.7
219 row[stdev]: 0.1
220
221 Description of arguments:
222 host The DNS name or IP address to be passed to the mtr command as
223 well as the indicating which row of the report to return.
224 """
225
226 report = get_mtr_report(host)
227
228 # The max length of host in output is 28 chars.
229 row = [value for key, value in report.items() if host[0:28] in key][0]
230
231 return row
232
233###############################################################################
George Keishingefa97352017-03-13 07:13:03 -0500234
235
236###############################################################################
237def list_to_set(fru_list=""):
238 r"""
239 Pack the list into a set tuple and return.
240
241 It may seem that this function is rather trivial. However, it simplifies
242 the code and improves robot program readability and achieve the result
243 required.
244
245 Example result:
246
247 set(['Version', 'PartNumber', 'SerialNumber', 'FieldReplaceable',
248 'BuildDate', 'Present', 'Manufacturer', 'PrettyName', 'Cached', 'Model'])
249
250 # Description of arguments.
251 fru_list List of FRU's elements.
252 """
253 return set(fru_list)
254
255###############################################################################
George Keishing81ae45b2017-09-28 14:05:04 -0500256
257
258def min_list_value(value_list):
259 r"""
260 Returns the element from the list with minimum value.
261 """
262 return min(value_list)