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