1*** Settings *** 2Documentation This module is for IPMI client for copying ipmitool to 3... openbmc box and execute ipmitool IPMI standard 4... command. IPMI raw command will use dbus-send command 5Resource ../lib/resource.txt 6Resource ../lib/connection_client.robot 7Resource ../lib/utils.robot 8Resource ../lib/state_manager.robot 9 10Library String 11 12*** Variables *** 13${dbusHostIpmicmd1}= dbus-send --system ${OPENBMC_BASE_URI}HostIpmi/1 14${dbusHostIpmiCmdReceivedMsg}= ${OPENBMC_BASE_DBUS}.HostIpmi.ReceivedMessage 15${netfnByte}= ${EMPTY} 16${cmdByte}= ${EMPTY} 17${arrayByte}= array:byte: 18${IPMI_EXT_CMD}= ipmitool -I lanplus -C 3 19${IPMI_USER_OPTIONS} ${EMPTY} 20${IPMI_INBAND_CMD}= ipmitool -C 3 21${HOST}= -H 22${RAW}= raw 23 24*** Keywords *** 25 26Run IPMI Command 27 [Arguments] ${args} 28 ${resp}= Run Keyword If '${IPMI_COMMAND}' == 'External' 29 ... Run External IPMI RAW Command ${args} 30 ... ELSE IF '${IPMI_COMMAND}' == 'Inband' 31 ... Run Inband IPMI RAW Command ${args} 32 ... ELSE IF '${IPMI_COMMAND}' == 'Dbus' 33 ... Run Dbus IPMI RAW Command ${args} 34 ... ELSE Fail msg=Invalid IPMI Command type provided : ${IPMI_COMMAND} 35 [Return] ${resp} 36 37Run IPMI Standard Command 38 [Arguments] ${args} 39 ${resp}= Run Keyword If '${IPMI_COMMAND}' == 'External' 40 ... Run External IPMI Standard Command ${args} 41 ... ELSE IF '${IPMI_COMMAND}' == 'Inband' 42 ... Run Inband IPMI Standard Command ${args} 43 ... ELSE IF '${IPMI_COMMAND}' == 'Dbus' 44 ... Run Dbus IPMI Standard Command ${args} 45 ... ELSE Fail msg=Invalid IPMI Command type provided : ${IPMI_COMMAND} 46 47 [Return] ${resp} 48 49Run Dbus IPMI RAW Command 50 [Arguments] ${args} 51 ${valueinBytes}= Byte Conversion ${args} 52 ${cmd}= Catenate ${dbushostipmicmd1} ${dbusHostIpmiCmdReceivedMsg} 53 ${cmd}= Catenate ${cmd} ${valueinBytes} 54 ${output} ${stderr}= Execute Command ${cmd} return_stderr=True 55 Should Be Empty ${stderr} 56 set test variable ${OUTPUT} "${output}" 57 58Run Dbus IPMI Standard Command 59 [Arguments] ${args} 60 Copy ipmitool 61 ${stdout} ${stderr} ${output}= Execute Command 62 ... /tmp/ipmitool -I dbus ${args} return_stdout=True 63 ... return_stderr= True return_rc=True 64 Should Be Equal ${output} ${0} msg=${stderr} 65 [Return] ${stdout} 66 67Run Inband IPMI Raw Command 68 [Documentation] Run Inband IPMI raw command. 69 [Arguments] ${args} ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 70 ... ${os_password}=${OS_PASSWORD} 71 72 # Desription of arguments: 73 # ${args} parameters to IPMI command. 74 # ${os_host} IP address of the OS Host. 75 # ${os_username} OS Host Login user name. 76 # ${os_password} OS Host Login passwrd. 77 78 Login To OS Host ${os_host} ${os_username} ${os_password} 79 Check If IPMI Tool Exist 80 81 ${inband_raw_cmd}= Catenate ${IPMI_INBAND_CMD} ${RAW} ${args} 82 ${stdout} ${stderr}= Execute Command ${inband_raw_cmd} return_stderr=True 83 Should Be Empty ${stderr} msg=${stdout} 84 [Return] ${stdout} 85 86Run Inband IPMI Standard Command 87 [Documentation] Run Inband IPMI standard command. 88 [Arguments] ${args} ${os_host}=${OS_HOST} ${os_username}=${OS_USERNAME} 89 ... ${os_password}=${OS_PASSWORD} 90 91 # Desription of arguments: 92 # ${args} parameters to IPMI command. 93 # ${os_host} IP address of the OS Host. 94 # ${os_username} OS Host Login user name. 95 # ${os_password} OS Host Login passwrd. 96 97 Login To OS Host ${os_host} ${os_username} ${os_password} 98 Check If IPMI Tool Exist 99 100 ${inband_std_cmd}= Catenate ${IPMI_INBAND_CMD} ${args} 101 ${stdout} ${stderr}= Execute Command ${inband_std_cmd} return_stderr=True 102 Should Be Empty ${stderr} msg=${stdout} 103 [Return] ${stdout} 104 105Run External IPMI RAW Command 106 [Arguments] ${args} 107 ${ipmi_raw_cmd}= Catenate SEPARATOR= 108 ... ${IPMI_EXT_CMD} -P${SPACE}${IPMI_PASSWORD}${SPACE} 109 ... ${HOST}${SPACE}${OPENBMC_HOST}${SPACE}${RAW}${SPACE}${args} 110 ${rc} ${output}= Run and Return RC and Output ${ipmi_raw_cmd} 111 Should Be Equal ${rc} ${0} msg=${output} 112 [Return] ${output} 113 114Run External IPMI Standard Command 115 [Arguments] ${args} 116 117 ${ipmi_cmd}= Catenate SEPARATOR= 118 ... ${IPMI_EXT_CMD} ${IPMI_USER_OPTIONS} -P${SPACE}${IPMI_PASSWORD} 119 ... ${SPACE}${HOST}${SPACE}${OPENBMC_HOST}${SPACE}${args} 120 ${rc} ${output}= Run and Return RC and Output ${ipmi_cmd} 121 Should Be Equal ${rc} ${0} msg=${output} 122 [Return] ${output} 123 124Check If IPMI Tool Exist 125 [Documentation] Check if IPMI Tool installed or not. 126 ${output}= Execute Command which ipmitool 127 Should Not Be Empty ${output} msg=ipmitool not installed. 128 129Byte Conversion 130 [Documentation] Byte Conversion method receives IPMI RAW commands as 131 ... argument in string format. 132 ... Sample argument is as follows 133 ... "0x04 0x30 9 0x01 0x00 0x35 0x00 0x00 0x00 0x00 0x00 134 ... 0x00" 135 ... IPMI RAW command format is as follows 136 ... <netfn Byte> <cmd Byte> <Data Bytes..> 137 ... This method converts IPMI command format into 138 ... dbus command format as follows 139 ... <byte:seq-id> <byte:netfn> <byte:lun> <byte:cmd> 140 ... <array:byte:data> 141 ... Sample dbus Host IPMI Received Message argument 142 ... byte:0x00 byte:0x04 byte:0x00 byte:0x30 143 ... array:byte:9,0x01,0x00,0x35,0x00,0x00,0x00,0x00,0x00,0x00 144 [Arguments] ${args} 145 ${argLength}= Get Length ${args} 146 Set Global Variable ${arrayByte} array:byte: 147 @{listargs}= Split String ${args} 148 ${index}= Set Variable ${0} 149 :FOR ${word} in @{listargs} 150 \ Run Keyword if ${index} == 0 Set NetFn Byte ${word} 151 \ Run Keyword if ${index} == 1 Set Cmd Byte ${word} 152 \ Run Keyword if ${index} > 1 Set Array Byte ${word} 153 \ ${index}= Set Variable ${index + 1} 154 ${length}= Get Length ${arrayByte} 155 ${length}= Evaluate ${length} - 1 156 ${arrayByteLocal}= Get Substring ${arrayByte} 0 ${length} 157 Set Global Variable ${arrayByte} ${arrayByteLocal} 158 ${valueinBytesWithArray}= Catenate byte:0x00 ${netfnByte} byte:0x00 159 ${valueinBytesWithArray}= Catenate ${valueinBytesWithArray} ${cmdByte} 160 ${valueinBytesWithArray}= Catenate ${valueinBytesWithArray} ${arrayByte} 161 ${valueinBytesWithoutArray}= Catenate byte:0x00 ${netfnByte} byte:0x00 162 ${valueinBytesWithoutArray}= Catenate ${valueinBytesWithoutArray} ${cmdByte} 163# To Check scenario for smaller IPMI raw commands with only 2 arguments 164# instead of usual 12 arguments. 165# Sample small IPMI raw command: Run IPMI command 0x06 0x36 166# If IPMI raw argument length is only 9 then return value in bytes without 167# array population. 168# Equivalent dbus-send argument for smaller IPMI raw command: 169# byte:0x00 byte:0x06 byte:0x00 byte:0x36 170 Run Keyword if ${argLength} == 9 Return from Keyword ${valueinBytesWithoutArray} 171 [Return] ${valueinBytesWithArray} 172 173 174Set NetFn Byte 175 [Arguments] ${word} 176 ${netfnByteLocal}= Catenate byte:${word} 177 Set Global Variable ${netfnByte} ${netfnByteLocal} 178 179Set Cmd Byte 180 [Arguments] ${word} 181 ${cmdByteLocal}= Catenate byte:${word} 182 Set Global Variable ${cmdByte} ${cmdByteLocal} 183 184Set Array Byte 185 [Arguments] ${word} 186 ${arrayByteLocal}= Catenate SEPARATOR= ${arrayByte} ${word} 187 ${arrayByteLocal}= Catenate SEPARATOR= ${arrayByteLocal} , 188 Set Global Variable ${arrayByte} ${arrayByteLocal} 189 190Copy ipmitool 191 OperatingSystem.File Should Exist tools/ipmitool msg=The ipmitool program could not be found in the tools directory. It is not part of the automation code by default. You must manually copy or link the correct openbmc version of the tool in to the tools directory in order to run this test suite. 192 193 Import Library SCPLibrary WITH NAME scp 194 scp.Open connection ${OPENBMC_HOST} username=${OPENBMC_USERNAME} password=${OPENBMC_PASSWORD} 195 scp.Put File tools/ipmitool /tmp 196 SSHLibrary.Open Connection ${OPENBMC_HOST} 197 Login ${OPENBMC_USERNAME} ${OPENBMC_PASSWORD} 198 Execute Command chmod +x /tmp/ipmitool 199 200Initiate Host Boot Via External IPMI 201 [Documentation] Initiate host power on using external IPMI. 202 ${output}= Run External IPMI Standard Command chassis power on 203 Should Not Contain ${output} Error 204 Wait Until Keyword Succeeds 205 ... 10 min 10 sec Is Host Running 206 207Initiate Host PowerOff Via External IPMI 208 [Documentation] Initiate host power off using external IPMI. 209 ${output}= Run External IPMI Standard Command chassis power off 210 Should Not Contain ${output} Error 211 Wait Until Keyword Succeeds 212 ... 3 min 10 sec Is Host Off 213