Refactored and added test case for BMC code update

- Split code update tests into files for BMC and Host
- Added a test case for BMC code update

Resolves openbmc/openbmc-test-automation#872

Change-Id: I4247fc2da512e01aea9790141dd5884e534982a8
Signed-off-by: Charles Paul Hofer <Charles.Hofer@ibm.com>
diff --git a/extended/code_update/host_code_update.robot b/extended/code_update/host_code_update.robot
new file mode 100644
index 0000000..eec0ddc
--- /dev/null
+++ b/extended/code_update/host_code_update.robot
@@ -0,0 +1,148 @@
+*** Settings ***
+Documentation     Update the PNOR code on a target BMC.
+...               Execution Method:
+...               python -m robot -v OPENBMC_HOST:<hostname>
+...               -v DELETE_OLD_PNOR_IMAGES:<"true" or "false">
+...               -v IMAGE_FILE_PATH:<path/*.tar>  host_code_update.robot
+...
+...               Code update method BMC
+...               Update work flow sequence:
+...                 - Upload image via REST
+...                 - Verify that the file exists on the BMC
+...                 - Check that software "Activation" is set to "Ready"
+...                 - Set "Requested Activation" to "Active"
+...                 - Wait for code update to complete
+...                 - Verify the new version
+
+Library           ../../lib/bmc_ssh_utils.py
+Library           ../../lib/code_update_utils.py
+Variables         ../../data/variables.py
+Resource          ../../lib/boot_utils.robot
+Resource          code_update_utils.robot
+Resource          ../../lib/code_update_utils.robot
+Resource          ../lib/openbmc_ffdc.robot
+Resource          ../../lib/state_manager.robot
+
+Test Teardown     FFDC On Test Case Fail
+
+*** Variables ***
+
+${QUIET}                          ${1}
+${IMAGE_FILE_PATH}                ${EMPTY}
+${DELETE_OLD_PNOR_IMAGES}         false
+
+*** Test Cases ***
+
+REST Host Code Update
+    [Documentation]  Do a PNOR code update by uploading image on BMC via REST.
+    [Tags]  REST_Host_Code_Update
+    [Setup]  Code Update Setup
+
+    Upload And Activate Image  ${IMAGE_FILE_PATH}
+    OBMC Reboot (off)
+
+
+Post Update Boot To OS
+    [Documentation]  Boot the host OS
+    [Tags]  Post_Update_Boot_To_OS
+    [Teardown]  Stop SOL Console Logging
+
+    Run Keyword If  '${PREV_TEST_STATUS}' == 'FAIL'
+    ...  Fail  Code update failed. No need to boot to OS.
+    Start SOL Console Logging
+    REST Power On
+
+
+Host Image Priority Attribute Test
+    [Documentation]  Set "Priority" attribute.
+    [Tags]  Host_Image_Priority_Attribute_Test
+    [Template]  Temporarily Set PNOR Attribute
+
+    # Property        Value
+    Priority          ${0}
+    Priority          ${1}
+    Priority          ${127}
+
+
+Set RequestedActivation To None
+    [Documentation]  Set the RequestedActivation of the image to None and
+    ...              verify that it is in fact set to None.
+    [Tags]  Set_RequestedActivation_To_None
+
+    ${software_objects}=  Get Software Objects
+    Set Host Software Property  @{software_objects}[0]  RequestedActivation
+    ...  ${REQUESTED_NONE}
+    ${software_properties}=  Get Host Software Property  @{software_objects}[0]
+    Should Be Equal As Strings  &{software_properties}[RequestedActivation]
+    ...  ${REQUESTED_NONE}
+
+
+Set RequestedActivation And Activation To Invalid Value
+    [Documentation]  Set the RequestedActivation and Activation propreties of
+    ...              the image to an invalid value and verify that it was not
+    ...              changed.
+    [Template]  Set Property To Invalid Value And Verify No Change
+    [Tags]  Set_RequestedActivation_And_Activation_To_Invalid_Value
+
+    # Property              Version Type
+    RequestedActivation     ${VERSION_PURPOSE_HOST}
+    Activation              ${VERSION_PURPOSE_HOST}
+
+
+Delete Host Image
+    [Documentation]  Delete a PNOR image from the BMC and PNOR flash chip.
+    [Tags]  Delete_Host_Image
+    [Setup]  Initiate Host PowerOff
+
+    ${software_objects}=  Get Software Objects
+    ...  version_type=${VERSION_PURPOSE_HOST}
+    ${num_images}=  Get Length  ${software_objects}
+    Should Be True  0 < ${num_images}
+    ...  msg=There are no PNOR images on the BMC to delete.
+    Delete Image And Verify  @{software_objects}[0]  ${VERSION_PURPOSE_HOST}
+
+
+*** Keywords ***
+
+Temporarily Set PNOR Attribute
+    [Documentation]  Update the PNOR attribute value.
+    [Arguments]  ${attribute_name}  ${attribute_value}
+
+    # Description of argument(s):
+    # attribute_name    Host software attribute name (e.g. "Priority").
+    # attribute_value   Value to be written.
+
+    ${image_ids}=  Get Software Objects
+    ${init_host_properties}=  Get Host Software Property  ${image_ids[0]}
+    ${initial_priority}=  Set Variable  ${init_host_properties["Priority"]}
+
+    Set Host Software Property  ${image_ids[0]}  ${attribute_name}
+    ...  ${attribute_value}
+
+    ${cur_host_properties}=  Get Host Software Property  ${image_ids[0]}
+    Should Be Equal As Integers  ${cur_host_properties["Priority"]}
+    ...  ${attribute_value}
+
+    # Revert to to initial value.
+    Set Host Software Property
+    ...  ${image_ids[0]}  ${attribute_name}  ${initial_priority}
+
+
+Code Update Setup
+    [Documentation]  Do code update test case setup.
+
+    Run Keyword If  'true' == '${DELETE_OLD_PNOR_IMAGES}'
+    ...  Delete All PNOR Images
+
+
+Get PNOR Extended Version
+    [Documentation]  Return the PNOR extended version.
+    [Arguments]  ${manifest_path}
+
+    # Description of argument(s):
+    # manifest_path  Path of the MANIFEST file
+    #                (e.g. "/tmp/images/abc123/MANIFEST").
+
+    ${version}= BMC Execute Command
+    ...  grep extended_version= ${manifest_path}
+    [return] ${version.split(",")}