1*** Settings *** 2Documentation Test BMC manager time functionality. 3Resource ../../lib/resource.robot 4Resource ../../lib/bmc_redfish_resource.robot 5Resource ../../lib/common_utils.robot 6Resource ../../lib/openbmc_ffdc.robot 7Resource ../../lib/utils.robot 8Resource ../../lib/rest_client.robot 9Library ../../lib/gen_robot_valid.py 10 11Test Setup Printn 12Test Teardown Test Teardown Execution 13Suite Setup Suite Setup Execution 14Suite Teardown Suite Teardown Execution 15 16*** Variables *** 17${max_time_diff_in_seconds} 6 18# The "offset" consists of the value "26" specified for hours. Redfish will 19# convert that to the next day + 2 hours. 20${date_time_with_offset} 2019-04-25T26:24:46+00:00 21${expected_date_time} 2019-04-26T02:24:46+00:00 22${invalid_datetime} "2019-04-251T12:24:46+00:00" 23${ntp_server_1} 9.9.9.9 24${ntp_server_2} 2.2.3.3 25&{original_ntp} &{EMPTY} 26${year_without_ntp} 1970 27 28*** Test Cases *** 29 30Verify Redfish BMC Time 31 [Documentation] Verify that date/time obtained via redfish matches 32 ... date/time obtained via BMC command line. 33 [Tags] Verify_Redfish_BMC_Time 34 35 ${redfish_date_time}= Redfish Get DateTime 36 ${cli_date_time}= CLI Get BMC DateTime 37 ${time_diff}= Subtract Date From Date ${cli_date_time} 38 ... ${redfish_date_time} 39 ${time_diff}= Evaluate abs(${time_diff}) 40 Rprint Vars redfish_date_time cli_date_time time_diff 41 Should Be True ${time_diff} < ${max_time_diff_in_seconds} 42 ... The difference between Redfish time and CLI time exceeds the allowed time difference. 43 44 45Verify Set Time Using Redfish 46 [Documentation] Verify set time using redfish API. 47 [Tags] Verify_Set_Time_Using_Redfish 48 49 Set Time To Manual Mode 50 51 ${old_bmc_time}= CLI Get BMC DateTime 52 # Add 3 days to current date. 53 ${new_bmc_time}= Add Time to Date ${old_bmc_time} 3 Days 54 Redfish Set DateTime ${new_bmc_time} 55 ${cli_bmc_time}= CLI Get BMC DateTime 56 ${time_diff}= Subtract Date From Date ${cli_bmc_time} 57 ... ${new_bmc_time} 58 ${time_diff}= Evaluate abs(${time_diff}) 59 Rprint Vars old_bmc_time new_bmc_time cli_bmc_time time_diff max_time_diff_in_seconds 60 Should Be True ${time_diff} < ${max_time_diff_in_seconds} 61 ... The difference between Redfish time and CLI time exceeds the allowed time difference. 62 # Setting back to old bmc time. 63 Redfish Set DateTime ${old_bmc_time} 64 65 66Verify Set DateTime With Offset Using Redfish 67 [Documentation] Verify set DateTime with offset using redfish API. 68 [Tags] Verify_Set_DateTime_With_Offset_Using_Redfish 69 [Teardown] Run Keywords Redfish Set DateTime AND FFDC On Test Case Fail 70 71 Redfish Set DateTime ${date_time_with_offset} 72 ${cli_bmc_time}= CLI Get BMC DateTime 73 74 ${date_time_diff}= Subtract Date From Date ${cli_bmc_time} 75 ... ${expected_date_time} exclude_millis=yes 76 ${date_time_diff}= Convert to Integer ${date_time_diff} 77 Rprint Vars date_time_with_offset expected_date_time cli_bmc_time 78 ... date_time_diff max_time_diff_in_seconds 79 Valid Range date_time_diff 0 ${max_time_diff_in_seconds} 80 81 82Verify Set DateTime With Invalid Data Using Redfish 83 [Documentation] Verify error while setting invalid DateTime using Redfish. 84 [Tags] Verify_Set_DateTime_With_Invalid_Data_Using_Redfish 85 86 Redfish Set DateTime ${invalid_datetime} valid_status_codes=[${HTTP_BAD_REQUEST}] 87 88 89Verify DateTime Persists After Reboot 90 [Documentation] Verify date persists after BMC reboot. 91 [Tags] Verify_DateTime_Persists_After_Reboot 92 93 # Synchronize BMC date/time to local system date/time. 94 ${local_system_time}= Get Current Date 95 Redfish Set DateTime ${local_system_time} 96 Redfish OBMC Reboot (off) 97 Redfish.Login 98 ${bmc_time}= CLI Get BMC DateTime 99 ${local_system_time}= Get Current Date 100 ${time_diff}= Subtract Date From Date ${bmc_time} 101 ... ${local_system_time} 102 ${time_diff}= Evaluate abs(${time_diff}) 103 Rprint Vars local_system_time bmc_time time_diff max_time_diff_in_seconds 104 Should Be True ${time_diff} < ${max_time_diff_in_seconds} 105 ... The difference between Redfish time and CLI time exceeds the allowed time difference. 106 107 108Verify NTP Server Set 109 [Documentation] Patch NTP servers and verify NTP servers is set. 110 [Tags] Verify_NTP_Server_Set 111 [Setup] Set NTP state ${True} 112 113 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} 114 ... body={'NTP':{'NTPServers': ['${ntp_server_1}', '${ntp_server_2}']}} 115 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 116 117 # NTP network take few seconds to reload. 118 Wait Until Keyword Succeeds 30 sec 10 sec Verify NTP Servers Are Populated 119 120Verify NTP Server Value Not Duplicated 121 [Documentation] Verify NTP servers value not same for both primary and secondary server. 122 [Tags] Verify_NTP_Server_Value_Not_Duplicated 123 124 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} 125 ... body={'NTP':{'NTPServers': ['${ntp_server_1}', '${ntp_server_1}']}} 126 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 127 ${network_protocol}= Redfish.Get Properties ${REDFISH_NW_PROTOCOL_URI} 128 Should Contain X Times ${network_protocol["NTP"]["NTPServers"]} ${ntp_server_1} 1 129 ... msg=NTP primary and secondary server values should not be same. 130 131 132Verify NTP Server Setting Persist After BMC Reboot 133 [Documentation] Verify NTP server setting persist after BMC reboot. 134 [Tags] Verify_NTP_Server_Setting_Persist_After_BMC_Reboot 135 [Setup] Set NTP state ${True} 136 137 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} 138 ... body={'NTP':{'NTPServers': ['${ntp_server_1}', '${ntp_server_2}']}} 139 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 140 Redfish OBMC Reboot (off) 141 Redfish.Login 142 143 # NTP network take few seconds to reload. 144 Wait Until Keyword Succeeds 30 sec 10 sec Verify NTP Servers Are Populated 145 146 147Verify Enable NTP 148 [Documentation] Verify NTP protocol mode can be enabled. 149 [Teardown] Restore NTP Mode 150 [Tags] Verify_Enable_NTP 151 152 ${original_ntp}= Redfish.Get Attribute ${REDFISH_NW_PROTOCOL_URI} NTP 153 Set Suite Variable ${original_ntp} 154 Rprint Vars original_ntp 155 # The following patch command should set the ["NTP"]["ProtocolEnabled"] property to "True". 156 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} body={'NTP':{'ProtocolEnabled': ${True}}} 157 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 158 Wait Until Keyword Succeeds 1 min 5 sec 159 ... Verify System Time Sync Status ${True} 160 ${ntp}= Redfish.Get Attribute ${REDFISH_NW_PROTOCOL_URI} NTP 161 Rprint Vars ntp 162 Valid Value ntp["ProtocolEnabled"] valid_values=[True] 163 164 165Verify Immediate Consumption Of BMC Date 166 [Documentation] Verify immediate change in BMC date time. 167 [Tags] Verify_Immediate_Consumption_Of_BMC_Date 168 [Setup] Run Keywords Set Time To Manual Mode AND 169 ... Redfish Set DateTime valid_status_codes=[${HTTP_OK}] 170 [Teardown] Run Keywords FFDC On Test Case Fail AND 171 ... Redfish Set DateTime valid_status_codes=[${HTTP_OK}] 172 [Template] Set BMC Date And Verify 173 174 # host_state 175 on 176 off 177 178 179Verify Set DateTime With NTP Enabled 180 [Documentation] Verify whether set managers dateTime is restricted with NTP enabled. 181 [Tags] Verify_Set_DateTime_With_NTP_Enabled 182 183 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} body={'NTP':{'ProtocolEnabled': ${True}}} 184 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 185 ${ntp}= Redfish.Get Attribute ${REDFISH_NW_PROTOCOL_URI} NTP 186 Valid Value ntp["ProtocolEnabled"] valid_values=[True] 187 ${local_system_time}= Get Current Date 188 Redfish Set DateTime ${local_system_time} 189 ... valid_status_codes=[${HTTP_BAD_REQUEST}, ${HTTP_INTERNAL_SERVER_ERROR}] 190 191 192*** Keywords *** 193 194 195Test Teardown Execution 196 [Documentation] Do the post test teardown. 197 198 FFDC On Test Case Fail 199 200 201Redfish Get DateTime 202 [Documentation] Returns BMC Datetime value from Redfish. 203 204 ${date_time}= Redfish.Get Attribute ${REDFISH_BASE_URI}Managers/${MANAGER_ID} DateTime 205 [Return] ${date_time} 206 207 208Redfish Set DateTime 209 [Documentation] Set DateTime using Redfish. 210 [Arguments] ${date_time}=${EMPTY} &{kwargs} 211 # Description of argument(s): 212 # date_time New time to set for BMC (eg. 213 # "2019-06-30 09:21:28"). If this value is 214 # empty, it will be set to the UTC current 215 # date time of the local system. 216 # kwargs Additional parameters to be passed directly to 217 # th Redfish.Patch function. A good use for 218 # this is when testing a bad date-time, the 219 # caller can specify 220 # valid_status_codes=[${HTTP_BAD_REQUEST}]. 221 222 # Assign default value of UTC current date time if date_time is empty. 223 ${date_time}= Run Keyword If 224 ... '${date_time}' == '${EMPTY}' Get Current Date time_zone=UTC 225 ... ELSE 226 ... Set Variable ${date_time} 227 Wait Until Keyword Succeeds 1min 5sec 228 ... Redfish.Patch ${REDFISH_BASE_URI}Managers/${MANAGER_ID} body={'DateTime': '${date_time}'} &{kwargs} 229 230 231Set Time To Manual Mode 232 [Documentation] Set date time to manual mode via Redfish. 233 234 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} body={'NTP':{'ProtocolEnabled': ${False}}} 235 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 236 237 238Restore NTP Mode 239 [Documentation] Restore the original NTP mode. 240 241 242 Return From Keyword If &{original_ntp} == &{EMPTY} 243 Print Timen Restore NTP Mode. 244 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} 245 ... body={'NTP':{'ProtocolEnabled': ${original_ntp["ProtocolEnabled"]}}} 246 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 247 248 249Suite Setup Execution 250 [Documentation] Do the suite level setup. 251 252 Printn 253 Redfish.Login 254 Get NTP Initial Status 255 ${old_date_time}= CLI Get BMC DateTime 256 ${year_status}= Run Keyword And Return Status Should Not Contain ${old_date_time} ${year_without_ntp} 257 Run Keyword If ${year_status} == False 258 ... Enable NTP And Add NTP Address 259 Set Time To Manual Mode 260 261 262Suite Teardown Execution 263 [Documentation] Do the suite level teardown. 264 265 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} 266 ... body={'NTP':{'NTPServers': ['${EMPTY}', '${EMPTY}']}} 267 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 268 Set Time To Manual Mode 269 Restore NTP Status 270 Redfish.Logout 271 272 273Set NTP state 274 [Documentation] Set NTP service inactive. 275 [Arguments] ${state} 276 277 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} body={'NTP':{'ProtocolEnabled': ${state}}} 278 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 279 280 281Get NTP Initial Status 282 [Documentation] Get NTP service Status. 283 284 ${original_ntp}= Redfish.Get Attribute ${REDFISH_NW_PROTOCOL_URI} NTP 285 Set Suite Variable ${original_ntp} 286 287 288Restore NTP Status 289 [Documentation] Restore NTP Status. 290 291 Run Keyword If '${original_ntp["ProtocolEnabled"]}' == 'True' 292 ... Set NTP state ${TRUE} 293 ... ELSE Set NTP state ${FALSE} 294 295 296Set BMC Date And Verify 297 [Documentation] Set BMC Date Time at a given host state and verify. 298 [Arguments] ${host_state} 299 # Description of argument(s): 300 # host_state Host state at which date time will be updated for verification 301 # (eg. on, off). 302 303 Run Keyword If '${host_state}' == 'on' 304 ... Redfish Power On stack_mode=skip 305 ... ELSE 306 ... Redfish Power off stack_mode=skip 307 ${current_date}= Get Current Date time_zone=UTC 308 ${new_value}= Subtract Time From Date ${current_date} 1 day 309 Redfish Set DateTime ${new_value} valid_status_codes=[${HTTP_OK}] 310 ${current_value}= Redfish Get DateTime 311 ${time_diff}= Subtract Date From Date ${current_value} ${new_value} 312 Should Be True '${time_diff}'<='3' 313 314Verify NTP Servers Are Populated 315 [Documentation] Redfish GET request /redfish/v1/Managers/${MANAGER_ID}/NetworkProtocol response 316 ... and verify if NTP servers are populated. 317 318 ${network_protocol}= Redfish.Get Properties ${REDFISH_NW_PROTOCOL_URI} 319 Should Contain ${network_protocol["NTP"]["NTPServers"]} ${ntp_server_1} 320 ... msg=NTP server value ${ntp_server_1} not stored. 321 Should Contain ${network_protocol["NTP"]["NTPServers"]} ${ntp_server_2} 322 ... msg=NTP server value ${ntp_server_2} not stored. 323 324 325Verify System Time Sync Status 326 [Documentation] Verify the status of service systemd-timesyncd matches the NTP protocol enabled state. 327 [Arguments] ${expected_sync_status}=${True} 328 329 # Description of argument(s): 330 # expected_sync_status expected status at which NTP protocol enabled will be updated for verification 331 # (eg. True, False). 332 333 ${resp}= BMC Execute Command 334 ... systemctl status systemd-timesyncd 335 ... ignore_err=${1} 336 ${sync_status}= Get Lines Matching Regexp ${resp[0]} .*Active.* 337 Run Keyword If ${expected_sync_status}==${True} 338 ... Should Contain ${sync_status} active (running) 339 Run Keyword If ${expected_sync_status}==${False} 340 ... Should Contain ${sync_status} inactive (dead) 341 342Enable NTP And Add NTP Address 343 [Documentation] Enable NTP Protocol and Add NTP Address. 344 345 Set NTP state ${TRUE} 346 347 Redfish.Patch ${REDFISH_NW_PROTOCOL_URI} body={'NTP':{'NTPServers': ${NTP_SERVER_ADDRESSES}}} 348 ... valid_status_codes=[${HTTP_OK}, ${HTTP_NO_CONTENT}] 349 350 Wait Until Keyword Succeeds 1 min 10 sec Check Date And Time Was Changed 351 352Check Date And Time Was Changed 353 [Documentation] Verify date was current date and time. 354 355 ${new_date_time}= CLI Get BMC DateTime 356 Should Not Contain ${new_date_time} ${year_without_ntp} 357