IPMI Watchdog - Redfish AutomaticRetryConfig URI is implemented

Remove changes from bin/plug_ins/Auto_reboot/cp_master and
lib/utils.robot since AutomaticRetryConfig URI is now supported.
The missing Redfish AutomaticRetryConfig URI caused the boot plugins
to fail, thus causing the entire suite to fail.  This is no longer
an issue.

These changes will affect IPMI Watchdog commands, as well as all
Redfish power keywords, as now the plugins
will not fail the entire suite.

Note: Since ipmitool lanplus is not working in latest image, testing
on Nvidia system with these changes has not been done. Previous IPMI
Get/Set/Reset Watchdog command tests have been uploaded to the MR for
the previous commit where ipmitool lanplus was working.

Test results uploaded from previous commit

Signed-off-by: Lee Tarlton <leet@ami.com>
Change-Id: Ibdbfedeeb90049cb9f725910729a63322991f0d0
diff --git a/bin/auto_status_file.py b/bin/auto_status_file.py
index d1614f3..fa820be 100755
--- a/bin/auto_status_file.py
+++ b/bin/auto_status_file.py
@@ -173,7 +173,7 @@
     cmd_buf = "set -o pipefail ; " + command_string + " 2>&1 | tee -a " \
         + status_file_path
     qprint_issuing(cmd_buf)
-    sub_proc = subprocess.Popen(cmd_buf, shell=True)
+    sub_proc = subprocess.Popen(cmd_buf, shell=True, executable='/bin/bash')
     sub_proc.communicate()
     shell_rc = sub_proc.returncode
 
diff --git a/bin/plug_ins/Auto_reboot/cp_master b/bin/plug_ins/Auto_reboot/cp_master
index 843d73e..2fd0d31 100755
--- a/bin/plug_ins/Auto_reboot/cp_master
+++ b/bin/plug_ins/Auto_reboot/cp_master
@@ -66,7 +66,7 @@
     init_robot_out_parms(get_plug_in_package_name() + "." + pgm_name + ".")
 
     lib_file_path = init_robot_file_path("lib/utils.robot")
-
+ 
     REDFISH_SUPPORT_TRANS_STATE = int(os.environ.get('REDFISH_SUPPORT_TRANS_STATE', 0)) or \
         int(os.environ.get('AUTOBOOT_REDFISH_SUPPORT_TRANS_STATE', 0))
 
diff --git a/data/ipmi_raw_cmd_table.py b/data/ipmi_raw_cmd_table.py
index 1ddd58f..f2c88e6 100644
--- a/data/ipmi_raw_cmd_table.py
+++ b/data/ipmi_raw_cmd_table.py
@@ -156,5 +156,167 @@
             "0x89",
             "error response byte when host is powered off"
         ]
