blob: 3d12dc908cbdeb10062ff4ce8deef4142c2867e5 [file] [log] [blame]
kasunath37bc0df2022-06-07 12:40:26 -07001#pragma once
2
3#include "external_storer_interface.hpp"
4#include "nlohmann/json.hpp"
5
6#include <boost/uuid/uuid_generators.hpp>
7
8#include <filesystem>
9#include <string>
10
11namespace bios_bmc_smm_error_logger
12{
13namespace rde
14{
15
16/**
17 * @brief Simple Base class for writing JSON data to files.
18 *
19 * This class allows us to unit test the ExternalStorerFileInterface
20 * functionality.
21 */
22class FileHandlerInterface
23{
24 public:
25 virtual ~FileHandlerInterface() = default;
26
27 /**
28 * @brief Create a folder at the provided path.
29 *
30 * @param[in] folderPath - folder path.
31 * @return true if successful.
32 */
33 virtual bool createFolder(const std::string& folderPath) const = 0;
34
35 /**
36 * @brief Create an index.json and write the JSON content to it.
37 *
38 * If the file already exists, this will overwrite it.
39 *
40 * @param[in] folderPath - path of the file without including the file name.
41 * @param[in] jsonPdr - PDR in nlohmann::json format.
42 * @return true if successful.
43 */
44 virtual bool createFile(const std::string& folderPath,
45 const nlohmann::json& jsonPdr) const = 0;
46};
47
48/**
49 * @brief Class for handling folder and file creation for ExternalStorer.
50 */
51class ExternalStorerFileWriter : public FileHandlerInterface
52{
53 public:
54 bool createFolder(const std::string& folderPath) const override;
55 bool createFile(const std::string& folderPath,
56 const nlohmann::json& jsonPdr) const override;
57};
58
59/**
60 * @brief Categories for different redfish JSON strings.
61 */
62enum class JsonPdrType
63{
64 logEntry,
65 logService,
66 other
67};
68
69/**
70 * @brief Class for handling ExternalStorer file operations.
71 */
72class ExternalStorerFileInterface : public ExternalStorerInterface
73{
74 public:
75 /**
76 * @brief Constructor for the ExternalStorerFileInterface.
77 *
78 * @param[in] rootPath - root path for creating redfish folders.
79 * Eg: "/run/bmcweb"
80 * @param[in] fileHandler - an ExternalStorerFileWriter object. This class
81 * will take the ownership of this object.
82 */
83 ExternalStorerFileInterface(
84 std::string_view rootPath,
85 std::unique_ptr<FileHandlerInterface> fileHandler);
86
87 bool publishJson(std::string_view jsonStr) override;
88
89 private:
90 std::string rootPath;
91 std::unique_ptr<FileHandlerInterface> fileHandler;
92 std::string logServiceId;
93 boost::uuids::random_generator randomGen;
94
95 /**
96 * @brief Get the type of the received PDR.
97 *
98 * @param[in] jsonSchema - PDR in nlohmann::json format.
99 * @return JsonPdrType of the PDR.
100 */
101 JsonPdrType getSchemaType(const nlohmann::json& jsonSchema) const;
102
103 /**
104 * @brief Process a LogEntry type PDR.
105 *
106 * @param[in] logEntry - PDR in nlohmann::json format.
107 * @return true if successful.
108 */
109 bool processLogEntry(nlohmann::json& logEntry);
110
111 /**
112 * @brief Process a LogService type PDR.
113 *
114 * @param[in] logService - PDR in nlohmann::json format.
115 * @return true if successful.
116 */
117 bool processLogService(const nlohmann::json& logService);
118
119 /**
120 * @brief Process PDRs that doesn't have a specific category.
121 *
122 * @param[in] jsonPdr - PDR in nlohmann::json format.
123 * @return true if successful.
124 */
125 bool processOtherTypes(const nlohmann::json& jsonPdr) const;
126
127 /**
128 * @brief Create the needed folders and the index.json.
129 *
130 * @param subPath - path within the root folder.
131 * @param jsonPdr - PDR in nlohmann::json format.
132 * @return true if successful.
133 */
134 bool createFile(const std::string& subPath,
135 const nlohmann::json& jsonPdr) const;
136};
137
138} // namespace rde
139} // namespace bios_bmc_smm_error_logger