1b29d2e84SChris Austen*** Settings *** 2b29d2e84SChris AustenDocumentation This module is for IPMI client for copying ipmitool to 3a2dab3c8SSivas SRR... openbmc box and execute ipmitool IPMI standard 4a2dab3c8SSivas SRR... command. IPMI raw command will use dbus-send command 5839a0c27SSandhya SomashekarResource ../lib/resource.robot 64d6c1dabSGeorge KeishingResource ../lib/connection_client.robot 7ae7c2281SPrashanth KattiResource ../lib/utils.robot 8ae7c2281SPrashanth KattiResource ../lib/state_manager.robot 9ae7c2281SPrashanth Katti 10a2dab3c8SSivas SRRLibrary String 1134c79af0SMichael WalshLibrary var_funcs.py 1219621bacSMichael WalshLibrary ipmi_client.py 13a2dab3c8SSivas SRR 14a2dab3c8SSivas SRR*** Variables *** 15d7f11f70SGeorge Keishing${dbusHostIpmicmd1}= dbus-send --system ${OPENBMC_BASE_URI}HostIpmi/1 16d7f11f70SGeorge Keishing${dbusHostIpmiCmdReceivedMsg}= ${OPENBMC_BASE_DBUS}.HostIpmi.ReceivedMessage 17a2dab3c8SSivas SRR${netfnByte}= ${EMPTY} 18a2dab3c8SSivas SRR${cmdByte}= ${EMPTY} 19a2dab3c8SSivas SRR${arrayByte}= array:byte: 20a7913898SMichael Walsh${IPMI_USER_OPTIONS} ${EMPTY} 2175f55dc7SGeorge Keishing${IPMI_INBAND_CMD}= ipmitool -C ${IPMI_CIPHER_LEVEL} -N ${IPMI_TIMEOUT} -p ${IPMI_PORT} 227a212a09SRahul Maheshwari${HOST}= -H 237a212a09SRahul Maheshwari${RAW}= raw 24b29d2e84SChris Austen 25b29d2e84SChris Austen*** Keywords *** 267a212a09SRahul Maheshwari 27b29d2e84SChris AustenRun IPMI Command 283ef2e92cSMichael Walsh [Documentation] Run the raw IPMI command. 293ef2e92cSMichael Walsh [Arguments] ${command} ${fail_on_err}=${1} &{options} 303ef2e92cSMichael Walsh 313ef2e92cSMichael Walsh # Description of argument(s): 323ef2e92cSMichael Walsh # command The IPMI command string to be executed 333ef2e92cSMichael Walsh # (e.g. "power status"). 343ef2e92cSMichael Walsh # fail_on_err Fail if the IPMI command execution fails. 353ef2e92cSMichael Walsh # options Additional ipmitool command options (e.g. 363ef2e92cSMichael Walsh # -C=3, -I=lanplus, etc.). Currently, only 373ef2e92cSMichael Walsh # used for external IPMI commands. 383ef2e92cSMichael Walsh 397a212a09SRahul Maheshwari ${resp}= Run Keyword If '${IPMI_COMMAND}' == 'External' 403ef2e92cSMichael Walsh ... Run External IPMI Raw Command ${command} ${fail_on_err} &{options} 41ae7c2281SPrashanth Katti ... ELSE IF '${IPMI_COMMAND}' == 'Inband' 423ef2e92cSMichael Walsh ... Run Inband IPMI Raw Command ${command} 437a212a09SRahul Maheshwari ... ELSE IF '${IPMI_COMMAND}' == 'Dbus' 443ef2e92cSMichael Walsh ... Run Dbus IPMI RAW Command ${command} 45ae7c2281SPrashanth Katti ... ELSE Fail msg=Invalid IPMI Command type provided: ${IPMI_COMMAND} 46c9ea9368SGunnar Mills [Return] ${resp} 477a212a09SRahul Maheshwari 483ef2e92cSMichael Walsh 497a212a09SRahul MaheshwariRun IPMI Standard Command 50f4a807bfSJoy Onyerikwu [Documentation] Run the standard IPMI command. 51d0e58e73SMichael Walsh [Arguments] ${command} ${fail_on_err}=${1} ${expected_rc}=${0} &{options} 5220f3bf73SRahul Maheshwari 5320f3bf73SRahul Maheshwari # Description of argument(s): 543ef2e92cSMichael Walsh # command The IPMI command string to be executed 553ef2e92cSMichael Walsh # (e.g. "0x06 0x36"). 563ef2e92cSMichael Walsh # fail_on_err Fail if the IPMI command execution fails. 57d0e58e73SMichael Walsh # expected_rc The expected return code from the ipmi 58d0e58e73SMichael Walsh # command (e.g. ${0}, ${1}, etc.). 593ef2e92cSMichael Walsh # options Additional ipmitool command options (e.g. 603ef2e92cSMichael Walsh # -C=3, -I=lanplus, etc.). Currently, only 613ef2e92cSMichael Walsh # used for external IPMI commands. 6220f3bf73SRahul Maheshwari 637a212a09SRahul Maheshwari ${resp}= Run Keyword If '${IPMI_COMMAND}' == 'External' 64d0e58e73SMichael Walsh ... Run External IPMI Standard Command ${command} ${fail_on_err} ${expected_rc} &{options} 65ae7c2281SPrashanth Katti ... ELSE IF '${IPMI_COMMAND}' == 'Inband' 663ef2e92cSMichael Walsh ... Run Inband IPMI Standard Command ${command} ${fail_on_err} 677a212a09SRahul Maheshwari ... ELSE IF '${IPMI_COMMAND}' == 'Dbus' 683ef2e92cSMichael Walsh ... Run Dbus IPMI Standard Command ${command} 69ae7c2281SPrashanth Katti ... ELSE Fail msg=Invalid IPMI Command type provided : ${IPMI_COMMAND} 70c9ea9368SGunnar Mills [Return] ${resp} 717a212a09SRahul Maheshwari 723ef2e92cSMichael Walsh 737a212a09SRahul MaheshwariRun Dbus IPMI RAW Command 74f4a807bfSJoy Onyerikwu [Documentation] Run the raw IPMI command through dbus. 753ef2e92cSMichael Walsh [Arguments] ${command} 763ef2e92cSMichael Walsh ${valueinBytes}= Byte Conversion ${command} 77a2dab3c8SSivas SRR ${cmd}= Catenate ${dbushostipmicmd1} ${dbusHostIpmiCmdReceivedMsg} 78a2dab3c8SSivas SRR ${cmd}= Catenate ${cmd} ${valueinBytes} 79a2dab3c8SSivas SRR ${output} ${stderr}= Execute Command ${cmd} return_stderr=True 80b29d2e84SChris Austen Should Be Empty ${stderr} 81b29d2e84SChris Austen set test variable ${OUTPUT} "${output}" 82b29d2e84SChris Austen 833ef2e92cSMichael Walsh 847a212a09SRahul MaheshwariRun Dbus IPMI Standard Command 85f4a807bfSJoy Onyerikwu [Documentation] Run the standard IPMI command through dbus. 863ef2e92cSMichael Walsh [Arguments] ${command} 874d6c1dabSGeorge Keishing Copy ipmitool 887a212a09SRahul Maheshwari ${stdout} ${stderr} ${output}= Execute Command 893ef2e92cSMichael Walsh ... /tmp/ipmitool -I dbus ${command} return_stdout=True 907a212a09SRahul Maheshwari ... return_stderr= True return_rc=True 91b29d2e84SChris Austen Should Be Equal ${output} ${0} msg=${stderr} 92c9ea9368SGunnar Mills [Return] ${stdout} 93b29d2e84SChris Austen 943ef2e92cSMichael Walsh 95ae7c2281SPrashanth KattiRun Inband IPMI Raw Command 96f4a807bfSJoy Onyerikwu [Documentation] Run the raw IPMI command in-band. 973ef2e92cSMichael Walsh [Arguments] ${command} ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 98ae7c2281SPrashanth Katti ... ${os_password}=${OS_PASSWORD} 99ae7c2281SPrashanth Katti 1003ef2e92cSMichael Walsh # Description of argument(s): 1013ef2e92cSMichael Walsh # command The IPMI command string to be executed 1023ef2e92cSMichael Walsh # (e.g. "0x06 0x36"). 1033ef2e92cSMichael Walsh # os_host The host name or IP address of the OS Host. 1043ef2e92cSMichael Walsh # os_username The OS host user name. 1053ef2e92cSMichael Walsh # os_password The OS host passwrd. 106ae7c2281SPrashanth Katti 107ae7c2281SPrashanth Katti Login To OS Host ${os_host} ${os_username} ${os_password} 108ae7c2281SPrashanth Katti Check If IPMI Tool Exist 109ae7c2281SPrashanth Katti 1103ef2e92cSMichael Walsh ${ipmi_cmd}= Catenate ${IPMI_INBAND_CMD} ${RAW} ${command} 1113ef2e92cSMichael Walsh Qprint Issuing ${ipmi_cmd} 1123ef2e92cSMichael Walsh ${stdout} ${stderr}= Execute Command ${ipmi_cmd} return_stderr=True 113ae7c2281SPrashanth Katti Should Be Empty ${stderr} msg=${stdout} 114ae7c2281SPrashanth Katti [Return] ${stdout} 115ae7c2281SPrashanth Katti 1163ef2e92cSMichael Walsh 117ae7c2281SPrashanth KattiRun Inband IPMI Standard Command 118f4a807bfSJoy Onyerikwu [Documentation] Run the standard IPMI command in-band. 1193ef2e92cSMichael Walsh [Arguments] ${command} ${fail_on_err}=${1} ${os_host}=${OS_HOST} 12020f3bf73SRahul Maheshwari ... ${os_username}=${OS_USERNAME} ${os_password}=${OS_PASSWORD} 1219e8c0d88SNaman Navin Hegde ... ${login_host}=${1} 122ae7c2281SPrashanth Katti 1233ef2e92cSMichael Walsh # Description of argument(s): 1243ef2e92cSMichael Walsh # command The IPMI command string to be executed 1253ef2e92cSMichael Walsh # (e.g. "power status"). 1263ef2e92cSMichael Walsh # os_host The host name or IP address of the OS Host. 1273ef2e92cSMichael Walsh # os_username The OS host user name. 1283ef2e92cSMichael Walsh # os_password The OS host passwrd. 1299e8c0d88SNaman Navin Hegde # login_host Indicates that this keyword should login to host OS. 130ae7c2281SPrashanth Katti 1319e8c0d88SNaman Navin Hegde Run Keyword If ${login_host} == ${1} 1329e8c0d88SNaman Navin Hegde ... Login To OS Host ${os_host} ${os_username} ${os_password} 133ae7c2281SPrashanth Katti Check If IPMI Tool Exist 134ae7c2281SPrashanth Katti 1353ef2e92cSMichael Walsh ${ipmi_cmd}= Catenate ${IPMI_INBAND_CMD} ${command} 1363ef2e92cSMichael Walsh Qprint Issuing ${ipmi_cmd} 1373ef2e92cSMichael Walsh ${stdout} ${stderr}= Execute Command ${ipmi_cmd} return_stderr=True 13820f3bf73SRahul Maheshwari Return From Keyword If ${fail_on_err} == ${0} ${stderr} 139ae7c2281SPrashanth Katti Should Be Empty ${stderr} msg=${stdout} 140ae7c2281SPrashanth Katti [Return] ${stdout} 141ae7c2281SPrashanth Katti 1427a212a09SRahul Maheshwari 1437a212a09SRahul MaheshwariRun External IPMI Standard Command 1443ef2e92cSMichael Walsh [Documentation] Run the external IPMI standard command. 145d0e58e73SMichael Walsh [Arguments] ${command} ${fail_on_err}=${1} ${expected_rc}=${0} &{options} 14602651f0cSGeorge Keishing 14702651f0cSGeorge Keishing # Description of argument(s): 1483ef2e92cSMichael Walsh # command The IPMI command string to be executed 1493ef2e92cSMichael Walsh # (e.g. "power status"). Note that if 1503ef2e92cSMichael Walsh # ${IPMI_USER_OPTIONS} has a value (e.g. 1513ef2e92cSMichael Walsh # "-vvv"), it will be pre-pended to this 1523ef2e92cSMichael Walsh # command string. 1533ef2e92cSMichael Walsh # fail_on_err Fail if the IPMI command execution fails. 154d0e58e73SMichael Walsh # expected_rc The expected return code from the ipmi 155d0e58e73SMichael Walsh # command (e.g. ${0}, ${1}, etc.). 1563ef2e92cSMichael Walsh # options Additional ipmitool command options (e.g. 1573ef2e92cSMichael Walsh # -C=3, -I=lanplus, etc.). 158a7913898SMichael Walsh 1593ef2e92cSMichael Walsh ${command_string}= Process IPMI User Options ${command} 1603ef2e92cSMichael Walsh ${ipmi_cmd}= Create IPMI Ext Command String ${command_string} &{options} 1613ef2e92cSMichael Walsh Qprint Issuing ${ipmi_cmd} 16204a2204bSRahul Maheshwari ${rc} ${output}= Run And Return RC and Output ${ipmi_cmd} 16302651f0cSGeorge Keishing Return From Keyword If ${fail_on_err} == ${0} ${output} 164d0e58e73SMichael Walsh Should Be Equal ${rc} ${expected_rc} msg=${output} 165c9ea9368SGunnar Mills [Return] ${output} 1667a212a09SRahul Maheshwari 1673ef2e92cSMichael Walsh 1683ef2e92cSMichael WalshRun External IPMI Raw Command 1693ef2e92cSMichael Walsh [Documentation] Run the external IPMI raw command. 1703ef2e92cSMichael Walsh [Arguments] ${command} ${fail_on_err}=${1} &{options} 1713ef2e92cSMichael Walsh 1723ef2e92cSMichael Walsh # This keyword is a wrapper for 'Run External IPMI Standard Command'. See 1733ef2e92cSMichael Walsh # that keyword's prolog for argument details. This keyword will pre-pend 1743ef2e92cSMichael Walsh # the word "raw" plus a space to command prior to calling 'Run External 1753ef2e92cSMichael Walsh # IPMI Standard Command'. 1763ef2e92cSMichael Walsh 1773ef2e92cSMichael Walsh ${output}= Run External IPMI Standard Command 1783ef2e92cSMichael Walsh ... raw ${command} ${fail_on_err} &{options} 1793ef2e92cSMichael Walsh [Return] ${output} 1803ef2e92cSMichael Walsh 1813ef2e92cSMichael Walsh 182ae7c2281SPrashanth KattiCheck If IPMI Tool Exist 183ae7c2281SPrashanth Katti [Documentation] Check if IPMI Tool installed or not. 184ae7c2281SPrashanth Katti ${output}= Execute Command which ipmitool 185ae7c2281SPrashanth Katti Should Not Be Empty ${output} msg=ipmitool not installed. 1867a212a09SRahul Maheshwari 18704a2204bSRahul Maheshwari 18804a2204bSRahul MaheshwariActivate SOL Via IPMI 18904a2204bSRahul Maheshwari [Documentation] Start SOL using IPMI and route output to a file. 19026206721SGeorge Keishing [Arguments] ${file_path}=${IPMI_SOL_LOG_FILE} 1913ef2e92cSMichael Walsh 19204a2204bSRahul Maheshwari # Description of argument(s): 1933ef2e92cSMichael Walsh # file_path The file path on the local machine (vs. 1943ef2e92cSMichael Walsh # OBMC) to collect SOL output. By default 1953ef2e92cSMichael Walsh # SOL output is collected at 19626206721SGeorge Keishing # logs/sol_<BMC_IP> else user input location. 19704a2204bSRahul Maheshwari 1983ef2e92cSMichael Walsh ${ipmi_cmd}= Create IPMI Ext Command String sol activate usesolkeepalive 1993ef2e92cSMichael Walsh Qprint Issuing ${ipmi_cmd} 2002102f6bfSGeorge Keishing Start Process ${ipmi_cmd} shell=True stdout=${file_path} 2014f360843SRahul Maheshwari ... alias=sol_proc 20204a2204bSRahul Maheshwari 20304a2204bSRahul Maheshwari 20404a2204bSRahul MaheshwariDeactivate SOL Via IPMI 20504a2204bSRahul Maheshwari [Documentation] Stop SOL using IPMI and return SOL output. 20626206721SGeorge Keishing [Arguments] ${file_path}=${IPMI_SOL_LOG_FILE} 2073ef2e92cSMichael Walsh 20804a2204bSRahul Maheshwari # Description of argument(s): 2093ef2e92cSMichael Walsh # file_path The file path on the local machine to copy 2103ef2e92cSMichael Walsh # SOL output collected by above "Activate 2113ef2e92cSMichael Walsh # SOL Via IPMI" keyword. By default it 21226206721SGeorge Keishing # copies log from logs/sol_<BMC_IP>. 21304a2204bSRahul Maheshwari 2143ef2e92cSMichael Walsh ${ipmi_cmd}= Create IPMI Ext Command String sol deactivate 2153ef2e92cSMichael Walsh Qprint Issuing ${ipmi_cmd} 21604a2204bSRahul Maheshwari ${rc} ${output}= Run and Return RC and Output ${ipmi_cmd} 2174f360843SRahul Maheshwari Run Keyword If ${rc} > 0 Run Keywords 2187f48a2c6SRahul Maheshwari ... Run Keyword And Ignore Error Terminate Process sol_proc 2197f48a2c6SRahul Maheshwari ... AND Return From Keyword ${output} 22004a2204bSRahul Maheshwari 221aec8b879SGeorge Keishing ${output}= OperatingSystem.Get File ${file_path} encoding_errors=ignore 22204a2204bSRahul Maheshwari 22304a2204bSRahul Maheshwari # Logging SOL output for debug purpose. 22404a2204bSRahul Maheshwari Log ${output} 22504a2204bSRahul Maheshwari 22604a2204bSRahul Maheshwari [Return] ${output} 22704a2204bSRahul Maheshwari 22804a2204bSRahul Maheshwari 229a2dab3c8SSivas SRRByte Conversion 230a2dab3c8SSivas SRR [Documentation] Byte Conversion method receives IPMI RAW commands as 231a2dab3c8SSivas SRR ... argument in string format. 232a2dab3c8SSivas SRR ... Sample argument is as follows 233a2dab3c8SSivas SRR ... "0x04 0x30 9 0x01 0x00 0x35 0x00 0x00 0x00 0x00 0x00 234a2dab3c8SSivas SRR ... 0x00" 235a2dab3c8SSivas SRR ... IPMI RAW command format is as follows 236a2dab3c8SSivas SRR ... <netfn Byte> <cmd Byte> <Data Bytes..> 237a2dab3c8SSivas SRR ... This method converts IPMI command format into 238a2dab3c8SSivas SRR ... dbus command format as follows 239a2dab3c8SSivas SRR ... <byte:seq-id> <byte:netfn> <byte:lun> <byte:cmd> 240a2dab3c8SSivas SRR ... <array:byte:data> 241a2dab3c8SSivas SRR ... Sample dbus Host IPMI Received Message argument 242a2dab3c8SSivas SRR ... byte:0x00 byte:0x04 byte:0x00 byte:0x30 243a2dab3c8SSivas SRR ... array:byte:9,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00 24438032805SGunnar Mills [Arguments] ${args} 245a2dab3c8SSivas SRR ${argLength}= Get Length ${args} 246a2dab3c8SSivas SRR Set Global Variable ${arrayByte} array:byte: 247a2dab3c8SSivas SRR @{listargs}= Split String ${args} 248a2dab3c8SSivas SRR ${index}= Set Variable ${0} 24920ccfc71SMarissa Garza FOR ${word} IN @{listargs} 25020ccfc71SMarissa Garza Run Keyword if ${index} == 0 Set NetFn Byte ${word} 25120ccfc71SMarissa Garza Run Keyword if ${index} == 1 Set Cmd Byte ${word} 25220ccfc71SMarissa Garza Run Keyword if ${index} > 1 Set Array Byte ${word} 25320ccfc71SMarissa Garza ${index}= Set Variable ${index + 1} 25420ccfc71SMarissa Garza END 255a2dab3c8SSivas SRR ${length}= Get Length ${arrayByte} 256a2dab3c8SSivas SRR ${length}= Evaluate ${length} - 1 257a2dab3c8SSivas SRR ${arrayByteLocal}= Get Substring ${arrayByte} 0 ${length} 258a2dab3c8SSivas SRR Set Global Variable ${arrayByte} ${arrayByteLocal} 259a2dab3c8SSivas SRR ${valueinBytesWithArray}= Catenate byte:0x00 ${netfnByte} byte:0x00 260a2dab3c8SSivas SRR ${valueinBytesWithArray}= Catenate ${valueinBytesWithArray} ${cmdByte} 261a2dab3c8SSivas SRR ${valueinBytesWithArray}= Catenate ${valueinBytesWithArray} ${arrayByte} 262a2dab3c8SSivas SRR ${valueinBytesWithoutArray}= Catenate byte:0x00 ${netfnByte} byte:0x00 263a2dab3c8SSivas SRR ${valueinBytesWithoutArray}= Catenate ${valueinBytesWithoutArray} ${cmdByte} 264a2dab3c8SSivas SRR # To Check scenario for smaller IPMI raw commands with only 2 arguments 265a2dab3c8SSivas SRR # instead of usual 12 arguments. 266a2dab3c8SSivas SRR # Sample small IPMI raw command: Run IPMI command 0x06 0x36 267a2dab3c8SSivas SRR # If IPMI raw argument length is only 9 then return value in bytes without 268a2dab3c8SSivas SRR # array population. 269a2dab3c8SSivas SRR # Equivalent dbus-send argument for smaller IPMI raw command: 270a2dab3c8SSivas SRR # byte:0x00 byte:0x06 byte:0x00 byte:0x36 271a2dab3c8SSivas SRR Run Keyword if ${argLength} == 9 Return from Keyword ${valueinBytesWithoutArray} 272c9ea9368SGunnar Mills [Return] ${valueinBytesWithArray} 273a2dab3c8SSivas SRR 274a2dab3c8SSivas SRR 275a2dab3c8SSivas SRRSet NetFn Byte 276f4a807bfSJoy Onyerikwu [Documentation] Set the network function byte. 27738032805SGunnar Mills [Arguments] ${word} 278a2dab3c8SSivas SRR ${netfnByteLocal}= Catenate byte:${word} 279a2dab3c8SSivas SRR Set Global Variable ${netfnByte} ${netfnByteLocal} 280a2dab3c8SSivas SRR 2813ef2e92cSMichael Walsh 282a2dab3c8SSivas SRRSet Cmd Byte 283f4a807bfSJoy Onyerikwu [Documentation] Set the command byte. 28438032805SGunnar Mills [Arguments] ${word} 285a2dab3c8SSivas SRR ${cmdByteLocal}= Catenate byte:${word} 286a2dab3c8SSivas SRR Set Global Variable ${cmdByte} ${cmdByteLocal} 287a2dab3c8SSivas SRR 2883ef2e92cSMichael Walsh 289a2dab3c8SSivas SRRSet Array Byte 290f4a807bfSJoy Onyerikwu [Documentation] Set the array byte. 29138032805SGunnar Mills [Arguments] ${word} 292a2dab3c8SSivas SRR ${arrayByteLocal}= Catenate SEPARATOR= ${arrayByte} ${word} 293a2dab3c8SSivas SRR ${arrayByteLocal}= Catenate SEPARATOR= ${arrayByteLocal} , 294a2dab3c8SSivas SRR Set Global Variable ${arrayByte} ${arrayByteLocal} 295a2dab3c8SSivas SRR 2963ef2e92cSMichael Walsh 297b29d2e84SChris AustenCopy ipmitool 298f4a807bfSJoy Onyerikwu [Documentation] Copy the ipmitool to the BMC. 299f4a807bfSJoy Onyerikwu ${ipmitool_error}= Catenate The ipmitool program could not be found in the tools directory. 300f4a807bfSJoy Onyerikwu ... It is not part of the automation code by default. You must manually copy or link the correct openbmc 301f4a807bfSJoy Onyerikwu ... version of the tool in to the tools directory in order to run this test suite. 302f4a807bfSJoy Onyerikwu 303f4a807bfSJoy Onyerikwu OperatingSystem.File Should Exist tools/ipmitool msg=${ipmitool_error} 304b29d2e84SChris Austen 305b29d2e84SChris Austen Import Library SCPLibrary WITH NAME scp 306b29d2e84SChris Austen scp.Open connection ${OPENBMC_HOST} username=${OPENBMC_USERNAME} password=${OPENBMC_PASSWORD} 307b29d2e84SChris Austen scp.Put File tools/ipmitool /tmp 308b29d2e84SChris Austen SSHLibrary.Open Connection ${OPENBMC_HOST} 309f94de719SGeorge Keishing SSHLibrary.Login ${OPENBMC_USERNAME} ${OPENBMC_PASSWORD} 310b29d2e84SChris Austen Execute Command chmod +x /tmp/ipmitool 3110c34f69cSSridevi Ramesh 3123ef2e92cSMichael Walsh 3130c34f69cSSridevi RameshInitiate Host Boot Via External IPMI 3140c34f69cSSridevi Ramesh [Documentation] Initiate host power on using external IPMI. 315982fee42SRahul Maheshwari [Arguments] ${wait}=${1} 3163ef2e92cSMichael Walsh 317982fee42SRahul Maheshwari # Description of argument(s): 3183ef2e92cSMichael Walsh # wait Indicates that this keyword should wait 3193ef2e92cSMichael Walsh # for host running state. 320982fee42SRahul Maheshwari 3210c34f69cSSridevi Ramesh ${output}= Run External IPMI Standard Command chassis power on 3220c34f69cSSridevi Ramesh Should Not Contain ${output} Error 323982fee42SRahul Maheshwari 324982fee42SRahul Maheshwari Run Keyword If '${wait}' == '${0}' Return From Keyword 325982fee42SRahul Maheshwari Wait Until Keyword Succeeds 10 min 10 sec Is Host Running 3260c34f69cSSridevi Ramesh 3273ef2e92cSMichael Walsh 3280c34f69cSSridevi RameshInitiate Host PowerOff Via External IPMI 3290c34f69cSSridevi Ramesh [Documentation] Initiate host power off using external IPMI. 330982fee42SRahul Maheshwari [Arguments] ${wait}=${1} 3313ef2e92cSMichael Walsh 332982fee42SRahul Maheshwari # Description of argument(s): 3333ef2e92cSMichael Walsh # wait Indicates that this keyword should wait 3343ef2e92cSMichael Walsh # for host off state. 335982fee42SRahul Maheshwari 3360c34f69cSSridevi Ramesh ${output}= Run External IPMI Standard Command chassis power off 3370c34f69cSSridevi Ramesh Should Not Contain ${output} Error 338982fee42SRahul Maheshwari 339982fee42SRahul Maheshwari Run Keyword If '${wait}' == '${0}' Return From Keyword 340982fee42SRahul Maheshwari Wait Until Keyword Succeeds 3 min 10 sec Is Host Off 341982fee42SRahul Maheshwari 3423ef2e92cSMichael Walsh 343460778dcSRahul MaheshwariIs Host Off Via IPMI 344460778dcSRahul Maheshwari [Documentation] Verify if the Host is off using IPMI command. 345460778dcSRahul Maheshwari 346460778dcSRahul Maheshwari ${status}= Run External IPMI Standard Command chassis power status 347460778dcSRahul Maheshwari Should Contain ${status} off 348460778dcSRahul Maheshwari 349460778dcSRahul Maheshwari 350982fee42SRahul MaheshwariGet Host State Via External IPMI 351982fee42SRahul Maheshwari [Documentation] Returns host state using external IPMI. 352982fee42SRahul Maheshwari 353982fee42SRahul Maheshwari ${output}= Run External IPMI Standard Command chassis power status 354982fee42SRahul Maheshwari Should Not Contain ${output} Error 355982fee42SRahul Maheshwari ${output}= Fetch From Right ${output} ${SPACE} 356982fee42SRahul Maheshwari 357982fee42SRahul Maheshwari [Return] ${output} 358b4d4a4aeSGeorge Keishing 359b4d4a4aeSGeorge Keishing 360b4d4a4aeSGeorge KeishingSet BMC Network From Host 361b4d4a4aeSGeorge Keishing [Documentation] Set BMC network from host. 362b4d4a4aeSGeorge Keishing [Arguments] ${nw_info} 363b4d4a4aeSGeorge Keishing 364b4d4a4aeSGeorge Keishing # Description of argument(s): 3653ef2e92cSMichael Walsh # nw_info A dictionary containing the network 3663ef2e92cSMichael Walsh # information to apply. 367b4d4a4aeSGeorge Keishing 368b4d4a4aeSGeorge Keishing Run Inband IPMI Standard Command 369b4d4a4aeSGeorge Keishing ... lan set 1 ipaddr ${nw_info['IP Address']} 370b4d4a4aeSGeorge Keishing 371b4d4a4aeSGeorge Keishing Run Inband IPMI Standard Command 372b4d4a4aeSGeorge Keishing ... lan set 1 netmask ${nw_info['Subnet Mask']} 373b4d4a4aeSGeorge Keishing 374b4d4a4aeSGeorge Keishing Run Inband IPMI Standard Command 375b4d4a4aeSGeorge Keishing ... lan set 1 defgw ipaddr ${nw_info['Default Gateway IP']} 376c3d1e968SRahul Maheshwari 377c3d1e968SRahul Maheshwari 378c3d1e968SRahul MaheshwariVerify IPMI Username And Password 379c3d1e968SRahul Maheshwari [Documentation] Verify that user is able to run IPMI command 380c3d1e968SRahul Maheshwari ... with given username and password. 381c3d1e968SRahul Maheshwari [Arguments] ${username} ${password} 382c3d1e968SRahul Maheshwari 383c3d1e968SRahul Maheshwari # Description of argument(s): 384c3d1e968SRahul Maheshwari # username The user name (e.g. "root", "robert", etc.). 385c3d1e968SRahul Maheshwari # password The user password (e.g. "0penBmc", "0penBmc1", etc.). 386c3d1e968SRahul Maheshwari 387f9379e88STony Lee ${output}= Wait Until Keyword Succeeds 15 sec 5 sec Run External IPMI Standard Command 388c3d1e968SRahul Maheshwari ... sel info U=${username} P=${password} 389c3d1e968SRahul Maheshwari Should Contain ${output} SEL Information msg=SEL information not present 39075e91feaSRahul Maheshwari 39175e91feaSRahul Maheshwari 39275e91feaSRahul MaheshwariIPMI Create User 39375e91feaSRahul Maheshwari [Documentation] Create IPMI user with given userid and username. 39475e91feaSRahul Maheshwari [Arguments] ${userid} ${username} 39575e91feaSRahul Maheshwari 39675e91feaSRahul Maheshwari # Description of argument(s): 39775e91feaSRahul Maheshwari # userid The user ID (e.g. "1", "2", etc.). 39875e91feaSRahul Maheshwari # username The user name (e.g. "root", "robert", etc.). 39975e91feaSRahul Maheshwari 40075e91feaSRahul Maheshwari ${ipmi_cmd}= Catenate user set name ${userid} ${username} 40175e91feaSRahul Maheshwari ${resp}= Run IPMI Standard Command ${ipmi_cmd} 40275e91feaSRahul Maheshwari ${user_info}= Get User Info ${userid} 40375e91feaSRahul Maheshwari Should Be Equal ${user_info['user_name']} ${username} 40475e91feaSRahul Maheshwari 40575e91feaSRahul Maheshwari 40675e91feaSRahul MaheshwariSet Channel Access 40775e91feaSRahul Maheshwari [Documentation] Verify that user is able to run IPMI command 40875e91feaSRahul Maheshwari ... with given username and password. 4097c5f4b28STony Lee [Arguments] ${userid} ${options} ${channel_number}=${CHANNEL_NUMBER} 41075e91feaSRahul Maheshwari 41175e91feaSRahul Maheshwari # Description of argument(s): 41275e91feaSRahul Maheshwari # userid The user ID (e.g. "1", "2", etc.). 41375e91feaSRahul Maheshwari # options Set channel command options (e.g. 41475e91feaSRahul Maheshwari # "link=on", "ipmi=on", etc.). 41575e91feaSRahul Maheshwari # channel_number The user's channel number (e.g. "1"). 41675e91feaSRahul Maheshwari 41775e91feaSRahul Maheshwari ${ipmi_cmd}= Catenate SEPARATOR= 4187c5f4b28STony Lee ... channel setaccess${SPACE}${channel_number}${SPACE}${userid} 41975e91feaSRahul Maheshwari ... ${SPACE}${options} 42075e91feaSRahul Maheshwari Run IPMI Standard Command ${ipmi_cmd} 4213e61ce66SRahul Maheshwari 4223e61ce66SRahul Maheshwari 4233e61ce66SRahul MaheshwariDelete All Non Root IPMI User 4243e61ce66SRahul Maheshwari [Documentation] Delete all non-root IPMI user. 4253e61ce66SRahul Maheshwari 42634c79af0SMichael Walsh # Get complete list of user info records. 42734c79af0SMichael Walsh ${user_info}= Get User Info ${EMPTY} 42834c79af0SMichael Walsh # Remove header record. 42934c79af0SMichael Walsh ${user_info}= Filter Struct ${user_info} [('user_name', None)] invert=1 43034c79af0SMichael Walsh ${non_empty_user_info}= Filter Struct ${user_info} [('user_name', '')] invert=1 43134c79af0SMichael Walsh ${non_root_user_info}= Filter Struct ${non_empty_user_info} [('user_name', 'root')] invert=1 43234c79af0SMichael Walsh 43334c79af0SMichael Walsh FOR ${user_record} IN @{non_root_user_info} 43434c79af0SMichael Walsh Run IPMI Standard Command user set name ${user_record['user_id']} "" 435bb3d21c0SRahul Maheshwari Sleep 5s 4363e61ce66SRahul Maheshwari END 437*0a8c8787Schithrag 438*0a8c8787Schithrag 439*0a8c8787SchithragCreate SEL 440*0a8c8787Schithrag [Documentation] Create a SEL. 441*0a8c8787Schithrag [Arguments] ${sensor_type} ${sensor_number} 442*0a8c8787Schithrag 443*0a8c8787Schithrag # Create a SEL. 444*0a8c8787Schithrag # Example: 445*0a8c8787Schithrag # a | 02/14/2020 | 01:16:58 | Sensor_type #0x17 | | Asserted 446*0a8c8787Schithrag 447*0a8c8787Schithrag # Description of argument(s): 448*0a8c8787Schithrag # ${sensor_type} Type of the sensor used in hexadecimal (can be fan, temp etc.,), 449*0a8c8787Schithrag # obtained from Sensor Type field in - ipmitool sdr get "sensor_name". 450*0a8c8787Schithrag # Example: Sensor Type (Threshold) : Fan (0x04), here 0xHH is sensor type. 451*0a8c8787Schithrag 452*0a8c8787Schithrag # ${sensor_number} Sensor number of the sensor in hexadecimal. 453*0a8c8787Schithrag # obtained from Sensor ID field in - ipmitool sdr get "sensor_name". 454*0a8c8787Schithrag # Example: Sensor ID : SENSOR_1 (0xHH), here 0xHH is sensor number. 455*0a8c8787Schithrag 456*0a8c8787Schithrag ${resp}= Run IPMI Command 457*0a8c8787Schithrag ... ${IPMI_RAW_CMD['SEL_entry']['Create_SEL'][0]} 0x${sensor_type} 0x${sensor_number} ${IPMI_RAW_CMD['SEL_entry']['Create_SEL'][1]} 458*0a8c8787Schithrag 459*0a8c8787Schithrag [Return] ${resp} 460*0a8c8787Schithrag 461*0a8c8787Schithrag 462*0a8c8787SchithragFetch Any Sensor From Sensor List 463*0a8c8787Schithrag [Documentation] Find any sensor name randomly from Sensor list. 464*0a8c8787Schithrag 465*0a8c8787Schithrag ${resp}= Run IPMI Standard Command sensor 466*0a8c8787Schithrag 467*0a8c8787Schithrag # Find total number of sensor. 468*0a8c8787Schithrag ${data}= Split To Lines ${resp} 469*0a8c8787Schithrag ${length}= Get Length ${data} 470*0a8c8787Schithrag 471*0a8c8787Schithrag # Identify any one sensor. 472*0a8c8787Schithrag ${sensor_index}= Evaluate random.randint(1, ${length}) modules=random 473*0a8c8787Schithrag ${sensor_data}= Set Variable ${data[${sensor_index}-1]} 474*0a8c8787Schithrag ${sensor}= Split String ${sensor_data} | 475*0a8c8787Schithrag 476*0a8c8787Schithrag # Retrieve Sensor Name and return. 477*0a8c8787Schithrag ${sensor_name}= Set Variable ${sensor[0]} 478*0a8c8787Schithrag ${sensor_name}= Remove Whitespace ${sensor_name} 479*0a8c8787Schithrag 480*0a8c8787Schithrag [Return] ${sensor_name} 481*0a8c8787Schithrag 482*0a8c8787Schithrag 483*0a8c8787SchithragFetch Sensor Details From SDR 484*0a8c8787Schithrag [Documentation] Identify the sensors from sdr get and fetch sensor details required. 485*0a8c8787Schithrag [Arguments] ${sensor_name} ${setting} 486*0a8c8787Schithrag 487*0a8c8787Schithrag # Description of argument(s): 488*0a8c8787Schithrag # ${sensor_number} Sensor number of the sensor in hexadecimal. 489*0a8c8787Schithrag # obtained sensor name from - 'ipmitool sensor' command. 490*0a8c8787Schithrag # Example: a | 02/14/2020 | 01:16:58 | Sensor_type #0x17 | | Asserted 491*0a8c8787Schithrag # here, a is the sensor name. 492*0a8c8787Schithrag 493*0a8c8787Schithrag # ${setting} Field to fetch data. Example : Sensor ID, Sensor Type (Threshold), etc,. 494*0a8c8787Schithrag 495*0a8c8787Schithrag ${resp}= Run IPMI Standard Command sdr get "${sensor_name}" 496*0a8c8787Schithrag 497*0a8c8787Schithrag ${setting_line}= Get Lines Containing String ${resp} ${setting} 498*0a8c8787Schithrag ... case-insensitive 499*0a8c8787Schithrag ${setting_status}= Fetch From Right ${setting_line} :${SPACE} 500*0a8c8787Schithrag 501*0a8c8787Schithrag [Return] ${setting_status} 502*0a8c8787Schithrag 503*0a8c8787Schithrag 504*0a8c8787SchithragGet Data And Byte From SDR Sensor 505*0a8c8787Schithrag [Documentation] Fetch the Field Data and hexadecimal values from given details. 506*0a8c8787Schithrag [Arguments] ${sensor_detail} 507*0a8c8787Schithrag 508*0a8c8787Schithrag # Description of argument(s): 509*0a8c8787Schithrag # ${sensor_detail} Requested field and the value from the sdr get ipmi command. 510*0a8c8787Schithrag # Example : if Sensor ID is the requesting setting, then, 511*0a8c8787Schithrag # ${sensor_detail} will be "Sensor ID : SENSOR_1 (0xHH)" 512*0a8c8787Schithrag 513*0a8c8787Schithrag ${sensor_detail}= Split String ${sensor_detail} (0x 514*0a8c8787Schithrag ${field_data}= Set Variable ${sensor_detail[0]} 515*0a8c8787Schithrag ${field_data}= Remove Whitespace ${field_data} 516*0a8c8787Schithrag ${sensor_hex}= Replace String ${sensor_detail[1]} ) ${EMPTY} 517*0a8c8787Schithrag ${sensor_hex}= Zfill Data ${sensor_hex} 2 518*0a8c8787Schithrag 519*0a8c8787Schithrag [Return] ${field_data} ${sensor_hex} 520*0a8c8787Schithrag 521*0a8c8787Schithrag 522*0a8c8787SchithragGet Current Date from BMC 523*0a8c8787Schithrag [Documentation] Runs the date command from BMC and returns current date and time 524*0a8c8787Schithrag 525*0a8c8787Schithrag # Get Current Date from BMC 526*0a8c8787Schithrag ${date} ${stderr} ${rc}= BMC Execute Command date 527*0a8c8787Schithrag 528*0a8c8787Schithrag # Split the string and remove first and 2nd last value from the list and join to form %d %b %H:%M:%S %Y date format 529*0a8c8787Schithrag ${date}= Split String ${date} 530*0a8c8787Schithrag Remove From List ${date} 0 531*0a8c8787Schithrag Remove From List ${date} -2 532*0a8c8787Schithrag ${date}= Evaluate " ".join(${date}) 533*0a8c8787Schithrag 534*0a8c8787Schithrag # Convert the date format to %m/%d/%Y %H:%M:%S 535*0a8c8787Schithrag ${date}= Convert Date ${date} date_format=%b %d %H:%M:%S %Y result_format=%m/%d/%Y %H:%M:%S exclude_millis=True 536*0a8c8787Schithrag 537*0a8c8787Schithrag [Return] ${date} 538