1*** Settings *** 2 3Documentation Utilities for Robot keywords. 4 5Resource ../lib/resource.txt 6Resource ../lib/rest_client.robot 7Resource ../lib/connection_client.robot 8Library String 9Library DateTime 10Library Process 11Library OperatingSystem 12Library gen_print.py 13Library gen_robot_print.py 14Library gen_cmd.py 15Library gen_robot_keyword.py 16Library bmc_ssh_utils.py 17Library utils.py 18Library var_funcs.py 19Library SCPLibrary WITH NAME scp 20 21*** Variables *** 22 23${pflash_cmd} /usr/sbin/pflash -r /dev/stdout -P VERSION 24${SYSTEM_SHUTDOWN_TIME} ${5} 25 26${dbuscmdBase} 27... dbus-send --system --print-reply --dest=${OPENBMC_BASE_DBUS}.settings.Host 28${dbuscmdGet} 29... ${SETTINGS_URI}host0 org.freedesktop.DBus.Properties.Get 30${dbuscmdString}= string:"xyz.openbmc_project.settings.Host" string: 31 32# Assign default value to QUIET for programs which may not define it. 33${QUIET} ${0} 34 35${bmc_mem_free_cmd}= free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f4 36${bmc_mem_total_cmd}= free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2 37${bmc_cpu_usage_cmd}= top -n 1 | grep CPU: | cut -c 7-9 38${HOST_SETTING} ${SETTINGS_URI}host0 39 40# /run/initramfs/ro associate filesystem should be 100% full always 41${bmc_file_system_usage_cmd}= df -h | cut -c 52-54 | grep 100 | wc -l 42${total_pnor_ro_file_system_cmd}= df -h | grep /media/pnor-ro | wc -l 43${total_bmc_ro_file_system_cmd}= df -h | grep /media/rofs | wc -l 44 45${BOOT_TIME} ${0} 46${BOOT_COUNT} ${0} 47${count} ${0} 48${devicetree_base} /sys/firmware/devicetree/base/model 49 50# Initialize default debug value to 0. 51${DEBUG} ${0} 52 53${probe_cpu_tool_path} ${EXECDIR}/tools/ras/probe_cpus.sh 54${scom_addrs_tool_path} ${EXECDIR}/tools/ras/scom_addr_p9.sh 55${target_file_path} /root/ 56 57${default_tarball} ${EXECDIR}/obmc-phosphor-debug-tarball-witherspoon.tar.xz 58 59# These variables are used to straddle between new and old methods of setting 60# values. 61${boot_prog_method} ${EMPTY} 62${power_policy_setup} ${0} 63${bmc_power_policy_method} ${EMPTY} 64@{valid_power_policy_vars} RESTORE_LAST_STATE ALWAYS_POWER_ON 65... ALWAYS_POWER_OFF 66 67 68*** Keywords *** 69 70Check BMC Performance 71 [Documentation] Check BMC basic CPU Mem File system performance. 72 73 Check BMC CPU Performance 74 Check BMC Mem Performance 75 Check BMC File System Performance 76 77 78Verify PNOR Update 79 [Documentation] Verify that the PNOR is not corrupted. 80 # Example: 81 # FFS: Flash header not found. Code: 100 82 # Error 100 opening ffs ! 83 84 ${pnor_info}= OS Execute Command ${pflash_cmd} 85 Should Not Contain Any ${pnor_info} Flash header not found Error 86 87 88Get BMC System Model 89 [Documentation] Get the BMC model from the device tree and return it. 90 91 ${bmc_model} ${stderr} ${rc}= BMC Execute Command 92 ... cat ${devicetree_base} | cut -d " " -f 1 return_stderr=True 93 ... test_mode=0 94 Should Be Empty ${stderr} 95 Should Not Be Empty ${bmc_model} msg=BMC model is empty. 96 [Return] ${bmc_model} 97 98 99Verify BMC System Model 100 [Documentation] Verify the BMC model with ${OPENBMC_MODEL}. 101 [Arguments] ${bmc_model} 102 103 # Description of argument(s): 104 # bmc_model System model (e.g. "witherspoon"). 105 106 ${tmp_bmc_model}= Fetch From Right ${OPENBMC_MODEL} / 107 ${tmp_bmc_model}= Fetch From Left ${tmp_bmc_model} . 108 ${ret}= Run Keyword And Return Status Should Contain ${bmc_model} 109 ... ${tmp_bmc_model} ignore_case=True 110 [Return] ${ret} 111 112 113Wait For Host To Ping 114 [Arguments] ${host} ${timeout}=${OPENBMC_REBOOT_TIMEOUT}min 115 ... ${interval}=5 sec 116 117 # Description of argument(s): 118 # host The host name or IP of the host to ping. 119 # timeout The amount of time after which ping attempts cease. 120 # This should be expressed in Robot Framework's time format 121 # (e.g. "10 seconds"). 122 # interval The amount of time in between attempts to ping. 123 # This should be expressed in Robot Framework's time format 124 # (e.g. "5 seconds"). 125 126 Wait Until Keyword Succeeds ${timeout} ${interval} Ping Host ${host} 127 128 129Ping Host 130 [Arguments] ${host} 131 132 # Description of argument(s): 133 # host The host name or IP of the host to ping. 134 135 Should Not Be Empty ${host} msg=No host provided 136 ${RC} ${output}= Run and return RC and Output ping -c 4 ${host} 137 Log RC: ${RC}\nOutput:\n${output} 138 Should be equal ${RC} ${0} 139 140 141Get Boot Progress 142 [Documentation] Get the boot progress and return it. 143 [Arguments] ${quiet}=${QUIET} 144 145 # Description of argument(s): 146 # quiet Indicates whether this keyword should run without any output to 147 # the console. 148 149 Set Boot Progress Method 150 ${state}= Run Keyword If '${boot_prog_method}' == 'New' 151 ... New Get Boot Progress quiet=${quiet} 152 ... ELSE 153 ... Old Get Boot Progress quiet=${quiet} 154 155 [Return] ${state} 156 157 158Set Boot Progress Method 159 [Documentation] Set the boot_prog_method to either 'Old' or 'New'. 160 161 # The boot progress data has moved from an 'org' location to an 'xyz' 162 # location. This keyword will determine whether the new method of getting 163 # the boot progress is valid and will set the global boot_prog_method 164 # variable accordingly. If boot_prog_method is already set (either by a 165 # prior call to this function or via a -v parm), this keyword will simply 166 # return. 167 168 # Note: There are interim builds that contain boot_progress in both the 169 # old and the new location values. It is nearly impossible for this 170 # keyword to determine whether the old boot_progress or the new one is 171 # active. When using such builds where the old boot_progress is active, 172 # the only recourse users will have is that they may specify 173 # -v boot_prog_method:Old to force old behavior on such builds. 174 175 Run Keyword If '${boot_prog_method}' != '${EMPTY}' Return From Keyword 176 177 ${new_status} ${new_value}= Run Keyword And Ignore Error 178 ... New Get Boot Progress 179 # If the new style read fails, the method must necessarily be "Old". 180 Run Keyword If '${new_status}' == 'PASS' 181 ... Run Keywords 182 ... Set Global Variable ${boot_prog_method} New AND 183 ... Rqpvars boot_prog_method AND 184 ... Return From Keyword 185 186 # Default method is "Old". 187 Set Global Variable ${boot_prog_method} Old 188 Rqpvars boot_prog_method 189 190 191Old Get Boot Progress 192 [Documentation] Get the boot progress the old way (via org location). 193 [Arguments] ${quiet}=${QUIET} 194 195 # Description of argument(s): 196 # quiet Indicates whether this keyword should run without any output to 197 # the console. 198 199 ${state}= Read Attribute ${OPENBMC_BASE_URI}sensors/host/BootProgress 200 ... value quiet=${quiet} 201 202 [Return] ${state} 203 204 205New Get Boot Progress 206 [Documentation] Get the boot progress the new way (via xyz location). 207 [Arguments] ${quiet}=${QUIET} 208 209 # Description of argument(s): 210 # quiet Indicates whether this keyword should run without any output to 211 # the console. 212 213 ${state}= Read Attribute ${HOST_STATE_URI} BootProgress quiet=${quiet} 214 215 [Return] ${state.rsplit('.', 1)[1]} 216 217 218Is Power On 219 ${state}= Get Power State 220 Should be equal ${state} ${1} 221 222 223Is Power Off 224 ${state}= Get Power State 225 Should be equal ${state} ${0} 226 227 228Initiate Power On 229 [Documentation] Initiates the power on and waits until the Is Power On 230 ... keyword returns that the power state has switched to on. 231 [Arguments] ${wait}=${1} 232 233 # Description of argument(s): 234 # wait Indicates whether to wait for a powered on state after issuing 235 # the power on command. 236 237 @{arglist}= Create List 238 ${args}= Create Dictionary data=@{arglist} 239 ${resp}= Call Method ${OPENBMC_BASE_URI}control/chassis0/ powerOn 240 ... data=${args} 241 should be equal as strings ${resp.status_code} ${HTTP_OK} 242 243 # Does caller want to wait for power on status? 244 Run Keyword If '${wait}' == '${0}' Return From Keyword 245 Wait Until Keyword Succeeds 3 min 10 sec Is Power On 246 247 248Initiate Power Off 249 [Documentation] Initiates the power off and waits until the Is Power Off 250 ... keyword returns that the power state has switched to off. 251 252 @{arglist}= Create List 253 ${args}= Create Dictionary data=@{arglist} 254 ${resp}= Call Method ${OPENBMC_BASE_URI}control/chassis0/ powerOff 255 ... data=${args} 256 should be equal as strings ${resp.status_code} ${HTTP_OK} 257 Wait Until Keyword Succeeds 1 min 10 sec Is Power Off 258 259 260Initiate OS Host Power Off 261 [Documentation] Initiate an OS reboot. 262 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 263 ... ${os_password}=${OS_PASSWORD} ${hard}=${0} 264 265 # Description of argument(s): 266 # os_host The DNS name or IP of the OS. 267 # os_username The username to be used to sign in to the OS. 268 # os_password The password to be used to sign in to the OS. 269 # hard Indicates whether to do a hard vs. soft power off. 270 271 ${time_string}= Run Keyword If ${hard} Set Variable ${SPACE}now 272 ... ELSE Set Variable ${EMPTY} 273 274 ${cmd_buf}= Run Keyword If '${os_username}' == 'root' 275 ... Set Variable shutdown${time_string} 276 ... ELSE 277 ... Set Variable echo ${os_password} | sudo -S shutdown${time_string} 278 279 ${output} ${stderr} ${rc}= OS Execute Command 280 ... ${cmd_buf} fork=${1} 281 282 283Initiate OS Host Reboot 284 [Documentation] Initiate an OS reboot. 285 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 286 ... ${os_password}=${OS_PASSWORD} 287 288 # Description of argument(s): 289 # os_host The host name or IP address of the OS. 290 # os_username The username to be used to sign in to the OS. 291 # os_password The password to be used to sign in to the OS. 292 293 ${cmd_buf}= Run Keyword If '${os_username}' == 'root' 294 ... Set Variable reboot 295 ... ELSE 296 ... Set Variable echo ${os_password} | sudo -S reboot 297 298 ${output} ${stderr} ${rc}= OS Execute Command 299 ... ${cmd_buf} fork=${1} 300 301 302Initiate Auto Reboot 303 [Documentation] Initiate an auto reboot. 304 [Arguments] ${milliseconds}=5000 305 306 # Description of argument(s): 307 # milliseconds The number of milliseconds for the watchdog timer. 308 309 # Set the auto reboot policy. 310 Set Auto Reboot ${1} 311 # Set the watchdog timer. 312 Trigger Host Watchdog Error ${milliseconds} 313 314 315Trigger Warm Reset 316 [Documentation] Initiate a warm reset. 317 318 log to console "Triggering warm reset" 319 ${data}= create dictionary data=@{EMPTY} 320 ${resp}= openbmc post request 321 ... ${OPENBMC_BASE_URI}control/bmc0/action/warmReset data=${data} 322 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 323 ${session_active}= Check If warmReset is Initiated 324 Run Keyword If '${session_active}' == '${True}' 325 ... Fail msg=warm reset didn't occur 326 327 Sleep ${SYSTEM_SHUTDOWN_TIME}min 328 Check If BMC Is Up 329 330 331Check OS 332 [Documentation] Attempts to ping the host OS and then checks that the host 333 ... OS is up by running an SSH command. 334 335 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 336 ... ${os_password}=${OS_PASSWORD} ${quiet}=${QUIET} 337 ... ${print_string}=${EMPTY} 338 [Teardown] SSHLibrary.Close Connection 339 340 # Description of argument(s): 341 # os_host The DNS name/IP of the OS host associated with our BMC. 342 # os_username The username to be used to sign on to the OS host. 343 # os_password The password to be used to sign on to the OS host. 344 # quiet Indicates whether this keyword should write to console. 345 # print_string A string to be printed before checking the OS. 346 347 rprint ${print_string} 348 349 # Attempt to ping the OS. Store the return code to check later. 350 ${ping_rc}= Run Keyword and Return Status Ping Host ${os_host} 351 352 SSHLibrary.Open connection ${os_host} 353 354 ${status} ${msg}= Run Keyword And Ignore Error Login ${os_username} 355 ... ${os_password} 356 ${err_msg1}= Sprint Error ${msg} 357 ${err_msg}= Catenate SEPARATOR= \n ${err_msg1} 358 Run Keyword If '${status}' == 'FAIL' Fail msg=${err_msg} 359 ${output} ${stderr} ${rc}= Execute Command uptime return_stderr=True 360 ... return_rc=True 361 362 ${temp_msg}= Catenate Could not execute a command on the operating 363 ... system.\n 364 ${err_msg1}= Sprint Error ${temp_msg} 365 ${err_msg}= Catenate SEPARATOR= \n ${err_msg1} 366 367 # If the return code returned by "Execute Command" is non-zero, this 368 # keyword will fail. 369 Should Be Equal ${rc} ${0} msg=${err_msg} 370 # We will likewise fail if there is any stderr data. 371 Should Be Empty ${stderr} 372 373 ${temp_msg}= Set Variable Could not ping the operating system.\n 374 ${err_msg1}= Sprint Error ${temp_msg} 375 ${err_msg}= Catenate SEPARATOR= \n ${err_msg1} 376 # We will likewise fail if the OS did not ping, as we could SSH but not 377 # ping 378 Should Be Equal As Strings ${ping_rc} ${TRUE} msg=${err_msg} 379 380 381Wait for OS 382 [Documentation] Waits for the host OS to come up via calls to "Check OS". 383 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 384 ... ${os_password}=${OS_PASSWORD} ${timeout}=${OS_WAIT_TIMEOUT} 385 ... ${quiet}=${0} 386 [Teardown] rprintn 387 388 # Description of argument(s): 389 # os_host The DNS name or IP of the OS host associated with our 390 # BMC. 391 # os_username The username to be used to sign on to the OS host. 392 # os_password The password to be used to sign on to the OS host. 393 # timeout The timeout in seconds indicating how long you're 394 # willing to wait for the OS to respond. 395 # quiet Indicates whether this keyword should write to console. 396 397 # The interval to be used between calls to "Check OS". 398 ${interval}= Set Variable 5 399 400 ${message}= Catenate Checking every ${interval} seconds for up to 401 ... ${timeout} seconds for the operating system to communicate. 402 rqprint_timen ${message} 403 404 Wait Until Keyword Succeeds ${timeout} sec ${interval} Check OS 405 ... ${os_host} ${os_username} ${os_password} 406 ... print_string=\# 407 408 rqprintn 409 410 rqprint_timen The operating system is now communicating. 411 412 413Get Power State 414 [Documentation] Returns the power state as an integer. Either 0 or 1. 415 [Arguments] ${quiet}=${QUIET} 416 417 # Description of argument(s): 418 # quiet Indicates whether this keyword should run without any output to 419 # the console. 420 421 @{arglist}= Create List 422 ${args}= Create Dictionary data=@{arglist} 423 424 ${resp}= Call Method ${OPENBMC_BASE_URI}control/chassis0/ getPowerState 425 ... data=${args} quiet=${quiet} 426 Should be equal as strings ${resp.status_code} ${HTTP_OK} 427 ${content}= to json ${resp.content} 428 429 [Return] ${content["data"]} 430 431 432Clear BMC Gard Record 433 [Documentation] Clear gard records from the system. 434 435 @{arglist}= Create List 436 ${args}= Create Dictionary data=@{arglist} 437 ${resp}= Call Method 438 ... ${OPENPOWER_CONTROL}gard Reset data=${args} 439 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 440 441 442Copy PNOR to BMC 443 Import Library SCPLibrary WITH NAME scp 444 Open Connection for SCP 445 Log Copying ${PNOR_IMAGE_PATH} to /tmp 446 scp.Put File ${PNOR_IMAGE_PATH} /tmp 447 448 449Flash PNOR 450 [Documentation] Calls flash bios update method to flash PNOR image 451 [Arguments] ${pnor_image} 452 453 # Description of argument(s): 454 # pnor_image The filename and path of the PNOR image 455 # (e.g. "/home/image/zaius.pnor"). 456 457 @{arglist}= Create List ${pnor_image} 458 ${args}= Create Dictionary data=@{arglist} 459 ${resp}= Call Method /org/openbmc/control/flash/bios/ update 460 ... data=${args} 461 should be equal as strings ${resp.status_code} ${HTTP_OK} 462 Wait Until Keyword Succeeds 2 min 10 sec Is PNOR Flashing 463 464 465Get Flash BIOS Status 466 [Documentation] Returns the status of the flash BIOS API as a string. For 467 ... example 'Flashing', 'Flash Done', etc 468 ${data}= Read Properties /org/openbmc/control/flash/bios 469 [Return] ${data['status']} 470 471 472Is PNOR Flashing 473 [Documentation] Get BIOS 'Flashing' status. This indicates that PNOR 474 ... flashing has started. 475 ${status}= Get Flash BIOS Status 476 Should Contain ${status} Flashing 477 478 479Is PNOR Flash Done 480 [Documentation] Get BIOS 'Flash Done' status. This indicates that the 481 ... PNOR flashing has completed. 482 ${status}= Get Flash BIOS Status 483 should be equal as strings ${status} Flash Done 484 485 486Is OS Starting 487 [Documentation] Check if boot progress is OS starting. 488 ${boot_progress}= Get Boot Progress 489 Should Be Equal ${boot_progress} OSStart 490 491 492Is OS Off 493 [Documentation] Check if boot progress is "Off". 494 ${boot_progress}= Get Boot Progress 495 Should Be Equal ${boot_progress} Off 496 497 498Get Boot Progress To OS Starting State 499 [Documentation] Get the system to a boot progress state of 'FW Progress, 500 ... Starting OS'. 501 502 ${boot_progress}= Get Boot Progress 503 Run Keyword If '${boot_progress}' == 'OSStart' 504 ... Log Host is already in OS starting state 505 ... ELSE 506 ... Run Keywords Initiate Host PowerOff AND Initiate Host Boot 507 ... AND Wait Until Keyword Succeeds 10 min 10 sec Is OS Starting 508 509 510Verify Ping and REST Authentication 511 ${l_ping}= Run Keyword And Return Status 512 ... Ping Host ${OPENBMC_HOST} 513 Run Keyword If '${l_ping}' == '${False}' 514 ... Fail msg=Ping Failed 515 516 ${l_rest}= Run Keyword And Return Status 517 ... Initialize OpenBMC 518 Run Keyword If '${l_rest}' == '${False}' 519 ... Fail msg=REST Authentication Failed 520 521 # Just to make sure the SSH is working for SCP 522 Open Connection And Log In 523 ${system} ${stderr}= Execute Command hostname return_stderr=True 524 Should Be Empty ${stderr} 525 526 527Check If BMC is Up 528 [Documentation] Wait for Host to be online. Checks every X seconds 529 ... interval for Y minutes and fails if timed out. 530 ... Default MAX timedout is 10 min, interval 10 seconds. 531 [Arguments] ${max_timeout}=${OPENBMC_REBOOT_TIMEOUT} min 532 ... ${interval}=10 sec 533 534 # Description of argument(s): 535 # max_timeout Maximum time to wait. 536 # This should be expressed in Robot Framework's time format 537 # (e.g. "10 minutes"). 538 # interfal Interval to wait between status checks. 539 # This should be expressed in Robot Framework's time format 540 # (e.g. "5 seconds"). 541 542 Wait Until Keyword Succeeds 543 ... ${max_timeout} ${interval} Verify Ping and REST Authentication 544 545 546Check If warmReset is Initiated 547 [Documentation] Ping would be still alive, so try SSH to connect 548 ... if fails the ports are down indicating reboot 549 ... is in progress 550 551 # Warm reset adds 3 seconds delay before forcing reboot 552 # To minimize race conditions, we wait for 7 seconds 553 Sleep 7s 554 ${alive}= Run Keyword and Return Status 555 ... Open Connection And Log In 556 Return From Keyword If '${alive}' == '${False}' ${False} 557 [Return] ${True} 558 559 560Flush REST Sessions 561 [Documentation] Removes all the active session objects 562 Delete All Sessions 563 564 565Initialize DBUS cmd 566 [Documentation] Initialize dbus string with property string to extract 567 [Arguments] ${boot_property} 568 569 # Description of argument(s): 570 # boot_property Property string. 571 572 ${cmd}= Catenate ${dbuscmdBase} ${dbuscmdGet} ${dbuscmdString} 573 ${cmd}= Catenate ${cmd}${boot_property} 574 Set Global Variable ${dbuscmd} ${cmd} 575 576 577Create OS Console File Path 578 [Documentation] Create OS console file path name and return it. 579 [Arguments] ${log_file_path}=${EMPTY} 580 581 # Description of arguments: 582 # file_path The caller's candidate value. If this value is ${EMPTY}, this 583 # keyword will compose a file path name. Otherwise, this 584 # keyword will use the caller's file_path value. In either 585 # case, the value will be returned. 586 587 ${default_file_path}= Catenate /tmp/${OPENBMC_HOST}_os_console.txt 588 ${log_file_path}= Set Variable If '${log_file_path}' == '${EMPTY}' 589 ... ${default_file_path} ${log_file_path} 590 591 [Return] ${log_file_path} 592 593 594Create OS Console Command String 595 [Documentation] Return a command string to start OS console logging. 596 597 # First make sure that the ssh_pw program is available. 598 ${cmd}= Catenate which ssh_pw 2>/dev/null || find 599 ... ${EXECDIR} -name 'ssh_pw' 600 601 Rdpissuing ${cmd} 602 ${rc} ${output}= Run And Return Rc And Output ${cmd} 603 Rdpvars rc output 604 605 Should Be Equal As Integers 0 ${rc} msg=Could not find ssh_pw. 606 607 ${ssh_pw_file_path}= Set Variable ${output} 608 609 ${cmd}= Catenate ${ssh_pw_file_path} ${OPENBMC_PASSWORD} -p 2200 610 ... -o "StrictHostKeyChecking no" ${OPENBMC_USERNAME}@${OPENBMC_HOST} 611 612 [Return] ${cmd} 613 614 615Get SOL Console Pid 616 [Documentation] Get the pid of the active SOL console job. 617 [Arguments] ${expect_running}=${0} 618 619 # Description of argument(s): 620 # expect_running If set and if no SOL console job is found, print debug 621 # info and fail. 622 623 # Find the pid of the active system console logging session (if any). 624 ${search_string}= Create OS Console Command String 625 # At least in some cases, ps output does not show double quotes so we must 626 # replace them in our search string with the regexes to indicate that they 627 # are optional. 628 ${search_string}= Replace String ${search_string} " ["]? 629 ${ps_cmd}= Catenate ps axwwo user,pid,cmd 630 ${cmd_buf}= Catenate echo $(${ps_cmd} | egrep '${search_string}' | 631 ... egrep -v grep | cut -c10-14) 632 Rdpissuing ${cmd_buf} 633 ${rc} ${os_con_pid}= Run And Return Rc And Output ${cmd_buf} 634 Rdpvars os_con_pid 635 # If rc is not zero it just means that there is no OS Console process 636 # running. 637 638 Return From Keyword If '${os_con_pid}' != '${EMPTY}' ${os_con_pid} 639 Return From Keyword If '${expect_running}' == '${0}' ${os_con_pid} 640 641 Cmd Fnc cat ${log_file_path} ; echo ; ${ps_cmd} quiet=${0} 642 ... print_output=${1} show_err=${1} 643 644 Should Not Be Empty ${os_con_pid} 645 646 647Stop SOL Console Logging 648 [Documentation] Stop system console logging and return log output. 649 [Arguments] ${log_file_path}=${EMPTY} 650 ... ${targ_file_path}=${EXECDIR}${/}logs${/} 651 ... ${return_data}=${1} 652 653 # If there are muliple system console processes, they will all be stopped. 654 # If there is no existing log file this keyword will return an error 655 # message to that effect (and write that message to targ_file_path, if 656 # specified). 657 # NOTE: This keyword will not fail if there is no running system console 658 # process. 659 660 # Description of arguments: 661 # log_file_path The file path that was used to call "Start SOL 662 # Console Logging". See that keyword (above) for details. 663 # targ_file_path If specified, the file path to which the source 664 # file path (i.e. "log_file_path") should be copied. 665 # return_data If this is set to ${1}, this keyword will return the SOL 666 # data to the caller as a unicode string. 667 668 ${log_file_path}= Create OS Console File Path ${log_file_path} 669 670 ${os_con_pid}= Get SOL Console Pid 671 672 ${cmd_buf}= Catenate kill -9 ${os_con_pid} 673 Run Keyword If '${os_con_pid}' != '${EMPTY}' Rdpissuing ${cmd_buf} 674 ${rc} ${output}= Run Keyword If '${os_con_pid}' != '${EMPTY}' 675 ... Run And Return Rc And Output ${cmd_buf} 676 Run Keyword If '${os_con_pid}' != '${EMPTY}' Rdpvars rc output 677 678 Run Keyword If '${targ_file_path}' != '${EMPTY}' 679 ... Run Keyword And Ignore Error 680 ... Copy File ${log_file_path} ${targ_file_path} 681 682 ${output}= Set Variable ${EMPTY} 683 ${loc_quiet}= Evaluate ${debug}^1 684 ${rc} ${output}= Run Keyword If '${return_data}' == '${1}' 685 ... Cmd Fnc cat ${log_file_path} 2>/dev/null quiet=${loc_quiet} 686 ... print_output=${0} show_err=${0} 687 688 [Return] ${output} 689 690 691Start SOL Console Logging 692 [Documentation] Start system console log to file. 693 [Arguments] ${log_file_path}=${EMPTY} ${return_data}=${1} 694 695 # This keyword will first call "Stop SOL Console Logging". Only then will 696 # it start SOL console logging. The data returned by "Stop SOL Console 697 # Logging" will in turn be returned by this keyword. 698 699 # Description of arguments: 700 # log_file_path The file path to which system console log data should be 701 # written. Note that this path is taken to be a location 702 # on the machine where this program is running rather than 703 # on the Open BMC system. 704 # return_data If this is set to ${1}, this keyword will return any SOL 705 # data to the caller as a unicode string. 706 707 ${log_file_path}= Create OS Console File Path ${log_file_path} 708 709 ${log_output}= Stop SOL Console Logging ${log_file_path} 710 ... return_data=${return_data} 711 712 # Validate by making sure we can create the file. Problems creating the 713 # file would not be noticed by the subsequent ssh command because we fork 714 # the command. 715 Create File ${log_file_path} 716 ${sub_cmd_buf}= Create OS Console Command String 717 # Routing stderr to stdout so that any startup error text will go to the 718 # output file. 719 # TODO: Doesn't work with tox so reverting temporarily. 720 # nohup detaches the process completely from our pty. 721 #${cmd_buf}= Catenate nohup ${sub_cmd_buf} &> ${log_file_path} & 722 ${cmd_buf}= Catenate ${sub_cmd_buf} > ${log_file_path} 2>&1 & 723 Rdpissuing ${cmd_buf} 724 ${rc} ${output}= Run And Return Rc And Output ${cmd_buf} 725 # Because we are forking this command, we essentially will never get a 726 # non-zero return code or any output. 727 Should Be Equal ${rc} ${0} 728 729 Wait Until Keyword Succeeds 10 seconds 0 seconds 730 ... Get SOL Console Pid ${1} 731 732 [Return] ${log_output} 733 734 735Get Time Stamp 736 [Documentation] Get the current time stamp data 737 ${cur_time}= Get Current Date result_format=%Y%m%d%H%M%S%f 738 [Return] ${cur_time} 739 740 741Start Journal Log 742 [Documentation] Start capturing journal log to a file in /tmp using 743 ... journalctl command. By default journal log is collected 744 ... at /tmp/journal_log else user input location. 745 ... The File is appended with datetime. 746 [Arguments] ${file_path}=/tmp/journal_log 747 748 # Description of arguments: 749 # file_path The file path of the journal file. 750 751 ${cur_time}= Get Time Stamp 752 Set Global Variable ${LOG_TIME} ${cur_time} 753 Start Command 754 ... journalctl -f > ${file_path}-${LOG_TIME} 755 Log Journal Log Started: ${file_path}-${LOG_TIME} 756 757 758Stop Journal Log 759 [Documentation] Stop journalctl process if its running. 760 ... By default return log from /tmp/journal_log else 761 ... user input location. 762 [Arguments] ${file_path}=/tmp/journal_log 763 764 # Description of arguments: 765 # file_path The file path of the journal file. 766 767 Open Connection And Log In 768 769 ${rc}= 770 ... Execute Command 771 ... ps ax | grep journalctl | grep -v grep 772 ... return_stdout=False return_rc=True 773 774 Return From Keyword If '${rc}' == '${1}' 775 ... No journal log process running 776 777 ${output} ${stderr}= 778 ... Execute Command killall journalctl 779 ... return_stderr=True 780 Should Be Empty ${stderr} 781 782 ${journal_log} ${stderr}= 783 ... Execute Command 784 ... cat ${file_path}-${LOG_TIME} 785 ... return_stderr=True 786 Should Be Empty ${stderr} 787 788 Log ${journal_log} 789 790 Execute Command rm ${file_path}-${LOG_TIME} 791 792 [Return] ${journal_log} 793 794 795Mac Address To Hex String 796 [Documentation] Converts MAC address into hex format. 797 ... Example 798 ... Given the following MAC: 00:01:6C:80:02:78 799 ... This keyword will return: 0x00 0x01 0x6C 0x80 0x02 0x78 800 ... Description of arguments: 801 ... i_macaddress MAC address in the following format 802 ... 00:01:6C:80:02:78 803 [Arguments] ${i_macaddress} 804 805 # Description of arguments: 806 # i_macaddress The MAC address. 807 808 ${mac_hex}= Catenate 0x${i_macaddress.replace(':', ' 0x')} 809 [Return] ${mac_hex} 810 811 812IP Address To Hex String 813 [Documentation] Converts IP address into hex format. 814 ... Example: 815 ... Given the following IP: 10.3.164.100 816 ... This keyword will return: 0xa 0x3 0xa4 0xa0 817 [Arguments] ${i_ipaddress} 818 819 # Description of arguments: 820 # i_macaddress The IP address in the format 10.10.10.10. 821 822 @{ip}= Split String ${i_ipaddress} . 823 ${index}= Set Variable ${0} 824 825 :FOR ${item} IN @{ip} 826 \ ${hex}= Convert To Hex ${item} prefix=0x lowercase=yes 827 \ Set List Value ${ip} ${index} ${hex} 828 \ ${index}= Set Variable ${index + 1} 829 ${ip_hex}= Catenate @{ip} 830 831 [Return] ${ip_hex} 832 833 834BMC CPU Performance Check 835 [Documentation] Minimal 10% of proc should be free in this instance 836 837 ${bmc_cpu_usage_output} ${stderr} ${rc}= BMC Execute Command 838 ... ${bmc_cpu_usage_cmd} 839 ${bmc_cpu_usage_output} ${stderr} ${rc}= BMC Execute Command 840 ... ${bmc_cpu_usage_cmd} 841 ${bmc_cpu_percentage}= Fetch From Left ${bmc_cpu_usage_output} % 842 Should be true ${bmc_cpu_percentage} < 90 843 844 845BMC Mem Performance Check 846 [Documentation] Minimal 10% of memory should be free in this instance 847 848 ${bmc_mem_free_output} ${stderr} ${rc}= BMC Execute Command 849 ... ${bmc_mem_free_cmd} 850 851 ${bmc_mem_total_output} ${stderr} ${rc}= BMC Execute Command 852 ... ${bmc_mem_total_cmd} 853 ${bmc_mem_free_output} ${stderr} ${rc}= BMC Execute Command 854 ... ${bmc_mem_free_cmd} 855 856 ${bmc_mem_total_output} ${stderr} ${rc}= BMC Execute Command 857 ... ${bmc_mem_total_cmd} 858 859 ${bmc_mem_percentage}= Evaluate ${bmc_mem_free_output}*100 860 ${bmc_mem_percentage}= Evaluate 861 ... ${bmc_mem_percentage}/${bmc_mem_total_output} 862 Should be true ${bmc_mem_percentage} > 10 863 864 865BMC File System Usage Check 866 [Documentation] Check the file system space. 4 file system should be 867 ... 100% full which is expected 868 # Filesystem Size Used Available Use% Mounted on 869 # /dev/root 14.4M 14.4M 0 100% / 870 # /dev/ubiblock0_0 14.4M 14.4M 0 100% /media/rofs-c9249b0e 871 # /dev/ubiblock8_0 19.6M 19.6M 0 100% /media/pnor-ro-8764baa3 872 # /dev/ubiblock4_0 14.4M 14.4M 0 100% /media/rofs-407816c 873 # /dev/ubiblock8_4 21.1M 21.1M 0 100% /media/pnor-ro-cecc64c4 874 ${bmc_fs_usage_output} ${stderr} ${rc}= BMC Execute Command 875 ... ${bmc_file_system_usage_cmd} 876 ${bmc_pnor_fs_usage_output} ${stderr} ${rc}= BMC Execute Command 877 ... ${total_pnor_ro_file_system_cmd} 878 ${bmc_bmc_fs_usage_output} ${stderr} ${rc}= BMC Execute Command 879 ... ${total_bmc_ro_file_system_cmd} 880 ${total_bmc_pnor_image}= Evaluate 881 ... ${bmc_pnor_fs_usage_output}+${bmc_bmc_fs_usage_output} 882 # Considering /dev/root also in total 100% used file system 883 ${total_full_fs}= Evaluate ${total_bmc_pnor_image}+1 884 Should Be True ${bmc_fs_usage_output}==${total_full_fs} 885 886 887Check BMC CPU Performance 888 [Documentation] Minimal 10% of proc should be free in 3 sample 889 :FOR ${var} IN Range 1 4 890 \ BMC CPU Performance check 891 892 893Check BMC Mem Performance 894 [Documentation] Minimal 10% of memory should be free 895 896 :FOR ${var} IN Range 1 4 897 \ BMC Mem Performance check 898 899 900Check BMC File System Performance 901 [Documentation] Check for file system usage for 4 times 902 903 :FOR ${var} IN Range 1 4 904 \ BMC File System Usage check 905 906 907Get URL List 908 [Documentation] Return list of URLs under given URL. 909 [Arguments] ${openbmc_url} 910 911 # Description of argument(s): 912 # openbmc_url URL for list operation (e.g. 913 # /xyz/openbmc_project/inventory). 914 915 ${url_list}= Read Properties ${openbmc_url}/list quiet=${1} 916 Sort List ${url_list} 917 918 [Return] ${url_list} 919 920 921Get Endpoint Paths 922 [Documentation] Returns all url paths ending with given endpoint 923 ... Example: 924 ... Given the following endpoint: cpu 925 ... This keyword will return: list of all urls ending with 926 ... cpu - 927 ... /org/openbmc/inventory/system/chassis/motherboard/cpu0, 928 ... /org/openbmc/inventory/system/chassis/motherboard/cpu1 929 [Arguments] ${path} ${endpoint} 930 931 # Description of arguments: 932 # path URL path for enumeration. 933 # endpoint Endpoint string (url path ending). 934 935 ${resp}= Read Properties ${path}/enumerate timeout=30 936 Log Dictionary ${resp} 937 938 ${list}= Get Dictionary Keys ${resp} 939 # For a given string, look for prefix and suffix for matching expression. 940 # Start of string followed by zero or more of any character followed by 941 # any digit or lower case character. 942 ${resp}= Get Matches ${list} regexp=^.*[0-9a-z_].${endpoint}[0-9a-z]*$ 943 944 [Return] ${resp} 945 946 947Check Zombie Process 948 [Documentation] Check if any defunct process exist or not on BMC 949 ${count} ${stderr} ${rc}= Execute Command ps -o stat | grep Z | wc -l 950 ... return_stderr=True return_rc=True 951 Should Be True ${count}==0 952 Should Be Empty ${stderr} 953 954 955Prune Journal Log 956 [Documentation] Prune archived journal logs. 957 [Arguments] ${vacuum_size}=1M 958 959 # This keyword can be used to prevent the journal 960 # log from filling up the /run filesystem. 961 # This command will retain only the latest logs 962 # of the user specified size. 963 964 # Description of argument(s): 965 # vacuum_size Size of journal. 966 967 Open Connection And Log In 968 ${output} ${stderr} ${rc}= 969 ... Execute Command 970 ... journalctl --vacuum-size=${vacuum_size} 971 ... return_stderr=True return_rc=True 972 973 Should Be Equal ${rc} ${0} msg=${stderr} 974 975 976Set BMC Power Policy 977 [Documentation] Set the given BMC power policy. 978 [Arguments] ${policy} 979 980 # Note that this function will translate the old style "RESTORE_LAST_STATE" 981 # policy to the new style "xyz.openbmc_project.Control.Power.RestorePolicy. 982 # Policy.Restore" for you. 983 984 # Description of argument(s): 985 # policy Power restore policy (e.g "RESTORE_LAST_STATE", 986 # ${RESTORE_LAST_STATE}). 987 988 # Set the bmc_power_policy_method to either 'Old' or 'New'. 989 Set Power Policy Method 990 # This translation helps bridge between old and new method for calling. 991 ${policy}= Translate Power Policy Value ${policy} 992 # Run the appropriate keyword. 993 Run Key ${bmc_power_policy_method} Set Power Policy \ ${policy} 994 ${currentPolicy}= Get System Power Policy 995 Should Be Equal ${currentPolicy} ${policy} 996 997 998New Set Power Policy 999 [Documentation] Set the given BMC power policy (new method). 1000 [Arguments] ${policy} 1001 1002 # Description of argument(s): 1003 # policy Power restore policy (e.g. ${ALWAYS_POWER_OFF}). 1004 1005 ${valueDict}= Create Dictionary data=${policy} 1006 Write Attribute 1007 ... ${POWER_RESTORE_URI} PowerRestorePolicy data=${valueDict} 1008 1009 1010Old Set Power Policy 1011 [Documentation] Set the given BMC power policy (old method). 1012 [Arguments] ${policy} 1013 1014 # Description of argument(s): 1015 # policy Power restore policy (e.g. "ALWAYS_POWER_OFF"). 1016 1017 ${valueDict}= create dictionary data=${policy} 1018 Write Attribute ${HOST_SETTING} power_policy data=${valueDict} 1019 1020 1021Get System Power Policy 1022 [Documentation] Returns the BMC power policy. 1023 1024 # Set the bmc_power_policy_method to either 'Old' or 'New'. 1025 Set Power Policy Method 1026 ${cmd_buf}= Create List ${bmc_power_policy_method} Get Power Policy 1027 # Run the appropriate keyword. 1028 ${currentPolicy}= Run Keyword @{cmd_buf} 1029 1030 [Return] ${currentPolicy} 1031 1032 1033New Get Power Policy 1034 [Documentation] Returns the BMC power policy (new method). 1035 ${currentPolicy}= Read Attribute ${POWER_RESTORE_URI} PowerRestorePolicy 1036 1037 [Return] ${currentPolicy} 1038 1039 1040Old Get Power Policy 1041 [Documentation] Returns the BMC power policy (old method). 1042 ${currentPolicy}= Read Attribute ${HOST_SETTING} power_policy 1043 1044 [Return] ${currentPolicy} 1045 1046 1047Get Auto Reboot 1048 [Documentation] Returns auto reboot setting. 1049 ${setting}= Read Attribute ${CONTROL_HOST_URI}/auto_reboot AutoReboot 1050 1051 [Return] ${setting} 1052 1053 1054Set Auto Reboot 1055 [Documentation] Set the given auto reboot setting. 1056 [Arguments] ${setting} 1057 1058 # Description of argument(s): 1059 # setting The reboot setting, 1 for enabling and 0 for disabling. 1060 1061 ${valueDict}= Set Variable ${setting} 1062 ${data}= Create Dictionary data=${valueDict} 1063 Write Attribute ${CONTROL_HOST_URI}/auto_reboot AutoReboot data=${data} 1064 ${current_setting}= Get Auto Reboot 1065 Should Be Equal As Integers ${current_setting} ${setting} 1066 1067 1068Set BMC Reset Reference Time 1069 [Documentation] Set current boot time as a reference and increment 1070 ... boot count. 1071 1072 ${cur_btime}= Get BMC Boot Time 1073 Run Keyword If ${BOOT_TIME} == ${0} and ${BOOT_COUNT} == ${0} 1074 ... Set Global Variable ${BOOT_TIME} ${cur_btime} 1075 ... ELSE IF ${cur_btime} > ${BOOT_TIME} 1076 ... Run Keywords Set Global Variable ${BOOT_TIME} ${cur_btime} 1077 ... AND 1078 ... Set Global Variable ${BOOT_COUNT} ${BOOT_COUNT + 1} 1079 1080 1081Get BMC Boot Time 1082 [Documentation] Returns boot time from /proc/stat. 1083 1084 Open Connection And Log In 1085 ${output} ${stderr}= 1086 ... Execute Command egrep '^btime ' /proc/stat | cut -f 2 -d ' ' 1087 ... return_stderr=True 1088 Should Be Empty ${stderr} 1089 ${btime}= Convert To Integer ${output} 1090 [Return] ${btime} 1091 1092 1093Execute Command On BMC 1094 [Documentation] Execute given command on BMC and return output. 1095 [Arguments] ${command} 1096 1097 # Description of argument(s): 1098 # command The command to execute on the BMC. 1099 1100 ${stdout} ${stderr}= Execute Command ${command} return_stderr=True 1101 Should Be Empty ${stderr} 1102 [Return] ${stdout} 1103 1104 1105Enable Core Dump On BMC 1106 [Documentation] Enable core dump collection. 1107 ${core_pattern} ${stderr} ${rc}= BMC Execute Command 1108 ... echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern 1109 Should Be Equal As Strings ${core_pattern} /tmp/core_%e.%p 1110 1111 1112Get Number Of BMC Core Dump Files 1113 [Documentation] Returns number of core dump files on BMC. 1114 Open Connection And Log In 1115 ${num_of_core_dump}= Execute Command 1116 ... ls /tmp/core* 2>/dev/null | wc -l 1117 [Return] ${num_of_core_dump} 1118 1119 1120Set Core Dump File Size Unlimited 1121 [Documentation] Set core dump file size to unlimited. 1122 BMC Execute Command ulimit -c unlimited 1123 1124 1125Check For Core Dumps 1126 [Documentation] Check for any core dumps exist. 1127 ${output}= Get Number Of BMC Core Dump Files 1128 Run Keyword If ${output} > 0 1129 ... Log **Warning** BMC core dump files exist level=WARN 1130 1131 1132Trigger Host Watchdog Error 1133 [Documentation] Inject host watchdog timeout error via REST. 1134 [Arguments] ${milliseconds}=1000 ${sleep_time}=5s 1135 1136 # Description of argument(s): 1137 # milliseconds The time watchdog timer value in milliseconds (e.g. 1000 = 1138 # 1 second). 1139 # sleep_time Time delay for host watchdog error to get injected. 1140 # Default is 5 seconds. 1141 1142 ${data}= Create Dictionary 1143 ... data=xyz.openbmc_project.State.Watchdog.Action.PowerCycle 1144 ${status} ${result}= Run Keyword And Ignore Error 1145 ... Read Attribute ${HOST_WATCHDOG_URI} ExpireAction 1146 Run Keyword If '${status}' == 'PASS' 1147 ... Write Attribute ${HOST_WATCHDOG_URI} ExpireAction data=${data} 1148 1149 ${data}= Create Dictionary data=${milliseconds} 1150 Write Attribute ${HOST_WATCHDOG_URI} Interval data=${data} 1151 1152 ${data}= Create Dictionary data=${True} 1153 Write Attribute ${HOST_WATCHDOG_URI} Enabled data=${data} 1154 1155 Sleep ${sleep_time} 1156 1157 1158Login To OS Host 1159 [Documentation] Login to OS Host and return the Login response code. 1160 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 1161 ... ${os_password}=${OS_PASSWORD} 1162 1163 # Description of arguments: 1164 # ${os_host} IP address of the OS Host. 1165 # ${os_username} OS Host Login user name. 1166 # ${os_password} OS Host Login passwrd. 1167 1168 ${os_state}= Run Keyword And Return Status Ping Host ${os_host} 1169 Run Keyword If '${os_state}' == 'False' 1170 ... Run Keywords Initiate Host Reboot AND 1171 ... Is Host Running AND 1172 ... Wait for OS ${os_host} ${os_username} ${os_password} 1173 1174 SSHLibrary.Open Connection ${os_host} 1175 ${resp}= Login ${os_username} ${os_password} 1176 [Return] ${resp} 1177 1178 1179Configure Initial Settings 1180 [Documentation] Restore old IP and route. 1181 ... This keyword requires initial settings viz IP address, 1182 ... Network Mask, default gatway and serial console IP and port 1183 ... information which should be provided in command line. 1184 1185 [Arguments] ${host}=${OPENBMC_HOST} ${mask}=${NET_MASK} 1186 ... ${gw_ip}=${GW_IP} 1187 1188 # Description of arguments: 1189 # host IP address of the OS Host. 1190 # mask Network mask. 1191 # gu_ip Gateway IP address or hostname. 1192 1193 # Open telnet connection and ignore the error, in case telnet session is 1194 # already opened by the program calling this keyword. 1195 Run Keyword And Ignore Error Open Telnet Connection to BMC Serial Console 1196 Telnet.write ifconfig eth0 ${host} netmask ${mask} 1197 Telnet.write route add default gw ${gw_ip} 1198 1199 1200Install Debug Tarball On BMC 1201 [Documentation] Copy the debug tar file to BMC and install. 1202 [Arguments] ${tarball_file_path}=${default_tarball} 1203 ... ${targ_tarball_dir_path}=/tmp/tarball/ 1204 1205 # Description of arguments: 1206 # tarball_file_path Path of the debug tarball file. 1207 # The tar file is downloaded from the build page 1208 # https://openpower.xyz/job/openbmc-build/ 1209 # obmc-phosphor-debug-tarball-witherspoon.tar.xz 1210 # 1211 # targ_tarball_dir_path The directory path where the tarball is to be 1212 # installed. 1213 1214 OperatingSystem.File Should Exist ${tarball_file_path} 1215 ... msg=${tarball_file_path} doesn't exist. 1216 1217 # Upload the file to BMC. 1218 Import Library SCPLibrary WITH NAME scp 1219 Open Connection for SCP 1220 scp.Put File ${tarball_file_path} /tmp/debug-tarball.tar.xz 1221 1222 # Create tarball directory and install. 1223 BMC Execute Command mkdir -p ${targ_tarball_dir_path} 1224 BMC Execute Command 1225 ... tar -xf /tmp/debug-tarball.tar.xz -C ${targ_tarball_dir_path} 1226 1227 # Remove the tarball file from BMC. 1228 BMC Execute Command rm -f /tmp/debug-tarball.tar.xz 1229 1230 1231Get BMC Boot Count 1232 [Documentation] Returns BMC boot count based on boot time. 1233 ${cur_btime}= Get BMC Boot Time 1234 1235 # Set global variable BOOT_TIME to current boot time if current boot time 1236 # is changed. Also increase value of global variable BOOT_COUNT by 1. 1237 Run Keyword If ${cur_btime} > ${BOOT_TIME} 1238 ... Run Keywords Set Global Variable ${BOOT_TIME} ${cur_btime} 1239 ... AND 1240 ... Set Global Variable ${BOOT_COUNT} ${BOOT_COUNT + 1} 1241 1242 [Return] ${BOOT_COUNT} 1243 1244 1245Set BMC Boot Count 1246 [Documentation] Set BMC boot count to given value. 1247 [Arguments] ${count} 1248 1249 # Description of arguments: 1250 # count boot count value. 1251 ${cur_btime}= Get BMC Boot Time 1252 1253 # Set global variable BOOT_COUNT to given value. 1254 Set Global Variable ${BOOT_COUNT} ${count} 1255 1256 # Set BOOT_TIME variable to current boot time. 1257 Set Global Variable ${BOOT_COUNT} ${count} 1258 1259 1260Get System LED State 1261 [Documentation] Return the state of given system LED. 1262 [Arguments] ${led_name} 1263 1264 # Description of argument(s): 1265 # led_name System LED name (e.g. heartbeat, identify, beep). 1266 1267 ${state}= Read Attribute ${LED_PHYSICAL_URI}${led_name} State 1268 [Return] ${state.rsplit('.', 1)[1]} 1269 1270 1271Set System LED State 1272 [Documentation] Set given system LED via REST. 1273 [Arguments] ${led_name} ${led_state} 1274 # Description of argument(s): 1275 # led_name System LED name (e.g. heartbeat, identify, beep). 1276 # led_state LED state to be set (e.g. On, Off). 1277 1278 ${args}= Create Dictionary 1279 ... data=xyz.openbmc_project.Led.Physical.Action.${led_state} 1280 Write Attribute ${LED_PHYSICAL_URI}${led_name} State data=${args} 1281 1282 Verify LED State ${led_name} ${led_state} 1283 1284 1285Verify LED State 1286 [Documentation] Checks if LED is in given state. 1287 [Arguments] ${led_name} ${led_state} 1288 # Description of argument(s): 1289 # led_name System LED name (e.g. heartbeat, identify, beep). 1290 # led_state LED state to be verified (e.g. On, Off). 1291 1292 ${state}= Get System LED State ${led_name} 1293 Should Be Equal ${state} ${led_state} 1294 1295 1296Get LED State XYZ 1297 [Documentation] Returns state of given LED. 1298 [Arguments] ${led_name} 1299 1300 # Description of argument(s): 1301 # led_name Name of LED. 1302 1303 ${state}= Read Attribute ${LED_GROUPS_URI}${led_name} Asserted 1304 # Returns the state of the LED, either On or Off. 1305 [Return] ${state} 1306 1307 1308Delete Error Logs 1309 [Documentation] Delete error logs. 1310 1311 # Check if error logs entries exist, if not return. 1312 ${resp}= OpenBMC Get Request ${BMC_LOGGING_ENTRY}${/}list quiet=${1} 1313 Return From Keyword If ${resp.status_code} == ${HTTP_NOT_FOUND} 1314 1315 # Get the list of error logs entries and delete them all. 1316 ${elog_entries}= Get URL List ${BMC_LOGGING_ENTRY} 1317 :FOR ${entry} IN @{elog_entries} 1318 \ Delete Error Log Entry ${entry} 1319 1320 1321Delete Error Log Entry 1322 [Documentation] Delete error log entry. 1323 [Arguments] ${entry_path} 1324 1325 # Description of argument(s): 1326 # entry_path Delete an error log entry. 1327 # Ex. /xyz/openbmc_project/logging/entry/1 1328 1329 # Skip delete if entry URI is a callout. 1330 # Example: /xyz/openbmc_project/logging/entry/1/callout 1331 Return From Keyword If '${entry_path.rsplit('/', 1)[1]}' == 'callout' 1332 1333 ${data}= Create Dictionary data=@{EMPTY} 1334 ${resp}= Openbmc Delete Request ${entry_path} data=${data} 1335 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 1336 1337 1338Delete All Error Logs 1339 [Documentation] Delete all error log entries using "DeleteAll" interface. 1340 1341 ${data}= Create Dictionary data=@{EMPTY} 1342 ${resp}= Openbmc Post Request ${BMC_LOGGING_URI}action/DeleteAll 1343 ... data=${data} 1344 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 1345 1346 1347Get BMC Version 1348 [Documentation] Returns BMC version from /etc/os-release. 1349 ... e.g. "v1.99.6-141-ge662190" 1350 1351 ${cmd}= Set Variable grep ^VERSION_ID= /etc/os-release | cut -f 2 -d '=' 1352 ${output} ${stderr} ${rc}= BMC Execute Command ${cmd} 1353 [Return] ${output} 1354 1355 1356Get PNOR Version 1357 [Documentation] Returns the PNOR version from the BMC. 1358 1359 ${pnor_attrs}= Get PNOR Attributes 1360 [Return] ${pnor_attrs['version']} 1361 1362 1363Get PNOR Attributes 1364 [Documentation] Return PNOR software attributes as a dictionary. 1365 1366 # This keyword parses /var/lib/phosphor-software-manager/pnor/ro/pnor.toc 1367 # into key/value pairs. 1368 1369 ${outbuf} ${stderr} ${rc}= BMC Execute Command 1370 ... cat /var/lib/phosphor-software-manager/pnor/ro/pnor.toc 1371 ${pnor_attrs}= Key Value Outbuf To Dict ${outbuf} delim== 1372 1373 [Return] ${pnor_attrs} 1374 1375 1376Get Elog URL List 1377 [Documentation] Return error log entry list of URLs. 1378 1379 ${url_list}= Read Properties /xyz/openbmc_project/logging/entry/ 1380 Sort List ${url_list} 1381 [Return] ${url_list} 1382 1383 1384Read Turbo Setting Via REST 1385 [Documentation] Return turbo setting via REST. 1386 # Returns 1 if TurboAllowed, 0 if not. 1387 1388 ${turbo_setting}= Read Attribute 1389 ... ${CONTROL_HOST_URI}turbo_allowed TurboAllowed 1390 [Return] ${turbo_setting} 1391 1392 1393Set Turbo Setting Via REST 1394 [Documentation] Set turbo setting via REST. 1395 [Arguments] ${setting} ${verify}=${False} 1396 1397 # Description of argument(s): 1398 # setting State to set TurboAllowed, 1=allowed, 0=not allowed. 1399 # verify If True, read the TurboAllowed setting to confirm. 1400 1401 ${data}= Create Dictionary data=${${setting}} 1402 Write Attribute ${CONTROL_HOST_URI}turbo_allowed TurboAllowed 1403 ... verify=${verify} data=${data} 1404 1405 1406Set Control Boot Mode 1407 [Documentation] Set given boot mode on the boot object path attribute. 1408 [Arguments] ${boot_path} ${boot_mode} 1409 1410 # Description of argument(s): 1411 # boot_path Boot object path. 1412 # Example: 1413 # /xyz/openbmc_project/control/host0/boot 1414 # /xyz/openbmc_project/control/host0/boot/one_time 1415 # boot_mode Boot mode which need to be set. 1416 # Example: 1417 # "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular" 1418 1419 ${valueDict}= Create Dictionary data=${boot_mode} 1420 Write Attribute ${boot_path} BootMode data=${valueDict} 1421 1422 1423Copy Address Translation Utils To HOST OS 1424 [Documentation] Copy address translation utils to host OS. 1425 1426 OperatingSystem.File Should Exist ${probe_cpu_tool_path} 1427 ... msg=${probe_cpu_tool_path} doesn't exist. 1428 OperatingSystem.File Should Exist ${probe_cpu_tool_path} 1429 ... msg=${probe_cpu_tool_path} doesn't exist. 1430 1431 scp.Open connection ${OS_HOST} username=${OS_USERNAME} 1432 ... password=${OS_PASSWORD} 1433 scp.Put File ${probe_cpu_tool_path} ${target_file_path} 1434 scp.Put File ${scom_addrs_tool_path} ${target_file_path} 1435 1436 1437Verify BMC RTC And UTC Time Drift 1438 [Documentation] Verify that the RTC and UTC time difference is less than 1439 ... the given time_drift_max. 1440 [Arguments] ${time_diff_max}=${10} 1441 1442 # Description of argument(s): 1443 # time_diff_max The max allowable RTC and UTC time difference in seconds. 1444 1445 # Example: 1446 # time_dict: 1447 # [local_time]: Fri 2017-11-03 152756 UTC 1448 # [local_time_seconds]: 1509740876 1449 # [universal_time]: Fri 2017-11-03 152756 UTC 1450 # [universal_time_seconds]: 1509740876 1451 # [rtc_time]: Fri 2016-05-20 163403 1452 # [rtc_time_seconds]: 1463780043 1453 # [time_zone]: n/a (UTC, +0000) 1454 # [network_time_on]: yes 1455 # [ntp_synchronized]: no 1456 # [rtc_in_local_tz]: no 1457 1458 ${time}= Get BMC Date Time 1459 ${time_diff}= Evaluate 1460 ... ${time['universal_time_seconds']} - ${time['rtc_time_seconds']} 1461 Should Be True ${time_diff} < ${time_diff_max} 1462 1463 1464Watchdog Object Should Exist 1465 [Documentation] Check that watchdog object exists. 1466 1467 ${resp}= OpenBMC Get Request ${WATCHDOG_URI}host0 1468 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 1469 ... msg=Expected watchdog object does not exist. 1470 1471 1472Validate IP On BMC 1473 [Documentation] Validate IP address is present in set of IP addresses. 1474 [Arguments] ${ip_address} ${ip_data} 1475 1476 # Description of argument(s): 1477 # ip_address IP address to check (e.g. xx.xx.xx.xx). 1478 # ip_data Set of the IP addresses present. 1479 1480 Should Contain Match ${ip_data} ${ip_address}/* 1481 ... msg=${ip_address} not found in the list provided. 1482 1483 1484Remove Journald Logs 1485 [Documentation] Remove all journald logs and restart service. 1486 1487 ${cmd}= Catenate systemctl stop systemd-journald.service && 1488 ... rm -rf /var/log/journal && systemctl start systemd-journald.service 1489 1490 BMC Execute Command ${cmd} 1491 1492 1493Verify Identify LED State 1494 [Documentation] Verify the identify LED state 1495 ... matches caller's expectations. 1496 [Arguments] ${expected_state} 1497 1498 # Description of argument(s): 1499 # expected_state The LED state expected by the caller ("Blink" or "Off"). 1500 1501 ${resp}= Read Attribute ${LED_PHYSICAL_URI}/front_id State 1502 Should Be Equal ${resp} 1503 ... xyz.openbmc_project.Led.Physical.Action.${expected_state} 1504 ... msg=Unexpected LED state. 1505 1506 ${resp}= Read Attribute ${LED_PHYSICAL_URI}/rear_id State 1507 Should Be Equal ${resp} 1508 ... xyz.openbmc_project.Led.Physical.Action.${expected_state} 1509 ... msg=Unexpected LED state. 1510 1511 1512Verify The Attribute 1513 [Arguments] ${uri} ${attribute_name} ${attribute_value} 1514 1515 # Description of argument(s): 1516 # uri URI path 1517 # (e.g. "/xyz/openbmc_project/control/host0/TPMEnable"). 1518 # attribute_name Name of attribute to be verified (e.g. "TPMEnable"). 1519 # attribute_value The expected value of attribute (e.g. "1", "0", etc.) 1520 1521 ${output}= Read Attribute ${uri} ${attribute_name} 1522 Should Be Equal ${attribute_value} ${output} 1523 ... msg=Attribute "${attribute_name} does not have the expected value. 1524 1525 1526Get BMC Flash Chip Boot Side 1527 [Documentation] Return the BMC flash chip boot side. 1528 1529 # Example: 1530 # 0 - indicates chip select is current side. 1531 # 1 - indicates chip select is alternate side. 1532 1533 ${boot_side} ${stderr} ${rc}= BMC Execute Command 1534 ... echo $(($(/sbin/devmem 0x1E785030) >> 1 & 1)) 1535 1536 [Return] ${boot_side} 1537 1538