blob: b0e04eb9eab4915bb55bb1e73f994395be2b3166 [file] [log] [blame]
Lei YU01539e72019-07-31 10:57:38 +08001#pragma once
2
3#include "config.h"
4
5#include "activation.hpp"
Lei YU7f2a2152019-09-16 16:50:18 +08006#include "association_interface.hpp"
Lei YU91029442019-08-01 15:57:31 +08007#include "types.hpp"
Lei YU5e0dcb32019-08-02 18:04:34 +08008#include "utils.hpp"
Lei YU01539e72019-07-31 10:57:38 +08009#include "version.hpp"
10
Lei YU5e0dcb32019-08-02 18:04:34 +080011#include <phosphor-logging/log.hpp>
Lei YU01539e72019-07-31 10:57:38 +080012#include <sdbusplus/server.hpp>
Lei YU91029442019-08-01 15:57:31 +080013#include <xyz/openbmc_project/Association/Definitions/server.hpp>
Lei YU01539e72019-07-31 10:57:38 +080014#include <xyz/openbmc_project/Collection/DeleteAll/server.hpp>
15
Patrick Williams5670b182023-05-10 07:50:50 -050016#include <filesystem>
17
Lei YUf77189f2019-08-07 14:26:30 +080018class TestItemUpdater;
19
Lei YU01539e72019-07-31 10:57:38 +080020namespace phosphor
21{
22namespace software
23{
24namespace updater
25{
26
27class Version;
28
Patrick Williams374fae52022-07-22 19:26:55 -050029using ItemUpdaterInherit = sdbusplus::server::object_t<
Lei YUa5c47bb2019-09-29 11:28:53 +080030 sdbusplus::xyz::openbmc_project::Association::server::Definitions>;
31
Lei YU01539e72019-07-31 10:57:38 +080032namespace MatchRules = sdbusplus::bus::match::rules;
33
Lei YU58c26e32019-09-27 17:52:06 +080034namespace fs = std::filesystem;
35
Lei YU01539e72019-07-31 10:57:38 +080036/** @class ItemUpdater
37 * @brief Manages the activation of the PSU version items.
38 */
Patrick Williams5670b182023-05-10 07:50:50 -050039class ItemUpdater :
40 public ItemUpdaterInherit,
41 public AssociationInterface,
42 public ActivationListener
Lei YU01539e72019-07-31 10:57:38 +080043{
Lei YUf77189f2019-08-07 14:26:30 +080044 friend class ::TestItemUpdater;
45
Lei YU01539e72019-07-31 10:57:38 +080046 public:
47 /** @brief Constructs ItemUpdater
48 *
49 * @param[in] bus - The D-Bus bus object
50 * @param[in] path - The D-Bus path
51 */
Patrick Williams374fae52022-07-22 19:26:55 -050052 ItemUpdater(sdbusplus::bus_t& bus, const std::string& path) :
Lei YU01539e72019-07-31 10:57:38 +080053 ItemUpdaterInherit(bus, path.c_str()), bus(bus),
54 versionMatch(bus,
55 MatchRules::interfacesAdded() +
56 MatchRules::path(SOFTWARE_OBJPATH),
57 std::bind(std::mem_fn(&ItemUpdater::createActivation),
58 this, std::placeholders::_1))
59 {
Lei YUad90ad52019-08-06 11:19:28 +080060 processPSUImage();
Lei YU58c26e32019-09-27 17:52:06 +080061 processStoredImage();
Lei YU63f9e712019-10-12 15:16:55 +080062 syncToLatestImage();
Lei YU01539e72019-07-31 10:57:38 +080063 }
64
65 /** @brief Deletes version
66 *
67 * @param[in] versionId - Id of the version to delete
68 */
Lei YUa5c47bb2019-09-29 11:28:53 +080069 void erase(const std::string& versionId);
Lei YU01539e72019-07-31 10:57:38 +080070
Lei YU91029442019-08-01 15:57:31 +080071 /** @brief Creates an active association to the
72 * newly active software image
73 *
74 * @param[in] path - The path to create the association to.
75 */
Lei YU7f2a2152019-09-16 16:50:18 +080076 void createActiveAssociation(const std::string& path) override;
Lei YU91029442019-08-01 15:57:31 +080077
Lei YUad90ad52019-08-06 11:19:28 +080078 /** @brief Add the functional association to the
Lei YU91029442019-08-01 15:57:31 +080079 * new "running" PSU images
80 *
Lei YUad90ad52019-08-06 11:19:28 +080081 * @param[in] path - The path to add the association to.
Lei YU91029442019-08-01 15:57:31 +080082 */
Lei YU7f2a2152019-09-16 16:50:18 +080083 void addFunctionalAssociation(const std::string& path) override;
Lei YU91029442019-08-01 15:57:31 +080084
Lei YUa8b966f2020-03-18 10:32:24 +080085 /** @brief Add the updateable association to the
86 * "running" PSU software image
87 *
88 * @param[in] path - The path to create the association.
89 */
90 void addUpdateableAssociation(const std::string& path) override;
91
Lei YU91029442019-08-01 15:57:31 +080092 /** @brief Removes the associations from the provided software image path
93 *
94 * @param[in] path - The path to remove the association from.
95 */
Lei YU7f2a2152019-09-16 16:50:18 +080096 void removeAssociation(const std::string& path) override;
Lei YU91029442019-08-01 15:57:31 +080097
Lei YUffb36532019-10-15 13:55:24 +080098 /** @brief Notify a PSU is updated
99 *
100 * @param[in] versionId - The versionId of the activation
101 * @param[in] psuInventoryPath - The PSU inventory path that is updated
102 */
103 void onUpdateDone(const std::string& versionId,
104 const std::string& psuInventoryPath) override;
105
Lei YU7f2a2152019-09-16 16:50:18 +0800106 private:
Lei YU01539e72019-07-31 10:57:38 +0800107 /** @brief Callback function for Software.Version match.
108 * @details Creates an Activation D-Bus object.
109 *
110 * @param[in] msg - Data associated with subscribed signal
111 */
Patrick Williams374fae52022-07-22 19:26:55 -0500112 void createActivation(sdbusplus::message_t& msg);
Lei YU01539e72019-07-31 10:57:38 +0800113
Lei YUa2c2cd72019-08-09 15:54:10 +0800114 using Properties =
115 std::map<std::string, utils::UtilsInterface::PropertyType>;
116
Lei YUad90ad52019-08-06 11:19:28 +0800117 /** @brief Callback function for PSU inventory match.
118 * @details Update an Activation D-Bus object for PSU inventory.
119 *
120 * @param[in] msg - Data associated with subscribed signal
121 */
Patrick Williams374fae52022-07-22 19:26:55 -0500122 void onPsuInventoryChangedMsg(sdbusplus::message_t& msg);
Lei YUa2c2cd72019-08-09 15:54:10 +0800123
124 /** @brief Callback function for PSU inventory match.
125 * @details Update an Activation D-Bus object for PSU inventory.
126 *
127 * @param[in] psuPath - The PSU inventory path
128 * @param[in] properties - The updated properties
129 */
130 void onPsuInventoryChanged(const std::string& psuPath,
131 const Properties& properties);
Lei YUad90ad52019-08-06 11:19:28 +0800132
Lei YU01539e72019-07-31 10:57:38 +0800133 /** @brief Create Activation object */
134 std::unique_ptr<Activation> createActivationObject(
135 const std::string& path, const std::string& versionId,
Lei YU58c26e32019-09-27 17:52:06 +0800136 const std::string& extVersion, Activation::Status activationStatus,
Lei YU99301372019-09-29 16:27:12 +0800137 const AssociationList& assocs, const std::string& filePath);
Lei YU01539e72019-07-31 10:57:38 +0800138
139 /** @brief Create Version object */
140 std::unique_ptr<Version>
141 createVersionObject(const std::string& objPath,
142 const std::string& versionId,
143 const std::string& versionString,
144 sdbusplus::xyz::openbmc_project::Software::server::
Lei YU99301372019-09-29 16:27:12 +0800145 Version::VersionPurpose versionPurpose);
Lei YU01539e72019-07-31 10:57:38 +0800146
Lei YUbd3b0072019-08-08 13:09:50 +0800147 /** @brief Create Activation and Version object for PSU inventory
148 * @details If the same version exists for multiple PSUs, just add
149 * related association, instead of creating new objects.
150 * */
Lei YUad90ad52019-08-06 11:19:28 +0800151 void createPsuObject(const std::string& psuInventoryPath,
152 const std::string& psuVersion);
153
Lei YUbd3b0072019-08-08 13:09:50 +0800154 /** @brief Remove Activation and Version object for PSU inventory
155 * @details If the same version exists for mutliple PSUs, just remove
156 * related association.
157 * If the version has no association, the Activation and
158 * Version object will be removed
159 */
160 void removePsuObject(const std::string& psuInventoryPath);
161
Lei YUad90ad52019-08-06 11:19:28 +0800162 /**
163 * @brief Create and populate the active PSU Version.
164 */
165 void processPSUImage();
166
Lei YU58c26e32019-09-27 17:52:06 +0800167 /** @brief Create PSU Version from stored images */
168 void processStoredImage();
169
170 /** @brief Scan a directory and create PSU Version from stored images */
171 void scanDirectory(const fs::path& p);
172
Lei YU65207482019-10-11 16:39:36 +0800173 /** @brief Get the versionId of the latest PSU version */
174 std::optional<std::string> getLatestVersionId();
175
Lei YU63f9e712019-10-12 15:16:55 +0800176 /** @brief Update PSUs to the latest version */
177 void syncToLatestImage();
178
179 /** @brief Invoke the activation via DBus */
180 void invokeActivation(const std::unique_ptr<Activation>& activation);
181
Lei YU01539e72019-07-31 10:57:38 +0800182 /** @brief Persistent sdbusplus D-Bus bus connection. */
Patrick Williams374fae52022-07-22 19:26:55 -0500183 sdbusplus::bus_t& bus;
Lei YU01539e72019-07-31 10:57:38 +0800184
185 /** @brief Persistent map of Activation D-Bus objects and their
186 * version id */
187 std::map<std::string, std::unique_ptr<Activation>> activations;
188
189 /** @brief Persistent map of Version D-Bus objects and their
190 * version id */
191 std::map<std::string, std::unique_ptr<Version>> versions;
192
Lei YUbd3b0072019-08-08 13:09:50 +0800193 /** @brief The reference map of PSU Inventory objects and the
194 * Activation*/
195 std::map<std::string, const std::unique_ptr<Activation>&>
196 psuPathActivationMap;
197
Lei YUad90ad52019-08-06 11:19:28 +0800198 /** @brief sdbusplus signal match for PSU Software*/
Lei YU01539e72019-07-31 10:57:38 +0800199 sdbusplus::bus::match_t versionMatch;
Lei YU91029442019-08-01 15:57:31 +0800200
Lei YUad90ad52019-08-06 11:19:28 +0800201 /** @brief sdbusplus signal matches for PSU Inventory */
202 std::vector<sdbusplus::bus::match_t> psuMatches;
203
Lei YU91029442019-08-01 15:57:31 +0800204 /** @brief This entry's associations */
205 AssociationList assocs;
Lei YU65207482019-10-11 16:39:36 +0800206
207 /** @brief A collection of the version strings */
208 std::set<std::string> versionStrings;
Lei YU1517f5f2019-10-14 16:44:42 +0800209
210 /** @brief A struct to hold the PSU present status and model */
211 struct psuStatus
212 {
213 bool present;
214 std::string model;
215 };
216
217 /** @brief The map of PSU inventory path and the psuStatus
218 *
219 * It is used to handle psu inventory changed event, that only create psu
220 * software object when a PSU is present and the model is retrieved */
221 std::map<std::string, psuStatus> psuStatusMap;
Lei YU01539e72019-07-31 10:57:38 +0800222};
223
224} // namespace updater
225} // namespace software
226} // namespace phosphor