+    },
+    'Watchdog':
+    {
+        # Command action type
+        'Get':
+        [
+            # raw command, expected output(s), comment
+            "0x06 0x25",
+            "05 00 00 00 64 00",
+            "don't log bit enabled",
+            "85 00 00 00 64 00",
+            "don't log bit disabled",
+            "05 00 00 00 64 00",
+            "stop bit stop",
+            "45 00 00 00 64 00",
+            "stop bit resume",
+            "01 00 00 00 64 00",
+            "timer use FRB2",
+            "02 00 00 00 64 00",
+            "timer use POST",
+            "03 00 00 00 64 00",
+            "timer use OS",
+            "04 00 00 00 64 00",
+            "timer use SMS",
+            "05 00 00 00 64 00",
+            "timer use OEM",
+            "05 00 00 00 64 00",
+            "pre-timeout interrupt None",
+            "05 20 00 00 64 00",
+            "pre-timeout interrupt NMI",
+            "05 00 00 00 64 00",
+            "timeout action None",
+            "05 01 00 00 64 00",
+            "timeout action Reset",
+            "05 02 00 00 64 00",
+            "timeout action PowerDown",
+            "05 03 00 00 64 00",
+            "timeout action PowerCycle",
+            "05 00 00 02 00 00",
+            "timeout flag FRB2",
+            "05 00 00 04 00 00",
+            "timeout flag POST",
+            "05 00 00 08 00 00",
+            "timeout flag OS",
+            "05 00 00 10 00 00",
+            "timeout flag SMS",
+            "05 00 00 20 00 00",
+            "timeout flag OEM",
+            "05 00 00 00 30 35 30 35",
+            "Get should return 13.6 seconds",
+            "05 00 00 00 ff ff ff ff",
+            "Bit 6 not set when timer stopped",
+            "0x06 0x25 0x00",
+            "Get with one extra byte",
+        ],
+        'Set':
+        [
+            # raw command, expected output, comment
+            "0x06 0x24 0x05 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "don't log bit enabled",
+            "0x06 0x24 0x85 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "don't log bit disabled",
+            "0x06 0x24 0x05 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "stop bit stop",
+            "0x06 0x24 0x45 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "stop bit resume",
+            "0x06 0x24 0x01 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "timer use FRB2",
+            "0x06 0x24 0x02 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "timer use POST",
+            "0x06 0x24 0x03 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "timer use OS",
+            "0x06 0x24 0x04 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "timer use SMS",
+            "0x06 0x24 0x05 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "timer use OEM",
+            "0x06 0x24 0x05 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "pre-timeout interrupt None",
+            "0x06 0x24 0x05 0x20 0x00 0x00 0x64 0x00",
+            "none",
+            "pre-timeout interrupt NMI",
+            "0x06 0x24 0x05 0x00 0x00 0x00 0x64 0x00",
+            "none",
+            "timeout action None",
+            "0x06 0x24 0x05 0x01 0x00 0x00 0x64 0x00",
+            "none",
+            "timeout action Reset",
+            "0x06 0x24 0x05 0x02 0x00 0x00 0x64 0x00",
+            "none",
+            "timeout action PowerDown",
+            "0x06 0x24 0x05 0x03 0x00 0x00 0x64 0x00",
+            "none",
+            "timeout action PowerCycle",
+            "0x06 0x24 0x05 0x00 0x00 0x02 0x00 0x00",
+            "none",
+            "timeout flag FRB2",
+            "0x06 0x24 0x05 0x00 0x00 0x04 0x00 0x00",
+            "none",
+            "timeout flag POST",
+            "0x06 0x24 0x05 0x00 0x00 0x08 0x00 0x00",
+            "none",
+            "timeout flag OS",
+            "0x06 0x24 0x05 0x00 0x00 0x10 0x00 0x00",
+            "none",
+            "timeout flag SMS",
+            "0x06 0x24 0x05 0x00 0x00 0x20 0x00 0x00",
+            "none",
+            "timeout flag OEM",
+            "0x06 0x24 0x01 0x02 0x00 0x00 0x20 0x00",
+            "none",
+            "Power down",
+            "0x06 0x24 0x01 0x01 0x00 0x00 0x20 0x00",
+            "none",
+            "Hard reset",
+            "0x06 0x24 0x01 0x03 0x00 0x00 0x20 0x00",
+            "none",
+            "Power cycle",
+            "0x06 0x24 0x01 0x00 0x00 0x00 0x20 0x00",
+            "none",
+            "No action",
+            "0x06 0x24 0x05 0x00 0x00 0x00 0x30 0x35",
+            "none",
+            "Set for 13.6 seconds",
+            "0x06 0x24 0x05 0x00 0x07 0x00 0x50 0x00",
+            "none",
+            "Pre-timeout interval passes",
+            "0x06 0x24 0x05 0x00 0x04 0x00 0x0A 0x00",
+            "none",
+            "Pre-timeout interval fails",
+            "0x06 0x24 0x05 0x00 0x00 0x20 0xFF 0xFF",
+            "none",
+            "Bit 6 not set when timer stopped",
+            "0x06 0x24 0x05 0x00 0x08 0x00 0x64",
+            "none",
+            "Set with one less byte",
+            "0x06 0x24 0x05 0x00 0x08 0x00 0x64 0x00 0x00",
+            "none",
+            "Set with one extra byte",
+        ],
+        'Reset':
+        [
+            # raw command, expected output, comment
+            "0x06 0x22",
+            "none",
+            "Reset watchdog timer",
+            "0x06 0x22 0x00",
+            "none",
+            "Reset watchdog timer with extra byte",
+            "0x06 0x22",
+            "none",
+            "Reset watchdog timer without initialized watchdog",
+        ]
     }
 }
