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    [Return]    ${ret}
74
75OpenBMC Post Request
76    [Arguments]    ${uri}    ${timeout}=10  ${quiet}=${QUIET}  &{kwargs}
77
78    Initialize OpenBMC    ${timeout}  quiet=${quiet}
79    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
80    ${headers}=     Create Dictionary   Content-Type=application/json
81    set to dictionary   ${kwargs}       headers     ${headers}
82    Run Keyword If  '${quiet}' == '${0}'  Log Request  method=Post
83    ...  base_uri=${base_uri}  args=&{kwargs}
84    ${ret}=  Post Request  openbmc  ${base_uri}  &{kwargs}  timeout=${timeout}
85    Run Keyword If  '${quiet}' == '${0}'  Log Response  ${ret}
86    [Return]    ${ret}
87
88OpenBMC Put Request
89    [Arguments]    ${uri}    ${timeout}=10    &{kwargs}
90
91    Initialize OpenBMC    ${timeout}
92    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
93    ${headers}=     Create Dictionary   Content-Type=application/json
94    set to dictionary   ${kwargs}       headers     ${headers}
95    Log Request    method=Put    base_uri=${base_uri}    args=&{kwargs}
96    ${ret}=  Put Request  openbmc  ${base_uri}  &{kwargs}  timeout=${timeout}
97    Log Response    ${ret}
98    [Return]    ${ret}
99
100OpenBMC Delete Request
101    [Arguments]    ${uri}    ${timeout}=10    &{kwargs}
102
103    Initialize OpenBMC    ${timeout}
104    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
105    Log Request    method=Delete    base_uri=${base_uri}    args=&{kwargs}
106    ${ret}=  Put Request  openbmc  ${base_uri}  &{kwargs}  timeout=${timeout}
107    Log Response    ${ret}
108    [Return]    ${ret}
109
110Initialize OpenBMC
111    [Arguments]    ${timeout}=20  ${quiet}=${1}
112
113    Create Session  openbmc  ${AUTH_URI}  timeout=${timeout}   max_retries=3
114    ${headers}=  Create Dictionary  Content-Type=application/json
115    @{credentials}=  Create List  ${OPENBMC_USERNAME}  ${OPENBMC_PASSWORD}
116    ${data}=  create dictionary   data=@{credentials}
117
118    ${status}  ${resp}=  Run Keyword And Ignore Error  Post Request  openbmc
119    ...  /login  data=${data}  headers=${headers}
120
121    Should Be Equal  ${status}  PASS  msg=${resp}
122    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
123
124Log Out OpenBMC
125    [Documentation]  Log out REST connection with active session "openbmc".
126
127    ${headers}=  Create Dictionary  Content-Type=application/json
128    ${data}=  Create dictionary  data=@{EMPTY}
129
130    # If there is no active sesion it will throw the following exception
131    # "Non-existing index or alias 'openbmc'"
132    ${resp}=  Post Request  openbmc
133    ...  /logout  data=${data}  headers=${headers}
134
135    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
136    ...  msg=${resp}
137
138Log Request
139    [Arguments]    &{kwargs}
140    ${msg}=  Catenate  SEPARATOR=  URI:  ${AUTH_URI}  ${kwargs["base_uri"]}
141    ...  , method:  ${kwargs["method"]}  , args:  ${kwargs["args"]}
142    Logging    ${msg}    console=True
143
144Log Response
145    [Arguments]    ${resp}
146    ${msg}=  Catenate  SEPARATOR=  Response code:  ${resp.status_code}
147    ...  , Content:  ${resp.content}
148    Logging    ${msg}    console=True
149
150Logging
151    [Arguments]    ${msg}    ${console}=default False
152    Log    ${msg}    console=True
153
154Read Attribute
155    [Arguments]    ${uri}    ${attr}    ${timeout}=10  ${quiet}=${QUIET}
156    ${resp}=  OpenBMC Get Request  ${uri}/attr/${attr}  timeout=${timeout}
157    ...  quiet=${quiet}
158    Should Be Equal As Strings  ${resp.status_code}  ${HTTP_OK}
159    ${content}=     To Json    ${resp.content}
160    [Return]    ${content["data"]}
161
162Write Attribute
163    [Arguments]    ${uri}      ${attr}    ${timeout}=10    &{kwargs}
164    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
165    ${resp}=  openbmc put request  ${base_uri}/attr/${attr}
166    ...  timeout=${timeout}  &{kwargs}
167    should be equal as strings      ${resp.status_code}     ${HTTP_OK}
168    ${json}=   to json         ${resp.content}
169
170Read Properties
171    [Arguments]    ${uri}    ${timeout}=10
172    ${resp}=   OpenBMC Get Request    ${uri}    timeout=${timeout}
173    Should Be Equal As Strings    ${resp.status_code}    ${HTTP_OK}
174    ${content}=     To Json    ${resp.content}
175    [Return]    ${content["data"]}
176
177Call Method
178    [Arguments]  ${uri}  ${method}  ${timeout}=10  ${quiet}=${QUIET}  &{kwargs}
179
180    ${base_uri}=    Catenate    SEPARATOR=    ${DBUS_PREFIX}    ${uri}
181    ${resp}=  OpenBmc Post Request  ${base_uri}/action/${method}
182    ...  timeout=${timeout}  quiet=${quiet}  &{kwargs}
183    [Return]     ${resp}
184