watchdog: Get only the initialized property during reset

Since we switched to resetting the watchdog with a built-in method, we
are only using a single property from the watchdog. Instead of fetching
all the properties and reading just the initialized one, only request
the initialized property from the watchdog.

Change-Id: I5e29b5100629e1ce23f352b0b749a434cd1ab793
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/app/watchdog.cpp b/app/watchdog.cpp
index dbd7426..da8ccf3 100644
--- a/app/watchdog.cpp
+++ b/app/watchdog.cpp
@@ -31,11 +31,10 @@
     try
     {
         WatchdogService wd_service;
-        WatchdogService::Properties wd_prop = wd_service.getProperties();
 
         // Notify the caller if we haven't initialized our timer yet
         // so it can configure actions and timeouts
-        if (!wd_prop.initialized)
+        if (!wd_service.getInitialized())
         {
             return IPMI_WDOG_CC_NOT_INIT;
         }
diff --git a/app/watchdog_service.cpp b/app/watchdog_service.cpp
index 26962dc..898cf77 100644
--- a/app/watchdog_service.cpp
+++ b/app/watchdog_service.cpp
@@ -85,6 +85,30 @@
 }
 
 template <typename T>
+T WatchdogService::getProperty(const std::string& key)
+{
+    bool wasValid = wd_service.isValid(bus);
+    auto request = wd_service.newMethodCall(bus, prop_intf, "Get");
+    request.append(wd_intf, key);
+    auto response = bus.call(request);
+    if (response.is_method_error())
+    {
+        wd_service.invalidate();
+        if (wasValid)
+        {
+            // Retry the request once in case the cached service was stale
+            return getProperty<T>(key);
+        }
+        log<level::ERR>("WatchdogService: Method error getting property",
+                        entry("PROPERTY=%s", key.c_str()));
+        elog<InternalFailure>();
+    }
+    variant<T> value;
+    response.read(value);
+    return get<T>(value);
+}
+
+template <typename T>
 void WatchdogService::setProperty(const std::string& key, const T& val)
 {
     bool wasValid = wd_service.isValid(bus);
@@ -105,6 +129,11 @@
     }
 }
 
+bool WatchdogService::getInitialized()
+{
+    return getProperty<bool>("Initialized");
+}
+
 void WatchdogService::setInitialized(bool initialized)
 {
     setProperty("Initialized", initialized);
diff --git a/app/watchdog_service.hpp b/app/watchdog_service.hpp
index ad92213..dfc913a 100644
--- a/app/watchdog_service.hpp
+++ b/app/watchdog_service.hpp
@@ -41,8 +41,15 @@
          */
         Properties getProperties();
 
+        /** @brief Get the value of the initialized property on the host
+         *         watchdog
+         *
+         *  @return The value of the property
+         */
+        bool getInitialized();
+
         /** @brief Sets the value of the initialized property on the host
-		 *         watchdog
+         *         watchdog
          *
          *  @param[in] initialized - The new initializedvalue
          */
@@ -79,6 +86,14 @@
         /** @brief The name of the mapped host watchdog service */
         static ipmi::ServiceCache wd_service;
 
+        /** @brief Gets the value of the property on the host watchdog
+         *
+         *  @param[in] key - The name of the property
+         *  @return The value of the property
+         */
+        template <typename T>
+        T getProperty(const std::string& key);
+
         /** @brief Sets the value of the property on the host watchdog
          *
          *  @param[in] key - The name of the property