xref: /openbmc/openbmc-test-automation/openpower/vpd/test_vpd_tool.robot (revision 62a3b7dbdbcd7f1fa8a6d0091867cfb265f0f52e)
1*** Settings ***
2Documentation   This suite tests System Vital Product Data (VPD) using vpdtool.
3
4Library         ../../lib/vpd_utils.py
5Variables       ../../data/vpd_variables.py
6Resource        ../../lib/openbmc_ffdc.robot
7
8Test Teardown   FFDC On Test Case Fail
9
10
11*** Variables ***
12
13${CMD_GET_PROPERTY_INVENTORY}  busctl get-property xyz.openbmc_project.Inventory.Manager
14${DR_WRITE_VALUE}              XYZ Component
15${PN_WRITE_VALUE}              XYZ1234
16${SN_WRITE_VALUE}              ABCD12345678
17@{fields}                      PN  SN  LocationCode
18@{vpd_fields}                  PN  SN
19
20*** Test Cases ***
21
22Verify System VPD Data Via Vpdtool
23    [Documentation]  Verify the system VPD details via vpdtool output.
24    [Tags]  Verify_System_VPD_Data_Via_Vpdtool
25    [Template]  Verify VPD Data Via Vpdtool
26
27    # Component     Field
28    System          Model
29    System          SerialNumber
30    System          LocationCode
31
32
33Verify VPD Component Read
34    [Documentation]  Verify details of all VPD component via vpdtool.
35    [Tags]  Verify_VPD_Component_Read
36
37    ${vpd_records}=  Vpdtool  -i
38    ${components}=  Get Dictionary Keys  ${vpd_records}
39    FOR  ${component}  IN  @{components}
40        Verify VPD Component Read Operation  ${component}
41    END
42
43
44Verify VPD Field Read
45    [Documentation]  Verify reading VPD field value via vpdtool.
46    [Tags]  Verify_VPD_Field_Read
47
48    ${vpd_records}=  Vpdtool  -i
49    ${components}=  Get Dictionary Keys  ${vpd_records}
50    FOR  ${component}  IN  @{components}
51       #  drive component field values response in ascii format due to that skipping here.
52       IF  'drive' in '${component}'
53           Continue FOR Loop
54       ELSE
55           Verify VPD Field Read Operation  ${component}
56       END
57    END
58
59
60Verify VPD Field Write
61    [Documentation]  Verify writing VPD field value via vpdtool.
62    [Tags]  Verify_VPD_Field_Write
63
64    ${components}=  Get Dictionary Keys  ${VPD_DETAILS}
65    FOR  ${component}  IN  @{components}
66        # VPD fields "DR", "CC" and "FN" will be added later.
67        @{vpd_fields}=  Create List  SN  PN
68        ${field}=  Evaluate  random.choice($vpd_fields)  random
69        Verify VPD Field Write Operation  ${component}  ${field}
70    END
71
72
73*** Keywords ***
74
75Verify VPD Component Read Operation
76    [Documentation]  Verify reading VPD details of given component via vpdtool.
77    [Arguments]  ${component}
78    # Description of arguments:
79    # component       VDP component (e.g. /system/chassis/motherboard/vdd_vrm1).
80
81    ${vpd_records}=  Vpdtool  -o -O ${component}
82
83    # Example output from 'Vpdtool  -o -O /system/chassis/motherboard/vdd_vrm1':
84    #  [/system/chassis/motherboard/vdd_vrm1]:
85    #    [DR]:                                         CPU POWER CARD
86    #    [type]:                                       xyz.openbmc_project.Inventory.Item.Vrm
87    #    [CC]:                                         E123
88    #    [FN]:                                         F123456
89    #    [LocationCode]:                               ABCD.XY1.1234567-P0
90    #    [SN]:                                         YL2E32010000
91    #    [PN]:                                         PN12345
92
93    ${vpdtool_res}=  Set To Dictionary  ${vpd_records}[${component}]
94    FOR  ${vpd_field}  IN  @{fields}
95        ${match_key_exists}=  Run Keyword And Return Status
96        ...  Dictionary Should Contain Key  ${vpdtool_res}  ${vpd_field}
97          IF  '${match_key_exists}' == 'True'
98              #  drive components busctl field response in ascii due to that checking only locationcode.
99              IF  'drive' in '${component}'
100                  ${vpd_field}=  Set Variable  LocationCode
101              END
102              # Skip check if VPD field is empty.
103              Run Keyword If  '${vpd_records['${component}']['${vpd_field}']}' == ''
104              ...  Continue For Loop
105
106              # Get VPD field values via busctl.
107              ${busctl_field}=  Set Variable If
108              ...  '${vpd_field}' == 'LocationCode'  com.ibm.ipzvpd.Location LocationCode
109              ...  '${vpd_field}' == 'PN'  xyz.openbmc_project.Inventory.Decorator.Asset PartNumber
110              ...  '${vpd_field}' == 'SN'  xyz.openbmc_project.Inventory.Decorator.Asset SerialNumber
111              ${cmd}=  Catenate  ${CMD_GET_PROPERTY_INVENTORY}
112              ...  /xyz/openbmc_project/inventory${component} ${busctl_field}
113              ${cmd_output}=  BMC Execute Command  ${cmd}
114              # Check whether the vpdtool response and busctl response matching.
115              Valid Value  vpd_records['${component}']['${vpd_field}']
116              ...  ['${cmd_output[0].split('"')[1].strip('"')}']
117          ELSE
118             Continue For Loop
119          END
120    END
121
122
123Verify VPD Field Read Operation
124    [Documentation]  Verify reading all VPD fields for given component via vpdtool.
125    [Arguments]  ${component}
126    # Description of arguments:
127    # component       VDP component (e.g. /system/chassis/motherboard/vdd_vrm1).
128
129    ${vpd_records}=  Vpdtool  -o -O ${component}
130    ${vpdtool_res}=  Set To Dictionary  ${vpd_records}[${component}]
131    FOR  ${field}  IN  @{vpd_fields}
132         ${match_key_exists}=  Run Keyword And Return Status
133         ...  Dictionary Should Contain Key  ${vpdtool_res}  ${field}
134         IF  '${match_key_exists}' == 'True'
135             ${vpd_records}=  Vpdtool  -r -O ${component} -R VINI -K ${field}
136             # Skip check if field value is empty.
137             Run Keyword If  '${vpd_records['${component}']['${field}']}' == ''
138             ...  Continue For Loop
139
140             ${busctl_field}=  Set Variable If
141             ...  '${field}' == 'PN'  xyz.openbmc_project.Inventory.Decorator.Asset PartNumber
142             ...  '${field}' == 'SN'  xyz.openbmc_project.Inventory.Decorator.Asset SerialNumber
143             ${cmd}=  Catenate  ${CMD_GET_PROPERTY_INVENTORY}
144             ...  /xyz/openbmc_project/inventory${component} ${busctl_field}
145             ${cmd_output}=  BMC Execute Command  ${cmd}
146
147             # Check vpdtool response and busctl response for the component field.
148             Valid Value  vpd_records['${component}']['${field}']
149             ...  ['${cmd_output[0].split('"')[1].strip('"')}']
150         ELSE
151            Continue For Loop
152         END
153    END
154
155
156Verify VPD Field Write Operation
157    [Documentation]  Verify writing VPD fields for given component via vpdtool.
158    [Arguments]  ${component}  ${field}
159    [Teardown]  Restore VPD Value  ${component}  ${field}  ${old_field_value}
160    # Description of arguments:
161    # component       VPD component (e.g. /system/chassis/motherboard/vdd_vrm1).
162    # field           VPD component field (e.g. PN, SN)
163
164    ${vpd_records}=  Vpdtool  -r -O ${component} -R VINI -K ${field}
165    ${old_field_value}=  Set Variable  ${vpd_records['${component}']['${field}']}
166
167    ${write_value}=  Set Variable If
168    ...  '${field}' == 'DR'  ${DR_WRITE_VALUE}
169    ...  '${field}' == 'PN'  ${PN_WRITE_VALUE}
170    ...  '${field}' == 'SN'  ${SN_WRITE_VALUE}
171
172    Vpdtool  -w -O ${component} -R VINI -K ${field} --value ${write_value}
173
174    Verify VPD Field Value  ${component}  ${field}
175
176
177Restore VPD Value
178    [Documentation]  Restore VPD's field value of given component.
179    [Arguments]  ${component}  ${field}  ${value}
180    # Description of arguments:
181    # component       VPD component (e.g. /system/chassis/motherboard/vdd_vrm1).
182    # field           VPD component field (e.g. PN, SN)
183    # value           VPD value to be restore.
184
185    Vpdtool  -w -O ${component} -R VINI -K ${field} --value ${value}
186
187
188Verify VPD Field Value
189    [Documentation]  Verify VPD field value via vpdtool.
190    [Arguments]  ${component}  ${field}
191    # Description of arguments:
192    # component       VDP component (e.g. /system/chassis/motherboard/vdd_vrm1).
193    # field           VPD field (e.g. DR, SN, PN)
194
195    ${vpd_records}=  Vpdtool  -r -O ${component} -R VINI -K ${field}
196
197    ${busctl_field}=  Set Variable If
198    ...  '${field}' == 'DR'  xyz.openbmc_project.Inventory.Item PrettyName
199    ...  '${field}' == 'PN'  xyz.openbmc_project.Inventory.Decorator.Asset PartNumber
200    ...  '${field}' == 'SN'  xyz.openbmc_project.Inventory.Decorator.Asset SerialNumber
201
202    ${cmd}=  Catenate  ${CMD_GET_PROPERTY_INVENTORY} /xyz/openbmc_project/inventory${component}
203    ...  ${busctl_field}
204    ${cmd_output}=  BMC Execute Command  ${cmd}
205
206    Valid Value  vpd_records['${component}']['${field}']  ['${cmd_output[0].split('"')[1].strip('"')}']
207
208
209Verify VPD Data Via Vpdtool
210    [Documentation]  Get VPD details of given component via vpdtool and verify it
211    ...              using busctl command.
212    [Arguments]  ${component}  ${field}
213    # Description of arguments:
214    # component       VPD component (e.g. System,Chassis etc).
215    # field           VPD field (e.g. Serialnumber,LocationCode etc).
216
217    ${component_url}=  Run Keyword If
218    ...  '${component}' == 'System'  Set Variable  /system
219
220    # Get VPD details of given component via vpd-tool.
221    ${vpd_records}=  Vpdtool  -o -O ${component_url}
222
223    # Get VPD details of given component via busctl command.
224    ${busctl_field}=  Set Variable If
225    ...  '${field}' == 'LocationCode'  com.ibm.ipzvpd.Location LocationCode
226    ...  '${field}' == 'Model'  xyz.openbmc_project.Inventory.Decorator.Asset Model
227    ...  '${field}' == 'SerialNumber'  xyz.openbmc_project.Inventory.Decorator.Asset SerialNumber
228
229    ${cmd}=  Catenate  ${CMD_GET_PROPERTY_INVENTORY} /xyz/openbmc_project/inventory/system
230    ...  ${busctl_field}
231    ${cmd_output}=  BMC Execute Command  ${cmd}
232    # Example of cmd_output:
233    #   [0]:                                            s "ABCD.XY1.1234567-P0"
234    #   [1]:
235    #   [2]:                                            0
236
237    # Cross check vpdtool output with busctl response.
238    Should Be Equal As Strings  ${vpd_records["/system"]["${field}"]}
239    ...  ${cmd_output[0].split('"')[1].strip('"')}
240