blob: bcd5282d4d73166611ca03c448c4848d3e2b4d43 [file] [log] [blame]
Rahul Maheshwari4d488572019-12-10 23:53:05 -06001#!/usr/bin/env python
2
3r"""
4PLDM functions.
5"""
6
7import re
8import var_funcs as vf
9import func_args as fa
10import bmc_ssh_utils as bsu
Sridevi Ramesh961050b2020-11-12 11:04:30 -060011import json
Sridevi Ramesh2ab3d382021-03-29 04:16:01 -050012import random
13import string
Rahul Maheshwari4d488572019-12-10 23:53:05 -060014
15
Sridevi Ramesh961050b2020-11-12 11:04:30 -060016def pldmtool(option_string, **bsu_options):
Sridevi Ramesh2ab3d382021-03-29 04:16:01 -050017
Rahul Maheshwari4d488572019-12-10 23:53:05 -060018 r"""
19 Run pldmtool on the BMC with the caller's option string and return the result.
20
21 Example:
22
23 ${pldm_results}= Pldmtool base GetPLDMTypes
24 Rprint Vars pldm_results
25
26 pldm_results:
Sridevi Ramesh961050b2020-11-12 11:04:30 -060027 pldmtool base GetPLDMVersion -t 0
28 {
29 "Response": "1.0.0"
30 }
31
Rahul Maheshwari4d488572019-12-10 23:53:05 -060032 Description of argument(s):
33 option_string A string of options which are to be processed by the pldmtool command.
34 parse_results Parse the pldmtool results and return a dictionary rather than the raw
35 pldmtool output.
36 bsu_options Options to be passed directly to bmc_execute_command. See its prolog for
37 details.
38 """
39
40 # This allows callers to specify arguments in python style (e.g. print_out=1 vs. print_out=${1}).
41 bsu_options = fa.args_to_objects(bsu_options)
42
43 stdout, stderr, rc = bsu.bmc_execute_command('pldmtool ' + option_string, **bsu_options)
Sridevi Ramesh2ab3d382021-03-29 04:16:01 -050044 if stderr:
45 return stderr
46 try:
47 return json.loads(stdout)
48 except ValueError:
49 return stdout
Sridevi Ramesh57537452021-01-18 03:25:05 -060050
51
Sridevi Ramesh2ab3d382021-03-29 04:16:01 -050052def GetBIOSEnumAttributeOptionalValues(attr_val_table_data):
53
Sridevi Ramesh57537452021-01-18 03:25:05 -060054 """
Sridevi Ramesh2ab3d382021-03-29 04:16:01 -050055 From pldmtool GetBIOSTable of type AttributeValueTable get the dict of
56 attribute handle and its optional values for BIOS Enumeration type.
Sridevi Ramesh57537452021-01-18 03:25:05 -060057
58 Description of argument(s):
59 attr_val_table_data pldmtool output from GetBIOSTable table type AttributeValueTable
Sridevi Ramesh2ab3d382021-03-29 04:16:01 -050060 e.g.
Sridevi Ramesh57537452021-01-18 03:25:05 -060061 [{
62 "AttributeHandle": 20,
63 "AttributeNameHandle": "23(pvm-pcie-error-inject)",
64 "AttributeType": "BIOSEnumeration",
65 "NumberOfPossibleValues": 2,
66 "PossibleValueStringHandle[0]": "3(Disabled)",
67 "PossibleValueStringHandle[1]": "4(Enabled)",
68 "NumberOfDefaultValues": 1,
69 "DefaultValueStringHandleIndex[0]": 1,
70 "StringHandle": "4(Enabled)"
Sridevi Ramesh57537452021-01-18 03:25:05 -060071 }]
Sridevi Ramesh57537452021-01-18 03:25:05 -060072 @return Dictionary of BIOS attribute and its value.
Sridevi Ramesh2ab3d382021-03-29 04:16:01 -050073 e.g. {'pvm_pcie_error_inject': ['Disabled', 'Enabled']}
Sridevi Ramesh57537452021-01-18 03:25:05 -060074 """
75
76 attr_val_data_dict = {}
77 for item in attr_val_table_data:
78 for attr in item:
79 if (attr == "NumberOfPossibleValues"):
80 value_list = []
81 for i in range(0, int(item[attr])):
82 attr_values = item["PossibleValueStringHandle[" + str(i) + "]"]
83 value = re.search(r'\((.*?)\)', attr_values).group(1)
84 if value:
85 # Example:
86 # value = '"Power Off"'
87 if ' ' in value:
88 value = '"' + value + '"'
89 value_list.append(value)
90 else:
91 value_list.append('')
92
93 attr_handle = re.findall(r'\(.*?\)', item["AttributeNameHandle"])
94 attr_val_data_dict[attr_handle[0][1:-1]] = value_list
95 return attr_val_data_dict
Sridevi Ramesh2ab3d382021-03-29 04:16:01 -050096
97
98def GetBIOSStrAndIntAttributeHandles(attr_type, attr_val_table_data):
99
100 """
101 From pldmtool GetBIOSTable of type AttributeValueTable get the dict of
102 attribute handle and its values based on the attribute type.
103
104 Description of argument(s):
105 attr_type "BIOSInteger" or "BIOSString".
106 attr_val_table_data pldmtool output from GetBIOSTable table type AttributeValueTable.
107
108 @return Dict of BIOS attribute and its value based on attribute type.
109
110 """
111 attr_val_int_dict = {}
112 attr_val_str_dict = {}
113 for item in attr_val_table_data:
114 value_dict = {}
115 attr_handle = re.findall(r'\(.*?\)', item["AttributeNameHandle"])
116 # Example:
117 # {'vmi_if0_ipv4_prefix_length': {'UpperBound': 32, 'LowerBound': 0}
118 if (item["AttributeType"] == "BIOSInteger"):
119 value_dict["LowerBound"] = item["LowerBound"]
120 value_dict["UpperBound"] = item["UpperBound"]
121 attr_val_int_dict[attr_handle[0][1:-1]] = value_dict
122 # Example:
123 # {'vmi_if1_ipv4_ipaddr': {'MaximumStringLength': 15, 'MinimumStringLength': 7}}
124 elif (item["AttributeType"] == "BIOSString"):
125 value_dict["MinimumStringLength"] = item["MinimumStringLength"]
126 value_dict["MaximumStringLength"] = item["MaximumStringLength"]
127 attr_val_str_dict[attr_handle[0][1:-1]] = value_dict
128
129 if (attr_type == "BIOSInteger"):
130 return attr_val_int_dict
131 elif (attr_type == "BIOSString"):
132 return attr_val_str_dict
133
134
135def GetRandomBIOSIntAndStrValues(attr_name, count):
136
137 """
138 Get random integer or string values for BIOS attribute values based on the count.
139
140 Description of argument(s):
141 attr_name Attribute name of BIOS attribute type Integer or string.
142 count Max length for BIOS attribute type Integer or string.
143
144 @return Random attribute value based on BIOS attribute type Integer
145 or string.
146
147 """
148 attr_random_value = ''
149
150 # Example
151 # 12.13.14.15
152 if 'gateway' in attr_name:
153 attr_random_value = ".".join(map(str, (random.randint(0, 255) for _ in range(4))))
154 # Example
155 # 11.11.11.11
156 elif 'ipaddr' in attr_name:
157 attr_random_value = ".".join(map(str, (random.randint(0, 255) for _ in range(4))))
158 # Example
159 # E5YWEDWJJ
160 elif 'name' in attr_name:
161 data = string.ascii_uppercase + string.digits
162 attr_random_value = ''.join(random.choice(data) for _ in range(int(count)))
163
Sridevi Ramesh74291d42021-04-28 07:52:35 -0500164 elif 'mfg_flags' in attr_name:
165 data = string.ascii_uppercase + string.digits
166 attr_random_value = ''.join(random.choice(data) for _ in range(int(count)))
167
Sridevi Ramesh2ab3d382021-03-29 04:16:01 -0500168 else:
169 attr_random_value = random.randint(0, int(count))
170 return attr_random_value
171
172
173def GetBIOSAttrOriginalValues(attr_val_table_data):
174
175 """
176 From pldmtool GetBIOSTable of type AttributeValueTable get the dict of
177 attribute handle and its values.
178
179 Description of argument(s):
180 attr_val_table_data pldmtool output from GetBIOSTable table type AttributeValueTable.
181
182 @return Dict of BIOS attribute and its value.
183
184 """
185 attr_val_data_dict = {}
186 for item in attr_val_table_data:
187 attr_handle = re.findall(r'\(.*?\)', item["AttributeNameHandle"])
188 attr_name = attr_handle[0][1:-1]
189
190 command = "bios GetBIOSAttributeCurrentValueByHandle -a " + attr_name
191 value = pldmtool(command)
192 attr_val_data_dict[attr_name] = value["CurrentValue"]
193 if not value["CurrentValue"]:
194 if 'name' in attr_name:
195 attr_val_data_dict[attr_name] = '""'
196
197 return attr_val_data_dict
198
199
200def GetBIOSAttrDefaultValues(attr_val_table_data):
201
202 """
203 From pldmtool GetBIOSTable of type AttributeValueTable get the dict of
204 attribute handle and its default attribute values.
205
206 Description of argument(s):
207 attr_val_table_data pldmtool output from GetBIOSTable table type AttributeValueTable.
208
209 @return Dict of BIOS attribute and its default attribute value.
210
211 """
212 attr_val_data_dict = {}
213 for item in attr_val_table_data:
214 attr_handle = re.findall(r'\(.*?\)', item["AttributeNameHandle"])
215 attr_name = attr_handle[0][1:-1]
216
217 if "DefaultString" in item:
218 attr_val_data_dict[attr_name] = item["DefaultString"]
219 if not item["DefaultString"]:
220 if 'name' in attr_name:
221 attr_val_data_dict[attr_name] = '""'
222 elif "DefaultValue" in item:
223 attr_val_data_dict[attr_name] = item["DefaultValue"]
224 elif "StringHandle" in item:
225 attr_default_value = re.findall(r'\(.*?\)', item["StringHandle"])
226 attr_val_data_dict[attr_name] = attr_default_value[0][1:-1]
227
228 return attr_val_data_dict