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