callback-manager: Add association manager
This adds an association manager based on Redfish health
whitepaper to do a rollup of subcomponent health.
https://gerrit.openbmc-project.xyz/c/openbmc/docs/+/21380
Tested:
Chassis health rollup works with upstream patch 21798
{
"@odata.context": "/redfish/v1/$metadata#Chassis.Chassis",
"@odata.id": "/redfish/v1/Chassis/WFP_Baseboard",
"@odata.type": "#Chassis.v1_4_0.Chassis",
"ChassisType": "RackMount",
"Id": "WFP_Baseboard",
"Links": {
"ComputerSystems": [
{
"@odata.id": "/redfish/v1/Systems/system"
}
],
"ManagedBy": [
{
"@odata.id": "/redfish/v1/Managers/bmc"
}
]
},
"Manufacturer": "Intel Corporation",
"Model": "S2600WFT",
"Name": "WFP_Baseboard",
"PartNumber": "123456789",
"Power": {
"@odata.id": "/redfish/v1/Chassis/WFP_Baseboard/Power"
},
"PowerState": "Off",
"SerialNumber": "123454321",
"Status": {
"Health": "Warning",
"HealthRollup": "Critical",
"State": "StandbyOffline"
},
"Thermal": {
"@odata.id": "/redfish/v1/Chassis/WFP_Baseboard/Thermal"
}
}
Change-Id: I1d944f31749f6eae952573078ad410547ae9faea
Signed-off-by: James Feist <james.feist@linux.intel.com>
diff --git a/callback-manager/src/callback_manager.cpp b/callback-manager/src/callback_manager.cpp
index 34506d9..ba59306 100644
--- a/callback-manager/src/callback_manager.cpp
+++ b/callback-manager/src/callback_manager.cpp
@@ -14,8 +14,9 @@
// limitations under the License.
*/
+#include "callback_manager.hpp"
+
#include <boost/container/flat_map.hpp>
-#include <iostream>
#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <variant>
@@ -33,6 +34,8 @@
constexpr const char* ledManagerBusname =
"xyz.openbmc_project.LED.GroupManager";
+std::unique_ptr<AssociationManager> associationManager;
+
enum class StatusSetting
{
none,
@@ -42,8 +45,6 @@
fatal
};
-std::shared_ptr<sdbusplus::asio::dbus_interface> assertedIface = nullptr;
-
constexpr const bool debug = false;
// final led state tracking
@@ -82,18 +83,17 @@
void updateLedStatus(std::shared_ptr<sdbusplus::asio::connection>& conn,
bool forceRefresh = false)
{
- std::vector<std::string> assertedVector = assertedInMap(fatalAssertMap);
- assertedIface->set_property("Fatal", assertedVector);
- bool fatal = assertedVector.size();
+ std::vector<std::string> fatalVector = assertedInMap(fatalAssertMap);
+ bool fatal = fatalVector.size();
- assertedVector = assertedInMap(criticalAssertMap);
- assertedIface->set_property("Critical", assertedVector);
- bool critical = assertedVector.size();
+ std::vector<std::string> criticalVector = assertedInMap(criticalAssertMap);
+ bool critical = criticalVector.size();
- assertedVector = assertedInMap(warningAssertMap);
- assertedIface->set_property("Warning", assertedVector);
+ std::vector<std::string> warningVector = assertedInMap(warningAssertMap);
+ bool warn = warningVector.size();
- bool warn = assertedVector.size();
+ associationManager->setLocalAssociations(fatalVector, criticalVector,
+ warningVector);
StatusSetting last = currentPriority;
@@ -237,15 +237,18 @@
auto conn = std::make_shared<sdbusplus::asio::connection>(io);
conn->request_name("xyz.openbmc_project.CallbackManager");
sdbusplus::asio::object_server objServer(conn);
- assertedIface =
- objServer.add_interface("/xyz/openbmc_project/CallbackManager",
+ std::shared_ptr<sdbusplus::asio::dbus_interface> rootIface =
+ objServer.add_interface(rootPath,
"xyz.openbmc_project.CallbackManager");
- assertedIface->register_property("Warning", std::vector<std::string>());
- assertedIface->register_property("Critical", std::vector<std::string>());
- assertedIface->register_property("Fatal", std::vector<std::string>());
- assertedIface->register_method("RetriggerLEDUpdate",
- [&conn]() { updateLedStatus(conn, true); });
- assertedIface->initialize();
+ rootIface->register_method("RetriggerLEDUpdate",
+ [&conn]() { updateLedStatus(conn, true); });
+ rootIface->initialize();
+
+ std::shared_ptr<sdbusplus::asio::dbus_interface> inventoryIface =
+ objServer.add_interface(rootPath, globalInventoryIface);
+ inventoryIface->initialize();
+
+ associationManager = std::make_unique<AssociationManager>(objServer, conn);
createThresholdMatch(conn);
updateLedStatus(conn);