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
9Resource             ../../lib/rest_response_code.robot
10Library              ../../lib/bmc_network_utils.py
11
12Suite Setup          Run Keyword And Ignore Error  Delete All Redfish Sessions
13Suite Teardown       Run Keyword And Ignore Error  Delete All Redfish Sessions
14Test Setup           Printn
15Test Teardown        FFDC On Test Case Fail
16
17*** Variables ***
18
19${BAD_REQUEST}       Bad Request
20
21*** Test Cases ***
22
23Acquire Read Write Lock
24    [Documentation]  Acquire and release different read locks.
25    [Tags]  Acquire_Read_Write_Lock
26    [Template]  Acquire Lock On Resource
27
28    # client_id    lock_type     reboot_flag
29    HMCID-01       ReadCase1     False
30    HMCID-01       ReadCase2     False
31    HMCID-01       ReadCase3     False
32    HMCID-01       WriteCase1    False
33    HMCID-01       WriteCase2    False
34    HMCID-01       WriteCase3    False
35
36
37Check Lock Persistency On BMC Reboot
38    [Documentation]  Acquire lock and check after reboot it remain same.
39    [Tags]  Check_Lock_Persistency_On_BMC_Reboot
40    [Template]  Acquire Lock On Resource
41
42    # client_id    lock_type     reboot_flag
43    HMCID-01       ReadCase1     True
44    HMCID-01       ReadCase2     True
45    HMCID-01       ReadCase3     True
46    HMCID-01       WriteCase1    True
47    HMCID-01       WriteCase2    True
48    HMCID-01       WriteCase3    True
49
50
51Acquire Read Lock On Read Lock
52    [Documentation]  Acquire read lock on another read lock.
53    [Tags]  Acquire_Read_Lock_On_Read_Lock
54    [Template]  Acquire Lock On Another Lock
55
56    # client_id
57    HMCID-01
58
59
60Fail To Acquire Lock On Another Lock
61    [Documentation]  Fail to acquire another lock.
62    [Tags]  Fail_To_Acquire_Lock_On_Another_Lock
63    [Template]  Verify Acquire Lock Fails On Another Lock
64
65    # client_id    lock_type
66    HMCID-01       ReadCase2,WriteCase2
67    HMCID-01       WriteCase2,WriteCase2
68    HMCID-01       WriteCase2,ReadCase2
69
70
71Acquire Lock After Reboot
72    [Documentation]  Acquire and release read and write locks after reboot.
73    [Tags]  Acquire_Lock_After_Reboot
74    [Template]  Verify Acquire Lock After Reboot
75
76    # client_id    lock_type
77    HMCID-01       ReadCase1
78    HMCID-01       ReadCase2
79    HMCID-01       ReadCase3
80    HMCID-01       WriteCase1
81    HMCID-01       WriteCase2
82    HMCID-01       WriteCase3
83
84
85Acquire And Release Lock In Loop
86    [Documentation]  Acquire and release read, write locks in loop.
87    [Tags]  Acquire_And_Release_Lock_In_Loop
88    [Template]  Verify Acquire And Release Lock In Loop
89
90    # client_id    lock_type
91    HMCID-01       ReadCase1
92    HMCID-01       ReadCase2
93    HMCID-01       ReadCase3
94    HMCID-01       WriteCase1
95    HMCID-01       WriteCase2
96    HMCID-01       WriteCase3
97
98
99Fail To Acquire Read And Write In Single Request
100    [Documentation]  Fail to acquire read and write lock in single request.
101    [Tags]  Fail_To_Acquire_Read_And_Write_In_Single_Request
102    [Template]  Verify Fail To Acquire Read And Write In Single Request
103
104    # client_id    lock_type
105    HMCID-01       ReadCase1,WriteCase1
106    HMCID-01       WriteCase1,ReadCase1
107
108
109Acquire Multiple Lock Request At CEC Level
110    [Documentation]  Acquire write lock on read lock under CEC level.
111    [Tags]  Acquire_Multiple_Lock_Request_At_CEC_Level
112    [Template]  Verify Acquire Multiple Lock Request At CEC Level
113
114    # client_id    lock_type
115    HMCID-01       ReadCase4,WriteCase4
116    HMCID-01       WriteCase5,ReadCase5
117    HMCID-01       ReadCase6,WriteCase6
118    HMCID-01       WriteCase7,ReadCase7
119
120
121Verify Release Of Valid Locks
122    [Documentation]  Release all valid locks.
123    [Tags]  Verify_Release_Of_Valid_Locks
124    [Template]  Acquire And Release Multiple Locks
125
126    # client_id    lock_type                        release_lock_type
127    HMCID-01       ReadCase1,ReadCase1,ReadCase1    Transaction
128    HMCID-02       ReadCase1,ReadCase1,ReadCase1    Session
129
130
131Invalid Locks Fail To Release
132    [Documentation]  Release in-valid lock result in fail.
133    [Tags]  Invalid_Locks_Fail_To_Release
134    [Template]  Verify Invalid Locks Fail To Release
135
136    # client_id    lock_type                        release_lock_type
137    HMCID-01       ReadCase1,ReadCase1,ReadCase1    Transaction
138    12345          ReadCase2,ReadCase2,ReadCase2    Transaction
139    HMCID          ReadCase3,ReadCase3,ReadCase3    Transaction
140
141
142Fail To Release Lock For Another Session
143    [Documentation]  Failed to release locks from another session.
144    [Tags]  Fail_To_Release_Lock_For_Another_Session
145    [Template]  Verify Fail To Release Lock For Another Session
146
147    # client_id          lock_type
148    HMCID-01,HMCID-02    ReadCase1,ReadCase1
149
150
151Test Invalid Resource ID Data Type Locking
152    [Documentation]  Failed to acquire lock for invalid resource id data type.
153    [Tags]  Test_Invalid_Resource_ID_Data_Type_Locking
154    [Template]  Verify Fail To Acquire Lock For Invalid Resource ID Data Type
155
156    # client_id    lock_type
157    HMCID-01       ReadCase1
158    HMCID-01       ReadCase2
159    HMCID-01       ReadCase3
160    HMCID-01       WriteCase1
161    HMCID-01       WriteCase2
162    HMCID-01       WriteCase3
163
164
165Fail To Acquire Lock For Invalid Lock Type
166    [Documentation]  Failed to acquire read, write lock for invalid lock data passed.
167    [Tags]  Fail_To_Acquire_Lock_For_Invalid_Lock_Type
168    [Template]  Verify Fail To Acquire Lock For Invalid Lock Data
169
170    # client_id    lock_type      message
171    HMCID-01       ReadCase1      ${BAD_REQUEST}
172    HMCID-01       ReadCase2      ${BAD_REQUEST}
173    HMCID-01       ReadCase3      ${BAD_REQUEST}
174    HMCID-01       ReadCase4      ${BAD_REQUEST}
175    HMCID-01       ReadCase5      ${BAD_REQUEST}
176    HMCID-01       WriteCase1     ${BAD_REQUEST}
177    HMCID-01       WriteCase2     ${BAD_REQUEST}
178    HMCID-01       WriteCase3     ${BAD_REQUEST}
179    HMCID-01       WriteCase4     ${BAD_REQUEST}
180    HMCID-01       WriteCase5     ${BAD_REQUEST}
181
182
183Fail To Acquire Lock For Invalid Lock Flag
184    [Documentation]  Failed to acquire read write lock for invalid lock flag passed.
185    [Tags]  Fail_To_Acquire_Lock_For_Invalid_Lock_Flag
186    [Template]  Verify Fail To Acquire Lock For Invalid Lock Data
187
188    # client_id    lock_type       message
189    HMCID-01       ReadCase6       ${BAD_REQUEST}
190    HMCID-01       ReadCase7       ${BAD_REQUEST}
191    HMCID-01       ReadCase8       ${BAD_REQUEST}
192    HMCID-01       ReadCase9       ${BAD_REQUEST}
193    HMCID-01       ReadCase10      ${BAD_REQUEST}
194    HMCID-01       ReadCase11      ${BAD_REQUEST}
195    HMCID-01       WriteCase6      ${BAD_REQUEST}
196    HMCID-01       WriteCase7      ${BAD_REQUEST}
197    HMCID-01       WriteCase8      ${BAD_REQUEST}
198    HMCID-01       WriteCase9      ${BAD_REQUEST}
199    HMCID-01       WriteCase10     ${BAD_REQUEST}
200    HMCID-01       WriteCase11     ${BAD_REQUEST}
201
202
203Fail To Acquire Lock For Invalid Segment Flag
204    [Documentation]  Failed to acquire read write lock for invalid segment flag passed.
205    [Tags]  Fail_To_Acquire_Lock_For_Invalid_Segment_Flag
206    [Template]  Verify Fail To Acquire Lock For Invalid Lock Data
207
208    # client_id    lock_type       message
209    HMCID-01       ReadCase12      ${BAD_REQUEST}
210    HMCID-01       ReadCase13      ${BAD_REQUEST}
211    HMCID-01       ReadCase14      ${BAD_REQUEST}
212    HMCID-01       WriteCase12     ${BAD_REQUEST}
213    HMCID-01       WriteCase13     ${BAD_REQUEST}
214    HMCID-01       WriteCase14     ${BAD_REQUEST}
215
216
217Fail To Acquire Lock For Invalid Segment Data Type Flag
218    [Documentation]  Failed to acquire read write lock for invalid segment flag passed.
219    [Tags]  Fail_To_Acquire_Lock_For_Invalid_Segment_Data_Type_Flag
220    [Template]  Verify Fail To Acquire Lock For Invalid Lock Data
221
222    # client_id    lock_type       message
223    HMCID-01       ReadCase15      ${EMPTY}
224    HMCID-01       ReadCase16      ${EMPTY}
225    HMCID-01       ReadCase17      ${EMPTY}
226    HMCID-01       ReadCase18      ${EMPTY}
227    HMCID-01       WriteCase15     ${EMPTY}
228    HMCID-01       WriteCase16     ${EMPTY}
229    HMCID-01       WriteCase17     ${EMPTY}
230    HMCID-01       WriteCase18     ${EMPTY}
231
232
233Get Empty Lock Records For Session Where No Locks Acquired
234    [Documentation]  If session does not acquire locks then get lock should return
235    ...              empty lock records.
236    [Tags]  Get_Empty_Lock_Records_For_Session_Where_No_Locks_Acquired
237    [Template]  Verify No Locks Records For Session With No Acquired Lock
238
239    # client_id
240    HMCID-01
241
242
243Get Lock Records Empty For Invalid Session
244    [Documentation]  Record of lock list is empty for invalid session.
245    [Tags]  Get_Lock_Records_Empty_For_Invalid_Session
246    [Template]  Verify Empty Lock Records For Invalid Session
247
248    # client_id
249    HMCID-01
250
251
252Get Lock Records For Multiple Session
253    [Documentation]  Get lock records of multiple session.
254    [Tags]  Get_Lock_Records_For_Multiple_Session
255    [Template]  Verify Lock Records Of Multiple Session
256
257    # client_ids         lock_type
258    HMCID-01,HMCID-02    ReadCase1,ReadCase1
259
260
261Get Lock Records For Multiple Invalid Session
262    [Documentation]  Record of lock list is empty for list of invalid session.
263    [Tags]  Get_Lock_Records_For_Multiple_Invalid_Session
264    [Template]  Verify Lock Records For Multiple Invalid Session
265
266    # client_id
267    HMCID-01
268
269
270Get Lock Records For Multiple Invalid And Valid Session
271    [Documentation]  Get record of lock from invalid and valid session.
272    [Tags]  Get_Lock_Records_For_Multiple_Invalid_And_Valid_Session
273    [Template]  Verify Lock Records For Multiple Invalid And Valid Session
274
275    # client_id          lock_type
276    HMCID-01,HMCID-02    ReadCase1
277
278*** Keywords ***
279
280Create Redfish Session With ClientID
281    [Documentation]  Create redifish session with client id.
282    [Arguments]  ${client_id}
283
284    # Description of argument(s):
285    # client_id    This client id can contain string value
286    #              (e.g. 12345, "HMCID").
287
288    ${session_info}=  Create Dictionary
289    ${session}=  Redfish Login  kwargs= "Oem":{"OpenBMC" : {"ClientID":"${client_id}"}}
290
291    Set To Dictionary  ${session_info}  SessionIDs  ${session['Id']}
292    Set To Dictionary  ${session_info}  ClientID  ${session["Oem"]["OpenBMC"]["ClientID"]}
293
294    [Return]  ${session_info}
295
296
297RW General Dictionary
298    [Documentation]  Create dictionay of lock request.
299    [Arguments]  ${read_case}  ${res_id}
300
301    # Description of argument(s):
302    # read_case    Read or Write lock type.
303    # res_id       Resource id.
304
305    ${request_dict}=  Create Dictionary
306
307    FOR  ${key}  IN  @{read_case.keys()}
308      Set To Dictionary  ${request_dict}  LockType  ${key}
309      Set To Dictionary  ${request_dict}  SegmentFlags  ${read_case["${key}"]}
310    END
311
312    Set To Dictionary  ${request_dict}  ResourceID  ${res_id}
313
314    [Return]  ${request_dict}
315
316
317Return Description Of Response
318    [Documentation]  Return description of REST response.
319    [Arguments]  ${resp_text}
320
321    # Description of argument(s):
322    # resp_text    REST response body.
323
324    # resp_text after successful partition file upload looks like:
325    # {
326    #    "Description": "File Created"
327    # }
328
329    ${message}=  Evaluate  json.loads('''${resp_text}''')  json
330
331    [Return]  ${message}
332
333
334Verify Redfish Session Deleted
335    [Documentation]  Verify the redfish session is deleted.
336    [Arguments]  ${session_info}
337
338    # Description of argument(s):
339    # session_info    Session information are stored in dictionary.
340
341    # ${session_info} = {
342    #     'SessionIDs': 'XXXXXXXXX',
343    #     'ClientID': 'XXXXXX',
344    #     'SessionToken': 'XXXXXXXXX',
345    #     'SessionResp': session response from redfish login
346    # }
347
348    # SessionIDs   : Session IDs
349    # ClientID     : Client ID
350    # SessionToken : Session token
351    # SessionResp  : Response of creating an redfish login session
352
353    ${sessions}=  Redfish.Get Properties  /redfish/v1/SessionService/Sessions
354
355    FOR  ${session}  IN  @{sessions['Members']}
356      Should Not Be Equal As Strings  session  ['/redfish/v1/SessionService/Sessions/${session_info["SessionIDs"]}']
357    END
358
359
360Verify Redfish List Of Session Deleted
361    [Documentation]  Verify all the list of redfish session is deleted.
362    [Arguments]  ${session_info_list}
363
364    # Description of argument(s):
365    # session_info_list    List contains individual session record are stored in dictionary.
366
367    # ${session_info_list} = [{
368    #     'SessionIDs': 'XXXXXXXXX',
369    #     'ClientID': 'XXXXXX',
370    #     'SessionToken': 'XXXXXXXXX',
371    #     'SessionResp': session response from redfish login
372    # }]
373
374    # SessionIDs   : Session IDs
375    # ClientID     : Client ID
376    # SessionToken : Session token
377    # SessionResp  : Response of creating an redfish login session
378
379    FOR  ${session_record}  IN  @{session_info_list}
380      Verify Redfish Session Deleted  ${session_record}
381    END
382
383
384Redfish Post Acquire Lock
385    [Documentation]  Acquire and release lock.
386    [Arguments]  ${lock_type}  ${status_code}=${HTTP_OK}
387
388    # Description of argument(s):
389    # lock_type      Read lock or Write lock.
390    # status_code    HTTP status code.
391
392    ${lock_dict_param}=  Form Data To Acquire Lock  ${lock_type}
393    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.AcquireLock  data=${lock_dict_param}
394    Should Be Equal As Strings  ${resp.status_code}  ${status_code}
395
396    Run Keyword If  ${status_code} == ${HTTP_BAD_REQUEST}
397    ...    Valid Value  ${BAD_REQUEST}  ['${resp.content}']
398    ...  ELSE
399    ...    Run Keyword And Return  Return Description Of Response  ${resp.content}
400
401    [Return]  ${resp}
402
403
404Redfish Post Acquire List Lock
405    [Documentation]  Acquire and release lock.
406    [Arguments]  ${lock_type}  ${status_code}=${HTTP_OK}
407
408    # Description of argument(s):
409    # lock_type      Read lock or Write lock.
410    # status_code    HTTP status code.
411
412    ${lock_dict_param}=  Create Data To Acquire List Of Lock  ${lock_type}
413    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.AcquireLock  data=${lock_dict_param}
414    Should Be Equal As Strings  ${resp.status_code}  ${status_code}
415
416    [Return]  ${resp}
417
418
419Redfish Post Acquire Invalid Lock
420    [Documentation]  Redfish to post request to acquire in-valid lock.
421    [Arguments]  ${lock_type}  ${message}  ${status_code}=${HTTP_OK}
422
423    # Description of argument(s):
424    # lock_type      Read lock or Write lock.
425    # message        Return message from URI.
426    # status_code    HTTP status code.
427
428    ${lock_dict_param}=  Form Data To Acquire Invalid Lock  ${lock_type}
429    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.AcquireLock  data=${lock_dict_param}
430    Should Be Equal As Strings  ${resp.status_code}  ${status_code}
431    Run Keyword If  '${message}' != '${EMPTY}'
432    ...  Valid Value  message  ['${resp.content}']
433
434    [Return]  ${resp}
435
436
437Redfish Post Acquire Invalid Lock With Invalid Data Type Of Resource ID
438    [Documentation]  Redfish to post request to acquire in-valid lock with invalid data type of resource id.
439    [Arguments]  ${lock_type}  ${status_code}=${HTTP_OK}
440
441    # Description of argument(s):
442    # lock_type      Read lock or Write lock.
443    # status_code    HTTP status code.
444
445    ${lock_dict_param}=  Form Data To Acquire Invalid Lock With Invalid Data Type Of Resource ID  ${lock_type}
446    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.AcquireLock  data=${lock_dict_param}
447    Should Be Equal As Strings  ${resp.status_code}  ${status_code}
448
449    [Return]  ${resp}
450
451
452Form Data To Acquire Lock
453    [Documentation]  Create a dictionay for lock request.
454    [Arguments]  ${lock_type}
455
456    # Description of argument(s):
457    # lock_type      Read lock or Write lock.
458
459    ${lock_res_info}=  Get Lock Resource Information
460    ${resp}=  RW General Dictionary
461    ...    ${lock_res_info["Valid Case"]["${lock_type}"]}
462    ...    ${lock_res_info["Valid Case"]["ResourceID"]}
463    ${temp_list}=  Create List  ${resp}
464    ${lock_request_dict}=  Create Dictionary  Request=${temp_list}
465
466    [Return]  ${lock_request_dict}
467
468
469Create Data To Acquire List Of Lock
470    [Documentation]  Create a dictionay for list of lock request.
471    [Arguments]  ${lock_type_list}
472
473    # Description of argument(s):
474    # lock_type      Read lock or Write lock.
475
476    ${temp_list}=  Create List
477    ${lock_res_info}=  Get Lock Resource Information
478
479    FOR  ${lock_type}  IN  @{lock_type_list}
480      ${resp}=  RW General Dictionary
481      ...    ${lock_res_info["Valid Case"]["${lock_type}"]}
482      ...    ${lock_res_info["Valid Case"]["ResourceID"]}
483      Append To List  ${temp_list}  ${resp}
484    END
485
486    ${lock_request_dict}=  Create Dictionary  Request=${temp_list}
487
488    [Return]  ${lock_request_dict}
489
490
491Form Data To Acquire Invalid Lock With Invalid Data Type Of Resource ID
492    [Documentation]  Create a dictionay for in-valid lock request.
493    [Arguments]  ${lock_type}
494
495    # Description of argument(s):
496    # lock_type      Read lock or Write lock.
497
498    ${lock_res_info}=  Get Lock Resource Information
499    ${resp}=  RW General Dictionary
500    ...    ${lock_res_info["Valid Case"]["${lock_type}"]}
501    ...    ${lock_res_info["Invalid Case"]["ResourceIDInvalidDataType"]}
502    ${temp_list}=  Create List  ${resp}
503    ${lock_request_dict}=  Create Dictionary  Request=${temp_list}
504
505    [Return]  ${lock_request_dict}
506
507
508Form Data To Acquire Invalid Lock
509    [Documentation]  Create a dictionay for in-valid lock request.
510    [Arguments]  ${lock_type}
511
512    # Description of argument(s):
513    # lock_type      Read lock or Write lock.
514
515    ${lock_res_info}=  Get Lock Resource Information
516    ${resp}=  RW General Dictionary
517    ...    ${lock_res_info["Invalid Case"]["${lock_type}"]}
518    ...    ${lock_res_info["Valid Case"]["ResourceID"]}
519    ${temp_list}=  Create List  ${resp}
520    ${lock_request_dict}=  Create Dictionary  Request=${temp_list}
521
522    [Return]  ${lock_request_dict}
523
524
525Get Locks List On Resource
526    [Documentation]  Get locks list.
527    [Arguments]  ${session_info}  ${exp_status_code}=${HTTP_OK}
528
529    # Description of argument(s):
530    # session_info       Session information in dict.
531    # exp_status_code    Expected HTTP status code.
532
533    ${data}=  Set Variable  {"SessionIDs": ["${session_info['SessionIDs']}"]}
534    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.GetLockList
535    ...  data=${data}
536    ${locks}=  Evaluate  json.loads('''${resp.text}''')  json
537
538    [Return]  ${locks["Records"]}
539
540
541Verify Lock On Resource
542    [Documentation]  Verify lock on resource.
543    [Arguments]  ${session_info}  ${transaction_id}
544
545    # Description of argument(s):
546    # session_info      Session information in dict.
547    # transaction_id    Transaction id in list stored in dict.
548
549    ${sessions}=  Redfish.Get Properties  /redfish/v1/SessionService/Sessions/${session_info['SessionIDs']}
550    Rprint Vars  sessions
551    ${lock_list}=  Get Locks List On Resource  ${session_info}
552    ${lock_length}=  Get Length  ${lock_list}
553    ${tran_id_length}=  Get Length  ${transaction_id}
554    Should Be Equal As Integers  ${tran_id_length}  ${lock_length}
555
556    FOR  ${tran_id}  ${lock}  IN ZIP  ${transaction_id}  ${lock_list}
557      Valid Value  session_info['ClientID']  ['${lock['HMCID']}']
558      Valid Value  session_info['SessionIDs']  ['${lock['SessionID']}']
559      Should Be Equal As Integers  ${tran_id['TransactionID']}  ${lock['TransactionID']}
560    END
561
562
563Acquire Lock On Resource
564    [Documentation]  Acquire lock on resource.
565    [Arguments]  ${client_id}  ${lock_type}  ${reboot_flag}=False
566
567    # Description of argument(s):
568    # client_id    This client id can contain string value
569    #              (e.g. 12345, "HMCID").
570    # lock_type    Read lock or Write lock.
571    # reboot_flag  Flag is used to run reboot the BMC code.
572    #               (e.g. True or False).
573
574    ${trans_id_list}=  Create List
575    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
576    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type}
577    Append To List  ${trans_id_list}  ${trans_id}
578    Verify Lock On Resource  ${session_info}  ${trans_id_list}
579
580    ${before_reboot_xauth_token}=  Set Variable  ${XAUTH_TOKEN}
581
582    Run Keyword If  '${reboot_flag}' == 'True'
583    ...  Run Keywords  Redfish OBMC Reboot (off)  AND
584    ...  Redfish Login  AND
585    ...  Set Global Variable  ${XAUTH_TOKEN}  ${before_reboot_xauth_token}  AND
586    ...  Verify Lock On Resource  ${session_info}  ${trans_id_list}  AND
587    ...  Release Locks On Resource  ${session_info}  ${trans_id_list}  Transaction  ${HTTP_OK}
588
589    Run Keyword If  '${reboot_flag}' == 'False'
590    ...  Release Locks On Resource  ${session_info}  ${trans_id_list}  Transaction  ${HTTP_OK}
591
592    ${trans_id_emptylist}=  Create List
593    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
594    Redfish Delete Session  ${session_info}
595
596
597Form Data To Release Lock
598    [Documentation]  Create a dictonay to release lock.
599    [Arguments]  ${trans_id_list}
600
601    # Description of argument(s):
602    # trans_id_list
603
604    @{tran_ids}=  Create List
605
606    FOR  ${item}  IN  @{trans_id_list}
607      Append To List  ${tran_ids}  ${item['TransactionID']}
608    END
609
610    [Return]  ${tran_ids}
611
612
613Release Locks On Resource
614    [Documentation]  Redfish request to release a lock.
615    [Arguments]  ${session_info}  ${trans_id_list}  ${release_lock_type}=Transaction  ${status_code}=${HTTP_OK}
616
617    # Description of argument(s):
618    # session_info        Session information in dict.
619    # trans_id_list       Transaction id list.
620    # release_lock_type   Release lock by Transaction, Session.
621    # status_code         HTTP status code.
622
623    ${tran_ids}=  Form Data To Release Lock  ${trans_id_list}
624    ${data}=  Set Variable  {"Type": "${release_lock_type}", "TransactionIDs":${tran_ids}}
625    ${data}=  Evaluate  json.dumps(${data})  json
626    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock  data=${data}
627    Should Be Equal As Strings  ${resp.status_code}  ${status_code}
628
629
630Release locks And Delete Session
631    [Documentation]  Release locks and delete redfish session.
632    [Arguments]  ${session_info}  ${trans_id_list}
633
634    Release Locks On Resource  ${session_info}  ${trans_id_list}
635
636    ${trans_id_emptylist}=  Create List
637    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
638
639    Redfish Delete Session  ${session_info}
640
641
642Acquire Lock On Another Lock
643    [Documentation]  Acquire lock on another lock.
644    [Arguments]  ${client_id}
645
646    # Description of argument(s):
647    # client_id    This client id can contain string value
648    #              (e.g. 12345, "HMCID").
649
650    ${trans_id_list}=  Create List
651    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
652
653    ${trans_id}=  Redfish Post Acquire Lock  ReadCase1
654    Append To List  ${trans_id_list}  ${trans_id}
655
656    ${trans_id}=  Redfish Post Acquire Lock  ReadCase1
657    Append To List  ${trans_id_list}  ${trans_id}
658
659    Verify Lock On Resource  ${session_info}  ${trans_id_list}
660
661    Release locks And Delete Session  ${session_info}  ${trans_id_list}
662
663
664Verify Fail To Acquire Read And Write In Single Request
665    [Documentation]  Verify fail to acquire read and write lock passed in single request.
666    [Arguments]  ${client_id}  ${lock_type}
667
668    # Description of argument(s):
669    # client_id    This client id can contain string value
670    #              (e.g. 12345, "HMCID").
671    # lock_type    Read lock or Write lock.
672
673    ${lock_type_list}=  Split String  ${lock_type}  ,
674
675    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
676    ${trans_id}=  Redfish Post Acquire List Lock  ${lock_type_list}  status_code=${HTTP_BAD_REQUEST}
677    Redfish Delete Session  ${session_info}
678
679
680Verify Empty Lock Records For Invalid Session
681    [Documentation]  Verify no lock record found for invalid session.
682    [Arguments]  ${client_id}
683
684    # Description of argument(s):
685    # client_id    This client id can contain string value
686    #              (e.g. 12345, "HMCID").
687
688    ${session_info1}=  Create Redfish Session With ClientID  ${client_id}
689
690    ${lock_list1}=  Get Locks List On Resource  ${session_info1}
691    ${lock_length1}=  Get Length  ${lock_list1}
692
693    ${session_info2}=  Copy Dictionary  ${session_info1}  deepcopy=True
694    set to dictionary  ${session_info2}  SessionIDs  xxyXyyYZZz
695
696    ${lock_list2}=  Get Locks List On Resource  ${session_info2}
697    ${lock_length2}=  Get Length  ${lock_list2}
698
699    Should Be Equal As Integers  ${lock_length1}  ${lock_length2}
700
701    Redfish Delete Session  ${session_info1}
702
703
704Verify Acquire Lock Fails On Another Lock
705    [Documentation]  Verify acquire lock on another lock fails.
706    [Arguments]  ${client_id}  ${lock_type}
707
708    # Description of argument(s):
709    # client_id    This client id can contain string value
710    #              (e.g. 12345, "HMCID").
711    # lock_type    Read lock or Write lock.
712
713    @{lock_type_list}=  Split String  ${lock_type}  ,
714    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
715    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
716
717    ${trans_id_list}=  Create List
718    Append To List  ${trans_id_list}  ${trans_id}
719
720    Verify Lock On Resource  ${session_info}  ${trans_id_list}
721    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[1]  status_code=${HTTP_CONFLICT}
722
723    Release locks And Delete Session  ${session_info}  ${trans_id_list}
724
725
726Verify Acquire Lock After Reboot
727    [Documentation]  Acquire read and write lock after the reboot and release lock.
728    [Arguments]  ${client_id}  ${lock_type}
729
730    # Description of argument(s):
731    # client_id    This client id can contain string value
732    #              (e.g. 12345, "HMCID").
733    # lock_type    Read lock or Write lock.
734
735    ${trans_id_list}=  Create List
736    ${session_info}=  Create Session With ClientID  ${client_id}
737    ${before_reboot_xauth_token}=  Set Variable  ${XAUTH_TOKEN}
738    Redfish OBMC Reboot (off)
739    Redfish Login
740    Set Global Variable  ${XAUTH_TOKEN}  ${before_reboot_xauth_token}
741
742    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type}
743    Append To List  ${trans_id_list}  ${trans_id}
744    Verify Lock On Resource  ${session_info}  ${trans_id_list}
745
746    Release locks And Delete Session  ${session_info}  ${trans_id_list}
747
748
749Verify Acquire Multiple Lock Request At CEC Level
750    [Documentation]  Acquire lock in loop.
751    [Arguments]  ${client_id}  ${lock_type}
752
753    # Description of argument(s):
754    # client_id    This client id can contain string value
755    #              (e.g. 12345, "HMCID").
756    # lock_type    Read lock or Write lock.
757
758    ${trans_id_list}=  Create List
759    @{lock_type_list}=  Split String  ${lock_type}  ,
760    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
761
762    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
763    Append To List  ${trans_id_list}  ${trans_id}
764
765    Verify Lock On Resource  ${session_info}  ${trans_id_list}
766
767    Redfish Post Acquire Lock  ${lock_type_list}[1]  status_code=${HTTP_CONFLICT}
768
769    Release locks And Delete Session  ${session_info}  ${trans_id_list}
770
771
772Verify Acquire And Release Lock In Loop
773    [Documentation]  Acquire lock in loop.
774    [Arguments]  ${client_id}  ${lock_type}
775
776    # Description of argument(s):
777    # client_id    This client id can contain string value
778    #              (e.g. 12345, "HMCID").
779    # lock_type    Read lock or Write lock.
780
781    FOR  ${count}  IN RANGE  1  11
782      ${trans_id_list}=  Create List
783      ${session_info}=  Create Redfish Session With ClientID  ${client_id}
784      ${trans_id}=  Redfish Post Acquire Lock  ${lock_type}
785      Append To List  ${trans_id_list}  ${trans_id}
786      Verify Lock On Resource  ${session_info}  ${trans_id_list}
787      Release Locks On Resource  ${session_info}  ${trans_id_list}  Transaction  ${HTTP_OK}
788      ${trans_id_emptylist}=  Create List
789      Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
790    END
791
792    Redfish Delete Session  ${session_info}
793
794
795Acquire And Release Multiple Locks
796    [Documentation]  Acquire mutilple locks on resource.
797    [Arguments]  ${client_id}  ${lock_type}  ${release_lock_type}
798
799    # Description of argument(s):
800    # client_id          This client id can contain string value
801    #                    (e.g. 12345, "HMCID").
802    # lock_type          Read lock or Write lock.
803    # release_lock_type  The value can be Transaction or Session.
804
805    @{lock_type_list}=  Split String  ${lock_type}  ,
806    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
807    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
808
809    ${trans_id_list}=  Create List
810
811    Append To List  ${trans_id_list}  ${trans_id}
812    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[1]
813
814    Append To List  ${trans_id_list}  ${trans_id}
815    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[2]
816
817    Append To List  ${trans_id_list}  ${trans_id}
818    Verify Lock On Resource  ${session_info}  ${trans_id_list}
819    Release Locks On Resource  ${session_info}  ${trans_id_list}  release_lock_type=${release_lock_type}
820
821    ${trans_id_emptylist}=  Create List
822    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
823    Redfish Delete Session  ${session_info}
824
825
826Verify Invalid Locks Fail To Release
827    [Documentation]  Verify invalid locks fails to be released.
828    [Arguments]  ${client_id}  ${lock_type}  ${release_lock_type}
829
830    # Description of argument(s):
831    # client_id          This client id can contain string value
832    #                    (e.g. 12345, "HMCID").
833    # lock_type          Read lock or Write lock.
834    # release_lock_type  The value can be Transaction or Session.
835
836    ${trans_id_list}=  Create List
837    @{lock_type_list}=  Split String  ${lock_type}  ,
838
839    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
840
841    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
842    ${value}=  Get From Dictionary  ${trans_id}  TransactionID
843    ${value}=  Evaluate  ${value} + 10
844    Set To Dictionary  ${trans_id}  TransactionID  ${value}
845    Append To List  ${trans_id_list}  ${trans_id}
846
847    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[1]
848    ${value}=  Get From Dictionary  ${trans_id}  TransactionID
849    ${value}=  Evaluate  ${value} + 10
850    Set To Dictionary  ${trans_id}  TransactionID  ${value}
851    Append To List  ${trans_id_list}  ${trans_id}
852
853    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[2]
854    ${value}=  Get From Dictionary  ${trans_id}  TransactionID
855    ${value}=  Evaluate  ${value} + 10
856    Set To Dictionary  ${trans_id}  TransactionID  ${value}
857    Append To List  ${trans_id_list}  ${trans_id}
858
859    Release Locks On Resource
860    ...  ${session_info}  ${trans_id_list}
861    ...  release_lock_type=${release_lock_type}  status_code=${HTTP_BAD_REQUEST}
862    Release Locks On Resource  ${session_info}  ${trans_id_list}  release_lock_type=Session
863
864    ${trans_id_emptylist}=  Create List
865    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
866    Redfish Delete Session  ${session_info}
867
868
869Verify Fail To Release Lock For Another Session
870    [Documentation]  Verify failed to release the lock form another session.
871    [Arguments]  ${client_id}  ${lock_type}
872
873    # Description of argument(s):
874    # client_id    This client id can contain string value
875    #              (e.g. 12345, "HMCID").
876    # lock_type    Read lock or Write lock.
877
878    ${client_ids}=  Split String  ${client_id}  ,
879    ${lock_type_list}=  Split String  ${lock_type}  ,
880    ${trans_id_list1}=  Create List
881    ${trans_id_list2}=  Create List
882
883    ${session_info1}=  Create Redfish Session With ClientID  ${client_ids}[0]
884
885    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
886    Append To List  ${trans_id_list1}  ${trans_id}
887    Verify Lock On Resource  ${session_info1}  ${trans_id_list1}
888
889    ${session_info2}=  Create Redfish Session With ClientID  ${client_ids}[1]
890    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[1]
891    Append To List  ${trans_id_list2}  ${trans_id}
892    Verify Lock On Resource  ${session_info2}  ${trans_id_list2}
893
894    Release Locks On Resource
895    ...  ${session_info1}  ${trans_id_list1}  Transaction  status_code=${HTTP_UNAUTHORIZED}
896    Verify Lock On Resource  ${session_info1}  ${trans_id_list1}
897    Release Locks On Resource  ${session_info1}  ${trans_id_list1}  release_lock_type=Session
898    Release Locks On Resource  ${session_info2}  ${trans_id_list2}  release_lock_type=Session
899    Redfish Delete Session  ${session_info1}
900    Redfish Delete Session  ${session_info2}
901
902
903Verify Fail To Acquire Lock For Invalid Resource ID Data Type
904    [Documentation]  Verify fail to acquire the lock with invalid resource id data type.
905    [Arguments]  ${client_id}  ${lock_type}
906
907    # Description of argument(s):
908    # client_id    This client id can contain string value
909    #              (e.g. 12345, "HMCID").
910    # lock_type    Read lock or Write lock.
911
912    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
913    Redfish Post Acquire Invalid Lock With Invalid Data Type Of Resource ID
914    ...  ${lock_type}  status_code=${HTTP_BAD_REQUEST}
915    Redfish Delete Session  ${session_info}
916
917
918Verify Fail To Acquire Lock For Invalid Lock Data
919    [Documentation]  Verify fail to acquired lock with invalid lock types, lock flags, segement flags.
920    [Arguments]  ${client_id}  ${lock_type}  ${message}
921
922    # Description of argument(s):
923    # client_id    This client id can contain string value
924    #              (e.g. 12345, "HMCID").
925    # lock_type    Read lock or Write lock.
926    # message      Return message from URI.
927
928    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
929    ${trans_id}=  Redfish Post Acquire Invalid Lock  ${lock_type}  message=${message}  status_code=${HTTP_BAD_REQUEST}
930    Redfish Delete Session  ${session_info}
931
932
933Verify No Locks Records For Session With No Acquired Lock
934    [Documentation]  Verify no records found for a session where no lock is acquired.
935    [Arguments]  ${client_id}
936
937    # Description of argument(s):
938    # client_id    This client id can contain string value
939    #              (e.g. 12345, "HMCID").
940
941    ${session_info}=  Create Redfish Session With ClientID  ${client_id}
942    ${trans_id_emptylist}=  Create List
943    Verify Lock On Resource  ${session_info}  ${trans_id_emptylist}
944    Redfish Delete Session  ${session_info}
945
946
947Create List Of Session ID
948    [Documentation]  Create session id list from session dict info.
949    [Arguments]  ${session_dict_info}
950
951    # Description of argument(s):
952    # session_dict_info      Session information in dict.
953
954    @{session_id_list}=  Create List
955
956    FOR  ${session}  IN  @{session_dict_info}
957      Append To List  ${session_id_list}  ${session["SessionIDs"]}
958    END
959
960    ${num_id}=  Get Length  ${session_id_list}
961    Should Not Be Equal As Integers  ${num_id}  ${0}
962
963    ${session_id_list}=  Evaluate  json.dumps(${session_id_list})  json
964
965    [Return]  ${session_id_list}
966
967
968Get Locks List On Resource With Session List
969    [Documentation]  Get locks list from session of list.
970    [Arguments]  ${session_id_list}  ${exp_status_code}=${HTTP_OK}
971
972    # Description of argument(s):
973    # session_id_list    Session ids list.
974    # exp_status_code    Expected HTTP status code.
975
976    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.GetLockList
977    ...  data={"SessionIDs": ${session_id_list}}
978    ${locks}=  Evaluate  json.loads('''${resp.text}''')  json
979
980    [Return]  ${locks}
981
982
983Verify List Of Session Lock On Resource
984    [Documentation]  Verify list of lock record from list of sessions.
985    [Arguments]  ${session_dict_info}  ${transaction_id_list}
986
987    # Description of argument(s):
988    # session_dict_info      Session information in dict.
989    # transaction_id_list    Transaction id in list stored in dict.
990
991    ${session_id_list}=  Create List Of Session ID  ${session_dict_info}
992    ${lock_list_resp}=  Get Locks List On Resource With Session List  ${session_id_list}
993    ${lock_list}=  Set Variable  ${lock_list_resp['Records']}
994
995    FOR  ${session_id}  ${tran_id}  ${lock_record}  IN ZIP  ${session_dict_info}  ${transaction_id_list}  ${lock_list}
996      Valid Value  session_id['SessionIDs']  ['${lock_record['SessionID']}']
997      Should Be Equal As Integers  ${tran_id['TransactionID']}  ${lock_record['TransactionID']}
998    END
999
1000
1001Verify Lock Records Of Multiple Session
1002    [Documentation]  Verify all records found for a multiple sessions.
1003    [Arguments]  ${client_ids}  ${lock_type}
1004
1005    # Description of argument(s):
1006    # client_ids    This client id can contain string value
1007    #               (e.g. 12345, "HMCID").
1008    # lock_type     Read lock or Write lock.
1009
1010    ${client_id_list}=  Split String  ${client_ids}  ,
1011    ${lock_type_list}=  Split String  ${lock_type}  ,
1012    ${trans_id_list1}=  Create List
1013    ${trans_id_list2}=  Create List
1014
1015    ${session_dict_list}=  Create List
1016    ${lock_list}=  Create List
1017
1018    ${client_id1}=  Create List
1019    Append To List  ${client_id1}  ${client_id_list}[0]
1020    ${session_info1}=  Create Session With List Of ClientID  ${client_id1}
1021    Append To List  ${session_dict_list}  ${session_info1}[0]
1022    Verify A Session Created With ClientID  ${client_id1}  ${session_info1}
1023
1024    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
1025    Append To List  ${trans_id_list1}  ${trans_id}
1026    Append To List  ${lock_list}  ${trans_id}
1027    Verify Lock On Resource  ${session_info1}[0]  ${trans_id_list1}
1028
1029
1030    ${client_id2}=  Create List
1031    Append To List  ${client_id2}  ${client_id_list}[1]
1032    ${session_info2}=  Create Session With List Of ClientID  ${client_id2}
1033    Append To List  ${session_dict_list}  ${session_info2}[0]
1034    Verify A Session Created With ClientID  ${client_id2}  ${session_info2}
1035
1036    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[1]
1037    Append To List  ${trans_id_list2}  ${trans_id}
1038    Append To List  ${lock_list}  ${trans_id}
1039    Verify Lock On Resource  ${session_info2}[0]  ${trans_id_list2}
1040
1041    Verify List Of Session Lock On Resource  ${session_dict_list}  ${lock_list}
1042
1043    ${session_token}=  Get From Dictionary  ${session_info1}[0]  SessionToken
1044    Set Global Variable  ${XAUTH_TOKEN}  ${session_token}
1045
1046    Release Locks On Resource  ${session_info1}  ${trans_id_list1}  release_lock_type=Transaction
1047
1048    ${session_token}=  Get From Dictionary  ${session_info2}[0]  SessionToken
1049    Set Global Variable  ${XAUTH_TOKEN}  ${session_token}
1050
1051    Release Locks On Resource  ${session_info2}  ${trans_id_list2}  release_lock_type=Transaction
1052
1053    ${trans_id_emptylist}=  Create List
1054    Verify Lock On Resource  ${session_info1}[0]  ${trans_id_emptylist}
1055    Verify Lock On Resource  ${session_info2}[0]  ${trans_id_emptylist}
1056
1057    Redfish Delete List Of Session  ${session_dict_list}
1058
1059
1060Verify Lock Records For Multiple Invalid Session
1061    [Documentation]  Verify no lock record found for multiple invalid session.
1062    [Arguments]  ${client_id}
1063
1064    # Description of argument(s):
1065    # client_id    This client id can contain string value
1066    #              (e.g. 12345, "HMCID").
1067
1068    ${session_dict_list}=  Create List
1069    ${invalid_session_ids}=  Create List  xxyXyyYZZz  xXyXYyYZzz
1070
1071    ${session_info1}=  Create Session With ClientID  ${client_id}
1072
1073    ${session_info2}=  Copy Dictionary  ${session_info1}  deepcopy=True
1074    set to dictionary  ${session_info2}  SessionIDs  ${invalid_session_ids}[0]
1075    Append To List  ${session_dict_list}  ${session_info2}
1076
1077    ${session_info3}=  Copy Dictionary  ${session_info1}  deepcopy=True
1078    set to dictionary  ${session_info3}  SessionIDs  ${invalid_session_ids}[0]
1079    Append To List  ${session_dict_list}  ${session_info3}
1080
1081    ${lock_list1}=  Get Locks List On Resource  ${session_info1}
1082    ${lock_length1}=  Get Length  ${lock_list1}
1083
1084    ${session_id_list}=  Create List Of Session ID  ${session_dict_list}
1085    ${lock_list_resp}=  Get Locks List On Resource With Session List  ${session_id_list}
1086    ${lock_length2}=  Get Length  ${lock_list_resp['Records']}
1087
1088    Should Be Equal As Integers  ${lock_length1}  ${lock_length2}
1089
1090    Redfish Delete Session  ${session_info1}
1091
1092
1093Verify Lock Records For Multiple Invalid And Valid Session
1094    [Documentation]  Verify all records found for a valid and invalid sessions.
1095    [Arguments]  ${client_ids}  ${lock_type}
1096
1097    # Description of argument(s):
1098    # client_ids    This client id can contain string value
1099    #               (e.g. 12345, "HMCID").
1100    # lock_type     Read lock or Write lock.
1101
1102    ${client_id_list}=  Split String  ${client_ids}  ,
1103    ${lock_type_list}=  Split String  ${lock_type}  ,
1104    ${trans_id_list1}=  Create List
1105    ${invalid_session_ids}=  Create List  xxyXyyYZZz
1106
1107    ${session_dict_list}=  Create List
1108    ${lock_list}=  Create List
1109
1110    ${client_id1}=  Create List
1111    Append To List  ${client_id1}  ${client_id_list}[0]
1112    ${session_info1}=  Create Session With List Of ClientID  ${client_id1}
1113    Append To List  ${session_dict_list}  ${session_info1}[0]
1114    Verify A Session Created With ClientID  ${client_id1}  ${session_info1}
1115
1116    ${trans_id}=  Redfish Post Acquire Lock  ${lock_type_list}[0]
1117    Append To List  ${trans_id_list1}  ${trans_id}
1118    Append To List  ${lock_list}  ${trans_id}
1119    Verify Lock On Resource  ${session_info1}[0]  ${trans_id_list1}
1120
1121    ${session_info2}=  Copy Dictionary  ${session_info1}  deepcopy=True
1122    set to dictionary  ${session_info2}[0]  SessionIDs  ${invalid_session_ids}[0]
1123    Append To List  ${session_dict_list}  ${session_info2}[0]
1124
1125    Verify List Of Session Lock On Resource  ${session_dict_list}  ${lock_list}
1126
1127    ${session_token}=  Get From Dictionary  ${session_info1}[0]  SessionToken
1128    Set Global Variable  ${XAUTH_TOKEN}  ${session_token}
1129
1130    Release Locks On Resource  ${session_info1}  ${trans_id_list1}  release_lock_type=Transaction
1131
1132    ${trans_id_emptylist}=  Create List
1133    Verify Lock On Resource  ${session_info1}[0]  ${trans_id_emptylist}
1134
1135    Redfish Delete Session  ${session_info1}[0]
1136