summaryrefslogtreecommitdiff
path: root/include/event_service_store.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/event_service_store.hpp')
-rw-r--r--include/event_service_store.hpp264
1 files changed, 264 insertions, 0 deletions
diff --git a/include/event_service_store.hpp b/include/event_service_store.hpp
new file mode 100644
index 0000000000..d51adad572
--- /dev/null
+++ b/include/event_service_store.hpp
@@ -0,0 +1,264 @@
+#pragma once
+#include "logging.hpp"
+
+#include <boost/container/flat_map.hpp>
+#include <nlohmann/json.hpp>
+
+namespace persistent_data
+{
+
+struct UserSubscription
+{
+ std::string id;
+ std::string destinationUrl;
+ std::string protocol;
+ std::string retryPolicy;
+ std::string customText;
+ std::string eventFormatType;
+ std::string subscriptionType;
+ std::vector<std::string> registryMsgIds;
+ std::vector<std::string> registryPrefixes;
+ std::vector<std::string> resourceTypes;
+ std::vector<nlohmann::json> httpHeaders; // key-value pair
+ std::vector<std::string> metricReportDefinitions;
+
+ static std::shared_ptr<UserSubscription>
+ fromJson(const nlohmann::json& j, const bool loadFromOldConfig = false)
+ {
+ std::shared_ptr<UserSubscription> subvalue =
+ std::make_shared<UserSubscription>();
+ for (const auto& element : j.items())
+ {
+ if (element.key() == "Id")
+ {
+ const std::string* value =
+ element.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->id = *value;
+ }
+ else if (element.key() == "Destination")
+ {
+ const std::string* value =
+ element.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->destinationUrl = *value;
+ }
+ else if (element.key() == "Protocol")
+ {
+ const std::string* value =
+ element.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->protocol = *value;
+ }
+ else if (element.key() == "DeliveryRetryPolicy")
+ {
+ const std::string* value =
+ element.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->retryPolicy = *value;
+ }
+ else if (element.key() == "Context")
+ {
+ const std::string* value =
+ element.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->customText = *value;
+ }
+ else if (element.key() == "EventFormatType")
+ {
+ const std::string* value =
+ element.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->eventFormatType = *value;
+ }
+ else if (element.key() == "SubscriptionType")
+ {
+ const std::string* value =
+ element.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->subscriptionType = *value;
+ }
+ else if (element.key() == "MessageIds")
+ {
+ const auto& obj = element.value();
+ for (const auto& val : obj.items())
+ {
+ const std::string* value =
+ val.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->registryMsgIds.emplace_back(*value);
+ }
+ }
+ else if (element.key() == "RegistryPrefixes")
+ {
+ const auto& obj = element.value();
+ for (const auto& val : obj.items())
+ {
+ const std::string* value =
+ val.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->registryPrefixes.emplace_back(*value);
+ }
+ }
+ else if (element.key() == "ResourceTypes")
+ {
+ const auto& obj = element.value();
+ for (const auto& val : obj.items())
+ {
+ const std::string* value =
+ val.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->resourceTypes.emplace_back(*value);
+ }
+ }
+ else if (element.key() == "HttpHeaders")
+ {
+ const auto& obj = element.value();
+ for (const auto& val : obj.items())
+ {
+ const auto value =
+ val.value().get_ptr<const nlohmann::json::object_t*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->httpHeaders.emplace_back(*value);
+ }
+ }
+ else if (element.key() == "MetricReportDefinitions")
+ {
+ const auto& obj = element.value();
+ for (const auto& val : obj.items())
+ {
+ const std::string* value =
+ val.value().get_ptr<const std::string*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ subvalue->metricReportDefinitions.emplace_back(*value);
+ }
+ }
+ else
+ {
+ BMCWEB_LOG_ERROR
+ << "Got unexpected property reading persistent file: "
+ << element.key();
+ continue;
+ }
+ }
+
+ if ((subvalue->id.empty() && !loadFromOldConfig) ||
+ subvalue->destinationUrl.empty() || subvalue->protocol.empty() ||
+ subvalue->retryPolicy.empty() || subvalue->customText.empty() ||
+ subvalue->eventFormatType.empty() ||
+ subvalue->subscriptionType.empty() ||
+ (subvalue->registryPrefixes.empty() &&
+ subvalue->registryMsgIds.empty()))
+ {
+ BMCWEB_LOG_ERROR << "Subscription missing required field "
+ "information, refusing to restore";
+ return nullptr;
+ }
+
+ return subvalue;
+ }
+};
+
+struct EventServiceConfig
+{
+ bool enabled = true;
+ uint32_t retryAttempts = 3;
+ uint32_t retryTimeoutInterval = 30;
+
+ void fromJson(const nlohmann::json& j)
+ {
+ for (const auto& element : j.items())
+ {
+ if (element.key() == "ServiceEnabled")
+ {
+ const bool* value = element.value().get_ptr<const bool*>();
+ if (value == nullptr)
+ {
+ continue;
+ }
+ enabled = *value;
+ }
+ else if (element.key() == "DeliveryRetryAttempts")
+ {
+ const uint64_t* value =
+ element.value().get_ptr<const uint64_t*>();
+ if ((value == nullptr) ||
+ (*value < std::numeric_limits<uint32_t>::lowest()) ||
+ (*value > std::numeric_limits<uint32_t>::max()))
+ {
+ continue;
+ }
+ retryAttempts = static_cast<uint32_t>(*value);
+ }
+ else if (element.key() == "DeliveryRetryIntervalSeconds")
+ {
+ const uint64_t* value =
+ element.value().get_ptr<const uint64_t*>();
+ if ((value == nullptr) ||
+ (*value < std::numeric_limits<uint32_t>::lowest()) ||
+ (*value > std::numeric_limits<uint32_t>::max()))
+ {
+ continue;
+ }
+ retryTimeoutInterval = static_cast<uint32_t>(*value);
+ }
+ }
+ }
+};
+
+class EventServiceStore
+{
+ public:
+ boost::container::flat_map<std::string, std::shared_ptr<UserSubscription>>
+ subscriptionsConfigMap;
+ EventServiceConfig eventServiceConfig;
+
+ static EventServiceStore& getInstance()
+ {
+ static EventServiceStore eventServiceStore;
+ return eventServiceStore;
+ }
+
+ EventServiceConfig& getEventServiceConfig()
+ {
+ return eventServiceConfig;
+ }
+};
+
+} // namespace persistent_data