blob: a8209c389c56b3d456f324ac6866f9048a46e292 [file] [log] [blame]
#include <cstdint>
#include <bmcweb_plugins/async_resp.hpp>
#include <bmcweb_plugins/dbus_singleton.hpp>
#include <bmcweb_plugins/dbus_utils.hpp>
#include <bmcweb_plugins/http_request.hpp>
#include <bmcweb_plugins/interface.hpp>
#include <bmcweb_plugins/macros.hpp>
#include <bmcweb_plugins/privilege_registry.hpp>
#include <bmcweb_plugins/query.hpp>
#include <iostream>
#include <memory>
namespace {
void echoServer(const crow::Request&,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
const std::string& param) {
asyncResp->res.jsonValue["Echo"] = param;
}
void redfishGetReplacedManagedStore(
const crow::Request& req,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
if (!redfish::setUpRedfishRoute(req, asyncResp)) {
return;
}
managedStore::ManagedObjectStoreContext requestContext(asyncResp);
redfish::dbus_utils::getProperty<std::vector<std::string>>(
"xyz.openbmc_project.ObjectMapper", "associationPath",
"xyz.openbmc_project.Association", "endpoints", requestContext,
[asyncResp](const boost::system::error_code ec,
const std::vector<std::string>& resp) {
if (ec) {
return; // no downstream_chassis = no failures
}
nlohmann::json& chassis =
asyncResp->res.jsonValue["Links"]["chassisPropertyName"];
chassis = nlohmann::json::array();
const std::string chassisCollectionPath = "/redfish/v1/Chassis";
for (const std::string& chassisPath : resp) {
BMCWEB_LOG_INFO << chassisPath << "chassis path";
sdbusplus::message::object_path path(chassisPath);
std::string leaf = path.filename();
if (leaf.empty()) {
continue;
}
std::string newPath = chassisCollectionPath;
newPath += "/";
newPath += leaf;
chassis.push_back({{"@odata.id", std::move(newPath)}});
}
});
}
void redfishGetReplaced(const crow::Request& req,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
if (!redfish::setUpRedfishRoute(req, asyncResp)) {
return;
}
crow::connections::systemBus->async_method_call(
[asyncResp](const boost::system::error_code ec,
const std::variant<std::string>&) {
if (ec) {
asyncResp->res.jsonValue["dbus_call_result"] = "failed";
return;
}
},
"non-exist-service", "/no/exist/object",
"org.freedesktop.DBus.Properties", "Get",
"xyz.openbmc_project.Non.Exist.Interface", "Property");
asyncResp->res.jsonValue["v1"] = "hacked";
}
void redfishGetAppended(const crow::Request&,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
if (asyncResp->res.jsonValue["dbus_call_result"] != "failed") {
asyncResp->res.jsonValue["plugin_is_working"] = "false";
return;
}
asyncResp->res.jsonValue["plugin_is_working"] = "true";
}
void modifyChassisName(const crow::Request&,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
const std::string& chassisId) {
if (chassisId == "InterestedChassis") {
asyncResp->res.jsonValue["whatever_property"] = "whatever";
}
}
void RegisterPlugins() {
REDFISH_HANDLER_ADD("/echo_server/<str>/", boost::beast::http::verb::get,
redfish::privileges::getChassis, echoServer);
REDFISH_HANDLER_ADD("/echo_server2/<str>/", boost::beast::http::verb::get,
redfish::privileges::getChassis, echoServer);
REDFISH_HANDLER_ADD("/managed_store/", boost::beast::http::verb::get,
redfish::privileges::getChassis,
redfishGetReplacedManagedStore);
REDFISH_HANDLER_REMOVE("/echo_server2/<str>/", boost::beast::http::verb::get);
REDFISH_HANDLER_REPLACE("/redfish/", boost::beast::http::verb::get,
redfishGetReplaced);
REDFISH_HANDLER_APPEND("/redfish/", boost::beast::http::verb::get,
redfishGetAppended);
REDFISH_HANDLER_APPEND("/redfish/v1/Chassis/<str>/",
boost::beast::http::verb::get, modifyChassisName);
}
} // namespace
namespace redfish_plugin {
void loadPlatformPlugins() { RegisterPlugins(); }
} // namespace redfish_plugin