1*** Settings ***
2Documentation     Update the PNOR code on a target BMC.
3...               Execution Method:
4...               python -m robot -v OPENBMC_HOST:<hostname>
5...               -v DELETE_OLD_PNOR_IMAGES:<"true" or "false">
6...               -v IMAGE_FILE_PATH:<path/*.tar>
7...               -v ALTERNATE_IMAGE_FILE_PATH:<path/*.tar>
8...               host_code_update.robot
9...
10...               Code update method BMC
11...               Update work flow sequence:
12...                 - Upload image via REST
13...                 - Verify that the file exists on the BMC
14...                 - Check that software "Activation" is set to "Ready"
15...                 - Set "Requested Activation" to "Active"
16...                 - Wait for code update to complete
17...                 - Verify the new version
18
19Library           ../../lib/bmc_ssh_utils.py
20Library           ../../lib/code_update_utils.py
21Variables         ../../data/variables.py
22Resource          ../../lib/boot_utils.robot
23Resource          code_update_utils.robot
24Resource          ../../lib/code_update_utils.robot
25Resource          ../../lib/openbmc_ffdc.robot
26Resource          ../../lib/state_manager.robot
27Resource          ../../lib/dump_utils.robot
28
29Test Teardown     Code Update Test Teardown
30
31*** Variables ***
32
33${QUIET}                          ${1}
34${IMAGE_FILE_PATH}                ${EMPTY}
35${DELETE_OLD_PNOR_IMAGES}         false
36${DELETE_OLD_GUARD_FILE}          false
37${ALTERNATE_IMAGE_FILE_PATH}      ${EMPTY}
38
39*** Test Cases ***
40
41REST Host Code Update
42    [Documentation]  Do a PNOR code update by uploading image on BMC via REST.
43    # 1. Delete error logs if there is any.
44    # 1. Do code update.
45    # 2. Do post update the following:
46    #    - Collect FFDC if error log exist and delete error logs.
47    [Tags]  REST_Host_Code_Update
48    [Setup]  Code Update Setup
49
50    Upload And Activate Image  ${IMAGE_FILE_PATH}
51    OBMC Reboot (off)
52
53
54Post Update Boot To OS
55    [Documentation]  Boot the host OS
56    [Tags]  Post_Update_Boot_To_OS
57    [Teardown]  Run Keywords  Stop SOL Console Logging
58    ...         AND  Code Update Test Teardown
59
60    Run Keyword If  '${PREV_TEST_STATUS}' == 'FAIL'
61    ...  Fail  Code update failed. No need to boot to OS.
62    Start SOL Console Logging
63    Delete Error Logs
64    REST Power On
65
66
67Host Image Priority Attribute Test
68    [Documentation]  Set "Priority" attribute.
69    [Tags]  Host_Image_Priority_Attribute_Test
70    [Template]  Temporarily Set PNOR Attribute
71
72    # Property        Value
73    Priority          ${0}
74    Priority          ${1}
75    Priority          ${127}
76
77
78Host Set Priority To Invalid Values
79    [Documentation]  Attempt to set the priority of an image to an invalid
80    ...              value and expect an error.
81    [Tags]  Host_Set_Priority_To_Invalid_Values
82    [Template]  Set Priority To Invalid Value And Expect Error
83
84    # Version Type              Priority
85    ${VERSION_PURPOSE_HOST}    ${-1}
86    ${VERSION_PURPOSE_HOST}    ${256}
87
88
89Set RequestedActivation To None
90    [Documentation]  Set the RequestedActivation of the image to None and
91    ...              verify that it is in fact set to None.
92    [Tags]  Set_RequestedActivation_To_None
93
94    ${software_objects}=  Get Software Objects
95    Set Host Software Property  @{software_objects}[0]  RequestedActivation
96    ...  ${REQUESTED_NONE}
97    ${software_properties}=  Get Host Software Property  @{software_objects}[0]
98    Should Be Equal As Strings  &{software_properties}[RequestedActivation]
99    ...  ${REQUESTED_NONE}
100
101
102Set RequestedActivation And Activation To Invalid Value
103    [Documentation]  Set the RequestedActivation and Activation propreties of
104    ...              the image to an invalid value and verify that it was not
105    ...              changed.
106    [Template]  Set Property To Invalid Value And Verify No Change
107    [Tags]  Set_RequestedActivation_And_Activation_To_Invalid_Value
108
109    # Property              Version Type
110    RequestedActivation     ${VERSION_PURPOSE_HOST}
111    Activation              ${VERSION_PURPOSE_HOST}
112
113
114Upload And Activate Multiple Host Images
115    [Documentation]  Upload another PNOR image and verify that its state is
116    ...              different from all others.
117    [Tags]  Upload_And_Activate_Multiple_Host_Images
118    [Template]  Activate Image And Verify No Duplicate Priorities
119    [Setup]  Upload And Activate Multiple BMC Images Setup
120
121    # Image File Path              Image Purpose
122    ${ALTERNATE_IMAGE_FILE_PATH}   ${VERSION_PURPOSE_HOST}
123
124
125Set Same Priority For Multiple Host Images
126    [Documentation]  Attempt to set the priority to be the same for two PNOR
127    ...              images and verify that the priorities are not the same.
128    [Tags]  Set_Same_Priority_For_Multiple_Host_Images
129
130    Run Keyword If  '${PREV_TEST_STATUS}' == 'FAIL'
131    ...  Fail  Activation of alternate image failed. Cannot set priority.
132    Set Same Priority For Multiple Images  ${VERSION_PURPOSE_HOST}
133
134
135Delete Host Image
136    [Documentation]  Delete a PNOR image from the BMC and PNOR flash chip.
137    [Tags]  Delete_Host_Image
138    [Setup]  Initiate Host PowerOff
139
140    ${software_objects}=  Get Software Objects
141    ...  version_type=${VERSION_PURPOSE_HOST}
142    ${num_images}=  Get Length  ${software_objects}
143    Should Be True  0 < ${num_images}
144    ...  msg=There are no PNOR images on the BMC to delete.
145    Delete Image And Verify  @{software_objects}[0]  ${VERSION_PURPOSE_HOST}
146
147
148*** Keywords ***
149
150Temporarily Set PNOR Attribute
151    [Documentation]  Update the PNOR attribute value.
152    [Arguments]  ${attribute_name}  ${attribute_value}
153
154    # Description of argument(s):
155    # attribute_name    Host software attribute name (e.g. "Priority").
156    # attribute_value   Value to be written.
157
158    ${image_ids}=  Get Software Objects
159    ${init_host_properties}=  Get Host Software Property  ${image_ids[0]}
160    ${initial_priority}=  Set Variable  ${init_host_properties["Priority"]}
161
162    Set Host Software Property  ${image_ids[0]}  ${attribute_name}
163    ...  ${attribute_value}
164
165    ${cur_host_properties}=  Get Host Software Property  ${image_ids[0]}
166    Should Be Equal As Integers  ${cur_host_properties["Priority"]}
167    ...  ${attribute_value}
168
169    # Revert to to initial value.
170    Set Host Software Property
171    ...  ${image_ids[0]}  ${attribute_name}  ${initial_priority}
172
173
174Code Update Setup
175    [Documentation]  Do code update test case setup.
176    # - Clean up all existing BMC dumps.
177    # - Clean up all currently install PNOR images.
178
179    Initiate Host PowerOff
180    Delete All Dumps
181    Delete Error Logs
182    Run Keyword If  'true' == '${DELETE_OLD_PNOR_IMAGES}'
183    ...  Delete All PNOR Images
184    Run Keyword If  'true' == '${DELETE_OLD_GUARD_FILE}'  BMC Execute Command
185    ...  rm -f /var/lib/phosphor-software-manager/pnor/prsv/GUARD
186
187
188Upload And Activate Multiple BMC Images Setup
189    [Documentation]  Check that the ALTERNATE_FILE_PATH variable is set.
190
191    Should Not Be Empty  ${ALTERNATE_IMAGE_FILE_PATH}
192
193
194Get PNOR Extended Version
195    [Documentation]  Return the PNOR extended version.
196    [Arguments]  ${manifest_path}
197
198    # Description of argument(s):
199    # manifest_path  Path of the MANIFEST file
200    #                (e.g. "/tmp/images/abc123/MANIFEST").
201
202    ${version}= BMC Execute Command
203    ...  grep extended_version= ${manifest_path}
204    [return] ${version.split(",")}
205
206
207Code Update Test Teardown
208    [Documentation]  Do code update test case teardown.
209    # 1. Collect FFDC if test case failed.
210    # 2. Collect FFDC if test PASS but error log exists.
211
212    FFDC On Test Case Fail
213    Run Keyword If  '${TEST_STATUS}' == 'PASS'  Check Error And Collect FFDC
214