1*** Settings ***
2Resource                ../lib/resource.txt
3Resource                ../lib/rest_client.robot
4Resource                ../lib/connection_client.robot
5Library                 DateTime
6Library                 Process
7Library                 OperatingSystem
8Library                 gen_print.py
9Library                 gen_robot_print.py
10
11*** Variables ***
12${SYSTEM_SHUTDOWN_TIME}       ${5}
13${dbuscmdBase}
14...  dbus-send --system --print-reply --dest=${OPENBMC_BASE_DBUS}.settings.Host
15${dbuscmdGet}
16...  ${SETTINGS_URI}host0  org.freedesktop.DBus.Properties.Get
17# Enable when ready with openbmc/openbmc-test-automation#203
18#${dbuscmdString}=  string:"xyz.openbmc_project.settings.Host" string:
19${dbuscmdString}=   string:"org.openbmc.settings.Host" string:
20
21# Assign default value to QUIET for programs which may not define it.
22${QUIET}  ${0}
23${bmc_mem_free_cmd}=   free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f4
24${bmc_mem_total_cmd}=   free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2
25${bmc_cpu_usage_cmd}=   top -n 1  | grep CPU: | cut -c 7-9
26${HOST_SETTING}    ${SETTINGS_URI}host0
27# /run/initramfs/ro associate filesystem  should be 100% full always
28${bmc_file_system_usage_cmd}=
29...  df -h | grep -v /run/initramfs/ro | cut -c 52-54 | grep 100 | wc -l
30
31${BOOT_TIME}     ${0}
32${BOOT_COUNT}    ${0}
33${devicetree_base}  /sys/firmware/devicetree/base/model
34
35*** Keywords ***
36
37Get BMC System Model
38    [Documentation]  Get the BMC model from the device tree.
39
40    ${bmc_model}  ${stderr}=  Execute Command
41    ...  cat ${devicetree_base} | cut -d " " -f 1  return_stderr=True
42    Should Be Empty  ${stderr}
43    Should Not Be Empty  ${bmc_model}
44    [Return]  ${bmc_model}
45
46Verify BMC System Model
47    [Documentation]  Verify the BMC model with ${OPENBMC_MODEL}.
48    [Arguments]  ${bmc_model}
49
50    ${tmp_bmc_model}=  Fetch From Right  ${OPENBMC_MODEL}  /
51    ${tmp_bmc_model}=  Fetch From Left  ${tmp_bmc_model}  .
52    ${ret}=  Run Keyword And Return Status  Should Contain  ${bmc_model}
53    ...  ${tmp_bmc_model}  ignore_case=True
54    [Return]  ${ret}
55
56Wait For Host To Ping
57    [Arguments]  ${host}  ${timeout}=${OPENBMC_REBOOT_TIMEOUT}min
58    ...          ${interval}=5 sec
59
60    # host      The DNS name or IP of the host to ping.
61    # timeout   The amount of time after which attempts to ping cease.
62    # interval  The amount of time in between attempts to ping.
63
64    Wait Until Keyword Succeeds  ${timeout}  ${interval}  Ping Host  ${host}
65
66Ping Host
67    [Arguments]     ${host}
68    Should Not Be Empty    ${host}   msg=No host provided
69    ${RC}   ${output}=     Run and return RC and Output    ping -c 4 ${host}
70    Log     RC: ${RC}\nOutput:\n${output}
71    Should be equal     ${RC}   ${0}
72
73Get Boot Progress
74    [Arguments]  ${quiet}=${QUIET}
75
76    ${state}=  Read Attribute  ${OPENBMC_BASE_URI}sensors/host/BootProgress
77    ...  value  quiet=${quiet}
78    [Return]  ${state}
79
80Is Power On
81    ${state}=  Get Power State
82    Should be equal  ${state}  ${1}
83
84Is Power Off
85    ${state}=  Get Power State
86    Should be equal  ${state}  ${0}
87
88Initiate Power On
89    [Documentation]  Initiates the power on and waits until the Is Power On
90    ...  keyword returns that the power state has switched to on.
91    [Arguments]  ${wait}=${1}
92
93    @{arglist}=   Create List
94    ${args}=     Create Dictionary    data=@{arglist}
95    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  powerOn
96    ...  data=${args}
97    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
98
99    # Does caller want to wait for power on status?
100    Run Keyword If  '${wait}' == '${0}'  Return From Keyword
101    Wait Until Keyword Succeeds  3 min  10 sec  Is Power On
102
103Initiate Power Off
104    [Documentation]  Initiates the power off and waits until the Is Power Off
105    ...  keyword returns that the power state has switched to off.
106    @{arglist}=   Create List
107    ${args}=     Create Dictionary    data=@{arglist}
108    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  powerOff
109    ...  data=${args}
110    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
111    Wait Until Keyword Succeeds  1 min  10 sec  Is Power Off
112
113Initiate OS Host Power Off
114    [Documentation]  Initiate an OS reboot.
115    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
116    ...          ${os_password}=${OS_PASSWORD}
117
118    # Description of arguments:
119    # os_host      The DNS name or IP of the OS.
120    # os_username  The username to be used to sign in to the OS.
121    # os_password  The password to be used to sign in to the OS.
122
123    SSHLibrary.Open connection  ${os_host}
124    Login  ${os_username}  ${os_password}
125    ${cmd_buf}  Catenate  shutdown
126    Start Command  ${cmd_buf}
127    SSHLibrary.Close Connection
128
129Initiate OS Host Reboot
130    [Documentation]  Initiate an OS reboot.
131    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
132    ...          ${os_password}=${OS_PASSWORD}
133
134    # Description of arguments:
135    # os_host      The DNS name or IP of the OS.
136    # os_username  The username to be used to sign in to the OS.
137    # os_password  The password to be used to sign in to the OS.
138
139    SSHLibrary.Open connection  ${os_host}
140    Login  ${os_username}  ${os_password}
141    ${cmd_buf}  Catenate  reboot
142    Start Command  ${cmd_buf}
143    SSHLibrary.Close Connection
144
145Initiate Auto Reboot
146    [Documentation]  Initiate an auto reboot.
147
148    # Set the auto reboot policy.
149    Set Auto Reboot  yes
150
151    SSHLibrary.Open connection  ${openbmc_host}
152    Login  ${openbmc_username}  ${openbmc_password}
153
154    # Set the watchdog timer.  Note: 5000 = milliseconds which is 5 seconds.
155    ${cmd_buf}=  Catenate  /usr/sbin/mapper call /org/openbmc/watchdog/host0
156    ...  org.openbmc.Watchdog set i 5000
157    ${output}  ${stderr}  ${rc}=  Execute Command  ${cmd_buf}
158    ...  return_stderr=True  return_rc=True
159    Should Be Empty  ${stderr}
160    Should be equal  ${rc}  ${0}
161
162    # Start the watchdog.
163    ${cmd_buf}=  Catenate  /usr/sbin/mapper call /org/openbmc/watchdog/host0
164    ...  org.openbmc.Watchdog start
165    ${output}  ${stderr}  ${rc}=  Execute Command  ${cmd_buf}
166    ...  return_stderr=True  return_rc=True
167    Should Be Empty  ${stderr}
168    Should be equal  ${rc}  ${0}
169
170Trigger Warm Reset
171    log to console    "Triggering warm reset"
172    ${data}=   create dictionary   data=@{EMPTY}
173    ${resp}=  openbmc post request
174    ...  ${OPENBMC_BASE_URI}control/bmc0/action/warmReset  data=${data}
175    Should Be Equal As Strings      ${resp.status_code}     ${HTTP_OK}
176    ${session_active}=   Check If warmReset is Initiated
177    Run Keyword If   '${session_active}' == '${True}'
178    ...    Fail   msg=warm reset didn't occur
179
180    Sleep   ${SYSTEM_SHUTDOWN_TIME}min
181    Check If BMC Is Up
182
183Check OS
184    [Documentation]  Attempts to ping the host OS and then checks that the host
185    ...              OS is up by running an SSH command.
186
187    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
188    ...          ${os_password}=${OS_PASSWORD}  ${quiet}=${QUIET}
189    ...          ${print_string}=${EMPTY}
190    [Teardown]  SSHLibrary.Close Connection
191
192    # os_host           The DNS name/IP of the OS host associated with our BMC.
193    # os_username       The username to be used to sign on to the OS host.
194    # os_password       The password to be used to sign on to the OS host.
195    # quiet             Indicates whether this keyword should write to console.
196    # print_string      A string to be printed before checking the OS.
197
198    rprint  ${print_string}
199
200    # Attempt to ping the OS. Store the return code to check later.
201    ${ping_rc}=  Run Keyword and Return Status  Ping Host  ${os_host}
202
203    SSHLibrary.Open connection  ${os_host}
204
205    ${status}  ${msg}=  Run Keyword And Ignore Error  Login  ${os_username}
206    ...  ${os_password}
207    ${err_msg1}=  Sprint Error  ${msg}
208    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
209    Run Keyword If  '${status}' == 'FAIL'  Fail  msg=${err_msg}
210    ${output}  ${stderr}  ${rc}=  Execute Command  uptime  return_stderr=True
211    ...        return_rc=True
212
213    ${temp_msg}=  Catenate  Could not execute a command on the operating
214    ...  system.\n
215    ${err_msg1}=  Sprint Error  ${temp_msg}
216    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
217
218    # If the return code returned by "Execute Command" is non-zero, this
219    # keyword will fail.
220    Should Be Equal  ${rc}  ${0}  msg=${err_msg}
221    # We will likewise fail if there is any stderr data.
222    Should Be Empty  ${stderr}
223
224    ${temp_msg}=  Set Variable  Could not ping the operating system.\n
225    ${err_msg1}=  Sprint Error  ${temp_msg}
226    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
227    # We will likewise fail if the OS did not ping, as we could SSH but not
228    # ping
229    Should Be Equal As Strings  ${ping_rc}  ${TRUE}  msg=${err_msg}
230
231Wait for OS
232    [Documentation]  Waits for the host OS to come up via calls to "Check OS".
233    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
234    ...          ${os_password}=${OS_PASSWORD}  ${timeout}=${OS_WAIT_TIMEOUT}
235    ...          ${quiet}=${0}
236    [Teardown]  rprintn
237
238    # os_host           The DNS name or IP of the OS host associated with our
239    #                   BMC.
240    # os_username       The username to be used to sign on to the OS host.
241    # os_password       The password to be used to sign on to the OS host.
242    # timeout           The timeout in seconds indicating how long you're
243    #                   willing to wait for the OS to respond.
244    # quiet             Indicates whether this keyword should write to console.
245
246    # The interval to be used between calls to "Check OS".
247    ${interval}=  Set Variable  5
248
249    ${message}=  Catenate  Checking every ${interval} seconds for up to
250    ...  ${timeout} seconds for the operating system to communicate.
251    rqprint_timen  ${message}
252
253    Wait Until Keyword Succeeds  ${timeout} sec  ${interval}  Check OS
254    ...                          ${os_host}  ${os_username}  ${os_password}
255    ...                          print_string=\#
256
257    rqprintn
258
259    rqprint_timen  The operating system is now communicating.
260
261Get BMC State Deprecated
262    [Documentation]  Returns the state of the BMC as a string. (i.e: BMC_READY)
263    [Arguments]  ${quiet}=${QUIET}
264
265    @{arglist}=  Create List
266    ${args}=  Create Dictionary  data=@{arglist}
267    ${resp}=  Call Method  ${OPENBMC_BASE_URI}managers/System/  getSystemState
268    ...        data=${args}  quiet=${quiet}
269    Should be equal as strings  ${resp.status_code}  ${HTTP_OK}
270    ${content}=  to json  ${resp.content}
271    [Return]  ${content["data"]}
272
273Get Power State
274    [Documentation]  Returns the power state as an integer. Either 0 or 1.
275    [Arguments]  ${quiet}=${QUIET}
276
277    @{arglist}=  Create List
278    ${args}=  Create Dictionary  data=@{arglist}
279
280    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/chassis0/  getPowerState
281    ...        data=${args}  quiet=${quiet}
282    Should be equal as strings  ${resp.status_code}  ${HTTP_OK}
283    ${content}=  to json  ${resp.content}
284    [Return]  ${content["data"]}
285
286Clear BMC Record Log
287    [Documentation]  Clears all the event logs on the BMC. This would be
288    ...              equivalent to ipmitool sel clear.
289    @{arglist}=   Create List
290    ${args}=     Create Dictionary    data=@{arglist}
291    ${resp}=  Call Method
292    ...  ${OPENBMC_BASE_URI}records/events/  clear  data=${args}
293    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
294
295Copy PNOR to BMC
296    Import Library      SCPLibrary      WITH NAME       scp
297    Open Connection for SCP
298    Log    Copying ${PNOR_IMAGE_PATH} to /tmp
299    scp.Put File    ${PNOR_IMAGE_PATH}   /tmp
300
301Flash PNOR
302    [Documentation]    Calls flash bios update method to flash PNOR image
303    [Arguments]    ${pnor_image}
304    @{arglist}=   Create List    ${pnor_image}
305    ${args}=     Create Dictionary    data=@{arglist}
306    ${resp}=  Call Method  ${OPENBMC_BASE_URI}control/flash/bios/  update
307    ...  data=${args}
308    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
309    Wait Until Keyword Succeeds    2 min   10 sec    Is PNOR Flashing
310
311Get Flash BIOS Status
312    [Documentation]  Returns the status of the flash BIOS API as a string. For
313    ...              example 'Flashing', 'Flash Done', etc
314    ${data}=      Read Properties     ${OPENBMC_BASE_URI}control/flash/bios
315    [Return]    ${data['status']}
316
317Is PNOR Flashing
318    [Documentation]  Get BIOS 'Flashing' status. This indicates that PNOR
319    ...              flashing has started.
320    ${status}=    Get Flash BIOS Status
321    should be equal as strings     ${status}     Flashing
322
323Is PNOR Flash Done
324    [Documentation]  Get BIOS 'Flash Done' status.  This indicates that the
325    ...              PNOR flashing has completed.
326    ${status}=    Get Flash BIOS Status
327    should be equal as strings     ${status}     Flash Done
328
329Is System State Host Booted
330    [Documentation]  Checks whether system state is HOST_BOOTED.
331    ${state}=    Get BMC State Deprecated
332    should be equal as strings     ${state}     HOST_BOOTED
333
334Is OS Starting
335    [Documentation]  Check if boot progress is OS starting.
336    ${boot_progress}=  Get Boot Progress
337    Should Be Equal  ${boot_progress}  FW Progress, Starting OS
338
339Is OS Off
340    [Documentation]  Check if boot progress is "Off".
341    ${boot_progress}=  Get Boot Progress
342    Should Be Equal  ${boot_progress}  Off
343
344Verify Ping and REST Authentication
345    ${l_ping}=   Run Keyword And Return Status
346    ...    Ping Host  ${OPENBMC_HOST}
347    Run Keyword If  '${l_ping}' == '${False}'
348    ...    Fail   msg=Ping Failed
349
350    ${l_rest}=   Run Keyword And Return Status
351    ...    Initialize OpenBMC
352    Run Keyword If  '${l_rest}' == '${False}'
353    ...    Fail   msg=REST Authentication Failed
354
355    # Just to make sure the SSH is working for SCP
356    Open Connection And Log In
357    ${system}   ${stderr}=    Execute Command   hostname   return_stderr=True
358    Should Be Empty     ${stderr}
359
360Check If BMC is Up
361    [Documentation]  Wait for Host to be online. Checks every X seconds
362    ...              interval for Y minutes and fails if timed out.
363    ...              Default MAX timedout is 10 min, interval 10 seconds.
364    [Arguments]      ${max_timeout}=${OPENBMC_REBOOT_TIMEOUT} min
365    ...              ${interval}=10 sec
366
367    Wait Until Keyword Succeeds
368    ...   ${max_timeout}  ${interval}   Verify Ping and REST Authentication
369
370
371Check If warmReset is Initiated
372    [Documentation]  Ping would be still alive, so try SSH to connect
373    ...              if fails the ports are down indicating reboot
374    ...              is in progress
375
376    # Warm reset adds 3 seconds delay before forcing reboot
377    # To minimize race conditions, we wait for 7 seconds
378    Sleep  7s
379    ${alive}=   Run Keyword and Return Status
380    ...    Open Connection And Log In
381    Return From Keyword If   '${alive}' == '${False}'    ${False}
382    [Return]    ${True}
383
384Flush REST Sessions
385    [Documentation]   Removes all the active session objects
386    Delete All Sessions
387
388Initialize DBUS cmd
389    [Documentation]  Initialize dbus string with property string to extract
390    [Arguments]   ${boot_property}
391    ${cmd}=     Catenate  ${dbuscmdBase} ${dbuscmdGet} ${dbuscmdString}
392    ${cmd}=     Catenate  ${cmd}${boot_property}
393    Set Global Variable   ${dbuscmd}     ${cmd}
394
395Create OS Console File Path
396    [Documentation]  Create OS console file path name and return it.
397    [Arguments]  ${log_file_path}=${EMPTY}
398
399    # Description of arguements:
400    # file_path  The caller's candidate value.  If this value is ${EMPTY}, this
401    #            keyword will compose a file path name.  Otherwise, this
402    #            keyword will use the caller's file_path value.  In either
403    #            case, the value will be returned.
404
405    ${default_file_path}=  Catenate  /tmp/${OPENBMC_HOST}_os_console
406    ${log_file_path}=  Set Variable If  '${log_file_path}' == '${EMPTY}'
407    ...  ${default_file_path}  ${log_file_path}
408
409    [Return]  ${log_file_path}
410
411Create OS Console Command String
412    [Documentation]  Return a command string to start OS console logging.
413
414    # First make sure that the ssh_pw program is available.
415    ${cmd_buf}=  Catenate  which ssh_pw 2>&1
416    Rdpissuing  ${cmd_buf}
417    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd_buf}
418    Rdpvars  rc  output
419    Should Be Equal  ${rc}  ${0}  msg=${output}\n
420
421    ${cmd_buf}=  Catenate  ssh_pw ${OPENBMC_PASSWORD} -p 2200
422    ...  ${OPENBMC_USERNAME}@${OPENBMC_HOST}
423
424    [Return]  ${cmd_buf}
425
426Stop SOL Console Logging
427    [Documentation]  Stop system console logging and return log output.
428    [Arguments]  ${log_file_path}=${EMPTY}  ${targ_file_path}=${EMPTY}
429
430    # If there are muliple system console processes, they will all be stopped.
431    # If there is no existing log file this keyword will return an error
432    # message to that effect (and write that message to targ_file_path, if
433    # specified).
434    # NOTE: This keyword will not fail if there is no running system console
435    # process.
436
437    # Description of arguments:
438    # log_file_path   The file path that was used to call "Start SOL
439    #                 Console Logging".  See that keyword (above) for details.
440    # targ_file_path  If specified, the file path to which the source
441    #                 file path (i.e. "log_file_path") should be copied.
442
443    ${log_file_path}=  Create OS Console File Path  ${log_file_path}
444    # Find the pid of the active system console logging session (if any).
445    ${search_string}=  Create OS Console Command String
446    ${cmd_buf}=  Catenate  echo $(ps -ef | egrep '${search_string}'
447    ...  | egrep -v grep | cut -c10-14)
448    Rdpissuing  ${cmd_buf}
449    ${rc}  ${os_con_pid}=  Run And Return Rc And Output  ${cmd_buf}
450    Rdpvars  os_con_pid
451    # If rc is not zero it just means that there is no OS Console process
452    # running.
453
454    ${cmd_buf}=  Catenate  kill -9 ${os_con_pid}
455    Run Keyword If  '${os_con_pid}' != '${EMPTY}'  Rdpissuing  ${cmd_buf}
456    ${rc}  ${output}=  Run Keyword If  '${os_con_pid}' != '${EMPTY}'
457    ...  Run And Return Rc And Output  ${cmd_buf}
458    Run Keyword If  '${os_con_pid}' != '${EMPTY}'  Rdpvars  rc  output
459
460    ${cmd_buf}=  Set Variable  cat ${log_file_path} 2>&1
461    Rdpissuing  ${cmd_buf}
462    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd_buf}
463    Rdpvars  rc
464
465    Run Keyword If  '${targ_file_path}' != '${EMPTY}'
466    ...  Run Keyword And Ignore Error
467    ...  Copy File  ${log_file_path}  ${targ_file_path}
468
469    [Return]  ${output}
470
471Start SOL Console Logging
472    [Documentation]  Start system console log to file.
473    [Arguments]  ${log_file_path}=${EMPTY}
474
475    # This keyword will first call "Stop SOL Console Logging".  Only then will
476    # it start SOL console logging.  The data returned by "Stop SOL Console
477    # Logging" will in turn be returned by this keyword.
478
479    # Description of arguments:
480    # log_file_path  The file path to which system console log data should be
481    #                written.  Note that this path is taken to be a location on
482    #                the machine where this program is running rather than on
483    #                the Open BMC system.
484
485    ${log_file_path}=  Create OS Console File Path  ${log_file_path}
486
487    ${log_output}=  Stop SOL Console Logging  ${log_file_path}
488
489    # Validate by making sure we can create the file.  Problems creating the
490    # file would not be noticed by the subsequent ssh command because we fork
491    # the command.
492    Create File  ${log_file_path}
493    ${sub_cmd_buf}=  Create OS Console Command String
494    # Routing stderr to stdout so that any startup error text will go to the
495    # output file.
496    ${cmd_buf}=  Catenate  ${sub_cmd_buf} > ${log_file_path} 2>&1 &
497    Rdpissuing  ${cmd_buf}
498    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd_buf}
499    # Because we are forking this command, we essentially will never get a
500    # non-zero return code or any output.
501    Should Be Equal  ${rc}  ${0}
502
503    [Return]  ${log_output}
504
505Get Time Stamp
506    [Documentation]     Get the current time stamp data
507    ${cur_time}=    Get Current Date   result_format=%Y%m%d%H%M%S%f
508    [Return]   ${cur_time}
509
510
511Verify BMC State
512    [Documentation]   Get the BMC state and verify if the current
513    ...               BMC state is as expected.
514    [Arguments]       ${expected}
515
516    ${current}=  Get BMC State Deprecated
517    Should Contain  ${expected}   ${current}
518
519Start Journal Log
520    [Documentation]   Start capturing journal log to a file in /tmp using
521    ...               journalctl command. By default journal log is collected
522    ...               at /tmp/journal_log else user input location.
523    ...               The File is appended with datetime.
524    [Arguments]       ${file_path}=/tmp/journal_log
525
526    Open Connection And Log In
527
528    ${cur_time}=    Get Time Stamp
529    Set Global Variable   ${LOG_TIME}   ${cur_time}
530    Start Command
531    ...  journalctl -f > ${file_path}-${LOG_TIME}
532    Log    Journal Log Started: ${file_path}-${LOG_TIME}
533
534
535Stop Journal Log
536    [Documentation]   Stop journalctl process if its running.
537    ...               By default return log from /tmp/journal_log else
538    ...               user input location.
539    [Arguments]       ${file_path}=/tmp/journal_log
540
541    Open Connection And Log In
542
543    ${rc}=
544    ...  Execute Command
545    ...  ps ax | grep journalctl | grep -v grep
546    ...  return_stdout=False  return_rc=True
547
548    Return From Keyword If   '${rc}' == '${1}'
549    ...   No journal log process running
550
551    ${output}  ${stderr}=
552    ...  Execute Command   killall journalctl
553    ...  return_stderr=True
554    Should Be Empty     ${stderr}
555
556    ${journal_log}  ${stderr}=
557    ...  Execute Command
558    ...  cat ${file_path}-${LOG_TIME}
559    ...  return_stderr=True
560    Should Be Empty     ${stderr}
561
562    Log    ${journal_log}
563
564    Execute Command    rm ${file_path}-${LOG_TIME}
565
566    [Return]    ${journal_log}
567
568Mac Address To Hex String
569    [Documentation]   Converts MAC address into hex format.
570    ...               Example
571    ...               Given the following MAC: 00:01:6C:80:02:78
572    ...               This keyword will return: 0x00 0x01 0x6C 0x80 0x02 0x78
573    ...               Description of arguments:
574    ...               i_macaddress  MAC address in the following format
575    ...               00:01:6C:80:02:78
576    [Arguments]    ${i_macaddress}
577
578    ${mac_hex}=  Catenate  0x${i_macaddress.replace(':', ' 0x')}
579    [Return]    ${mac_hex}
580
581IP Address To Hex String
582    [Documentation]   Converts IP address into hex format.
583    ...               Example:
584    ...               Given the following IP: 10.3.164.100
585    ...               This keyword will return: 0xa 0x3 0xa4 0xa0
586    ...               Description of arguments:
587    ...               i_ipaddress  IP address in the following format
588    ...               10.10.10.10
589    [Arguments]    ${i_ipaddress}
590
591    @{ip}=  Split String  ${i_ipaddress}    .
592    ${index}=  Set Variable  ${0}
593
594    :FOR    ${item}     IN      @{ip}
595    \   ${hex}=  Convert To Hex    ${item}    prefix=0x    lowercase=yes
596    \   Set List Value    ${ip}    ${index}    ${hex}
597    \   ${index}=  Set Variable    ${index + 1}
598    ${ip_hex}=  Catenate    @{ip}
599    [Return]    ${ip_hex}
600
601BMC CPU Performance Check
602   [Documentation]   Minimal 10% of proc should be free in this instance
603
604    ${bmc_cpu_usage_output}  ${stderr}=  Execute Command  ${bmc_cpu_usage_cmd}
605    ...                   return_stderr=True
606    Should be empty  ${stderr}
607    ${bmc_cpu_percentage}=  Fetch From Left  ${bmc_cpu_usage_output}  %
608    Should be true  ${bmc_cpu_percentage} < 90
609
610BMC Mem Performance Check
611    [Documentation]   Minimal 10% of memory should be free in this instance
612
613    ${bmc_mem_free_output}  ${stderr}=   Execute Command  ${bmc_mem_free_cmd}
614    ...                   return_stderr=True
615    Should be empty  ${stderr}
616
617    ${bmc_mem_total_output}  ${stderr}=   Execute Command  ${bmc_mem_total_cmd}
618    ...                   return_stderr=True
619    Should be empty  ${stderr}
620
621    ${bmc_mem_percentage}=   Evaluate  ${bmc_mem_free_output}*100
622    ${bmc_mem_percentage}=  Evaluate
623    ...   ${bmc_mem_percentage}/${bmc_mem_total_output}
624    Should be true  ${bmc_mem_percentage} > 10
625
626BMC File System Usage Check
627    [Documentation]   Check the file system space. None should be 100% full
628    ...   except /run/initramfs/ro
629    ${bmc_fs_usage_output}  ${stderr}=   Execute Command
630    ...   ${bmc_file_system_usage_cmd}  return_stderr=True
631    Should Be Empty  ${stderr}
632    Should Be True  ${bmc_fs_usage_output}==0
633
634Check BMC CPU Performance
635    [Documentation]   Minimal 10% of proc should be free in 3 sample
636    :FOR  ${var}  IN Range  1  4
637    \     BMC CPU Performance check
638
639Check BMC Mem Performance
640    [Documentation]   Minimal 10% of memory should be free
641
642    :FOR  ${var}  IN Range  1  4
643    \     BMC Mem Performance check
644
645Check BMC File System Performance
646    [Documentation]  Check for file system usage for 4 times
647
648    :FOR  ${var}  IN Range  1  4
649    \     BMC File System Usage check
650
651Get Endpoint Paths
652    [Documentation]   Returns all url paths ending with given endpoint
653    ...               Example:
654    ...               Given the following endpoint: cpu
655    ...               This keyword will return: list of all urls ending with
656    ...               cpu -
657    ...               /org/openbmc/inventory/system/chassis/motherboard/cpu0,
658    ...               /org/openbmc/inventory/system/chassis/motherboard/cpu1
659    ...               Description of arguments:
660    ...               path       URL path for enumeration
661    ...               endpoint   string for which url path ending
662    [Arguments]   ${path}   ${endpoint}
663
664    ${resp}=   Read Properties   ${path}/enumerate   timeout=30
665    log Dictionary   ${resp}
666
667    ${list}=   Get Dictionary Keys   ${resp}
668    ${resp}=   Get Matches   ${list}   regexp=^.*[0-9a-z_].${endpoint}[0-9]*$
669    [Return]   ${resp}
670
671Check Zombie Process
672    [Documentation]    Check if any defunct process exist or not on BMC
673    ${count}  ${stderr}  ${rc}=  Execute Command  ps -o stat | grep Z | wc -l
674    ...    return_stderr=True  return_rc=True
675    Should Be True    ${count}==0
676    Should Be Empty    ${stderr}
677
678Prune Journal Log
679    [Documentation]   Prune archived journal logs.
680    [Arguments]   ${vacuum_size}=1M
681
682    # This keyword can be used to prevent the journal
683    # log from filling up the /run filesystem.
684    # This command will retain only the latest logs
685    # of the user specified size.
686
687    Open Connection And Log In
688    ${output}  ${stderr}  ${rc}=
689    ...  Execute Command
690    ...  journalctl --vacuum-size=${vacuum_size}
691    ...  return_stderr=True  return_rc=True
692
693    Should Be Equal  ${rc}  ${0}  msg=${stderr}
694    Should Contain   ${stderr}  Vacuuming done
695
696Set BMC Power Policy
697    [Documentation]   Set the given BMC power policy.
698    [arguments]   ${policy}
699
700    ${valueDict}=     create dictionary  data=${policy}
701    Write Attribute    ${HOST_SETTING}    power_policy   data=${valueDict}
702    ${currentPolicy}=  Read Attribute     ${HOST_SETTING}   power_policy
703    Should Be Equal    ${currentPolicy}   ${policy}
704
705Get System Power Policy
706    [Documentation]  Get the BMC power policy.
707    ${currentPolicy}=  Read Attribute  ${HOST_SETTING}  power_policy
708    [Return]  ${currentPolicy}
709
710Get Auto Reboot
711    [Documentation]  Returns auto reboot setting.
712    ${setting}=  Read Attribute  ${HOST_SETTING}  auto_reboot
713    [Return]  ${setting}
714
715
716Set Auto Reboot
717    [Documentation]  Set the given auto reboot setting.
718    [Arguments]  ${setting}
719    # setting  auto reboot's setting, i.e. yes or no
720
721    ${valueDict}=  Set Variable  ${setting}
722    ${data}=  Create Dictionary  data=${valueDict}
723    Write Attribute  ${HOST_SETTING}  auto_reboot  data=${data}
724    ${current_setting}=  Get Auto Reboot
725    Should Be Equal  ${current_setting}  ${setting}
726
727
728Set BMC Reset Reference Time
729    [Documentation]  Set current boot time as a reference and increment
730    ...              boot count.
731
732    ${cur_btime}=  Get BMC Boot Time
733    Run Keyword If  ${BOOT_TIME} == ${0} and ${BOOT_COUNT} == ${0}
734    ...  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
735    ...  ELSE IF  ${cur_btime} > ${BOOT_TIME}
736    ...  Run Keywords  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
737    ...  AND
738    ...  Set Global Variable  ${BOOT_COUNT}  ${BOOT_COUNT + 1}
739
740Get BMC Boot Time
741    [Documentation]  Get boot time from /proc/stat.
742
743    Open Connection And Log In
744    ${output}  ${stderr}=
745    ...  Execute Command  egrep '^btime ' /proc/stat | cut -f 2 -d ' '
746    ...  return_stderr=True
747    Should Be Empty  ${stderr}
748    ${btime}=  Convert To Integer  ${output}
749    [Return]  ${btime}
750
751Execute Command On BMC
752    [Documentation]  Execute given command on BMC and return output.
753    [Arguments]  ${command}
754    ${stdout}  ${stderr}=  Execute Command  ${command}  return_stderr=True
755    Should Be Empty  ${stderr}
756    [Return]  ${stdout}
757
758Enable Core Dump On BMC
759    [Documentation]  Enable core dump collection.
760    Open Connection And Log In
761    ${core_pattern}=  Execute Command On BMC
762    ...  echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern
763    Should Be Equal As Strings  ${core_pattern}  /tmp/core_%e.%p
764