diff --git a/ipmi/test_ipmi_watchdog.robot b/ipmi/test_ipmi_watchdog.robot
new file mode 100644
index 0000000..7fed9f7
--- /dev/null
+++ b/ipmi/test_ipmi_watchdog.robot
@@ -0,0 +1,320 @@
+*** Settings ***
+
+Documentation    Module to test IPMI watchdog functionality.
+Resource         ../lib/ipmi_client.robot
+Resource         ../lib/openbmc_ffdc.robot
+Resource         ../lib/boot_utils.robot
+Library          ../lib/ipmi_utils.py
+Library          String
+Library          Collections
+Variables        ../data/ipmi_raw_cmd_table.py
+
+*** Variables ***
+
+${timer_delay}          3
+${power_state_change}   20
+
+*** Test Cases ***
+
+Test IPMI Watchdog Timer Don't Log Bit
+    [Documentation]  Execute out of band set/get don't log bit for watchdog timer.
+    [Tags]  Test_IPMI_Watchdog_Timer_Don't_Log_Bit
+    [Template]  Execute IPMI Raw Command And Verify Response Data
+
+    # Test action  set_raw_cmd  get_raw_cmd  resp_expect
+    Enable  ${IPMI_RAW_CMD['Watchdog']['Set'][0]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][1]}
+    Disable  ${IPMI_RAW_CMD['Watchdog']['Set'][3]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][3]}
+
+Test IPMI Watchdog Timer Stop Bit
+    [Documentation]  Execute out of band set/get stop/resume timer stop bit for watchdog timer.
+    [Tags]  Test_IPMI_Watchdog_Timer_Stop_Bit
+    [Template]  Execute IPMI Raw Command And Verify Response Data
+
+    # Stop_Bit  set_raw_cmd  get_raw_cmd  resp_expect
+    Stop  ${IPMI_RAW_CMD['Watchdog']['Set'][6]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][5]}
+    Resume  ${IPMI_RAW_CMD['Watchdog']['Set'][9]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][7]}
+
+Test IPMI Watchdog Timer Use Bits
+    [Documentation]  Execute out of band set/get timer use bits for watchdog timer.
+    [Tags]  Test_IPMI_Watchdog_Timer_Use_Bits
+    [Template]  Execute IPMI Raw Command And Verify Response Data
+
+    # Timer Use  set_raw_cmd  get_raw_cmd  resp_expect
+    FRB2  ${IPMI_RAW_CMD['Watchdog']['Set'][12]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][9]}
+    POST  ${IPMI_RAW_CMD['Watchdog']['Set'][15]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][11]}
+    OS  ${IPMI_RAW_CMD['Watchdog']['Set'][18]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][13]}
+    SMS  ${IPMI_RAW_CMD['Watchdog']['Set'][21]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][15]}
+    OEM  ${IPMI_RAW_CMD['Watchdog']['Set'][24]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][17]}
+
+Test IPMI Watchdog Timer Pre-Timeout Interrupt Bits
+    [Documentation]  Execute out of band set/get pre-timeout interrupt bits for watchdog timer.
+    [Tags]  Test_IPMI_Watchdog_Timer_Pre-Timeout_Interrupt_Bits
+    [Template]  Execute IPMI Raw Command And Verify Response Data
+
+    # Interrupt  set_raw_cmd  get_raw_cmd  resp_expect
+    None  ${IPMI_RAW_CMD['Watchdog']['Set'][27]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][19]}
+    NMI  ${IPMI_RAW_CMD['Watchdog']['Set'][30]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][21]}
+
+Test IPMI Watchdog Timer Timeout Action Bits
+    [Documentation]  Execute out of band set/get timer timeout bits for watchdog timer.
+    [Tags]  Test_IPMI_Watchdog_Timer_Timeout_Action_Bits
+    [Template]  Execute IPMI Raw Command And Verify Response Data
+
+    # Timer Action  set_raw_cmd  get_raw_cmd  resp_expect
+    None  ${IPMI_RAW_CMD['Watchdog']['Set'][33]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][23]}
+    Reset  ${IPMI_RAW_CMD['Watchdog']['Set'][36]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][25]}
+    Power Down  ${IPMI_RAW_CMD['Watchdog']['Set'][39]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][27]}
+    Power Cycle  ${IPMI_RAW_CMD['Watchdog']['Set'][42]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][29]}
+
+Test IPMI Watchdog Timer Timeout Flag Bits
+    [Documentation]  Execute out of band set/get timer timeout flag bits for watchdog timer.
+    [Tags]  Test_IPMI_Watchdog_Timer_Timeout_Flag_Bits
+    [Template]  Execute IPMI Raw Command And Verify Response Data
+
+    # Timeout Flag  set_raw_cmd  get_raw_cmd  resp_expect
+    FRB2  ${IPMI_RAW_CMD['Watchdog']['Set'][45]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][31]}
+    POST  ${IPMI_RAW_CMD['Watchdog']['Set'][48]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][33]}
+    OS  ${IPMI_RAW_CMD['Watchdog']['Set'][51]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][35]}
+    SMS  ${IPMI_RAW_CMD['Watchdog']['Set'][54]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][37]}
+    OEM  ${IPMI_RAW_CMD['Watchdog']['Set'][57]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][39]}
+
+
+Verify Timer Action Actions
+    [Documentation]  Set Watchdog via IPMI raw command and verify timer actions.
+    [Tags]  Verify_Timer_Action_Power_Down
+    [Template]  Validate Watchdog Timer Actions And SEL Events
+
+    # Timer action  set action command  power state  SEL event
+    Power down  ${IPMI_RAW_CMD['Watchdog']['Set'][60]}  ['off']  Power done
+    Hard reset  ${IPMI_RAW_CMD['Watchdog']['Set'][63]}  ['on']  Hard Reset
+    Power Cycle  ${IPMI_RAW_CMD['Watchdog']['Set'][66]}  ['on']  Power cycle
+    No action  ${IPMI_RAW_CMD['Watchdog']['Set'][69]}  ['on']  Timer expired
+
+
+Verify Reset Timer
+    [Documentation]  Set Watchdog via IPMI raw command and verify Reset Timer functions as expected.
+    [Tags]  Verify_Reset_Timer
+
+    # Check the chassis status.
+    Power On Host And Verify
+
+    # Set Watchdog Timer initCount(0x3530).
+    Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Set'][72]}
+
+    # Get Watchdog Timer.
+    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    Should Contain  ${resp}  ${IPMI_RAW_CMD['Watchdog']['Get'][41]}
+
+    @{start_timer_value}=  Split String  ${resp}
+    FOR    ${value}    IN    @{start_timer_value}
+        Log Many    ${value}
+    END
+
+    # Convert start value to integer.
+    # Example: Get watchdog response is 0x06 0x24 0x05 0x00 0x64 0x00 0x64 0x00.
+    # Start_timer_value is bits 6 - 7; set to 0x64 0x00 (100 ms decimal).
+    # Reverse bits 6 - 7 due to BMC being little endian; new value is 0x00 0x64.
+    # Convert hex value 0x00 0x64 to integer; start_timer_integer = 100.
+    ${value}=   Get Slice From List  ${start_timer_value}   6
+    Reverse List   ${value}
+    ${start_timer_string}=  Evaluate   "".join(${value})
+    ${start_timer_integer} =  Convert To Integer 	${start_timer_string}  16
+
+    # Delay.
+    Sleep   ${timer_delay}
+
+    # Get Watchdog Timer before reset watchdog timer.
+    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    Should Contain  ${resp}  ${IPMI_RAW_CMD['Watchdog']['Get'][41]}
+
+    FOR    ${1}    IN    ${3}
+
+        # Reset Watchdog Timer.
+        Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Reset'][0]}
+        # Delay.
+        Sleep  ${timer_delay}
+        Get Watchdog Timer And Compare To Start Value  ${start_timer_integer}
+
+    END
+
+
+Verify Pre-timeout Values
+    [Documentation]  Set Watchdog Pre-timeout via IPMI raw command and verify via Get Watchdog Timer.
+    [Tags]  Verify_Pre-timeout_Values
+    [Template]  Validate Watchdog Pre-timeout
+
+    #  interval  command response
+    Less than initial  ${IPMI_RAW_CMD['Watchdog']['Set'][75]}  ${EMPTY}
+    Maximum  ${IPMI_RAW_CMD['Watchdog']['Set'][81]}  ${EMPTY}
+    Bit 6 not set  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}  ${IPMI_RAW_CMD['Watchdog']['Get'][43]}
+
+Verify Failure For Pre-Timeout Interval > Initial Count
+    [Documentation]  Set Watchdog Pre-timeout via IPMI raw command and verify via Get Watchdog Timer.
+    [Tags]  Verify_Pre-timeout_Values
+
+    # Expected to fail: pre-timeout interval (4000) > initial count (1000).
+    Run Keyword and Expect Error  *Invalid data field*
+    ...  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Set'][78]}
+
+Verify Invalid Request Data Length
+    [Documentation]  Set Watchdog via IPMI raw command and verify via Get Watchdog Timer.
+    [Tags]  Verify_Invalid_Request_Data_Length
+    [Template]  Watchdog Invalid Request Data Length
+
+    # Number of bytes  command
+    One less byte  ${IPMI_RAW_CMD['Watchdog']['Set'][84]}
+    One extra byte  ${IPMI_RAW_CMD['Watchdog']['Set'][87]}
+    One extra byte  ${IPMI_RAW_CMD['Watchdog']['Get'][45]}
+
+Verify Invalid Reset Timer Request Data
+    [Documentation]  Set Watchdog via IPMI raw command and verify via Get Watchdog Timer.
+    [Tags]  Verify_Invalid_Request_Data_Length
+
+    # Reset Watchdog Timer with one extra byte.
+    Run Keyword and Expect Error  *Request data length*
+    ...  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Reset'][3]}
+
+    # Reset BMC.
+    Run External IPMI Standard Command  mc reset cold -N 10 -R 1
+    Check If BMC is Up
+
+    # Reset Watchdog Timer without initialized watchdog.
+    Run Keyword and Expect Error  *Unknown*
+    ...  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Reset'][6]}
+
+*** Keywords ***
+
+Execute IPMI Raw Command And Verify Response Data
+    [Documentation]  Execute out of band IPMI raw command and verify response data.
+    [Arguments]  ${bit_purpose}  ${set_raw_cmd}  ${get_raw_cmd}  ${resp_expect}
+
+    # Description of argument(s):
+    # bit_purpose     Purpose of the associated bit(s).
+    # set_raw_cmd     The request bytes for the command.
+    # get_raw_cmd     The response bytes for the command.
+    # resp_expect     The expected response bytes for the command.
+
+    Run IPMI Standard Command  raw ${set_raw_cmd}
+    ${resp}=  Run IPMI Standard Command  raw ${get_raw_cmd}
+    Should Contain  ${resp}  ${resp_expect}  msg=Expecting ${resp_expect} but got ${resp}.
+
+Validate Watchdog Timer Actions And SEL Events
+    [Documentation]  Verify the watchdog timer actions and the associated SEL events.
+    [Arguments]  ${timer_action}  ${set_raw_cmd}  ${power_state}  ${sel_event}
+
+    # Description of argument(s):
+    # timer_action     Action when watchdog timer expires.
+    # set_raw_cmd     The set timeout action request bytes for the command.
+    # power_state     The expected power state of the host.
+    # sel_event     The response bytes for the command.
+
+    # Check the chassis status.
+    Power On Host And Verify
+
+    # Clear SEL.
+    Run IPMI Standard Command  sel clear
+
+    # Set watchdog timer action to perform action.
+    Run IPMI Standard Command  raw ${set_raw_cmd}
+
+    # Reset Watchdog Timer.
+    Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Reset'][0]}
+
+    # Delay for power state.
+    Sleep  ${power_state_change}
+
+    Verify Host Power State  ${power_state}
+    Verify Watchdog Timer Action SEL Event  ${sel_event}
+
+
+Verify Host Power State
+    [Documentation]   Get host power state using external IPMI command and verify.
+    [Arguments]  ${power_state}
+
+    # Description of argument(s):
+    # ipmi_value     Value of Host power state: "on" or "off".
+
+    ${ipmi_state}=  Get Host State Via External IPMI
+    Valid Value  ipmi_state  ${power_state}
+
+Verify Watchdog Timer Action SEL Event
+    [Documentation]   Verify_Watchdog_Timer_Action_SEL_Event.
+    [Arguments]  ${sel_event}
+
+    # Description of argument(s):
+    # state_string   Text of SEL event after timer action.
+
+    ${resp}=  Run IPMI Standard Command  sel elist
+    ${power_status}=  Get Lines Containing String  ${resp}  Watchdog
+    Should Contain  ${power_status}  ${sel_event}
+
+Power On Host And Verify
+    [Documentation]   Power the host on and verify.
+
+    IPMI Power On  stack_mode=skip  quiet=1
+    ${ipmi_state}=  Get Host State Via External IPMI
+    Valid Value  ipmi_state  ['on']
+
+Watchdog Invalid Request Data Length
+    [Documentation]   Get watchdog value, convert to integer, and compare to original start value.
+    [Arguments]  ${byte_length}  ${watchdog_command}
+
+    # Description of argument(s):
+    # byte_length  The request byte length, which is used for explaining the command in the test case.
+    # watchdog_command     The raw watchdog IPMI command request bytes.
+
+    Run Keyword and Expect Error  *Request data length*
+    ...  Run IPMI Standard Command  raw ${watchdog_command}
+
+Validate Watchdog Pre-timeout
+    [Documentation]   Get watchdog value, convert to integer, and compare to original start value.
+    [Arguments]  ${byte_length}  ${watchdog_command}  ${response}
+
+    ${resp}=  Run IPMI Standard Command  raw ${watchdog_command}
+    Should Contain  ${resp}  ${response}
+
+Get Watchdog Timer And Compare To Start Value
+    [Documentation]   Get watchdog value, convert to integer, and compare to original start value.
+    [Arguments]  ${start_timer_integer}
+
+    # Description of argument(s):
+    # start_timer_integer     The initial value for the watchdog timer.
+
+    # Get Watchdog Timer.
+    ${resp}=  Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    @{timer_value}=  Split String  ${resp}
+
+    FOR    ${value}    IN    @{timer_value}
+        Log Many    ${value}
+    END
+
+    # Convert to integer and compare with start value.
+    # Example: Get watchdog response is 0x06 0x24 0x05 0x00 0x64 0x00 0x64 0x00.
+    # Start_timer_value is bits 6 - 7; set to 0x64 0x00 (100 ms decimal).
+    # Reverse bits 6 - 7 due to BMC being little endian; new value is 0x00 0x64.
+    # Convert hex value 0x00 0x64 to integer; start_timer_integer = 100.
+    ${value}=   Get Slice From List  ${timer_value}   6
+    Reverse List   ${value}
+    ${timer_string}=   Evaluate   "".join(${value})
+    ${current_timer_integer}=  Convert To Integer  ${timer_string}  16
+    Should Be True   ${current_timer_integer} < ${start_timer_integer}
\ No newline at end of file
diff --git a/lib/utils.robot b/lib/utils.robot
index 8f0ba80..942c702 100755
--- a/lib/utils.robot
+++ b/lib/utils.robot
@@ -747,7 +747,7 @@
 
     # Description of argument(s):
     # setting    The reboot setting, "RetryAttempts" and "Disabled".
-
+ 
     Redfish.Patch  /redfish/v1/Systems/system  body={"Boot": {"AutomaticRetryConfig": "${setting}"}}
     ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}]