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