Lock Management : Add Support for Mutltiple HMC's
- The Lock Structure already had the HMC-ID field which
stores the corresponding unique Identifier that tells
us which HMC has acquired the Lock.
- Now, that the Know you client functionality is up, we can
leverage the clientId field in the bmcweb session store to
fill the lock structure with the corresponding hmc identifier.
NOTE : Also note that a Single HMC can have mutliple session that
can acquire different locks, So when the ownership of any lock is
tied up to its cliendId as well as the SessionId.
- Release Lock call on any Transaction ID can only be successful if
the transactionID of corresponding lock has the complete owner-ship
as per the NOTE mentioned above.
Tested By:
1. CREATE Session with Client ID as mentioned below:
'{"UserName":"root", "Password":"0penBmc", "Oem":{"OpenBMC" : {"ClientID":<unique id>}}}'
2. Make sure the GetLockList of the above session populates the CliendID field
as per data mentioned in the login Request.
3. Release Lock on transaction ID with same HMC-ID but with different
sessionID's should be successful only when both the HMC-ID(mapped to
X-Auth tokens in the session store) & Session ID(from the session store)
of the ReleaseLock request matches with the ownwership of the lock pertaining
to the transaction ID in the request.
Signed-off-by: Manojkiran Eda <manojkiran.eda@gmail.com>
Change-Id: I60161bea6007782a397fc60f19d44c2211d4cf7f
diff --git a/include/ibm/management_console_rest.hpp b/include/ibm/management_console_rest.hpp
index e9805d6..a7ac761 100644
--- a/include/ibm/management_console_rest.hpp
+++ b/include/ibm/management_console_rest.hpp
@@ -317,8 +317,9 @@
segInfo.push_back(std::make_pair(lockFlags, segmentLength));
}
- lockRequestStructure.push_back(make_tuple(
- req.session->uniqueId, "hmc-id", lockType, resourceId, segInfo));
+ lockRequestStructure.push_back(
+ make_tuple(req.session->uniqueId, req.session->clientId, lockType,
+ resourceId, segInfo));
}
// print lock request into journal
@@ -426,13 +427,11 @@
BMCWEB_LOG_DEBUG << listTransactionIds[i];
}
- std::string clientId = "hmc-id";
- std::string sessionId = req.session->uniqueId;
-
// validate the request ids
auto varReleaselock = crow::ibm_mc_lock::Lock::getInstance().releaseLock(
- listTransactionIds, std::make_pair(clientId, sessionId));
+ listTransactionIds,
+ std::make_pair(req.session->clientId, req.session->uniqueId));
if (!varReleaselock.first)
{