1#!/usr/bin/python -u
2import sys
3from robot.libraries.BuiltIn import BuiltIn
4import imp
5import string
6import random
7import subprocess
8from robot.utils import DotDict
9
10
11def 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))))
26
27def get_sensor(module_name, value):
28    m = imp.load_source('module.name', module_name)
29
30    for i in m.ID_LOOKUP['SENSOR']:
31
32        if m.ID_LOOKUP['SENSOR'][i] == value:
33            return i
34
35    return 0xFF
36
37
38def get_inventory_sensor (module_name, value):
39    m = imp.load_source('module.name', module_name)
40
41    value = string.replace(value, m.INVENTORY_ROOT, '<inventory_root>')
42
43    for i in m.ID_LOOKUP['SENSOR']:
44
45        if m.ID_LOOKUP['SENSOR'][i] == value:
46            return i
47
48    return 0xFF
49
50
51################################################################
52#  This will return the URI's of the FRU type
53#
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
61    l = []
62    m = imp.load_source('module.name', module_name)
63
64
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
71
72
73################################################################
74#  This will return the URI's of the FRU type
75#
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):
82    l = []
83    m = imp.load_source('module.name', module_name)
84
85    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
91
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):
102    l = []
103    m = imp.load_source('module.name', module_name)
104
105    for i in m.ID_LOOKUP['FRU_STR']:
106        x = m.ID_LOOKUP['FRU_STR'][i]
107
108        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
113
114
115def call_keyword(keyword):
116    return BuiltIn().run_keyword(keyword)
117
118
119def main():
120    print get_vpd_inventory_list('../data/Palmetto.py', 'DIMM')
121
122
123if __name__ == "__main__":
124   main()
125
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:
140      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
160
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
212      row[host]:                 bmc-dummy-dnsname.com
213      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###############################################################################
234
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###############################################################################
256