Association not created when sensors from DBus
Save the path when create virtual sensors from DBus.
Main functions after saving:
* Set the threshold on the path corresponding to entity-manager
* Create an association
I found that the sensor created by reading virtual_sensor_config.json will create association.
However,the virtual sensor created from DBus has no association,
so I added this.
In this way, my web/redfish can display this virtual sensor.
```
root@NULL:~# busctl introspect xyz.openbmc_project.VirtualSensor /xyz/openbmc_project/sensors/temperature/NVMe_MAX_Temp xyz.openbmc_project.Association.Definitions
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
.Associations property a(sss) 1 "chassis" "all_sensors" "/xyz/openbmc_project/inventory/system/nvme/NVMe_MAX" emits-change writable
```
The BMC web will find my all_sensor according to the following steps:
```
root@NULL:~# busctl call xyz.openbmc_project.ObjectMapper /xyz/openbmc_project/object_mapper xyz.openbmc_project.ObjectMapper GetSubTreePaths sias /xyz/openbmc_project/inventory 0 2 xyz.openbmc_project.Inventory.Item.Board xyz.openbmc_project.Inventory.Item.Chassis --verbose
MESSAGE "as" {
ARRAY "s" {
STRING "/xyz/openbmc_project/inventory/system/board/FP5280G2_Motherboard";
STRING "/xyz/openbmc_project/inventory/system/chassis";
STRING "/xyz/openbmc_project/inventory/system/nvme/NVMe_MAX";
};
};
root@NULL:~# busctl call xyz.openbmc_project.ObjectMapper /xyz/openbmc_project/inventory/system/nvme/NVMe_MAX/all_sensors org.freedesktop.DBus.Properties Get ss xyz.openbmc_project.Association endpoints --verbose
MESSAGE "v" {
VARIANT "as" {
ARRAY "s" {
STRING "/xyz/openbmc_project/sensors/temperature/NVMe_MAX_Temp";
};
};
};
```
Signed-off-by: Tao Lin <lintao.lc@inspur.com>
Change-Id: I5ab8ce532dde9cff837f85d1e27a0a420942a8ce
diff --git a/virtualSensor.cpp b/virtualSensor.cpp
index cbf3891..083178f 100644
--- a/virtualSensor.cpp
+++ b/virtualSensor.cpp
@@ -386,6 +386,22 @@
printParams(paramMap);
}
+void VirtualSensor::createAssociation(const std::string& objPath,
+ const std::string& entityPath)
+{
+ if (objPath.empty() || entityPath.empty())
+ {
+ return;
+ }
+
+ std::filesystem::path p(entityPath);
+ auto assocsDbus =
+ AssociationList{{"chassis", "all_sensors", p.parent_path().string()}};
+ associationIface =
+ std::make_unique<AssociationObject>(bus, objPath.c_str());
+ associationIface->associations(assocsDbus);
+}
+
void VirtualSensor::initVirtualSensor(const InterfaceMap& interfaceMap,
const std::string& objPath,
const std::string& sensorType,
@@ -414,6 +430,7 @@
symbols.add_package(vecopsPackage);
expression.register_symbol_table(symbols);
+ createAssociation(objPath, entityPath);
/* Print all parameters for debug purpose only */
if (DEBUG)
{
@@ -800,7 +817,7 @@
auto virtualSensorPtr = std::make_unique<VirtualSensor>(
bus, virtObjPath.c_str(), interfaceMap, name, sensorType,
- calculationIface);
+ calculationIface, objpath);
info("Added a new virtual sensor: {NAME} {TYPE}", "NAME", name,
"TYPE", sensorType);
virtualSensorPtr->updateVirtualSensor();
diff --git a/virtualSensor.hpp b/virtualSensor.hpp
index 8a9b115..286bca3 100644
--- a/virtualSensor.hpp
+++ b/virtualSensor.hpp
@@ -108,13 +108,15 @@
* @param[in] name - Virtual sensor name
* @param[in] type - Virtual sensor type/unit
* @param[in] calcType - Calculation used to calculate sensor value
+ * @param[in] entityPath - Virtual sensor path in entityManager Dbus
*
*/
VirtualSensor(sdbusplus::bus_t& bus, const char* objPath,
const InterfaceMap& ifacemap, const std::string& name,
- const std::string& type, const std::string& calculationType) :
+ const std::string& type, const std::string& calculationType,
+ const std::string& entityPath) :
ValueObject(bus, objPath, action::defer_emit),
- bus(bus), name(name)
+ bus(bus), name(name), entityPath(entityPath)
{
initVirtualSensor(ifacemap, objPath, type, calculationType);
}
@@ -136,6 +138,11 @@
sdbusplus::bus_t& bus;
/** @brief name of sensor */
std::string name;
+
+ /** @brief Virtual sensor path in entityManager Dbus.
+ * This value is used to set thresholds/create association
+ */
+ std::string entityPath;
/** @brief Expression string for virtual sensor value calculations */
std::string exprStr;
/** @brief symbol table from exprtk */
@@ -243,6 +250,10 @@
threshold->alarmLow(!alarmLow);
}
}
+
+ /** @brief Create Association from entityPath*/
+ void createAssociation(const std::string& objPath,
+ const std::string& entityPath);
};
class VirtualSensors