IPMI Watchdog - Gerrit Reviewer Comment Changes

Create a new branch for latest IPMI Watchdog changes.

Add changes from gerrit reviewer comments.

Rebase from gerrit/master and commit

Abandoned previous IPMI Watchdog MR and branches due to MR being
behind master branch by many commits and having a merge conflict.

Change-Id: If9bacf307982870c5d0e2dbe56a14145dc0ee4ce
Signed-off-by: Lee Tarlton <leet@ami.com>
diff --git a/ipmi/test_ipmi_watchdog.robot b/ipmi/test_ipmi_watchdog.robot
new file mode 100644
index 0000000..e0d9b81
--- /dev/null
+++ b/ipmi/test_ipmi_watchdog.robot
@@ -0,0 +1,343 @@
+*** Settings ***
+
+Documentation    Module to test out of band 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 Does Not Log Bit
+    [Documentation]  Execute out of band set/get do not log bit for watchdog timer.
+    [Tags]  Test_IPMI_Watchdog_Timer_Does_Not_Log_Bit
+    [Template]  Execute IPMI Raw Command And Verify Response Data
+
+    # set_raw_cmd  get_raw_cmd  resp_expect
+    ${IPMI_RAW_CMD['Watchdog']['Set'][0]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][1]}
+    ${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 After Watchdog Expires
+
+    # set_raw_cmd  get_raw_cmd  resp_expect
+    ${IPMI_RAW_CMD['Watchdog']['Set'][6]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][5]}
+    ${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
+
+    # set_raw_cmd  get_raw_cmd  resp_expect
+    ${IPMI_RAW_CMD['Watchdog']['Set'][12]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][9]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][15]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][11]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][18]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][13]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][21]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][15]}
+    ${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
+
+    # set_raw_cmd  get_raw_cmd  resp_expect
+    ${IPMI_RAW_CMD['Watchdog']['Set'][27]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][19]}
+    ${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
+
+    # set_raw_cmd  get_raw_cmd  resp_expect
+    ${IPMI_RAW_CMD['Watchdog']['Set'][33]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][23]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][36]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][25]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][39]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][27]}
+    ${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 Timer Expiration Data
+
+    # set_raw_cmd  get_raw_cmd  resp_expect
+    ${IPMI_RAW_CMD['Watchdog']['Set'][45]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][31]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][48]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][33]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][51]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][35]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][54]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][37]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][57]}  ${IPMI_RAW_CMD['Watchdog']['Get'][0]}
+    ...  ${IPMI_RAW_CMD['Watchdog']['Get'][39]}
+
+
+Verify Timer Action For State Change
+    [Documentation]  Set Watchdog via IPMI raw command and verify timer actions.
+    [Tags]  Verify Timer Action For State Change
+    [Template]  Validate Watchdog Timer Actions And SEL Events
+
+    # set action command                  power state  SEL event
+    ${IPMI_RAW_CMD['Watchdog']['Set'][60]}  ['off']   Power done
+    ${IPMI_RAW_CMD['Watchdog']['Set'][63]}  ['on']    Hard Reset
+    ${IPMI_RAW_CMD['Watchdog']['Set'][66]}  ['on']    Power cycle
+    ${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}
+
+    # 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
+
+    # command                               response
+    ${IPMI_RAW_CMD['Watchdog']['Set'][75]}  ${EMPTY}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][81]}  ${EMPTY}
+    ${IPMI_RAW_CMD['Watchdog']['Get'][0]}   ${IPMI_RAW_CMD['Watchdog']['Get'][43]}
+
+Verify Failure For Pre-Timeout Interval Greater Than Initial Count
+    [Documentation]  Set Watchdog Pre-timeout via IPMI raw command and verify via Get Watchdog Timer.
+    [Tags]  Verify_Failure_For_Pre-Timeout_Interval_Greater_Than_Initial_Count
+
+    # 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
+
+    # command
+    ${IPMI_RAW_CMD['Watchdog']['Set'][84]}
+    ${IPMI_RAW_CMD['Watchdog']['Set'][87]}
+    ${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_Reset_Timer_Request_Data
+
+    # 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 After Watchdog Expires
+    [Documentation]  Execute out of band IPMI raw command and verify response data after watchdog expires.
+    [Arguments]  ${set_raw_cmd}  ${get_raw_cmd}  ${resp_expect}
+    # Description of argument(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}
+    Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Reset'][0]}
+    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}.
+
+Execute IPMI Raw Command And Verify Response Data
+    [Documentation]  Execute out of band IPMI raw command and verify response data.
+    [Arguments]  ${set_raw_cmd}  ${get_raw_cmd}  ${resp_expect}
+
+    # Description of argument(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}.
+
+Execute IPMI Raw Command And Verify Timer Expiration Data
+    [Documentation]  Execute out of band IPMI raw command and verify timer expiration response data.
+    [Arguments]  ${set_raw_cmd}  ${get_raw_cmd}  ${resp_expect}
+
+    # Description of argument(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}
+    Run IPMI Standard Command  raw ${get_raw_cmd}
+    Run IPMI Standard Command  raw ${IPMI_RAW_CMD['Watchdog']['Reset'][0]}
+    ${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]  ${set_raw_cmd}  ${power_state}  ${sel_event}
+
+    # Description of argument(s):
+    # 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):
+    # power_state     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):
+    # sel_event   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]   Verify invalid request bytes for set watchdog returns correct error.
+    [Arguments]  ${watchdog_command}
+
+    # Description of argument(s):
+    # 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]   Verify watchdog pre-timeout valid request bytes.
+    [Arguments]  ${watchdog_command}  ${response}
+
+    # Description of argument(s):
+    # watchdog_command     The raw watchdog IPMI command request bytes.
+    # response             The expected response bytes.
+
+    ${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}
+
+    # 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