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