13468df56SSteven Sombar*** Settings ***
23468df56SSteven Sombar
33468df56SSteven SombarDocumentation  Websocket functionality test.
43468df56SSteven Sombar
53468df56SSteven Sombar# Test Parameters:
63468df56SSteven Sombar# OPENBMC_HOST       The BMC host name or IP address.
73468df56SSteven Sombar# OPENBMC_USERNAME   The username for the BMC login.
83468df56SSteven Sombar# OPENBMC_PASSWORD   The password for OPENBMC_USERNAME.
93468df56SSteven Sombar# OS_HOST            The OS host name or IP address.
103468df56SSteven Sombar# OS_USERNAME        The username for the OS login.
113468df56SSteven Sombar# OS_PASSWORD        The password for OS_USERNAME.
123468df56SSteven Sombar
133468df56SSteven SombarResource             ../../lib/esel_utils.robot
143468df56SSteven SombarResource             ../../lib/bmc_redfish_resource.robot
153468df56SSteven SombarResource             ../../lib/logging_utils.robot
163468df56SSteven SombarLibrary              ../../lib/gen_cmd.py
173468df56SSteven SombarLibrary              OperatingSystem
183468df56SSteven Sombar
193468df56SSteven Sombar
203468df56SSteven SombarSuite Setup          Suite Setup Execution
213468df56SSteven SombarSuite Teardown       Suite Teardown Execution
223468df56SSteven SombarTest Teardown        Test Teardown Execution
233468df56SSteven Sombar
243468df56SSteven Sombar
253468df56SSteven Sombar*** Variables ***
263468df56SSteven Sombar
27*9686b769SSteven Sombar${monitor_pgm}          websocket_monitor.py
283468df56SSteven Sombar${monitor_file}         websocket_monitor_out.txt
293468df56SSteven Sombar${expected_string}      eSEL received over websocket interface
303468df56SSteven Sombar${min_number_chars}     22
313468df56SSteven Sombar${monitor_cmd}          ${monitor_pgm} ${OPENBMC_HOST} --openbmc_username ${OPENBMC_USERNAME}
323468df56SSteven Sombar
333468df56SSteven Sombar
343468df56SSteven Sombar*** Test Cases ***
353468df56SSteven Sombar
363468df56SSteven Sombar
373468df56SSteven SombarTest BMC Websocket Interface
383468df56SSteven Sombar    [Documentation]  Verify eSELs are seen over the websocket interface.
393468df56SSteven Sombar    [Tags]  Test_BMC_Websocket_Interface
403468df56SSteven Sombar
413468df56SSteven Sombar    # Spawn the websocket monitor program and then generate an eSEL.
423468df56SSteven Sombar    # The monitor should asynchronously receive the eSEL through the
433468df56SSteven Sombar    # websocket interface and report this fact to standard output.
443468df56SSteven Sombar
453468df56SSteven Sombar    Start Websocket Monitor
463468df56SSteven Sombar
473468df56SSteven Sombar    ${initial_esel_count}=  Get Number Of Event Logs
483468df56SSteven Sombar
493468df56SSteven Sombar    # Generate eSEL (e.g.  typically "CPU 1 core 3 has failed").
503468df56SSteven Sombar    Create eSEL
513468df56SSteven Sombar
523468df56SSteven Sombar    ${current_esel_count}=   Get Number Of Event Logs
533468df56SSteven Sombar
543468df56SSteven Sombar    Run Keyword If  ${initial_esel_count} == ${current_esel_count}
553468df56SSteven Sombar    ...  Fail  msg=System failed to generate eSEL upon request.
563468df56SSteven Sombar
573468df56SSteven Sombar    ${line}=  Grep File  ${monitor_file}  ${expected_string}
583468df56SSteven Sombar    # Typical monitor_file contents:
593468df56SSteven Sombar    # --------------- ON_MESSAGE:begin --------------------
603468df56SSteven Sombar    # {"event":"PropertiesChanged","interface":"xyz.openbmc_project.Logging.
613468df56SSteven Sombar    # Entry","path":"/xyz/openbmc_project/logging/entry/5","properties":{"Id":5}}
623468df56SSteven Sombar    # eSEL received over websocket interface.
633468df56SSteven Sombar
643468df56SSteven Sombar    ${num_chars}=  Get Length  ${line}
653468df56SSteven Sombar    Run Keyword If  ${num_chars} < ${min_number_chars}  Fail
663468df56SSteven Sombar    ...  msg=No eSEL notification from websocket_monitor.py.
673468df56SSteven Sombar
683468df56SSteven Sombar
693468df56SSteven Sombar*** Keywords ***
703468df56SSteven Sombar
713468df56SSteven Sombar
723468df56SSteven SombarStart Websocket Monitor
733468df56SSteven Sombar    [Documentation]  Fork the monitor to run in the background.
743468df56SSteven Sombar
753468df56SSteven Sombar    # Delete the previous output file, if any.
763468df56SSteven Sombar    Remove File  ${monitor_file}
773468df56SSteven Sombar
783468df56SSteven Sombar    # Start the monitor. Fork so its a parallel task.
793468df56SSteven Sombar    Shell Cmd
803468df56SSteven Sombar    ...  ${monitor_cmd} --openbmc_password ${OPENBMC_PASSWORD} 1>${monitor_file} 2>&1  fork=${1}
813468df56SSteven Sombar
823468df56SSteven Sombar    # Allow time for the monitor to initialize.
833468df56SSteven Sombar    Sleep  5s
843468df56SSteven Sombar
853468df56SSteven Sombar
863468df56SSteven SombarFind Websocket Monitor
873468df56SSteven Sombar    [Documentation]  Return the process Id(s) of running websocket monitors.
883468df56SSteven Sombar
893468df56SSteven Sombar    ${cmd}=  Catenate  ps -ef | grep '${monitor_cmd}'
903468df56SSteven Sombar    ...  | grep -v grep | grep -v bash | cut -c10-14
913468df56SSteven Sombar    ${shell_rc}  ${pid}=  Shell Cmd  ${cmd}
923468df56SSteven Sombar    # There may be more than one pid returned if there is an instance
933468df56SSteven Sombar    # of a monitory_pgm running from a previous run.
943468df56SSteven Sombar    @{pid_list}=  Split String  ${pid}
953468df56SSteven Sombar    [Return]  ${pid_list}
963468df56SSteven Sombar
973468df56SSteven Sombar
983468df56SSteven SombarKill Websocket Monitor
993468df56SSteven Sombar    [Documentation]  Terminate running websocket monitor.
1003468df56SSteven Sombar
1013468df56SSteven Sombar    ${pid_list}=  Find Websocket Monitor
1023468df56SSteven Sombar    FOR  ${pid}  IN  @{pid_list}
1033468df56SSteven Sombar        Shell Cmd  kill -s SIGTERM ${pid}
1043468df56SSteven Sombar    END
1053468df56SSteven Sombar
1063468df56SSteven Sombar
1073468df56SSteven SombarPrint Websocket Monitor Log
1083468df56SSteven Sombar    [Documentation]  Show the contents of the monitor output file.
1093468df56SSteven Sombar
1103468df56SSteven Sombar    ${websocket_monitor_log}=  OperatingSystem.Get File  ${monitor_file}
1113468df56SSteven Sombar    Log to Console  websocket_monitor_log:
1123468df56SSteven Sombar    Log to Console  ${websocket_monitor_log}
1133468df56SSteven Sombar
1143468df56SSteven Sombar
1153468df56SSteven SombarSuite Setup Execution
1163468df56SSteven Sombar    [Documentation]  Do the suite setup tasks.
1173468df56SSteven Sombar
1183468df56SSteven Sombar    Run Keyword  Redfish Power On  stack_mode=skip
1193468df56SSteven Sombar
1203468df56SSteven Sombar    Redfish.Login
1213468df56SSteven Sombar
1223468df56SSteven Sombar    Delete All Error Logs
1233468df56SSteven Sombar    Kill Websocket Monitor
1243468df56SSteven Sombar
1253468df56SSteven Sombar    # Allow time for Error Logs to be deleted.
1263468df56SSteven Sombar    Sleep  5s
1273468df56SSteven Sombar
1283468df56SSteven Sombar
1293468df56SSteven SombarTest Teardown Execution
1303468df56SSteven Sombar    [Documentation]  Do teardown tasks after a test.
1313468df56SSteven Sombar
1323468df56SSteven Sombar    FFDC On Test Case Fail
1333468df56SSteven Sombar    Run Keyword If  '${TEST_STATUS}' == 'FAIL'  Print Websocket Monitor Log
1343468df56SSteven Sombar    Kill Websocket Monitor
1353468df56SSteven Sombar
1363468df56SSteven Sombar
1373468df56SSteven SombarSuite Teardown Execution
1383468df56SSteven Sombar    [Documentation]  Do the post-suite teardown.
1393468df56SSteven Sombar
1403468df56SSteven Sombar    Delete All Error Logs
1413468df56SSteven Sombar    Run Keyword and Return Status  Redfish.Logout
142