1 #pragma once
2 #include "handler_config.hpp"
3 #include "image_handler.hpp"
4 #include "status.hpp"
5 #include "util.hpp"
6 
7 #include <blobs-ipmid/blobs.hpp>
8 
9 #include <cstdint>
10 #include <map>
11 #include <memory>
12 #include <optional>
13 #include <set>
14 #include <string>
15 #include <string_view>
16 #include <unordered_map>
17 #include <vector>
18 
19 namespace ipmi_flash
20 {
21 
22 class VersionBlobHandler : public blobs::GenericBlobInterface
23 {
24   public:
25     struct ActionPack
26     {
27         /** Only file operation action supported currently */
28         std::unique_ptr<TriggerableActionInterface> onOpen;
29     };
30 
31     /**
32      * Create a VersionBlobHandler.
33      *
34      * @param[in] configs - list of blob configurations to support
35      */
36     VersionBlobHandler(std::vector<HandlerConfig<ActionPack>>&& configs);
37 
38     ~VersionBlobHandler() = default;
39     VersionBlobHandler(const VersionBlobHandler&) = delete;
40     VersionBlobHandler& operator=(const VersionBlobHandler&) = delete;
41     VersionBlobHandler(VersionBlobHandler&&) = default;
42     VersionBlobHandler& operator=(VersionBlobHandler&&) = default;
43 
44     bool canHandleBlob(const std::string& path) override;
45     std::vector<std::string> getBlobIds() override;
46     bool deleteBlob(const std::string& path) override;
47     bool stat(const std::string&, blobs::BlobMeta* meta) override;
48     bool open(uint16_t session, uint16_t flags,
49               const std::string& path) override;
50     std::vector<uint8_t> read(uint16_t session, uint32_t offset,
51                               uint32_t requestedSize) override;
write(uint16_t,uint32_t,const std::vector<uint8_t> &)52     bool write(uint16_t, uint32_t, const std::vector<uint8_t>&) override
53     {
54         return false; /* not supported */
55     };
writeMeta(uint16_t,uint32_t,const std::vector<uint8_t> &)56     bool writeMeta(uint16_t, uint32_t, const std::vector<uint8_t>&) override
57     {
58         return false; /* not supported */
59     }
commit(uint16_t,const std::vector<uint8_t> &)60     bool commit(uint16_t, const std::vector<uint8_t>&) override
61     {
62         return false; // not supported
63     }
64     bool close(uint16_t session) override;
65     bool stat(uint16_t session, blobs::BlobMeta* meta) override;
66     bool expire(uint16_t session) override;
67 
68   private:
69     struct SessionInfo;
70 
71     struct BlobInfo
72     {
73         Pinned<std::string> blobId;
74         std::unique_ptr<ActionPack> actions;
75         std::unique_ptr<ImageHandlerInterface> handler;
76         std::set<SessionInfo*> sessionsToUpdate;
77     };
78 
79     struct SessionInfo
80     {
81         BlobInfo* blob;
82 
83         // A cached copy of the version data shared by all clients for a single
84         // execution of the version retrieval action. This is is null until the
85         // TriggerableAction has completed. If the action is an error, the
86         // shared object is nullopt. Otherwise, contains a vector of the version
87         // data when successfully read.
88         std::shared_ptr<const std::optional<std::vector<uint8_t>>> data;
89     };
90 
91     std::unordered_map<std::string_view, std::unique_ptr<BlobInfo>> blobInfoMap;
92     std::unordered_map<uint16_t, std::unique_ptr<SessionInfo>> sessionInfoMap;
93 };
94 
95 } // namespace ipmi_flash
96