summaryrefslogtreecommitdiff
path: root/redfish-core/lib/power_supply.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'redfish-core/lib/power_supply.hpp')
-rw-r--r--redfish-core/lib/power_supply.hpp123
1 files changed, 123 insertions, 0 deletions
diff --git a/redfish-core/lib/power_supply.hpp b/redfish-core/lib/power_supply.hpp
new file mode 100644
index 0000000000..9fffa197c6
--- /dev/null
+++ b/redfish-core/lib/power_supply.hpp
@@ -0,0 +1,123 @@
+#pragma once
+
+#include "app.hpp"
+#include "dbus_utility.hpp"
+#include "query.hpp"
+#include "registries/privilege_registry.hpp"
+#include "utils/chassis_utils.hpp"
+
+#include <memory>
+#include <optional>
+#include <string>
+
+namespace redfish
+{
+
+inline void updatePowerSupplyList(
+ const std::shared_ptr<bmcweb::AsyncResp>& /* 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<bmcweb::AsyncResp>& asyncResp,
+ const std::string& chassisId,
+ const std::optional<std::string>& validChassisPath)
+{
+ if (!validChassisPath)
+ {
+ messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
+ return;
+ }
+
+ asyncResp->res.addHeader(
+ boost::beast::http::field::link,
+ "</redfish/v1/JsonSchemas/PowerSupplyCollection/PowerSupplyCollection.json>; rel=describedby");
+ asyncResp->res.jsonValue["@odata.type"] =
+ "#PowerSupplyCollection.PowerSupplyCollection";
+ asyncResp->res.jsonValue["Name"] = "Power Supply Collection";
+ asyncResp->res.jsonValue["@odata.id"] =
+ crow::utility::urlFromPieces("redfish", "v1", "Chassis", chassisId,
+ "PowerSubsystem", "PowerSupplies");
+ asyncResp->res.jsonValue["Description"] =
+ "The collection of PowerSupply resource instances.";
+
+ 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<bmcweb::AsyncResp>& asyncResp,
+ const std::string& chassisId)
+{
+ if (!redfish::setUpRedfishRoute(app, req, asyncResp))
+ {
+ return;
+ }
+
+ redfish::chassis_utils::getValidChassisPath(
+ asyncResp, chassisId,
+ [asyncResp,
+ chassisId](const std::optional<std::string>& validChassisPath) {
+ if (!validChassisPath)
+ {
+ messages::resourceNotFound(asyncResp->res, "Chassis", chassisId);
+ return;
+ }
+ asyncResp->res.addHeader(
+ boost::beast::http::field::link,
+ "</redfish/v1/JsonSchemas/PowerSupplyCollection/PowerSupplyCollection.json>; rel=describedby");
+ });
+}
+
+inline void handlePowerSupplyCollectionGet(
+ App& app, const crow::Request& req,
+ const std::shared_ptr<bmcweb::AsyncResp>& 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/<str>/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/<str>/PowerSubsystem/PowerSupplies/")
+ .privileges(redfish::privileges::getPowerSupplyCollection)
+ .methods(boost::beast::http::verb::get)(
+ std::bind_front(handlePowerSupplyCollectionGet, std::ref(app)));
+}
+
+} // namespace redfish