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