Activation: Add activationBlocksTransition

Use activationBlocksTransition during PSU code update, which prevent
host from powering on during the activation.

Signed-off-by: Lei YU <mine260309@gmail.com>
Change-Id: Ie303a99d9bbfee49c949884f16dbca0c5b08ee6e
diff --git a/src/activation.cpp b/src/activation.cpp
index 2230d0f..131e480 100644
--- a/src/activation.cpp
+++ b/src/activation.cpp
@@ -58,7 +58,7 @@
     }
     else
     {
-        // TODO
+        activationBlocksTransition.reset();
     }
 
     return SoftwareActivation::activation(value);
@@ -104,6 +104,12 @@
 
 void Activation::startActivation()
 {
+    if (!activationBlocksTransition)
+    {
+        activationBlocksTransition =
+            std::make_unique<ActivationBlocksTransition>(bus, path);
+    }
+
     // TODO: for now only update one psu, future commits shall handle update
     // multiple psus
     auto psuPaths = utils::getPSUInventoryPath(bus);
@@ -122,6 +128,8 @@
 
 void Activation::finishActivation()
 {
+    activationBlocksTransition.reset();
+
     // TODO: delete the old software object
     // TODO: create related associations
     deleteImageManagerObject();
diff --git a/src/activation.hpp b/src/activation.hpp
index 6d5de67..a15a0a7 100644
--- a/src/activation.hpp
+++ b/src/activation.hpp
@@ -7,6 +7,7 @@
 #include <sdbusplus/server.hpp>
 #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/ExtendedVersion/server.hpp>
 
 namespace phosphor
@@ -18,6 +19,46 @@
 
 namespace sdbusRule = sdbusplus::bus::match::rules;
 
+using ActivationBlocksTransitionInherit = sdbusplus::server::object::object<
+    sdbusplus::xyz::openbmc_project::Software::server::
+        ActivationBlocksTransition>;
+
+/** @class ActivationBlocksTransition
+ *  @brief OpenBMC ActivationBlocksTransition implementation.
+ *  @details A concrete implementation for
+ *  xyz.openbmc_project.Software.ActivationBlocksTransition DBus API.
+ */
+class ActivationBlocksTransition : public ActivationBlocksTransitionInherit
+{
+  public:
+    /** @brief Constructs ActivationBlocksTransition.
+     *
+     * @param[in] bus    - The Dbus bus object
+     * @param[in] path   - The Dbus object path
+     */
+    ActivationBlocksTransition(sdbusplus::bus::bus& bus,
+                               const std::string& path) :
+        ActivationBlocksTransitionInherit(bus, path.c_str(), true),
+        bus(bus), path(path)
+    {
+        std::vector<std::string> interfaces({interface});
+        bus.emit_interfaces_added(path.c_str(), interfaces);
+    }
+
+    ~ActivationBlocksTransition()
+    {
+        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.ActivationBlocksTransition";
+    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,
@@ -122,6 +163,9 @@
 
     /** @brief The PSU update systemd unit */
     std::string psuUpdateUnit;
+
+    /** @brief Persistent ActivationBlocksTransition dbus object */
+    std::unique_ptr<ActivationBlocksTransition> activationBlocksTransition;
 };
 
 } // namespace updater