1 #pragma once 2 3 #include "config.h" 4 5 #include "activation.hpp" 6 #include "association_interface.hpp" 7 #include "types.hpp" 8 #include "utils.hpp" 9 #include "version.hpp" 10 11 #include <filesystem> 12 #include <phosphor-logging/log.hpp> 13 #include <sdbusplus/server.hpp> 14 #include <xyz/openbmc_project/Association/Definitions/server.hpp> 15 #include <xyz/openbmc_project/Collection/DeleteAll/server.hpp> 16 17 class TestItemUpdater; 18 19 namespace phosphor 20 { 21 namespace software 22 { 23 namespace updater 24 { 25 26 class Version; 27 28 using ItemUpdaterInherit = sdbusplus::server::object::object< 29 sdbusplus::xyz::openbmc_project::Association::server::Definitions>; 30 31 namespace MatchRules = sdbusplus::bus::match::rules; 32 33 namespace fs = std::filesystem; 34 35 /** @class ItemUpdater 36 * @brief Manages the activation of the PSU version items. 37 */ 38 class ItemUpdater : public ItemUpdaterInherit, public AssociationInterface 39 { 40 friend class ::TestItemUpdater; 41 42 public: 43 /** @brief Constructs ItemUpdater 44 * 45 * @param[in] bus - The D-Bus bus object 46 * @param[in] path - The D-Bus path 47 */ 48 ItemUpdater(sdbusplus::bus::bus& bus, const std::string& path) : 49 ItemUpdaterInherit(bus, path.c_str()), bus(bus), 50 versionMatch(bus, 51 MatchRules::interfacesAdded() + 52 MatchRules::path(SOFTWARE_OBJPATH), 53 std::bind(std::mem_fn(&ItemUpdater::createActivation), 54 this, std::placeholders::_1)) 55 { 56 processPSUImage(); 57 processStoredImage(); 58 } 59 60 /** @brief Deletes version 61 * 62 * @param[in] versionId - Id of the version to delete 63 */ 64 void erase(const std::string& versionId); 65 66 /** @brief Creates an active association to the 67 * newly active software image 68 * 69 * @param[in] path - The path to create the association to. 70 */ 71 void createActiveAssociation(const std::string& path) override; 72 73 /** @brief Add the functional association to the 74 * new "running" PSU images 75 * 76 * @param[in] path - The path to add the association to. 77 */ 78 void addFunctionalAssociation(const std::string& path) override; 79 80 /** @brief Removes the associations from the provided software image path 81 * 82 * @param[in] path - The path to remove the association from. 83 */ 84 void removeAssociation(const std::string& path) override; 85 86 private: 87 /** @brief Callback function for Software.Version match. 88 * @details Creates an Activation D-Bus object. 89 * 90 * @param[in] msg - Data associated with subscribed signal 91 */ 92 void createActivation(sdbusplus::message::message& msg); 93 94 using Properties = 95 std::map<std::string, utils::UtilsInterface::PropertyType>; 96 97 /** @brief Callback function for PSU inventory match. 98 * @details Update an Activation D-Bus object for PSU inventory. 99 * 100 * @param[in] msg - Data associated with subscribed signal 101 */ 102 void onPsuInventoryChangedMsg(sdbusplus::message::message& msg); 103 104 /** @brief Callback function for PSU inventory match. 105 * @details Update an Activation D-Bus object for PSU inventory. 106 * 107 * @param[in] psuPath - The PSU inventory path 108 * @param[in] properties - The updated properties 109 */ 110 void onPsuInventoryChanged(const std::string& psuPath, 111 const Properties& properties); 112 113 /** @brief Create Activation object */ 114 std::unique_ptr<Activation> createActivationObject( 115 const std::string& path, const std::string& versionId, 116 const std::string& extVersion, Activation::Status activationStatus, 117 const AssociationList& assocs, const std::string& filePath); 118 119 /** @brief Create Version object */ 120 std::unique_ptr<Version> 121 createVersionObject(const std::string& objPath, 122 const std::string& versionId, 123 const std::string& versionString, 124 sdbusplus::xyz::openbmc_project::Software::server:: 125 Version::VersionPurpose versionPurpose); 126 127 /** @brief Create Activation and Version object for PSU inventory 128 * @details If the same version exists for multiple PSUs, just add 129 * related association, instead of creating new objects. 130 * */ 131 void createPsuObject(const std::string& psuInventoryPath, 132 const std::string& psuVersion); 133 134 /** @brief Remove Activation and Version object for PSU inventory 135 * @details If the same version exists for mutliple PSUs, just remove 136 * related association. 137 * If the version has no association, the Activation and 138 * Version object will be removed 139 */ 140 void removePsuObject(const std::string& psuInventoryPath); 141 142 /** 143 * @brief Create and populate the active PSU Version. 144 */ 145 void processPSUImage(); 146 147 /** @brief Create PSU Version from stored images */ 148 void processStoredImage(); 149 150 /** @brief Scan a directory and create PSU Version from stored images */ 151 void scanDirectory(const fs::path& p); 152 153 /** @brief Persistent sdbusplus D-Bus bus connection. */ 154 sdbusplus::bus::bus& bus; 155 156 /** @brief Persistent map of Activation D-Bus objects and their 157 * version id */ 158 std::map<std::string, std::unique_ptr<Activation>> activations; 159 160 /** @brief Persistent map of Version D-Bus objects and their 161 * version id */ 162 std::map<std::string, std::unique_ptr<Version>> versions; 163 164 /** @brief The reference map of PSU Inventory objects and the 165 * Activation*/ 166 std::map<std::string, const std::unique_ptr<Activation>&> 167 psuPathActivationMap; 168 169 /** @brief sdbusplus signal match for PSU Software*/ 170 sdbusplus::bus::match_t versionMatch; 171 172 /** @brief sdbusplus signal matches for PSU Inventory */ 173 std::vector<sdbusplus::bus::match_t> psuMatches; 174 175 /** @brief This entry's associations */ 176 AssociationList assocs; 177 }; 178 179 } // namespace updater 180 } // namespace software 181 } // namespace phosphor 182