1*** Settings ***
2
3Documentation        Test lock management feature of management console on BMC.
4
5Resource             ../../lib/resource.robot
6Resource             ../../lib/openbmc_ffdc.robot
7Resource             ../../lib/bmc_redfish_utils.robot
8Resource             ../../lib/external_intf/management_console_utils.robot
9
10Suite Setup          Run Keyword And Ignore Error  Delete All Redfish Sessions
11Suite Teardown       Redfish.Logout
12Test Setup           Printn
13Test Teardown        FFDC On Test Case Fail
14
15*** Variables ***
16
17${BAD_REQUEST}       Bad Request
18
19*** Test Cases ***
20
21Acquire Read Write Lock
22    [Documentation]  Acquire and release different read locks.
23    [Tags]  Acquire_Read_Write_Lock
24    [Template]  Acquire Lock On Resource
25
26    # client_id    lock_type     reboot_flag
27    HMCID-01       ReadCase1     False
28    HMCID-01       ReadCase2     False
29    HMCID-01       ReadCase3     False
30    HMCID-01       WriteCase1    False
31    HMCID-01       WriteCase2    False
32    HMCID-01       WriteCase3    False
33
34
35Check Lock Persistency On BMC Reboot
36    [Documentation]  Acquire lock and check after reboot it remain same.
37    [Tags]  Check_Lock_Persistency_On_BMC_Reboot
38    [Template]  Acquire Lock On Resource
39
40    # client_id    lock_type     reboot_flag
41    HMCID-01       ReadCase1     True
42    HMCID-01       ReadCase2     True
43    HMCID-01       ReadCase3     True
44    HMCID-01       WriteCase1    True
45    HMCID-01       WriteCase2    True
46    HMCID-01       WriteCase3    True
47
48
49Acquire Read Lock On Read Lock
50    [Documentation]  Acquire read lock on another read lock.
51    [Tags]  Acquire_Read_Lock_On_Read_Lock
52    [Template]  Acquire Lock On Another Lock
53
54    # client_id
55    HMCID-01
56
57
58Get Lock Records Empty For Invalid Session
59    [Documentation]  Record of lock list is empty for invalid session.
60    [Tags]  Get_Lock_Records_Empty_For_Invalid_Session
61    [Template]  Verify Empty Lock Records For Invalid Session
62
63    # client_id
64    HMCID-01
65
66
67Fail To Acquire Lock On Another Lock
68    [Documentation]  Fail to acquire another lock.
69    [Tags]  Fail_To_Acquire_Lock_On_Another_Lock
70    [Template]  Verify Acquire Lock Fails On Another Lock
71
72    # client_id    lock_type
73    HMCID-01       ReadCase2,WriteCase2
74    HMCID-01       WriteCase2,WriteCase2
75    HMCID-01       WriteCase2,ReadCase2
76
77
78Acquire Lock After Reboot
79    [Documentation]  Acquire and release read and write locks after reboot.
80    [Tags]  Acquire_Lock_After_Reboot
81    [Template]  Verify Acquire Lock After Reboot
82
83    # client_id    lock_type
84    HMCID-01       ReadCase1
85    HMCID-01       ReadCase2
86    HMCID-01       ReadCase3
87    HMCID-01       WriteCase1
88    HMCID-01       WriteCase2
89    HMCID-01       WriteCase3
90
91
92Acquire And Release Lock In Loop
93    [Documentation]  Acquire and release read, write locks in loop.
94    [Tags]  Acquire_And_Release_Lock_In_Loop
95    [Template]  Verify Acquire And Release Lock In Loop
96
97    # client_id    lock_type
98    HMCID-01       ReadCase1
99    HMCID-01       ReadCase2
100    HMCID-01       ReadCase3
101    HMCID-01       WriteCase1
102    HMCID-01       WriteCase2
103    HMCID-01       WriteCase3
104
105
106Verify Release Of Valid Locks
107    [Documentation]  Release all valid locks.
108    [Tags]  Verify_Release_Of_Valid_Locks
109    [Template]  Acquire And Release Multiple Locks
110
111    # client_id    lock_type                        release_lock_type
112    HMCID-01       ReadCase1,ReadCase1,ReadCase1    Transaction
113    HMCID-02       ReadCase1,ReadCase1,ReadCase1    Session
114
115
116Invalid Locks Fail To Release
117    [Documentation]  Release in-valid lock result in fail.
118    [Tags]  Invalid_Locks_Fail_To_Release
119    [Template]  Verify Invalid Locks Fail To Release
120
121    # client_id    lock_type                        release_lock_type
122    HMCID-01       ReadCase1,ReadCase1,ReadCase1    Transaction
123    12345          ReadCase2,ReadCase2,ReadCase2    Transaction
124    HMCID          ReadCase3,ReadCase3,ReadCase3    Transaction
125
126
127Fail To Release Lock For Another Session
128    [Documentation]  Failed to release locks from another session.
129    [Tags]  Fail_To_Release_Lock_For_Another_Session
130    [Template]  Verify Fail To Release Lock For Another Session
131
132    # client_id          lock_type
133    HMCID-01,HMCID-02    ReadCase1,ReadCase1
134
135
136Test Invalid Resource ID Data Type Locking
137    [Documentation]  Failed to acquire lock for invalid resource id data type.
138    [Tags]  Test_Invalid_Resource_ID_Data_Type_Locking
139    [Template]  Verify Fail To Acquire Lock For Invalid Resource ID Data Type
140
141    # client_id    lock_type
142    HMCID-01       ReadCase1
143    HMCID-01       ReadCase2
144    HMCID-01       ReadCase3
145    HMCID-01       WriteCase1
146    HMCID-01       WriteCase2
147    HMCID-01       WriteCase3
148
149
150Fail To Acquire Lock For Invalid Lock Type
151    [Documentation]  Failed to acquire read, write lock for invalid lock data passed.
152    [Tags]  Fail_To_Acquire_Lock_For_Invalid_Lock_Type
153    [Template]  Verify Fail To Acquire Lock For Invalid Lock Data
154
155    # client_id    lock_type      message
156    HMCID-01       ReadCase1      ${BAD_REQUEST}
157    HMCID-01       ReadCase2      ${BAD_REQUEST}
158    HMCID-01       ReadCase3      ${BAD_REQUEST}
159    HMCID-01       ReadCase4      ${BAD_REQUEST}
160    HMCID-01       ReadCase5      ${BAD_REQUEST}
161    HMCID-01       WriteCase1     ${BAD_REQUEST}
162    HMCID-01       WriteCase2     ${BAD_REQUEST}
163    HMCID-01       WriteCase3     ${BAD_REQUEST}
164    HMCID-01       WriteCase4     ${BAD_REQUEST}
165    HMCID-01       WriteCase5     ${BAD_REQUEST}
166
167
168Fail To Acquire Lock For Invalid Lock Flag
169    [Documentation]  Failed to acquire read write lock for invalid lock flag passed.
170    [Tags]  Fail_To_Acquire_Lock_For_Invalid_Lock_Flag
171    [Template]  Verify Fail To Acquire Lock For Invalid Lock Data
172
173    # client_id    lock_type       message
174    HMCID-01       ReadCase6       ${BAD_REQUEST}
175    HMCID-01       ReadCase7       ${BAD_REQUEST}
176    HMCID-01       ReadCase8       ${BAD_REQUEST}
177    HMCID-01       ReadCase9       ${BAD_REQUEST}
178    HMCID-01       ReadCase10      ${BAD_REQUEST}
179    HMCID-01       ReadCase11      ${BAD_REQUEST}
180    HMCID-01       WriteCase6      ${BAD_REQUEST}
181    HMCID-01       WriteCase7      ${BAD_REQUEST}
182    HMCID-01       WriteCase8      ${BAD_REQUEST}
183    HMCID-01       WriteCase9      ${BAD_REQUEST}
184    HMCID-01       WriteCase10     ${BAD_REQUEST}
185    HMCID-01       WriteCase11     ${BAD_REQUEST}
186
187
188Fail To Acquire Lock For Invalid Segment Flag
189    [Documentation]  Failed to acquire read write lock for invalid segment flag passed.
190    [Tags]  Fail_To_Acquire_Lock_For_Invalid_Segment_Flag
191    [Template]  Verify Fail To Acquire Lock For Invalid Lock Data
192
193    # client_id    lock_type       message
194    HMCID-01       ReadCase12      ${BAD_REQUEST}
195    HMCID-01       ReadCase13      ${BAD_REQUEST}
196    HMCID-01       ReadCase14      ${BAD_REQUEST}
197    HMCID-01       WriteCase12     ${BAD_REQUEST}
198    HMCID-01       WriteCase13     ${BAD_REQUEST}
199    HMCID-01       WriteCase14     ${BAD_REQUEST}
200
201*** Keywords ***
202
203Create Redfish Session With ClientID
204    [Documentation]  Create redifish session with client id.
205    [Arguments]  ${client_id}
206
207    # Description of argument(s):
208    # client_id    This client id can contain string value
209    #              (e.g. 12345, "HMCID").
210
211    ${session_info}=  Create Dictionary
212    ${session}=  Redfish Login  kwargs= "Oem":{"OpenBMC" : {"ClientID":"${client_id}"}}
213
214    Set To Dictionary  ${session_info}  SessionIDs  ${session['Id']}
215    Set To Dictionary  ${session_info}  ClientID  ${session["Oem"]["OpenBMC"]["ClientID"]}
216
217    [Return]  ${session_info}
218
219
220RW General Dictionary
221    [Documentation]  Create dictionay of lock request.
222    [Arguments]  ${read_case}  ${res_id}
223
224    # Description of argument(s):
225    # read_case    Read or Write lock type.
226    # res_id       Resource id.
227
228    ${request_dict}=  Create Dictionary
229
230    FOR  ${key}  IN  @{read_case.keys()}
231      Set To Dictionary  ${request_dict}  LockType  ${key}
232      Set To Dictionary  ${request_dict}  SegmentFlags  ${read_case["${key}"]}
233    END
234
235    Set To Dictionary  ${request_dict}  ResourceID  ${res_id}
236
237    [Return]  ${request_dict}
238
239
240Return Description Of Response
241    [Documentation]  Return description of REST response.
242    [Arguments]  ${resp_text}
243
244    # Description of argument(s):
245    # resp_text    REST response body.
246
247    # resp_text after successful partition file upload looks like:
248    # {
249    #    "Description": "File Created"
250    # }
251
252    ${message}=  Evaluate  json.loads('''${resp_text}''')  json
253
254    [Return]  ${message}
255
256
257Redfish Post Acquire Lock
258    [Documentation]  Acquire and release lock.
259    [Arguments]  ${lock_type}  ${status_code}=${HTTP_OK}
260
261    # Description of argument(s):
262    # lock_type      Read lock or Write lock.
263    # status_code    HTTP status code.
264
265    ${lock_dict_param}=  Form Data To Acquire Lock  ${lock_type}
266    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.AcquireLock  data=${lock_dict_param}
267    Should Be Equal As Strings  ${resp.status_code}  ${status_code}
268    ${resp}=  Return Description Of Response  ${resp.content}
269
270    [Return]  ${resp}
271
272
273Redfish Post Acquire Invalid Lock
274    [Documentation]  Redfish to post request to acquire in-valid lock.
275    [Arguments]  ${lock_type}  ${message}  ${status_code}=${HTTP_OK}
276
277    # Description of argument(s):
278    # lock_type      Read lock or Write lock.
279    # message        Return message from URI.
280    # status_code    HTTP status code.
281
282    ${lock_dict_param}=  Form Data To Acquire Invalid Lock  ${lock_type}
283    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.AcquireLock  data=${lock_dict_param}
284    Should Be Equal As Strings  ${resp.status_code}  ${status_code}
285    Valid Value  message  ['${resp.content}']
286
287    [Return]  ${resp}
288
289
290Redfish Post Acquire Invalid Lock With Invalid Data Type Of Resource ID
291    [Documentation]  Redfish to post request to acquire in-valid lock with invalid data type of resource id.
292    [Arguments]  ${lock_type}  ${status_code}=${HTTP_OK}
293
294    # Description of argument(s):
295    # lock_type      Read lock or Write lock.
296    # status_code    HTTP status code.
297
298    ${lock_dict_param}=  Form Data To Acquire Invalid Lock With Invalid Data Type Of Resource ID  ${lock_type}
299    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.AcquireLock  data=${lock_dict_param}
300    Should Be Equal As Strings  ${resp.status_code}  ${status_code}
301
302    [Return]  ${resp}
303
304
305Form Data To Acquire Lock
306    [Documentation]  Create a dictionay for lock request.
307    [Arguments]  ${lock_type}
308
309    # Description of argument(s):
310    # lock_type      Read lock or Write lock.
311
312    ${lock_res_info}=  Get Lock Resource Information
313    ${resp}=  RW General Dictionary
314    ...    ${lock_res_info["Valid Case"]["${lock_type}"]}
315    ...    ${lock_res_info["Valid Case"]["ResourceID"]}
316    ${temp_list}=  Create List  ${resp}
317    ${lock_request_dict}=  Create Dictionary  Request=${temp_list}
318
319    [Return]  ${lock_request_dict}
320
321
322Form Data To Acquire Invalid Lock With Invalid Data Type Of Resource ID
323    [Documentation]  Create a dictionay for in-valid lock request.
324    [Arguments]  ${lock_type}
325
326    # Description of argument(s):
327    # lock_type      Read lock or Write lock.
328
329    ${lock_res_info}=  Get Lock Resource Information
330    ${resp}=  RW General Dictionary
331    ...    ${lock_res_info["Valid Case"]["${lock_type}"]}
332    ...    ${lock_res_info["Invalid Case"]["ResourceIDInvalidDataType"]}
333    ${temp_list}=  Create List  ${resp}
334    ${lock_request_dict}=  Create Dictionary  Request=${temp_list}
335
336    [Return]  ${lock_request_dict}
337
338
339Form Data To Acquire Invalid Lock
340    [Documentation]  Create a dictionay for in-valid lock request.
341    [Arguments]  ${lock_type}
342
343    # Description of argument(s):
344    # lock_type      Read lock or Write lock.
345
346    ${lock_res_info}=  Get Lock Resource Information
347    ${resp}=  RW General Dictionary
348    ...    ${lock_res_info["Invalid Case"]["${lock_type}"]}
349    ...    ${lock_res_info["Valid Case"]["ResourceID"]}
350    ${temp_list}=  Create List  ${resp}
351    ${lock_request_dict}=  Create Dictionary  Request=${temp_list}
352
353    [Return]  ${lock_request_dict}
354
355
356Get Locks List On Resource
357    [Documentation]  Get locks list.
358    [Arguments]  ${session_info}  ${exp_status_code}=${HTTP_OK}
359
360    # Description of argument(s):
361    # session_info       Session information in dict.
362    # exp_status_code    Expected HTTP status code.
363
364    ${data}=  Set Variable  {"SessionIDs": ["${session_info['SessionIDs']}"]}
365    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.GetLockList
366    ...  data=${data}
367    ${locks}=  Evaluate  json.loads('''${resp.text}''')  json
368
369    [Return]  ${locks["Records"]}
370
371
372Verify Lock On Resource
373    [Documentation]  Verify lock on resource.
374    [Arguments]  ${session_info}  ${transaction_id}
375
376    # Description of argument(s):
377    # session_info      Session information in dict.
378    # transaction_id    Transaction id in list stored in dict.
379
380    ${sessions}=  Redfish.Get Properties  /redfish/v1/SessionService/Sessions/${session_info['SessionIDs']}
381    Rprint Vars  sessions
382    ${lock_list}=  Get Locks List On Resource  ${session_info}
383    ${lock_length}=  Get Length  ${lock_list}
384    ${tran_id_length}=  Get Length  ${transaction_id}
385    Should Be Equal As Integers  ${tran_id_length}  ${lock_length}
386
387    FOR  ${tran_id}  ${lock}  IN ZIP  ${transaction_id}  ${lock_list}
388      Valid Value  session_info['ClientID']  ['${lock['HMCID']}']
389      Valid Value  session_info['SessionIDs']  ['${lock['SessionID']}']
390      Should Be Equal As Integers  ${tran_id['TransactionID']}  ${lock['TransactionID']}
391    END
392
393
394Redfish Delete Session
395    [Documentation]  Redfish delete session.
396    [Arguments]  ${session_info}
397
398    # Description of argument(s):
399    # session_info      Session information in dict.
400
401    Redfish.Delete  /redfish/v1/SessionService/Sessions/${session_info["SessionIDs"]}
402
403
404Acquire Lock On Resource
405    [Documentation]  Acquire lock on resource.
406    [Arguments]  ${client_id}  ${lock_type}  ${reboot_flag}=False
407
408    # Description of argument(s):
409    # client_id    This client id can contain string value
410    #              (e.g. 12345, "HMCID").
411    # lock_type    Read lock or Write lock.
412    # reboot_flag  Flag is used to run reboot the BMC code.
413    #               (e.g. True or False).
414
415    ${trans_id_list}=  Create List
416    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
417    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type}
418    Append To List  ${trans_id_list}  ${trans_id}
419    Verify Lock On Resource  ${session_info}  ${trans_id_list}
420
421    ${before_reboot_xauth_token}=  Set Variable  ${XAUTH_TOKEN}
422
423    Run Keyword If  '${reboot_flag}' == 'True'
424    ...  Run Keywords  Redfish OBMC Reboot (off)  AND
425    ...  Redfish Login  AND
426    ...  Set Global Variable  ${XAUTH_TOKEN}  ${before_reboot_xauth_token}  AND
427    ...  Verify Lock On Resource  ${session_info}  ${trans_id_list}  AND
428    ...  Release Locks On Resource  ${session_info}  ${trans_id_list}  Transaction  ${HTTP_OK}
429
430    Run Keyword If  '${reboot_flag}' == 'False'
431    ...  Release Locks On Resource  ${session_info}  ${trans_id_list}  Transaction  ${HTTP_OK}
432
433    ${trans_id_emptylist}=  Create List
434    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
435    Redfish Delete Session  ${session_info}
436
437
438Form Data To Release Lock
439    [Documentation]  Create a dictonay to release lock.
440    [Arguments]  ${trans_id_list}
441
442    # Description of argument(s):
443    # trans_id_list
444
445    @{tran_ids}=  Create List
446
447    FOR  ${item}  IN  @{trans_id_list}
448      Append To List  ${tran_ids}  ${item['TransactionID']}
449    END
450
451    [Return]  ${tran_ids}
452
453
454Release Locks On Resource
455    [Documentation]  Redfish request to release a lock.
456    [Arguments]  ${session_info}  ${trans_id_list}  ${release_lock_type}=Transaction  ${status_code}=${HTTP_OK}
457
458    # Description of argument(s):
459    # session_info        Session information in dict.
460    # trans_id_list       Transaction id list.
461    # release_lock_type   Release lock by Transaction, Session.
462    # status_code         HTTP status code.
463
464    ${tran_ids}=  Form Data To Release Lock  ${trans_id_list}
465    ${data}=  Set Variable  {"Type": "${release_lock_type}", "TransactionIDs":${tran_ids}}
466    ${data}=  Evaluate  json.dumps(${data})  json
467    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock  data=${data}
468    Should Be Equal As Strings  ${resp.status_code}  ${status_code}
469
470
471Acquire Lock On Another Lock
472    [Documentation]  Acquire lock on another lock.
473    [Arguments]  ${client_id}
474
475    # Description of argument(s):
476    # client_id    This client id can contain string value
477    #              (e.g. 12345, "HMCID").
478
479    ${trans_id_list}=  Create List
480    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
481
482    ${trans_id}=  Redfish Post Acquire Lock  ReadCase1
483    Append To List  ${trans_id_list}  ${trans_id}
484
485    ${trans_id}=  Redfish Post Acquire Lock  ReadCase1
486    Append To List  ${trans_id_list}  ${trans_id}
487
488    Verify Lock On Resource  ${session_info}  ${trans_id_list}
489    Release Locks On Resource  ${session_info}  ${trans_id_list}
490
491    ${trans_id_emptylist}=  Create List
492    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
493    Redfish Delete Session  ${session_info}
494
495
496Verify Empty Lock Records For Invalid Session
497    [Documentation]  Verify no lock record found for invalid session.
498    [Arguments]  ${client_id}
499
500    # Description of argument(s):
501    # client_id    This client id can contain string value
502    #              (e.g. 12345, "HMCID").
503
504    ${session_info1}=  Create Redfish Session With ClientID  ${client_id}
505
506    ${lock_list1}=  Get Locks List On Resource  ${session_info1}
507    ${lock_length1}=  Get Length  ${lock_list1}
508
509    ${session_info2}=  Copy Dictionary  ${session_info1}  deepcopy=True
510    set to dictionary  ${session_info2}  SessionIDs  xxyXyyYZZz
511
512    ${lock_list2}=  Get Locks List On Resource  ${session_info2}
513    ${lock_length2}=  Get Length  ${lock_list1}
514
515    Valid Value  lock_length1  ${lock_list2}
516
517    Redfish Delete Session  ${session_info1}
518
519
520Verify Acquire Lock Fails On Another Lock
521    [Documentation]  Verify acquire lock on another lock fails.
522    [Arguments]  ${client_id}  ${lock_type}
523
524    # Description of argument(s):
525    # client_id    This client id can contain string value
526    #              (e.g. 12345, "HMCID").
527    # lock_type    Read lock or Write lock.
528
529    @{lock_type_list}=  Split String  ${lock_type}  ,
530    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
531    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
532
533    ${trans_id_list}=  Create List
534    Append To List  ${trans_id_list}  ${trans_id}
535
536    Verify Lock On Resource  ${session_info}  ${trans_id_list}
537    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[1]  status_code=${HTTP_CONFLICT}
538    Release Locks On Resource  ${session_info}  ${trans_id_list}
539
540    ${trans_id_emptylist}=  Create List
541    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
542
543    Redfish Delete Session  ${session_info}
544
545
546Verify Acquire Lock After Reboot
547    [Documentation]  Acquire read and write lock after the reboot and release lock.
548    [Arguments]  ${client_id}  ${lock_type}
549
550    # Description of argument(s):
551    # client_id    This client id can contain string value
552    #              (e.g. 12345, "HMCID").
553    # lock_type    Read lock or Write lock.
554
555    ${trans_id_list}=  Create List
556    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
557    ${before_reboot_xauth_token}=  Set Variable  ${XAUTH_TOKEN}
558    Redfish OBMC Reboot (off)
559    Redfish Login
560    Set Global Variable  ${XAUTH_TOKEN}  ${before_reboot_xauth_token}
561
562    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type}
563    Append To List  ${trans_id_list}  ${trans_id}
564    Verify Lock On Resource  ${session_info}  ${trans_id_list}
565    Release Locks On Resource  ${session_info}  ${trans_id_list}  Transaction  ${HTTP_OK}
566
567    ${trans_id_emptylist}=  Create List
568    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
569    Redfish Delete Session  ${session_info}
570
571
572Verify Acquire And Release Lock In Loop
573    [Documentation]  Acquire lock in loop.
574    [Arguments]  ${client_id}  ${lock_type}
575
576    # Description of argument(s):
577    # client_id    This client id can contain string value
578    #              (e.g. 12345, "HMCID").
579    # lock_type    Read lock or Write lock.
580
581    FOR  ${count}  IN RANGE  1  11
582      ${trans_id_list}=  Create List
583      ${session_info}=  Create Redfish Session With ClientID  ${client_id}
584      ${trans_id}=  Redfish Post Acquire Lock  ${lock_type}
585      Append To List  ${trans_id_list}  ${trans_id}
586      Verify Lock On Resource  ${session_info}  ${trans_id_list}
587      Release Locks On Resource  ${session_info}  ${trans_id_list}  Transaction  ${HTTP_OK}
588      ${trans_id_emptylist}=  Create List
589      Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
590    END
591
592    Redfish Delete Session  ${session_info}
593
594
595Acquire And Release Multiple Locks
596    [Documentation]  Acquire mutilple locks on resource.
597    [Arguments]  ${client_id}  ${lock_type}  ${release_lock_type}
598
599    # Description of argument(s):
600    # client_id          This client id can contain string value
601    #                    (e.g. 12345, "HMCID").
602    # lock_type          Read lock or Write lock.
603    # release_lock_type  The value can be Transaction or Session.
604
605    @{lock_type_list}=  Split String  ${lock_type}  ,
606    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
607    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
608
609    ${trans_id_list}=  Create List
610
611    Append To List  ${trans_id_list}  ${trans_id}
612    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[1]
613
614    Append To List  ${trans_id_list}  ${trans_id}
615    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[2]
616
617    Append To List  ${trans_id_list}  ${trans_id}
618    Verify Lock On Resource  ${session_info}  ${trans_id_list}
619    Release Locks On Resource  ${session_info}  ${trans_id_list}  release_lock_type=${release_lock_type}
620
621    ${trans_id_emptylist}=  Create List
622    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
623    Redfish Delete Session  ${session_info}
624
625
626Verify Invalid Locks Fail To Release
627    [Documentation]  Verify invalid locks fails to be released.
628    [Arguments]  ${client_id}  ${lock_type}  ${release_lock_type}
629
630    # Description of argument(s):
631    # client_id          This client id can contain string value
632    #                    (e.g. 12345, "HMCID").
633    # lock_type          Read lock or Write lock.
634    # release_lock_type  The value can be Transaction or Session.
635
636    ${trans_id_list}=  Create List
637    @{lock_type_list}=  Split String  ${lock_type}  ,
638
639    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
640
641    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
642    ${value}=  Get From Dictionary  ${trans_id}  TransactionID
643    ${value}=  Evaluate  ${value} + 10
644    Set To Dictionary  ${trans_id}  TransactionID  ${value}
645    Append To List  ${trans_id_list}  ${trans_id}
646
647    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[1]
648    ${value}=  Get From Dictionary  ${trans_id}  TransactionID
649    ${value}=  Evaluate  ${value} + 10
650    Set To Dictionary  ${trans_id}  TransactionID  ${value}
651    Append To List  ${trans_id_list}  ${trans_id}
652
653    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[2]
654    ${value}=  Get From Dictionary  ${trans_id}  TransactionID
655    ${value}=  Evaluate  ${value} + 10
656    Set To Dictionary  ${trans_id}  TransactionID  ${value}
657    Append To List  ${trans_id_list}  ${trans_id}
658
659    Release Locks On Resource
660    ...  ${session_info}  ${trans_id_list}
661    ...  release_lock_type=${release_lock_type}  status_code=${HTTP_BAD_REQUEST}
662    Release Locks On Resource  ${session_info}  ${trans_id_list}  release_lock_type=Session
663
664    ${trans_id_emptylist}=  Create List
665    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
666    Redfish Delete Session  ${session_info}
667
668
669Verify Fail To Release Lock For Another Session
670    [Documentation]  Verify failed to release the lock form another session.
671    [Arguments]  ${client_id}  ${lock_type}
672
673    # Description of argument(s):
674    # client_id    This client id can contain string value
675    #              (e.g. 12345, "HMCID").
676    # lock_type    Read lock or Write lock.
677
678    ${client_ids}=  Split String  ${client_id}  ,
679    ${lock_type_list}=  Split String  ${lock_type}  ,
680    ${trans_id_list1}=  Create List
681    ${trans_id_list2}=  Create List
682
683    ${session_info1}=  Create Redfish Session With ClientID  ${client_ids}[0]
684
685    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
686    Append To List  ${trans_id_list1}  ${trans_id}
687    Verify Lock On Resource  ${session_info1}  ${trans_id_list1}
688
689    ${session_info2}=  Create Redfish Session With ClientID  ${client_ids}[1]
690    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[1]
691    Append To List  ${trans_id_list2}  ${trans_id}
692    Verify Lock On Resource  ${session_info2}  ${trans_id_list2}
693
694    Release Locks On Resource
695    ...  ${session_info1}  ${trans_id_list1}  Transaction  status_code=${HTTP_UNAUTHORIZED}
696    Verify Lock On Resource  ${session_info1}  ${trans_id_list1}
697    Release Locks On Resource  ${session_info1}  ${trans_id_list1}  release_lock_type=Session
698    Release Locks On Resource  ${session_info2}  ${trans_id_list2}  release_lock_type=Session
699    Redfish Delete Session  ${session_info1}
700    Redfish Delete Session  ${session_info2}
701
702
703Verify Fail To Acquire Lock For Invalid Resource ID Data Type
704    [Documentation]  Verify fail to acquire the lock with invalid resource id data type.
705    [Arguments]  ${client_id}  ${lock_type}
706
707    # Description of argument(s):
708    # client_id    This client id can contain string value
709    #              (e.g. 12345, "HMCID").
710    # lock_type    Read lock or Write lock.
711
712    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
713    Redfish Post Acquire Invalid Lock With Invalid Data Type Of Resource ID
714    ...  ${lock_type}  status_code=${HTTP_BAD_REQUEST}
715    Redfish Delete Session  ${session_info}
716
717
718Verify Fail To Acquire Lock For Invalid Lock Data
719    [Documentation]  Verify fail to acquired lock with invalid lock types, lock flags, segement flags.
720    [Arguments]  ${client_id}  ${lock_type}  ${message}
721
722    # Description of argument(s):
723    # client_id    This client id can contain string value
724    #              (e.g. 12345, "HMCID").
725    # lock_type    Read lock or Write lock.
726    # message      Return message from URI.
727
728    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
729    ${trans_id}=  Redfish Post Acquire Invalid Lock  ${lock_type}  message=${message}  status_code=${HTTP_BAD_REQUEST}
730    Redfish Delete Session  ${session_info}
731