1*** Settings ***
2Documentation   BMC and host redfish utility keywords.
3
4Resource        resource.robot
5Resource        bmc_redfish_resource.robot
6
7
8*** Keywords ***
9
10Redfish Power Operation
11    [Documentation]  Do Redfish host power operation.
12    [Arguments]      ${reset_type}
13
14    # Description of arguments:
15    # reset_type     Type of power operation.
16    #                (e.g. On/ForceOff/GracefulRestart/GracefulShutdown)
17
18    # Example:
19    # "Actions": {
20    # "#ComputerSystem.Reset": {
21    #  "ResetType@Redfish.AllowableValues": [
22    #    "On",
23    #    "ForceOff",
24    #    "ForceOn",
25    #    "ForceRestart",
26    #    "GracefulRestart",
27    #    "GracefulShutdown"
28    #    "PowerCycle",
29    #    "Nmi"
30    #  ],
31    #  "target": "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"
32    #  }
33    # }
34
35    ${target}=  redfish_utils.Get Target Actions  /redfish/v1/Systems/system/  ComputerSystem.Reset
36    ${payload}=  Create Dictionary  ResetType=${reset_type}
37    ${resp}=  Redfish.Post  ${target}  body=&{payload}
38
39
40Redfish BMC Reset Operation
41    [Documentation]  Do Redfish BMC reset operation.
42    [Arguments]  ${reset_type}=GracefulRestart
43
44    # Example:
45    # "Actions": {
46    # "#Manager.Reset": {
47    #  "ResetType@Redfish.AllowableValues": [
48    #    "GracefulRestart",
49    #    "ForceRestart"
50    #  ],
51    #  "target": "/redfish/v1/Managers/bmc/Actions/Manager.Reset"
52    # }
53
54    ${target}=  redfish_utils.Get Target Actions  /redfish/v1/Managers/bmc/  Manager.Reset
55    ${payload}=  Create Dictionary  ResetType=${reset_type}
56    Redfish.Post  ${target}  body=&{payload}
57
58
59Reset BIOS Via Redfish
60    [Documentation]  Do BIOS reset through Redfish.
61
62    ${target}=  redfish_utils.Get Target Actions  /redfish/v1/Systems/system/Bios/  Bios.ResetBios
63    Redfish.Post  ${target}  valid_status_codes=[${HTTP_OK}]
64
65
66Redfish Delete Session
67    [Documentation]  Redfish delete session.
68    [Arguments]  ${session_info}
69
70    # Description of argument(s):
71    # session_info      Session information are stored in dictionary.
72
73    # ${session_info} = {
74    #     'SessionIDs': 'XXXXXXXXX',
75    #     'ClientID': 'XXXXXX',
76    #     'SessionToken': 'XXXXXXXXX',
77    #     'SessionResp': session response from redfish login
78    # }
79
80    # SessionIDs   : Session IDs
81    # ClientID     : Client ID
82    # SessionToken : Session token
83    # SessionResp  : Response of creating an redfish login session
84
85    Redfish.Delete  /redfish/v1/SessionService/Sessions/${session_info["SessionIDs"]}
86
87
88Redfish Delete List Of Session
89    [Documentation]  Redfish delete session from list of session records, individual session information
90    ...              are stored in dictionary.
91    [Arguments]  ${session_info_list}
92
93    # Description of argument(s):
94    # session_info_list    List contains individual session record are stored in dictionary.
95
96    # ${session_info_list} = [{
97    #     'SessionIDs': 'XXXXXXXXX',
98    #     'ClientID': 'XXXXXX',
99    #     'SessionToken': 'XXXXXXXXX',
100    #     'SessionResp': session response from redfish login
101    # }]
102
103    # SessionIDs   : Session IDs
104    # ClientID     : Client ID
105    # SessionToken : Session token
106    # SessionResp  : Response of creating an redfish login session
107
108    FOR  ${session_record}  IN  @{session_info_list}
109      Redfish.Delete  /redfish/v1/SessionService/Sessions/${session_record["SessionIDs"]}
110    END
111
112
113Delete All Redfish Sessions
114    [Documentation]  Delete all active redfish sessions.
115
116    ${saved_session_info}=  Get Redfish Session Info
117
118    ${resp_list}=  Redfish_Utils.Get Member List
119    ...  /redfish/v1/SessionService/Sessions
120
121    # Remove the current login session from the list.
122    Remove Values From List  ${resp_list}  ${saved_session_info["location"]}
123
124    FOR  ${session}  IN  @{resp_list}
125        Run Keyword And Ignore Error  Redfish.Delete  ${session}
126    END
127
128
129Get Valid FRUs
130    [Documentation]  Return a dictionary containing all of the valid FRU records for the given fru_type.
131    [Arguments]  ${fru_type}
132
133    # NOTE: A valid FRU record will have a "State" key of "Enabled" and a "Health" key of "OK".
134
135    # Description of argument(s):
136    # fru_type  The type of fru (e.g. "Processors", "Memory", etc.).
137
138    ${fru_records}=  Redfish_Utils.Enumerate Request
139    ...  /redfish/v1/Systems/system/${fru_type}  return_json=0
140    ${fru_records}=  Filter Struct  ${fru_records}  [('State', 'Enabled'), ('Health', 'OK')]
141
142    [Return]  ${fru_records}
143
144
145Get Num Valid FRUs
146    [Documentation]  Return the number of valid FRU records for the given fru_type.
147    [Arguments]  ${fru_type}
148
149    # Description of argument(s):
150    # fru_type  The type of fru (e.g. "Processors", "Memory", etc.).
151
152    ${fru_records}=  Get Valid FRUs  ${fru_type}
153    ${num_valid_frus}=  Get length  ${fru_records}
154
155    [Return]  ${num_valid_frus}
156
157
158Verify Valid Records
159    [Documentation]  Verify all records retrieved with the given arguments are valid.
160    [Arguments]  ${record_type}  ${redfish_uri}  ${reading_type}
161
162    # Description of Argument(s):
163    # record_type    The sensor record type (e.g. "PowerSupplies")
164    # redfish_uri    The power supply URI (e.g. /redfish/v1/Chassis/chassis/Power)
165    # reading_type   The power watt readings (e.g. "PowerInputWatts")
166
167    # A valid record will have "State" key "Enabled" and "Health" key "OK".
168    ${records}=  Redfish.Get Attribute  ${redfish_uri}  ${record_type}
169
170    Rprint Vars  records
171
172    # Example output:
173    # records:
174    #   [0]:
175    #     [@odata.id]:                 /redfish/v1/Chassis/chassis/Power#/PowerControl/0
176    #     [@odata.type]:               #Power.v1_0_0.PowerControl
177    #     [MemberId]:                  0
178    #     [Name]:                      Chassis Power Control
179    #     [PowerConsumedWatts]:        264.0
180    #     [PowerLimit]:
181    #       [LimitInWatts]:            None
182    #     [PowerMetrics]:
183    #       [AverageConsumedWatts]:    325
184    #       [IntervalInMin]:           3
185    #       [MaxConsumedWatts]:        538
186    #     [Status]:
187    #       [Health]:                  OK
188    #       [State]:                   Enabled
189
190    ${invalid_records}=  Filter Struct  ${records}
191    ...  [('Health', '^OK$'), ('State', '^Enabled$'), ('${reading_type}', '')]  regex=1  invert=1
192    Valid Length  invalid_records  max_length=0
193
194    [Return]  ${records}
195
196
197Redfish Create User
198    [Documentation]  Redfish create user.
199    [Arguments]   ${user_name}  ${password}  ${role_id}  ${enabled}  ${force}=${False}
200
201    # Description of argument(s):
202    # user_name           The user name to be created.
203    # password            The password to be assigned.
204    # role_id             The role ID of the user to be created.
205    #                     (e.g. "Administrator", "Operator", etc.).
206    # enabled             Indicates whether the username being created.
207    #                     should be enabled (${True}, ${False}).
208    # force               Delete user account and re-create if force is True.
209
210    ${curr_role}=  Run Keyword And Ignore Error  Get User Role  ${user_name}
211    # Ex: ${curr_role} = ('PASS', 'Administrator')
212
213    ${user_exists}=  Run Keyword And Return Status  Should Be Equal As Strings  ${curr_role}[0]  PASS
214
215    # Delete user account when force is True.
216    Run Keyword If  ${force} == ${True}  Redfish.Delete  ${REDFISH_ACCOUNTS_URI}${user_name}
217    ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}]
218
219    # Create specified user when force is True or User does not exist.
220    ${payload}=  Create Dictionary
221    ...  UserName=${user_name}  Password=${password}  RoleId=${role_id}  Enabled=${enabled}
222
223    Run Keyword If  ${force} == ${True} or ${user_exists} == ${False}
224    ...  Redfish.Post  ${REDFISH_ACCOUNTS_URI}  body=&{payload}
225    ...  valid_status_codes=[${HTTP_CREATED}]
226
227
228Get User Role
229    [Documentation]  Get User Role.
230    [Arguments]  ${user_name}
231
232    # Description of argument(s):
233    # user_name    User name to get it's role.
234
235    ${role_config}=  Redfish_Utils.Get Attribute
236    ...  ${REDFISH_ACCOUNTS_URI}${user_name}  RoleId
237
238    [Return]  ${role_config}
239
240
241Create Users With Different Roles
242    [Documentation]  Create users with different roles.
243    [Arguments]  ${users}  ${force}=${False}
244
245    # Description of argument(s):
246    # users    Dictionary of roles and user credentails to be created.
247    #          Ex:  {'Administrator': '[admin_user, TestPwd123]', 'Operator': '[operator_user, TestPwd123]'}
248    # force    Delete given user account if already exists when force is True.
249
250    FOR  ${role}  IN  @{users}
251      Redfish Create User  ${users['${role}'][0]}  ${users['${role}']}[1]  ${role}  ${True}  ${force}
252    END
253
254
255Delete BMC Users Via Redfish
256    [Documentation]  Delete BMC users via redfish.
257    [Arguments]  ${users}
258
259    # Description of argument(s):
260    # users    Dictionary of roles and user credentials to be deleted.
261
262    FOR  ${role}  IN  @{users}
263        Redfish.Delete  /redfish/v1/AccountService/Accounts/${users['${role}'][0]}
264        ...  valid_status_codes=[${HTTP_OK}, ${HTTP_NOT_FOUND}]
265    END
266
267
268Expire And Update New Password Via Redfish
269    [Documentation]  Expire and change password and verify using password.
270    [Arguments]  ${username}  ${password}  ${new_password}
271
272    # Description of argument(s):
273    # username        The username to be used to login to the BMC.
274    # password        The password to be used to login to the BMC.
275    # new_password    The new password to be used to update password.
276
277    # Expire admin password using ssh.
278    Open Connection And Log In  ${username}  ${password}
279    ${output}  ${stderr}  ${rc}=  BMC Execute Command  passwd --expire ${username}
280    Should Contain Any  ${output}  password expiry information changed
281    ...  password changed
282
283    # Verify user password expired using Redfish
284    Verify User Password Expired Using Redfish  ${username}  ${password}
285
286    # Change user password.
287    Redfish.Patch  /redfish/v1/AccountService/Accounts/${username}
288    ...  body={'Password': '${new_password}'}
289    Redfish.Logout
290
291
292Verify User Password Expired Using Redfish
293    [Documentation]  Checking whether user password expired or not using redfish.
294
295    # Description of argument(s):
296    # username        The username to be used to login to the BMC.
297    # password        The password to be used to login to the BMC.
298
299    [Arguments]  ${username}  ${password}  ${expected_result}=${True}
300    Redfish.Login  ${username}  ${password}
301    ${resp}=  Redfish.Get  /redfish/v1/AccountService/Accounts/${username}
302    Should Be Equal  ${resp.dict["PasswordChangeRequired"]}  ${expected_result}
303
304