| *** 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 |
| |
| *** Variables *** |
| ${SYSTEM_TIME_INVALID} 01/01/1969 00:00:00 |
| ${SYSTEM_TIME_VALID} 02/29/2016 09:10:00 |
| ${SYSTEM_TIME_VALID_EPOCH} 1456737000 #Equivalent epoch time for 02/29/2016 09:10:00 |
| ${ALLOWED_TIME_DIFF} 3 |
| ${SETTING_HOST} ${SETTINGS_URI}host0 |
| |
| *** 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 |
| Set Time Mode MANUAL |
| |
| ${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 |
| Set Time Mode MANUAL |
| |
| ${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 |
| Set Time Mode MANUAL |
| |
| ${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 MANUAL 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 MANUAL 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 MANUAL 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 NTP error 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 MANUAL error 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 NTP error 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 NTP error 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 Host Time With Host And Manual |
| #Operation Owner Mode Status BMC Time Host Time |
| Set Host Time HOST MANUAL 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 MANUAL 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 NTP ok No Change 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 MANUAL 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 NTP 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 MANUAL error 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 NTP error 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 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 abc |
| ${valueDict}= Create Dictionary data=${timemode} |
| |
| ${resp}= OpenBMC Put Request |
| ... ${SETTING_HOST}/attr/time_mode data=${valueDict} |
| ${jsondata}= to JSON ${resp.content} |
| Should Be Equal ${jsondata['status']} error |
| |
| ${mode}= Read Attribute ${SETTING_HOST} time_mode |
| Should Not Be Equal ${mode} 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 |
| ${valueDict}= Create Dictionary data=${timeowner} |
| |
| ${resp}= OpenBMC Put Request |
| ... ${SETTING_HOST}/attr/time_owner data=${valueDict} |
| ${jsondata}= to JSON ${resp.content} |
| Should Be Equal ${jsondata['status']} error |
| |
| ${owner}= Read Attribute ${SETTING_HOST} time_owner |
| Should Not Be Equal ${owner} 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 |
| ... ${SETTING_HOST}/attr/time_owner 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 ${SETTING_HOST} time_owner |
| Should Be Equal ${owner} ${args} |
| |
| ${current_mode}= |
| ... Read Attribute ${TIME_MANAGER_URI.rstrip("/")} curr_time_owner |
| Should Be Equal ${current_mode} ${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 |
| ... ${SETTING_HOST}/attr/time_mode data=${valueDict} |
| ${jsondata}= to JSON ${resp.content} |
| Sleep 5s |
| |
| ${mode}= Read Attribute ${SETTING_HOST} time_mode |
| Should Be Equal ${mode} ${args} |
| |
| ${current_mode}= |
| ... Read Attribute ${TIME_MANAGER_URI.rstrip("/")} curr_time_mode |
| Should Be Equal ${current_mode} ${args} |
| |
| Get BMC Time Using REST |
| [Documentation] Returns BMC time of the system via REST |
| ... Time Format : YYYY-MM-DD hh:mm:ss.mil |
| ... eg. 2016-12-14 07:09:58.000 |
| |
| @{time_owner}= Create List BMC |
| ${data}= Create Dictionary data=@{time_owner} |
| ${resp}= OpenBMC Post Request |
| ... ${TIME_MANAGER_URI}action/GetTime data=${data} |
| ${jsondata}= To JSON ${resp.content} |
| ${time_epoch}= Get From List ${jsondata["data"]} 0 |
| ${resp}= Convert Date |
| ... ${time_epoch} date_format=%a %b %d %H:%M:%S %Y %Z |
| [Return] ${resp} |
| |
| Get HOST Time Using REST |
| [Documentation] Returns HOST time of the system via REST |
| ... Time Format : YYYY-MM-DD hh:mm:ss.mil |
| ... eg. 2016-12-14 07:09:58.000 |
| |
| @{time_owner}= Create List HOST |
| ${data}= Create Dictionary data=@{time_owner} |
| ${resp}= OpenBMC Post Request |
| ... ${TIME_MANAGER_URI}action/GetTime data=${data} |
| ${jsondata}= To JSON ${resp.content} |
| ${time_epoch}= Get From List ${jsondata["data"]} 0 |
| ${resp}= Convert Date |
| ... ${time_epoch} date_format=%a %b %d %H:%M:%S %Y %Z |
| [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}= Convert Date ${SYSTEM_TIME_VALID} |
| ... date_format=%m/%d/%Y %H:%M:%S exclude_millis=yes |
| |
| @{bmc_date_list}= Create List BMC ${setdate} |
| @{host_date_list}= Create List HOST ${SYSTEM_TIME_VALID_EPOCH} |
| |
| ${time_owner_date}= Set Variable If |
| ... '${operation}' == 'Set BMC Time' ${bmc_date_list} |
| ... '${operation}' == 'Set Host Time' ${host_date_list} |
| |
| ${start_time}= Get Current Date |
| |
| ${old_bmc_time}= Get BMC Time Using REST |
| ${old_host_time}= Get HOST Time Using REST |
| |
| ${data}= Create Dictionary data=${time_owner_date} |
| ${resp}= OpenBMC Post Request |
| ... ${TIME_MANAGER_URI}action/SetTime data=${data} |
| ${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}) |
| |
| ${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} |
| |
| |
| 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 |
| Set Time Mode NTP |
| Close All Connections |