diff options
-rw-r--r-- | activation.cpp | 36 | ||||
-rw-r--r-- | activation.hpp | 7 | ||||
-rw-r--r-- | item_updater.cpp | 20 |
3 files changed, 45 insertions, 18 deletions
diff --git a/activation.cpp b/activation.cpp index 73eb651..ae8ebe9 100644 --- a/activation.cpp +++ b/activation.cpp @@ -155,10 +155,44 @@ uint8_t RedundancyPriority::priority(uint8_t value) { 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 @@ class Activation : public ActivationInherit 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 @@ void ItemUpdater::resetUbootEnvVars() } } - // 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 |