blob: 728ce834856016fac4cee5ca397be964e77244b5 [file] [log] [blame]
*** Settings ***
Documentation This suite is for testing System time in Open BMC.
Resource ../lib/rest_client.robot
Resource ../lib/ipmi_client.robot
Resource ../lib/openbmc_ffdc.robot
Resource ../lib/state_manager.robot
Resource ../lib/resource.txt
Library OperatingSystem
Library DateTime
Test Setup Open Connection And Log In
Test Teardown Post Test Case Execution
Force Tags Clock_Time
*** Variables ***
${SYSTEM_TIME_INVALID} 01/01/1969 00:00:00
${SYSTEM_TIME_VALID} 02/29/2016 09:10:00
${ALLOWED_TIME_DIFF} 3
# Equivalent epoch time for 02/17/2017 04:11:40
${SYSTEM_TIME_VALID_EPOCH} ${1487304700000000}
*** Test Cases ***
Get System Time
[Documentation] Get system time using IPMI and verify that it matches
... with BMC date time.
[Tags] Get_System_Time
${resp}= Run IPMI Standard Command sel time get
${ipmidate}= Convert Date ${resp} date_format=%m/%d/%Y %H:%M:%S
... exclude_millis=yes
${bmcdate}= Get BMC Time Using IPMI
${diff}= Subtract Date From Date ${bmcdate} ${ipmidate}
${diff}= Convert To Number ${diff}
Should Be True ${diff} < ${ALLOWED_TIME_DIFF}
... Open BMC time does not match with IPMI sel time
Set Valid System Time
[Documentation] Set system time using IPMI and verify that it is
... correctly set in BMC.
[Tags] Set_Valid_System_Time
Set Time Owner ${HOST_OWNER}
Set Time Mode ${MANUAL_MODE}
${resp}= Run IPMI Standard Command sel time set "${SYSTEM_TIME_VALID}"
${setdate}= Convert Date ${SYSTEM_TIME_VALID}
... date_format=%m/%d/%Y %H:%M:%S exclude_millis=yes
${bmcdate}= Get BMC Time Using IPMI
${diff}= Subtract Date From Date ${bmcdate} ${setdate}
${diff}= Convert To Number ${diff}
Should Be True ${diff} < ${ALLOWED_TIME_DIFF}
... Open BMC time does not match with set time
Set Invalid System Time
[Documentation] Set system time with invalid time using IPMI and verify
... that it should throw error.
[Tags] Set_Invalid_System_Time
Set Time Owner ${HOST_OWNER}
Set Time Mode ${MANUAL_MODE}
${msg}= Run Keyword And Expect Error * Run IPMI Standard Command
... sel time set "${SYSTEM_TIME_INVALID}"
Should Start With ${msg} Specified time could not be parsed
Set System Time with no time
[Documentation] Set system time with no time using IPMI and verify
... that it should throw error.
[Tags] Set_System_Time_with_no_time
Set Time Owner ${HOST_OWNER}
Set Time Mode ${MANUAL_MODE}
${msg}= Run Keyword And Expect Error * Run IPMI Standard Command
... sel time set ""
Should Start With ${msg} Specified time could not be parsed
Set BMC Time With BMC And Manual
#Operation Owner Mode Status BMC Time Host Time
Set BMC Time ${BMC_OWNER} ${MANUAL_MODE} ok Set Change
[Documentation] Set BMC time when time owner is BMC and time mode is
... manual.
[Tags] Set_BMC_Time_With_BMC_And_Manual
[Template] Set Time Using REST
Set BMC Time With Both And Manual
#Operation Owner Mode Status BMC Time Host Time
Set BMC Time ${BOTH_OWNER} ${MANUAL_MODE} ok Set Change
[Documentation] Set BMC time when time owner is Both and time mode is
... manual.
[Tags] Set_BMC_Time_With_Both_And_Manual
[Template] Set Time Using REST
Set BMC Time With Split And Manual
#Operation Owner Mode Status BMC Time Host Time
Set BMC Time ${SPLIT_OWNER} ${MANUAL_MODE} ok Set No Change
[Documentation] Set BMC time when time owner is Split and time mode is
... manual.
[Tags] Set_BMC_Time_With_Split_And_Manual
[Template] Set Time Using REST
Set BMC Time With BMC And NTP
#Operation Owner Mode Status BMC Time Host Time
Set BMC Time ${BMC_OWNER} ${NTP_MODE} ok Not Set No Change
[Documentation] Set BMC time when time owner is BMC and time mode is
... NTP.
[Tags] Set_BMC_Time_With_BMC_And_NTP
[Template] Set Time Using REST
Set BMC Time With Host And Manual
#Operation Owner Mode Status BMC Time Host Time
Set BMC Time ${HOST_OWNER} ${MANUAL_MODE} ok Not Set No Change
[Documentation] Set BMC time when time owner is Host and time mode is
... Manual.
[Tags] Set_BMC_Time_With_Host_And_Manual
[Template] Set Time Using REST
Set BMC Time With Both And NTP
#Operation Owner Mode Status BMC Time Host Time
Set BMC Time ${BOTH_OWNER} ${NTP_MODE} ok Not Set No Change
[Documentation] Set BMC time when time owner is Both and time mode is
... NTP.
[Tags] Set_BMC_Time_With_Both_And_NTP
[Template] Set Time Using REST
Set BMC Time With Split And NTP
#Operation Owner Mode Status BMC Time Host Time
Set BMC Time ${SPLIT_OWNER} ${NTP_MODE} ok Not Set No Change
[Documentation] Set BMC time when time owner is Split and time mode is
... NTP.
[Tags] Set_BMC_Time_With_Split_And_NTP
[Template] Set Time Using REST
Set BMC Time With Host And NTP
#Operation Owner Mode Status BMC Time Host Time
Set BMC Time ${HOST_OWNER} ${NTP_MODE} ok Not Set No Change
[Documentation] Set BMC time when time owner is Host and time mode is
... NTP.
[Tags] Set_BMC_Time_With_Host_And_NTP
[Template] Set Time Using REST
Set Host Time With Host And Manual
#Operation Owner Mode Status BMC Time Host Time
Set Host Time ${HOST_OWNER} ${MANUAL_MODE} ok Change Set
[Documentation] Set host time when time owner is host and time mode is
... manual.
[Tags] Set_Host_Time_With_Host_And_Manual
[Template] Set Time Using REST
Set Host Time With Both And Manual
#Operation Owner Mode Status BMC Time Host Time
Set Host Time ${BOTH_OWNER} ${MANUAL_MODE} ok Change Set
[Documentation] Set host time when time owner is both and time mode is
... manual.
[Tags] Set_Host_Time_With_Both_And_Manual
[Template] Set Time Using REST
Set Host Time With Both And NTP
#Operation Owner Mode Status BMC Time Host Time
Set Host Time ${BOTH_OWNER} ${NTP_MODE} ok No Change Not Set
[Documentation] Set host time when time owner is both and time mode is
... NTP.
[Tags] Set_Host_Time_With_Both_And_NTP
[Template] Set Time Using REST
Set Host Time With Split And Manual
#Operation Owner Mode Status BMC Time Host Time
Set Host Time ${SPLIT_OWNER} ${MANUAL_MODE} ok No Change Set
[Documentation] Set host time when time owner is split and time mode is
... manual.
[Tags] Set_Host_Time_With_Split_And_Manual
[Template] Set Time Using REST
Set Host Time With Split And NTP
#Operation Owner Mode Status BMC Time HOST Time
Set Host Time ${SPLIT_OWNER} ${NTP_MODE} ok No Change Set
[Documentation] Set host time when time owner is split and time mode is
... NTP.
[Tags] Set_Host_Time_With_Split_And_NTP
[Template] Set Time Using REST
Set Host Time With BMC And Manual
#Operation Owner Mode Status BMC Time HOST Time
Set Host Time ${BMC_OWNER} ${MANUAL_MODE} ok No Change Not Set
[Documentation] Set host time when time owner is BMC and time mode is
... Manual.
[Tags] Set_Host_Time_With_BMC_And_Manual
[Template] Set Time Using REST
Set Host Time With BMC Owner NTP
#Operation Owner Mode Status BMC Time HOST Time
Set Host Time ${BMC_OWNER} ${NTP_MODE} ok No Change Not Set
[Documentation] Set host time when time owner is BMC and time mode is
... NTP.
[Tags] Set_Host_Time_With_BMC_And_NTP
[Template] Set Time Using REST
Set Host Time With Host And NTP
#Operation Owner Mode Status BMC Time Host Time
Set Host Time ${HOST_OWNER} ${NTP_MODE} ok Not Change No Set
[Documentation] Set host time when time owner is Host and time mode is
... NTP.
[Tags] Set_Host_Time_With_Host_And_NTP
[Template] Set Time Using REST
Set Invalid Time Mode
[Documentation] Set time mode with invalid value using REST and verify
... that it should throw error.
[Tags] Set_Invalid_Time_Mode
${timemode}=
... Set Variable xyz.openbmc_project.Time.Synchronization.Method.abc
${valueDict}= Create Dictionary data=${timemode}
${resp}= OpenBMC Put Request
... ${TIME_MANAGER_URI}sync_method/attr/TimeSyncMethod data=${valueDict}
${jsondata}= to JSON ${resp.content}
Should Be Equal ${jsondata['status']} error
${mode}= Read Attribute ${TIME_MANAGER_URI}sync_method TimeSyncMethod
Should Not Be Equal ${mode}
... xyz.openbmc_project.Time.Synchronization.Method.abc
Set Invalid Time Owner
[Documentation] Set time owner with invalid value using REST and verify
... that it should throw error.
[Tags] Set_Invalid_Time_Owner
${timeowner}= Set Variable xyz.openbmc_project.Time.Owner.Owners.xyz
${valueDict}= Create Dictionary data=${timeowner}
${resp}= OpenBMC Put Request
... ${TIME_MANAGER_URI}owner/attr/TimeOwner data=${valueDict}
${jsondata}= to JSON ${resp.content}
Should Be Equal ${jsondata['status']} error
${owner}= Read Attribute ${TIME_MANAGER_URI}owner TimeOwner
Should Not Be Equal ${owner} xyz.openbmc_project.Time.Owner.Owners.xyz
*** Keywords ***
Get BMC Time Using IPMI
[Documentation] Returns BMC time of the system via IPMI
${stdout} ${stderr} ${output}=
... Execute Command date "+%m/%d/%Y %H:%M:%S"
... return_stdout=True return_stderr= True return_rc=True
Should Be Equal ${output} ${0} msg=${stderr}
${resp}= Convert Date ${stdout} date_format=%m/%d/%Y %H:%M:%S
... exclude_millis=yes
Should Not Be Empty ${resp}
[Return] ${resp}
Set Time Owner
[Arguments] ${args}
[Documentation] Set time owner of the system via REST
${timeowner}= Set Variable ${args}
${valueDict}= Create Dictionary data=${timeowner}
${resp}= OpenBMC Put Request
... ${TIME_MANAGER_URI}owner/attr/TimeOwner data=${valueDict}
${jsondata}= to JSON ${resp.content}
${host_state}= Get Host State
Run Keyword If '${host_state}' == 'Off'
... Log System is in off state so owner change will get applied.
... ELSE Run keyword
... Initiate Host PowerOff
${owner}= Read Attribute ${TIME_MANAGER_URI}owner TimeOwner
Should Be Equal ${owner} ${args}
[Return] ${jsondata['status']}
Set Time Mode
[Arguments] ${args}
[Documentation] Set time mode of the system via REST
${timemode}= Set Variable ${args}
${valueDict}= Create Dictionary data=${timemode}
${resp}= OpenBMC Put Request
... ${TIME_MANAGER_URI}sync_method/attr/TimeSyncMethod data=${valueDict}
${jsondata}= to JSON ${resp.content}
Sleep 5s
${mode}= Read Attribute ${TIME_MANAGER_URI}sync_method TimeSyncMethod
Should Be Equal ${mode} ${args}
Get BMC Time Using REST
[Documentation] Returns BMC time of the system via REST
... Time Format : epoch time in microseconds
... e.g 1507809604687329
${resp}= Read Attribute ${TIME_MANAGER_URI}/bmc Elapsed
[Return] ${resp}
Get HOST Time Using REST
[Documentation] Returns HOST time of the system via REST
... Time Format : epoch time in microseconds
... e.g 1507809604687329
${resp}= Read Attribute ${TIME_MANAGER_URI}/host Elapsed
[Return] ${resp}
Set Time Using REST
[Arguments] ${operation} ${owner} ${mode} ${status} ${bmc_time}
... ${host_time}
[Documentation] Set BMC or Host time on system via REST.
... Description of arguments:
... operation : Set BMC/Host time
... owner: Time owner
... mode: Time mode
... status: Expected status of set BMC time URI
... bmc_time: Status of BMC time after operation
... host_time: Status of HOST time after operation
... Set - Given time is set
... Not Set - Given time is not set
... Change - time is change
... No Change - time is not change
Set Time Owner ${owner}
Set Time Mode ${mode}
${setdate}= Set Variable ${SYSTEM_TIME_VALID_EPOCH}
${time_owner_url}= Set Variable If
... '${operation}' == 'Set BMC Time' ${TIME_MANAGER_URI}bmc
... '${operation}' == 'Set Host Time' ${TIME_MANAGER_URI}host
${start_time}= Get Current Date
${old_bmc_time}= Get BMC Time Using REST
${old_host_time}= Get HOST Time Using REST
${valueDict}= Create Dictionary data=${SYSTEM_TIME_VALID_EPOCH}
${resp}= OpenBMC Put Request
... ${time_owner_url}/attr/Elapsed data=${valueDict}
${jsondata}= to JSON ${resp.content}
Should Be Equal As Strings ${jsondata['status']} ${status}
${new_bmc_time}= Get BMC Time Using REST
${new_host_time}= Get HOST Time Using REST
${end_time}= Get Current Date
${time_duration}= Subtract Date From Date ${start_time} ${end_time}
${time_duration} Evaluate abs(${time_duration})
# Convert epoch to date format: YYYY-MM-DD hh:mm:ss.mil
${setdate}= Convert epoch to date ${setdate}
${new_bmc_time}= Convert epoch to date ${new_bmc_time}
${old_bmc_time}= Convert epoch to date ${old_bmc_time}
${new_host_time}= Convert epoch to date ${new_host_time}
${old_host_time}= Convert epoch to date ${old_host_time}
${bmc_diff_set_new}=
... Subtract Date From Date ${setdate} ${new_bmc_time}
${bmc_diff_set_new}= Evaluate abs(${bmc_diff_set_new})
${bmc_diff_old_new}=
... Subtract Date From Date ${old_bmc_time} ${new_bmc_time}
${bmc_diff_old_new}= Evaluate abs(${bmc_diff_old_new})
${host_diff_set_new}=
... Subtract Date From Date ${setdate} ${new_host_time}
${host_diff_set_new}= Evaluate abs(${host_diff_set_new})
${host_diff_old_new}=
... Subtract Date From Date ${old_host_time} ${new_host_time}
${host_diff_old_new}= Evaluate abs(${host_diff_old_new})
Run Keyword If '${bmc_time}' == 'Not Set'
... Should Be True ${bmc_diff_set_new} >= ${time_duration}
... ELSE IF '${bmc_time}' == 'Set'
... Should Be True ${bmc_diff_set_new} <= ${time_duration}
... ELSE IF '${bmc_time}' == 'No Change'
... Should Be True ${bmc_diff_old_new} <= ${time_duration}
... ELSE IF '${bmc_time}' == 'Change'
... Should Be True ${bmc_diff_old_new} >= ${time_duration}
Run Keyword If '${host_time}' == 'No Change'
... Should Be True ${host_diff_old_new} <= ${time_duration}
... ELSE IF '${host_time}' == 'Change'
... Should Be True ${host_diff_old_new} >= ${time_duration}
... ELSE IF '${host_time}' == 'Not Set'
... Should Be True ${host_diff_set_new} >= ${time_duration}
... ELSE IF '${host_time}' == 'Set'
... Should Be True ${host_diff_set_new} <= ${time_duration}
Convert epoch to date
[Documentation] Convert epoch time to date format.
[Arguments] ${epoch_time}
# Description of argument(s):
# epoch_time epoch time in milliseconds.
# (e.g. 1487304700000000)
# Convert epoch_time into floating point number.
${epoch_time}= Convert To Number ${epoch_time}
# Convert epoch time from microseconds to seconds
${epoch_time_sec}= Evaluate ${epoch_time}/1000000
# Convert epoch time to date format: YYYY-MM-DD hh:mm:ss.mil
# e.g. 2017-02-16 22:14:11.000
${date}= Convert Date ${epoch_time_sec}
[Return] ${date}
Post Test Case Execution
[Documentation] Do the post test teardown.
... 1. Capture FFDC on test failure.
... 2. Sets defaults for time mode and owner.
... 3. Close all open SSH connections.
FFDC On Test Case Fail
Set Time Owner ${BMC_OWNER}
Set Time Mode ${NTP_MODE}
Close All Connections