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