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