1*** Settings *** 2Resource ../lib/resource.txt 3Resource ../lib/rest_client.robot 4Resource ../lib/connection_client.robot 5Library DateTime 6Library Process 7Library OperatingSystem 8Library gen_print.py 9Library gen_robot_print.py 10 11*** Variables *** 12${SYSTEM_SHUTDOWN_TIME} ${5} 13${dbuscmdBase} 14... dbus-send --system --print-reply --dest=${OPENBMC_BASE_DBUS}.settings.Host 15${dbuscmdGet} 16... ${SETTINGS_URI}host0 org.freedesktop.DBus.Properties.Get 17# Enable when ready with openbmc/openbmc-test-automation#203 18#${dbuscmdString}= string:"xyz.openbmc_project.settings.Host" string: 19${dbuscmdString}= string:"org.openbmc.settings.Host" string: 20 21# Assign default value to QUIET for programs which may not define it. 22${QUIET} ${0} 23${bmc_mem_free_cmd}= free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f4 24${bmc_mem_total_cmd}= free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2 25${bmc_cpu_usage_cmd}= top -n 1 | grep CPU: | cut -c 7-9 26${HOST_SETTING} ${SETTINGS_URI}host0 27# /run/initramfs/ro associate filesystem should be 100% full always 28${bmc_file_system_usage_cmd}= 29... df -h | grep -v /run/initramfs/ro | cut -c 52-54 | grep 100 | wc -l 30 31${BOOT_TIME} ${0} 32${BOOT_COUNT} ${0} 33${devicetree_base} /sys/firmware/devicetree/base/model 34 35*** Keywords *** 36 37Get BMC System Model 38 [Documentation] Get the BMC model from the device tree. 39 40 ${bmc_model} ${stderr}= Execute Command 41 ... cat ${devicetree_base} | cut -d " " -f 1 return_stderr=True 42 Should Be Empty ${stderr} 43 Should Not Be Empty ${bmc_model} 44 [Return] ${bmc_model} 45 46Verify BMC System Model 47 [Documentation] Verify the BMC model with ${OPENBMC_MODEL}. 48 [Arguments] ${bmc_model} 49 50 ${tmp_bmc_model}= Fetch From Right ${OPENBMC_MODEL} / 51 ${tmp_bmc_model}= Fetch From Left ${tmp_bmc_model} . 52 ${ret}= Run Keyword And Return Status Should Contain ${bmc_model} 53 ... ${tmp_bmc_model} ignore_case=True 54 [Return] ${ret} 55 56Wait For Host To Ping 57 [Arguments] ${host} ${timeout}=${OPENBMC_REBOOT_TIMEOUT}min 58 ... ${interval}=5 sec 59 60 # host The DNS name or IP of the host to ping. 61 # timeout The amount of time after which attempts to ping cease. 62 # interval The amount of time in between attempts to ping. 63 64 Wait Until Keyword Succeeds ${timeout} ${interval} Ping Host ${host} 65 66Ping Host 67 [Arguments] ${host} 68 Should Not Be Empty ${host} msg=No host provided 69 ${RC} ${output}= Run and return RC and Output ping -c 4 ${host} 70 Log RC: ${RC}\nOutput:\n${output} 71 Should be equal ${RC} ${0} 72 73Get Boot Progress 74 [Arguments] ${quiet}=${QUIET} 75 76 ${state}= Read Attribute ${OPENBMC_BASE_URI}sensors/host/BootProgress 77 ... value quiet=${quiet} 78 [Return] ${state} 79 80Is Power On 81 ${state}= Get Power State 82 Should be equal ${state} ${1} 83 84Is Power Off 85 ${state}= Get Power State 86 Should be equal ${state} ${0} 87 88Initiate Power On 89 [Documentation] Initiates the power on and waits until the Is Power On 90 ... keyword returns that the power state has switched to on. 91 [Arguments] ${wait}=${1} 92 93 @{arglist}= Create List 94 ${args}= Create Dictionary data=@{arglist} 95 ${resp}= Call Method ${OPENBMC_BASE_URI}control/chassis0/ powerOn 96 ... data=${args} 97 should be equal as strings ${resp.status_code} ${HTTP_OK} 98 99 # Does caller want to wait for power on status? 100 Run Keyword If '${wait}' == '${0}' Return From Keyword 101 Wait Until Keyword Succeeds 3 min 10 sec Is Power On 102 103Initiate Power Off 104 [Documentation] Initiates the power off and waits until the Is Power Off 105 ... keyword returns that the power state has switched to off. 106 @{arglist}= Create List 107 ${args}= Create Dictionary data=@{arglist} 108 ${resp}= Call Method ${OPENBMC_BASE_URI}control/chassis0/ powerOff 109 ... data=${args} 110 should be equal as strings ${resp.status_code} ${HTTP_OK} 111 Wait Until Keyword Succeeds 1 min 10 sec Is Power Off 112 113Initiate OS Host Power Off 114 [Documentation] Initiate an OS reboot. 115 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 116 ... ${os_password}=${OS_PASSWORD} 117 118 # Description of arguments: 119 # os_host The DNS name or IP of the OS. 120 # os_username The username to be used to sign in to the OS. 121 # os_password The password to be used to sign in to the OS. 122 123 SSHLibrary.Open connection ${os_host} 124 Login ${os_username} ${os_password} 125 ${cmd_buf} Catenate shutdown 126 Start Command ${cmd_buf} 127 SSHLibrary.Close Connection 128 129Initiate OS Host Reboot 130 [Documentation] Initiate an OS reboot. 131 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 132 ... ${os_password}=${OS_PASSWORD} 133 134 # Description of arguments: 135 # os_host The DNS name or IP of the OS. 136 # os_username The username to be used to sign in to the OS. 137 # os_password The password to be used to sign in to the OS. 138 139 SSHLibrary.Open connection ${os_host} 140 Login ${os_username} ${os_password} 141 ${cmd_buf} Catenate reboot 142 Start Command ${cmd_buf} 143 SSHLibrary.Close Connection 144 145Initiate Auto Reboot 146 [Documentation] Initiate an auto reboot. 147 148 # Set the auto reboot policy. 149 Set Auto Reboot yes 150 151 SSHLibrary.Open connection ${openbmc_host} 152 Login ${openbmc_username} ${openbmc_password} 153 154 # Set the watchdog timer. Note: 5000 = milliseconds which is 5 seconds. 155 ${cmd_buf}= Catenate /usr/sbin/mapper call /org/openbmc/watchdog/host0 156 ... org.openbmc.Watchdog set i 5000 157 ${output} ${stderr} ${rc}= Execute Command ${cmd_buf} 158 ... return_stderr=True return_rc=True 159 Should Be Empty ${stderr} 160 Should be equal ${rc} ${0} 161 162 # Start the watchdog. 163 ${cmd_buf}= Catenate /usr/sbin/mapper call /org/openbmc/watchdog/host0 164 ... org.openbmc.Watchdog start 165 ${output} ${stderr} ${rc}= Execute Command ${cmd_buf} 166 ... return_stderr=True return_rc=True 167 Should Be Empty ${stderr} 168 Should be equal ${rc} ${0} 169 170Trigger Warm Reset 171 log to console "Triggering warm reset" 172 ${data}= create dictionary data=@{EMPTY} 173 ${resp}= openbmc post request 174 ... ${OPENBMC_BASE_URI}control/bmc0/action/warmReset data=${data} 175 Should Be Equal As Strings ${resp.status_code} ${HTTP_OK} 176 ${session_active}= Check If warmReset is Initiated 177 Run Keyword If '${session_active}' == '${True}' 178 ... Fail msg=warm reset didn't occur 179 180 Sleep ${SYSTEM_SHUTDOWN_TIME}min 181 Check If BMC Is Up 182 183Check OS 184 [Documentation] Attempts to ping the host OS and then checks that the host 185 ... OS is up by running an SSH command. 186 187 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 188 ... ${os_password}=${OS_PASSWORD} ${quiet}=${QUIET} 189 ... ${print_string}=${EMPTY} 190 [Teardown] SSHLibrary.Close Connection 191 192 # os_host The DNS name/IP of the OS host associated with our BMC. 193 # os_username The username to be used to sign on to the OS host. 194 # os_password The password to be used to sign on to the OS host. 195 # quiet Indicates whether this keyword should write to console. 196 # print_string A string to be printed before checking the OS. 197 198 rprint ${print_string} 199 200 # Attempt to ping the OS. Store the return code to check later. 201 ${ping_rc}= Run Keyword and Return Status Ping Host ${os_host} 202 203 SSHLibrary.Open connection ${os_host} 204 205 ${status} ${msg}= Run Keyword And Ignore Error Login ${os_username} 206 ... ${os_password} 207 ${err_msg1}= Sprint Error ${msg} 208 ${err_msg}= Catenate SEPARATOR= \n ${err_msg1} 209 Run Keyword If '${status}' == 'FAIL' Fail msg=${err_msg} 210 ${output} ${stderr} ${rc}= Execute Command uptime return_stderr=True 211 ... return_rc=True 212 213 ${temp_msg}= Catenate Could not execute a command on the operating 214 ... system.\n 215 ${err_msg1}= Sprint Error ${temp_msg} 216 ${err_msg}= Catenate SEPARATOR= \n ${err_msg1} 217 218 # If the return code returned by "Execute Command" is non-zero, this 219 # keyword will fail. 220 Should Be Equal ${rc} ${0} msg=${err_msg} 221 # We will likewise fail if there is any stderr data. 222 Should Be Empty ${stderr} 223 224 ${temp_msg}= Set Variable Could not ping the operating system.\n 225 ${err_msg1}= Sprint Error ${temp_msg} 226 ${err_msg}= Catenate SEPARATOR= \n ${err_msg1} 227 # We will likewise fail if the OS did not ping, as we could SSH but not 228 # ping 229 Should Be Equal As Strings ${ping_rc} ${TRUE} msg=${err_msg} 230 231Wait for OS 232 [Documentation] Waits for the host OS to come up via calls to "Check OS". 233 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 234 ... ${os_password}=${OS_PASSWORD} ${timeout}=${OS_WAIT_TIMEOUT} 235 ... ${quiet}=${0} 236 [Teardown] rprintn 237 238 # os_host The DNS name or IP of the OS host associated with our 239 # BMC. 240 # os_username The username to be used to sign on to the OS host. 241 # os_password The password to be used to sign on to the OS host. 242 # timeout The timeout in seconds indicating how long you're 243 # willing to wait for the OS to respond. 244 # quiet Indicates whether this keyword should write to console. 245 246 # The interval to be used between calls to "Check OS". 247 ${interval}= Set Variable 5 248 249 ${message}= Catenate Checking every ${interval} seconds for up to 250 ... ${timeout} seconds for the operating system to communicate. 251 rqprint_timen ${message} 252 253 Wait Until Keyword Succeeds ${timeout} sec ${interval} Check OS 254 ... ${os_host} ${os_username} ${os_password} 255 ... print_string=\# 256 257 rqprintn 258 259 rqprint_timen The operating system is now communicating. 260 261Get BMC State Deprecated 262 [Documentation] Returns the state of the BMC as a string. (i.e: BMC_READY) 263 [Arguments] ${quiet}=${QUIET} 264 265 @{arglist}= Create List 266 ${args}= Create Dictionary data=@{arglist} 267 ${resp}= Call Method ${OPENBMC_BASE_URI}managers/System/ getSystemState 268 ... data=${args} quiet=${quiet} 269 Should be equal as strings ${resp.status_code} ${HTTP_OK} 270 ${content}= to json ${resp.content} 271 [Return] ${content["data"]} 272 273Get Power State 274 [Documentation] Returns the power state as an integer. Either 0 or 1. 275 [Arguments] ${quiet}=${QUIET} 276 277 @{arglist}= Create List 278 ${args}= Create Dictionary data=@{arglist} 279 280 ${resp}= Call Method ${OPENBMC_BASE_URI}control/chassis0/ getPowerState 281 ... data=${args} quiet=${quiet} 282 Should be equal as strings ${resp.status_code} ${HTTP_OK} 283 ${content}= to json ${resp.content} 284 [Return] ${content["data"]} 285 286Clear BMC Record Log 287 [Documentation] Clears all the event logs on the BMC. This would be 288 ... equivalent to ipmitool sel clear. 289 @{arglist}= Create List 290 ${args}= Create Dictionary data=@{arglist} 291 ${resp}= Call Method 292 ... ${OPENBMC_BASE_URI}records/events/ clear data=${args} 293 should be equal as strings ${resp.status_code} ${HTTP_OK} 294 295Copy PNOR to BMC 296 Import Library SCPLibrary WITH NAME scp 297 Open Connection for SCP 298 Log Copying ${PNOR_IMAGE_PATH} to /tmp 299 scp.Put File ${PNOR_IMAGE_PATH} /tmp 300 301Flash PNOR 302 [Documentation] Calls flash bios update method to flash PNOR image 303 [Arguments] ${pnor_image} 304 @{arglist}= Create List ${pnor_image} 305 ${args}= Create Dictionary data=@{arglist} 306 ${resp}= Call Method ${OPENBMC_BASE_URI}control/flash/bios/ update 307 ... data=${args} 308 should be equal as strings ${resp.status_code} ${HTTP_OK} 309 Wait Until Keyword Succeeds 2 min 10 sec Is PNOR Flashing 310 311Get Flash BIOS Status 312 [Documentation] Returns the status of the flash BIOS API as a string. For 313 ... example 'Flashing', 'Flash Done', etc 314 ${data}= Read Properties ${OPENBMC_BASE_URI}control/flash/bios 315 [Return] ${data['status']} 316 317Is PNOR Flashing 318 [Documentation] Get BIOS 'Flashing' status. This indicates that PNOR 319 ... flashing has started. 320 ${status}= Get Flash BIOS Status 321 should be equal as strings ${status} Flashing 322 323Is PNOR Flash Done 324 [Documentation] Get BIOS 'Flash Done' status. This indicates that the 325 ... PNOR flashing has completed. 326 ${status}= Get Flash BIOS Status 327 should be equal as strings ${status} Flash Done 328 329Is System State Host Booted 330 [Documentation] Checks whether system state is HOST_BOOTED. 331 ${state}= Get BMC State Deprecated 332 should be equal as strings ${state} HOST_BOOTED 333 334Is OS Starting 335 [Documentation] Check if boot progress is OS starting. 336 ${boot_progress}= Get Boot Progress 337 Should Be Equal ${boot_progress} FW Progress, Starting OS 338 339Is OS Off 340 [Documentation] Check if boot progress is "Off". 341 ${boot_progress}= Get Boot Progress 342 Should Be Equal ${boot_progress} Off 343 344Verify Ping and REST Authentication 345 ${l_ping}= Run Keyword And Return Status 346 ... Ping Host ${OPENBMC_HOST} 347 Run Keyword If '${l_ping}' == '${False}' 348 ... Fail msg=Ping Failed 349 350 ${l_rest}= Run Keyword And Return Status 351 ... Initialize OpenBMC 352 Run Keyword If '${l_rest}' == '${False}' 353 ... Fail msg=REST Authentication Failed 354 355 # Just to make sure the SSH is working for SCP 356 Open Connection And Log In 357 ${system} ${stderr}= Execute Command hostname return_stderr=True 358 Should Be Empty ${stderr} 359 360Check If BMC is Up 361 [Documentation] Wait for Host to be online. Checks every X seconds 362 ... interval for Y minutes and fails if timed out. 363 ... Default MAX timedout is 10 min, interval 10 seconds. 364 [Arguments] ${max_timeout}=${OPENBMC_REBOOT_TIMEOUT} min 365 ... ${interval}=10 sec 366 367 Wait Until Keyword Succeeds 368 ... ${max_timeout} ${interval} Verify Ping and REST Authentication 369 370 371Check If warmReset is Initiated 372 [Documentation] Ping would be still alive, so try SSH to connect 373 ... if fails the ports are down indicating reboot 374 ... is in progress 375 376 # Warm reset adds 3 seconds delay before forcing reboot 377 # To minimize race conditions, we wait for 7 seconds 378 Sleep 7s 379 ${alive}= Run Keyword and Return Status 380 ... Open Connection And Log In 381 Return From Keyword If '${alive}' == '${False}' ${False} 382 [Return] ${True} 383 384Flush REST Sessions 385 [Documentation] Removes all the active session objects 386 Delete All Sessions 387 388Initialize DBUS cmd 389 [Documentation] Initialize dbus string with property string to extract 390 [Arguments] ${boot_property} 391 ${cmd}= Catenate ${dbuscmdBase} ${dbuscmdGet} ${dbuscmdString} 392 ${cmd}= Catenate ${cmd}${boot_property} 393 Set Global Variable ${dbuscmd} ${cmd} 394 395Create OS Console File Path 396 [Documentation] Create OS console file path name and return it. 397 [Arguments] ${log_file_path}=${EMPTY} 398 399 # Description of arguements: 400 # file_path The caller's candidate value. If this value is ${EMPTY}, this 401 # keyword will compose a file path name. Otherwise, this 402 # keyword will use the caller's file_path value. In either 403 # case, the value will be returned. 404 405 ${default_file_path}= Catenate /tmp/${OPENBMC_HOST}_os_console 406 ${log_file_path}= Set Variable If '${log_file_path}' == '${EMPTY}' 407 ... ${default_file_path} ${log_file_path} 408 409 [Return] ${log_file_path} 410 411Create OS Console Command String 412 [Documentation] Return a command string to start OS console logging. 413 414 # First make sure that the ssh_pw program is available. 415 ${cmd_buf}= Catenate which ssh_pw 2>&1 416 Rdpissuing ${cmd_buf} 417 ${rc} ${output}= Run And Return Rc And Output ${cmd_buf} 418 Rdpvars rc output 419 Should Be Equal ${rc} ${0} msg=${output}\n 420 421 ${cmd_buf}= Catenate ssh_pw ${OPENBMC_PASSWORD} -p 2200 422 ... ${OPENBMC_USERNAME}@${OPENBMC_HOST} 423 424 [Return] ${cmd_buf} 425 426Stop SOL Console Logging 427 [Documentation] Stop system console logging and return log output. 428 [Arguments] ${log_file_path}=${EMPTY} ${targ_file_path}=${EMPTY} 429 430 # If there are muliple system console processes, they will all be stopped. 431 # If there is no existing log file this keyword will return an error 432 # message to that effect (and write that message to targ_file_path, if 433 # specified). 434 # NOTE: This keyword will not fail if there is no running system console 435 # process. 436 437 # Description of arguments: 438 # log_file_path The file path that was used to call "Start SOL 439 # Console Logging". See that keyword (above) for details. 440 # targ_file_path If specified, the file path to which the source 441 # file path (i.e. "log_file_path") should be copied. 442 443 ${log_file_path}= Create OS Console File Path ${log_file_path} 444 # Find the pid of the active system console logging session (if any). 445 ${search_string}= Create OS Console Command String 446 ${cmd_buf}= Catenate echo $(ps -ef | egrep '${search_string}' 447 ... | egrep -v grep | cut -c10-14) 448 Rdpissuing ${cmd_buf} 449 ${rc} ${os_con_pid}= Run And Return Rc And Output ${cmd_buf} 450 Rdpvars os_con_pid 451 # If rc is not zero it just means that there is no OS Console process 452 # running. 453 454 ${cmd_buf}= Catenate kill -9 ${os_con_pid} 455 Run Keyword If '${os_con_pid}' != '${EMPTY}' Rdpissuing ${cmd_buf} 456 ${rc} ${output}= Run Keyword If '${os_con_pid}' != '${EMPTY}' 457 ... Run And Return Rc And Output ${cmd_buf} 458 Run Keyword If '${os_con_pid}' != '${EMPTY}' Rdpvars rc output 459 460 ${cmd_buf}= Set Variable cat ${log_file_path} 2>&1 461 Rdpissuing ${cmd_buf} 462 ${rc} ${output}= Run And Return Rc And Output ${cmd_buf} 463 Rdpvars rc 464 465 Run Keyword If '${targ_file_path}' != '${EMPTY}' 466 ... Run Keyword And Ignore Error 467 ... Copy File ${log_file_path} ${targ_file_path} 468 469 [Return] ${output} 470 471Start SOL Console Logging 472 [Documentation] Start system console log to file. 473 [Arguments] ${log_file_path}=${EMPTY} 474 475 # This keyword will first call "Stop SOL Console Logging". Only then will 476 # it start SOL console logging. The data returned by "Stop SOL Console 477 # Logging" will in turn be returned by this keyword. 478 479 # Description of arguments: 480 # log_file_path The file path to which system console log data should be 481 # written. Note that this path is taken to be a location on 482 # the machine where this program is running rather than on 483 # the Open BMC system. 484 485 ${log_file_path}= Create OS Console File Path ${log_file_path} 486 487 ${log_output}= Stop SOL Console Logging ${log_file_path} 488 489 # Validate by making sure we can create the file. Problems creating the 490 # file would not be noticed by the subsequent ssh command because we fork 491 # the command. 492 Create File ${log_file_path} 493 ${sub_cmd_buf}= Create OS Console Command String 494 # Routing stderr to stdout so that any startup error text will go to the 495 # output file. 496 ${cmd_buf}= Catenate ${sub_cmd_buf} > ${log_file_path} 2>&1 & 497 Rdpissuing ${cmd_buf} 498 ${rc} ${output}= Run And Return Rc And Output ${cmd_buf} 499 # Because we are forking this command, we essentially will never get a 500 # non-zero return code or any output. 501 Should Be Equal ${rc} ${0} 502 503 [Return] ${log_output} 504 505Get Time Stamp 506 [Documentation] Get the current time stamp data 507 ${cur_time}= Get Current Date result_format=%Y%m%d%H%M%S%f 508 [Return] ${cur_time} 509 510 511Verify BMC State 512 [Documentation] Get the BMC state and verify if the current 513 ... BMC state is as expected. 514 [Arguments] ${expected} 515 516 ${current}= Get BMC State Deprecated 517 Should Contain ${expected} ${current} 518 519Start Journal Log 520 [Documentation] Start capturing journal log to a file in /tmp using 521 ... journalctl command. By default journal log is collected 522 ... at /tmp/journal_log else user input location. 523 ... The File is appended with datetime. 524 [Arguments] ${file_path}=/tmp/journal_log 525 526 Open Connection And Log In 527 528 ${cur_time}= Get Time Stamp 529 Set Global Variable ${LOG_TIME} ${cur_time} 530 Start Command 531 ... journalctl -f > ${file_path}-${LOG_TIME} 532 Log Journal Log Started: ${file_path}-${LOG_TIME} 533 534 535Stop Journal Log 536 [Documentation] Stop journalctl process if its running. 537 ... By default return log from /tmp/journal_log else 538 ... user input location. 539 [Arguments] ${file_path}=/tmp/journal_log 540 541 Open Connection And Log In 542 543 ${rc}= 544 ... Execute Command 545 ... ps ax | grep journalctl | grep -v grep 546 ... return_stdout=False return_rc=True 547 548 Return From Keyword If '${rc}' == '${1}' 549 ... No journal log process running 550 551 ${output} ${stderr}= 552 ... Execute Command killall journalctl 553 ... return_stderr=True 554 Should Be Empty ${stderr} 555 556 ${journal_log} ${stderr}= 557 ... Execute Command 558 ... cat ${file_path}-${LOG_TIME} 559 ... return_stderr=True 560 Should Be Empty ${stderr} 561 562 Log ${journal_log} 563 564 Execute Command rm ${file_path}-${LOG_TIME} 565 566 [Return] ${journal_log} 567 568Mac Address To Hex String 569 [Documentation] Converts MAC address into hex format. 570 ... Example 571 ... Given the following MAC: 00:01:6C:80:02:78 572 ... This keyword will return: 0x00 0x01 0x6C 0x80 0x02 0x78 573 ... Description of arguments: 574 ... i_macaddress MAC address in the following format 575 ... 00:01:6C:80:02:78 576 [Arguments] ${i_macaddress} 577 578 ${mac_hex}= Catenate 0x${i_macaddress.replace(':', ' 0x')} 579 [Return] ${mac_hex} 580 581IP Address To Hex String 582 [Documentation] Converts IP address into hex format. 583 ... Example: 584 ... Given the following IP: 10.3.164.100 585 ... This keyword will return: 0xa 0x3 0xa4 0xa0 586 ... Description of arguments: 587 ... i_ipaddress IP address in the following format 588 ... 10.10.10.10 589 [Arguments] ${i_ipaddress} 590 591 @{ip}= Split String ${i_ipaddress} . 592 ${index}= Set Variable ${0} 593 594 :FOR ${item} IN @{ip} 595 \ ${hex}= Convert To Hex ${item} prefix=0x lowercase=yes 596 \ Set List Value ${ip} ${index} ${hex} 597 \ ${index}= Set Variable ${index + 1} 598 ${ip_hex}= Catenate @{ip} 599 [Return] ${ip_hex} 600 601BMC CPU Performance Check 602 [Documentation] Minimal 10% of proc should be free in this instance 603 604 ${bmc_cpu_usage_output} ${stderr}= Execute Command ${bmc_cpu_usage_cmd} 605 ... return_stderr=True 606 Should be empty ${stderr} 607 ${bmc_cpu_percentage}= Fetch From Left ${bmc_cpu_usage_output} % 608 Should be true ${bmc_cpu_percentage} < 90 609 610BMC Mem Performance Check 611 [Documentation] Minimal 10% of memory should be free in this instance 612 613 ${bmc_mem_free_output} ${stderr}= Execute Command ${bmc_mem_free_cmd} 614 ... return_stderr=True 615 Should be empty ${stderr} 616 617 ${bmc_mem_total_output} ${stderr}= Execute Command ${bmc_mem_total_cmd} 618 ... return_stderr=True 619 Should be empty ${stderr} 620 621 ${bmc_mem_percentage}= Evaluate ${bmc_mem_free_output}*100 622 ${bmc_mem_percentage}= Evaluate 623 ... ${bmc_mem_percentage}/${bmc_mem_total_output} 624 Should be true ${bmc_mem_percentage} > 10 625 626BMC File System Usage Check 627 [Documentation] Check the file system space. None should be 100% full 628 ... except /run/initramfs/ro 629 ${bmc_fs_usage_output} ${stderr}= Execute Command 630 ... ${bmc_file_system_usage_cmd} return_stderr=True 631 Should Be Empty ${stderr} 632 Should Be True ${bmc_fs_usage_output}==0 633 634Check BMC CPU Performance 635 [Documentation] Minimal 10% of proc should be free in 3 sample 636 :FOR ${var} IN Range 1 4 637 \ BMC CPU Performance check 638 639Check BMC Mem Performance 640 [Documentation] Minimal 10% of memory should be free 641 642 :FOR ${var} IN Range 1 4 643 \ BMC Mem Performance check 644 645Check BMC File System Performance 646 [Documentation] Check for file system usage for 4 times 647 648 :FOR ${var} IN Range 1 4 649 \ BMC File System Usage check 650 651Get Endpoint Paths 652 [Documentation] Returns all url paths ending with given endpoint 653 ... Example: 654 ... Given the following endpoint: cpu 655 ... This keyword will return: list of all urls ending with 656 ... cpu - 657 ... /org/openbmc/inventory/system/chassis/motherboard/cpu0, 658 ... /org/openbmc/inventory/system/chassis/motherboard/cpu1 659 ... Description of arguments: 660 ... path URL path for enumeration 661 ... endpoint string for which url path ending 662 [Arguments] ${path} ${endpoint} 663 664 ${resp}= Read Properties ${path}/enumerate timeout=30 665 log Dictionary ${resp} 666 667 ${list}= Get Dictionary Keys ${resp} 668 ${resp}= Get Matches ${list} regexp=^.*[0-9a-z_].${endpoint}[0-9]*$ 669 [Return] ${resp} 670 671Check Zombie Process 672 [Documentation] Check if any defunct process exist or not on BMC 673 ${count} ${stderr} ${rc}= Execute Command ps -o stat | grep Z | wc -l 674 ... return_stderr=True return_rc=True 675 Should Be True ${count}==0 676 Should Be Empty ${stderr} 677 678Prune Journal Log 679 [Documentation] Prune archived journal logs. 680 [Arguments] ${vacuum_size}=1M 681 682 # This keyword can be used to prevent the journal 683 # log from filling up the /run filesystem. 684 # This command will retain only the latest logs 685 # of the user specified size. 686 687 Open Connection And Log In 688 ${output} ${stderr} ${rc}= 689 ... Execute Command 690 ... journalctl --vacuum-size=${vacuum_size} 691 ... return_stderr=True return_rc=True 692 693 Should Be Equal ${rc} ${0} msg=${stderr} 694 695Set BMC Power Policy 696 [Documentation] Set the given BMC power policy. 697 [arguments] ${policy} 698 699 ${valueDict}= create dictionary data=${policy} 700 Write Attribute ${HOST_SETTING} power_policy data=${valueDict} 701 ${currentPolicy}= Read Attribute ${HOST_SETTING} power_policy 702 Should Be Equal ${currentPolicy} ${policy} 703 704Get System Power Policy 705 [Documentation] Get the BMC power policy. 706 ${currentPolicy}= Read Attribute ${HOST_SETTING} power_policy 707 [Return] ${currentPolicy} 708 709Get Auto Reboot 710 [Documentation] Returns auto reboot setting. 711 ${setting}= Read Attribute ${HOST_SETTING} auto_reboot 712 [Return] ${setting} 713 714 715Set Auto Reboot 716 [Documentation] Set the given auto reboot setting. 717 [Arguments] ${setting} 718 # setting auto reboot's setting, i.e. yes or no 719 720 ${valueDict}= Set Variable ${setting} 721 ${data}= Create Dictionary data=${valueDict} 722 Write Attribute ${HOST_SETTING} auto_reboot data=${data} 723 ${current_setting}= Get Auto Reboot 724 Should Be Equal ${current_setting} ${setting} 725 726 727Set BMC Reset Reference Time 728 [Documentation] Set current boot time as a reference and increment 729 ... boot count. 730 731 ${cur_btime}= Get BMC Boot Time 732 Run Keyword If ${BOOT_TIME} == ${0} and ${BOOT_COUNT} == ${0} 733 ... Set Global Variable ${BOOT_TIME} ${cur_btime} 734 ... ELSE IF ${cur_btime} > ${BOOT_TIME} 735 ... Run Keywords Set Global Variable ${BOOT_TIME} ${cur_btime} 736 ... AND 737 ... Set Global Variable ${BOOT_COUNT} ${BOOT_COUNT + 1} 738 739Get BMC Boot Time 740 [Documentation] Get boot time from /proc/stat. 741 742 Open Connection And Log In 743 ${output} ${stderr}= 744 ... Execute Command egrep '^btime ' /proc/stat | cut -f 2 -d ' ' 745 ... return_stderr=True 746 Should Be Empty ${stderr} 747 ${btime}= Convert To Integer ${output} 748 [Return] ${btime} 749 750Execute Command On BMC 751 [Documentation] Execute given command on BMC and return output. 752 [Arguments] ${command} 753 ${stdout} ${stderr}= Execute Command ${command} return_stderr=True 754 Should Be Empty ${stderr} 755 [Return] ${stdout} 756 757Enable Core Dump On BMC 758 [Documentation] Enable core dump collection. 759 Open Connection And Log In 760 ${core_pattern}= Execute Command On BMC 761 ... echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern 762 Should Be Equal As Strings ${core_pattern} /tmp/core_%e.%p 763 764Get Number Of BMC Core Dump Files 765 [Documentation] Get number of core dump files on BMC. 766 Open Connection And Log In 767 ${num_of_core_dump}= Execute Command 768 ... ls /tmp/core* 2>/dev/null | wc -l 769 [Return] ${num_of_core_dump} 770 771Set Core Dump File Size Unlimited 772 [Documentation] Set core dump file size to unlimited. 773 Open Connection And Log In 774 Execute Command On BMC 775 ... ulimit -c unlimited 776 777Check For Core Dumps 778 [Documentation] Check for any core dumps exist. 779 ${output}= Get Number Of BMC Core Dump Files 780 Run Keyword If ${output} > 0 781 ... Log **Warning** BMC core dump files exist level=WARN 782 783Trigger Host Watchdog Error 784 [Documentation] Inject host watchdog error using BMC. 785 [Arguments] ${milliseconds}=1000 ${sleep_time}=5s 786 # Description of arguments: 787 # milliseconds The time watchdog timer value in milliseconds (e.g. 1000 = 1 second). 788 # sleep_time Time delay for host watchdog error to get injected. 789 # Default is 5 seconds. 790 791 Execute Command On BMC 792 ... /usr/sbin/mapper call /org/openbmc/watchdog/host0 org.openbmc.Watchdog set i ${milliseconds} 793 Execute Command On BMC 794 ... /usr/sbin/mapper call /org/openbmc/watchdog/host0 org.openbmc.Watchdog start 795 Sleep ${sleep_time} 796 797Login To OS Host 798 [Documentation] Login to OS Host. 799 [Arguments] ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 800 ... ${os_password}=${OS_PASSWORD} 801 # Desription of arguments: 802 # ${os_host} IP address of the OS Host. 803 # ${os_username} OS Host Login user name. 804 # ${os_password} OS Host Login passwrd. 805 806 ${os_state}= Run Keyword And Return Status Ping Host ${os_host} 807 Run Keyword If '${os_state}' == 'False' 808 ... Run Keywords Initiate Host Reboot AND 809 ... Is Host Running AND 810 ... Wait for OS ${os_host} ${os_username} ${os_password} 811 812 Open Connection ${os_host} 813 Login ${os_username} ${os_password} 814 815Configure Initial Settings 816 [Documentation] Restore old IP and route. 817 ... This keyword requires initial settings viz IP address, 818 ... Network Mask, default gatway and serial console IP and port 819 ... information which should be provided in command line. 820 821 [Arguments] ${host}=${OPENBMC_HOST} ${mask}=${NET_MASK} ${gw_ip}=${GW_IP} 822 823 # Open telnet connection and ignore the error, in case telnet session is already 824 # opened by the program calling this keyword. 825 826 Run Keyword And Ignore Error Open Telnet Connection to BMC Serial Console 827 Telnet.write ifconfig eth0 ${host} netmask ${mask} 828 Telnet.write route add default gw ${gw_ip} 829