Refactor functions in sensors
Refactor more functions out of sensors such that they don't require the
use of SensorAsyncResp in all cases. This is to prepare for
implementations that might not rely on SensorAsyncResp at all.
Tested:
Tested at end of series. Merge together.
Signed-off-by: Ed Tanous <edtanous@google.com>
Change-Id: Ie359f449c0f7ace57a09c0db0c4f1b347b5d5030
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index ae68a76..7d09ce1 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -439,21 +439,17 @@
* made, and eliminate Power sensors when a Thermal request is made.
*/
inline void reduceSensorList(
- const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
+ crow::Response& res, std::string_view chassisSubNode,
+ std::span<std::string_view> sensorTypes,
const std::vector<std::string>* allSensors,
const std::shared_ptr<std::set<std::string>>& activeSensors)
{
- if (sensorsAsyncResp == nullptr)
- {
- return;
- }
if ((allSensors == nullptr) || (activeSensors == nullptr))
{
- messages::resourceNotFound(
- sensorsAsyncResp->asyncResp->res, sensorsAsyncResp->chassisSubNode,
- sensorsAsyncResp->chassisSubNode == sensors::node::thermal
- ? "Temperatures"
- : "Voltages");
+ messages::resourceNotFound(res, chassisSubNode,
+ chassisSubNode == sensors::node::thermal
+ ? "Temperatures"
+ : "Voltages");
return;
}
@@ -463,7 +459,7 @@
return;
}
- for (std::string_view type : sensorsAsyncResp->types)
+ for (std::string_view type : sensorTypes)
{
for (const std::string& sensor : *allSensors)
{
@@ -475,31 +471,66 @@
}
}
+/*
+ *Populates the top level collection for a given subnode. Populates
+ *SensorCollection, Power, or Thermal schemas.
+ *
+ * */
+inline void populateChassisNode(nlohmann::json& jsonValue,
+ std::string_view chassisSubNode)
+{
+ if (chassisSubNode == sensors::node::power)
+ {
+ jsonValue["@odata.type"] = "#Power.v1_5_2.Power";
+ }
+ else if (chassisSubNode == sensors::node::thermal)
+ {
+ jsonValue["@odata.type"] = "#Thermal.v1_4_0.Thermal";
+ jsonValue["Fans"] = nlohmann::json::array();
+ jsonValue["Temperatures"] = nlohmann::json::array();
+ }
+ else if (chassisSubNode == sensors::node::sensors)
+ {
+ jsonValue["@odata.type"] = "#SensorCollection.SensorCollection";
+ jsonValue["Description"] = "Collection of Sensors for this Chassis";
+ jsonValue["Members"] = nlohmann::json::array();
+ jsonValue["Members@odata.count"] = 0;
+ }
+
+ if (chassisSubNode != sensors::node::sensors)
+ {
+ jsonValue["Id"] = chassisSubNode;
+ }
+ jsonValue["Name"] = chassisSubNode;
+}
+
/**
* @brief Retrieves requested chassis sensors and redundancy data from DBus .
* @param SensorsAsyncResp Pointer to object holding response data
* @param callback Callback for next step in gathered sensor processing
*/
template <typename Callback>
-void getChassis(const std::shared_ptr<SensorsAsyncResp>& sensorsAsyncResp,
- Callback&& callback)
+void getChassis(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
+ std::string_view chassisId, std::string_view chassisSubNode,
+ std::span<std::string_view> sensorTypes, Callback&& callback)
{
BMCWEB_LOG_DEBUG << "getChassis enter";
const std::array<const char*, 2> interfaces = {
"xyz.openbmc_project.Inventory.Item.Board",
"xyz.openbmc_project.Inventory.Item.Chassis"};
auto respHandler =
- [callback{std::forward<Callback>(callback)}, sensorsAsyncResp](
+ [callback{std::forward<Callback>(callback)}, asyncResp,
+ chassisIdStr{std::string(chassisId)},
+ chassisSubNode{std::string(chassisSubNode)}, sensorTypes](
const boost::system::error_code ec,
const dbus::utility::MapperGetSubTreePathsResponse& chassisPaths) {
BMCWEB_LOG_DEBUG << "getChassis respHandler enter";
if (ec)
{
BMCWEB_LOG_ERROR << "getChassis respHandler DBUS error: " << ec;
- messages::internalError(sensorsAsyncResp->asyncResp->res);
+ messages::internalError(asyncResp->res);
return;
}
-
const std::string* chassisPath = nullptr;
std::string chassisName;
for (const std::string& chassis : chassisPaths)
@@ -511,7 +542,7 @@
BMCWEB_LOG_ERROR << "Failed to find '/' in " << chassis;
continue;
}
- if (chassisName == sensorsAsyncResp->chassisId)
+ if (chassisName == chassisIdStr)
{
chassisPath = &chassis;
break;
@@ -519,53 +550,20 @@
}
if (chassisPath == nullptr)
{
- messages::resourceNotFound(sensorsAsyncResp->asyncResp->res,
- "Chassis", sensorsAsyncResp->chassisId);
+ messages::resourceNotFound(asyncResp->res, "Chassis", chassisIdStr);
return;
}
+ populateChassisNode(asyncResp->res.jsonValue, chassisSubNode);
- const std::string& chassisSubNode = sensorsAsyncResp->chassisSubNode;
- if (chassisSubNode == sensors::node::power)
- {
- sensorsAsyncResp->asyncResp->res.jsonValue["@odata.type"] =
- "#Power.v1_5_2.Power";
- }
- else if (chassisSubNode == sensors::node::thermal)
- {
- sensorsAsyncResp->asyncResp->res.jsonValue["@odata.type"] =
- "#Thermal.v1_4_0.Thermal";
- sensorsAsyncResp->asyncResp->res.jsonValue["Fans"] =
- nlohmann::json::array();
- sensorsAsyncResp->asyncResp->res.jsonValue["Temperatures"] =
- nlohmann::json::array();
- }
- else if (chassisSubNode == sensors::node::sensors)
- {
- sensorsAsyncResp->asyncResp->res.jsonValue["@odata.type"] =
- "#SensorCollection.SensorCollection";
- sensorsAsyncResp->asyncResp->res.jsonValue["Description"] =
- "Collection of Sensors for this Chassis";
- sensorsAsyncResp->asyncResp->res.jsonValue["Members"] =
- nlohmann::json::array();
- sensorsAsyncResp->asyncResp->res.jsonValue["Members@odata.count"] =
- 0;
- }
+ asyncResp->res.jsonValue["@odata.id"] =
+ "/redfish/v1/Chassis/" + chassisIdStr + "/" + chassisSubNode;
- if (chassisSubNode != sensors::node::sensors)
- {
- sensorsAsyncResp->asyncResp->res.jsonValue["Id"] = chassisSubNode;
- }
-
- sensorsAsyncResp->asyncResp->res.jsonValue["@odata.id"] =
- "/redfish/v1/Chassis/" + sensorsAsyncResp->chassisId + "/" +
- chassisSubNode;
- sensorsAsyncResp->asyncResp->res.jsonValue["Name"] = chassisSubNode;
// Get the list of all sensors for this Chassis element
std::string sensorPath = *chassisPath + "/all_sensors";
sdbusplus::asio::getProperty<std::vector<std::string>>(
*crow::connections::systemBus, "xyz.openbmc_project.ObjectMapper",
sensorPath, "xyz.openbmc_project.Association", "endpoints",
- [sensorsAsyncResp,
+ [asyncResp, chassisSubNode, sensorTypes,
callback{std::forward<const Callback>(callback)}](
const boost::system::error_code& e,
const std::vector<std::string>& nodeSensorList) {
@@ -573,14 +571,15 @@
{
if (e.value() != EBADR)
{
- messages::internalError(sensorsAsyncResp->asyncResp->res);
+ messages::internalError(asyncResp->res);
return;
}
}
const std::shared_ptr<std::set<std::string>> culledSensorList =
std::make_shared<std::set<std::string>>();
- reduceSensorList(sensorsAsyncResp, &nodeSensorList,
- culledSensorList);
+ reduceSensorList(asyncResp->res, chassisSubNode, sensorTypes,
+ &nodeSensorList, culledSensorList);
+ BMCWEB_LOG_DEBUG << "Finishing with " << culledSensorList->size();
callback(culledSensorList);
});
};
@@ -2670,7 +2669,9 @@
nlohmann::json::array();
}
// Get set of sensors in chassis
- getChassis(sensorsAsyncResp, std::move(getChassisCb));
+ getChassis(sensorsAsyncResp->asyncResp, sensorsAsyncResp->chassisId,
+ sensorsAsyncResp->chassisSubNode, sensorsAsyncResp->types,
+ std::move(getChassisCb));
BMCWEB_LOG_DEBUG << "getChassisData exit";
}
@@ -2839,7 +2840,9 @@
std::move(getObjectsWithConnectionCb));
};
// get full sensor list for the given chassisId and cross verify the sensor.
- getChassis(sensorAsyncResp, std::move(getChassisSensorListCb));
+ getChassis(sensorAsyncResp->asyncResp, sensorAsyncResp->chassisId,
+ sensorAsyncResp->chassisSubNode, sensorAsyncResp->types,
+ std::move(getChassisSensorListCb));
}
/**
@@ -2951,7 +2954,9 @@
// We get all sensors as hyperlinkes in the chassis (this
// implies we reply on the default query parameters handler)
- getChassis(asyncResp,
+ getChassis(asyncResp->asyncResp, asyncResp->chassisId,
+ asyncResp->chassisSubNode, asyncResp->types,
+
std::bind_front(sensors::getChassisCallback, asyncResp));
BMCWEB_LOG_DEBUG << "SensorCollection doGet exit";
}