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