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 1093Enable Core Dump On BMC 1094 [Documentation] Enable core dump collection. 1095 ${core_pattern} ${stderr} ${rc}= BMC Execute Command 1096 ... echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern 1097 Should Be Equal As Strings ${core_pattern} /tmp/core_%e.%p 1098 1099 1100Get Number Of BMC Core Dump Files 1101 [Documentation] Returns number of core dump files on BMC. 1102 Open Connection And Log In 1103 ${num_of_core_dump}= Execute Command 1104 ... ls /tmp/core* 2>/dev/null | wc -l 1105 [Return] ${num_of_core_dump} 1106 1107 1108Set Core Dump File Size Unlimited 1109 [Documentation] Set core dump file size to unlimited. 1110 BMC Execute Command ulimit -c unlimited 1111 1112 1113Check For Core Dumps 1114 [Documentation] Check for any core dumps exist. 1115 ${output}= Get Number Of BMC Core Dump Files 1116 Run Keyword If ${output} > 0 1117 ... Log **Warning** BMC core dump files exist level=WARN 1118 1119 1120Trigger Host Watchdog Error 1121 [Documentation] Inject host watchdog timeout error via REST. 1122 [Arguments] ${milliseconds}=1000 ${sleep_time}=5s 1123 1124 # Description of argument(s): 1125 # milliseconds The time watchdog timer value in milliseconds (e.g. 1000 = 1126 # 1 second). 1127 # sleep_time Time delay for host watchdog error to get injected. 1128 # Default is 5 seconds. 1129 1130 ${data}= Create Dictionary 1131 ... data=xyz.openbmc_project.State.Watchdog.Action.PowerCycle 1132 ${status} ${result}= Run Keyword And Ignore Error 1133 ... Read Attribute ${HOST_WATCHDOG_URI} ExpireAction 1134 Run Keyword If '${status}' == 'PASS' 1135 ... Write Attribute ${HOST_WATCHDOG_URI} ExpireAction data=${data} 1136 1137 ${data}= Create Dictionary data=${milliseconds} 1138 Write Attribute ${HOST_WATCHDOG_URI} Interval data=${data} 1139 1140 ${data}= Create Dictionary data=${True} 1141 Write Attribute ${HOST_WATCHDOG_URI} Enabled data=${data} 1142 1143 Sleep ${sleep_time} 1144 1145 1146Login To OS Host 1147 [Documentation] Login to OS Host and return the Login response code. 1148 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 1149 ... ${os_password}=${OS_PASSWORD} 1150 1151 # Description of arguments: 1152 # ${os_host} IP address of the OS Host. 1153 # ${os_username} OS Host Login user name. 1154 # ${os_password} OS Host Login passwrd. 1155 1156 ${os_state}= Run Keyword And Return Status Ping Host ${os_host} 1157 Run Keyword If '${os_state}' == 'False' 1158 ... Run Keywords Initiate Host Reboot AND 1159 ... Is Host Running AND 1160 ... Wait for OS ${os_host} ${os_username} ${os_password} 1161 1162 SSHLibrary.Open Connection ${os_host} 1163 ${resp}= Login ${os_username} ${os_password} 1164 [Return] ${resp} 1165 1166 1167Configure Initial Settings 1168 [Documentation] Restore old IP and route. 1169 ... This keyword requires initial settings viz IP address, 1170 ... Network Mask, default gatway and serial console IP and port 1171 ... information which should be provided in command line. 1172 1173 [Arguments] ${host}=${OPENBMC_HOST} ${mask}=${NET_MASK} 1174 ... ${gw_ip}=${GW_IP} 1175 1176 # Description of arguments: 1177 # host IP address of the OS Host. 1178 # mask Network mask. 1179 # gu_ip Gateway IP address or hostname. 1180 1181 # Open telnet connection and ignore the error, in case telnet session is 1182 # already opened by the program calling this keyword. 1183 Run Keyword And Ignore Error Open Telnet Connection to BMC Serial Console 1184 Telnet.write ifconfig eth0 ${host} netmask ${mask} 1185 Telnet.write route add default gw ${gw_ip} 1186 1187 1188Install Debug Tarball On BMC 1189 [Documentation] Copy the debug tar file to BMC and install. 1190 [Arguments] ${tarball_file_path}=${default_tarball} 1191 ... ${targ_tarball_dir_path}=/tmp/tarball/ 1192 1193 # Description of arguments: 1194 # tarball_file_path Path of the debug tarball file. 1195 # The tar file is downloaded from the build page 1196 # https://openpower.xyz/job/openbmc-build/ 1197 # obmc-phosphor-debug-tarball-witherspoon.tar.xz 1198 # 1199 # targ_tarball_dir_path The directory path where the tarball is to be 1200 # installed. 1201 1202 OperatingSystem.File Should Exist ${tarball_file_path} 1203 ... msg=${tarball_file_path} doesn't exist. 1204 1205 # Upload the file to BMC. 1206 Import Library SCPLibrary WITH NAME scp 1207 Open Connection for SCP 1208 scp.Put File ${tarball_file_path} /tmp/debug-tarball.tar.xz 1209 1210 # Create tarball directory and install. 1211 BMC Execute Command mkdir -p ${targ_tarball_dir_path} 1212 BMC Execute Command 1213 ... tar -xf /tmp/debug-tarball.tar.xz -C ${targ_tarball_dir_path} 1214 1215 # Remove the tarball file from BMC. 1216 BMC Execute Command rm -f /tmp/debug-tarball.tar.xz 1217 1218 1219Get BMC Boot Count 1220 [Documentation] Returns BMC boot count based on boot time. 1221 ${cur_btime}= Get BMC Boot Time 1222 1223 # Set global variable BOOT_TIME to current boot time if current boot time 1224 # is changed. Also increase value of global variable BOOT_COUNT by 1. 1225 Run Keyword If ${cur_btime} > ${BOOT_TIME} 1226 ... Run Keywords Set Global Variable ${BOOT_TIME} ${cur_btime} 1227 ... AND 1228 ... Set Global Variable ${BOOT_COUNT} ${BOOT_COUNT + 1} 1229 1230 [Return] ${BOOT_COUNT} 1231 1232 1233Set BMC Boot Count 1234 [Documentation] Set BMC boot count to given value. 1235 [Arguments] ${count} 1236 1237 # Description of arguments: 1238 # count boot count value. 1239 ${cur_btime}= Get BMC Boot Time 1240 1241 # Set global variable BOOT_COUNT to given value. 1242 Set Global Variable ${BOOT_COUNT} ${count} 1243 1244 # Set BOOT_TIME variable to current boot time. 1245 Set Global Variable ${BOOT_COUNT} ${count} 1246 1247 1248Get System LED State 1249 [Documentation] Return the state of given system LED. 1250 [Arguments] ${led_name} 1251 1252 # Description of argument(s): 1253 # led_name System LED name (e.g. heartbeat, identify, beep). 1254 1255 ${state}= Read Attribute ${LED_PHYSICAL_URI}${led_name} State 1256 [Return] ${state.rsplit('.', 1)[1]} 1257 1258 1259Set System LED State 1260 [Documentation] Set given system LED via REST. 1261 [Arguments] ${led_name} ${led_state} 1262 # Description of argument(s): 1263 # led_name System LED name (e.g. heartbeat, identify, beep). 1264 # led_state LED state to be set (e.g. On, Off). 1265 1266 ${args}= Create Dictionary 1267 ... data=xyz.openbmc_project.Led.Physical.Action.${led_state} 1268 Write Attribute ${LED_PHYSICAL_URI}${led_name} State data=${args} 1269 1270 Verify LED State ${led_name} ${led_state} 1271 1272 1273Verify LED State 1274 [Documentation] Checks if LED is in given state. 1275 [Arguments] ${led_name} ${led_state} 1276 # Description of argument(s): 1277 # led_name System LED name (e.g. heartbeat, identify, beep). 1278 # led_state LED state to be verified (e.g. On, Off). 1279 1280 ${state}= Get System LED State ${led_name} 1281 Should Be Equal ${state} ${led_state} 1282 1283 1284Get LED State XYZ 1285 [Documentation] Returns state of given LED. 1286 [Arguments] ${led_name} 1287 1288 # Description of argument(s): 1289 # led_name Name of LED. 1290 1291 ${state}= Read Attribute ${LED_GROUPS_URI}${led_name} Asserted 1292 # Returns the state of the LED, either On or Off. 1293 [Return] ${state} 1294 1295 1296Delete Error Logs 1297 [Documentation] Delete error logs. 1298 1299 # Check if error logs entries exist, if not return. 1300 ${resp}= OpenBMC Get Request ${BMC_LOGGING_ENTRY}${/}list quiet=${1} 1301 Return From Keyword If ${resp.status_code} == ${HTTP_NOT_FOUND} 1302 1303 # Get the list of error logs entries and delete them all. 1304 ${elog_entries}= Get URL List ${BMC_LOGGING_ENTRY} 1305 :FOR ${entry} IN @{elog_entries} 1306 \ Delete Error Log Entry ${entry} 1307 1308 1309Delete Error Log Entry 1310 [Documentation] Delete error log entry. 1311 [Arguments] ${entry_path} 1312 1313 # Description of argument(s): 1314 # entry_path Delete an error log entry. 1315 # Ex. /xyz/openbmc_project/logging/entry/1 1316 1317 # Skip delete if entry URI is a callout. 1318 # Example: /xyz/openbmc_project/logging/entry/1/callout 1319 Return From Keyword If '${entry_path.rsplit('/', 1)[1]}' == 'callout' 1320 1321 ${data}= Create Dictionary data=@{EMPTY} 1322 ${resp}= Openbmc Delete Request ${entry_path} data=${data} 1323 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 1324 1325 1326Delete All Error Logs 1327 [Documentation] Delete all error log entries using "DeleteAll" interface. 1328 1329 ${data}= Create Dictionary data=@{EMPTY} 1330 ${resp}= Openbmc Post Request ${BMC_LOGGING_URI}action/DeleteAll 1331 ... data=${data} 1332 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 1333 1334 1335Get BMC Version 1336 [Documentation] Returns BMC version from /etc/os-release. 1337 ... e.g. "v1.99.6-141-ge662190" 1338 1339 ${cmd}= Set Variable grep ^VERSION_ID= /etc/os-release | cut -f 2 -d '=' 1340 ${output} ${stderr} ${rc}= BMC Execute Command ${cmd} 1341 [Return] ${output} 1342 1343 1344Get PNOR Version 1345 [Documentation] Returns the PNOR version from the BMC. 1346 1347 ${pnor_attrs}= Get PNOR Attributes 1348 [Return] ${pnor_attrs['version']} 1349 1350 1351Get PNOR Attributes 1352 [Documentation] Return PNOR software attributes as a dictionary. 1353 1354 # This keyword parses /var/lib/phosphor-software-manager/pnor/ro/pnor.toc 1355 # into key/value pairs. 1356 1357 ${outbuf} ${stderr} ${rc}= BMC Execute Command 1358 ... cat /var/lib/phosphor-software-manager/pnor/ro/pnor.toc 1359 ${pnor_attrs}= Key Value Outbuf To Dict ${outbuf} delim== 1360 1361 [Return] ${pnor_attrs} 1362 1363 1364Get Elog URL List 1365 [Documentation] Return error log entry list of URLs. 1366 1367 ${url_list}= Read Properties /xyz/openbmc_project/logging/entry/ 1368 Sort List ${url_list} 1369 [Return] ${url_list} 1370 1371 1372Read Turbo Setting Via REST 1373 [Documentation] Return turbo setting via REST. 1374 # Returns 1 if TurboAllowed, 0 if not. 1375 1376 ${turbo_setting}= Read Attribute 1377 ... ${CONTROL_HOST_URI}turbo_allowed TurboAllowed 1378 [Return] ${turbo_setting} 1379 1380 1381Set Turbo Setting Via REST 1382 [Documentation] Set turbo setting via REST. 1383 [Arguments] ${setting} ${verify}=${False} 1384 1385 # Description of argument(s): 1386 # setting State to set TurboAllowed, 1=allowed, 0=not allowed. 1387 # verify If True, read the TurboAllowed setting to confirm. 1388 1389 ${data}= Create Dictionary data=${${setting}} 1390 Write Attribute ${CONTROL_HOST_URI}turbo_allowed TurboAllowed 1391 ... verify=${verify} data=${data} 1392 1393 1394Set Control Boot Mode 1395 [Documentation] Set given boot mode on the boot object path attribute. 1396 [Arguments] ${boot_path} ${boot_mode} 1397 1398 # Description of argument(s): 1399 # boot_path Boot object path. 1400 # Example: 1401 # /xyz/openbmc_project/control/host0/boot 1402 # /xyz/openbmc_project/control/host0/boot/one_time 1403 # boot_mode Boot mode which need to be set. 1404 # Example: 1405 # "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular" 1406 1407 ${valueDict}= Create Dictionary data=${boot_mode} 1408 Write Attribute ${boot_path} BootMode data=${valueDict} 1409 1410 1411Copy Address Translation Utils To HOST OS 1412 [Documentation] Copy address translation utils to host OS. 1413 1414 OperatingSystem.File Should Exist ${probe_cpu_tool_path} 1415 ... msg=${probe_cpu_tool_path} doesn't exist. 1416 OperatingSystem.File Should Exist ${probe_cpu_tool_path} 1417 ... msg=${probe_cpu_tool_path} doesn't exist. 1418 1419 scp.Open connection ${OS_HOST} username=${OS_USERNAME} 1420 ... password=${OS_PASSWORD} 1421 scp.Put File ${probe_cpu_tool_path} ${target_file_path} 1422 scp.Put File ${scom_addrs_tool_path} ${target_file_path} 1423 1424 1425Verify BMC RTC And UTC Time Drift 1426 [Documentation] Verify that the RTC and UTC time difference is less than 1427 ... the given time_drift_max. 1428 [Arguments] ${time_diff_max}=${10} 1429 1430 # Description of argument(s): 1431 # time_diff_max The max allowable RTC and UTC time difference in seconds. 1432 1433 # Example: 1434 # time_dict: 1435 # [local_time]: Fri 2017-11-03 152756 UTC 1436 # [local_time_seconds]: 1509740876 1437 # [universal_time]: Fri 2017-11-03 152756 UTC 1438 # [universal_time_seconds]: 1509740876 1439 # [rtc_time]: Fri 2016-05-20 163403 1440 # [rtc_time_seconds]: 1463780043 1441 # [time_zone]: n/a (UTC, +0000) 1442 # [network_time_on]: yes 1443 # [ntp_synchronized]: no 1444 # [rtc_in_local_tz]: no 1445 1446 ${time}= Get BMC Date Time 1447 ${time_diff}= Evaluate 1448 ... ${time['universal_time_seconds']} - ${time['rtc_time_seconds']} 1449 Should Be True ${time_diff} < ${time_diff_max} 1450 1451 1452Watchdog Object Should Exist 1453 [Documentation] Check that watchdog object exists. 1454 1455 ${resp}= OpenBMC Get Request ${WATCHDOG_URI}host0 1456 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 1457 ... msg=Expected watchdog object does not exist. 1458 1459 1460Validate IP On BMC 1461 [Documentation] Validate IP address is present in set of IP addresses. 1462 [Arguments] ${ip_address} ${ip_data} 1463 1464 # Description of argument(s): 1465 # ip_address IP address to check (e.g. xx.xx.xx.xx). 1466 # ip_data Set of the IP addresses present. 1467 1468 Should Contain Match ${ip_data} ${ip_address}/* 1469 ... msg=${ip_address} not found in the list provided. 1470 1471 1472Remove Journald Logs 1473 [Documentation] Remove all journald logs and restart service. 1474 1475 ${cmd}= Catenate systemctl stop systemd-journald.service && 1476 ... rm -rf /var/log/journal && systemctl start systemd-journald.service 1477 1478 BMC Execute Command ${cmd} 1479 1480 1481Verify Identify LED State 1482 [Documentation] Verify the identify LED state 1483 ... matches caller's expectations. 1484 [Arguments] ${expected_state} 1485 1486 # Description of argument(s): 1487 # expected_state The LED state expected by the caller ("Blink" or "Off"). 1488 1489 ${resp}= Read Attribute ${LED_PHYSICAL_URI}/front_id State 1490 Should Be Equal ${resp} 1491 ... xyz.openbmc_project.Led.Physical.Action.${expected_state} 1492 ... msg=Unexpected LED state. 1493 1494 ${resp}= Read Attribute ${LED_PHYSICAL_URI}/rear_id State 1495 Should Be Equal ${resp} 1496 ... xyz.openbmc_project.Led.Physical.Action.${expected_state} 1497 ... msg=Unexpected LED state. 1498 1499 1500Verify The Attribute 1501 [Arguments] ${uri} ${attribute_name} ${attribute_value} 1502 1503 # Description of argument(s): 1504 # uri URI path 1505 # (e.g. "/xyz/openbmc_project/control/host0/TPMEnable"). 1506 # attribute_name Name of attribute to be verified (e.g. "TPMEnable"). 1507 # attribute_value The expected value of attribute (e.g. "1", "0", etc.) 1508 1509 ${output}= Read Attribute ${uri} ${attribute_name} 1510 Should Be Equal ${attribute_value} ${output} 1511 ... msg=Attribute "${attribute_name} does not have the expected value. 1512 1513 1514Get BMC Flash Chip Boot Side 1515 [Documentation] Return the BMC flash chip boot side. 1516 1517 # Example: 1518 # 0 - indicates chip select is current side. 1519 # 1 - indicates chip select is alternate side. 1520 1521 ${boot_side} ${stderr} ${rc}= BMC Execute Command 1522 ... echo $(($(/sbin/devmem 0x1E785030) >> 1 & 1)) 1523 1524 [Return] ${boot_side} 1525 1526