| *** Settings *** | 
 |  | 
 | Documentation    Module to test IPMI SEL Time functionality. | 
 | ...              Pre-requisite Condition : Client Machine and BMC should be in | 
 | ...              Same TimeZone (example : UST) | 
 | ... | 
 | ...              IPMI Raw command variables are defined under | 
 | ...              ../data/ipmi_raw_command_table.py | 
 | ... | 
 | ...              Test the Set/Get SEL Time functionality and compare the result against | 
 | ...              BMC Native command (date). | 
 | ... | 
 | ...              Set the Time Sync Mode from NTP to Manual to Set SEL Time. | 
 | ...              Time Sync Mode change performed via REDFISH URI. | 
 | ...              Performs the change in Time Sync Mode with Test Setup and Teardown Execution | 
 | ...              with default NETWORK_TIMEOUT provided under ../lib/resource.robot. | 
 | ... | 
 | ...              NETWORK_RESTART_TIME added for Set SEL Time and Add SEL Entry as the corresponding | 
 | ...              command takes approx 5 seconds for the operation to reflect. | 
 | ... | 
 | ...              Current SEL time identified via BMC Native command (date) and perform SEL Time operations. | 
 | ... | 
 | ...              Script Verifies SEL Time for various scenarios such as, | 
 | ...              Get current time from BMC and add future year and compare against BMC native command (date), | 
 | ...              Gets BMC Current Time and Adds 15 minutes and compare against BMC native command (date), | 
 | ...              Gets BMC Current Time and subtracts 1 day and compare against BMC native command (date), | 
 | ...              Add SEL Entry for all the above scenarios and compare against BMC native command (date). | 
 |  | 
 | Resource         ../lib/ipmi_client.robot | 
 | Resource         ../lib/openbmc_ffdc.robot | 
 | Library          DateTime | 
 | Library          Collections | 
 | Library          String | 
 | Library          ../lib/ipmi_utils.py | 
 | Variables        ../data/ipmi_raw_cmd_table.py | 
 |  | 
 | Test Setup       Test Setup Execution | 
 | Test Teardown    Test Teardown Execution | 
 |  | 
 | Test Tags       IPMI_SEL_Time | 
 |  | 
 | *** Variables *** | 
 |  | 
 | ${NETWORK_RESTART_TIME}   5s | 
 | @{time_difference_list}  +8760:153:25  -87600:453:120  +175200:40:15  -43800:10:05  +20:35:12  -8760:00:00 | 
 |  | 
 | # Based on 13th byte of add SEL entry command as per IPMI spec | 
 | # event_dir and event_type variable value needs to be given. | 
 | ${sel_no_entry_msg}  SEL has no entries | 
 | ${event_type}        Lower Non-critical going low | 
 | ${event_dir}         Asserted | 
 | # number_of_times_sel_entry_added this variable is used in Verify Multiple Set SEL Time With Multiple Add SEL Entry | 
 | # test case. Need to give how many sel should be added with multiple date and time. | 
 | ${number_of_times_sel_entry_added}    6 | 
 |  | 
 | *** Test Cases *** | 
 |  | 
 | Verify Default Get SEL Time | 
 |     [Documentation]  Verify IPMI Get SEL Time. | 
 |     [Tags]  Verify_Default_Get_SEL_Time | 
 |  | 
 |     # Gets the current SEL time via Get SEL Time Command. | 
 |     ${resp}=  Get SEL Time Command | 
 |     Should Not Be Empty  ${resp} | 
 |  | 
 |  | 
 | Verify Set SEL Time On NTP Mode | 
 |     [Documentation]   IPMI Set SEL Time without NTP | 
 |     [Tags]  Verify_Set_SEL_Time_On_NTP_Mode | 
 |  | 
 |     # Get current time from BMC and add future year (here, 5years). | 
 |     ${sel_date}=  Get Specific Sel Date  5 | 
 |  | 
 |     # Gives Hexa decimal raw command data request with the prefix of 0x. | 
 |     ${sel_date_raw}=  Converting Date to HexaDecimal  ${sel_date} | 
 |  | 
 |     ${Set_sel_time}=  Run Keyword and Expect Error  *${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][2]}* | 
 |     ...  Run IPMI Command  ${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][0]} ${sel_date_raw} | 
 |     Should Contain  ${Set_sel_time}  ${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][1]} | 
 |  | 
 |  | 
 | Verify SEL Set Time For Specific Time | 
 |     [Documentation]  Verify IPMI Set SEL Time. | 
 |     [Tags]  Verify_SEL_Set_Time_For_Specific_Time | 
 |  | 
 |     # Get current time from BMC and add future year (here, 5years). | 
 |     ${sel_date}=  Get Specific Sel Date  5 | 
 |  | 
 |     # Gives Hexa decimal raw command data request with the prefix of 0x. | 
 |     ${sel_date_raw}=  Converting Date to HexaDecimal  ${sel_date} | 
 |  | 
 |     # Set SEL Entry command. | 
 |     Set SEL Time Entry Via Raw Command  ${sel_date_raw} | 
 |  | 
 |     # Get SEL Time command. | 
 |     ${get_sel_time}=  Check Current Date Time Via IPMI | 
 |  | 
 |     # Identify Time difference and find the difference is less than 6 seconds. | 
 |     # Command execution may happen at the end of millisecond so considered 6 seconds as difference. | 
 |     ${time_difference}=  Get Time Difference  ${get_sel_time}  ${sel_date} | 
 |     Should Be True  0<=${time_difference}<=5 | 
 |     ...  msg=Set SEL Time Not Working | 
 |  | 
 |     # Get BMC time (native) and compare with set sel time given. | 
 |     ${bmc_time}=  Get Current Date from BMC | 
 |  | 
 |     ${difference}=  Get Time Difference  ${bmc_time}  ${sel_date} | 
 |     Should Be True  0<=${difference}<=6 | 
 |  | 
 |  | 
 | Verify Set SEL Time With Future Date And Time | 
 |     [Documentation]  Verify IPMI Get SEL Time by adding 15 minutes from current time. | 
 |     [Tags]  Verify_Set_SEL_Time_With_Future_Date_And_Time | 
 |  | 
 |     # Gets BMC Current Time and Adds 15 minutes and sets the SEL Time. | 
 |     ${sel_time}  ${set_sel_time}=  Identify SEL Time  +06:15:00 | 
 |  | 
 |     # Set SEL Time via IPMI command. | 
 |     Set SEL Time Via IPMI  ${sel_time} | 
 |  | 
 |     # Get SEL Time Command. | 
 |     ${get_sel_time}=  Check Current Date Time Via IPMI | 
 |  | 
 |     # Difference of time between set sel time and get time. | 
 |     ${difference}=  Get Time Difference  ${get_sel_time}  ${set_sel_time} | 
 |     Should Be True  0<=${difference}<=2 | 
 |  | 
 |     # Difference of time between BMC Date and Get SEL Time. | 
 |     ${bmc_time}=  Get Current Date from BMC | 
 |     ${difference}=  Get Time Difference  ${bmc_time}  ${get_sel_time} | 
 |     Should Be True  0<=${difference}<=2 | 
 |  | 
 |  | 
 | Verify Set SEL Time With Past Date And Time | 
 |     [Documentation]  Verify IPMI Get SEL Time for yime delay of 1 day from current dat and time. | 
 |     [Tags]  Verify_Set_SEL_Time_With_Past_Date_And_Time | 
 |  | 
 |     # Gets BMC current time and subtracts 1 day and sets the SEL Time. | 
 |     ${sel_time}  ${set_sel_time}=  Identify SEL Time  -24:00:00 | 
 |  | 
 |     ${status}=  Run Keyword And Return Status  Should Not Contain  ${sel_time}  1969 | 
 |     ...  msg=Date cannot be less than 1970. | 
 |  | 
 |     IF  '${status}' == '${TRUE}' | 
 |         # Set SEL Time via IPMI command. | 
 |         Set SEL Time Via IPMI  ${sel_time} | 
 |         # Get SEL Time Command. | 
 |         ${get_sel_time}=  Check Current Date Time Via IPMI | 
 |         # Difference of time between set sel time and get time. | 
 |         ${difference}=  Get Time Difference  ${get_sel_time}  ${set_sel_time} | 
 |         Should Be True  0<=${difference}<=2 | 
 |         # Difference of time between BMC Date and Get SEL Time. | 
 |         ${bmc_time}=  Get Current Date from BMC | 
 |         ${difference}=  Get Time Difference  ${bmc_time}  ${get_sel_time} | 
 |         Should Be True  0<=${difference}<=2 | 
 |     ELSE | 
 |         FAIL  SEL Time cannot set Date less than 1970 | 
 |     END | 
 |  | 
 |  | 
 | Verify SEL Set Time For Invalid Data Request | 
 |     [Documentation]  Verify IPMI Get SEL Time for invalid data request | 
 |     [Tags]  Verify_SEL_Set_Time_For_Invalid_Data_Request | 
 |  | 
 |     # Gets BMC current date via date command. | 
 |     ${current_date}=  Get Current Date from BMC | 
 |  | 
 |     # Gives hexa decimal Raw command data request with the prefix of 0x. | 
 |     ${sel_date_raw}=  Converting Date to HexaDecimal  ${current_date} | 
 |  | 
 |     # Set Invalid SEL Time with one extra request byte. | 
 |     ${Set_seltime_invalid}=  Run Keyword and Expect Error  *${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][4]}* | 
 |     ...  Run IPMI Command  ${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][0]} ${sel_date_raw} 0x00 | 
 |     Should Contain  ${Set_seltime_invalid}  ${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][3]} | 
 |  | 
 |  | 
 | Verify SEL Set Time For Incomplete Data Request | 
 |     [Documentation]  Verify IPMI Get SEL Time for invalid data with one byte less request data. | 
 |     [Tags]  Verify_SEL_Set_Time_For_Incomplete_Data_Request | 
 |  | 
 |     # Gets BMC current date via date command. | 
 |     ${current_date}=  Get Current Date from BMC | 
 |  | 
 |     # Gives hexa decimal raw command data request with the prefix of 0x. | 
 |     ${sel_date_raw}=  Converting Date to HexaDecimal  ${current_date} | 
 |  | 
 |     # For data request less than expected byes, remove last byte. | 
 |     ${sel_date_raw}=  Split String  ${sel_date_raw} | 
 |     Remove From List  ${sel_date_raw}  -1 | 
 |     ${sel_date_raw}=  Evaluate  " ".join(${sel_date_raw}) | 
 |  | 
 |     # Set incomplete SEL Time with one less request byte. | 
 |     ${Set_seltime_incomplete}= | 
 |     ...  Run Keyword and Expect Error  *${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][4]}* | 
 |     ...  Run IPMI Command  ${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][0]} ${sel_date_raw} | 
 |     Should Contain  ${Set_seltime_incomplete}  ${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][3]} | 
 |  | 
 |  | 
 | Verify SEL Time In SEL Entry | 
 |     [Documentation]  Verify Configured SEL Time reflects in newly added SEL Entry. | 
 |     [Tags]  Verify_SEL_Time_In_SEL_Entry | 
 |  | 
 |     Clear The SEL | 
 |  | 
 |    # change to manual, get current time and add future year (here, 5years). | 
 |     ${sel_date}=  Get Specific Sel Date  5 | 
 |  | 
 |     # Gives hexa decimal raw command data request with the prefix of 0x. | 
 |     ${sel_date_raw}=  Converting Date to HexaDecimal  ${sel_date} | 
 |  | 
 |     # Set SEL Entry Command. | 
 |     Set SEL Time Entry Via Raw Command  ${sel_date_raw} | 
 |  | 
 |     # Get SEL Time Command. | 
 |     ${get_sel_time}=  Check Current Date Time Via IPMI | 
 |  | 
 |     # Identify Time difference and find the difference is less than 6 seconds. | 
 |     # Command execution may happen at the end of millisecond so considered 6 seconds as difference. | 
 |     ${time_difference}=  Get Time Difference  ${get_sel_time}  ${sel_date} | 
 |     Should Be True  0<=${time_difference}<=5 | 
 |     ...  msg=Set SEL Time Not Working | 
 |  | 
 |     # Get BMC time (native) and compare with set sel time given. | 
 |     ${bmc_time}=  Get Current Date from BMC | 
 |  | 
 |     ${difference}=  Get Time Difference  ${bmc_time}  ${sel_date} | 
 |     Should Be True  0<=${difference}<=6 | 
 |  | 
 |     # Get any Sensor available from Sensor list. | 
 |     ${sensor_name}=  Fetch One Threshold Sensor From Sensor List | 
 |  | 
 |     # Get Sensor ID from SDR Get "sensor". | 
 |     ${sensor_data1}=  Fetch Sensor Details From SDR  ${sensor_name}  Sensor ID | 
 |     ${sensor_number}=  Get Bytes From SDR Sensor  ${sensor_data1} | 
 |  | 
 |     # Get Sensor Type from SDR Get "sensor". | 
 |     ${sensor_data2}=  Fetch Sensor Details From SDR  ${sensor_name}  Sensor Type (Threshold) | 
 |     ${sensor_type_id}=  Get Bytes From SDR Sensor  ${sensor_data2} | 
 |  | 
 |     # Add SEL Entry. | 
 |     ${sel_create_resp}=  Create SEL  ${sensor_type_id}  ${sensor_number} | 
 |  | 
 |     # Finds the last added sel entry. | 
 |     ${resp}=  Verify SEL Added  ${sensor_name} | 
 |  | 
 |     # Fetches the date of the last added SEL Entry. | 
 |     ${sel_entry_date}=  Fetch Added SEL Date  ${resp} | 
 |  | 
 |     # Identify and find the time difference is less than 60 seconds. | 
 |     # Finding the sensor details and execution may take up to a minute. | 
 |     # Compare  date and time of Set SEL with sel entry. | 
 |     ${d}=  Get Time Difference  ${sel_entry_date}  ${sel_date} | 
 |     Should Be True  0<=${d}<=60 | 
 |  | 
 |  | 
 | Verify SEL Time In SEL Entry For Future Date and Time | 
 |     [Documentation]  Verify configured SEL Time (Future Date & Time) in added SEL Entry. | 
 |     [Tags]  Verify_SEL_Time_In_SEL_Entry_For_Future_Date_and_Time | 
 |  | 
 |     Clear The SEL | 
 |  | 
 |     # Gets BMC Current Time and Adds 15 minutes and sets the SEL Time. | 
 |     ${sel_time}  ${set_sel_time}=  Identify SEL Time  +06:15:00 | 
 |  | 
 |     # Set SEL Time via IPMI command. | 
 |     Set SEL Time Via IPMI  ${sel_time} | 
 |  | 
 |     # Get SEL Time Command. | 
 |     ${get_sel_time}=  Check Current Date Time Via IPMI | 
 |  | 
 |     # Difference of time between set sel time and get time. | 
 |     ${difference}=  Get Time Difference  ${get_sel_time}  ${set_sel_time} | 
 |     Should Be True  0<=${difference}<=2 | 
 |  | 
 |     # Difference of time between BMC Date and Get SEL Time. | 
 |     ${bmc_time}=  Get Current Date from BMC | 
 |     ${difference}=  Get Time Difference  ${bmc_time}  ${get_sel_time} | 
 |     Should Be True  0<=${difference}<=2 | 
 |  | 
 |     # Get any Sensor available from Sensor list. | 
 |     ${sensor_name}=  Fetch One Threshold Sensor From Sensor List | 
 |  | 
 |     # Get Sensor ID from SDR Get "sensor". | 
 |     ${sensor_data1}=  Fetch Sensor Details From SDR  ${sensor_name}  Sensor ID | 
 |     ${sensor_number}=  Get Bytes From SDR Sensor  ${sensor_data1} | 
 |  | 
 |     # Get Sensor Type from SDR Get "sensor". | 
 |     ${sensor_data2}=  Fetch Sensor Details From SDR  ${sensor_name}  Sensor Type (Threshold) | 
 |     ${sensor_type_id}=  Get Bytes From SDR Sensor  ${sensor_data2} | 
 |  | 
 |     # Add SEL Entry. | 
 |     ${sel_create_resp}=  Create SEL  ${sensor_type_id}  ${sensor_number} | 
 |  | 
 |     # Finds the last added sel entry. | 
 |     ${resp}=  Verify SEL Added  ${sensor_name} | 
 |  | 
 |     # Fetches the date of the last added SEL Entry. | 
 |     ${sel_entry_date}=  Fetch Added SEL Date  ${resp} | 
 |  | 
 |     # Identify and find the time difference is less than 60 seconds. | 
 |     # Finding the sensor details and execution may take up to a minute. | 
 |     # Compare  date and time of Set SEL with sel entry. | 
 |     ${d}=  Get Time Difference  ${sel_entry_date}  ${set_sel_time} | 
 |     Should Be True  0<=${d}<=60 | 
 |  | 
 |  | 
 | Verify SEL Time In SEL Entry For Past Date And Time | 
 |     [Documentation]  Verify configured SEL Time (Past Date & Time) in added SEL Entry. | 
 |     [Tags]  Verify_SEL_Time_In_SEL_Entry_For_Past_Date_And_Time | 
 |  | 
 |     Clear The SEL | 
 |  | 
 |     # Gets BMC Current Time and subtracts 1 day and sets the SEL Time. | 
 |     ${sel_time}  ${set_sel_time}=  Identify SEL Time  -24:00:00 | 
 |  | 
 |     ${status}=  Run Keyword And Return Status  Should Not Contain  ${sel_time}  1969 | 
 |     ...  msg=Date cannot be less than 1970 | 
 |  | 
 |     IF  '${status}' == '${TRUE}' | 
 |         # Set SEL Time via IPMI command. | 
 |         Set SEL Time Via IPMI  ${sel_time} | 
 |         # Get SEL Time Command. | 
 |         ${get_sel_time}=  Check Current Date Time Via IPMI | 
 |         # Difference of time between set sel time and get time. | 
 |         ${difference}=  Get Time Difference  ${get_sel_time}  ${set_sel_time} | 
 |         Should Be True  0<=${difference}<=2 | 
 |         # Difference of time between BMC Date and Get SEL Time. | 
 |         ${bmc_time}=  Get Current Date from BMC | 
 |         ${difference}=  Get Time Difference  ${bmc_time}  ${get_sel_time} | 
 |         Should Be True  0<=${difference}<=2 | 
 |  | 
 |         # Get any Sensor available from Sensor list. | 
 |         ${sensor_name}=  Fetch One Threshold Sensor From Sensor List | 
 |         # Get Sensor ID from SDR Get "sensor". | 
 |         ${sensor_data1}=  Fetch Sensor Details From SDR  ${sensor_name}  Sensor ID | 
 |         ${sensor_number}=  Get Bytes From SDR Sensor  ${sensor_data1} | 
 |  | 
 |         # Get Sensor Type from SDR Get "sensor". | 
 |         ${sensor_data2}=  Fetch Sensor Details From SDR  ${sensor_name}  Sensor Type (Threshold) | 
 |         ${sensor_type_id}=  Get Bytes From SDR Sensor  ${sensor_data2} | 
 |  | 
 |         # Add SEL Entry. | 
 |         ${sel_create_resp}=  Create SEL  ${sensor_type_id}  ${sensor_number} | 
 |  | 
 |         # Finds the last added sel entry. | 
 |         ${resp}=  Verify SEL Added  ${sensor_name} | 
 |  | 
 |         # Fetches the date of the last added SEL Entry. | 
 |         ${sel_entry_date}=  Fetch Added SEL Date  ${resp} | 
 |  | 
 |         # Identify and find the time difference is less than 60 seconds. | 
 |         # Finding the sensor details and execution may take up to a minute. | 
 |         # Compare  date and time of Set SEL with sel entry. | 
 |         ${d}=  Get Time Difference  ${sel_entry_date}  ${set_sel_time} | 
 |         Should Be True  0<=${d}<=60 | 
 |     ELSE | 
 |         FAIL  SEL Time cannot set Date less than 1970. | 
 |     END | 
 |  | 
 |  | 
 | Verify Multiple Set SEL Time With Multiple Add SEL Entry | 
 |     [Documentation]  Verify SEL time in multiple addition Of SEL entry. | 
 |     [Tags]  Verify_Multiple_Set_SEL_Time_With_Multiple_Add_SEL_Entry | 
 |  | 
 |     FOR  ${i}  IN RANGE  ${number_of_times_sel_entry_added} | 
 |  | 
 |       ${sel_time}  ${set_sel_time}=  Identify SEL Time  ${time_difference_list[${i}]} | 
 |  | 
 |       # Set SEL Time via IPMI command. | 
 |       Set SEL Time Via IPMI  ${sel_time} | 
 |  | 
 |       # Clear the SEL. | 
 |       Clear The SEL | 
 |  | 
 |       # Get any Sensor available from Sensor list. | 
 |       ${sensor_name}=  Fetch One Threshold Sensor From Sensor List | 
 |  | 
 |       # Get Sensor ID from SDR Get "sensor" and Identify Sensor ID. | 
 |       ${sensor_data1}=  Fetch Sensor Details From SDR  ${sensor_name}  Sensor ID | 
 |       ${sensor_number}=  Get Bytes From SDR Sensor  ${sensor_data1} | 
 |  | 
 |       # Get Sensor Type from SDR Get "sensor" and identify Sensor Type. | 
 |       ${sensor_data2}=  Fetch Sensor Details From SDR  ${sensor_name}  Sensor Type (Threshold) | 
 |       ${sensor_type_id}=  Get Bytes From SDR Sensor  ${sensor_data2} | 
 |  | 
 |       # Add SEL Entry. | 
 |       ${sel_create_resp}=  Create SEL  ${sensor_type_id}  ${sensor_number} | 
 |  | 
 |       # Finds the last added sel entry. | 
 |       ${resp}=  Verify SEL Added  ${sensor_name} | 
 |  | 
 |       # Fetches the date of the last added SEL Entry. | 
 |       ${sel_entry_date}=  Fetch Added SEL Date  ${resp} | 
 |  | 
 |       # Identify and find the time difference is less than 60 seconds. | 
 |       # Finding the sensor details and execution may take up to a minute. | 
 |       # Compare  date and time of Set SEL with sel entry. | 
 |       ${d}=  Get Time Difference  ${sel_entry_date}  ${set_sel_time} | 
 |       Should Be True  ${d}<=60 | 
 |  | 
 |     END | 
 |  | 
 |  | 
 | *** Keywords *** | 
 |  | 
 | Time Sync Mode Change Through Redfish | 
 |     [Documentation]  Export IP, token and change the time sync to manual. | 
 |     [Arguments]   ${value} | 
 |  | 
 |     # Description of argument(s): | 
 |     # ${value}    Can be either ${FALSE} or ${TRUE}. | 
 |  | 
 |     # May be changed to WebView. | 
 |  | 
 |     # Changing Time Sync Mode to Manual. | 
 |     Change Time Sync Mode Via Redfish  ${value} | 
 |  | 
 |  | 
 | Change Time Sync Mode Via Redfish | 
 |     [Documentation]  To change the time sync mode via Redfish. | 
 |     [Arguments]   ${value} | 
 |  | 
 |     # Description of argument(s): | 
 |     # ${value}    Can be either ${FALSE} or ${TRUE} | 
 |  | 
 |     # Creates request body for Redfish url. | 
 |     ${mode}=  Create Dictionary  ProtocolEnabled=${value} | 
 |     ${data}=  Create Dictionary  NTP=${mode} | 
 |  | 
 |     # Patches the obtained body to the given url. | 
 |     Redfish.patch  ${REDFISH_NW_PROTOCOL_URI}  body=&{data} | 
 |     ...   valid_status_codes=[${HTTP_NO_CONTENT}] | 
 |  | 
 |     Sleep  ${NETWORK_RESTART_TIME} | 
 |  | 
 |  | 
 | Get SEL Time Command | 
 |     [Documentation]  Get SEL Time command. | 
 |  | 
 |     # The response will be 8 byte timestamp in hexadecimal. | 
 |     # example: If current date and time is "Wed May  4 18:55:00 UTC 2022", | 
 |     # then, ${get_sel_time} will be "07 cc 72 62". | 
 |     ${get_sel_time}=  Run IPMI Command | 
 |     ...  ${IPMI_RAW_CMD['SEL_entry']['Get_SEL_Time'][0]} | 
 |  | 
 |     RETURN    ${get_sel_time} | 
 |  | 
 |  | 
 | Set SEL Time Entry Via Raw Command | 
 |     [Documentation]  Set SEL Time command. | 
 |     [Arguments]  ${sel_date_raw} | 
 |  | 
 |     # Description of argument(s): | 
 |     # ${sel_date_raw}     Time to set in hexadecimal bytes. | 
 |     # Example: | 
 |     #    If date is 1st January 2022 12:30:00 PM, | 
 |     #    the hexadecimal timestamp is, 61D04948. | 
 |     #    then the request bytes are, | 
 |     #    ${sel_date_raw}     0x48 0x49 0xd0 0x61 | 
 |  | 
 |     Run IPMI Command  ${IPMI_RAW_CMD['SEL_entry']['Set_SEL_Time'][0]} ${sel_date_raw} | 
 |     Sleep  ${NETWORK_RESTART_TIME} | 
 |  | 
 |  | 
 | Clear The SEL | 
 |     [Documentation]  Clear SEL Command. | 
 |  | 
 |     # Clear the SEL. | 
 |     ${out}=  Run IPMI Standard Command  sel clear | 
 |     Should Contain  ${out}  Clearing SEL | 
 |     Sleep  2s | 
 |  | 
 |  | 
 | Verify SEL Added | 
 |     [Documentation]  Verify Added SEL. | 
 |     [Arguments]  ${sensor_name} | 
 |  | 
 |     # Description of argument(s): | 
 |     # sensor_name         Name of the sensor. | 
 |  | 
 |     ${resp}=  Run IPMI Standard Command  sel elist | 
 |     Should Not Contain  ${resp}  ${sel_no_entry_msg} | 
 |     ${get_sel_entry}=  Get Lines Containing String  ${resp}  ${sensor_name} | 
 |     ${sel_entry}=  Get Lines Containing String  ${get_sel_entry}  ${event_type} | 
 |     Should Contain  ${sel_entry}  ${event_dir}  msg=Add SEL Entry failed. | 
 |  | 
 |     RETURN  ${sel_entry} | 
 |  | 
 |  | 
 | Check Current Date Time Via IPMI | 
 |     [Documentation]  Verify Current Date and Time Via IPMI user command. | 
 |  | 
 |     ${resp}=  Run IPMI Standard Command  sel time get | 
 |     RETURN  ${resp} | 
 |  | 
 |  | 
 | Get Specific Sel Date | 
 |     [Documentation]  Gets initial time and adds year to the current date and returns future date. | 
 |     [Arguments]  ${year} | 
 |  | 
 |     # Description of argument(s): | 
 |     # ${year}             Can be any number of years (say 5 year). | 
 |  | 
 |     ${current_date}=  Get Current Date from BMC | 
 |  | 
 |     # Converting given years to days by multiplying with 365days and adding the days to current date. | 
 |     ${days}=  Evaluate  365*${year}+1 | 
 |     ${date}=  Add Time To Date | 
 |     ...  ${current_date}  ${days}d  result_format=%m/%d/%Y %H:%M:%S  date_format=%m/%d/%Y %H:%M:%S | 
 |  | 
 |     RETURN   ${date} | 
 |  | 
 |  | 
 | Converting Date to HexaDecimal | 
 |     [Documentation]  Converting the date into hexa decimal values. | 
 |     [Arguments]  ${date} | 
 |  | 
 |     # Description of argument(s): | 
 |     # ${date}             Can be any date in format %m/%d/%Y %H:%M:%S. | 
 |  | 
 |     ${epoch_date}=  Convert Date  ${date}  epoch  exclude_millis=yes  date_format=%m/%d/%Y %H:%M:%S | 
 |     ${date}=  Convert To Hex  ${epoch_date}  lowercase=yes | 
 |  | 
 |     # function calls from utils.py. | 
 |     # Length of the date byte should be 8 so that each bytes are separated. | 
 |     ${date}=  Zfill Data  ${date}  8 | 
 |     # To split every two characters to form one byte each. | 
 |     ${date}=  Split String With Index  ${date}  2 | 
 |     # Prefix every list index value with 0x. | 
 |     ${date}=  Prefix Bytes  ${date} | 
 |  | 
 |     # Reverse the bytes and join the list to form request Time stamp data. | 
 |     Reverse List  ${date} | 
 |     ${date}=  Evaluate  " ".join(${date}) | 
 |  | 
 |     RETURN  ${date} | 
 |  | 
 |  | 
 | Get Time Difference | 
 |     [Documentation]  Converting the date into hexa decimal values. | 
 |     [Arguments]  ${date1}  ${date2} | 
 |  | 
 |     # Description of argument(s): | 
 |     # ${date1}             Can be any date in format %m/%d/%Y %H:%M:%S. | 
 |     # ${date2}             Can be any date in format %m/%d/%Y %H:%M:%S. | 
 |  | 
 |     ${epoch_date1}=  Convert Date  ${date1}  epoch  exclude_millis=yes  date_format=%m/%d/%Y %H:%M:%S | 
 |     ${epoch_date2}=  Convert Date  ${date2}  epoch  exclude_millis=yes  date_format=%m/%d/%Y %H:%M:%S | 
 |  | 
 |     ${diff}=  Evaluate  int(${epoch_date1}) - int(${epoch_date2}) | 
 |  | 
 |     RETURN  ${diff} | 
 |  | 
 |  | 
 | Identify SEL Time | 
 |     [Documentation]  Modify SEL Time From BMC For Set Sel Time Command. | 
 |     [Arguments]  ${time} | 
 |  | 
 |     # Description of argument(s): | 
 |     # time             Can be any number of hours or minutes in format %H:%M:%S. | 
 |  | 
 |     # Gets BMC current date via date command. | 
 |     ${current_date}=  Get Current Date from BMC | 
 |  | 
 |     ${modifying_date_status}=  Run Keyword And Return Status  Should Contain  ${time}  + | 
 |  | 
 |     ${date_time}=  Set Variable If | 
 |     ...  ${modifying_date_status} == True  ${time.split("+")[-1]} | 
 |     ...  ${modifying_date_status} == False  ${time.split("-")[-1]} | 
 |  | 
 |     ${datetime} =  Set Variable If  ${modifying_date_status} == True | 
 |     ...    Add Time To Date | 
 |     ...    ${current_date}  ${date_time}  result_format=%m/%d/%Y %H:%M:%S  date_format=%m/%d/%Y %H:%M:%S | 
 |     ...  ELSE IF  ${modifying_date_status} == False | 
 |     ...    Subtract Time From Date | 
 |     ...    ${current_date}  ${date_time}  result_format=%m/%d/%Y %H:%M:%S  date_format=%m/%d/%Y %H:%M:%S | 
 |  | 
 |     #Set SEL Time. | 
 |     ${quoted_date}=  Fetch Date  ${datetime} | 
 |  | 
 |     RETURN  ${quoted_date}  ${datetime} | 
 |  | 
 |  | 
 | Set SEL Time Via IPMI | 
 |     [Documentation]  Set SEL Time for given date using IPMI. | 
 |     [Arguments]  ${date_time} | 
 |  | 
 |     # Description of argument(s): | 
 |     # ${date_time}       Can be any date in format %m/%d/%Y %H:%M:%S. | 
 |  | 
 |     ${resp}=  Run IPMI Standard Command  sel time set "${date_time}" | 
 |     Should Not Contain  ${resp}  Unspecified error | 
 |  | 
 |  | 
 | Test Setup Execution | 
 |     [Documentation]  Test Setup Execution. | 
 |  | 
 |     Redfish.Login | 
 |     # Change timesync mode to manual with timeout as per resource.robot. | 
 |     Time Sync Mode Change Through Redfish   ${FALSE} | 
 |     Sleep  ${NETWORK_TIMEOUT} | 
 |     Printn | 
 |  | 
 |  | 
 | Test Teardown Execution | 
 |     [Documentation]  For execution of Test teardown. | 
 |  | 
 |     Clear The SEL | 
 |  | 
 |     # Change TimeSync mode to NTP with Timeout as per default resource.robot. | 
 |     Time Sync Mode Change Through Redfish  ${TRUE} | 
 |     Sleep  ${NETWORK_TIMEOUT} | 
 |     Redfish.Logout | 
 |     FFDC On Test Case Fail |