Activation: Add activationProgress

Use ActivationProgress to provide the PSU update progress.

Signed-off-by: Lei YU <mine260309@gmail.com>
Change-Id: I92d8c1425cf5ec1d0ff192a822a60f0c59bd8110
diff --git a/src/activation.cpp b/src/activation.cpp
index 131e480..0ba7e64 100644
--- a/src/activation.cpp
+++ b/src/activation.cpp
@@ -59,6 +59,7 @@
     else
     {
         activationBlocksTransition.reset();
+        activationProgress.reset();
     }
 
     return SoftwareActivation::activation(value);
@@ -104,6 +105,10 @@
 
 void Activation::startActivation()
 {
+    if (!activationProgress)
+    {
+        activationProgress = std::make_unique<ActivationProgress>(bus, path);
+    }
     if (!activationBlocksTransition)
     {
         activationBlocksTransition =
@@ -124,11 +129,15 @@
                                       SYSTEMD_INTERFACE, "StartUnit");
     method.append(psuUpdateUnit, "replace");
     bus.call_noreply(method);
+
+    activationProgress->progress(10);
 }
 
 void Activation::finishActivation()
 {
+    activationProgress->progress(100);
     activationBlocksTransition.reset();
+    activationProgress.reset();
 
     // TODO: delete the old software object
     // TODO: create related associations
diff --git a/src/activation.hpp b/src/activation.hpp
index a15a0a7..d7880f6 100644
--- a/src/activation.hpp
+++ b/src/activation.hpp
@@ -8,6 +8,7 @@
 #include <xyz/openbmc_project/Association/Definitions/server.hpp>
 #include <xyz/openbmc_project/Software/Activation/server.hpp>
 #include <xyz/openbmc_project/Software/ActivationBlocksTransition/server.hpp>
+#include <xyz/openbmc_project/Software/ActivationProgress/server.hpp>
 #include <xyz/openbmc_project/Software/ExtendedVersion/server.hpp>
 
 namespace phosphor
@@ -59,6 +60,39 @@
     std::string path;
 };
 
+using ActivationProgressInherit = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::Software::server::ActivationProgress>;
+
+class ActivationProgress : public ActivationProgressInherit
+{
+  public:
+    /** @brief Constructs ActivationProgress.
+     *
+     * @param[in] bus    - The Dbus bus object
+     * @param[in] path   - The Dbus object path
+     */
+    ActivationProgress(sdbusplus::bus::bus& bus, const std::string& path) :
+        ActivationProgressInherit(bus, path.c_str(), true), bus(bus), path(path)
+    {
+        progress(0);
+        std::vector<std::string> interfaces({interface});
+        bus.emit_interfaces_added(path.c_str(), interfaces);
+    }
+
+    ~ActivationProgress()
+    {
+        std::vector<std::string> interfaces({interface});
+        bus.emit_interfaces_removed(path.c_str(), interfaces);
+    }
+
+  private:
+    // TODO Remove once openbmc/openbmc#1975 is resolved
+    static constexpr auto interface =
+        "xyz.openbmc_project.Software.ActivationProgress";
+    sdbusplus::bus::bus& bus;
+    std::string path;
+};
+
 using ActivationInherit = sdbusplus::server::object::object<
     sdbusplus::xyz::openbmc_project::Software::server::ExtendedVersion,
     sdbusplus::xyz::openbmc_project::Software::server::Activation,
@@ -166,6 +200,9 @@
 
     /** @brief Persistent ActivationBlocksTransition dbus object */
     std::unique_ptr<ActivationBlocksTransition> activationBlocksTransition;
+
+    /** @brief Persistent ActivationProgress dbus object */
+    std::unique_ptr<ActivationProgress> activationProgress;
 };
 
 } // namespace updater