#pragma once #include "config.h" #include "activation.hpp" #include "association_interface.hpp" #include "types.hpp" #include "utils.hpp" #include "version.hpp" #include #include #include #include #include class TestItemUpdater; namespace phosphor { namespace software { namespace updater { class Version; using ItemUpdaterInherit = sdbusplus::server::object::object< sdbusplus::xyz::openbmc_project::Association::server::Definitions>; namespace MatchRules = sdbusplus::bus::match::rules; namespace fs = std::filesystem; /** @class ItemUpdater * @brief Manages the activation of the PSU version items. */ class ItemUpdater : public ItemUpdaterInherit, public AssociationInterface { friend class ::TestItemUpdater; public: /** @brief Constructs ItemUpdater * * @param[in] bus - The D-Bus bus object * @param[in] path - The D-Bus path */ ItemUpdater(sdbusplus::bus::bus& bus, const std::string& path) : ItemUpdaterInherit(bus, path.c_str()), bus(bus), versionMatch(bus, MatchRules::interfacesAdded() + MatchRules::path(SOFTWARE_OBJPATH), std::bind(std::mem_fn(&ItemUpdater::createActivation), this, std::placeholders::_1)) { processPSUImage(); processStoredImage(); } /** @brief Deletes version * * @param[in] versionId - Id of the version to delete */ void erase(const std::string& versionId); /** @brief Creates an active association to the * newly active software image * * @param[in] path - The path to create the association to. */ void createActiveAssociation(const std::string& path) override; /** @brief Add the functional association to the * new "running" PSU images * * @param[in] path - The path to add the association to. */ void addFunctionalAssociation(const std::string& path) override; /** @brief Removes the associations from the provided software image path * * @param[in] path - The path to remove the association from. */ void removeAssociation(const std::string& path) override; private: /** @brief Callback function for Software.Version match. * @details Creates an Activation D-Bus object. * * @param[in] msg - Data associated with subscribed signal */ void createActivation(sdbusplus::message::message& msg); using Properties = std::map; /** @brief Callback function for PSU inventory match. * @details Update an Activation D-Bus object for PSU inventory. * * @param[in] msg - Data associated with subscribed signal */ void onPsuInventoryChangedMsg(sdbusplus::message::message& msg); /** @brief Callback function for PSU inventory match. * @details Update an Activation D-Bus object for PSU inventory. * * @param[in] psuPath - The PSU inventory path * @param[in] properties - The updated properties */ void onPsuInventoryChanged(const std::string& psuPath, const Properties& properties); /** @brief Create Activation object */ std::unique_ptr createActivationObject( const std::string& path, const std::string& versionId, const std::string& extVersion, Activation::Status activationStatus, const AssociationList& assocs, const std::string& filePath); /** @brief Create Version object */ std::unique_ptr createVersionObject(const std::string& objPath, const std::string& versionId, const std::string& versionString, sdbusplus::xyz::openbmc_project::Software::server:: Version::VersionPurpose versionPurpose); /** @brief Create Activation and Version object for PSU inventory * @details If the same version exists for multiple PSUs, just add * related association, instead of creating new objects. * */ void createPsuObject(const std::string& psuInventoryPath, const std::string& psuVersion); /** @brief Remove Activation and Version object for PSU inventory * @details If the same version exists for mutliple PSUs, just remove * related association. * If the version has no association, the Activation and * Version object will be removed */ void removePsuObject(const std::string& psuInventoryPath); /** * @brief Create and populate the active PSU Version. */ void processPSUImage(); /** @brief Create PSU Version from stored images */ void processStoredImage(); /** @brief Scan a directory and create PSU Version from stored images */ void scanDirectory(const fs::path& p); /** @brief Persistent sdbusplus D-Bus bus connection. */ sdbusplus::bus::bus& bus; /** @brief Persistent map of Activation D-Bus objects and their * version id */ std::map> activations; /** @brief Persistent map of Version D-Bus objects and their * version id */ std::map> versions; /** @brief The reference map of PSU Inventory objects and the * Activation*/ std::map&> psuPathActivationMap; /** @brief sdbusplus signal match for PSU Software*/ sdbusplus::bus::match_t versionMatch; /** @brief sdbusplus signal matches for PSU Inventory */ std::vector psuMatches; /** @brief This entry's associations */ AssociationList assocs; }; } // namespace updater } // namespace software } // namespace phosphor