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