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