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