Move keywords not using REST into new library

Move the keywords in utils.robot that do not use the REST
interface into a new library named common_utils.robot.

Resolves openbmc/openbmc-test-automation#1487

Change-Id: I850fbb72407ecd70b083c122666dd227c1f20033
Signed-off-by: Steven Sombar <ssombar@us.ibm.com>
diff --git a/lib/common_utils.robot b/lib/common_utils.robot
new file mode 100755
index 0000000..674bde3
--- /dev/null
+++ b/lib/common_utils.robot
@@ -0,0 +1,928 @@
+*** Settings ***
+
+Documentation  Utilities for Robot keywords that do not use REST.
+
+Resource                ../lib/resource.txt
+Resource                ../lib/connection_client.robot
+Resource                ../lib/boot_utils.robot
+Library                 String
+Library                 DateTime
+Library                 Process
+Library                 OperatingSystem
+Library                 gen_print.py
+Library                 gen_robot_print.py
+Library                 gen_cmd.py
+Library                 gen_robot_keyword.py
+Library                 bmc_ssh_utils.py
+Library                 utils.py
+Library                 var_funcs.py
+Library                 SCPLibrary  WITH NAME  scp
+
+*** Variables ***
+
+${pflash_cmd}             /usr/sbin/pflash -r /dev/stdout -P VERSION
+
+${dbuscmdBase}
+...  dbus-send --system --print-reply --dest=${OPENBMC_BASE_DBUS}.settings.Host
+${dbuscmdGet}
+...  ${SETTINGS_URI}host0  org.freedesktop.DBus.Properties.Get
+${dbuscmdString}=  string:"xyz.openbmc_project.settings.Host" string:
+
+# Assign default value to QUIET for programs which may not define it.
+${QUIET}  ${0}
+
+${bmc_mem_free_cmd}=   free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f4
+${bmc_mem_total_cmd}=   free | tr -s ' ' | sed '/^Mem/!d' | cut -d" " -f2
+${bmc_cpu_usage_cmd}=   top -n 1  | grep CPU: | cut -c 7-9
+${HOST_SETTING}    ${SETTINGS_URI}host0
+
+# /run/initramfs/ro associate filesystem  should be 100% full always
+${bmc_file_system_usage_cmd}=  df -h | cut -c 52-54 | grep 100 | wc -l
+${total_pnor_ro_file_system_cmd}=  df -h | grep /media/pnor-ro | wc -l
+${total_bmc_ro_file_system_cmd}=  df -h | grep /media/rofs | wc -l
+
+${BOOT_TIME}     ${0}
+${BOOT_COUNT}    ${0}
+${count}  ${0}
+${devicetree_base}  /sys/firmware/devicetree/base/model
+
+# Initialize default debug value to 0.
+${DEBUG}         ${0}
+
+${probe_cpu_tool_path}     ${EXECDIR}/tools/ras/probe_cpus.sh
+${scom_addrs_tool_path}    ${EXECDIR}/tools/ras/scom_addr_p9.sh
+${target_file_path}        /root/
+
+${default_tarball}  ${EXECDIR}/obmc-phosphor-debug-tarball-witherspoon.tar.xz
+
+# These variables are used to straddle between new and old methods of setting
+# values.
+${bmc_power_policy_method}        ${EMPTY}
+@{valid_power_policy_vars}        RESTORE_LAST_STATE  ALWAYS_POWER_ON
+...                               ALWAYS_POWER_OFF
+
+
+*** Keywords ***
+
+Check BMC Performance
+    [Documentation]  Check BMC basic CPU Mem File system performance.
+
+    Check BMC CPU Performance
+    Check BMC Mem Performance
+    Check BMC File System Performance
+
+
+Verify PNOR Update
+    [Documentation]  Verify that the PNOR is not corrupted.
+    # Example:
+    # FFS: Flash header not found. Code: 100
+    # Error 100 opening ffs !
+
+    ${stdout}  ${stderr}  ${rc}=
+    ...  BMC Execute Command  /usr/sbin/pflash -h | egrep -q skip
+    ...  ignore_err=${1}
+    ${pflash_cmd}=  Set Variable If  ${rc} == ${0}  ${pflash_cmd} --skip=4096
+    ...  ${pflash_cmd}
+    ${pnor_info}=  BMC Execute Command  ${pflash_cmd}
+    Should Not Contain Any  ${pnor_info}  Flash header not found  Error
+
+
+Get BMC System Model
+    [Documentation]  Get the BMC model from the device tree and return it.
+
+    ${bmc_model}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  cat ${devicetree_base} | cut -d " " -f 1  return_stderr=True
+    ...  test_mode=0
+    Should Be Empty  ${stderr}
+    Should Not Be Empty  ${bmc_model}  msg=BMC model is empty.
+    [Return]  ${bmc_model}
+
+
+Verify BMC System Model
+    [Documentation]  Verify the BMC model with ${OPENBMC_MODEL}.
+    [Arguments]  ${bmc_model}
+
+    # Description of argument(s):
+    # bmc_model System model (e.g. "witherspoon").
+
+    ${tmp_bmc_model}=  Fetch From Right  ${OPENBMC_MODEL}  /
+    ${tmp_bmc_model}=  Fetch From Left  ${tmp_bmc_model}  .
+    ${ret}=  Run Keyword And Return Status  Should Contain  ${bmc_model}
+    ...  ${tmp_bmc_model}  ignore_case=True
+    [Return]  ${ret}
+
+
+Wait For Host To Ping
+    [Documentation]  Wait for the given host to ping.
+    [Arguments]  ${host}  ${timeout}=${OPENBMC_REBOOT_TIMEOUT}min
+    ...          ${interval}=5 sec
+
+    # Description of argument(s):
+    # host      The host name or IP of the host to ping.
+    # timeout   The amount of time after which ping attempts cease.
+    #           This should be expressed in Robot Framework's time format
+    #           (e.g. "10 seconds").
+    # interval  The amount of time in between attempts to ping.
+    #           This should be expressed in Robot Framework's time format
+    #           (e.g. "5 seconds").
+
+    Wait Until Keyword Succeeds  ${timeout}  ${interval}  Ping Host  ${host}
+
+
+Ping Host
+    [Documentation]  Ping the given host.
+    [Arguments]     ${host}
+
+    # Description of argument(s):
+    # host      The host name or IP of the host to ping.
+
+    Should Not Be Empty    ${host}   msg=No host provided
+    ${RC}   ${output}=     Run and return RC and Output    ping -c 4 ${host}
+    Log     RC: ${RC}\nOutput:\n${output}
+    Should be equal     ${RC}   ${0}
+
+
+Check OS
+    [Documentation]  Attempts to ping the host OS and then checks that the host
+    ...              OS is up by running an SSH command.
+
+    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
+    ...          ${os_password}=${OS_PASSWORD}  ${quiet}=${QUIET}
+    ...          ${print_string}=${EMPTY}
+    [Teardown]  SSHLibrary.Close Connection
+
+    # Description of argument(s):
+    # os_host           The DNS name/IP of the OS host associated with our BMC.
+    # os_username       The username to be used to sign on to the OS host.
+    # os_password       The password to be used to sign on to the OS host.
+    # quiet             Indicates whether this keyword should write to console.
+    # print_string      A string to be printed before checking the OS.
+
+    rprint  ${print_string}
+
+    # Attempt to ping the OS. Store the return code to check later.
+    ${ping_rc}=  Run Keyword and Return Status  Ping Host  ${os_host}
+
+    SSHLibrary.Open connection  ${os_host}
+
+    ${status}  ${msg}=  Run Keyword And Ignore Error  Login  ${os_username}
+    ...  ${os_password}
+    ${err_msg1}=  Sprint Error  ${msg}
+    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
+    Run Keyword If  '${status}' == 'FAIL'  Fail  msg=${err_msg}
+    ${output}  ${stderr}  ${rc}=  Execute Command  uptime  return_stderr=True
+    ...        return_rc=True
+
+    ${temp_msg}=  Catenate  Could not execute a command on the operating
+    ...  system.\n
+    ${err_msg1}=  Sprint Error  ${temp_msg}
+    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
+
+    # If the return code returned by "Execute Command" is non-zero, this
+    # keyword will fail.
+    Should Be Equal  ${rc}  ${0}  msg=${err_msg}
+    # We will likewise fail if there is any stderr data.
+    Should Be Empty  ${stderr}
+
+    ${temp_msg}=  Set Variable  Could not ping the operating system.\n
+    ${err_msg1}=  Sprint Error  ${temp_msg}
+    ${err_msg}=  Catenate  SEPARATOR=  \n  ${err_msg1}
+    # We will likewise fail if the OS did not ping, as we could SSH but not
+    # ping
+    Should Be Equal As Strings  ${ping_rc}  ${TRUE}  msg=${err_msg}
+
+
+Wait for OS
+    [Documentation]  Waits for the host OS to come up via calls to "Check OS".
+    [Arguments]  ${os_host}=${OS_HOST}  ${os_username}=${OS_USERNAME}
+    ...          ${os_password}=${OS_PASSWORD}  ${timeout}=${OS_WAIT_TIMEOUT}
+    ...          ${quiet}=${0}
+    [Teardown]  rprintn
+
+    # Description of argument(s):
+    # os_host           The DNS name or IP of the OS host associated with our
+    #                   BMC.
+    # os_username       The username to be used to sign on to the OS host.
+    # os_password       The password to be used to sign on to the OS host.
+    # timeout           The timeout in seconds indicating how long you're
+    #                   willing to wait for the OS to respond.
+    # quiet             Indicates whether this keyword should write to console.
+
+    # The interval to be used between calls to "Check OS".
+    ${interval}=  Set Variable  5
+
+    ${message}=  Catenate  Checking every ${interval} seconds for up to
+    ...  ${timeout} seconds for the operating system to communicate.
+    rqprint_timen  ${message}
+
+    Wait Until Keyword Succeeds  ${timeout} sec  ${interval}  Check OS
+    ...                          ${os_host}  ${os_username}  ${os_password}
+    ...                          print_string=\#
+
+    rqprintn
+
+    rqprint_timen  The operating system is now communicating.
+
+
+Copy PNOR to BMC
+    [Documentation]  Copy the PNOR image to the BMC.
+    Import Library      SCPLibrary      WITH NAME       scp
+    Open Connection for SCP
+    Log    Copying ${PNOR_IMAGE_PATH} to /tmp
+    scp.Put File    ${PNOR_IMAGE_PATH}   /tmp
+
+
+Is OS Starting
+    [Documentation]  Check if boot progress is OS starting.
+    ${boot_progress}=  Get Boot Progress
+    Should Be Equal  ${boot_progress}  OSStart
+
+
+Is OS Off
+    [Documentation]  Check if boot progress is "Off".
+    ${boot_progress}=  Get Boot Progress
+    Should Be Equal  ${boot_progress}  Off
+
+
+Get Boot Progress To OS Starting State
+    [Documentation]  Get the system to a boot progress state of 'FW Progress,
+    ...  Starting OS'.
+
+    ${boot_progress}=  Get Boot Progress
+    Run Keyword If  '${boot_progress}' == 'OSStart'
+    ...  Log  Host is already in OS starting state
+    ...  ELSE
+    ...  Run Keywords  Initiate Host PowerOff  AND  Initiate Host Boot
+    ...  AND  Wait Until Keyword Succeeds  10 min  10 sec  Is OS Starting
+
+
+Check If warmReset is Initiated
+    [Documentation]  Ping would be still alive, so try SSH to connect
+    ...              if fails the ports are down indicating reboot
+    ...              is in progress
+
+    # Warm reset adds 3 seconds delay before forcing reboot
+    # To minimize race conditions, we wait for 7 seconds
+    Sleep  7s
+    ${alive}=   Run Keyword and Return Status
+    ...    Open Connection And Log In
+    Return From Keyword If   '${alive}' == '${False}'    ${False}
+    [Return]    ${True}
+
+
+Initialize DBUS cmd
+    [Documentation]  Initialize dbus string with property string to extract
+    [Arguments]   ${boot_property}
+
+    # Description of argument(s):
+    # boot_property   Property string.
+
+    ${cmd}=     Catenate  ${dbuscmdBase} ${dbuscmdGet} ${dbuscmdString}
+    ${cmd}=     Catenate  ${cmd}${boot_property}
+    Set Global Variable   ${dbuscmd}     ${cmd}
+
+
+Create OS Console Command String
+    [Documentation]  Return a command string to start OS console logging.
+
+    # First make sure that the ssh_pw program is available.
+    ${cmd}=  Catenate  which ssh_pw 2>/dev/null || find
+    ...  ${EXECDIR} -name 'ssh_pw'
+
+    Rdpissuing  ${cmd}
+    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd}
+    Rdpvars  rc  output
+
+    Should Be Equal As Integers  0  ${rc}  msg=Could not find ssh_pw.
+
+    ${ssh_pw_file_path}=  Set Variable  ${output}
+
+    ${cmd}=  Catenate  ${ssh_pw_file_path} ${OPENBMC_PASSWORD} -p 2200
+    ...  -o "StrictHostKeyChecking no" ${OPENBMC_USERNAME}@${OPENBMC_HOST}
+
+    [Return]  ${cmd}
+
+
+Get SOL Console Pid
+    [Documentation]  Get the pid of the active SOL console job.
+    [Arguments]  ${expect_running}=${0}
+
+    # Description of argument(s):
+    # expect_running  If set and if no SOL console job is found, print debug
+    #                 info and fail.
+
+    # Find the pid of the active system console logging session (if any).
+    ${search_string}=  Create OS Console Command String
+    # At least in some cases, ps output does not show double quotes so we must
+    # replace them in our search string with the regexes to indicate that they
+    # are optional.
+    ${search_string}=  Replace String  ${search_string}  "  ["]?
+    ${ps_cmd}=  Catenate  ps axwwo user,pid,cmd
+    ${cmd_buf}=  Catenate  echo $(${ps_cmd} | egrep '${search_string}' |
+    ...  egrep -v grep | cut -c10-14)
+    Rdpissuing  ${cmd_buf}
+    ${rc}  ${os_con_pid}=  Run And Return Rc And Output  ${cmd_buf}
+    Rdpvars  os_con_pid
+    # If rc is not zero it just means that there is no OS Console process
+    # running.
+
+    Return From Keyword If  '${os_con_pid}' != '${EMPTY}'  ${os_con_pid}
+    Return From Keyword If  '${expect_running}' == '${0}'  ${os_con_pid}
+
+    Cmd Fnc  cat ${log_file_path} ; echo ; ${ps_cmd}  quiet=${0}
+    ...  print_output=${1}  show_err=${1}
+
+    Should Not Be Empty  ${os_con_pid}
+
+
+Stop SOL Console Logging
+    [Documentation]  Stop system console logging and return log output.
+    [Arguments]  ${log_file_path}=${EMPTY}
+    ...          ${targ_file_path}=${EXECDIR}${/}logs${/}
+    ...          ${return_data}=${1}
+
+    # If there are muliple system console processes, they will all be stopped.
+    # If there is no existing log file this keyword will return an error
+    # message to that effect (and write that message to targ_file_path, if
+    # specified).
+    # NOTE: This keyword will not fail if there is no running system console
+    # process.
+
+    # Description of arguments:
+    # log_file_path   The file path that was used to call "Start SOL
+    #                 Console Logging".  See that keyword (above) for details.
+    # targ_file_path  If specified, the file path to which the source
+    #                 file path (i.e. "log_file_path") should be copied.
+    # return_data     If this is set to ${1}, this keyword will return the SOL
+    #                 data to the caller as a unicode string.
+
+    ${log_file_path}=  Create OS Console File Path  ${log_file_path}
+
+    ${os_con_pid}=  Get SOL Console Pid
+
+    ${cmd_buf}=  Catenate  kill -9 ${os_con_pid}
+    Run Keyword If  '${os_con_pid}' != '${EMPTY}'  Rdpissuing  ${cmd_buf}
+    ${rc}  ${output}=  Run Keyword If  '${os_con_pid}' != '${EMPTY}'
+    ...  Run And Return Rc And Output  ${cmd_buf}
+    Run Keyword If  '${os_con_pid}' != '${EMPTY}'  Rdpvars  rc  output
+
+    Run Keyword If  '${targ_file_path}' != '${EMPTY}'
+    ...  Run Keyword And Ignore Error
+    ...  Copy File  ${log_file_path}  ${targ_file_path}
+
+    ${output}=  Set Variable  ${EMPTY}
+    ${loc_quiet}=  Evaluate  ${debug}^1
+    ${rc}  ${output}=  Run Keyword If  '${return_data}' == '${1}'
+    ...  Cmd Fnc  cat ${log_file_path} 2>/dev/null  quiet=${loc_quiet}
+    ...  print_output=${0}  show_err=${0}
+
+    [Return]  ${output}
+
+
+Start SOL Console Logging
+    [Documentation]  Start system console log to file.
+    [Arguments]  ${log_file_path}=${EMPTY}  ${return_data}=${1}
+
+    # This keyword will first call "Stop SOL Console Logging".  Only then will
+    # it start SOL console logging.  The data returned by "Stop SOL Console
+    # Logging" will in turn be returned by this keyword.
+
+    # Description of arguments:
+    # log_file_path   The file path to which system console log data should be
+    #                 written.  Note that this path is taken to be a location
+    #                 on the machine where this program is running rather than
+    #                 on the Open BMC system.
+    # return_data     If this is set to ${1}, this keyword will return any SOL
+    #                 data to the caller as a unicode string.
+
+    ${log_file_path}=  Create OS Console File Path  ${log_file_path}
+
+    ${log_output}=  Stop SOL Console Logging  ${log_file_path}
+    ...  return_data=${return_data}
+
+    # Validate by making sure we can create the file.  Problems creating the
+    # file would not be noticed by the subsequent ssh command because we fork
+    # the command.
+    Create File  ${log_file_path}
+    ${sub_cmd_buf}=  Create OS Console Command String
+    # Routing stderr to stdout so that any startup error text will go to the
+    # output file.
+    # TODO: Doesn't work with tox so reverting temporarily.
+    # nohup detaches the process completely from our pty.
+    #${cmd_buf}=  Catenate  nohup ${sub_cmd_buf} &> ${log_file_path} &
+    ${cmd_buf}=  Catenate  ${sub_cmd_buf} > ${log_file_path} 2>&1 &
+    Rdpissuing  ${cmd_buf}
+    ${rc}  ${output}=  Run And Return Rc And Output  ${cmd_buf}
+    # Because we are forking this command, we essentially will never get a
+    # non-zero return code or any output.
+    Should Be Equal  ${rc}  ${0}
+
+    Wait Until Keyword Succeeds  10 seconds  0 seconds
+    ...   Get SOL Console Pid  ${1}
+
+    [Return]  ${log_output}
+
+
+Get Time Stamp
+    [Documentation]     Get the current time stamp data
+    ${cur_time}=    Get Current Date   result_format=%Y%m%d%H%M%S%f
+    [Return]   ${cur_time}
+
+
+Start Journal Log
+    [Documentation]   Start capturing journal log to a file in /tmp using
+    ...               journalctl command. By default journal log is collected
+    ...               at /tmp/journal_log else user input location.
+    ...               The File is appended with datetime.
+    [Arguments]       ${file_path}=/tmp/journal_log  ${filter}=${EMPTY}
+
+    # Description of arguments:
+    # file_path   The file path of the journal file.
+
+    ${cur_time}=    Get Time Stamp
+    Set Global Variable   ${LOG_TIME}   ${cur_time}
+    Open Connection And Log In
+    Start Command
+    ...  journalctl -f ${filter} > ${file_path}-${LOG_TIME}
+    Log    Journal Log Started: ${file_path}-${LOG_TIME}
+
+
+Stop Journal Log
+    [Documentation]   Stop journalctl process if its running.
+    ...               By default return log from /tmp/journal_log else
+    ...               user input location.
+    [Arguments]       ${file_path}=/tmp/journal_log
+
+    # Description of arguments:
+    # file_path   The file path of the journal file.
+
+    Open Connection And Log In
+
+    ${rc}=
+    ...  Execute Command
+    ...  ps | grep journalctl | grep -v grep
+    ...  return_stdout=False  return_rc=True
+
+    Return From Keyword If   '${rc}' == '${1}'
+    ...   No journal log process running
+
+    ${output}  ${stderr}=
+    ...  Execute Command   killall journalctl
+    ...  return_stderr=True
+    Should Be Empty     ${stderr}
+
+    ${journal_log}  ${stderr}=
+    ...  Execute Command
+    ...  cat ${file_path}-${LOG_TIME}
+    ...  return_stderr=True
+    Should Be Empty     ${stderr}
+
+    Log    ${journal_log}
+
+    Execute Command    rm ${file_path}-${LOG_TIME}
+
+    [Return]    ${journal_log}
+
+
+Mac Address To Hex String
+    [Documentation]   Converts MAC address into hex format.
+    ...               Example
+    ...               Given the following MAC: 00:01:6C:80:02:78
+    ...               This keyword will return: 0x00 0x01 0x6C 0x80 0x02 0x78
+    ...               Description of arguments:
+    ...               i_macaddress  MAC address in the following format
+    ...               00:01:6C:80:02:78
+    [Arguments]    ${i_macaddress}
+
+    # Description of arguments:
+    # i_macaddress   The MAC address.
+
+    ${mac_hex}=  Catenate  0x${i_macaddress.replace(':', ' 0x')}
+    [Return]    ${mac_hex}
+
+
+IP Address To Hex String
+    [Documentation]   Converts IP address into hex format.
+    ...               Example:
+    ...               Given the following IP: 10.3.164.100
+    ...               This keyword will return: 0xa 0x3 0xa4 0xa0
+    [Arguments]    ${i_ipaddress}
+
+    # Description of arguments:
+    # i_macaddress   The IP address in the format 10.10.10.10.
+
+    @{ip}=  Split String  ${i_ipaddress}    .
+    ${index}=  Set Variable  ${0}
+
+    :FOR    ${item}     IN      @{ip}
+    \   ${hex}=  Convert To Hex    ${item}    prefix=0x    lowercase=yes
+    \   Set List Value    ${ip}    ${index}    ${hex}
+    \   ${index}=  Set Variable    ${index + 1}
+    ${ip_hex}=  Catenate    @{ip}
+
+    [Return]    ${ip_hex}
+
+
+BMC CPU Performance Check
+   [Documentation]   Minimal 10% of proc should be free in this instance
+
+    ${bmc_cpu_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  ${bmc_cpu_usage_cmd}
+    ${bmc_cpu_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  ${bmc_cpu_usage_cmd}
+    ${bmc_cpu_percentage}=  Fetch From Left  ${bmc_cpu_usage_output}  %
+    Should be true  ${bmc_cpu_percentage} < 90
+
+
+BMC Mem Performance Check
+    [Documentation]   Minimal 10% of memory should be free in this instance
+
+    ${bmc_mem_free_output}  ${stderr}  ${rc}=   BMC Execute Command
+    ...  ${bmc_mem_free_cmd}
+
+    ${bmc_mem_total_output}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  ${bmc_mem_total_cmd}
+    ${bmc_mem_free_output}  ${stderr}  ${rc}=   BMC Execute Command
+    ...  ${bmc_mem_free_cmd}
+
+    ${bmc_mem_total_output}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  ${bmc_mem_total_cmd}
+
+    ${bmc_mem_percentage}=  Evaluate  ${bmc_mem_free_output}*100
+    ${bmc_mem_percentage}=  Evaluate
+    ...   ${bmc_mem_percentage}/${bmc_mem_total_output}
+    Should be true  ${bmc_mem_percentage} > 10
+
+
+BMC File System Usage Check
+    [Documentation]   Check the file system space. 4 file system should be
+    ...  100% full which is expected
+    # Filesystem            Size    Used Available Use% Mounted on
+    # /dev/root            14.4M     14.4M       0 100% /
+    # /dev/ubiblock0_0     14.4M     14.4M       0 100% /media/rofs-c9249b0e
+    # /dev/ubiblock8_0     19.6M     19.6M       0 100% /media/pnor-ro-8764baa3
+    # /dev/ubiblock4_0     14.4M     14.4M       0 100% /media/rofs-407816c
+    # /dev/ubiblock8_4     21.1M     21.1M       0 100% /media/pnor-ro-cecc64c4
+    ${bmc_fs_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  ${bmc_file_system_usage_cmd}
+    ${bmc_pnor_fs_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  ${total_pnor_ro_file_system_cmd}
+    ${bmc_bmc_fs_usage_output}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  ${total_bmc_ro_file_system_cmd}
+    ${total_bmc_pnor_image}=  Evaluate
+    ...  ${bmc_pnor_fs_usage_output}+${bmc_bmc_fs_usage_output}
+    # Considering /dev/root also in total 100% used file system
+    ${total_full_fs}=  Evaluate  ${total_bmc_pnor_image}+1
+    Should Be True  ${bmc_fs_usage_output}==${total_full_fs}
+
+
+Check BMC CPU Performance
+    [Documentation]   Minimal 10% of proc should be free in 3 sample
+    :FOR  ${var}  IN Range  1  4
+    \     BMC CPU Performance check
+
+
+Check BMC Mem Performance
+    [Documentation]   Minimal 10% of memory should be free
+
+    :FOR  ${var}  IN Range  1  4
+    \     BMC Mem Performance check
+
+
+Check BMC File System Performance
+    [Documentation]  Check for file system usage for 4 times
+
+    :FOR  ${var}  IN Range  1  4
+    \     BMC File System Usage check
+
+
+Get URL List
+    [Documentation]  Return list of URLs under given URL.
+    [Arguments]  ${openbmc_url}
+
+    # Description of argument(s):
+    # openbmc_url  URL for list operation (e.g.
+    #              /xyz/openbmc_project/inventory).
+
+    ${url_list}=  Read Properties  ${openbmc_url}/list  quiet=${1}
+    Sort List  ${url_list}
+
+    [Return]  ${url_list}
+
+
+Check Zombie Process
+    [Documentation]    Check if any defunct process exist or not on BMC
+    ${count}  ${stderr}  ${rc}=  Execute Command  ps -o stat | grep Z | wc -l
+    ...    return_stderr=True  return_rc=True
+    Should Be True    ${count}==0
+    Should Be Empty    ${stderr}
+
+
+Prune Journal Log
+    [Documentation]   Prune archived journal logs.
+    [Arguments]   ${vacuum_size}=1M
+
+    # This keyword can be used to prevent the journal
+    # log from filling up the /run filesystem.
+    # This command will retain only the latest logs
+    # of the user specified size.
+
+    # Description of argument(s):
+    # vacuum_size    Size of journal.
+
+    Open Connection And Log In
+    ${output}  ${stderr}  ${rc}=
+    ...  Execute Command
+    ...  journalctl --vacuum-size=${vacuum_size}
+    ...  return_stderr=True  return_rc=True
+
+    Should Be Equal  ${rc}  ${0}  msg=${stderr}
+
+
+Get System Power Policy
+    [Documentation]  Returns the BMC power policy.
+
+    # Set the bmc_power_policy_method to either 'Old' or 'New'.
+    Set Power Policy Method
+    ${cmd_buf}=  Create List  ${bmc_power_policy_method} Get Power Policy
+    # Run the appropriate keyword.
+    ${currentPolicy}=  Run Keyword  @{cmd_buf}
+
+    [Return]  ${currentPolicy}
+
+
+Set BMC Reset Reference Time
+    [Documentation]  Set current boot time as a reference and increment
+    ...              boot count.
+
+    ${cur_btime}=  Get BMC Boot Time
+    Run Keyword If  ${BOOT_TIME} == ${0} and ${BOOT_COUNT} == ${0}
+    ...  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
+    ...  ELSE IF  ${cur_btime} > ${BOOT_TIME}
+    ...  Run Keywords  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
+    ...  AND
+    ...  Set Global Variable  ${BOOT_COUNT}  ${BOOT_COUNT + 1}
+
+
+Get BMC Boot Time
+    [Documentation]  Returns boot time from /proc/stat.
+
+    Open Connection And Log In
+    ${output}  ${stderr}=
+    ...  Execute Command  egrep '^btime ' /proc/stat | cut -f 2 -d ' '
+    ...  return_stderr=True
+    Should Be Empty  ${stderr}
+    ${btime}=  Convert To Integer  ${output}
+    [Return]  ${btime}
+
+
+Enable Core Dump On BMC
+    [Documentation]  Enable core dump collection.
+    ${core_pattern}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  echo '/tmp/core_%e.%p' | tee /proc/sys/kernel/core_pattern
+    Should Be Equal As Strings  ${core_pattern}  /tmp/core_%e.%p
+
+
+Get Number Of BMC Core Dump Files
+    [Documentation]  Returns number of core dump files on BMC.
+    Open Connection And Log In
+    ${num_of_core_dump}=  Execute Command
+    ...  ls /tmp/core* 2>/dev/null | wc -l
+    [Return]  ${num_of_core_dump}
+
+
+Set Core Dump File Size Unlimited
+    [Documentation]  Set core dump file size to unlimited.
+    BMC Execute Command  ulimit -c unlimited
+
+
+Check For Core Dumps
+    [Documentation]  Check for any core dumps exist.
+    ${output}=  Get Number Of BMC Core Dump Files
+    Run Keyword If  ${output} > 0
+    ...  Log  **Warning** BMC core dump files exist  level=WARN
+
+
+Configure Initial Settings
+    [Documentation]  Restore old IP and route.
+    ...  This keyword requires initial settings viz IP address,
+    ...  Network Mask, default gatway and serial console IP and port
+    ...  information which should be provided in command line.
+
+    [Arguments]  ${host}=${OPENBMC_HOST}  ${mask}=${NET_MASK}
+    ...          ${gw_ip}=${GW_IP}
+
+    # Description of arguments:
+    # host  IP address of the OS Host.
+    # mask  Network mask.
+    # gu_ip  Gateway IP address or hostname.
+
+    # Open telnet connection and ignore the error, in case telnet session is
+    # already opened by the program calling this keyword.
+    Run Keyword And Ignore Error  Open Telnet Connection to BMC Serial Console
+    Telnet.write  ifconfig eth0 ${host} netmask ${mask}
+    Telnet.write  route add default gw ${gw_ip}
+
+
+Install Debug Tarball On BMC
+    [Documentation]  Copy the debug tar file to BMC and install.
+    [Arguments]  ${tarball_file_path}=${default_tarball}
+    ...  ${targ_tarball_dir_path}=/tmp/tarball/
+
+    # Description of arguments:
+    # tarball_file_path      Path of the debug tarball file.
+    #                        The tar file is downloaded from the build page
+    #                        https://openpower.xyz/job/openbmc-build/
+    #                        obmc-phosphor-debug-tarball-witherspoon.tar.xz
+    #
+    # targ_tarball_dir_path  The directory path where the tarball is to be
+    #                        installed.
+
+    OperatingSystem.File Should Exist  ${tarball_file_path}
+    ...  msg=${tarball_file_path} doesn't exist.
+
+    # Upload the file to BMC.
+    Import Library  SCPLibrary  WITH NAME  scp
+    Open Connection for SCP
+    scp.Put File  ${tarball_file_path}  /tmp/debug-tarball.tar.xz
+
+    # Create tarball directory and install.
+    BMC Execute Command  mkdir -p ${targ_tarball_dir_path}
+    BMC Execute Command
+    ...  tar -xf /tmp/debug-tarball.tar.xz -C ${targ_tarball_dir_path}
+
+    # Remove the tarball file from BMC.
+    BMC Execute Command  rm -f /tmp/debug-tarball.tar.xz
+
+
+Get BMC Boot Count
+    [Documentation]  Returns BMC boot count based on boot time.
+    ${cur_btime}=  Get BMC Boot Time
+
+    # Set global variable BOOT_TIME to current boot time if current boot time
+    # is changed. Also increase value of global variable BOOT_COUNT by 1.
+    Run Keyword If  ${cur_btime} > ${BOOT_TIME}
+    ...  Run Keywords  Set Global Variable  ${BOOT_TIME}  ${cur_btime}
+    ...  AND
+    ...  Set Global Variable  ${BOOT_COUNT}  ${BOOT_COUNT + 1}
+
+    [Return]  ${BOOT_COUNT}
+
+
+Set BMC Boot Count
+    [Documentation]  Set BMC boot count to given value.
+    [Arguments]  ${count}
+
+    # Description of arguments:
+    # count  boot count value.
+    ${cur_btime}=  Get BMC Boot Time
+
+    # Set global variable BOOT_COUNT to given value.
+    Set Global Variable  ${BOOT_COUNT}  ${count}
+
+    # Set BOOT_TIME variable to current boot time.
+    Set Global Variable  ${BOOT_COUNT}  ${count}
+
+
+Delete Error Log Entry
+    [Documentation]  Delete error log entry.
+    [Arguments]  ${entry_path}
+
+    # Description of argument(s):
+    # entry_path  Delete an error log entry.
+    #             Ex. /xyz/openbmc_project/logging/entry/1
+
+    # Skip delete if entry URI is a callout.
+    # Examples:
+    # /xyz/openbmc_project/logging/entry/1/callout
+    # /xyz/openbmc_project/logging/entry/1/callouts/0
+    ${callout_entry}=  Run Keyword And Return Status
+    ...  Should Match Regexp  ${entry_path}  /callout[s]?(/|$)
+    Return From Keyword If  ${callout_entry}
+
+    ${data}=  Create Dictionary  data=@{EMPTY}
+    ${resp}=  Openbmc Delete Request  ${entry_path}  data=${data}
+    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
+
+
+Get BMC Version
+    [Documentation]  Returns BMC version from /etc/os-release.
+    ...              e.g. "v1.99.6-141-ge662190"
+
+    ${cmd}=  Set Variable  grep ^VERSION_ID= /etc/os-release | cut -f 2 -d '='
+    ${output}  ${stderr}  ${rc}=  BMC Execute Command  ${cmd}
+    [Return]  ${output}
+
+
+Get PNOR Version
+    [Documentation]  Returns the PNOR version from the BMC.
+
+    ${pnor_attrs}=  Get PNOR Attributes
+    [Return]  ${pnor_attrs['version']}
+
+
+Get PNOR Attributes
+    [Documentation]  Return PNOR software attributes as a dictionary.
+
+    # This keyword parses /var/lib/phosphor-software-manager/pnor/ro/pnor.toc
+    # into key/value pairs.
+
+    ${outbuf}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  cat /var/lib/phosphor-software-manager/pnor/ro/pnor.toc
+    ${pnor_attrs}=  Key Value Outbuf To Dict  ${outbuf}  delim==
+
+    [Return]  ${pnor_attrs}
+
+
+Copy Address Translation Utils To HOST OS
+    [Documentation]  Copy address translation utils to host OS.
+
+    OperatingSystem.File Should Exist  ${probe_cpu_tool_path}
+    ...  msg=${probe_cpu_tool_path} doesn't exist.
+    OperatingSystem.File Should Exist  ${probe_cpu_tool_path}
+    ...  msg=${probe_cpu_tool_path} doesn't exist.
+
+    scp.Open connection  ${OS_HOST}  username=${OS_USERNAME}
+    ...  password=${OS_PASSWORD}
+    scp.Put File  ${probe_cpu_tool_path}  ${target_file_path}
+    scp.Put File  ${scom_addrs_tool_path}  ${target_file_path}
+
+
+Verify BMC RTC And UTC Time Drift
+    [Documentation]  Verify that the RTC and UTC time difference is less than
+    ...              the given time_drift_max.
+    [Arguments]  ${time_diff_max}=${10}
+
+    # Description of argument(s):
+    # time_diff_max   The max allowable RTC and UTC time difference in seconds.
+
+    # Example:
+    # time_dict:
+    #   [local_time]:               Fri 2017-11-03 152756 UTC
+    #   [local_time_seconds]:       1509740876
+    #   [universal_time]:           Fri 2017-11-03 152756 UTC
+    #   [universal_time_seconds]:   1509740876
+    #   [rtc_time]:                 Fri 2016-05-20 163403
+    #   [rtc_time_seconds]:         1463780043
+    #   [time_zone]:                n/a (UTC, +0000)
+    #   [network_time_on]:          yes
+    #   [ntp_synchronized]:         no
+    #   [rtc_in_local_tz]:          no
+
+    ${time}=  Get BMC Date Time
+    ${time_diff}=  Evaluate
+    ...  ${time['universal_time_seconds']} - ${time['rtc_time_seconds']}
+    Should Be True  ${time_diff} < ${time_diff_max}
+
+
+Validate IP On BMC
+    [Documentation]  Validate IP address is present in set of IP addresses.
+    [Arguments]  ${ip_address}  ${ip_data}
+
+    # Description of argument(s):
+    # ip_address  IP address to check (e.g. xx.xx.xx.xx).
+    # ip_data     Set of the IP addresses present.
+
+    Should Contain Match  ${ip_data}  ${ip_address}/*
+    ...  msg=${ip_address} not found in the list provided.
+
+
+Remove Journald Logs
+    [Documentation]  Remove all journald logs and restart service.
+
+    ${cmd}=  Catenate  systemctl stop systemd-journald.service &&
+    ...  rm -rf /var/log/journal && systemctl start systemd-journald.service
+
+    BMC Execute Command  ${cmd}
+
+
+Check For Regex In Journald
+    [Documentation]  Parse the journal log and check for regex string.
+    [Arguments]  ${regex}=${ERROR_REGEX}  ${error_check}=${0}  ${boot}=${EMPTY}
+
+    # Description of argument(s):
+    # regex            Strings to be filter.
+    # error_check      Check for errors.
+    # boot             Argument to check current or persistent full boot log
+    #                  (e.g. "-b").
+
+    ${journal_log}  ${stderr}  ${rc}=  BMC Execute Command
+    ...  journalctl --no-pager ${boot} | egrep '${regex}'  ignore_err=1
+
+    Run Keyword If  ${error_check} == ${0}
+    ...    Should Be Empty  ${journal_log}
+    ...  ELSE
+    ...    Should Not Be Empty  ${journal_log}
+
+
+Get Service Attribute
+    [Documentation]  Get service attribute policy output.
+    [Arguments]  ${option}  ${servicename}
+
+    # Description of argument(s):
+    # option       systemctl supported options
+    # servicename  Qualified service name
+    ${cmd}=  Set Variable
+    ...  systemctl -p ${option} show ${servicename} | cut -d = -f2
+    ${attr}  ${stderr}  ${rc}=  BMC Execute Command  ${cmd}
+    [Return]  ${attr}