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