Implementation of OS status, boot count and boot progress

Change-Id: I1b00a932db2533b83fa0bd7bb4fbd62c0299bff7
Signed-off-by: Dhruvaraj Subhashchandran <dhruvaraj@in.ibm.com>
diff --git a/configure.ac b/configure.ac
index 7c01962..28f51ae 100644
--- a/configure.ac
+++ b/configure.ac
@@ -60,6 +60,10 @@
 AC_DEFINE_UNQUOTED([HOST_STATE_PERSIST_PATH], ["$HOST_STATE_PERSIST_PATH"], \
     [Path of file for storing requested host state.])
 
+AC_ARG_VAR(BOOT_COUNT_MAX_ALLOWED, [The maximum allowed reboot count])
+AS_IF([test "x$BOOT_COUNT_MAX_ALLOWED" == "x"], [BOOT_COUNT_MAX_ALLOWED=3])
+AC_DEFINE_UNQUOTED([BOOT_COUNT_MAX_ALLOWED], [$BOOT_COUNT_MAX_ALLOWED], [The maximum allowed reboot count])
+
 # Check for header files.
 AC_CHECK_HEADER(systemd/sd-bus.h, ,[AC_MSG_ERROR([Could not find systemd/sd-bus.h...systemd developement package required])])
 AC_CHECK_HEADER(sdbusplus/server.hpp, ,[AC_MSG_ERROR([Could not find sdbusplus/server.hpp...openbmc/sdbusplus package required])])
diff --git a/host_state_manager.cpp b/host_state_manager.cpp
index 6e2fd22..83f21e7 100644
--- a/host_state_manager.cpp
+++ b/host_state_manager.cpp
@@ -52,16 +52,9 @@
 constexpr auto MAPPER_PATH = "/xyz/openbmc_project/object_mapper";
 constexpr auto MAPPER_INTERFACE = "xyz.openbmc_project.ObjectMapper";
 
-constexpr auto REBOOTCOUNTER_SERVICE("org.openbmc.Sensors");
-constexpr auto REBOOTCOUNTER_PATH("/org/openbmc/sensors/host/BootCount");
-constexpr auto REBOOTCOUNTER_INTERFACE("org.openbmc.SensorValue");
-
 constexpr auto SYSTEMD_PROPERTY_IFACE = "org.freedesktop.DBus.Properties";
 constexpr auto SYSTEMD_INTERFACE_UNIT = "org.freedesktop.systemd1.Unit";
 
-// TODO openbmc/openbmc#1646 - boot count needs to be defined in 1 place
-constexpr auto DEFAULT_BOOTCOUNT = 3;
-
 /* Map a system state to the HostState */
 const std::map<std::string, server::Host::HostState> SYS_HOST_STATE_TABLE = {
         {"HOST_BOOTING", server::Host::HostState::Running},
@@ -102,7 +95,7 @@
 
     auto restore = getStateRestoreSetting();
 
-    if ((!restore) || (!deserialize(HOST_STATE_PERSIST_PATH,*this)))
+    if ((!restore) || (!deserialize(HOST_STATE_PERSIST_PATH, *this)))
     {
         //set to default value.
         server::Host::requestedHostTransition(Transition::Off);
@@ -213,17 +206,6 @@
     return true;
 }
 
-void Host::setHostbootCount(int bootCount)
-{
-    auto method = this->bus.new_method_call(REBOOTCOUNTER_SERVICE,
-                                            REBOOTCOUNTER_PATH,
-                                            REBOOTCOUNTER_INTERFACE,
-                                            "setValue");
-    sdbusplus::message::variant<int> newParam = bootCount;
-    method.append(newParam);
-    this->bus.call_noreply(method);
-}
-
 bool Host::isAutoReboot()
 {
     using namespace settings;
@@ -245,29 +227,16 @@
     sdbusplus::message::variant<bool> result;
     reply.read(result);
     auto autoReboot = result.get<bool>();
-
-    sdbusplus::message::variant<int> rebootCounterParam = 0;
-    method = this->bus.new_method_call(REBOOTCOUNTER_SERVICE,
-                                       REBOOTCOUNTER_PATH,
-                                       REBOOTCOUNTER_INTERFACE,
-                                       "getValue");
-    reply = this->bus.call(method);
-    if (reply.is_method_error())
-    {
-        log<level::ERR>("Error in BOOTCOUNT getValue");
-        return false;
-    }
-    reply.read(rebootCounterParam);
+    auto rebootCounterParam = attemptsLeft();
 
     if (autoReboot)
     {
-        if ( rebootCounterParam > 0)
+        if (rebootCounterParam > 0)
         {
             // Reduce BOOTCOUNT by 1
             log<level::INFO>("Auto reboot enabled. "
                              "Reducing HOST BOOTCOUNT by 1.");
-            Host::setHostbootCount((sdbusplus::message::variant_ns::
-                                    get<int>(rebootCounterParam)) - 1);
+            attemptsLeft(rebootCounterParam - 1);
             return true;
         }
         else if(rebootCounterParam == 0)
@@ -275,7 +244,7 @@
             // Reset reboot counter and go to quiesce state
             log<level::INFO>("Auto reboot enabled. "
                              "HOST BOOTCOUNT already set to 0.");
-            Host::setHostbootCount(DEFAULT_BOOTCOUNT);
+            attemptsLeft(BOOT_COUNT_MAX_ALLOWED);
             return false;
         }
         else
diff --git a/host_state_manager.hpp b/host_state_manager.hpp
index 8204931..41310d6 100644
--- a/host_state_manager.hpp
+++ b/host_state_manager.hpp
@@ -3,8 +3,12 @@
 #include <string>
 #include <functional>
 #include <sdbusplus/bus.hpp>
+#include <xyz/openbmc_project/State/Boot/Progress/server.hpp>
+#include <xyz/openbmc_project/Control/Boot/RebootAttempts/server.hpp>
+#include <xyz/openbmc_project/State/OperatingSystem/Status/server.hpp>
 #include "xyz/openbmc_project/State/Host/server.hpp"
 #include "settings.hpp"
+#include "config.h"
 
 namespace phosphor
 {
@@ -14,7 +18,11 @@
 {
 
 using HostInherit = sdbusplus::server::object::object<
-        sdbusplus::xyz::openbmc_project::State::server::Host>;
+        sdbusplus::xyz::openbmc_project::State::server::Host,
+        sdbusplus::xyz::openbmc_project::State::Boot::server::Progress,
+        sdbusplus::xyz::openbmc_project::Control::Boot::server::RebootAttempts,
+        sdbusplus::xyz::openbmc_project::State::OperatingSystem::server::Status>;
+
 namespace sdbusRule = sdbusplus::bus::match::rules;
 
 /** @class Host
@@ -57,6 +65,8 @@
             // Will throw exception on fail
             determineInitialState();
 
+            attemptsLeft(BOOT_COUNT_MAX_ALLOWED);
+
             // We deferred this until we could get our property correct
             this->emit_object_added();
         }
@@ -106,13 +116,6 @@
         bool stateActive(const std::string& target);
 
         /**
-         * @brief Set the HOST BOOTCOUNT Sensor value
-         *
-         * @param[in] bootCount  - new BOOTCOUNT value
-         */
-        void setHostbootCount(int bootCount);
-
-        /**
          * @brief Determine if auto reboot flag is set
          *
          * @return boolean corresponding to current auto_reboot setting