Sync PSU images on service startup
On service startup, it shall check the PSU images, find a latest
version, and update to the PSUs that are not with this version.
Tested: With dummy image and service, test on Witherspoon with 2
different running PSU software:
* When startup without stored image, the serive tries to update an older
PSU but it does not have PSU image, so it's skipped with below journal
log:
Automatically update PSU
No image for the activation, skipped
* When startup with an older image stored in BMC, it behaves the same as
above.
* When startup with a new image stored in BMC, it updates the PSUs, with
below example journal log:
Automatically update PSU
Starting Update PSU
/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0
/var/lib/obmc/psu/2B1D...
Started Update PSU
/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply0
/var/lib/obmc/psu/2B1D.
Starting Update PSU
/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1
/var/lib/obmc/psu/2B1D...
Started Update PSU
/xyz/openbmc_project/inventory/system/chassis/motherboard/powersupply1
/var/lib/obmc/psu/2B1D.
Signed-off-by: Lei YU <mine260309@gmail.com>
Change-Id: I6d676c5a4441685fb2b5920455f439c00f6097af
diff --git a/src/item_updater.cpp b/src/item_updater.cpp
index 13e6bf4..acbc943 100644
--- a/src/item_updater.cpp
+++ b/src/item_updater.cpp
@@ -435,6 +435,40 @@
return versionId;
}
+void ItemUpdater::syncToLatestImage()
+{
+ auto latestVersionId = getLatestVersionId();
+ if (!latestVersionId)
+ {
+ return;
+ }
+ const auto& it = activations.find(*latestVersionId);
+ assert(it != activations.end());
+ const auto& activation = it->second;
+ const auto& assocs = activation->associations();
+
+ auto paths = utils::getPSUInventoryPath(bus);
+ for (const auto& p : paths)
+ {
+ // As long as there is a PSU is not associated with the latest image,
+ // run the activation so that all PSUs are running the same latest
+ // image.
+ if (!utils::isAssociated(p, assocs))
+ {
+ log<level::INFO>("Automatically update PSU",
+ entry("VERSION_ID=%s", latestVersionId->c_str()));
+ invokeActivation(activation);
+ break;
+ }
+ }
+}
+
+void ItemUpdater::invokeActivation(
+ const std::unique_ptr<Activation>& activation)
+{
+ activation->requestedActivation(Activation::RequestedActivations::Active);
+}
+
} // namespace updater
} // namespace software
} // namespace phosphor