#pragma once #include "app.hpp" #include "dbus_utility.hpp" #include "query.hpp" #include "registries/privilege_registry.hpp" #include "utils/chassis_utils.hpp" #include #include #include #include namespace redfish { inline void updatePowerSupplyList( const std::shared_ptr& /* asyncResp */, const std::string& /* chassisId */, const std::string& /* powerSupplyPath */) { // TODO In order for the validator to pass, the Members property will be // implemented on the next commit } inline void doPowerSupplyCollection(const std::shared_ptr& asyncResp, const std::string& chassisId, const std::optional& validChassisPath) { if (!validChassisPath) { messages::resourceNotFound(asyncResp->res, "Chassis", chassisId); return; } asyncResp->res.addHeader( boost::beast::http::field::link, "; rel=describedby"); asyncResp->res.jsonValue["@odata.type"] = "#PowerSupplyCollection.PowerSupplyCollection"; asyncResp->res.jsonValue["Name"] = "Power Supply Collection"; asyncResp->res.jsonValue["@odata.id"] = boost::urls::format( "/redfish/v1/Chassis/{}/PowerSubsystem/PowerSupplies", chassisId); asyncResp->res.jsonValue["Description"] = "The collection of PowerSupply resource instances."; asyncResp->res.jsonValue["Members"] = nlohmann::json::array(); asyncResp->res.jsonValue["Members@odata.count"] = 0; std::string powerPath = *validChassisPath + "/powered_by"; dbus::utility::getAssociationEndPoints( powerPath, [asyncResp, chassisId]( const boost::system::error_code& ec, const dbus::utility::MapperEndPoints& endpoints) { if (ec) { if (ec.value() != EBADR) { BMCWEB_LOG_ERROR << "DBUS response error" << ec.value(); messages::internalError(asyncResp->res); } return; } for (const auto& endpoint : endpoints) { updatePowerSupplyList(asyncResp, chassisId, endpoint); } }); } inline void handlePowerSupplyCollectionHead( App& app, const crow::Request& req, const std::shared_ptr& asyncResp, const std::string& chassisId) { if (!redfish::setUpRedfishRoute(app, req, asyncResp)) { return; } redfish::chassis_utils::getValidChassisPath( asyncResp, chassisId, [asyncResp, chassisId](const std::optional& validChassisPath) { if (!validChassisPath) { messages::resourceNotFound(asyncResp->res, "Chassis", chassisId); return; } asyncResp->res.addHeader( boost::beast::http::field::link, "; rel=describedby"); }); } inline void handlePowerSupplyCollectionGet( App& app, const crow::Request& req, const std::shared_ptr& asyncResp, const std::string& chassisId) { if (!redfish::setUpRedfishRoute(app, req, asyncResp)) { return; } redfish::chassis_utils::getValidChassisPath( asyncResp, chassisId, std::bind_front(doPowerSupplyCollection, asyncResp, chassisId)); } inline void requestRoutesPowerSupplyCollection(App& app) { BMCWEB_ROUTE(app, "/redfish/v1/Chassis//PowerSubsystem/PowerSupplies/") .privileges(redfish::privileges::headPowerSupplyCollection) .methods(boost::beast::http::verb::head)( std::bind_front(handlePowerSupplyCollectionHead, std::ref(app))); BMCWEB_ROUTE(app, "/redfish/v1/Chassis//PowerSubsystem/PowerSupplies/") .privileges(redfish::privileges::getPowerSupplyCollection) .methods(boost::beast::http::verb::get)( std::bind_front(handlePowerSupplyCollectionGet, std::ref(app))); } } // namespace redfish