| *** Settings *** | 
 | Documentation     Trigger code update to a target BMC. | 
 | ...               Execution Method : | 
 | ...               python -m robot -v OPENBMC_HOST:<hostname> | 
 | ...               -v FILE_PATH:<path/*all.tar>  update_bmc.robot | 
 | ... | 
 | ...               Code update method BMC using REST | 
 | ...               Update work flow sequence: | 
 | ...                 - User input BMC File existence check | 
 | ...                 - Ping Test and REST authentication | 
 | ...                 - Set Host Power host setting Policy to ALWAYS_POWER_OFF | 
 | ...                   On reboot this policy would ensure the BMC comes | 
 | ...                   online and stays at HOST_POWERED_OFF state. | 
 | ...                 - Issue poweroff | 
 | ...                 - Prune archived journal logs | 
 | ...                 - Prepare for Update | 
 | ...                 - Wait for BMC to come online clean | 
 | ...                 - Wait for BMC_READY state | 
 | ...                 - Apply preserve BMC Network setting | 
 | ...                 - SCP image to BMC | 
 | ...                 - Activate the flash image | 
 | ...                 - Warm Reset BMC to activate code | 
 | ...                 - Wait for BMC to come online time out 30 minutes | 
 | ...                 - Version check post update | 
 | ...                 - Identify REST url post update | 
 |  | 
 | Library                 ../../lib/gen_robot_keyword.py | 
 | Library                 String | 
 |  | 
 | Resource                code_update_utils.robot | 
 | Resource                ../../lib/state_manager.robot | 
 | Resource                ../../lib/utils.robot | 
 | Resource                ../../lib/list_utils.robot | 
 | Resource                ../../lib/openbmc_ffdc.robot | 
 | Resource                ../../extended/obmc_boot_test_resource.robot | 
 |  | 
 | Test Teardown           Run Key  FFDC On Test Case Fail | 
 |  | 
 | *** Variables *** | 
 |  | 
 | ${QUIET}                ${1} | 
 | # Boot failures are not acceptable so we set the threshold to 0. | 
 | ${boot_fail_threshold}  ${0} | 
 |  | 
 | ${FILE_PATH}            ${EMPTY} | 
 | ${FORCE_UPDATE}         ${0} | 
 | ${REST_URL_FILE_PATH}   ${EMPTY} | 
 |  | 
 | # There are two reboots issued by code update. | 
 | ${MAX_BOOT_COUNT}       ${2} | 
 |  | 
 | *** Test Cases *** | 
 |  | 
 | Initiate Code Update BMC | 
 |     [Documentation]  Initiate a code update on the BMC. | 
 |     [Tags]  Initiate_Code_Update_BMC | 
 |  | 
 |     ${status}=  Run Keyword If  '${LAST_KNOWN_GOOD_VERSION}' != '${EMPTY}' | 
 |     ...  Run Keyword And Return Status | 
 |     ...  Validate BMC Version  ${LAST_KNOWN_GOOD_VERSION} | 
 |  | 
 |     Run Keyword if  '${status}' == '${True}' | 
 |     ...  Pass Execution  The BMC already has the requested build loaded so no further action will be taken. | 
 |  | 
 |     # Enable user to bypass prerequisite operations. | 
 |     # Use cases for if BMC is not in working state. | 
 |     Run Keyword If  ${FORCE_UPDATE} == ${0} | 
 |     ...  Prepare BMC For Update | 
 |  | 
 |     Run Key U  Preserve BMC Network Setting | 
 |     Run Key  SCP Tar Image File To BMC \ ${FILE_PATH} | 
 |     Run Key  Activate BMC Flash Image | 
 |     Run Key U  OBMC Boot Test \ OBMC Reboot (off) | 
 |     Run Key U  Check Boot Count And Time | 
 |     Run Keyword If  ${BOOT_COUNT} == ${1} | 
 |     ...  Log  Boot time not updated by kernel.  level=WARN | 
 |  | 
 | *** Keywords *** | 
 |  | 
 | Prepare BMC For Update | 
 |     [Documentation]  Prerequisite operation before code update. | 
 |     Check Boot Count And Time | 
 |     Prune Journal Log | 
 |     Power Off Request | 
 |     Set BMC Power Policy  ALWAYS_POWER_OFF | 
 |  | 
 |     Prepare For Update | 
 |     Check If BMC is Up  20 min  10 sec | 
 |     Check Boot Count And Time | 
 |  | 
 |     # Temporary fix for lab migration for driver which is booted with | 
 |     # BMC state "/xyz/openbmc_project/state/BMC0/". | 
 |     ${status}=  Run Keyword And Return Status  Temp BMC URI Check | 
 |     Run Keyword If  '${status}' == '${False}' | 
 |     ...  Wait For BMC Ready | 
 |     ...  ELSE  Wait For Temp BMC Ready | 
 |  | 
 | Check Boot Count And Time | 
 |     [Documentation]  Check for unexpected reboots. | 
 |     Set BMC Reset Reference Time | 
 |     Log To Console  \n Boot Count: ${BOOT_COUNT} | 
 |     Log To Console  \n Boot Time: ${BOOT_TIME} | 
 |     Run Keyword If  ${BOOT_COUNT} > ${MAX_BOOT_COUNT} | 
 |     ...  Log  Phantom Reboot!!! Unexpected reboot detected  level=WARN | 
 |  | 
 | Temp BMC URI Check | 
 |     [Documentation]  Check for transient "BMC0" interface. | 
 |     ${resp}=  Openbmc Get Request  /xyz/openbmc_project/state/BMC0/ | 
 |     Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK} | 
 |  | 
 | Wait For Temp BMC Ready | 
 |     [Documentation]  Check for BMC "Ready" until timedout. | 
 |     Wait Until Keyword Succeeds | 
 |     ...  10 min  10 sec  Check Temp BMC State |