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