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