blob: ae3ad2495e5449e1598200454556207c012db197 [file] [log] [blame]
#!/usr/bin/python -u
import sys
from robot.libraries.BuiltIn import BuiltIn
import imp
import string
import random
import subprocess
from robot.utils import DotDict
def random_mac():
r"""
Return random mac address in the following format.
Example: 00:01:6C:80:02:78
"""
return ":".join(map(lambda x: "%02x" % x, (random.randint(0x00, 0xff)
for _ in range(6))))
def random_ip():
r"""
Return random ip address in the following format.
Example: 9.3.128.100
"""
return ".".join(map(str, (random.randint(0, 255)
for _ in range(4))))
def get_sensor(module_name, value):
m = imp.load_source('module.name', module_name)
for i in m.ID_LOOKUP['SENSOR']:
if m.ID_LOOKUP['SENSOR'][i] == value:
return i
return 0xFF
def get_inventory_sensor(module_name, value):
m = imp.load_source('module.name', module_name)
value = string.replace(value, m.INVENTORY_ROOT, '<inventory_root>')
for i in m.ID_LOOKUP['SENSOR']:
if m.ID_LOOKUP['SENSOR'][i] == value:
return i
return 0xFF
################################################################
# This will return the URI's of the FRU type
#
# i.e. get_inventory_list('../data/Palmetto.py')
#
# [/org/openbmc/inventory//system/chassis/motherboard/cpu0/core0,
# /org/openbmc/inventory/system/chassis/motherboard/dimm0]
################################################################
def get_inventory_list(module_name):
inventory_list = []
m = imp.load_source('module.name', module_name)
for i in m.ID_LOOKUP['FRU']:
s = m.ID_LOOKUP['FRU'][i]
s = s.replace('<inventory_root>', m.INVENTORY_ROOT)
inventory_list.append(s)
return inventory_list
################################################################
# This will return the URI's of the FRU type
#
# i.e. get_inventory_fru_type_list('../data/Witherspoon.py', 'CPU')
#
# [/org/openbmc/inventory//system/chassis/motherboard/cpu0,
# /org/openbmc/inventory//system/chassis/motherboard/cpu1]
################################################################
def get_inventory_fru_type_list(module_name, fru):
inventory_list = []
m = imp.load_source('module.name', module_name)
for i in m.FRU_INSTANCES.keys():
if m.FRU_INSTANCES[i]['fru_type'] == fru:
s = i.replace('<inventory_root>', m.INVENTORY_ROOT)
inventory_list.append(s)
return inventory_list
################################################################
# This will return the URI's of the FRU type that contain VPD
#
# i.e. get_vpd_inventory_list('../data/Palmetto.py', 'DIMM')
#
# [/org/openbmc/inventory/system/chassis/motherboard/dimm0,
# /org/openbmc/inventory/system/chassis/motherboard/dimm1]
################################################################
def get_vpd_inventory_list(module_name, fru):
inventory_list = []
m = imp.load_source('module.name', module_name)
for i in m.ID_LOOKUP['FRU_STR']:
x = m.ID_LOOKUP['FRU_STR'][i]
if m.FRU_INSTANCES[x]['fru_type'] == fru:
s = x.replace('<inventory_root>', m.INVENTORY_ROOT)
inventory_list.append(s)
return inventory_list
def call_keyword(keyword):
return BuiltIn().run_keyword(keyword)
def main():
print(get_vpd_inventory_list('../data/Palmetto.py', 'DIMM'))
if __name__ == "__main__":
main()
def get_mtr_report(host=""):
r"""
Get an mtr report and return it as a dictionary of dictionaries.
The key for the top level dictionary will be the host DNS name. The key
for the next level dictionary will be the field of a given row of the
report.
Example result:
report:
report[host_dummy-dnsname.com]:
report[host_dummy-dnsname.com][row_num]: 1
report[host_dummy-dnsname.com][host]: host_dummy-dnsname.com
report[host_dummy-dnsname.com][loss]: 0.0
report[host_dummy-dnsname.com][snt]: 10
report[host_dummy-dnsname.com][last]: 0.2
report[host_dummy-dnsname.com][avg]: 3.5
report[host_dummy-dnsname.com][best]: 0.2
report[host_dummy-dnsname.com][wrst]: 32.5
report[host_dummy-dnsname.com][stdev]: 10.2
report[bmc-dummy-dnsname.com]:
report[bmc-dummy-dnsname.com][row_num]: 2
report[bmc-dummy-dnsname.com][host]: bmc-dummy-dnsname.com
report[bmc-dummy-dnsname.com][loss]: 0.0
report[bmc-dummy-dnsname.com][snt]: 10
report[bmc-dummy-dnsname.com][last]: 0.5
report[bmc-dummy-dnsname.com][avg]: 0.5
report[bmc-dummy-dnsname.com][best]: 0.5
report[bmc-dummy-dnsname.com][wrst]: 0.5
report[bmc-dummy-dnsname.com][stdev]: 0.0
Description of arguments:
host The DNS name or IP address to be passed to the mtr command.
"""
# Run the mtr command. Exlude the header line. Trim leading space from
# each line. Change all multiple spaces delims to single space delims.
cmd_buf = "mtr --report " + host +\
" | tail -n +2 | sed -r -e 's/^[ ]+//g' -e 's/[ ]+/ /g'"
sub_proc = subprocess.Popen(cmd_buf, shell=True, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
out_buf, err_buf = sub_proc.communicate()
shell_rc = sub_proc.returncode
# Split the output by line.
rows = out_buf.rstrip('\n').split("\n")
# Initialize report dictionary.
report = DotDict()
for row in rows:
# Process each row of mtr output.
# Create a list of fields by splitting on space delimiter.
row_list = row.split(" ")
# Create dictionary for the row.
row = DotDict()
row['row_num'] = row_list[0].rstrip('.')
row['host'] = row_list[1]
row['loss'] = row_list[2].rstrip('%')
row['snt'] = row_list[3]
row['last'] = row_list[4]
row['avg'] = row_list[5]
row['best'] = row_list[6]
row['wrst'] = row_list[7]
row['stdev'] = row_list[8]
report[row['host']] = row
# Return the full report as dictionary of dictionaries.
return report
def get_mtr_row(host=""):
r"""
Run an mtr report and get a specified row and return it as a dictionary.
Example result:
row:
row[row_num]: 2
row[host]: bmc-dummy-dnsname.com
row[loss]: 0.0
row[snt]: 10
row[last]: 0.5
row[avg]: 0.5
row[best]: 0.4
row[wrst]: 0.7
row[stdev]: 0.1
Description of arguments:
host The DNS name or IP address to be passed to the mtr command as
well as the indicating which row of the report to return.
"""
report = get_mtr_report(host)
# The max length of host in output is 28 chars.
row = [value for key, value in report.items() if host[0:28] in key][0]
return row
def list_to_set(fru_list=""):
r"""
Pack the list into a set tuple and return.
It may seem that this function is rather trivial. However, it simplifies
the code and improves robot program readability and achieve the result
required.
Example result:
set(['Version', 'PartNumber', 'SerialNumber', 'FieldReplaceable',
'BuildDate', 'Present', 'Manufacturer', 'PrettyName', 'Cached', 'Model'])
# Description of arguments.
fru_list List of FRU's elements.
"""
return set(fru_list)
def min_list_value(value_list):
r"""
Returns the element from the list with minimum value.
"""
return min(value_list)