Test suite for firmware side switch

Added:
     - Test case to switch sides without powering on
     - Test case to switch sides and power on host

Tested:

    robot -v OPENBMC_HOST:xx.xx.xx.xx  redfish/update_service/test_bmc_image_switch.robot

------------------------------------------------------------------------------
Test Bmc Image Switch :: Redfish test to switch image sides and boot. | PASS |
2 tests, 2 passed, 0 failed
==============================================================================

Change-Id: I5e8e1f85852f802f920ad77d754170252406353c
Signed-off-by: George Keishing <gkeishin@in.ibm.com>
diff --git a/redfish/update_service/test_bmc_image_switch.robot b/redfish/update_service/test_bmc_image_switch.robot
new file mode 100644
index 0000000..0ad9cf3
--- /dev/null
+++ b/redfish/update_service/test_bmc_image_switch.robot
@@ -0,0 +1,142 @@
+*** Settings ***
+Documentation            Redfish test to switch image sides and boot.
+
+Resource                 ../../lib/resource.robot
+Resource                 ../../lib/bmc_redfish_resource.robot
+Resource                 ../../lib/openbmc_ffdc.robot
+Resource                 ../../lib/redfish_code_update_utils.robot
+Library                  ../../lib/tftp_update_utils.py
+
+Suite Setup              Suite Setup Execution
+Suite Teardown           Redfish.Logout
+Test Teardown            FFDC On Test Case Fail
+
+*** Variables ***
+
+# Switch iteration count. By default it does only 2 switch.
+# User can input -v LOOP_COUNT:n  to drive the switch back and forth for
+# nth iteration.
+${LOOP_COUNT}    ${2}
+
+*** Test Cases ***
+
+Test Firmware Image Switch Without Powering Host
+    [Documentation]  Switch image at host powered off.
+    [Tags]  Test_Firmware_Image_Switch_Without_Powering_Host
+    [Template]  Firmware Switch Loop
+
+    # iteration          power_on
+    ${LOOP_COUNT}        NO
+
+
+Test Firmware Image Switch And Power On Host
+    [Documentation]  Switch image and power on host and verify that it boots.
+    [Tags]  Test_Firmware_Image_Switch_And_Power_On_Host
+    [Template]  Firmware Switch Loop
+
+    # iteration          power_on
+    ${LOOP_COUNT}        YES
+
+
+*** Keywords ***
+
+Firmware Switch Loop
+    [Documentation]  Wrapper keyword for iteration for firmware side switch.
+    [Arguments]  ${iteration}  ${power_on}
+
+    # Description of argument(s):
+    # iteration      Number of switch it needs to perform.
+    # power_on       If YES, boot the system post firmware image switch,
+    #                if NO, do not perform any poweron operation.
+
+    FOR  ${count}  IN RANGE  0  ${iteration}
+        Log To Console   LOOP_COUNT:${count} execution.
+        Redfish BMC Switch Firmware Side
+
+        Continue For Loop If  '${power_on}' == 'NO'
+
+        Log To Console   Power on requested, issuing power on.
+        Redfish Power On
+
+        # Power Off for next iteration. Firmware image switch ideally needs to be
+        # to be executed when Host is powered off.
+        Log To Console   Power off requested, issuing power off.
+        Redfish Power Off
+    END
+
+
+Suite Setup Execution
+    [Documentation]  Do the suite setup.
+
+    Redfish.Login
+    Run Keyword And Ignore Error  Redfish Purge Event Log
+    Redfish Power Off  stack_mode=skip
+
+
+Redfish BMC Switch Firmware Side
+    [Documentation]  Switch back up image to running and verify.
+    [Tags]  Redfish_BMC_Switch_Firmware_Side
+
+    # fw_inv_dict:
+    #  [19a3ef3e]:
+    #    [image_type]:                                 BMC image
+    #    [image_id]:                                   19a3ef3e
+    #    [functional]:                                 True
+    #    [version]:                                    2.12.0-dev-1440-g8dada0a1a
+    #  [62d16947]:
+    #    [image_type]:                                 BMC image
+    #    [image_id]:                                   62d16947
+    #    [functional]:                                 False
+    #    [version]:                                    2.12.0-dev-1441-g8deadbeef
+    ${fw_inv_dict}=  Get Software Inventory State
+    Rprint Vars  fw_inv_dict
+
+    # Get the backup firmware version for reference.
+    FOR  ${id}  IN  @{fw_inv_dict.keys()}
+        Continue For Loop If  '${fw_inv_dict['${id}']['functional']}' == 'True'
+        # Find the non functional id and fetch the version.
+        ${image_version}=  Set Variable  ${fw_inv_dict['${id}']['version']}
+    END
+
+    Log To Console  Backup firmware version: ${image_version}
+
+    Switch Firmware Side  ${image_version}
+
+    Match BMC Release And Redifsh Firmware Version
+    Log To Console  The backup firmware image ${image_version} is now functional.
+
+
+Match BMC Release And Redifsh Firmware Version
+    [Documentation]  The /etc/os-release vs Redfish FirmwareVersion attribute value from
+    ...             /redfish/v1/Managers/bmc should match.
+
+    # Python module: get_bmc_release_info()
+    ${bmc_release_info}=  utils.Get BMC Release Info
+    ${bmc_release}=  Set Variable  ${bmc_release_info['version_id']}
+    Rprint Vars  bmc_release
+
+    ${firmware_version}=  Redfish.Get Attribute  /redfish/v1/Managers/bmc  FirmwareVersion
+    Rprint Vars  firmware_version
+
+    Should Be Equal As Strings   ${bmc_release}   ${firmware_version}
+    ...  msg=${bmc_release} does not match redfish version ${firmware_version}
+
+
+Switch Firmware Side
+    [Documentation]  Set the backup firmware to functional and verify after BMC rebooted.
+    [Arguments]  ${image_version}
+
+    # Description of argument(s):
+    # image_version     Version of image.
+
+    ${state}=  Get Pre Reboot State
+
+    Print Timen  Switch to back up and rebooting.
+    Switch Backup Firmware Image To Functional
+    Wait For Reboot  start_boot_seconds=${state['epoch_seconds']}
+    Print Timen  Switch to back up completed.
+
+    # Check if the BMC version after rebooted is the same version asked to switch.
+    ${firmware_version}=  Redfish.Get Attribute  /redfish/v1/Managers/bmc  FirmwareVersion
+    Should Be Equal As Strings   ${image_version}   ${firmware_version}
+    ...  msg=${image_version} does not match redfish version ${firmware_version}