1*** Settings *** 2Resource ../lib/resource.txt 3Resource ../lib/rest_client.robot 4Resource ../lib/connection_client.robot 5Library String 6Library DateTime 7Library Process 8Library OperatingSystem 9Library gen_print.py 10Library gen_robot_print.py 11Library gen_cmd.py 12Library gen_robot_keyword.py 13Library bmc_ssh_utils.py 14Library utils.py 15Library var_funcs.py 16 17*** Variables *** 18${pflash_cmd} /usr/sbin/pflash -r /dev/stdout -P VERSION 19${SYSTEM_SHUTDOWN_TIME} ${5} 20${dbuscmdBase} 21... dbus-send --system --print-reply --dest=${OPENBMC_BASE_DBUS}.settings.Host 22${dbuscmdGet} 23... ${SETTINGS_URI}host0 org.freedesktop.DBus.Properties.Get 24# Enable when ready with openbmc/openbmc-test-automation#203 25#${dbuscmdString}= string:"xyz.openbmc_project.settings.Host" string: 26${dbuscmdString}= string:"org.openbmc.settings.Host" string: 27 28# Assign default value to QUIET for programs which may not define it. 29${QUIET} ${0} 30${bmc_mem_free_cmd}= free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f4 31${bmc_mem_total_cmd}= free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2 32${bmc_cpu_usage_cmd}= top -n 1 | grep CPU: | cut -c 7-9 33${HOST_SETTING} ${SETTINGS_URI}host0 34# /run/initramfs/ro associate filesystem should be 100% full always 35${bmc_file_system_usage_cmd}= 36... df -h | grep -v /run/initramfs/ro | cut -c 52-54 | grep 100 | wc -l 37 38${BOOT_TIME} ${0} 39${BOOT_COUNT} ${0} 40${count} ${0} 41${devicetree_base} /sys/firmware/devicetree/base/model 42 43# Initialize default debug value to 0. 44${DEBUG} ${0} 45 46# These variables are used to straddle between new and old methods of setting 47# values. 48${boot_prog_method} ${EMPTY} 49 50${power_policy_setup} ${0} 51${bmc_power_policy_method} ${EMPTY} 52@{valid_power_policy_vars} RESTORE_LAST_STATE ALWAYS_POWER_ON 53... ALWAYS_POWER_OFF 54 55*** Keywords *** 56 57Verify PNOR Update 58 [Documentation] Verify that the PNOR is not corrupted. 59 # Example: 60 # FFS: Flash header not found. Code: 100 61 # Error 100 opening ffs ! 62 63 Open Connection And Log In 64 ${pnor_info}= Execute Command On BMC ${pflash_cmd} 65 Should Not Contain Any ${pnor_info} Flash header not found Error 66 67Get BMC System Model 68 [Documentation] Get the BMC model from the device tree. 69 70 ${bmc_model} ${stderr} ${rc}= BMC Execute Command 71 ... cat ${devicetree_base} | cut -d " " -f 1 return_stderr=True 72 Should Be Empty ${stderr} 73 Should Not Be Empty ${bmc_model} 74 [Return] ${bmc_model} 75 76Verify BMC System Model 77 [Documentation] Verify the BMC model with ${OPENBMC_MODEL}. 78 [Arguments] ${bmc_model} 79 80 ${tmp_bmc_model}= Fetch From Right ${OPENBMC_MODEL} / 81 ${tmp_bmc_model}= Fetch From Left ${tmp_bmc_model} . 82 ${ret}= Run Keyword And Return Status Should Contain ${bmc_model} 83 ... ${tmp_bmc_model} ignore_case=True 84 [Return] ${ret} 85 86Wait For Host To Ping 87 [Arguments] ${host} ${timeout}=${OPENBMC_REBOOT_TIMEOUT}min 88 ... ${interval}=5 sec 89 90 # host The DNS name or IP of the host to ping. 91 # timeout The amount of time after which attempts to ping cease. 92 # interval The amount of time in between attempts to ping. 93 94 Wait Until Keyword Succeeds ${timeout} ${interval} Ping Host ${host} 95 96Ping Host 97 [Arguments] ${host} 98 Should Not Be Empty ${host} msg=No host provided 99 ${RC} ${output}= Run and return RC and Output ping -c 4 ${host} 100 Log RC: ${RC}\nOutput:\n${output} 101 Should be equal ${RC} ${0} 102 103Get Boot Progress 104 [Documentation] Get the boot progress and return it. 105 [Arguments] ${quiet}=${QUIET} 106 107 # Description of argument(s): 108 # quiet Indicates whether this keyword should run without any output to 109 # the console. 110 111 Set Boot Progress Method 112 ${state}= Run Keyword If '${boot_prog_method}' == 'New' 113 ... New Get Boot Progress quiet=${quiet} 114 ... ELSE 115 ... Old Get Boot Progress quiet=${quiet} 116 117 [Return] ${state} 118 119Set Boot Progress Method 120 [Documentation] Set the boot_prog_method to either 'Old' or 'New'. 121 122 # The boot progress data has moved from an 'org' location to an 'xyz' 123 # location. This keyword will determine whether the new method of getting 124 # the boot progress is valid and will set the global boot_prog_method 125 # variable accordingly. If boot_prog_method is already set (either by a 126 # prior call to this function or via a -v parm), this keyword will simply 127 # return. 128 129 # Note: There are interim builds that contain boot_progress in both the old 130 # and the new location values. It is nearly impossible for this keyword to 131 # determine whether the old boot_progress or the new one is active. When 132 # using such builds where the old boot_progress is active, the only recourse 133 # users will have is that they may specify -v boot_prog_method:Old to force 134 # old behavior on such builds. 135 136 Run Keyword If '${boot_prog_method}' != '${EMPTY}' Return From Keyword 137 138 ${new_status} ${new_value}= Run Keyword And Ignore Error 139 ... New Get Boot Progress 140 # If the new style read fails, the method must necessarily be "Old". 141 Run Keyword If '${new_status}' == 'PASS' 142 ... Run Keywords 143 ... Set Global Variable ${boot_prog_method} New AND 144 ... Rqpvars boot_prog_method AND 145 ... Return From Keyword 146 147 # Default method is "Old". 148 Set Global Variable ${boot_prog_method} Old 149 Rqpvars boot_prog_method 150 151Old Get Boot Progress 152 [Documentation] Get the boot progress the old way (via org location). 153 [Arguments] ${quiet}=${QUIET} 154 155 # Description of argument(s): 156 # quiet Indicates whether this keyword should run without any output to 157 # the console. 158 159 ${state}= Read Attribute ${OPENBMC_BASE_URI}sensors/host/BootProgress 160 ... value quiet=${quiet} 161 162 [Return] ${state} 163 164New Get Boot Progress 165 [Documentation] Get the boot progress the new way (via xyz location). 166 [Arguments] ${quiet}=${QUIET} 167 168 # Description of argument(s): 169 # quiet Indicates whether this keyword should run without any output to 170 # the console. 171 172 ${state}= Read Attribute ${HOST_STATE_URI} BootProgress quiet=${quiet} 173 174 [Return] ${state.rsplit('.', 1)[1]} 175 176Is Power On 177 ${state}= Get Power State 178 Should be equal ${state} ${1} 179 180Is Power Off 181 ${state}= Get Power State 182 Should be equal ${state} ${0} 183 184Initiate Power On 185 [Documentation] Initiates the power on and waits until the Is Power On 186 ... keyword returns that the power state has switched to on. 187 [Arguments] ${wait}=${1} 188 189 @{arglist}= Create List 190 ${args}= Create Dictionary data=@{arglist} 191 ${resp}= Call Method ${OPENBMC_BASE_URI}control/chassis0/ powerOn 192 ... data=${args} 193 should be equal as strings ${resp.status_code} ${HTTP_OK} 194 195 # Does caller want to wait for power on status? 196 Run Keyword If '${wait}' == '${0}' Return From Keyword 197 Wait Until Keyword Succeeds 3 min 10 sec Is Power On 198 199Initiate Power Off 200 [Documentation] Initiates the power off and waits until the Is Power Off 201 ... keyword returns that the power state has switched to off. 202 @{arglist}= Create List 203 ${args}= Create Dictionary data=@{arglist} 204 ${resp}= Call Method ${OPENBMC_BASE_URI}control/chassis0/ powerOff 205 ... data=${args} 206 should be equal as strings ${resp.status_code} ${HTTP_OK} 207 Wait Until Keyword Succeeds 1 min 10 sec Is Power Off 208 209Initiate OS Host Power Off 210 [Documentation] Initiate an OS reboot. 211 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 212 ... ${os_password}=${OS_PASSWORD} 213 214 # Description of arguments: 215 # os_host The DNS name or IP of the OS. 216 # os_username The username to be used to sign in to the OS. 217 # os_password The password to be used to sign in to the OS. 218 219 ${cmd_buf}= Run Keyword If '${os_username}' == 'root' 220 ... Set Variable shutdown 221 ... ELSE 222 ... Set Variable echo ${os_password} | sudo -S shutdown 223 224 ${output} ${stderr} ${rc}= OS Execute Command 225 ... ${cmd_buf} fork=${1} 226 227Initiate OS Host Reboot 228 [Documentation] Initiate an OS reboot. 229 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 230 ... ${os_password}=${OS_PASSWORD} 231 232 # Description of argument(s): 233 # os_host The host name or IP address of the OS. 234 # os_username The username to be used to sign in to the OS. 235 # os_password The password to be used to sign in to the OS. 236 237 ${cmd_buf}= Run Keyword If '${os_username}' == 'root' 238 ... Set Variable reboot 239 ... ELSE 240 ... Set Variable echo ${os_password} | sudo -S reboot 241 242 ${output} ${stderr} ${rc}= OS Execute Command 243 ... ${cmd_buf} fork=${1} 244 245Initiate Auto Reboot 246 [Documentation] Initiate an auto reboot. 247 248 # Set the auto reboot policy. 249 Set Auto Reboot ${1} 250 # Set the watchdog timer. Note: 5000 = milliseconds which is 5 seconds. 251 Trigger Host Watchdog Error 5000 252 253Trigger Warm Reset 254 log to console "Triggering warm reset" 255 ${data}= create dictionary data=@{EMPTY} 256 ${resp}= openbmc post request 257 ... ${OPENBMC_BASE_URI}control/bmc0/action/warmReset data=${data} 258 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 259 ${session_active}= Check If warmReset is Initiated 260 Run Keyword If '${session_active}' == '${True}' 261 ... Fail msg=warm reset didn't occur 262 263 Sleep ${SYSTEM_SHUTDOWN_TIME}min 264 Check If BMC Is Up 265 266Check OS 267 [Documentation] Attempts to ping the host OS and then checks that the host 268 ... OS is up by running an SSH command. 269 270 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 271 ... ${os_password}=${OS_PASSWORD} ${quiet}=${QUIET} 272 ... ${print_string}=${EMPTY} 273 [Teardown] SSHLibrary.Close Connection 274 275 # os_host The DNS name/IP of the OS host associated with our BMC. 276 # os_username The username to be used to sign on to the OS host. 277 # os_password The password to be used to sign on to the OS host. 278 # quiet Indicates whether this keyword should write to console. 279 # print_string A string to be printed before checking the OS. 280 281 rprint ${print_string} 282 283 # Attempt to ping the OS. Store the return code to check later. 284 ${ping_rc}= Run Keyword and Return Status Ping Host ${os_host} 285 286 SSHLibrary.Open connection ${os_host} 287 288 ${status} ${msg}= Run Keyword And Ignore Error Login ${os_username} 289 ... ${os_password} 290 ${err_msg1}= Sprint Error ${msg} 291 ${err_msg}= Catenate SEPARATOR= \n ${err_msg1} 292 Run Keyword If '${status}' == 'FAIL' Fail msg=${err_msg} 293 ${output} ${stderr} ${rc}= Execute Command uptime return_stderr=True 294 ... return_rc=True 295 296 ${temp_msg}= Catenate Could not execute a command on the operating 297 ... system.\n 298 ${err_msg1}= Sprint Error ${temp_msg} 299 ${err_msg}= Catenate SEPARATOR= \n ${err_msg1} 300 301 # If the return code returned by "Execute Command" is non-zero, this 302 # keyword will fail. 303 Should Be Equal ${rc} ${0} msg=${err_msg} 304 # We will likewise fail if there is any stderr data. 305 Should Be Empty ${stderr} 306 307 ${temp_msg}= Set Variable Could not ping the operating system.\n 308 ${err_msg1}= Sprint Error ${temp_msg} 309 ${err_msg}= Catenate SEPARATOR= \n ${err_msg1} 310 # We will likewise fail if the OS did not ping, as we could SSH but not 311 # ping 312 Should Be Equal As Strings ${ping_rc} ${TRUE} msg=${err_msg} 313 314Wait for OS 315 [Documentation] Waits for the host OS to come up via calls to "Check OS". 316 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 317 ... ${os_password}=${OS_PASSWORD} ${timeout}=${OS_WAIT_TIMEOUT} 318 ... ${quiet}=${0} 319 [Teardown] rprintn 320 321 # os_host The DNS name or IP of the OS host associated with our 322 # BMC. 323 # os_username The username to be used to sign on to the OS host. 324 # os_password The password to be used to sign on to the OS host. 325 # timeout The timeout in seconds indicating how long you're 326 # willing to wait for the OS to respond. 327 # quiet Indicates whether this keyword should write to console. 328 329 # The interval to be used between calls to "Check OS". 330 ${interval}= Set Variable 5 331 332 ${message}= Catenate Checking every ${interval} seconds for up to 333 ... ${timeout} seconds for the operating system to communicate. 334 rqprint_timen ${message} 335 336 Wait Until Keyword Succeeds ${timeout} sec ${interval} Check OS 337 ... ${os_host} ${os_username} ${os_password} 338 ... print_string=\# 339 340 rqprintn 341 342 rqprint_timen The operating system is now communicating. 343 344 345Get Power State 346 [Documentation] Returns the power state as an integer. Either 0 or 1. 347 [Arguments] ${quiet}=${QUIET} 348 349 @{arglist}= Create List 350 ${args}= Create Dictionary data=@{arglist} 351 352 ${resp}= Call Method ${OPENBMC_BASE_URI}control/chassis0/ getPowerState 353 ... data=${args} quiet=${quiet} 354 Should be equal as strings ${resp.status_code} ${HTTP_OK} 355 ${content}= to json ${resp.content} 356 [Return] ${content["data"]} 357 358Clear BMC Record Log 359 [Documentation] Clears all the event logs on the BMC. This would be 360 ... equivalent to ipmitool sel clear. 361 @{arglist}= Create List 362 ${args}= Create Dictionary data=@{arglist} 363 ${resp}= Call Method 364 ... ${OPENBMC_BASE_URI}records/events/ clear data=${args} 365 should be equal as strings ${resp.status_code} ${HTTP_OK} 366 367Copy PNOR to BMC 368 Import Library SCPLibrary WITH NAME scp 369 Open Connection for SCP 370 Log Copying ${PNOR_IMAGE_PATH} to /tmp 371 scp.Put File ${PNOR_IMAGE_PATH} /tmp 372 373Flash PNOR 374 [Documentation] Calls flash bios update method to flash PNOR image 375 [Arguments] ${pnor_image} 376 @{arglist}= Create List ${pnor_image} 377 ${args}= Create Dictionary data=@{arglist} 378 ${resp}= Call Method ${OPENBMC_BASE_URI}control/flash/bios/ update 379 ... data=${args} 380 should be equal as strings ${resp.status_code} ${HTTP_OK} 381 Wait Until Keyword Succeeds 2 min 10 sec Is PNOR Flashing 382 383Get Flash BIOS Status 384 [Documentation] Returns the status of the flash BIOS API as a string. For 385 ... example 'Flashing', 'Flash Done', etc 386 ${data}= Read Properties ${OPENBMC_BASE_URI}control/flash/bios 387 [Return] ${data['status']} 388 389Is PNOR Flashing 390 [Documentation] Get BIOS 'Flashing' status. This indicates that PNOR 391 ... flashing has started. 392 ${status}= Get Flash BIOS Status 393 Should Contain ${status} Flashing 394 395Is PNOR Flash Done 396 [Documentation] Get BIOS 'Flash Done' status. This indicates that the 397 ... PNOR flashing has completed. 398 ${status}= Get Flash BIOS Status 399 should be equal as strings ${status} Flash Done 400 401 402Is OS Starting 403 [Documentation] Check if boot progress is OS starting. 404 ${boot_progress}= Get Boot Progress 405 Should Be Equal ${boot_progress} OSStart 406 407Is OS Off 408 [Documentation] Check if boot progress is "Off". 409 ${boot_progress}= Get Boot Progress 410 Should Be Equal ${boot_progress} Off 411 412Get Boot Progress To OS Starting State 413 [Documentation] Get the system to a boot progress state of 'FW Progress, 414 ... Starting OS'. 415 416 ${boot_progress}= Get Boot Progress 417 Run Keyword If '${boot_progress}' == 'OSStart' 418 ... Log Host is already in OS starting state 419 ... ELSE 420 ... Run Keywords Initiate Host PowerOff AND Initiate Host Boot 421 ... AND Wait Until Keyword Succeeds 10 min 10 sec Is OS Starting 422 423Verify Ping and REST Authentication 424 ${l_ping}= Run Keyword And Return Status 425 ... Ping Host ${OPENBMC_HOST} 426 Run Keyword If '${l_ping}' == '${False}' 427 ... Fail msg=Ping Failed 428 429 ${l_rest}= Run Keyword And Return Status 430 ... Initialize OpenBMC 431 Run Keyword If '${l_rest}' == '${False}' 432 ... Fail msg=REST Authentication Failed 433 434 # Just to make sure the SSH is working for SCP 435 Open Connection And Log In 436 ${system} ${stderr}= Execute Command hostname return_stderr=True 437 Should Be Empty ${stderr} 438 439Check If BMC is Up 440 [Documentation] Wait for Host to be online. Checks every X seconds 441 ... interval for Y minutes and fails if timed out. 442 ... Default MAX timedout is 10 min, interval 10 seconds. 443 [Arguments] ${max_timeout}=${OPENBMC_REBOOT_TIMEOUT} min 444 ... ${interval}=10 sec 445 446 Wait Until Keyword Succeeds 447 ... ${max_timeout} ${interval} Verify Ping and REST Authentication 448 449 450Check If warmReset is Initiated 451 [Documentation] Ping would be still alive, so try SSH to connect 452 ... if fails the ports are down indicating reboot 453 ... is in progress 454 455 # Warm reset adds 3 seconds delay before forcing reboot 456 # To minimize race conditions, we wait for 7 seconds 457 Sleep 7s 458 ${alive}= Run Keyword and Return Status 459 ... Open Connection And Log In 460 Return From Keyword If '${alive}' == '${False}' ${False} 461 [Return] ${True} 462 463Flush REST Sessions 464 [Documentation] Removes all the active session objects 465 Delete All Sessions 466 467Initialize DBUS cmd 468 [Documentation] Initialize dbus string with property string to extract 469 [Arguments] ${boot_property} 470 ${cmd}= Catenate ${dbuscmdBase} ${dbuscmdGet} ${dbuscmdString} 471 ${cmd}= Catenate ${cmd}${boot_property} 472 Set Global Variable ${dbuscmd} ${cmd} 473 474Create OS Console File Path 475 [Documentation] Create OS console file path name and return it. 476 [Arguments] ${log_file_path}=${EMPTY} 477 478 # Description of arguements: 479 # file_path The caller's candidate value. If this value is ${EMPTY}, this 480 # keyword will compose a file path name. Otherwise, this 481 # keyword will use the caller's file_path value. In either 482 # case, the value will be returned. 483 484 ${default_file_path}= Catenate /tmp/${OPENBMC_HOST}_os_console.txt 485 ${log_file_path}= Set Variable If '${log_file_path}' == '${EMPTY}' 486 ... ${default_file_path} ${log_file_path} 487 488 [Return] ${log_file_path} 489 490Create OS Console Command String 491 [Documentation] Return a command string to start OS console logging. 492 493 # First make sure that the ssh_pw program is available. 494 ${cmd_buf}= Catenate which ssh_pw 2>&1 495 Rdpissuing ${cmd_buf} 496 ${rc} ${output}= Run And Return Rc And Output ${cmd_buf} 497 Rdpvars rc output 498 499 ${ssh_pw_file_path}= Run Keyword If ${rc} != ${0} 500 ... Set Variable ${EXECDIR}${/}bin/ssh_pw 501 ... ELSE 502 ... Set Variable ssh_pw 503 504 ${cmd_buf}= Catenate ${ssh_pw_file_path} ${OPENBMC_PASSWORD} -p 2200 505 ... -o "StrictHostKeyChecking no" ${OPENBMC_USERNAME}@${OPENBMC_HOST} 506 507 [Return] ${cmd_buf} 508 509Get SOL Console Pid 510 [Documentation] Get the pid of the active sol conole job. 511 512 # Find the pid of the active system console logging session (if any). 513 ${search_string}= Create OS Console Command String 514 # At least in some cases, ps output does not show double quotes so we must 515 # replace them in our search string with the regexes to indicate that they 516 # are optional. 517 ${search_string}= Replace String ${search_string} " ["]? 518 ${cmd_buf}= Catenate echo $(ps -ef | egrep '${search_string}' 519 ... | egrep -v grep | cut -c10-14) 520 Rdpissuing ${cmd_buf} 521 ${rc} ${os_con_pid}= Run And Return Rc And Output ${cmd_buf} 522 Rdpvars os_con_pid 523 # If rc is not zero it just means that there is no OS Console process 524 # running. 525 526 [Return] ${os_con_pid} 527 528 529Stop SOL Console Logging 530 [Documentation] Stop system console logging and return log output. 531 [Arguments] ${log_file_path}=${EMPTY} 532 ... ${targ_file_path}=${EXECDIR}${/}logs${/} 533 ... ${return_data}=${1} 534 535 # If there are muliple system console processes, they will all be stopped. 536 # If there is no existing log file this keyword will return an error 537 # message to that effect (and write that message to targ_file_path, if 538 # specified). 539 # NOTE: This keyword will not fail if there is no running system console 540 # process. 541 542 # Description of arguments: 543 # log_file_path The file path that was used to call "Start SOL 544 # Console Logging". See that keyword (above) for details. 545 # targ_file_path If specified, the file path to which the source 546 # file path (i.e. "log_file_path") should be copied. 547 # return_data If this is set to ${1}, this keyword will return the SOL 548 # data to the caller as a unicode string. 549 550 ${log_file_path}= Create OS Console File Path ${log_file_path} 551 552 ${os_con_pid}= Get SOL Console Pid 553 554 ${cmd_buf}= Catenate kill -9 ${os_con_pid} 555 Run Keyword If '${os_con_pid}' != '${EMPTY}' Rdpissuing ${cmd_buf} 556 ${rc} ${output}= Run Keyword If '${os_con_pid}' != '${EMPTY}' 557 ... Run And Return Rc And Output ${cmd_buf} 558 Run Keyword If '${os_con_pid}' != '${EMPTY}' Rdpvars rc output 559 560 Run Keyword If '${targ_file_path}' != '${EMPTY}' 561 ... Run Keyword And Ignore Error 562 ... Copy File ${log_file_path} ${targ_file_path} 563 564 ${output}= Set Variable ${EMPTY} 565 ${loc_quiet}= Evaluate ${debug}^1 566 ${rc} ${output}= Run Keyword If '${return_data}' == '${1}' 567 ... Cmd Fnc cat ${log_file_path} quiet=${loc_quiet} print_output=${0} 568 569 [Return] ${output} 570 571Start SOL Console Logging 572 [Documentation] Start system console log to file. 573 [Arguments] ${log_file_path}=${EMPTY} ${return_data}=${1} 574 575 # This keyword will first call "Stop SOL Console Logging". Only then will 576 # it start SOL console logging. The data returned by "Stop SOL Console 577 # Logging" will in turn be returned by this keyword. 578 579 # Description of arguments: 580 # log_file_path The file path to which system console log data should be 581 # written. Note that this path is taken to be a location 582 # on the machine where this program is running rather than 583 # on the Open BMC system. 584 # return_data If this is set to ${1}, this keyword will return any SOL 585 # data to the caller as a unicode string. 586 587 ${log_file_path}= Create OS Console File Path ${log_file_path} 588 589 ${log_output}= Stop SOL Console Logging ${log_file_path} 590 ... return_data=${return_data} 591 592 # Validate by making sure we can create the file. Problems creating the 593 # file would not be noticed by the subsequent ssh command because we fork 594 # the command. 595 Create File ${log_file_path} 596 ${sub_cmd_buf}= Create OS Console Command String 597 # Routing stderr to stdout so that any startup error text will go to the 598 # output file. 599 # TODO: Doesn't work with tox so reverting temporarily. 600 # nohup detaches the process completely from our pty. 601 #${cmd_buf}= Catenate nohup ${sub_cmd_buf} &> ${log_file_path} & 602 ${cmd_buf}= Catenate ${sub_cmd_buf} > ${log_file_path} 2>&1 & 603 Rdpissuing ${cmd_buf} 604 ${rc} ${output}= Run And Return Rc And Output ${cmd_buf} 605 # Because we are forking this command, we essentially will never get a 606 # non-zero return code or any output. 607 Should Be Equal ${rc} ${0} 608 609 Sleep 1 610 ${os_con_pid}= Get SOL Console Pid 611 612 Should Not Be Empty ${os_con_pid} 613 614 [Return] ${log_output} 615 616Get Time Stamp 617 [Documentation] Get the current time stamp data 618 ${cur_time}= Get Current Date result_format=%Y%m%d%H%M%S%f 619 [Return] ${cur_time} 620 621 622Start Journal Log 623 [Documentation] Start capturing journal log to a file in /tmp using 624 ... journalctl command. By default journal log is collected 625 ... at /tmp/journal_log else user input location. 626 ... The File is appended with datetime. 627 [Arguments] ${file_path}=/tmp/journal_log 628 629 Open Connection And Log In 630 631 ${cur_time}= Get Time Stamp 632 Set Global Variable ${LOG_TIME} ${cur_time} 633 Start Command 634 ... journalctl -f > ${file_path}-${LOG_TIME} 635 Log Journal Log Started: ${file_path}-${LOG_TIME} 636 637 638Stop Journal Log 639 [Documentation] Stop journalctl process if its running. 640 ... By default return log from /tmp/journal_log else 641 ... user input location. 642 [Arguments] ${file_path}=/tmp/journal_log 643 644 Open Connection And Log In 645 646 ${rc}= 647 ... Execute Command 648 ... ps ax | grep journalctl | grep -v grep 649 ... return_stdout=False return_rc=True 650 651 Return From Keyword If '${rc}' == '${1}' 652 ... No journal log process running 653 654 ${output} ${stderr}= 655 ... Execute Command killall journalctl 656 ... return_stderr=True 657 Should Be Empty ${stderr} 658 659 ${journal_log} ${stderr}= 660 ... Execute Command 661 ... cat ${file_path}-${LOG_TIME} 662 ... return_stderr=True 663 Should Be Empty ${stderr} 664 665 Log ${journal_log} 666 667 Execute Command rm ${file_path}-${LOG_TIME} 668 669 [Return] ${journal_log} 670 671Mac Address To Hex String 672 [Documentation] Converts MAC address into hex format. 673 ... Example 674 ... Given the following MAC: 00:01:6C:80:02:78 675 ... This keyword will return: 0x00 0x01 0x6C 0x80 0x02 0x78 676 ... Description of arguments: 677 ... i_macaddress MAC address in the following format 678 ... 00:01:6C:80:02:78 679 [Arguments] ${i_macaddress} 680 681 ${mac_hex}= Catenate 0x${i_macaddress.replace(':', ' 0x')} 682 [Return] ${mac_hex} 683 684IP Address To Hex String 685 [Documentation] Converts IP address into hex format. 686 ... Example: 687 ... Given the following IP: 10.3.164.100 688 ... This keyword will return: 0xa 0x3 0xa4 0xa0 689 ... Description of arguments: 690 ... i_ipaddress IP address in the following format 691 ... 10.10.10.10 692 [Arguments] ${i_ipaddress} 693 694 @{ip}= Split String ${i_ipaddress} . 695 ${index}= Set Variable ${0} 696 697 :FOR ${item} IN @{ip} 698 \ ${hex}= Convert To Hex ${item} prefix=0x lowercase=yes 699 \ Set List Value ${ip} ${index} ${hex} 700 \ ${index}= Set Variable ${index + 1} 701 ${ip_hex}= Catenate @{ip} 702 [Return] ${ip_hex} 703 704BMC CPU Performance Check 705 [Documentation] Minimal 10% of proc should be free in this instance 706 707 ${bmc_cpu_usage_output} ${stderr}= Execute Command ${bmc_cpu_usage_cmd} 708 ... return_stderr=True 709 Should be empty ${stderr} 710 ${bmc_cpu_percentage}= Fetch From Left ${bmc_cpu_usage_output} % 711 Should be true ${bmc_cpu_percentage} < 90 712 713BMC Mem Performance Check 714 [Documentation] Minimal 10% of memory should be free in this instance 715 716 ${bmc_mem_free_output} ${stderr}= Execute Command ${bmc_mem_free_cmd} 717 ... return_stderr=True 718 Should be empty ${stderr} 719 720 ${bmc_mem_total_output} ${stderr}= Execute Command ${bmc_mem_total_cmd} 721 ... return_stderr=True 722 Should be empty ${stderr} 723 724 ${bmc_mem_percentage}= Evaluate ${bmc_mem_free_output}*100 725 ${bmc_mem_percentage}= Evaluate 726 ... ${bmc_mem_percentage}/${bmc_mem_total_output} 727 Should be true ${bmc_mem_percentage} > 10 728 729BMC File System Usage Check 730 [Documentation] Check the file system space. None should be 100% full 731 ... except /run/initramfs/ro 732 ${bmc_fs_usage_output} ${stderr}= Execute Command 733 ... ${bmc_file_system_usage_cmd} return_stderr=True 734 Should Be Empty ${stderr} 735 Should Be True ${bmc_fs_usage_output}==0 736 737Check BMC CPU Performance 738 [Documentation] Minimal 10% of proc should be free in 3 sample 739 :FOR ${var} IN Range 1 4 740 \ BMC CPU Performance check 741 742Check BMC Mem Performance 743 [Documentation] Minimal 10% of memory should be free 744 745 :FOR ${var} IN Range 1 4 746 \ BMC Mem Performance check 747 748Check BMC File System Performance 749 [Documentation] Check for file system usage for 4 times 750 751 :FOR ${var} IN Range 1 4 752 \ BMC File System Usage check 753 754Get URL List 755 [Documentation] Return list of URLs under given URL. 756 [Arguments] ${openbmc_url} 757 # Description of argument(s): 758 # openbmc_url URL for list operation (e.g. 759 # /xyz/openbmc_project/inventory). 760 761 ${url_list}= Read Properties ${openbmc_url}/list quiet=${1} 762 Sort List ${url_list} 763 [Return] ${url_list} 764 765Get Endpoint Paths 766 [Documentation] Returns all url paths ending with given endpoint 767 ... Example: 768 ... Given the following endpoint: cpu 769 ... This keyword will return: list of all urls ending with 770 ... cpu - 771 ... /org/openbmc/inventory/system/chassis/motherboard/cpu0, 772 ... /org/openbmc/inventory/system/chassis/motherboard/cpu1 773 ... Description of arguments: 774 ... path URL path for enumeration 775 ... endpoint string for which url path ending 776 [Arguments] ${path} ${endpoint} 777 778 ${resp}= Read Properties ${path}/enumerate timeout=30 779 log Dictionary ${resp} 780 781 ${list}= Get Dictionary Keys ${resp} 782 ${resp}= Get Matches ${list} regexp=^.*[0-9a-z_].${endpoint}[0-9]*$ 783 [Return] ${resp} 784 785Check Zombie Process 786 [Documentation] Check if any defunct process exist or not on BMC 787 ${count} ${stderr} ${rc}= Execute Command ps -o stat | grep Z | wc -l 788 ... return_stderr=True return_rc=True 789 Should Be True ${count}==0 790 Should Be Empty ${stderr} 791 792Prune Journal Log 793 [Documentation] Prune archived journal logs. 794 [Arguments] ${vacuum_size}=1M 795 796 # This keyword can be used to prevent the journal 797 # log from filling up the /run filesystem. 798 # This command will retain only the latest logs 799 # of the user specified size. 800 801 Open Connection And Log In 802 ${output} ${stderr} ${rc}= 803 ... Execute Command 804 ... journalctl --vacuum-size=${vacuum_size} 805 ... return_stderr=True return_rc=True 806 807 Should Be Equal ${rc} ${0} msg=${stderr} 808 809Set BMC Power Policy 810 [Documentation] Set the given BMC power policy. 811 [Arguments] ${policy} 812 813 # Note that this function will translate the old style "RESTORE_LAST_STATE" 814 # policy to the new style "xyz.openbmc_project.Control.Power.RestorePolicy. 815 # Policy.Restore" for you. 816 817 # Description of argument(s): 818 # policy Power restore policy (e.g "RESTORE_LAST_STATE", 819 # ${RESTORE_LAST_STATE}). 820 821 # Set the bmc_power_policy_method to either 'Old' or 'New'. 822 Set Power Policy Method 823 # This translation helps bridge between old and new method for calling. 824 ${policy}= Translate Power Policy Value ${policy} 825 # Run the appropriate keyword. 826 Run Key ${bmc_power_policy_method} Set Power Policy \ ${policy} 827 ${currentPolicy}= Get System Power Policy 828 Should Be Equal ${currentPolicy} ${policy} 829 830New Set Power Policy 831 [Documentation] Set the given BMC power policy (new method). 832 [Arguments] ${policy} 833 834 # Description of argument(s): 835 # policy Power restore policy (e.g. ${RESTORE_LAST_STATE}). 836 837 ${valueDict}= Create Dictionary data=${policy} 838 Write Attribute 839 ... ${POWER_RESTORE_URI} PowerRestorePolicy data=${valueDict} 840 841Old Set Power Policy 842 [Documentation] Set the given BMC power policy (old method). 843 [Arguments] ${policy} 844 845 # Description of argument(s): 846 # policy Power restore policy (e.g. "RESTORE_LAST_STATE"). 847 848 ${valueDict}= create dictionary data=${policy} 849 Write Attribute ${HOST_SETTING} power_policy data=${valueDict} 850 851Get System Power Policy 852 [Documentation] Get the BMC power policy. 853 854 # Set the bmc_power_policy_method to either 'Old' or 'New'. 855 Set Power Policy Method 856 ${cmd_buf}= Create List ${bmc_power_policy_method} Get Power Policy 857 # Run the appropriate keyword. 858 ${currentPolicy}= Run Keyword @{cmd_buf} 859 [Return] ${currentPolicy} 860 861New Get Power Policy 862 [Documentation] Get the BMC power policy (new method). 863 ${currentPolicy}= Read Attribute ${POWER_RESTORE_URI} PowerRestorePolicy 864 [Return] ${currentPolicy} 865 866Old Get Power Policy 867 [Documentation] Get the BMC power policy (old method). 868 ${currentPolicy}= Read Attribute ${HOST_SETTING} power_policy 869 [Return] ${currentPolicy} 870 871Get Auto Reboot 872 [Documentation] Returns auto reboot setting. 873 ${setting}= Read Attribute ${CONTROL_HOST_URI}/auto_reboot AutoReboot 874 [Return] ${setting} 875 876Set Auto Reboot 877 [Documentation] Set the given auto reboot setting. 878 [Arguments] ${setting} 879 # setting auto reboot's setting, i.e. 1 for enabling and 0 for disabling. 880 881 ${valueDict}= Set Variable ${setting} 882 ${data}= Create Dictionary data=${valueDict} 883 Write Attribute ${CONTROL_HOST_URI}/auto_reboot AutoReboot data=${data} 884 ${current_setting}= Get Auto Reboot 885 Should Be Equal As Integers ${current_setting} ${setting} 886 887 888Set BMC Reset Reference Time 889 [Documentation] Set current boot time as a reference and increment 890 ... boot count. 891 892 ${cur_btime}= Get BMC Boot Time 893 Run Keyword If ${BOOT_TIME} == ${0} and ${BOOT_COUNT} == ${0} 894 ... Set Global Variable ${BOOT_TIME} ${cur_btime} 895 ... ELSE IF ${cur_btime} > ${BOOT_TIME} 896 ... Run Keywords Set Global Variable ${BOOT_TIME} ${cur_btime} 897 ... AND 898 ... Set Global Variable ${BOOT_COUNT} ${BOOT_COUNT + 1} 899 900Get BMC Boot Time 901 [Documentation] Get boot time from /proc/stat. 902 903 Open Connection And Log In 904 ${output} ${stderr}= 905 ... Execute Command egrep '^btime ' /proc/stat | cut -f 2 -d ' ' 906 ... return_stderr=True 907 Should Be Empty ${stderr} 908 ${btime}= Convert To Integer ${output} 909 [Return] ${btime} 910 911Execute Command On BMC 912 [Documentation] Execute given command on BMC and return output. 913 [Arguments] ${command} 914 ${stdout} ${stderr}= Execute Command ${command} return_stderr=True 915 Should Be Empty ${stderr} 916 [Return] ${stdout} 917 918 919Enable Core Dump On BMC 920 [Documentation] Enable core dump collection. 921 Open Connection And Log In 922 ${core_pattern}= Execute Command On BMC 923 ... echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern 924 Should Be Equal As Strings ${core_pattern} /tmp/core_%e.%p 925 926Get Number Of BMC Core Dump Files 927 [Documentation] Get number of core dump files on BMC. 928 Open Connection And Log In 929 ${num_of_core_dump}= Execute Command 930 ... ls /tmp/core* 2>/dev/null | wc -l 931 [Return] ${num_of_core_dump} 932 933Set Core Dump File Size Unlimited 934 [Documentation] Set core dump file size to unlimited. 935 Open Connection And Log In 936 Execute Command On BMC 937 ... ulimit -c unlimited 938 939Check For Core Dumps 940 [Documentation] Check for any core dumps exist. 941 ${output}= Get Number Of BMC Core Dump Files 942 Run Keyword If ${output} > 0 943 ... Log **Warning** BMC core dump files exist level=WARN 944 945Trigger Host Watchdog Error 946 [Documentation] Inject host watchdog timeout error via REST. 947 [Arguments] ${milliseconds}=1000 ${sleep_time}=5s 948 # Description of argument(s): 949 # milliseconds The time watchdog timer value in milliseconds (e.g. 1000 = 950 # 1 second). 951 # sleep_time Time delay for host watchdog error to get injected. 952 # Default is 5 seconds. 953 954 ${data}= Create Dictionary data=${True} 955 Write Attribute /xyz/openbmc_project/watchdog/host0 Enabled data=${data} 956 957 ${data}= Create Dictionary data=${milliseconds} 958 Write Attribute /xyz/openbmc_project/watchdog/host0 TimeRemaining data=${data} 959 960 Sleep ${sleep_time} 961 962Login To OS Host 963 [Documentation] Login to OS Host. 964 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 965 ... ${os_password}=${OS_PASSWORD} 966 # Desription of arguments: 967 # ${os_host} IP address of the OS Host. 968 # ${os_username} OS Host Login user name. 969 # ${os_password} OS Host Login passwrd. 970 971 ${os_state}= Run Keyword And Return Status Ping Host ${os_host} 972 Run Keyword If '${os_state}' == 'False' 973 ... Run Keywords Initiate Host Reboot AND 974 ... Is Host Running AND 975 ... Wait for OS ${os_host} ${os_username} ${os_password} 976 977 SSHLibrary.Open Connection ${os_host} 978 ${resp}= Login ${os_username} ${os_password} 979 [Return] ${resp} 980 981Configure Initial Settings 982 [Documentation] Restore old IP and route. 983 ... This keyword requires initial settings viz IP address, 984 ... Network Mask, default gatway and serial console IP and port 985 ... information which should be provided in command line. 986 987 [Arguments] ${host}=${OPENBMC_HOST} ${mask}=${NET_MASK} 988 ... ${gw_ip}=${GW_IP} 989 990 # Open telnet connection and ignore the error, in case telnet session is 991 # already opened by the program calling this keyword. 992 993 Run Keyword And Ignore Error Open Telnet Connection to BMC Serial Console 994 Telnet.write ifconfig eth0 ${host} netmask ${mask} 995 Telnet.write route add default gw ${gw_ip} 996 997Install Debug Tarball On BMC 998 [Documentation] Copy the debug tar file to BMC and install. 999 [Arguments] ${tarball_file_path}=${EXECDIR}/obmc-phosphor-debug-tarball-witherspoon.tar.xz 1000 ... ${targ_tarball_dir_path}=/tmp/tarball/ 1001 1002 # Description of arguments: 1003 # tarball_file_path Path of the debug tarball file. 1004 # The tar file is downloaded from the build page 1005 # https://openpower.xyz/job/openbmc-build/ 1006 # obmc-phosphor-debug-tarball-witherspoon.tar.xz 1007 # 1008 # targ_tarball_dir_path The directory path where the tarball is to be 1009 # installed. 1010 1011 OperatingSystem.File Should Exist ${tarball_file_path} 1012 ... msg=${tarball_file_path} doesn't exist. 1013 1014 # Upload the file to BMC. 1015 Import Library SCPLibrary WITH NAME scp 1016 Open Connection for SCP 1017 scp.Put File ${tarball_file_path} /tmp/debug-tarball.tar.xz 1018 1019 # Create tarball directory and install. 1020 BMC Execute Command mkdir -p ${targ_tarball_dir_path} 1021 BMC Execute Command 1022 ... tar -xf /tmp/debug-tarball.tar.xz -C ${targ_tarball_dir_path} 1023 1024 # Remove the tarball file from BMC. 1025 BMC Execute Command rm -f /tmp/debug-tarball.tar.xz 1026 1027 1028Get BMC Boot Count 1029 [Documentation] Get BMC boot count based on boot time. 1030 ${cur_btime}= Get BMC Boot Time 1031 1032 # Set global variable BOOT_TIME to current boot time if current boot time 1033 # is changed. Also increase value of global variable BOOT_COUNT by 1. 1034 Run Keyword If ${cur_btime} > ${BOOT_TIME} 1035 ... Run Keywords Set Global Variable ${BOOT_TIME} ${cur_btime} 1036 ... AND 1037 ... Set Global Variable ${BOOT_COUNT} ${BOOT_COUNT + 1} 1038 [Return] ${BOOT_COUNT} 1039 1040Set BMC Boot Count 1041 [Documentation] Set BMC boot count to given value. 1042 [Arguments] ${count} 1043 1044 # Description of arguments: 1045 # count boot count value. 1046 ${cur_btime}= Get BMC Boot Time 1047 1048 # Set global variable BOOT_COUNT to given value. 1049 Set Global Variable ${BOOT_COUNT} ${count} 1050 1051 # Set BOOT_TIME variable to current boot time. 1052 Set Global Variable ${BOOT_COUNT} ${count} 1053 1054Get System LED State 1055 [Documentation] Return the state of given system LED. 1056 [Arguments] ${led_name} 1057 1058 # Description of argument(s): 1059 # led_name System LED name (e.g. heartbeat, identify, beep). 1060 1061 ${state}= Read Attribute ${LED_PHYSICAL_URI}${led_name} State 1062 [Return] ${state.rsplit('.', 1)[1]} 1063 1064 1065Delete Error Logs 1066 [Documentation] Delete error logs. 1067 1068 # Check if error logs entries exist, if not return. 1069 ${resp}= OpenBMC Get Request ${BMC_LOGGING_ENTRY}${/}list quiet=${1} 1070 Return From Keyword If ${resp.status_code} == ${HTTP_NOT_FOUND} 1071 1072 # Get the list of error logs entries and delete them all. 1073 ${elog_entries}= Get URL List ${BMC_LOGGING_ENTRY} 1074 :FOR ${entry} IN @{elog_entries} 1075 \ Delete Error Log Entry ${entry} 1076 1077 1078Delete Error Log Entry 1079 [Documentation] Delete error log entry. 1080 [Arguments] ${entry_path} 1081 1082 # Description of argument(s): 1083 # entry_path Delete an error log entry. 1084 # Ex. /xyz/openbmc_project/logging/entry/1 1085 1086 # Skip delete if entry URI is a callout. 1087 # Example: /xyz/openbmc_project/logging/entry/1/callout 1088 Return From Keyword If '${entry_path.rsplit('/', 1)[1]}' == 'callout' 1089 1090 ${data}= Create Dictionary data=@{EMPTY} 1091 ${resp}= Openbmc Delete Request ${entry_path} data=${data} 1092 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 1093 1094 1095Delete All Error Logs 1096 [Documentation] Delete all error log entries using "DeleteAll" interface. 1097 1098 ${data}= Create Dictionary data=@{EMPTY} 1099 ${resp}= Openbmc Post Request ${BMC_LOGGING_URI}action/DeleteAll 1100 ... data=${data} 1101 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 1102 1103 1104Get LED State XYZ 1105 [Documentation] Returns state of given LED. 1106 [Arguments] ${led_name} 1107 # Description of argument(s): 1108 # led_name Name of LED 1109 1110 ${state}= Read Attribute ${LED_GROUPS_URI}${led_name} Asserted 1111 [Return] ${state} 1112 1113 1114Get BMC Version 1115 [Documentation] Returns BMC version from /etc/os-release. 1116 ... e.g. "v1.99.6-141-ge662190" 1117 1118 Open Connection And Log In 1119 ${cmd}= Set Variable grep ^VERSION_ID= /etc/os-release | cut -f 2 -d '=' 1120 ${output}= Execute Command On BMC ${cmd} 1121 [Return] ${output} 1122 1123 1124Get PNOR Version 1125 [Documentation] Get the PNOR version from the BMC. 1126 1127 ${pnor_attrs}= Get PNOR Attributes 1128 [Return] ${pnor_attrs['version']} 1129 1130 1131Get PNOR Attributes 1132 [Documentation] Return PNOR software attributes as a dictionary. 1133 1134 # This keyword parses /var/lib/phosphor-software-manager/pnor/ro/pnor.toc into key/value pairs. 1135 1136 ${outbuf} ${stderr} ${rc}= BMC Execute Command 1137 ... cat /var/lib/phosphor-software-manager/pnor/ro/pnor.toc 1138 ${pnor_attrs}= Key Value Outbuf To Dict ${outbuf} delim== 1139 1140 [Return] ${pnor_attrs} 1141 1142 1143Get Elog URL List 1144 [Documentation] Return error log entry list of URLs. 1145 1146 ${url_list}= Read Properties /xyz/openbmc_project/logging/entry/ 1147 Sort List ${url_list} 1148 [Return] ${url_list} 1149 1150 1151Read Turbo Setting Via REST 1152 [Documentation] Return turbo setting via REST. 1153 1154 ${resp}= OpenBMC Get Request ${SENSORS_URI}host/TurboAllowed 1155 ${jsondata}= To JSON ${resp.content} 1156 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 1157 [Return] ${jsondata["data"]["value"]} 1158 1159 1160Set Turbo Setting Via REST 1161 [Documentation] Set turbo setting via REST. 1162 [Arguments] ${setting} 1163 # Description of argument(s): 1164 # setting Value which needs to be set.(i.e. False or True) 1165 1166 ${valueDict}= Create Dictionary data=${setting} 1167 Write Attribute ${SENSORS_URI}host/TurboAllowed value data=${valueDict} 1168