xref: /openbmc/phosphor-ipmi-flash/bmc/version-handler/version_handler.hpp (revision c78bfc823049e96522eaab333d74d16c7efd6917)
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