185e54f1bSJason Ling #pragma once 285e54f1bSJason Ling #include "buildjson.hpp" 3*c78bfc82SJason Ling #include "image_handler.hpp" 485e54f1bSJason Ling #include "status.hpp" 5*c78bfc82SJason Ling #include "util.hpp" 685e54f1bSJason Ling 785e54f1bSJason Ling #include <blobs-ipmid/blobs.hpp> 885e54f1bSJason Ling 9*c78bfc82SJason Ling #include <algorithm> 10*c78bfc82SJason Ling #include <cstdint> 11*c78bfc82SJason Ling #include <map> 1285e54f1bSJason Ling #include <memory> 13*c78bfc82SJason Ling #include <string> 14*c78bfc82SJason Ling #include <unordered_map> 15*c78bfc82SJason Ling #include <vector> 1685e54f1bSJason Ling namespace ipmi_flash 1785e54f1bSJason Ling { 1885e54f1bSJason Ling struct VersionActionPack 1985e54f1bSJason Ling { 2085e54f1bSJason Ling public: 2185e54f1bSJason Ling VersionActionPack(std::unique_ptr<TriggerableActionInterface> openAction) : 2285e54f1bSJason Ling onOpen(std::move(openAction)){}; 2385e54f1bSJason Ling VersionActionPack() = default; 2485e54f1bSJason Ling /** Only file operation action supported currently */ 2585e54f1bSJason Ling std::unique_ptr<TriggerableActionInterface> onOpen; 2685e54f1bSJason Ling }; 27*c78bfc82SJason Ling 28*c78bfc82SJason Ling /* 29*c78bfc82SJason Ling * All the information associated with a version blob 30*c78bfc82SJason Ling */ 31*c78bfc82SJason Ling struct VersionInfoPack 32*c78bfc82SJason Ling { 33*c78bfc82SJason Ling public: 34*c78bfc82SJason Ling VersionInfoPack(const std::string& blobId, 35*c78bfc82SJason Ling std::unique_ptr<VersionActionPack> actionPackIn, 36*c78bfc82SJason Ling std::unique_ptr<ImageHandlerInterface> imageHandler) : 37*c78bfc82SJason Ling blobId(blobId), 38*c78bfc82SJason Ling actionPack(std::move(actionPackIn)), 39*c78bfc82SJason Ling imageHandler(std::move(imageHandler)), 40*c78bfc82SJason Ling blobState(static_cast<blobs::StateFlags>(0)){}; 41*c78bfc82SJason Ling VersionInfoPack() = default; 42*c78bfc82SJason Ling 43*c78bfc82SJason Ling std::string blobId; 44*c78bfc82SJason Ling std::unique_ptr<VersionActionPack> actionPack; 45*c78bfc82SJason Ling std::unique_ptr<ImageHandlerInterface> imageHandler; 46*c78bfc82SJason Ling blobs::StateFlags blobState; 47*c78bfc82SJason Ling }; 48*c78bfc82SJason Ling 49*c78bfc82SJason Ling /* convenience alias: the key (std::string) is blobId, same as 50*c78bfc82SJason Ling * VersionInfoPack.blobId */ 51*c78bfc82SJason Ling using VersionInfoMap = std::unordered_map<std::string, VersionInfoPack>; 52*c78bfc82SJason Ling 53*c78bfc82SJason Ling class VersionBlobHandler : public blobs::GenericBlobInterface 54*c78bfc82SJason Ling { 55*c78bfc82SJason Ling public: 56*c78bfc82SJason Ling /** 57*c78bfc82SJason Ling * Factory to create a BlobHandler for use by phosphor-ipmi-blobs 58*c78bfc82SJason Ling * 59*c78bfc82SJason Ling * @param[in] versionMap - blob names to VersionInfoPack which contains 60*c78bfc82SJason Ling * triggers, file handlers, state and blobID. 61*c78bfc82SJason Ling * 62*c78bfc82SJason Ling * @returns a unique_ptr to a GenericBlobInterface which is used by 63*c78bfc82SJason Ling * phosphor-ipmi-blobs. The underlying implementation (VersionBlobHandler) 64*c78bfc82SJason Ling * implements all the blob operations for the blobs owned by 65*c78bfc82SJason Ling * VersionBlobHandler. 66*c78bfc82SJason Ling */ 67*c78bfc82SJason Ling static std::unique_ptr<blobs::GenericBlobInterface> 68*c78bfc82SJason Ling create(VersionInfoMap&& versionMap); 69*c78bfc82SJason Ling /** 70*c78bfc82SJason Ling * Create a VersionBlobHandler. 71*c78bfc82SJason Ling * 72*c78bfc82SJason Ling * @param[in] blobs - list of blobs_ids to support 73*c78bfc82SJason Ling * @param[in] actions - a map of blobId to VersionInfoPack 74*c78bfc82SJason Ling */ 75*c78bfc82SJason Ling VersionBlobHandler(std::vector<std::string>&& blobs, 76*c78bfc82SJason Ling VersionInfoMap&& handlerMap) : 77*c78bfc82SJason Ling blobIds(blobs), 78*c78bfc82SJason Ling versionInfoMap(std::move(handlerMap)) 79*c78bfc82SJason Ling {} 80*c78bfc82SJason Ling ~VersionBlobHandler() = default; 81*c78bfc82SJason Ling VersionBlobHandler(const VersionBlobHandler&) = delete; 82*c78bfc82SJason Ling VersionBlobHandler& operator=(const VersionBlobHandler&) = delete; 83*c78bfc82SJason Ling VersionBlobHandler(VersionBlobHandler&&) = default; 84*c78bfc82SJason Ling VersionBlobHandler& operator=(VersionBlobHandler&&) = default; 85*c78bfc82SJason Ling 86*c78bfc82SJason Ling bool canHandleBlob(const std::string& path) override; 87*c78bfc82SJason Ling std::vector<std::string> getBlobIds() override; 88*c78bfc82SJason Ling bool deleteBlob(const std::string& path) override; 89*c78bfc82SJason Ling bool stat(const std::string&, blobs::BlobMeta* meta) override; 90*c78bfc82SJason Ling bool open(uint16_t session, uint16_t flags, 91*c78bfc82SJason Ling const std::string& path) override; 92*c78bfc82SJason Ling std::vector<uint8_t> read(uint16_t session, uint32_t offset, 93*c78bfc82SJason Ling uint32_t requestedSize) override; 94*c78bfc82SJason Ling bool write(uint16_t session, uint32_t offset, 95*c78bfc82SJason Ling const std::vector<uint8_t>& data) override 96*c78bfc82SJason Ling { 97*c78bfc82SJason Ling return false; /* not supported */ 98*c78bfc82SJason Ling }; 99*c78bfc82SJason Ling bool writeMeta(uint16_t session, uint32_t offset, 100*c78bfc82SJason Ling const std::vector<uint8_t>& data) override 101*c78bfc82SJason Ling { 102*c78bfc82SJason Ling return false; /* not supported */ 103*c78bfc82SJason Ling } 104*c78bfc82SJason Ling bool commit(uint16_t session, const std::vector<uint8_t>& data) override 105*c78bfc82SJason Ling { 106*c78bfc82SJason Ling return false; // not supported 107*c78bfc82SJason Ling } 108*c78bfc82SJason Ling bool close(uint16_t session) override; 109*c78bfc82SJason Ling bool stat(uint16_t session, blobs::BlobMeta* meta) override; 110*c78bfc82SJason Ling bool expire(uint16_t session) override; 111*c78bfc82SJason Ling bool cleanup(uint16_t session); 112*c78bfc82SJason Ling 113*c78bfc82SJason Ling private: 114*c78bfc82SJason Ling std::vector<std::string> blobIds; 115*c78bfc82SJason Ling VersionInfoMap versionInfoMap; 116*c78bfc82SJason Ling std::unordered_map<uint16_t, std::string> sessionToBlob; 117*c78bfc82SJason Ling }; 11885e54f1bSJason Ling } // namespace ipmi_flash 119