*** 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}