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 127def get_mtr_report(host=""): 128 129 r""" 130 Get an mtr report and return it as a dictionary of dictionaries. 131 132 The key for the top level dictionary will be the host DNS name. The key 133 for the next level dictionary will be the field of a given row of the 134 report. 135 136 Example result: 137 138 report: 139 report[host_dummy-dnsname.com]: 140 report[host_dummy-dnsname.com][row_num]: 1 141 report[host_dummy-dnsname.com][host]: host_dummy-dnsname.com 142 report[host_dummy-dnsname.com][loss]: 0.0 143 report[host_dummy-dnsname.com][snt]: 10 144 report[host_dummy-dnsname.com][last]: 0.2 145 report[host_dummy-dnsname.com][avg]: 3.5 146 report[host_dummy-dnsname.com][best]: 0.2 147 report[host_dummy-dnsname.com][wrst]: 32.5 148 report[host_dummy-dnsname.com][stdev]: 10.2 149 report[bmc-dummy-dnsname.com]: 150 report[bmc-dummy-dnsname.com][row_num]: 2 151 report[bmc-dummy-dnsname.com][host]: bmc-dummy-dnsname.com 152 report[bmc-dummy-dnsname.com][loss]: 0.0 153 report[bmc-dummy-dnsname.com][snt]: 10 154 report[bmc-dummy-dnsname.com][last]: 0.5 155 report[bmc-dummy-dnsname.com][avg]: 0.5 156 report[bmc-dummy-dnsname.com][best]: 0.5 157 report[bmc-dummy-dnsname.com][wrst]: 0.5 158 report[bmc-dummy-dnsname.com][stdev]: 0.0 159 160 Description of arguments: 161 host The DNS name or IP address to be passed to the mtr command. 162 """ 163 164 # Run the mtr command. Exlude the header line. Trim leading space from 165 # each line. Change all multiple spaces delims to single space delims. 166 cmd_buf = "mtr --report " + host +\ 167 " | tail -n +2 | sed -r -e 's/^[ ]+//g' -e 's/[ ]+/ /g'" 168 sub_proc = subprocess.Popen(cmd_buf, shell=True, stdout=subprocess.PIPE, 169 stderr=subprocess.STDOUT) 170 out_buf, err_buf = sub_proc.communicate() 171 shell_rc = sub_proc.returncode 172 173 # Split the output by line. 174 rows = out_buf.rstrip('\n').split("\n") 175 176 # Initialize report dictionary. 177 report = DotDict() 178 for row in rows: 179 # Process each row of mtr output. 180 # Create a list of fields by splitting on space delimiter. 181 row_list = row.split(" ") 182 # Create dictionary for the row. 183 row = DotDict() 184 row['row_num'] = row_list[0].rstrip('.') 185 row['host'] = row_list[1] 186 row['loss'] = row_list[2].rstrip('%') 187 row['snt'] = row_list[3] 188 row['last'] = row_list[4] 189 row['avg'] = row_list[5] 190 row['best'] = row_list[6] 191 row['wrst'] = row_list[7] 192 row['stdev'] = row_list[8] 193 report[row['host']] = row 194 195 # Return the full report as dictionary of dictionaries. 196 return report 197 198 199def get_mtr_row(host=""): 200 201 r""" 202 Run an mtr report and get a specified row and return it as a dictionary. 203 204 Example result: 205 206 row: 207 row[row_num]: 2 208 row[host]: bmc-dummy-dnsname.com 209 row[loss]: 0.0 210 row[snt]: 10 211 row[last]: 0.5 212 row[avg]: 0.5 213 row[best]: 0.4 214 row[wrst]: 0.7 215 row[stdev]: 0.1 216 217 Description of arguments: 218 host The DNS name or IP address to be passed to the mtr command as 219 well as the indicating which row of the report to return. 220 """ 221 222 report = get_mtr_report(host) 223 224 # The max length of host in output is 28 chars. 225 row = [value for key, value in report.items() if host[0:28] in key][0] 226 227 return row 228 229 230def list_to_set(fru_list=""): 231 r""" 232 Pack the list into a set tuple and return. 233 234 It may seem that this function is rather trivial. However, it simplifies 235 the code and improves robot program readability and achieve the result 236 required. 237 238 Example result: 239 240 set(['Version', 'PartNumber', 'SerialNumber', 'FieldReplaceable', 241 'BuildDate', 'Present', 'Manufacturer', 'PrettyName', 'Cached', 'Model']) 242 243 # Description of arguments. 244 fru_list List of FRU's elements. 245 """ 246 return set(fru_list) 247 248 249def min_list_value(value_list): 250 r""" 251 Returns the element from the list with minimum value. 252 """ 253 return min(value_list) 254