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
8
9Suite Setup      Delete All Redfish Sessions
10Test Setup       Test Setup Execution
11Test Teardown    Test Teardown Execution
12Suite Teardown   Delete All Redfish Sessions
13
14*** Variables ***
15
16# Data-sets for testing different test cases.
17&{LOCKALL_LEN1}                   LockFlag=LockAll                SegmentLength=${1}
18&{LOCKALL_LEN2}                   LockFlag=LockAll                SegmentLength=${2}
19&{LOCKALL_LEN3}                   LockFlag=LockAll                SegmentLength=${3}
20&{LOCKALL_LEN4}                   LockFlag=LockAll                SegmentLength=${4}
21&{LOCKALL_LEN5}                   LockFlag=LockAll                SegmentLength=${5}
22
23&{LOCKALL_INVALID_LOCKFLAG1}      LockFlag=LocAll                 SegmentLength=${2}
24&{LOCKALL_INVALID_LOCKFLAG2}      LockFlag=LOCKALL                SegmentLength=${3}
25&{LOCKALL_INVALID_LOCKFLAG3}      LOCKFLAG=LockAll                SegmentLength=${4}
26&{LOCKSAME_INVALID_LOCKFLAG3}     Lock=LockSame                   SegmentLength=${1}
27&{LOCKSAME_INVALID_LOCKFLAG4}     Lock=LockSame                   SegmentLength=${True}
28
29&{LOCKSAME_LEN1}                  LockFlag=LockSame               SegmentLength=${1}
30&{LOCKSAME_LEN2}                  LockFlag=LockSame               SegmentLength=${2}
31&{LOCKSAME_LEN3}                  LockFlag=LockSame               SegmentLength=${3}
32&{LOCKSAME_LEN4}                  LockFlag=LockSame               SegmentLength=${4}
33&{LOCKSAME_INVALID_LEN1}          LockFlag=LockSame               SegmentLength=${0}
34&{LOCKSAME_INVALID_LEN2}          LockFlag=LockSame               SegmentLength=${5}
35&{LOCKSAME_INVALID_LEN_STR}       LockFlag=LockSame               SegmentLength=2
36&{LOCKSAME_INVALID_LEN_NEG}       LockFlag=LockSame               SegmentLength=${-3}
37&{LOCKSAME_INVALID_LEN_BOOL}      Lock=LockSame                   SegmentLength=${True}
38
39&{DONTLOCK_LEN1}                  LockFlag=DontLock               SegmentLength=${1}
40&{DONTLOCK_LEN2}                  LockFlag=DontLock               SegmentLength=${2}
41&{DONTLOCK_LEN3}                  LockFlag=DontLock               SegmentLength=${3}
42&{DONTLOCK_LEN4}                  LockFlag=DontLock               SegmentLength=${4}
43&{DONTLOCK_INVALID_LEN}           LockFlag=DontLock               SegmentLength=${5}
44&{DONTLOCK_INVALID_LEN_BOOL}      LockFlag=DONTLOCK               SegmentLength=${False}
45&{DONTLOCK_INVALID_LOCKFLAG}      LOCKFLAG=LockAll                SegmentLength=${4}
46
47@{ONE_SEG_FLAG_ALL}               ${LOCKALL_LEN1}
48@{ONE_SEG_FLAG_SAME}              ${LOCKSAME_LEN3}
49@{ONE_SEG_FLAG_DONT}              ${DONTLOCK_LEN4}
50
51@{TWO_SEG_FLAG_1}                 ${LOCKALL_LEN1}                 ${LOCKSAME_LEN2}
52@{TWO_SEG_FLAG_2}                 ${DONTLOCK_LEN3}                ${LOCKALL_LEN1}
53@{TWO_SEG_FLAG_3}                 ${DONTLOCK_LEN4}                ${LOCKSAME_LEN3}
54@{TWO_SEG_FLAG_4}                 ${DONTLOCK_INVALID_LEN}         ${LOCKSAME_LEN3}
55@{TWO_SEG_FLAG_5}                 ${DONTLOCK_LEN2}                ${LOCKSAME_INVALID_LEN1}
56
57@{TWO_SEG_FLAG_INVALID1}          ${DONTLOCK_LEN4}                ${LOCKSAME_INVALID_LEN1}
58@{TWO_SEG_FLAG_INVALID2}          ${LOCKALL_LEN5}                 ${DONTLOCK_LEN1}
59@{TWO_SEG_FLAG_INVALID3}          ${DONTLOCK_LEN1}                ${LOCKALL_INVALID_LOCKFLAG1}
60@{TWO_SEG_FLAG_INVALID4}          ${DONTLOCK_LEN2}                ${LOCKALL_INVALID_LOCKFLAG2}
61@{TWO_SEG_FLAG_INVALID5}          ${DONTLOCK_LEN2}                ${LOCKALL_INVALID_LOCKFLAG3}
62@{TWO_SEG_FLAG_INVALID6}          ${LOCKALL_LEN3}                 ${LOCKSAME_INVALID_LOCKFLAG3}
63@{TWO_SEG_FLAG_INVALID7}          ${DONTLOCK_LEN2}                ${LOCKSAME_INVALID_LOCKFLAG4}
64@{TWO_SEG_FLAG_INVALID8}          ${DONTLOCK_INVALID_LOCKFLAG}    ${LOCKSAME_INVALID_LEN_BOOL}
65@{TWO_SEG_FLAG_INVALID9}          ${DONTLOCK_LEN2}                ${LOCKSAME_INVALID_LOCKFLAG4}
66
67@{THREE_SEG_FLAG_1}               ${LOCKALL_LEN1}                 @{TWO_SEG_FLAG_3}
68@{THREE_SEG_FLAG_2}               ${LOCKSAME_LEN4}                @{TWO_SEG_FLAG_2}
69@{THREE_SEG_FLAG_3}               ${DONTLOCK_LEN3}                @{TWO_SEG_FLAG_1}
70
71@{FOUR_SEG_FLAG_1}                ${LOCKALL_LEN1}                 @{THREE_SEG_FLAG_2}
72@{FOUR_SEG_FLAG_2}                ${LOCKSAME_LEN4}                @{THREE_SEG_FLAG_3}
73@{FOUR_SEG_FLAG_3}                ${DONTLOCK_LEN3}                @{THREE_SEG_FLAG_1}
74
75@{FIVE_SEG_FLAG_1}                ${LOCKALL_LEN1}                 @{FOUR_SEG_FLAG_2}
76@{FIVE_SEG_FLAG_2}                ${LOCKSAME_LEN4}                @{FOUR_SEG_FLAG_3}
77@{FIVE_SEG_FLAG_3}                ${DONTLOCK_LEN3}                @{FOUR_SEG_FLAG_1}
78
79@{SIX_SEG_FLAG_1}                 ${LOCKALL_LEN1}                 @{FIVE_SEG_FLAG_2}
80@{SIX_SEG_FLAG_2}                 ${LOCKSAME_LEN4}                @{FIVE_SEG_FLAG_3}
81@{SIX_SEG_FLAG_3}                 ${DONTLOCK_LEN3}                @{FIVE_SEG_FLAG_1}
82
83@{SEVEN_SEG_FLAG_1}               ${LOCKALL_LEN1}                 @{SIX_SEG_FLAG_2}
84@{SEVEN_SEG_FLAG_2}               ${LOCKSAME_LEN4}                @{SIX_SEG_FLAG_3}
85@{SEVEN_SEG_FLAG_3}               ${DONTLOCK_LEN3}                @{SIX_SEG_FLAG_1}
86
87# Different messages to be verified.
88${PROP_REQ_ERR}         is a required property and must be included in the request.
89${PROP_ERR}             is not in the list of valid properties for the resource.
90${PROP_TYPE_ERR}        is of a different type than the property can accept.
91
92# Build error patterns list.
93@{EMPTY_LIST}
94@{ERR_PATTERN1}                   ${PROP_REQ_ERR}                ${PROP_ERR}
95@{ERR_PATTERN2}                   ${PROP_TYPE_ERR}
96@{ERR_PATTERN3}                   ${PROP_REQ_ERR}                ${PROP_ERR}                 ${PROP_TYPE_ERR}
97
98# Dictionary of Locks with Transaction ID as key and Session ID as a value.
99&{LOCKS}
100
101
102*** Test Cases ***
103
104Acquire And Release Different Read Locks
105    [Documentation]  Acquire and release different read locks.
106    [Tags]  Acquire_And_Release_Different_Read_Locks
107    [Template]  Acquire And Release Lock
108
109    # lock  seg_flags                     resource_id  hmc_id  exp_status_code      err_msgs         new_sess
110    # type                                                                                            req
111    Read    ${ONE_SEG_FLAG_ALL}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
112    Read    ${ONE_SEG_FLAG_SAME}          ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
113    Read    ${ONE_SEG_FLAG_DONT}          ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
114    Read    ${TWO_SEG_FLAG_1}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
115    Read    ${TWO_SEG_FLAG_2}             ${234}       hmc-id  ${HTTP_OK}           ${EMPTY_LIST}    ${True}
116    Read    ${TWO_SEG_FLAG_3}             ${234}       hmc-id  ${HTTP_OK}           ${EMPTY_LIST}    ${True}
117    Read    ${TWO_SEG_FLAG_4}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
118    Read    ${TWO_SEG_FLAG_5}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
119    Read    ${THREE_SEG_FLAG_1}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
120    Read    ${THREE_SEG_FLAG_2}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
121    Read    ${THREE_SEG_FLAG_3}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
122    Read    ${FOUR_SEG_FLAG_1}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
123    Read    ${FOUR_SEG_FLAG_2}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
124    Read    ${FOUR_SEG_FLAG_3}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
125    Read    ${FIVE_SEG_FLAG_1}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
126    Read    ${FIVE_SEG_FLAG_2}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
127    Read    ${FIVE_SEG_FLAG_3}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
128    Read    ${SIX_SEG_FLAG_1}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
129    Read    ${SIX_SEG_FLAG_2}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
130    Read    ${SIX_SEG_FLAG_3}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
131    Read    ${SEVEN_SEG_FLAG_1}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
132    Read    ${SEVEN_SEG_FLAG_2}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
133    Read    ${SEVEN_SEG_FLAG_3}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
134    Read    ${LOCKSAME_INVALID_LEN1}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
135    Read    ${LOCKSAME_INVALID_LEN_STR}   ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN2}  ${True}
136    Read    ${LOCKSAME_INVALID_LEN_NEG}   ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN2}  ${True}
137    Read    ${LOCKSAME_INVALID_LEN_BOOL}  ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN2}  ${True}
138    Read    ${DONTLOCK_INVALID_LEN_BOOL}  ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN2}  ${True}
139    Read    ${TWO_SEG_FLAG_INVALID1}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
140    Read    ${TWO_SEG_FLAG_INVALID2}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
141    Read    ${TWO_SEG_FLAG_INVALID3}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
142    Read    ${TWO_SEG_FLAG_INVALID4}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${EMPTY_LIST}    ${True}
143    Read    ${TWO_SEG_FLAG_INVALID5}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN1}  ${True}
144    Read    ${TWO_SEG_FLAG_INVALID6}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN1}  ${True}
145    Read    ${TWO_SEG_FLAG_INVALID7}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN3}  ${True}
146    Read    ${TWO_SEG_FLAG_INVALID8}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN1}  ${True}
147    Read    ${TWO_SEG_FLAG_INVALID9}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN2}  ${True}
148    Read    ${TWO_SEG_FLAG_3}             234          hmc-id  ${HTTP_BAD_REQUEST}  ${ERR_PATTERN2}  ${True}
149
150
151Acquire And Release Different Write Locks
152    [Documentation]  Acquire and release different write locks.
153    [Tags]  Acquire_And_Release_Different_Write_Locks
154    [Template]  Acquire And Release Lock
155
156    # lock  seg_flags                    resource_id  hmc_id  exp_status_code       err_msgs         new_sess
157    # type                                                                                            req
158    Write  ${ONE_SEG_FLAG_ALL}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
159    Write  ${ONE_SEG_FLAG_SAME}          ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
160    Write  ${ONE_SEG_FLAG_DONT}          ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
161    Write  ${TWO_SEG_FLAG_1}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
162    Write  ${TWO_SEG_FLAG_2}             ${234}       hmc-id  ${HTTP_OK}            ${EMPTY_LIST}    ${True}
163    Write  ${TWO_SEG_FLAG_3}             ${234}       hmc-id  ${HTTP_OK}            ${EMPTY_LIST}    ${True}
164    Write  ${TWO_SEG_FLAG_INVALID4}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
165    Write  ${THREE_SEG_FLAG_1}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
166    Write  ${THREE_SEG_FLAG_2}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
167    Write  ${THREE_SEG_FLAG_3}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
168    Write  ${FOUR_SEG_FLAG_1}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
169    Write  ${FOUR_SEG_FLAG_2}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
170    Write  ${FOUR_SEG_FLAG_3}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
171    Write  ${FIVE_SEG_FLAG_1}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
172    Write  ${FIVE_SEG_FLAG_2}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
173    Write  ${FIVE_SEG_FLAG_3}            ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
174    Write  ${SIX_SEG_FLAG_1}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
175    Write  ${SIX_SEG_FLAG_2}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
176    Write  ${SIX_SEG_FLAG_3}             ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
177    Write  ${SEVEN_SEG_FLAG_1}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
178    Write  ${SEVEN_SEG_FLAG_2}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
179    Write  ${SEVEN_SEG_FLAG_3}           ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
180    Write  ${LOCKSAME_INVALID_LEN1}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
181    Write  ${LOCKSAME_INVALID_LEN_STR}   ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
182    Write  ${LOCKSAME_INVALID_LEN_NEG}   ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
183    Write  ${LOCKSAME_INVALID_LEN_BOOL}  ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
184    Write  ${DONTLOCK_INVALID_LEN_BOOL}  ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
185    Write  ${TWO_SEG_FLAG_INVALID1}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
186    Write  ${TWO_SEG_FLAG_INVALID2}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${EMPTY_LIST}    ${True}
187    Write  ${TWO_SEG_FLAG_INVALID8}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${ERR_PATTERN1}  ${True}
188    Write  ${TWO_SEG_FLAG_INVALID5}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${ERR_PATTERN1}  ${True}
189    Write  ${TWO_SEG_FLAG_INVALID9}      ${234}       hmc-id  ${HTTP_BAD_REQUEST}   ${ERR_PATTERN2}  ${True}
190    Write  ${TWO_SEG_FLAG_3}             234          hmc-id  ${HTTP_BAD_REQUEST}   ${ERR_PATTERN2}  ${True}
191
192
193Verify GetLockList Returns An Empty Record For An Invalid Session Id
194    [Documentation]  Verify GetLockList returns an empty record for an invalid session id.
195    [Tags]  Verify_GetLockList_Returns_An_Empty_Record_For_An_Invalid_Session_Id
196
197    ${resp}=  Redfish Login  kwargs= "Oem":{"OpenBMC" : {"ClientID":"${hmc_id}"}}
198
199    ${records}=  Get Locks List  ${resp['Id']}
200    ${records}=  Get Locks List  ZZzZZz9zzZ
201    ${length}=  Get Length  ${records}
202    Should Be Equal  ${length}  ${0}
203
204
205Verify Lock Conflicts
206    [Documentation]  Verify lock conflicts.
207    [Tags]  Verify_Lock_Conflicts
208    [Template]  Acquire And Release Lock
209
210    Write  ${TWO_SEG_FLAG_2}  ${234}  hmc-id  ${HTTP_OK}        ['NA']  ${True}
211    Read   ${TWO_SEG_FLAG_2}  ${234}  hmc-id  ${HTTP_CONFLICT}  ['NA']  ${False}
212    Read   ${TWO_SEG_FLAG_2}  ${234}  hmc-id  ${HTTP_OK}        ['NA']  ${True}
213    Write  ${TWO_SEG_FLAG_2}  ${234}  hmc-id  ${HTTP_CONFLICT}  ['NA']  ${False}
214    Write  ${TWO_SEG_FLAG_2}  ${234}  hmc-id  ${HTTP_OK}        ['NA']  ${True}
215    Write  ${TWO_SEG_FLAG_2}  ${234}  hmc-id  ${HTTP_CONFLICT}  ['NA']  ${False}
216
217
218Verify Persistency Of Read Locks After BMC Reboot
219    [Documentation]  Verify persistency of locks after BMC reboot.
220    [Tags]  Verify_Persistency_Of_Read_Locks_After_BMC_Reboot
221    [Template]  Locks Persistency Check After BMC Reboot
222
223    # lock_type  seg_flags          resource_id
224    Read         ${TWO_SEG_FLAG_2}  ${234}
225
226
227Verify Persistency Of Write Locks After BMC Reboot
228    [Documentation]  Verify persistency of locks after BMC reboot.
229    [Tags]  Verify_Persistency_Of_Write_Locks_After_BMC_Reboot
230    [Template]  Locks Persistency Check After BMC Reboot
231
232    # lock_type  seg_flags          resource_id
233    Write        ${TWO_SEG_FLAG_2}  ${234}
234
235
236Verify Valid Lock Transactions Release
237    [Documentation]  Verify valid lock transactions release.
238    [Tags]  Verify_Valid_Lock_Transactions_Release
239
240    ${transaction_id1}=  Acquire Lock On A Given Resource  Read  ${TWO_SEG_FLAG_2}  ${234}
241    ${locks_before}=  Get Locks List  ${SESSION_ID}
242
243    ${transaction_id2}=  Acquire Lock On A Given Resource  Read  ${TWO_SEG_FLAG_3}  ${234}
244    ${transaction_id3}=  Acquire Lock On A Given Resource  Read  ${TWO_SEG_FLAG_2}  ${234}
245    ${transaction_id4}=  Acquire Lock On A Given Resource  Read  ${TWO_SEG_FLAG_3}  ${234}
246
247    ${transaction_ids}=  Create List  ${transaction_id2}  ${transaction_id3}  ${transaction_id4}
248    Release Locks  ${transaction_ids}
249    ${locks_after}=  Get Locks List  ${SESSION_ID}
250    Should Be Equal  ${locks_before}  ${locks_after}
251
252
253Verify Invalid Lock Transactions Release
254    [Documentation]  Verify invalid lock transactions release.
255    [Tags]  Verify_Invalid_Lock_Transactions_Release
256
257    ${transaction_id1}=  Acquire Lock On A Given Resource  Read  ${TWO_SEG_FLAG_2}  ${234}
258    ${locks_before}=  Get Locks List  ${SESSION_ID}
259
260    ${transaction_id2}=  Evaluate  ${transaction_id1} + 1
261    ${transaction_id3}=  Evaluate  ${transaction_id1} - 1
262    ${transaction_ids}=  Create List  ${transaction_id2}  ${transaction_id1}  ${transaction_id3}
263
264    # If any transaction/s in the list does not belong to current session then it will be a bad request.
265    Release Locks  ${transaction_ids}  exp_status_code=${HTTP_BAD_REQUEST}
266    ${locks_after}=  Get Locks List  ${SESSION_ID}
267    Should Be Equal  ${locks_before}  ${locks_after}
268
269
270Verify Locks Release By Session
271    [Documentation]  Verify locks release by session.
272    [Tags]  Verify_Locks_Release_By_Session
273
274    ${locks_before}=  Get Locks List  ${SESSION_ID}
275    ${transaction_id1}=  Acquire Lock On A Given Resource  Write  ${TWO_SEG_FLAG_2}  ${234}
276
277    # Release Lock by Session without mentioning transaction_ids.
278    Release Locks  release_type=Session
279    ${locks_after}=  Get Locks List  ${SESSION_ID}
280    Should Be Equal  ${locks_before}  ${locks_after}
281
282    ${transaction_id1}=  Acquire Lock On A Given Resource  Read  ${TWO_SEG_FLAG_2}  ${234}
283    ${transaction_id2}=  Acquire Lock On A Given Resource  Read  ${TWO_SEG_FLAG_3}  ${234}
284    ${transaction_ids}=  Create List  ${transaction_id1}  ${transaction_id2}
285
286    # Release Lock by Session by mentioning transaction_ids also in the request.
287    Release Locks  ${transaction_ids}  release_type=Session
288
289
290Verify Locks Created By One Session Cannot Be Deleted By Another Session
291    [Documentation]  Verify locks created by one session cannot be deleted by another session.
292    [Tags]  Verify_Locks_Created_By_One_Session_Cannot_Be_Deleted_By_Another_Session
293    [Setup]  No Operation
294
295    ${resp}=  Redfish Login  kwargs= "Oem":{"OpenBMC" : {"ClientID":"hmc-id"}}
296    Set Test Variable  ${SESSION_ID}  ${resp['Id']}
297    ${transaction_id1}=  Acquire Lock On A Given Resource  Read  ${TWO_SEG_FLAG_2}  ${234}
298    ${locks_tran1}=  Get Locks List  ${resp['Id']}
299
300    ${resp}=  Redfish Login  kwargs= "Oem":{"OpenBMC" : {"ClientID":"hmc-id"}}
301    Set Test Variable  ${SESSION_ID}  ${resp['Id']}
302
303    ${transaction_id2}=  Acquire Lock On A Given Resource  Read  ${TWO_SEG_FLAG_3}  ${234}
304    ${locks_before}=  Get Locks List  ${resp['Id']}
305
306    ${transaction_ids}=  Create List  ${transaction_id1}  ${transaction_id2}
307    Release Locks  ${transaction_ids}  exp_status_code=${HTTP_UNAUTHORIZED}  conflict_record=${locks_tran1}
308    ${locks_after}=  Get Locks List  ${SESSION_ID}
309    Should Be Equal  ${locks_before}  ${locks_after}
310
311    # When release_type=Session, transaction_ids should be ignored.
312    Release Locks  ${transaction_ids}  release_type=Session
313    ${locks_after}=  Get Locks List  ${SESSION_ID}
314    Should Be Equal  ${EMPTY_LIST}  ${locks_after}
315
316
317*** Keywords ***
318
319Locks Persistency Check After BMC Reboot
320    [Documentation]  Locks persistency check after BMC reboot.
321    [Arguments]  ${lock_type}  ${seg_flags}  ${resource_id}
322
323    # Description of argument(s):
324    # lock_type    Type of lock (Read/Write).
325    # seg_flags    Segmentation Flags to identify lock elements under system level in the hierarchy.
326    # resource_id  Decimal +ve integer value of maximum 8 hex bytes.  Ex: 134, 2048 etc.
327
328    ${transaction_id}=  Acquire Lock On A Given Resource  ${lock_type}  ${seg_flags}  ${resource_id}
329
330    ${locks_prev}=  Get Locks List  ${SESSION_ID}
331
332    Redfish OBMC Reboot (off)
333    Redfish Login
334
335    ${locks_curr}=  Get Locks List  ${SESSION_ID}
336    Should Be Equal  ${locks_prev}  ${locks_curr}
337
338    ${transaction_ids}=  Create List  ${transaction_id}
339    Release Locks  ${transaction_ids}
340
341
342Return Data Dictionary For Single Request
343    [Documentation]  Return data dictionary for single request.
344    [Arguments]  ${lock_type}  ${seg_flags}  ${resource_id}
345
346    # Description of argument(s):
347    # lock_type    Type of lock (Read/Write).
348    # seg_flags    Segmentation Flags to identify lock elements under system level in the hierarchy.
349    # resource_id  Decimal +ve integer value of maximum 8 hex bytes.  Ex: 134, 2048 etc.
350
351    ${SEG_FLAGS_LOCK}=  Create Dictionary
352    ...  LockType=${lock_type}
353    ...  SegmentFlags=@{seg_flags}
354    ...  ResourceID=${resource_id}
355
356    ${SEG_FLAGS_ENTRIES}=  Create List  ${SEG_FLAGS_LOCK}
357    ${LOCK_REQUEST}=  Create Dictionary  Request=${SEG_FLAGS_ENTRIES}
358    Log To Console  \n ${LOCK_REQUEST}
359
360    [Return]  ${LOCK_REQUEST}
361
362
363Acquire Lock On A Given Resource
364    [Documentation]  Acquire lock on a given resource.
365    [Arguments]  ${lock_type}  ${seg_flags}  ${resource_id}  ${exp_status_code}=${HTTP_OK}
366    ...  ${err_msgs}=${EMPTY_LIST}
367
368    # Description of argument(s):
369    # lock_type        Type of lock (Read/Write).
370    # seg_flags        Segmentation Flags to identify lock elements under system level in the hierarchy.
371    #                  Ex:  [{'LockFlag': 'LockAll', 'SegmentLength': 1},
372    #                        {'LockFlag': 'LockSame', 'SegmentLength': 2}]
373    # resource_id      Decimal +ve integer value of maximum 8 hex bytes.  Ex: 134, 2048 etc.
374    # exp_status_code  Expected status code from the AcquireLock request for given inputs.
375    # err_msgs         List of expected error messages.
376
377    ${data}=  Return Data Dictionary For Single Request  ${lock_type}  ${seg_flags}  ${resource_id}
378    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.AcquireLock  data=${data}
379
380    ${transaction_id}=  Run Keyword If  ${exp_status_code} != ${HTTP_OK}
381    ...      Set Variable  ${0}
382    ...  ELSE
383    ...     Load Lock Record And Build Transaction To Session Map  ${resp.text}
384
385    Run Keyword If  ${exp_status_code} == ${HTTP_CONFLICT} and ${err_msgs} == ['NA']
386    ...      Load Response And Verify Conflict  ${resp.text}  ${SESSION_ID}
387    ...  ELSE  Run Keyword If  ${exp_status_code} != ${HTTP_OK} and ${err_msgs} != ${EMPTY_LIST}
388    ...     Load Response And Verify Error  ${resp.text}  err_msgs=${err_msgs}
389
390    Append Transaction Id And Session Id To Locks Dictionary  ${transaction_id}
391
392    [Return]  ${transaction_id}
393
394
395Load Lock Record And Build Transaction To Session Map
396    [Documentation]  Load lock record and build transaction to session map.
397    [Arguments]  ${resp_text}
398
399    # Description of argument(s):
400    # resp_text  Response test from a REST request.
401
402    ${acquire_lock}=  Evaluate  json.loads('''${resp_text}''')  json
403    Append Transaction Id And Session Id To Locks Dictionary  ${acquire_lock["TransactionID"]}
404
405    [Return]  ${acquire_lock["TransactionID"]}
406
407
408Load Response And Verify Error
409    [Documentation]  Load response and verify error.
410    [Arguments]  ${error_resp}  ${err_msgs}=${EMPTY_LIST}
411
412    # Description of argument(s):
413    # error_resp  Error response from a REST request.
414    # err_msgs    List of error msg patterns.
415
416    ${error_resp}=  Replace String  ${error_resp}  \"  \\"
417    ${error_response}=  Evaluate  json.loads('''${error_resp}''')  json
418
419    ${errors}=  Get Dictionary Values  ${error_response}
420    ${extended_errors}=  Create List
421
422    FOR  ${error}  IN  @{errors}
423      Append To List  ${extended_errors}  ${error[0]["Message"]}
424    END
425
426    Log To Console  \n ${extended_errors}
427
428    FOR  ${exp_error}  IN  @{err_msgs}
429        Run Keyword  Expect List Of Errors In An Extended Errors  ${exp_error}  ${extended_errors}
430    END
431
432
433Expect List Of Errors In An Extended Errors
434    [Documentation]  Expect list of errors in an extended errors.
435    [Arguments]  ${exp_error}  ${extended_errors}=${EMPTY_LIST}
436
437    ${found}=  Set Variable  ${False}
438
439    FOR  ${error_record}  IN  @{extended_errors}
440      ${found}=  Evaluate  '${exp_error}' in '${error_record}'
441      Exit For Loop If  ${found} == ${True}
442    END
443
444    Should Be True  ${found}
445
446
447Append Transaction Id And Session Id To Locks Dictionary
448    [Documentation]  Append transaction id and session id to locks dictionary.
449    [Arguments]  ${transaction_id}
450
451    # Description of argument(s):
452    # transaction_id  Transaction ID created from acquire lock request. Ex: 8, 9 etc.
453
454    Set To Dictionary  ${LOCKS}  ${${transaction_id}}  ${session_id}
455
456
457Get Locks List
458    [Documentation]  Get locks list.
459    [Arguments]  @{sessions}  ${exp_status_code}=${HTTP_OK}
460
461    # Description of argument(s):
462    # sessions         List of comma separated strings. Ex: ["euHoAQpvNe", "ecTjANqwFr"]
463    # exp_status_code  expected status code from the GetLockList request for given inputs.
464
465    ${sessions}=  Evaluate  json.dumps(${sessions})  json
466    ${data}=  Set Variable  {"SessionIDs": ${sessions}}
467    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.GetLockList
468    ...  data=${data}
469    ${locks}=  Evaluate  json.loads('''${resp.text}''')  json
470
471    [Return]  ${locks["Records"]}
472
473
474Release Locks
475    [Documentation]  Release locks.
476    [Arguments]  ${transaction_ids}=${EMPTY_LIST}  ${release_type}=Transaction  ${exp_status_code}=${HTTP_OK}
477    ...  ${conflict_record}=${EMPTY_LIST}
478
479    # Description of argument(s):
480    # transaction_ids  List of transaction ids or session ids. Ex: [15, 18]  or ["euHoAQpvNe", "ecTjANqwFr"]
481    # release_type     Release all locks acquired using current session or only given transaction numbers.
482    #                  Ex:  Session,  Transaction.  Default will be Transaction.
483    # exp_status_code  expected status code from the ReleaseLock request for given inputs.
484    # conflict_record  Expected conflict record.
485
486    # When release_type=Session then TransactionIDs list will be ignored.
487    ${data}=  Set Variable  {"Type": "${release_type}", "TransactionIDs": ${transaction_ids}}
488    ${data}=  Evaluate  json.dumps(${data})  json
489    ${resp}=  Redfish Post Request  /ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock  data=${data}
490    Should Be True  ${resp.status_code}  ${exp_status_code}
491    Return From Keyword If  ${conflict_record} == ${EMPTY_LIST}
492
493    ${conflict}=  Evaluate  json.loads('''${resp.text}''')  json
494
495    # Example of conflict
496    # {
497    #    "Record":{
498    #       "HMCID":"hmc-id",
499    #       "LockType":"Read",
500    #       "ResourceID":234,
501    #       "SegmentFlags":[
502    #          {
503    #             "LockFlag":"DontLock",
504    #             "SegmentLength":3
505    #          },
506    #          {
507    #             "LockFlag":"LockAll",
508    #             "SegmentLength":1
509    #          }
510    #       ],
511    #       "SessionID":"OorUVwrXuT",
512    #       "TransactionID":47
513    #    }
514    # }
515
516    Should Be Equal  ${conflict_record[0]}  ${conflict["Record"]}
517
518
519Verify Lock Record
520    [Documentation]  Verify lock record.
521    [Arguments]  ${lock_found}  &{lock_records}
522
523    # Description of argument(s):
524    # lock_found    True if lock record is expected to be present, else False.
525    # lock_records  A dictionary containing key value pairs of a lock record.
526
527    ${session}=  Get From Dictionary  ${LOCKS}  ${lock_records["TransactionID"]}
528    ${locks}=  Get Locks List  ${session}
529
530    ${lock_record_found}=  Set Variable  ${False}
531
532    FOR  ${record}  IN  @{locks}
533      ${record}=  Evaluate  json.dumps(${record})  json
534      ${record}=  Evaluate  json.loads('''${record}''')  json
535      ${lock_record_found}=  Set Variable If  ${record["TransactionID"]} == ${lock_records["TransactionID"]}
536      ...  ${True}  ${False}
537
538      Continue For Loop If  ${lock_record_found} == ${False}
539      Dictionaries Should Be Equal  ${record}  ${lock_records}
540      Exit For Loop
541    END
542
543    Should Be Equal  ${lock_record_found}  ${lock_found}
544
545
546Load Response And Verify Conflict
547    [Documentation]  Load response and verify conflict.
548    [Arguments]  ${conflict_resp}  ${sessions}
549
550    # Description of argument(s):
551    # conflict_resp  Conflict response from a REST request.
552    #                Example : { "Record": { "HMCID": "hmc-id", "LockType": "Write", "ResourceID": 234,
553    #                            "SegmentFlags": [ { "LockFlag": "DontLock", "SegmentLength": 3},
554    #                                              { "LockFlag": "LockAll",  "SegmentLength": 1}],
555    #                            "SessionID": "B6geYEdo6T", "TransactionID": 104 } }
556    # sessions       Comma separated list of sessions
557
558    ${curr_locks}=  Get Locks List  ${sessions}
559    ${conflict_resp}=  Replace String  ${conflict_resp}  \"  \\"
560    ${conflict_response}=  Evaluate  json.loads('''${conflict_resp}''')  json
561
562    ${conflicts}=  Get Dictionary Values  ${conflict_response}
563    List Should Contain Value  ${conflicts}  ${PREV_INPUTS}
564
565
566Acquire And Release Lock
567    [Documentation]  Acquire and release lock.
568    [Arguments]  ${lock_type}  ${seg_flags}  ${resource_id}  ${hmc_id}  ${exp_status_code}=${HTTP_OK}
569    ...  ${err_msgs}=${EMPTY_LIST}  ${new_sess_req}=${True}
570
571    # Description of argument(s):
572    # lock_type        Type of lock (Read/Write).
573    # seg_flags        Segmentation Flags to identify lock elements under system level in the hierarchy.
574    #                  Ex:  [{'LockFlag': 'LockAll', 'SegmentLength': 1},
575    #                        {'LockFlag': 'LockSame', 'SegmentLength': 2}]
576    # resource_id      Decimal +ve integer value of maximum 8 hex bytes.  Ex: 134, 2048 etc.
577    # hmc_id           Hardware management console id.
578    # exp_status_code  Expected status code from the AcquireLock request for given inputs.
579    # err_msgs         List of expected error messages.
580    # new_sess_req     Create a new session before acquiring a lock if True.
581
582    # Delete the session.
583    Run Keyword If  ${new_sess_req} == ${True}  Delete All Redfish Sessions
584
585    # Get REST session to BMC.
586    Run Keyword If  ${new_sess_req} == ${True}  Create New Session
587
588    ${inputs}=  Create Dictionary
589    ...  LockType=${lock_type}
590    ...  ResourceID=${resource_id}
591    ...  SegmentFlags=${seg_flags}
592    ...  HMCID=${hmc_id}
593
594    ${transaction_id}=  Acquire Lock On A Given Resource  ${inputs["LockType"]}
595    ...  ${inputs["SegmentFlags"]}  ${inputs["ResourceID"]}  ${exp_status_code}  err_msgs=${err_msgs}
596
597    # Each lock request from a new session is saved so that for next lock request using same session
598    # can refer to previous lock data to verify conflict records if any.
599    Run Keyword If  ${new_sess_req} == ${True}  Set Test Variable Dictionary Of Previous Lock Request
600    ...  ${lock_type}  ${seg_flags}  ${resource_id}  ${hmc_id}  ${SESSION_ID}  ${transaction_id}
601
602    ${session}=  Get From Dictionary  ${LOCKS}  ${transaction_id}
603    Set To Dictionary  ${inputs}  TransactionID=${${transaction_id}}  SessionID=${session}
604
605    ${lock_found}=  Set Variable If  ${exp_status_code} == ${HTTP_OK}  ${True}  ${False}
606    Verify Lock Record  ${lock_found}  &{inputs}
607
608    Return From Keyword If  '${exp_status_code}' != '${HTTP_OK}' or ${err_msgs} == ['NA']
609    ${transaction_ids}=  Create List  ${transaction_id}
610    Release Locks  ${transaction_ids}
611    Verify Lock Record  ${False}  &{inputs}
612
613
614Create New Session
615    [Documentation]  Create new session.
616
617    ${resp}=  Redfish Login  kwargs= "Oem":{"OpenBMC" : {"ClientID":"${hmc_id}"}}
618    Set Test Variable  ${SESSION_ID}  ${resp['Id']}
619
620
621Test Teardown Execution
622    [Documentation]  Test teardown execution.
623
624    FFDC On Test Case Fail
625    Delete All Redfish Sessions
626
627
628Return Session Id And Session Key
629    [Documentation]  Return session id and sesion key.
630
631    ${session_location}=  Redfish.Get Session Location
632    ${session_id}=  Evaluate  os.path.basename($session_location)  modules=os
633    ${session_key}=  Redfish.Get Session Key
634
635    [Return]  ${session_id}  ${session_key}
636
637
638Test Setup Execution
639    [Documentation]  Test setup execution.
640
641    # This is a test constant value.
642    Set Test Variable  ${hmc_id}  hmc-id
643    Create New Session
644
645    Set Test Variable Dictionary Of Previous Lock Request
646    ...  ${EMPTY}  ${EMPTY_LIST}  ${EMPTY}  ${EMPTY}  ${EMPTY}  ${EMPTY}
647
648
649Set Test Variable Dictionary Of Previous Lock Request
650    [Documentation]  Set test variable dictionary of previous lock request.
651    [Arguments]  ${lock_type}  ${seg_flags}  ${resource_id}  ${hmc_id}  ${session_id}  ${transaction_id}
652
653    # Description of argument(s):
654    # lock_type            Type of lock (Read/Write).
655    # seg_flags            Segmentation Flags to identify lock elements under system level in the hierarchy.
656    #                      Ex:  [{'LockFlag': 'LockAll', 'SegmentLength': 1},
657    #                           {'LockFlag': 'LockSame', 'SegmentLength': 2}]
658    # resource_id          Decimal +ve integer value of maximum 8 hex bytes.  Ex: 134, 2048 etc.
659    # hmc_id               Hardware management console id.
660    # session_id           Session id of the transaction.
661    # transaction_id       Transaction_id of the lock request.
662
663    ${prev_inputs}=  Create Dictionary
664    ...  LockType=${lock_type}
665    ...  ResourceID=${resource_id}
666    ...  SegmentFlags=${seg_flags}
667    ...  HMCID=${hmc_id}
668    ...  SessionID=${session_id}
669    ...  TransactionID=${transaction_id}
670
671    Set Test Variable  ${PREV_INPUTS}  ${prev_inputs}
672