diff options
author | Nan Zhou <nanzhoumails@gmail.com> | 2022-07-03 08:02:36 +0300 |
---|---|---|
committer | Nan Zhou <nanzhoumails@gmail.com> | 2022-07-11 04:29:41 +0300 |
commit | 30aacdd831d0e05ed42b43afa4f5c966bed17969 (patch) | |
tree | 9d5cbd959dd6a998e0bbea78d4a35b1d4cb5e10b /include/google | |
parent | c5bb99821d6b2a59bed5538475aa8d8631b4c075 (diff) | |
download | bmcweb-30aacdd831d0e05ed42b43afa4f5c966bed17969.tar.xz |
Google RoT: allign callback style
The current convention:
1. route handler should be named as "handleAbcResouceMethod"
2. prefer inline functions instead of local lambdas
Tested:
1. compiles
2. on Google hardware, the commands in
https://gerrit.openbmc.org/c/openbmc/bmcweb/+/52222/32 worked
GET: /google/v1/RootOfTrustCollection
{
"@odata.id": "/google/v1/RootOfTrustCollection",
"@odata.type": "#RootOfTrustCollection.RootOfTrustCollection",
"Members": [
{
"@odata.id": "/google/v1/RootOfTrustCollection/Hoth"
}
],
"Members@odata.count": 1
}
GET /google/v1/RootOfTrustCollection/Hoth
{
"@odata.id": "/google/v1/RootOfTrustCollection/Hoth",
"@odata.type": "#RootOfTrust.v1_0_0.RootOfTrust",
"Actions": {
"#RootOfTrust.SendCommand": {
"target": "/google/v1/RootOfTrustCollection/Hoth/Actions/RootOfTrust.SendCommand"
}
},
"Description": "Google Root Of Trust",
"Id": "Hoth",
"Location": {
"PartLocation": {
"LocationType": "Embedded",
"ServiceLabel": "Hoth"
}
},
"Name": "Hoth",
"Status": {
"State": "Enabled"
}
}
Signed-off-by: Nan Zhou <nanzhoumails@gmail.com>
Change-Id: I0221b4b183579b33d0848d96a20398aee1a211d4
Diffstat (limited to 'include/google')
-rw-r--r-- | include/google/google_service_root.hpp | 149 |
1 files changed, 85 insertions, 64 deletions
diff --git a/include/google/google_service_root.hpp b/include/google/google_service_root.hpp index c59cbab40e..578ed8cd51 100644 --- a/include/google/google_service_root.hpp +++ b/include/google/google_service_root.hpp @@ -19,8 +19,9 @@ constexpr const char* hothSearchPath = "/xyz/openbmc_project"; constexpr const char* hothInterface = "xyz.openbmc_project.Control.Hoth"; constexpr const char* rotCollectionPrefix = "/google/v1/RootOfTrustCollection"; -inline void getGoogleV1(const crow::Request& /*req*/, - const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) +inline void + handleGoogleV1Get(const crow::Request& /*req*/, + const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { asyncResp->res.jsonValue["@odata.type"] = "#GoogleServiceRoot.v1_0_0.GoogleServiceRoot"; @@ -32,7 +33,7 @@ inline void getGoogleV1(const crow::Request& /*req*/, rotCollectionPrefix; } -inline void getRootOfTrustCollection( +inline void handleRootOfTrustCollectionGet( const crow::Request& /*req*/, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) { @@ -57,49 +58,59 @@ using ResolvedEntityHandler = std::function<void( const std::string&, const std::shared_ptr<bmcweb::AsyncResp>&, const ResolvedEntity&)>; +inline void hothGetSubtreeCallback( + const std::string& command, + const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, + const std::string& rotId, const ResolvedEntityHandler& entityHandler, + const boost::system::error_code ec, + const dbus::utility::MapperGetSubTreeResponse& subtree) +{ + if (ec) + { + redfish::messages::internalError(asyncResp->res); + return; + } + // Iterate over all retrieved ObjectPaths. + for (const std::pair< + std::string, + std::vector<std::pair<std::string, std::vector<std::string>>>>& + object : subtree) + { + sdbusplus::message::object_path objPath(object.first); + if (objPath.filename() != rotId || object.second.empty()) + { + continue; + } + + ResolvedEntity resolvedEntity = {.id = rotId, + .service = object.second[0].first, + .object = object.first, + .interface = hothInterface}; + entityHandler(command, asyncResp, resolvedEntity); + return; + } + + // Couldn't find an object with that name. return an error + redfish::messages::resourceNotFound( + asyncResp->res, "#RootOfTrust.v1_0_0.RootOfTrust", rotId); +} + inline void resolveRoT(const std::string& command, const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const std::string& rotId, ResolvedEntityHandler&& entityHandler) { - auto validateFunc = + + std::array<std::string, 1> hothIfaces = {hothInterface}; + crow::connections::systemBus->async_method_call( [command, asyncResp, rotId, entityHandler{std::forward<ResolvedEntityHandler>(entityHandler)}]( const boost::system::error_code ec, const dbus::utility::MapperGetSubTreeResponse& subtree) { - if (ec) - { - redfish::messages::internalError(asyncResp->res); - return; - } - // Iterate over all retrieved ObjectPaths. - for (const std::pair< - std::string, - std::vector<std::pair<std::string, std::vector<std::string>>>>& - object : subtree) - { - sdbusplus::message::object_path objPath(object.first); - if (objPath.filename() != rotId || object.second.empty()) - { - continue; - } - - ResolvedEntity resolvedEntity = {.id = rotId, - .service = object.second[0].first, - .object = object.first, - .interface = hothInterface}; - entityHandler(command, asyncResp, resolvedEntity); - return; - } - - // Couldn't find an object with that name. return an error - redfish::messages::resourceNotFound( - asyncResp->res, "#RootOfTrust.v1_0_0.RootOfTrust", rotId); - }; - - std::array<std::string, 1> hothIfaces = {hothInterface}; - crow::connections::systemBus->async_method_call( - validateFunc, "xyz.openbmc_project.ObjectMapper", + hothGetSubtreeCallback(command, asyncResp, rotId, entityHandler, ec, + subtree); + }, + "xyz.openbmc_project.ObjectMapper", "/xyz/openbmc_project/object_mapper", "xyz.openbmc_project.ObjectMapper", "GetSubTree", hothSearchPath, /*depth=*/0, hothIfaces); @@ -129,12 +140,30 @@ inline void populateRootOfTrustEntity( "Embedded"; } -inline void getRootOfTrust(const crow::Request& /*unused*/, - const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, - const std::string& param) +inline void + handleRootOfTrustGet(const crow::Request& /*req*/, + const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, + const std::string& param) { - resolveRoT("" /*Empty command*/, asyncResp, param, - populateRootOfTrustEntity); + std::string emptyCommand; + resolveRoT(emptyCommand, asyncResp, param, populateRootOfTrustEntity); +} + +inline void + invocationCallback(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, + const boost::system::error_code ec, + const std::vector<uint8_t>& responseBytes) +{ + if (ec) + { + BMCWEB_LOG_ERROR << "RootOfTrust.Actions.SendCommand failed: " + << ec.message(); + redfish::messages::internalError(asyncResp->res); + return; + } + + asyncResp->res.jsonValue["CommandResponse"] = + bytesToHexString(responseBytes); } inline void @@ -142,19 +171,6 @@ inline void const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, const ResolvedEntity& resolvedEntity) { - auto handleFunc = [asyncResp](const boost::system::error_code ec, - std::vector<uint8_t>& responseBytes) { - if (ec) - { - BMCWEB_LOG_ERROR << "RootOfTrust.Actions.SendCommand failed: " - << ec.message(); - redfish::messages::internalError(asyncResp->res); - return; - } - - asyncResp->res.jsonValue["CommandResponse"] = - bytesToHexString(responseBytes); - }; std::vector<uint8_t> bytes = hexStringToBytes(command); if (bytes.empty()) { @@ -165,13 +181,18 @@ inline void } crow::connections::systemBus->async_method_call( - handleFunc, resolvedEntity.service, resolvedEntity.object, - resolvedEntity.interface, "SendHostCommand", bytes); + [asyncResp{asyncResp}](const boost::system::error_code ec, + const std::vector<uint8_t>& responseBytes) { + invocationCallback(asyncResp, ec, responseBytes); + }, + resolvedEntity.service, resolvedEntity.object, resolvedEntity.interface, + "SendHostCommand", bytes); } -inline void sendRoTCommand(const crow::Request& request, - const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, - const std::string& rotId) +inline void handleRoTSendCommandPost( + const crow::Request& request, + const std::shared_ptr<bmcweb::AsyncResp>& asyncResp, + const std::string& rotId) { std::string command; if (!redfish::json_util::readJsonAction(request, asyncResp->res, "Command", @@ -189,21 +210,21 @@ inline void sendRoTCommand(const crow::Request& request, inline void requestRoutes(App& app) { BMCWEB_ROUTE(app, "/google/v1/") - .methods(boost::beast::http::verb::get)(getGoogleV1); + .methods(boost::beast::http::verb::get)(handleGoogleV1Get); BMCWEB_ROUTE(app, "/google/v1/RootOfTrustCollection") .privileges({{"ConfigureManager"}}) - .methods(boost::beast::http::verb::get)(getRootOfTrustCollection); + .methods(boost::beast::http::verb::get)(handleRootOfTrustCollectionGet); BMCWEB_ROUTE(app, "/google/v1/RootOfTrustCollection/<str>") .privileges({{"ConfigureManager"}}) - .methods(boost::beast::http::verb::get)(getRootOfTrust); + .methods(boost::beast::http::verb::get)(handleRootOfTrustGet); BMCWEB_ROUTE( app, "/google/v1/RootOfTrustCollection/<str>/Actions/RootOfTrust.SendCommand") .privileges({{"ConfigureManager"}}) - .methods(boost::beast::http::verb::post)(sendRoTCommand); + .methods(boost::beast::http::verb::post)(handleRoTSendCommandPost); } } // namespace google_api |