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