registries: make registration dynamic
Rather than having to manually hook code for registries, add a small
registration function to the registry header and use this registration
results throughout the registry interactions.
Tested:
Confirmed registries have same behavior.
```
$ curl -s -k https://localhost:18080/redfish/v1/Registries/ | jq '.Members | map(."@odata.id")'
[
"/redfish/v1/Registries/Base",
"/redfish/v1/Registries/HeartbeatEvent",
"/redfish/v1/Registries/OpenBMC",
"/redfish/v1/Registries/ResourceEvent",
"/redfish/v1/Registries/TaskEvent",
"/redfish/v1/Registries/Telemetry"
]
```
```
$ curl -s -k https://localhost:18080/redfish/v1/Registries/TaskEvent/TaskEvent | jq ".Messages | keys"
[
"TaskAborted",
"TaskCancelled",
"TaskCompletedOK",
"TaskCompletedWarning",
"TaskPaused",
"TaskProgressChanged",
"TaskRemoved",
"TaskResumed",
"TaskStarted"
]
```
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
Change-Id: Iaa355420736a2587d9da4e995208d579443ca9b8
diff --git a/redfish-core/lib/message_registries.hpp b/redfish-core/lib/message_registries.hpp
index 6bbdb48..325fe6b 100644
--- a/redfish-core/lib/message_registries.hpp
+++ b/redfish-core/lib/message_registries.hpp
@@ -10,17 +10,15 @@
#include "query.hpp"
#include "registries.hpp"
#include "registries/privilege_registry.hpp"
-#include "registries_selector.hpp"
#include <boost/beast/http/verb.hpp>
#include <boost/url/format.hpp>
-#include <array>
#include <format>
#include <functional>
#include <memory>
#include <optional>
-#include <span>
+#include <ranges>
#include <utility>
namespace redfish
@@ -46,11 +44,7 @@
nlohmann::json& members = asyncResp->res.jsonValue["Members"];
- static constexpr const auto registryFiles = std::to_array(
- {"Base", "TaskEvent", "ResourceEvent", "OpenBMC", "Telemetry",
- "HeartbeatEvent"});
-
- for (const char* memberName : registryFiles)
+ for (const auto& memberName : std::views::keys(registries::allRegistries()))
{
nlohmann::json::object_t member;
member["@odata.id"] =
@@ -81,10 +75,10 @@
return;
}
std::string dmtf = "DMTF ";
- std::optional<registries::HeaderAndUrl> headerAndUrl =
- registries::getRegistryHeaderAndUrlFromPrefix(registry);
+ std::optional<registries::RegistryEntryRef> registryEntry =
+ registries::getRegistryFromPrefix(registry);
- if (!headerAndUrl)
+ if (!registryEntry)
{
messages::resourceNotFound(asyncResp->res, "MessageRegistryFile",
registry);
@@ -94,8 +88,8 @@
{
dmtf.clear();
}
- const registries::Header& header = headerAndUrl->header;
- const char* url = headerAndUrl->url;
+ const registries::Header& header = registryEntry->get().header;
+ const char* url = registryEntry->get().url;
asyncResp->res.jsonValue["@odata.id"] =
boost::urls::format("/redfish/v1/Registries/{}", registry);
@@ -145,16 +139,16 @@
return;
}
- std::optional<registries::HeaderAndUrl> headerAndUrl =
- registries::getRegistryHeaderAndUrlFromPrefix(registry);
- if (!headerAndUrl)
+ std::optional<registries::RegistryEntryRef> registryEntry =
+ registries::getRegistryFromPrefix(registry);
+ if (!registryEntry)
{
messages::resourceNotFound(asyncResp->res, "MessageRegistryFile",
registry);
return;
}
- const registries::Header& header = headerAndUrl->header;
+ const registries::Header& header = registryEntry->get().header;
if (registry != registryMatch)
{
messages::resourceNotFound(asyncResp->res, header.type, registryMatch);
@@ -178,8 +172,8 @@
nlohmann::json& messageObj = asyncResp->res.jsonValue["Messages"];
// Go through the Message Registry and populate each Message
- const std::span<const registries::MessageEntry> registryEntries =
- registries::getRegistryFromPrefix(registry);
+ const registries::MessageEntries registryEntries =
+ registries::getRegistryMessagesFromPrefix(registry);
for (const registries::MessageEntry& message : registryEntries)
{