Update U-boot env variables

- If the new priority is the lowest then set the uboot to point
  to that particular version
- Otherwise reset the Uboot environment variable to find the version
  with the lowest priority and then set that in uboot.

Resolves openbmc/openbmc#2512

Change-Id: Id27e78a85662e0ff2e941515bb467a43c6076d96
Signed-off-by: Saqib Khan <khansa@us.ibm.com>
diff --git a/activation.cpp b/activation.cpp
index 73eb651..ae8ebe9 100644
--- a/activation.cpp
+++ b/activation.cpp
@@ -155,10 +155,44 @@
 {
     parent.parent.freePriority(value, parent.versionId);
     storeToFile(parent.versionId, value);
-    parent.parent.resetUbootEnvVars();
+
+    // Update U-Boot env variable to point to this version if it has the
+    // lowest priority. Otherwise, reset the UbootEnvVars to find the lowest
+    // priority version and set that in U-Boot.
+    if (parent.parent.isLowestPriority(value))
+    {
+        parent.updateUbootEnvVars();
+    }
+    else
+    {
+        parent.parent.resetUbootEnvVars();
+    }
+
     return softwareServer::RedundancyPriority::priority(value);
 }
 
+// TODO: openbmc/openbmc#2369 Add recovery policy to updateubootvars
+//       unit template.
+void Activation::updateUbootEnvVars()
+{
+    auto method = bus.new_method_call(
+            SYSTEMD_BUSNAME,
+            SYSTEMD_PATH,
+            SYSTEMD_INTERFACE,
+            "StartUnit");
+    auto updateEnvVarsFile = "obmc-flash-bmc-updateubootvars@" + versionId +
+            ".service";
+    method.append(updateEnvVarsFile, "replace");
+    auto result = bus.call(method);
+
+    //Check that the bus call didn't result in an error
+    if (result.is_method_error())
+    {
+        log<level::ERR>("Failed to update u-boot env variables",
+                        entry("VERSIONID=%s", versionId));
+    }
+}
+
 void Activation::unitStateChange(sdbusplus::message::message& msg)
 {
     if (softwareServer::Activation::activation() !=
diff --git a/activation.hpp b/activation.hpp
index cf4b5c2..6c303db 100644
--- a/activation.hpp
+++ b/activation.hpp
@@ -266,6 +266,13 @@
         void unsubscribeFromSystemdSignals();
 
         /**
+         * @brief Updates the U-Boot variables to point to this activation's
+         *        versionId, so that the systems boots from this version on
+         *        the next reboot.
+         */
+        void updateUbootEnvVars();
+
+        /**
          * @brief delete the d-bus object.
          */
         void delete_() override;
diff --git a/item_updater.cpp b/item_updater.cpp
index e2de36f..e7e3b36 100644
--- a/item_updater.cpp
+++ b/item_updater.cpp
@@ -602,23 +602,9 @@
         }
     }
 
-    // TODO: openbmc/openbmc#2369 Add recovery policy to updateubootvars
-    //       unit template.
-    auto method = bus.new_method_call(
-            SYSTEMD_BUSNAME,
-            SYSTEMD_PATH,
-            SYSTEMD_INTERFACE,
-            "StartUnit");
-    auto updateEnvVarsFile = "obmc-flash-bmc-updateubootvars@" +
-                             lowestPriorityVersion + ".service";
-    method.append(updateEnvVarsFile, "replace");
-    auto result = bus.call(method);
-
-    //Check that the bus call didn't result in an error
-    if (result.is_method_error())
-    {
-        log<level::ERR>("Failed to update u-boot env variables");
-    }
+    // Update the U-boot environment variable to point to the lowest priority
+    auto it = activations.find(lowestPriorityVersion);
+    it->second->updateUbootEnvVars();
 }
 
 } // namespace updater