xref: /openbmc/phosphor-bmc-code-mgmt/common/include/software.hpp (revision de5e76fa894a3e3ab28c2bdb4d7b7b460718fa01)
1 #pragma once
2 
3 #include "software_update.hpp"
4 
5 #include <sdbusplus/async/context.hpp>
6 #include <xyz/openbmc_project/Association/Definitions/aserver.hpp>
7 #include <xyz/openbmc_project/Software/Activation/aserver.hpp>
8 #include <xyz/openbmc_project/Software/ActivationBlocksTransition/aserver.hpp>
9 #include <xyz/openbmc_project/Software/ActivationProgress/aserver.hpp>
10 #include <xyz/openbmc_project/Software/Version/aserver.hpp>
11 #include <xyz/openbmc_project/Software/Version/client.hpp>
12 
13 #include <string>
14 
15 namespace phosphor::software::device
16 {
17 class Device;
18 }
19 
20 namespace phosphor::software
21 {
22 
23 // Need to declare this class to initialize the protected members of our base
24 // class. This prevents "Conditional jump or move depends on uninitialised
25 // value(s)" when properties are updated for the first time.
26 class SoftwareActivationProgress :
27     private sdbusplus::aserver::xyz::openbmc_project::software::
28         ActivationProgress<Software>
29 {
30   public:
31     SoftwareActivationProgress(sdbusplus::async::context& ctx,
32                                const char* objPath);
33 
34     void setProgress(int progressArg);
35 };
36 
37 using SoftwareActivationBlocksTransition = sdbusplus::aserver::xyz::
38     openbmc_project::software::ActivationBlocksTransition<Software>;
39 
40 using SoftwareVersion =
41     sdbusplus::aserver::xyz::openbmc_project::software::Version<Software>;
42 using SoftwareActivation =
43     sdbusplus::aserver::xyz::openbmc_project::software::Activation<Software>;
44 using SoftwareAssociationDefinitions =
45     sdbusplus::aserver::xyz::openbmc_project::association::Definitions<
46         Software>;
47 
48 // This represents a software version running on the device.
49 class Software : private SoftwareActivation
50 {
51   public:
52     Software(sdbusplus::async::context& ctx, device::Device& parent);
53 
54     // Set the activation status of this software
55     // @param activation         The activation status
56     void setActivation(SoftwareActivation::Activations activation);
57 
58     // Add / remove the 'ActivationBlocksTransition' dbus interface.
59     // This dbus interface is only needed during the update process.
60     // @param enabled       determines if the dbus interface should be there
61     void setActivationBlocksTransition(bool enabled);
62 
63     // This should populate 'softwareUpdate'
64     // @param allowedApplyTimes        When updates to this Version can be
65     // applied
66     void enableUpdate(const std::set<RequestedApplyTimes>& allowedApplyTimes);
67 
68     // This should populate 'softwareVersion'
69     // @param version         the version string
70     // @param versionPurpose  which kind of software
71     void setVersion(const std::string& versionStr,
72                     SoftwareVersion::VersionPurpose versionPurpose =
73                         SoftwareVersion::VersionPurpose::Unknown);
74 
75     // Return the version purpose
76     SoftwareVersion::VersionPurpose getPurpose();
77 
78     // This should populate 'softwareAssociationDefinitions'
79     // @param isRunning             if the software version is currently running
80     // on the device. Otherwise the software is assumed to be activating (not
81     // yet running).
82     sdbusplus::async::task<> createInventoryAssociations(bool isRunning);
83 
84     // object path of this software
85     sdbusplus::message::object_path objectPath;
86 
87     // The device we are associated to, meaning this software is either running
88     // on the device, or could potentially run on that device (update).
89     device::Device& parentDevice;
90 
91     // The software id
92     const std::string swid;
93 
94     // This is only required during the activation of the new fw
95     // and is deleted again afterwards.
96     // This member is public since the device specific update function
97     // needs to update the progress.
98     std::unique_ptr<SoftwareActivationProgress> softwareActivationProgress =
99         nullptr;
100 
101   protected:
102     // @returns        a random software id (swid) for that device
103     static std::string getRandomSoftwareId(device::Device& parent);
104 
105   private:
106     Software(sdbusplus::async::context& ctx, device::Device& parent,
107              const std::string& swid);
108 
109     // Dbus interface to prevent power state transition during update.
110     std::unique_ptr<SoftwareActivationBlocksTransition>
111         activationBlocksTransition = nullptr;
112 
113     // The software update dbus interface is not always present.
114     // It is constructed if the software version is able to be updated.
115     // For the new software version, this interface is constructed after the
116     // update has taken effect
117     std::unique_ptr<update::SoftwareUpdate> updateIntf = nullptr;
118 
119     // We do not know the software version until we parse the PLDM package.
120     // Since the Activation interface needs to be available
121     // before then, this is nullptr until we get to know the version.
122     std::unique_ptr<SoftwareVersion> version = nullptr;
123 
124     // This represents our association to the inventory item in case
125     // this software is currently on the device.
126     std::unique_ptr<SoftwareAssociationDefinitions> associationDefinitions =
127         nullptr;
128 
129     sdbusplus::async::context& ctx;
130 
131     friend update::SoftwareUpdate;
132 };
133 
134 }; // namespace phosphor::software
135