fw update: common code
new daemons to implement the flow as described in
https://github.com/openbmc/docs/blob/master/designs/code-update.md
- common/
common code folder
- common update flow
- base class for the device specific update daemons
The new daemons are all following the generic template of Code Updater
daemon as outlined in the design.
The idea is that they are separate daemons (per device, as outlined in
the design) but share all the code that's not device specific.
Tested: next patch in series
Change-Id: If2438b8506aceb8c5313ec13a0bf7cb68f3cc279
Signed-off-by: Alexander Hansen <alexander.hansen@9elements.com>
diff --git a/common/include/software.hpp b/common/include/software.hpp
new file mode 100644
index 0000000..6b96f09
--- /dev/null
+++ b/common/include/software.hpp
@@ -0,0 +1,124 @@
+#pragma once
+
+#include "software_update.hpp"
+
+#include <sdbusplus/async/context.hpp>
+#include <xyz/openbmc_project/Association/Definitions/aserver.hpp>
+#include <xyz/openbmc_project/Software/Activation/aserver.hpp>
+#include <xyz/openbmc_project/Software/ActivationBlocksTransition/aserver.hpp>
+#include <xyz/openbmc_project/Software/ActivationProgress/aserver.hpp>
+#include <xyz/openbmc_project/Software/Version/aserver.hpp>
+
+#include <string>
+
+// Need to declare this class to initialize the protected members of our base
+// class. This prevents "Conditional jump or move depends on uninitialised
+// value(s)" when properties are updated for the first time.
+class SoftwareActivationProgress :
+ public sdbusplus::aserver::xyz::openbmc_project::software::
+ ActivationProgress<Software>
+{
+ public:
+ SoftwareActivationProgress(sdbusplus::async::context& ctx,
+ const char* objPath);
+};
+
+using SoftwareActivationBlocksTransition = sdbusplus::aserver::xyz::
+ openbmc_project::software::ActivationBlocksTransition<Software>;
+
+using SoftwareVersion =
+ sdbusplus::aserver::xyz::openbmc_project::software::Version<Software>;
+using SoftwareActivation =
+ sdbusplus::aserver::xyz::openbmc_project::software::Activation<Software>;
+using SoftwareAssociationDefinitions =
+ sdbusplus::aserver::xyz::openbmc_project::association::Definitions<
+ Software>;
+
+class Device;
+
+// This represents a software version running on the device.
+class Software : private SoftwareActivation
+{
+ public:
+ Software(sdbusplus::async::context& ctx, const std::string& swid,
+ Device& parent);
+
+ // @returns object path of this software
+ sdbusplus::message::object_path getObjectPath() const;
+
+ // The software id
+ const std::string swid;
+
+ // Set the activation status of this software
+ // @param activation The activation status
+ void setActivation(sdbusplus::common::xyz::openbmc_project::software::
+ Activation::Activations activation);
+
+ // Add / remove the 'ActivationBlocksTransition' dbus interface.
+ // This dbus interface is only needed during the update process.
+ // @param enabled determines if the dbus interface should be there
+ void setActivationBlocksTransition(bool enabled);
+
+ // This is only required during the activation of the new fw
+ // and is deleted again afterwards.
+ // This member is public since the device specific update function
+ // needs to update the progress.
+ std::unique_ptr<SoftwareActivationProgress> optSoftwareActivationProgress =
+ nullptr;
+
+ // This should populate 'optSoftwareUpdate'
+ // @param allowedApplyTimes When updates to this Version can be
+ // applied
+ void enableUpdate(const std::set<RequestedApplyTimes>& allowedApplyTimes);
+
+ // This should populate 'optSoftwareVersion'
+ // @param version the version string
+ void setVersion(const std::string& versionStr);
+
+ // This should populate 'optSoftwareAssociationDefinitions'
+ // @param isRunning if the software version is currently running
+ // on the device
+ // @param isActivating if the software version is currently
+ // activating (not yet running) on the device
+ sdbusplus::async::task<> setAssociationDefinitionsRunningActivating(
+ bool isRunning, bool isActivating);
+
+ // @returns this->parent
+ Device& getParentDevice();
+
+ protected:
+ // @returns a random software id (swid) for that device
+ static std::string getRandomSoftwareId(Device& parent);
+
+ private:
+ // @returns the object path for the a software with that swid
+ static std::string getObjPathFromSwid(const std::string& swid);
+
+ // The device we are associated to, meaning this software is either running
+ // on the device, or could potentially run on that device (update).
+ Device& parent;
+
+ // Dbus interface to prevent power state transition during update.
+ std::unique_ptr<SoftwareActivationBlocksTransition>
+ optActivationBlocksTransition = nullptr;
+
+ // The software update dbus interface is not always present.
+ // It is constructed if the software version is able to be updated.
+ // For the new software version, this interface is constructed after the
+ // update has taken effect
+ std::unique_ptr<SoftwareUpdate> optSoftwareUpdate = nullptr;
+
+ // We do not know the software version until we parse the PLDM package.
+ // Since the Activation interface needs to be available
+ // before then, this is nullptr until we get to know the version.
+ std::unique_ptr<SoftwareVersion> optSoftwareVersion = nullptr;
+
+ // This represents our association to the inventory item in case
+ // this software is currently on the device.
+ std::unique_ptr<SoftwareAssociationDefinitions>
+ optSoftwareAssociationDefinitions = nullptr;
+
+ sdbusplus::async::context& ctx;
+
+ friend SoftwareUpdate;
+};