#!/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, '') 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('', 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('', 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('', 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. Exclude 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)