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