1*** Settings ***
2Library           Collections
3Library           String
4Library           RequestsLibrary.RequestsKeywords
5Library           OperatingSystem
6Resource          ../lib/resource.txt
7Library           ../lib/disable_warning_urllib.py
8
9*** Variables ***
10# Response codes
11${HTTP_CONTINUE}    100
12${HTTP_SWITCHING_PROTOCOLS}    101
13${HTTP_PROCESSING}    102
14${HTTP_OK}        200
15${HTTP_CREATED}    201
16${HTTP_ACCEPTED}    202
17${HTTP_NON_AUTHORITATIVE_INFORMATION}    203
18${HTTP_NO_CONTENT}    204
19${HTTP_RESET_CONTENT}    205
20${HTTP_PARTIAL_CONTENT}    206
21${HTTP_MULTI_STATUS}    207
22${HTTP_IM_USED}    226
23${HTTP_MULTIPLE_CHOICES}    300
24${HTTP_MOVED_PERMANENTLY}    301
25${HTTP_FOUND}     302
26${HTTP_SEE_OTHER}    303
27${HTTP_NOT_MODIFIED}    304
28${HTTP_USE_PROXY}    305
29${HTTP_TEMPORARY_REDIRECT}    307
30${HTTP_BAD_REQUEST}    400
31${HTTP_UNAUTHORIZED}    401
32${HTTP_PAYMENT_REQUIRED}    402
33${HTTP_FORBIDDEN}    403
34${HTTP_NOT_FOUND}    404
35${HTTP_METHOD_NOT_ALLOWED}    405
36${HTTP_NOT_ACCEPTABLE}    406
37${HTTP_PROXY_AUTHENTICATION_REQUIRED}    407
38${HTTP_REQUEST_TIMEOUT}    408
39${HTTP_CONFLICT}    409
40${HTTP_GONE}      410
41${HTTP_LENGTH_REQUIRED}    411
42${HTTP_PRECONDITION_FAILED}    412
43${HTTP_REQUEST_ENTITY_TOO_LARGE}    413
44${HTTP_REQUEST_URI_TOO_LONG}    414
45${HTTP_UNSUPPORTED_MEDIA_TYPE}    415
46${HTTP_REQUESTED_RANGE_NOT_SATISFIABLE}    416
47${HTTP_EXPECTATION_FAILED}    417
48${HTTP_UNPROCESSABLE_ENTITY}    422
49${HTTP_LOCKED}    423
50${HTTP_FAILED_DEPENDENCY}    424
51${HTTP_UPGRADE_REQUIRED}    426
52${HTTP_INTERNAL_SERVER_ERROR}    500
53${HTTP_NOT_IMPLEMENTED}    501
54${HTTP_BAD_GATEWAY}    502
55${HTTP_SERVICE_UNAVAILABLE}    503
56${HTTP_GATEWAY_TIMEOUT}    504
57${HTTP_HTTP_VERSION_NOT_SUPPORTED}    505
58${HTTP_INSUFFICIENT_STORAGE}    507
59${HTTP_NOT_EXTENDED}    510
60# Assign default value to QUIET for programs which may not define it.
61${QUIET}  ${0}
62
63*** Keywords ***
64OpenBMC Get Request
65    [Arguments]    ${uri}    ${timeout}=10  ${quiet}=${QUIET}  &{kwargs}
66
67    Initialize OpenBMC    ${timeout}  quiet=${quiet}
68    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
69    Run Keyword If  '${quiet}' == '${0}'  Log Request  method=Get
70    ...  base_uri=${base_uri}  args=&{kwargs}
71    ${ret}=  Get Request  openbmc  ${base_uri}  &{kwargs}  timeout=${timeout}
72    Run Keyword If  '${quiet}' == '${0}'  Log Response  ${ret}
73    Delete All Sessions
74    [Return]    ${ret}
75
76OpenBMC Post Request
77    [Arguments]    ${uri}    ${timeout}=10  ${quiet}=${QUIET}  &{kwargs}
78
79    Initialize OpenBMC    ${timeout}  quiet=${quiet}
80    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
81    ${headers}=     Create Dictionary   Content-Type=application/json
82    set to dictionary   ${kwargs}       headers     ${headers}
83    Run Keyword If  '${quiet}' == '${0}'  Log Request  method=Post
84    ...  base_uri=${base_uri}  args=&{kwargs}
85    ${ret}=  Post Request  openbmc  ${base_uri}  &{kwargs}  timeout=${timeout}
86    Run Keyword If  '${quiet}' == '${0}'  Log Response  ${ret}
87    Delete All Sessions
88    [Return]    ${ret}
89
90OpenBMC Put Request
91    [Arguments]    ${uri}    ${timeout}=10    &{kwargs}
92
93    Initialize OpenBMC    ${timeout}
94    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
95    ${headers}=     Create Dictionary   Content-Type=application/json
96    set to dictionary   ${kwargs}       headers     ${headers}
97    Log Request    method=Put    base_uri=${base_uri}    args=&{kwargs}
98    ${ret}=  Put Request  openbmc  ${base_uri}  &{kwargs}  timeout=${timeout}
99    Log Response    ${ret}
100    Delete All Sessions
101    [Return]    ${ret}
102
103OpenBMC Delete Request
104    [Arguments]    ${uri}    ${timeout}=10    &{kwargs}
105
106    Initialize OpenBMC    ${timeout}
107    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
108    Log Request    method=Delete    base_uri=${base_uri}    args=&{kwargs}
109    ${ret}=  Delete Request  openbmc  ${base_uri}  &{kwargs}  timeout=${timeout}
110    Log Response    ${ret}
111    Delete All Sessions
112    [Return]    ${ret}
113
114Initialize OpenBMC
115    [Arguments]  ${timeout}=20  ${quiet}=${1}
116
117    # Description of argument(s):
118    # timeout  REST login attempt time out.
119    # quiet    Suppress console log if set.
120
121    # TODO : Task to revert this changes openbmc/openbmc-test-automation#532
122    # This will retry at 20 second interval.
123    Wait Until Keyword Succeeds  40 sec  20 sec
124    ...  Post Login Request  ${timeout}  ${quiet}
125
126Post Login Request
127    [Arguments]  ${timeout}=20  ${quiet}=${1}
128
129    # Description of argument(s):
130    # timeout  REST login attempt time out.
131    # quiet    Suppress console log if set.
132
133    Create Session  openbmc  ${AUTH_URI}  timeout=${timeout}  max_retries=3
134    ${headers}=  Create Dictionary  Content-Type=application/json
135    @{credentials}=  Create List  ${OPENBMC_USERNAME}  ${OPENBMC_PASSWORD}
136    ${data}=  create dictionary   data=@{credentials}
137    ${status}  ${resp}=  Run Keyword And Ignore Error  Post Request  openbmc
138    ...  /login  data=${data}  headers=${headers}
139
140    Should Be Equal  ${status}  PASS  msg=${resp}
141    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
142
143Log Out OpenBMC
144    [Documentation]  Log out REST connection with active session "openbmc".
145
146    ${headers}=  Create Dictionary  Content-Type=application/json
147    ${data}=  Create dictionary  data=@{EMPTY}
148
149    # If there is no active sesion it will throw the following exception
150    # "Non-existing index or alias 'openbmc'"
151    ${resp}=  Post Request  openbmc
152    ...  /logout  data=${data}  headers=${headers}
153
154    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
155    ...  msg=${resp}
156
157Log Request
158    [Arguments]    &{kwargs}
159    ${msg}=  Catenate  SEPARATOR=  URI:  ${AUTH_URI}  ${kwargs["base_uri"]}
160    ...  , method:  ${kwargs["method"]}  , args:  ${kwargs["args"]}
161    Logging    ${msg}    console=True
162
163Log Response
164    [Arguments]    ${resp}
165    ${msg}=  Catenate  SEPARATOR=  Response code:  ${resp.status_code}
166    ...  , Content:  ${resp.content}
167    Logging    ${msg}    console=True
168
169Logging
170    [Arguments]    ${msg}    ${console}=default False
171    Log    ${msg}    console=True
172
173Read Attribute
174    [Arguments]    ${uri}    ${attr}    ${timeout}=10  ${quiet}=${QUIET}
175    ${resp}=  OpenBMC Get Request  ${uri}/attr/${attr}  timeout=${timeout}
176    ...  quiet=${quiet}
177    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
178    ${content}=     To Json    ${resp.content}
179    [Return]    ${content["data"]}
180
181
182Write Attribute
183    [Documentation]  Write a D-Bus attribute with REST.
184    [Arguments]  ${uri}  ${attr}  ${timeout}=10  ${verify}=${FALSE}
185    ...  ${expected_value}=${EMPTY}  &{kwargs}
186
187    # Description of argument(s):
188    # uri               URI of the object that the attribute lives on
189    #                   (e.g. '/xyz/openbmc_project/software/').
190    # attr              Name of the attribute (e.g. 'FieldModeEnabled').
191    # timeout           Timeout for the REST call.
192    # verify            If set to ${TRUE}, the attribute will be read back to
193    #                   ensure that its value is set to ${verify_attr}.
194    # expected_value    Only used if verify is set to ${TRUE}. The value that
195    #                   ${attr} should be set to. This defaults to
196    #                   ${kwargs['data']. There are cases where the caller
197    #                   expects some other value in which case this value can
198    #                   be explicitly specified.
199    # kwargs            Arguments passed to the REST call. This should always
200    #                   contain the value to set the property to at the 'data'
201    #                   key (e.g. data={"data": 1}).
202
203    ${base_uri}=  Catenate  SEPARATOR=  ${DBUS_PREFIX}  ${uri}
204    ${resp}=  Openbmc Put Request  ${base_uri}/attr/${attr}
205    ...  timeout=${timeout}  &{kwargs}
206    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
207
208    # Verify the attribute was set correctly if the caller requested it.
209    Return From Keyword If  ${verify} == ${FALSE}
210
211    ${expected_value}=  Set Variable If  '${expected_value}' == '${EMPTY}'
212    ...  ${kwargs['data']['data']}  ${expected_value}
213    ${value}=  Read Attribute  ${uri}  ${attr}
214    Should Be Equal  ${value}  ${expected_value}
215
216
217Read Properties
218    [Arguments]  ${uri}  ${timeout}=10  ${quiet}=${QUIET}
219    ${resp}=  OpenBMC Get Request  ${uri}  timeout=${timeout}  quiet=${quiet}
220    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
221    ${content}=  To Json  ${resp.content}
222    [Return]  ${content["data"]}
223
224Call Method
225    [Arguments]  ${uri}  ${method}  ${timeout}=10  ${quiet}=${QUIET}  &{kwargs}
226
227    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
228    ${resp}=  OpenBmc Post Request  ${base_uri}/action/${method}
229    ...  timeout=${timeout}  quiet=${quiet}  &{kwargs}
230    [Return]     ${resp}
231
232Upload Image To BMC
233    [Arguments]  ${uri}  ${timeout}=10  ${quiet}=${1}  &{kwargs}
234
235    # Description of argument(s):
236    # uri             URI for uploading image via REST e.g. "/upload/image".
237    # timeout         Time allocated for the REST command to return status
238    #                 (specified in Robot Framework Time Format e.g. "3 mins").
239    # quiet           If enabled turns off logging to console.
240    # kwargs          A dictionary keys/values to be passed directly to
241    #                 Post Request.
242
243    Initialize OpenBMC  ${timeout}  quiet=${quiet}
244    ${base_uri}=  Catenate  SEPARATOR=  ${DBUS_PREFIX}  ${uri}
245    ${headers}=  Create Dictionary  Content-Type=application/octet-stream
246    ...  Accept=application/octet-stream
247    Set To Dictionary  ${kwargs}  headers  ${headers}
248    Run Keyword If  '${quiet}' == '${0}'  Log Request  method=Post
249    ...  base_uri=${base_uri}  args=&{kwargs}
250    ${ret}=  Post Request  openbmc  ${base_uri}  &{kwargs}  timeout=${timeout}
251    Run Keyword If  '${quiet}' == '${0}'  Log Response  ${ret}
252    Should Be Equal As Strings  ${ret.status_code}  ${HTTP_OK}
253    Delete All Sessions
254