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