| *** Settings *** |
| |
| Documentation Test Lock Management feature of Management Console on BMC. |
| |
| Resource ../../lib/resource.robot |
| Resource ../../lib/bmc_redfish_resource.robot |
| Resource ../../lib/openbmc_ffdc.robot |
| |
| Test Setup Test Setup Execution |
| Test Teardown Test Teardown Execution |
| |
| *** Variables *** |
| |
| # Data-sets for testing different test cases. |
| &{LOCKALL_LEN1} LockFlag=LockAll SegmentLength=${1} |
| &{LOCKALL_LEN2} LockFlag=LockAll SegmentLength=${2} |
| &{LOCKALL_LEN3} LockFlag=LockAll SegmentLength=${3} |
| &{LOCKALL_LEN4} LockFlag=LockAll SegmentLength=${4} |
| &{LOCKALL_LEN5} LockFlag=LockAll SegmentLength=${5} |
| |
| &{LOCKALL_INVALID_LOCKFLAG1} LockFlag=LocAll SegmentLength=${2} |
| &{LOCKALL_INVALID_LOCKFLAG2} LockFlag=LOCKALL SegmentLength=${3} |
| &{LOCKALL_INVALID_LOCKFLAG3} LOCKFLAG=LockAll SegmentLength=${4} |
| &{LOCKSAME_INVALID_LOCKFLAG3} Lock=LockSame SegmentLength=${1} |
| &{LOCKSAME_INVALID_LOCKFLAG4} Lock=LockSame SegmentLength=${True} |
| |
| &{LOCKSAME_LEN1} LockFlag=LockSame SegmentLength=${1} |
| &{LOCKSAME_LEN2} LockFlag=LockSame SegmentLength=${2} |
| &{LOCKSAME_LEN3} LockFlag=LockSame SegmentLength=${3} |
| &{LOCKSAME_LEN4} LockFlag=LockSame SegmentLength=${4} |
| &{LOCKSAME_INVALID_LEN1} LockFlag=LockSame SegmentLength=${0} |
| &{LOCKSAME_INVALID_LEN2} LockFlag=LockSame SegmentLength=${5} |
| &{LOCKSAME_INVALID_LEN_STR} LockFlag=LockSame SegmentLength=2 |
| &{LOCKSAME_INVALID_LEN_NEG} LockFlag=LockSame SegmentLength=${-3} |
| &{LOCKSAME_INVALID_LEN_BOOL} Lock=LockSame SegmentLength=${True} |
| |
| &{DONTLOCK_LEN1} LockFlag=DontLock SegmentLength=${1} |
| &{DONTLOCK_LEN2} LockFlag=DontLock SegmentLength=${2} |
| &{DONTLOCK_LEN3} LockFlag=DontLock SegmentLength=${3} |
| &{DONTLOCK_LEN4} LockFlag=DontLock SegmentLength=${4} |
| &{DONTLOCK_INVALID_LEN} LockFlag=DontLock SegmentLength=${5} |
| &{DONTLOCK_INVALID_LEN_BOOL} LockFlag=DONTLOCK SegmentLength=${False} |
| &{DONTLOCK_INVALID_LOCKFLAG} LOCKFLAG=LockAll SegmentLength=${4} |
| |
| @{ONE_SEG_FLAG_ALL} ${LOCKALL_LEN1} |
| @{ONE_SEG_FLAG_SAME} ${LOCKSAME_LEN3} |
| @{ONE_SEG_FLAG_DONT} ${DONTLOCK_LEN4} |
| |
| @{TWO_SEG_FLAG_1} ${LOCKALL_LEN1} ${LOCKSAME_LEN2} |
| @{TWO_SEG_FLAG_2} ${DONTLOCK_LEN3} ${LOCKALL_LEN1} |
| @{TWO_SEG_FLAG_3} ${DONTLOCK_LEN4} ${LOCKSAME_LEN3} |
| @{TWO_SEG_FLAG_4} ${DONTLOCK_INVALID_LEN} ${LOCKSAME_LEN3} |
| @{TWO_SEG_FLAG_5} ${DONTLOCK_LEN2} ${LOCKSAME_INVALID_LEN1} |
| |
| @{TWO_SEG_FLAG_INVALID1} ${DONTLOCK_LEN4} ${LOCKSAME_INVALID_LEN1} |
| @{TWO_SEG_FLAG_INVALID2} ${LOCKALL_LEN5} ${DONTLOCK_LEN1} |
| @{TWO_SEG_FLAG_INVALID3} ${DONTLOCK_LEN1} ${LOCKALL_INVALID_LOCKFLAG1} |
| @{TWO_SEG_FLAG_INVALID4} ${DONTLOCK_LEN2} ${LOCKALL_INVALID_LOCKFLAG2} |
| @{TWO_SEG_FLAG_INVALID5} ${DONTLOCK_LEN2} ${LOCKALL_INVALID_LOCKFLAG3} |
| @{TWO_SEG_FLAG_INVALID6} ${LOCKALL_LEN3} ${LOCKSAME_INVALID_LOCKFLAG3} |
| @{TWO_SEG_FLAG_INVALID7} ${DONTLOCK_LEN2} ${LOCKSAME_INVALID_LOCKFLAG4} |
| @{TWO_SEG_FLAG_INVALID8} ${DONTLOCK_INVALID_LOCKFLAG} ${LOCKSAME_INVALID_LEN_BOOL} |
| @{TWO_SEG_FLAG_INVALID9} ${DONTLOCK_LEN2} ${LOCKSAME_INVALID_LOCKFLAG4} |
| |
| @{THREE_SEG_FLAG_1} ${LOCKALL_LEN1} @{TWO_SEG_FLAG_3} |
| @{THREE_SEG_FLAG_2} ${LOCKSAME_LEN4} @{TWO_SEG_FLAG_2} |
| @{THREE_SEG_FLAG_3} ${DONTLOCK_LEN3} @{TWO_SEG_FLAG_1} |
| |
| @{FOUR_SEG_FLAG_1} ${LOCKALL_LEN1} @{THREE_SEG_FLAG_2} |
| @{FOUR_SEG_FLAG_2} ${LOCKSAME_LEN4} @{THREE_SEG_FLAG_3} |
| @{FOUR_SEG_FLAG_3} ${DONTLOCK_LEN3} @{THREE_SEG_FLAG_1} |
| |
| @{FIVE_SEG_FLAG_1} ${LOCKALL_LEN1} @{FOUR_SEG_FLAG_2} |
| @{FIVE_SEG_FLAG_2} ${LOCKSAME_LEN4} @{FOUR_SEG_FLAG_3} |
| @{FIVE_SEG_FLAG_3} ${DONTLOCK_LEN3} @{FOUR_SEG_FLAG_1} |
| |
| @{SIX_SEG_FLAG_1} ${LOCKALL_LEN1} @{FIVE_SEG_FLAG_2} |
| @{SIX_SEG_FLAG_2} ${LOCKSAME_LEN4} @{FIVE_SEG_FLAG_3} |
| @{SIX_SEG_FLAG_3} ${DONTLOCK_LEN3} @{FIVE_SEG_FLAG_1} |
| |
| @{SEVEN_SEG_FLAG_1} ${LOCKALL_LEN1} @{SIX_SEG_FLAG_2} |
| @{SEVEN_SEG_FLAG_2} ${LOCKSAME_LEN4} @{SIX_SEG_FLAG_3} |
| @{SEVEN_SEG_FLAG_3} ${DONTLOCK_LEN3} @{SIX_SEG_FLAG_1} |
| |
| # Different messages to be verified. |
| ${PROP_REQ_ERR} is a required property and must be included in the request. |
| ${PROP_ERR} is not in the list of valid properties for the resource. |
| ${PROP_TYPE_ERR} is of a different type than the property can accept. |
| |
| # Build error patterns list. |
| @{EMPTY_LIST} |
| @{ERR_PATTERN1} ${PROP_REQ_ERR} ${PROP_ERR} |
| @{ERR_PATTERN2} ${PROP_TYPE_ERR} |
| @{ERR_PATTERN3} ${PROP_REQ_ERR} ${PROP_ERR} ${PROP_TYPE_ERR} |
| |
| # Dictionary of Locks with Transaction ID as key and Session ID as a value. |
| &{LOCKS} |
| |
| |
| *** Test Cases *** |
| |
| Acquire And Release Different Read Locks |
| [Documentation] Acquire and release different read locks. |
| [Tags] Acquire_And_Release_Different_Read_Locks |
| [Template] Acquire And Release Lock |
| |
| # lock seg_flags resource_id hmc_id exp_status_code err_msgs new_sess |
| # type req |
| Read ${ONE_SEG_FLAG_ALL} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${ONE_SEG_FLAG_SAME} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${ONE_SEG_FLAG_DONT} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${TWO_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${TWO_SEG_FLAG_2} ${234} hmc-id ${HTTP_OK} ${EMPTY_LIST} ${True} |
| Read ${TWO_SEG_FLAG_3} ${234} hmc-id ${HTTP_OK} ${EMPTY_LIST} ${True} |
| Read ${TWO_SEG_FLAG_4} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${TWO_SEG_FLAG_5} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${THREE_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${THREE_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${THREE_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${FOUR_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${FOUR_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${FOUR_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${FIVE_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${FIVE_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${FIVE_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${SIX_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${SIX_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${SIX_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${SEVEN_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${SEVEN_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${SEVEN_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${LOCKSAME_INVALID_LEN1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${LOCKSAME_INVALID_LEN_STR} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN2} ${True} |
| Read ${LOCKSAME_INVALID_LEN_NEG} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN2} ${True} |
| Read ${LOCKSAME_INVALID_LEN_BOOL} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN2} ${True} |
| Read ${DONTLOCK_INVALID_LEN_BOOL} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN2} ${True} |
| Read ${TWO_SEG_FLAG_INVALID1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${TWO_SEG_FLAG_INVALID2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${TWO_SEG_FLAG_INVALID3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${TWO_SEG_FLAG_INVALID4} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Read ${TWO_SEG_FLAG_INVALID5} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN1} ${True} |
| Read ${TWO_SEG_FLAG_INVALID6} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN1} ${True} |
| Read ${TWO_SEG_FLAG_INVALID7} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN3} ${True} |
| Read ${TWO_SEG_FLAG_INVALID8} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN1} ${True} |
| Read ${TWO_SEG_FLAG_INVALID9} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN2} ${True} |
| Read ${TWO_SEG_FLAG_3} 234 hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN2} ${True} |
| |
| |
| Acquire And Release Different Write Locks |
| [Documentation] Acquire and release different write locks. |
| [Tags] Acquire_And_Release_Different_Write_Locks |
| [Template] Acquire And Release Lock |
| |
| # lock seg_flags resource_id hmc_id exp_status_code err_msgs new_sess |
| # type req |
| Write ${ONE_SEG_FLAG_ALL} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${ONE_SEG_FLAG_SAME} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${ONE_SEG_FLAG_DONT} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${TWO_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${TWO_SEG_FLAG_2} ${234} hmc-id ${HTTP_OK} ${EMPTY_LIST} ${True} |
| Write ${TWO_SEG_FLAG_3} ${234} hmc-id ${HTTP_OK} ${EMPTY_LIST} ${True} |
| Write ${TWO_SEG_FLAG_INVALID4} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${THREE_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${THREE_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${THREE_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${FOUR_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${FOUR_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${FOUR_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${FIVE_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${FIVE_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${FIVE_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${SIX_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${SIX_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${SIX_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${SEVEN_SEG_FLAG_1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${SEVEN_SEG_FLAG_2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${SEVEN_SEG_FLAG_3} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${LOCKSAME_INVALID_LEN1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${LOCKSAME_INVALID_LEN_STR} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${LOCKSAME_INVALID_LEN_NEG} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${LOCKSAME_INVALID_LEN_BOOL} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${DONTLOCK_INVALID_LEN_BOOL} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${TWO_SEG_FLAG_INVALID1} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${TWO_SEG_FLAG_INVALID2} ${234} hmc-id ${HTTP_BAD_REQUEST} ${EMPTY_LIST} ${True} |
| Write ${TWO_SEG_FLAG_INVALID8} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN1} ${True} |
| Write ${TWO_SEG_FLAG_INVALID5} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN1} ${True} |
| Write ${TWO_SEG_FLAG_INVALID9} ${234} hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN2} ${True} |
| Write ${TWO_SEG_FLAG_3} 234 hmc-id ${HTTP_BAD_REQUEST} ${ERR_PATTERN2} ${True} |
| |
| |
| Verify GetLockList Returns An Empty Record For An Invalid Session Id |
| [Documentation] Verify GetLockList returns an empty record for an invalid session id. |
| [Tags] Verify_GetLockList_Returns_An_Empty_Record_For_An_Invalid_Session_Id |
| |
| ${session_location}= Redfish.Get Session Location |
| ${session_id}= Evaluate os.path.basename($session_location) modules=os |
| |
| ${records}= Run Keyword Get Locks List ${session_id} |
| ${records}= Run Keyword Get Locks List ZZzZZz9zzZ |
| ${length}= Get Length ${records} |
| Should Be Equal ${length} ${0} |
| |
| |
| Verify Lock Conflicts |
| [Documentation] Verify lock conflicts. |
| [Tags] Verify_Lock_Conflicts |
| [Template] Acquire And Release Lock |
| |
| Write ${TWO_SEG_FLAG_2} ${234} hmc-id ${HTTP_OK} ['NA'] ${True} |
| Read ${TWO_SEG_FLAG_2} ${234} hmc-id ${HTTP_CONFLICT} ['NA'] ${False} |
| Read ${TWO_SEG_FLAG_2} ${234} hmc-id ${HTTP_OK} ['NA'] ${True} |
| Write ${TWO_SEG_FLAG_2} ${234} hmc-id ${HTTP_CONFLICT} ['NA'] ${False} |
| Write ${TWO_SEG_FLAG_2} ${234} hmc-id ${HTTP_OK} ['NA'] ${True} |
| Write ${TWO_SEG_FLAG_2} ${234} hmc-id ${HTTP_CONFLICT} ['NA'] ${False} |
| |
| |
| Verify Persistency Of Locks After BMC Reboot |
| [Documentation] Verify persistency of locks after BMC reboot. |
| [Tags] Verify_Persistency_Of_Locks_After_BMC_Reboot |
| [Template] Locks Persistency Check After BMC Reboot |
| |
| # lock_type seg_flags resource_id |
| Read ${TWO_SEG_FLAG_2} ${234} |
| Write ${TWO_SEG_FLAG_2} ${234} |
| |
| |
| Verify Valid Lock Transactions Release |
| [Documentation] Verify valid lock transactions release. |
| [Tags] Verify_Valid_Lock_Transactions_Release |
| |
| ${transaction_id1}= Acquire Lock On A Given Resource |
| ... Read ${TWO_SEG_FLAG_2} ${234} |
| ${locks_before}= Get Locks List ${SESSION_ID} |
| |
| ${transaction_id2}= Acquire Lock On A Given Resource |
| ... Read ${TWO_SEG_FLAG_3} ${234} |
| ${transaction_id3}= Acquire Lock On A Given Resource |
| ... Read ${TWO_SEG_FLAG_2} ${234} |
| ${transaction_id4}= Acquire Lock On A Given Resource |
| ... Read ${TWO_SEG_FLAG_3} ${234} |
| |
| ${transaction_ids}= Create List ${transaction_id2} ${transaction_id3} ${transaction_id4} |
| Release Locks ${transaction_ids} |
| ${locks_after}= Get Locks List ${SESSION_ID} |
| Should Be Equal ${locks_before} ${locks_after} |
| |
| |
| Verify Invalid Lock Transactions Release |
| [Documentation] Verify invalid lock transactions release. |
| [Tags] Verify_Invalid_Lock_Transactions_Release |
| |
| ${transaction_id1}= Acquire Lock On A Given Resource |
| ... Read ${TWO_SEG_FLAG_2} ${234} |
| ${locks_before}= Get Locks List ${SESSION_ID} |
| |
| ${transaction_id2}= Evaluate ${transaction_id1} + 1 |
| ${transaction_id3}= Evaluate ${transaction_id1} - 1 |
| ${transaction_ids}= Create List ${transaction_id2} ${transaction_id1} ${transaction_id3} |
| |
| # If any transaction/s in the list does not belong to current session then it will be a bad request. |
| Release Locks ${transaction_ids} exp_status_code=${HTTP_BAD_REQUEST} |
| ${locks_after}= Get Locks List ${SESSION_ID} |
| Should Be Equal ${locks_before} ${locks_after} |
| |
| |
| Verify Locks Release By Session |
| [Documentation] Verify locks release by session. |
| [Tags] Verify_Locks_Release_By_Session |
| |
| ${locks_before}= Get Locks List ${SESSION_ID} |
| ${transaction_id1}= Acquire Lock On A Given Resource |
| ... Write ${TWO_SEG_FLAG_2} ${234} |
| |
| # Release Lock by Session without mentioning transaction_ids. |
| Release Locks release_type=Session |
| ${locks_after}= Get Locks List ${SESSION_ID} |
| Should Be Equal ${locks_before} ${locks_after} |
| |
| ${transaction_id1}= Acquire Lock On A Given Resource |
| ... Read ${TWO_SEG_FLAG_2} ${234} |
| ${transaction_id2}= Acquire Lock On A Given Resource |
| ... Read ${TWO_SEG_FLAG_3} ${234} |
| ${transaction_ids}= Create List ${transaction_id1} ${transaction_id2} |
| |
| # Release Lock by Session by mentioning transaction_ids also in the request. |
| Release Locks ${transaction_ids} release_type=Session |
| |
| |
| Verify Locks Created By One Session Cannot Be Deleted By Another Session |
| [Documentation] Verify locks created by one session cannot be deleted by another session. |
| [Tags] Verify_Locks_Created_By_One_Session_Cannot_Be_Deleted_By_Another_Session |
| |
| ${transaction_id1}= Acquire Lock On A Given Resource |
| ... Read ${TWO_SEG_FLAG_2} ${234} |
| ${locks_tran1}= Get Locks List ${SESSION_ID} |
| |
| Redfish.Login |
| ${session_id} ${session_key}= Return Session Id And Session Key |
| |
| ${transaction_id2}= Acquire Lock On A Given Resource |
| ... Read ${TWO_SEG_FLAG_3} ${234} |
| ${locks_before}= Get Locks List ${SESSION_ID} |
| |
| ${transaction_ids}= Create List ${transaction_id1} ${transaction_id2} |
| Release Locks ${transaction_ids} exp_status_code=${HTTP_UNAUTHORIZED} conflict_record=${locks_tran1} |
| ${locks_after}= Get Locks List ${SESSION_ID} |
| Should Be Equal ${locks_before} ${locks_after} |
| |
| # When release_type=Session, transaction_ids should be ignored. |
| Release Locks ${transaction_ids} release_type=Session |
| ${locks_after}= Get Locks List ${SESSION_ID} |
| Should Be Equal ${EMPTY_LIST} ${locks_after} |
| |
| |
| *** Keywords *** |
| |
| Locks Persistency Check After BMC Reboot |
| [Documentation] Locks persistency check after BMC reboot. |
| [Arguments] ${lock_type} ${seg_flags} ${resource_id} |
| |
| # Description of argument(s): |
| # lock_type Type of lock (Read/Write). |
| # seg_flags Segmentation Flags to identify lock elements under system level in the hierarchy. |
| # resource_id Decimal +ve integer value of maximum 8 hex bytes. Ex: 134, 2048 etc. |
| |
| ${transaction_id}= Run Keyword Acquire Lock On A Given Resource |
| ... ${lock_type} ${seg_flags} ${resource_id} |
| |
| ${locks_prev}= Run Keyword Get Locks List ${SESSION_ID} |
| |
| Initialize OpenBMC |
| OBMC Reboot (off) |
| |
| ${locks_curr}= Run Keyword Get Locks List ${SESSION_ID} |
| Should Be Equal ${locks_prev} ${locks_curr} |
| ${transaction_ids}= Create List ${transaction_id} |
| Release Locks ${transaction_ids} |
| |
| |
| Return Data Dictionary For Single Request |
| [Documentation] Return data dictionary for single request. |
| [Arguments] ${lock_type} ${seg_flags} ${resource_id} |
| |
| # Description of argument(s): |
| # lock_type Type of lock (Read/Write). |
| # seg_flags Segmentation Flags to identify lock elements under system level in the hierarchy. |
| # resource_id Decimal +ve integer value of maximum 8 hex bytes. Ex: 134, 2048 etc. |
| |
| ${SEG_FLAGS_LOCK}= Create Dictionary LockType=${lock_type} SegmentFlags=@{seg_flags} |
| ... ResourceID=${resource_id} |
| ${SEG_FLAGS_ENTRIES}= Create List ${SEG_FLAGS_LOCK} |
| ${LOCK_REQUEST}= Create Dictionary Request=${SEG_FLAGS_ENTRIES} |
| Log To Console ${LOCK_REQUEST} |
| |
| [Return] ${LOCK_REQUEST} |
| |
| |
| Acquire Lock On A Given Resource |
| [Documentation] Acquire lock on a given resource. |
| [Arguments] ${lock_type} ${seg_flags} ${resource_id} ${exp_status_code}=${HTTP_OK} |
| ... ${err_msgs}=${EMPTY_LIST} |
| |
| # Description of argument(s): |
| # lock_type Type of lock (Read/Write). |
| # seg_flags Segmentation Flags to identify lock elements under system level in the hierarchy. |
| # Ex: [{'LockFlag': 'LockAll', 'SegmentLength': 1}, |
| # {'LockFlag': 'LockSame', 'SegmentLength': 2}] |
| # resource_id Decimal +ve integer value of maximum 8 hex bytes. Ex: 134, 2048 etc. |
| # exp_status_code Expected status code from the AcquireLock request for given inputs. |
| # err_msgs List of expected error messages. |
| |
| ${data}= Return Data Dictionary For Single Request ${lock_type} ${seg_flags} ${resource_id} |
| ${resp}= Redfish.Post /ibm/v1/HMC/LockService/Actions/LockService.AcquireLock |
| ... body=${data} valid_status_codes=[${exp_status_code}] |
| |
| ${transaction_id}= Run Keyword If ${exp_status_code} != ${HTTP_OK} |
| ... Set Variable ${0} |
| ... ELSE Load Lock Record And Build Transaction To Session Map ${resp.text} |
| |
| Run Keyword If ${exp_status_code} == ${HTTP_CONFLICT} and ${err_msgs} == ['NA'] |
| ... Load Response And Verify Conflict ${resp.text} ${SESSION_ID} |
| ... ELSE Run Keyword If ${exp_status_code} != ${HTTP_OK} and ${err_msgs} != ${EMPTY_LIST} |
| ... Load Response And Verify Error ${resp.text} err_msgs=${err_msgs} |
| |
| Append Transaction Id And Session Id To Locks Dictionary ${transaction_id} |
| |
| [Return] ${transaction_id} |
| |
| |
| Load Lock Record And Build Transaction To Session Map |
| [Documentation] Load lock record and build transaction to session map. |
| [Arguments] ${resp_text} |
| |
| # Description of argument(s): |
| # resp_text Response test from a REST request. |
| |
| ${acquire_lock}= Evaluate json.loads('''${resp_text}''') json |
| Append Transaction Id And Session Id To Locks Dictionary ${acquire_lock["TransactionID"]} |
| |
| [Return] ${acquire_lock["TransactionID"]} |
| |
| |
| Load Response And Verify Error |
| [Documentation] Load response and verify error. |
| [Arguments] ${error_resp} ${err_msgs}=${EMPTY_LIST} |
| |
| # Description of argument(s): |
| # error_resp Error response from a REST request. |
| # err_msgs List of error msg patterns. |
| |
| ${error_resp}= Replace String ${error_resp} \" \\" |
| ${error_response}= Evaluate json.loads('''${error_resp}''') json |
| |
| ${errors}= Get Dictionary Values ${error_response} |
| ${extended_errors}= Create List |
| |
| FOR ${error} IN @{errors} |
| Append To List ${extended_errors} ${error[0]["Message"]} |
| END |
| |
| Log To Console EXTENDED = ${extended_errors} |
| |
| FOR ${exp_error} IN @{err_msgs} |
| Run Keyword Expect List Of Errors In An Extended Errors ${exp_error} ${extended_errors} |
| END |
| |
| |
| Expect List Of Errors In An Extended Errors |
| [Documentation] Expect list of errors in an extended errors. |
| [Arguments] ${exp_error} ${extended_errors}=${EMPTY_LIST} |
| |
| ${found}= Set Variable ${False} |
| |
| FOR ${error_record} IN @{extended_errors} |
| ${found}= Evaluate '${exp_error}' in '${error_record}' |
| Exit For Loop If ${found} == ${True} |
| END |
| |
| Should Be True ${found} |
| |
| |
| Append Transaction Id And Session Id To Locks Dictionary |
| [Documentation] Append transaction id and session id to locks dictionary. |
| [Arguments] ${transaction_id} |
| |
| # Description of argument(s): |
| # transaction_id Transaction ID created from acquire lock request. Ex: 8, 9 etc. |
| |
| Set To Dictionary ${LOCKS} ${${transaction_id}} ${session_id} |
| |
| |
| Get Locks List |
| [Documentation] Get locks list. |
| [Arguments] @{sessions} ${exp_status_code}=${HTTP_OK} |
| |
| # Description of argument(s): |
| # sessions List of comma separated strings. Ex: ["euHoAQpvNe", "ecTjANqwFr"] |
| # exp_status_code expected status code from the GetLockList request for given inputs. |
| |
| ${sessions}= Evaluate json.dumps(${sessions}) json |
| ${data}= Set Variable {"SessionIDs": ${sessions}} |
| ${resp}= Redfish.Post /ibm/v1/HMC/LockService/Actions/LockService.GetLockList |
| ... body=${data} valid_status_codes=[${exp_status_code}] |
| |
| ${locks}= Evaluate json.loads('''${resp.text}''') json |
| |
| [Return] ${locks["Records"]} |
| |
| |
| Release Locks |
| [Documentation] Release locks. |
| [Arguments] ${transaction_ids}=${EMPTY_LIST} ${release_type}=Transaction ${exp_status_code}=${HTTP_OK} |
| ... ${conflict_record}=${EMPTY_LIST} |
| |
| # Description of argument(s): |
| # transaction_ids List of transaction ids or session ids. Ex: [15, 18] or ["euHoAQpvNe", "ecTjANqwFr"] |
| # release_type Release all locks acquired using current session or only given transaction numbers. |
| # Ex: Session, Transaction. Default will be Transaction. |
| # exp_status_code expected status code from the ReleaseLock request for given inputs. |
| # conflict_record Expected conflict record. |
| |
| # When release_type=Session then TransactionIDs list will be ignored. |
| ${data}= Set Variable {"Type": "${release_type}", "TransactionIDs": ${transaction_ids}} |
| ${data}= Evaluate json.dumps(${data}) json |
| ${resp}= Redfish.Post /ibm/v1/HMC/LockService/Actions/LockService.ReleaseLock |
| ... body=${data} valid_status_codes=[${exp_status_code}] |
| Should Be True ${resp.status} ${exp_status_code} |
| Return From Keyword If ${conflict_record} == ${EMPTY_LIST} |
| |
| ${conflict}= Evaluate json.loads('''${resp.text}''') json |
| |
| # Example of conflict |
| # { |
| # "Record":{ |
| # "HMCID":"hmc-id", |
| # "LockType":"Read", |
| # "ResourceID":234, |
| # "SegmentFlags":[ |
| # { |
| # "LockFlag":"DontLock", |
| # "SegmentLength":3 |
| # }, |
| # { |
| # "LockFlag":"LockAll", |
| # "SegmentLength":1 |
| # } |
| # ], |
| # "SessionID":"OorUVwrXuT", |
| # "TransactionID":47 |
| # } |
| # } |
| |
| Should Be Equal ${conflict_record[0]} ${conflict["Record"]} |
| |
| |
| Verify Lock Record |
| [Documentation] Verify lock record. |
| [Arguments] ${lock_found} &{lock_records} |
| |
| # Description of argument(s): |
| # lock_found True if lock record is expected to be present, else False. |
| # lock_records A dictionary containing key value pairs of a lock record. |
| |
| ${session}= Get From Dictionary ${LOCKS} ${lock_records["TransactionID"]} |
| ${locks}= Run Keyword Get Locks List ${session} |
| |
| ${lock_record_found}= Set Variable ${False} |
| |
| FOR ${record} IN @{locks} |
| ${record}= Evaluate json.dumps(${record}) json |
| ${record}= Evaluate json.loads('''${record}''') json |
| ${lock_record_found}= Set Variable If ${record["TransactionID"]} == ${lock_records["TransactionID"]} |
| ... ${True} ${False} |
| |
| Continue For Loop If ${lock_record_found} == ${False} |
| Dictionaries Should Be Equal ${record} ${lock_records} |
| Exit For Loop |
| END |
| |
| Should Be Equal ${lock_record_found} ${lock_found} |
| |
| |
| Load Response And Verify Conflict |
| [Documentation] Load response and verify conflict. |
| [Arguments] ${conflict_resp} ${sessions} |
| |
| # Description of argument(s): |
| # conflict_resp Conflict response from a REST request. |
| # Example : { "Record": { "HMCID": "hmc-id", "LockType": "Write", "ResourceID": 234, |
| # "SegmentFlags": [ { "LockFlag": "DontLock", "SegmentLength": 3}, |
| # { "LockFlag": "LockAll", "SegmentLength": 1}], |
| # "SessionID": "B6geYEdo6T", "TransactionID": 104 } } |
| # sessions Comma separated list of sessions |
| |
| ${curr_locks}= Run Keyword Get Locks List ${sessions} |
| ${conflict_resp}= Replace String ${conflict_resp} \" \\" |
| ${conflict_response}= Evaluate json.loads('''${conflict_resp}''') json |
| |
| ${conflicts}= Get Dictionary Values ${conflict_response} |
| List Should Contain Value ${conflicts} ${PREV_INPUTS} |
| |
| |
| Acquire And Release Lock |
| [Documentation] Acquire and release lock. |
| [Arguments] ${lock_type} ${seg_flags} ${resource_id} ${hmc_id} ${exp_status_code}=${HTTP_OK} |
| ... ${err_msgs}=${EMPTY_LIST} ${new_sess_req}=${True} |
| |
| # Description of argument(s): |
| # lock_type Type of lock (Read/Write). |
| # seg_flags Segmentation Flags to identify lock elements under system level in the hierarchy. |
| # Ex: [{'LockFlag': 'LockAll', 'SegmentLength': 1}, |
| # {'LockFlag': 'LockSame', 'SegmentLength': 2}] |
| # resource_id Decimal +ve integer value of maximum 8 hex bytes. Ex: 134, 2048 etc. |
| # hmc_id Hardware management console id. |
| # exp_status_code Expected status code from the AcquireLock request for given inputs. |
| # err_msgs List of expected error messages. |
| # new_sess_req Create a new session before acquiring a lock if True. |
| |
| # Get REST session to BMC. |
| Run Keyword If ${new_sess_req} == ${True} Create New Session |
| |
| ${inputs}= Create Dictionary LockType=${lock_type} ResourceID=${resource_id} |
| ... SegmentFlags=${seg_flags} HMCID=${hmc_id} |
| |
| ${transaction_id}= Run Keyword Acquire Lock On A Given Resource ${inputs["LockType"]} |
| ... ${inputs["SegmentFlags"]} ${inputs["ResourceID"]} ${exp_status_code} err_msgs=${err_msgs} |
| |
| # Each lock request from a new session is saved so that for next lock request using same session |
| # can refer to previous lock data to verify conflict records if any. |
| Run Keyword If ${new_sess_req} == ${True} Set Test Variable Dictionary Of Previous Lock Request |
| ... ${lock_type} ${seg_flags} ${resource_id} ${hmc_id} ${SESSION_ID} ${transaction_id} |
| |
| ${session}= Get From Dictionary ${LOCKS} ${transaction_id} |
| Set To Dictionary ${inputs} TransactionID=${${transaction_id}} SessionID=${session} |
| |
| ${lock_found}= Set Variable If ${exp_status_code} == ${HTTP_OK} ${True} ${False} |
| Verify Lock Record ${lock_found} &{inputs} |
| |
| Return From Keyword If '${exp_status_code}' != '${HTTP_OK}' or ${err_msgs} == ['NA'] |
| ${transaction_ids}= Create List ${transaction_id} |
| Release Locks ${transaction_ids} |
| Verify Lock Record ${False} &{inputs} |
| |
| # Delete the session. |
| Redfish.Logout |
| |
| |
| Create New Session |
| [Documentation] Create new session. |
| |
| # Delete current session. |
| Redfish.Logout |
| |
| # Get a redfish session to BMC. |
| Redfish.Login |
| ${session_id} ${session_key}= Return Session Id And Session Key |
| Set Test Variable ${SESSION_ID} ${session_id} |
| Set Test Variable ${SESSION_KEY} ${session_key} |
| |
| |
| Test Teardown Execution |
| [Documentation] Test teardown execution. |
| |
| FFDC On Test Case Fail |
| Redfish.Logout |
| |
| |
| Return Session Id And Session Key |
| [Documentation] Return session id and sesion key. |
| |
| ${session_location}= Redfish.Get Session Location |
| ${session_id}= Evaluate os.path.basename($session_location) modules=os |
| ${session_key}= Redfish.Get Session Key |
| |
| [Return] ${session_id} ${session_key} |
| |
| |
| Test Setup Execution |
| [Documentation] Test setup execution. |
| |
| Create New Session |
| |
| Set Test Variable Dictionary Of Previous Lock Request ${EMPTY} ${EMPTY_LIST} ${EMPTY} ${EMPTY} |
| ... ${EMPTY} ${EMPTY} |
| |
| |
| Set Test Variable Dictionary Of Previous Lock Request |
| [Documentation] Set test variable dictionary of previous lock request. |
| [Arguments] ${lock_type} ${seg_flags} ${resource_id} ${hmc_id} ${session_id} ${transaction_id} |
| |
| # Description of argument(s): |
| # lock_type Type of lock (Read/Write). |
| # seg_flags Segmentation Flags to identify lock elements under system level in the hierarchy. |
| # Ex: [{'LockFlag': 'LockAll', 'SegmentLength': 1}, |
| # {'LockFlag': 'LockSame', 'SegmentLength': 2}] |
| # resource_id Decimal +ve integer value of maximum 8 hex bytes. Ex: 134, 2048 etc. |
| # hmc_id Hardware management console id. |
| # session_id Session id of the transaction. |
| # transaction_id Transaction_id of the lock request. |
| |
| ${prev_inputs}= Create Dictionary LockType=${lock_type} ResourceID=${resource_id} |
| ... SegmentFlags=${seg_flags} HMCID=${hmc_id} SessionID=${session_id} TransactionID=${transaction_id} |
| |
| Set Test Variable ${PREV_INPUTS} ${prev_inputs} |