Bring consistency to config options
The configuration options that exist in bmcweb are an amalgimation of
CROW options, CMAKE options using #define, pre-bmcweb ifdef mechanisms
and meson options using a config file. This history has led to a lot of
different ways to configure code in the codebase itself, which has led
to problems, and issues in consistency.
ifdef options do no compile time checking of code not within the branch.
This is good when you have optional dependencies, but not great when
you're trying to ensure both options compile.
This commit moves all internal configuration options to:
1. A namespace called bmcweb
2. A naming scheme matching the meson option. hyphens are replaced with
underscores, and the option is uppercased. This consistent transform
allows matching up option keys with their code counterparts, without
naming changes.
3. All options are bool true = enabled, and any options with _ENABLED or
_DISABLED postfixes have those postfixes removed. (note, there are
still some options with disable in the name, those are left as-is)
4. All options are now constexpr booleans, without an explicit compare.
To accomplish this, unfortunately an option list in config/meson.build
is required, given that meson doesn't provide a way to dump all options,
as is a manual entry in bmcweb_config.h.in, in addition to the
meson_options. This obsoletes the map in the main meson.build, which
helps some of the complexity.
Now that we've done this, we have some rules that will be documented.
1. Runtime behavior changes should be added as a constexpr bool to
bmcweb_config.h
2. Options that require optionally pulling in a dependency shall use an
ifdef, defined in the primary meson.build. (note, there are no
options that currently meet this class, but it's included for
completeness.)
Note, that this consolidation means that at configure time, all options
are printed. This is a good thing and allows direct comparison of
configs in log files.
Tested: Code compiles
Server boots, and shows options configured in the default build. (HTTPS,
log level, etc)
Change-Id: I94e79a56bcdc01755036e4e7278c7e69e25809ce
Signed-off-by: Ed Tanous <ed@tanous.net>
diff --git a/config/bmcweb_config.h.in b/config/bmcweb_config.h.in
index eb0c79c..81a61c8 100644
--- a/config/bmcweb_config.h.in
+++ b/config/bmcweb_config.h.in
@@ -1,29 +1,57 @@
#pragma once
#include <cstdint>
-#include <cstddef>
#include <string_view>
// clang-format off
-constexpr const bool bmcwebInsecureEnableQueryParams = @BMCWEB_INSECURE_ENABLE_QUERY_PARAMS@ == 1;
+// NOLINTBEGIN(readability-identifier-naming)
-constexpr const size_t bmcwebHttpReqBodyLimitMb = @BMCWEB_HTTP_REQ_BODY_LIMIT_MB@;
+// String params
+constexpr const std::string_view BMCWEB_LOGGING_LEVEL = "@LOGGING_LEVEL@";
+constexpr const std::string_view BMCWEB_MUTUAL_TLS_COMMON_NAME_PARSING = "@MUTUAL_TLS_COMMON_NAME_PARSING@";
+constexpr const std::string_view BMCWEB_DNS_RESOLVER = "@DNS_RESOLVER@";
-constexpr const char* mesonInstallPrefix = "@MESON_INSTALL_PREFIX@";
+// Integer params
+constexpr const uint64_t BMCWEB_HTTP_BODY_LIMIT = @HTTP_BODY_LIMIT@;
+constexpr const uint16_t BMCWEB_HTTPS_PORT = @HTTPS_PORT@;
-constexpr const bool bmcwebInsecureEnableHttpPushStyleEventing = @BMCWEB_INSECURE_ENABLE_HTTP_PUSH_STYLE_EVENTING@ == 1;
+// Feature Params
+constexpr const bool BMCWEB_BASIC_AUTH = @BASIC_AUTH@;
+constexpr const bool BMCWEB_COOKIE_AUTH = @COOKIE_AUTH@;
+constexpr const bool BMCWEB_EXPERIMENTAL_HTTP2 = @EXPERIMENTAL_HTTP2@;
+constexpr const bool BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM = @EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM@;
+constexpr const bool BMCWEB_HOST_SERIAL_SOCKET = @HOST_SERIAL_SOCKET@;
+constexpr const bool BMCWEB_INSECURE_DISABLE_AUTH = @INSECURE_DISABLE_AUTH@;
+constexpr const bool BMCWEB_INSECURE_DISABLE_CSRF = @INSECURE_DISABLE_CSRF@;
+constexpr const bool BMCWEB_INSECURE_DISABLE_SSL = @INSECURE_DISABLE_SSL@;
+constexpr const bool BMCWEB_INSECURE_ENABLE_REDFISH_QUERY = @INSECURE_ENABLE_REDFISH_QUERY@;
+constexpr const bool BMCWEB_INSECURE_IGNORE_CONTENT_TYPE = @INSECURE_IGNORE_CONTENT_TYPE@;
+constexpr const bool BMCWEB_INSECURE_PUSH_STYLE_NOTIFICATION = @INSECURE_PUSH_STYLE_NOTIFICATION@;
+constexpr const bool BMCWEB_INSECURE_TFTP_UPDATE = @INSECURE_TFTP_UPDATE@;
+constexpr const bool BMCWEB_KVM = @KVM@;
+constexpr const bool BMCWEB_MUTUAL_TLS_AUTH = @MUTUAL_TLS_AUTH@;
+constexpr const bool BMCWEB_REDFISH_AGGREGATION = @REDFISH_AGGREGATION@;
+constexpr const bool BMCWEB_REDFISH_ALLOW_DEPRECATED_POWER_THERMAL = @REDFISH_ALLOW_DEPRECATED_POWER_THERMAL@;
+constexpr const bool BMCWEB_REDFISH_BMC_JOURNAL = @REDFISH_BMC_JOURNAL@;
+constexpr const bool BMCWEB_REDFISH_CPU_LOG = @REDFISH_CPU_LOG@;
+constexpr const bool BMCWEB_REDFISH_DBUS_LOG = @REDFISH_DBUS_LOG@;
+constexpr const bool BMCWEB_REDFISH_DUMP_LOG = @REDFISH_DUMP_LOG@;
+constexpr const bool BMCWEB_REDFISH_HOST_LOGGER = @REDFISH_HOST_LOGGER@;
+constexpr const bool BMCWEB_REDFISH_NEW_POWERSUBSYSTEM_THERMALSUBSYSTEM = @REDFISH_NEW_POWERSUBSYSTEM_THERMALSUBSYSTEM@;
+constexpr const bool BMCWEB_REDFISH_OEM_MANAGER_FAN_DATA = @REDFISH_OEM_MANAGER_FAN_DATA@;
+constexpr const bool BMCWEB_REDFISH_PROVISIONING_FEATURE = @REDFISH_PROVISIONING_FEATURE@;
+constexpr const bool BMCWEB_REDFISH = @REDFISH@;
+constexpr const bool BMCWEB_REST = @REST@;
+constexpr const bool BMCWEB_SESSION_AUTH = @SESSION_AUTH@;
+constexpr const bool BMCWEB_STATIC_HOSTING = @STATIC_HOSTING@;
+constexpr const bool BMCWEB_TESTS = @TESTS@;
+constexpr const bool BMCWEB_VM_WEBSOCKET = @VM_WEBSOCKET@;
+constexpr const bool BMCWEB_VM_NBDPROXY = false;
+constexpr const bool BMCWEB_XTOKEN_AUTH = @XTOKEN_AUTH@;
-constexpr const char* bmcwebLoggingLevel = "@BMCWEB_LOGGING_LEVEL@";
+// Company specific params
+constexpr const bool BMCWEB_GOOGLE_API = @GOOGLE_API@;
+constexpr const bool BMCWEB_IBM_MANAGEMENT_CONSOLE = @IBM_MANAGEMENT_CONSOLE@;
-constexpr const bool bmcwebEnableMultiHost = @BMCWEB_ENABLE_MULTI_HOST@ == 1;
-
-constexpr const bool bmcwebEnableHTTP2 = @BMCWEB_ENABLE_HTTP2@ == 1;
-
-constexpr const bool bmcwebEnableTLS = @BMCWEB_ENABLE_TLS@ == 1;
-
-constexpr const bool bmcwebMTLSCommonNameParsingMeta = @BMCWEB_ENABLE_MTLS_COMMON_NAME_PARSING_META@ == 1;
-
-constexpr const bool bmcwebNbdProxy = @BMCWEB_VIRTUAL_MEDIA_NBD@ == 1;
-
-constexpr const bool bmcwebVmWebsocket = @BMCWEB_VIRTUAL_MEDIA_VM@ == 1;
+// NOLINTEND(readability-identifier-naming)
// clang-format on
diff --git a/config/meson.build b/config/meson.build
index 9533bd6..4b862b4 100644
--- a/config/meson.build
+++ b/config/meson.build
@@ -1,30 +1,74 @@
# Gather the Configuration data
conf_data = configuration_data()
-conf_data.set('BMCWEB_HTTP_REQ_BODY_LIMIT_MB', get_option('http-body-limit'))
-enable_redfish_query = get_option('insecure-enable-redfish-query')
-conf_data.set10('BMCWEB_INSECURE_ENABLE_QUERY_PARAMS', enable_redfish_query.allowed())
-# enable_redfish_aggregation = get_option('redfish-aggregation')
-# conf_data.set10('BMCWEB_ENABLE_REDFISH_AGGREGATION', enable_redfish_aggregation.allowed())
-insecure_push_style_notification = get_option('insecure-push-style-notification')
-conf_data.set10(
- 'BMCWEB_INSECURE_ENABLE_HTTP_PUSH_STYLE_EVENTING',
- insecure_push_style_notification.allowed(),
-)
+
+feature_options = [
+ 'basic-auth',
+ 'cookie-auth',
+ 'dns-resolver',
+ 'experimental-http2',
+ 'experimental-redfish-multi-computer-system',
+ 'google-api',
+ 'host-serial-socket',
+ 'http-body-limit',
+ 'https_port',
+ 'ibm-management-console',
+ 'insecure-disable-auth',
+ 'insecure-disable-csrf',
+ 'insecure-disable-ssl',
+ 'insecure-enable-redfish-query',
+ 'insecure-ignore-content-type',
+ 'insecure-push-style-notification',
+ 'insecure-tftp-update',
+ 'kvm',
+ 'mutual-tls-auth',
+ 'mutual-tls-common-name-parsing',
+ 'redfish-aggregation',
+ 'redfish-allow-deprecated-power-thermal',
+ 'redfish-bmc-journal',
+ 'redfish-cpu-log',
+ 'redfish-dbus-log',
+ 'redfish-dump-log',
+ 'redfish-host-logger',
+ 'redfish-new-powersubsystem-thermalsubsystem',
+ 'redfish-oem-manager-fan-data',
+ 'redfish-provisioning-feature',
+ 'redfish',
+ 'rest',
+ 'session-auth',
+ 'static-hosting',
+ 'tests',
+ 'vm-websocket',
+ 'xtoken-auth',
+]
+
+string_options = [
+ 'dns-resolver',
+ 'mutual-tls-common-name-parsing',
+]
+
+int_options = [
+ 'http-body-limit',
+ 'https_port',
+]
+
+foreach option_key : feature_options
+
+ option_key_config = option_key.to_upper()
+ option_key_config = option_key_config.replace('-', '_')
+
+ message(option_key_config)
+ opt = get_option(option_key)
+ if string_options.contains(option_key)
+ elif int_options.contains(option_key)
+ else
+ opt = opt.allowed().to_string()
+ endif
+ conf_data.set(option_key_config, opt)
+ summary(option_key, opt, section: 'Features')
+endforeach
+
conf_data.set('MESON_INSTALL_PREFIX', get_option('prefix'))
-conf_data.set('HTTPS_PORT', get_option('https_port'))
-enable_multi_host = get_option('experimental-redfish-multi-computer-system')
-conf_data.set10('BMCWEB_ENABLE_MULTI_HOST', enable_multi_host.allowed())
-enable_http2 = get_option('experimental-http2')
-conf_data.set10('BMCWEB_ENABLE_HTTP2', enable_http2.allowed())
-
-enable_tls = get_option('insecure-disable-ssl')
-conf_data.set10('BMCWEB_ENABLE_TLS', enable_tls.disabled())
-
-conf_data.set10(
- 'BMCWEB_ENABLE_MTLS_COMMON_NAME_PARSING_META',
- get_option('mutual-tls-common-name-parsing') == 'meta',
-)
conf_data.set10('BMCWEB_VIRTUAL_MEDIA_VM', get_option('vm-websocket').allowed())
conf_data.set10('BMCWEB_VIRTUAL_MEDIA_NBD', false)
@@ -32,11 +76,11 @@
# Logging level
loglvlopt = get_option('bmcweb-logging')
if get_option('buildtype').startswith('debug') and loglvlopt == 'disabled'
- # Override logging level as 'debug' if 'bmcweb-logging' is set as 'dsiabled'
+ # Override logging level as 'debug' if 'bmcweb-logging' is set as 'disabled'
loglvlopt = 'debug'
endif
loglvlopt = loglvlopt.to_upper()
-conf_data.set('BMCWEB_LOGGING_LEVEL', loglvlopt)
+conf_data.set('LOGGING_LEVEL', loglvlopt)
conf_h_dep = declare_dependency(
include_directories: include_directories('.'),
diff --git a/http/app.hpp b/http/app.hpp
index 01ad755..eea1305 100644
--- a/http/app.hpp
+++ b/http/app.hpp
@@ -35,8 +35,8 @@
using ssl_socket_t = boost::asio::ssl::stream<boost::asio::ip::tcp::socket>;
using raw_socket_t = boost::asio::ip::tcp::socket;
- using socket_type =
- std::conditional_t<bmcwebEnableTLS, ssl_socket_t, raw_socket_t>;
+ using socket_type = std::conditional_t<BMCWEB_INSECURE_DISABLE_SSL,
+ raw_socket_t, ssl_socket_t>;
using server_type = Server<App, socket_type>;
explicit App(std::shared_ptr<boost::asio::io_context> ioIn =
diff --git a/http/http_client.hpp b/http/http_client.hpp
index 860a7d4..ac231b4 100644
--- a/http/http_client.hpp
+++ b/http/http_client.hpp
@@ -149,11 +149,9 @@
boost::asio::io_context& ioc;
-#ifdef BMCWEB_DBUS_DNS_RESOLVER
- using Resolver = async_resolve::Resolver;
-#else
- using Resolver = boost::asio::ip::tcp::resolver;
-#endif
+ using Resolver = std::conditional_t<BMCWEB_DNS_RESOLVER == "systemd-dbus",
+ async_resolve::Resolver,
+ boost::asio::ip::tcp::resolver>;
Resolver resolver;
boost::asio::ip::tcp::socket conn;
diff --git a/http/http_connection.hpp b/http/http_connection.hpp
index d0aa5d5..e02c518 100644
--- a/http/http_connection.hpp
+++ b/http/http_connection.hpp
@@ -38,9 +38,8 @@
// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
static int connectionCount = 0;
-// request body limit size set by the bmcwebHttpReqBodyLimitMb option
-constexpr uint64_t httpReqBodyLimit = 1024UL * 1024UL *
- bmcwebHttpReqBodyLimitMb;
+// request body limit size set by the BMCWEB_HTTP_BODY_LIMIT option
+constexpr uint64_t httpReqBodyLimit = 1024UL * 1024UL * BMCWEB_HTTP_BODY_LIMIT;
constexpr uint64_t loggedOutPostBodyLimit = 4096U;
@@ -70,9 +69,10 @@
{
initParser();
-#ifdef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
- prepareMutualTls();
-#endif // BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
+ if constexpr (BMCWEB_MUTUAL_TLS_AUTH)
+ {
+ prepareMutualTls();
+ }
connectionCount++;
@@ -187,7 +187,7 @@
void afterSslHandshake()
{
// If http2 is enabled, negotiate the protocol
- if constexpr (bmcwebEnableHTTP2)
+ if constexpr (BMCWEB_EXPERIMENTAL_HTTP2)
{
const unsigned char* alpn = nullptr;
unsigned int alpnlen = 0;
diff --git a/http/http_server.hpp b/http/http_server.hpp
index a370894..206a0d1 100644
--- a/http/http_server.hpp
+++ b/http/http_server.hpp
@@ -74,7 +74,7 @@
void loadCertificate()
{
- if constexpr (!bmcwebEnableTLS)
+ if constexpr (BMCWEB_INSECURE_DISABLE_SSL)
{
return;
}
diff --git a/http/logging.hpp b/http/logging.hpp
index 9b1a36b..cf90877 100644
--- a/http/logging.hpp
+++ b/http/logging.hpp
@@ -54,7 +54,7 @@
// configured bmcweb LogLevel
constexpr crow::LogLevel bmcwebCurrentLoggingLevel =
- getLogLevelFromName(bmcwebLoggingLevel);
+ getLogLevelFromName(BMCWEB_LOGGING_LEVEL);
template <typename T>
const void* logPtr(T p)
diff --git a/http/mutual_tls.hpp b/http/mutual_tls.hpp
index 9f9f82b..5392549 100644
--- a/http/mutual_tls.hpp
+++ b/http/mutual_tls.hpp
@@ -94,7 +94,7 @@
sslUser.resize(lastChar);
// Meta Inc. CommonName parsing
- if (bmcwebMTLSCommonNameParsingMeta)
+ if constexpr (BMCWEB_MUTUAL_TLS_COMMON_NAME_PARSING == "meta")
{
std::optional<std::string_view> sslUserMeta =
mtlsMetaParseSslUser(sslUser);
diff --git a/http/utility.hpp b/http/utility.hpp
index 1d67500..da174e5 100644
--- a/http/utility.hpp
+++ b/http/utility.hpp
@@ -497,7 +497,7 @@
}
if (url.port_number() == 80)
{
- if (bmcwebInsecureEnableHttpPushStyleEventing)
+ if constexpr (BMCWEB_INSECURE_PUSH_STYLE_NOTIFICATION)
{
url.set_scheme("http");
}
diff --git a/include/async_resolve.hpp b/include/async_resolve.hpp
index 798c3e8..2d9899d 100644
--- a/include/async_resolve.hpp
+++ b/include/async_resolve.hpp
@@ -1,5 +1,4 @@
#pragma once
-#ifdef BMCWEB_DBUS_DNS_RESOLVER
#include "dbus_singleton.hpp"
#include "logging.hpp"
@@ -124,4 +123,3 @@
};
} // namespace async_resolve
-#endif
diff --git a/include/authentication.hpp b/include/authentication.hpp
index ad9759b..6483365 100644
--- a/include/authentication.hpp
+++ b/include/authentication.hpp
@@ -32,8 +32,7 @@
}
}
-#ifdef BMCWEB_ENABLE_BASIC_AUTHENTICATION
-static std::shared_ptr<persistent_data::UserSession>
+inline std::shared_ptr<persistent_data::UserSession>
performBasicAuth(const boost::asio::ip::address& clientIp,
std::string_view authHeader)
{
@@ -86,10 +85,8 @@
user, clientIp, std::nullopt,
persistent_data::PersistenceType::SINGLE_REQUEST, isConfigureSelfOnly);
}
-#endif
-#ifdef BMCWEB_ENABLE_SESSION_AUTHENTICATION
-static std::shared_ptr<persistent_data::UserSession>
+inline std::shared_ptr<persistent_data::UserSession>
performTokenAuth(std::string_view authHeader)
{
BMCWEB_LOG_DEBUG("[AuthMiddleware] Token authentication");
@@ -102,10 +99,8 @@
persistent_data::SessionStore::getInstance().loginSessionByToken(token);
return sessionOut;
}
-#endif
-#ifdef BMCWEB_ENABLE_XTOKEN_AUTHENTICATION
-static std::shared_ptr<persistent_data::UserSession>
+inline std::shared_ptr<persistent_data::UserSession>
performXtokenAuth(const boost::beast::http::header<true>& reqHeader)
{
BMCWEB_LOG_DEBUG("[AuthMiddleware] X-Auth-Token authentication");
@@ -119,10 +114,8 @@
persistent_data::SessionStore::getInstance().loginSessionByToken(token);
return sessionOut;
}
-#endif
-#ifdef BMCWEB_ENABLE_COOKIE_AUTHENTICATION
-static std::shared_ptr<persistent_data::UserSession>
+inline std::shared_ptr<persistent_data::UserSession>
performCookieAuth(boost::beast::http::verb method [[maybe_unused]],
const boost::beast::http::header<true>& reqHeader)
{
@@ -159,37 +152,36 @@
return nullptr;
}
sessionOut->cookieAuth = true;
-#ifndef BMCWEB_INSECURE_DISABLE_CSRF_PREVENTION
- // RFC7231 defines methods that need csrf protection
- if (method != boost::beast::http::verb::get)
- {
- std::string_view csrf = reqHeader["X-XSRF-TOKEN"];
- // Make sure both tokens are filled
- if (csrf.empty() || sessionOut->csrfToken.empty())
- {
- return nullptr;
- }
- if (csrf.size() != persistent_data::sessionTokenSize)
+ if constexpr (BMCWEB_INSECURE_DISABLE_CSRF)
+ {
+ // RFC7231 defines methods that need csrf protection
+ if (method != boost::beast::http::verb::get)
{
- return nullptr;
- }
- // Reject if csrf token not available
- if (!crow::utility::constantTimeStringCompare(
- csrf, sessionOut->csrfToken))
- {
- return nullptr;
+ std::string_view csrf = reqHeader["X-XSRF-TOKEN"];
+ // Make sure both tokens are filled
+ if (csrf.empty() || sessionOut->csrfToken.empty())
+ {
+ return nullptr;
+ }
+
+ if (csrf.size() != persistent_data::sessionTokenSize)
+ {
+ return nullptr;
+ }
+ // Reject if csrf token not available
+ if (!crow::utility::constantTimeStringCompare(
+ csrf, sessionOut->csrfToken))
+ {
+ return nullptr;
+ }
}
}
-#endif
- return sessionOut;
}
return nullptr;
}
-#endif
-#ifdef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
-static std::shared_ptr<persistent_data::UserSession>
+inline std::shared_ptr<persistent_data::UserSession>
performTLSAuth(Response& res,
const boost::beast::http::header<true>& reqHeader,
const std::weak_ptr<persistent_data::UserSession>& session)
@@ -219,11 +211,9 @@
}
return nullptr;
}
-#endif
// checks if request can be forwarded without authentication
-[[maybe_unused]] static bool isOnAllowlist(std::string_view url,
- boost::beast::http::verb method)
+inline bool isOnAllowlist(std::string_view url, boost::beast::http::verb method)
{
if (boost::beast::http::verb::get == method)
{
@@ -257,51 +247,54 @@
return false;
}
-[[maybe_unused]] static std::shared_ptr<persistent_data::UserSession>
- authenticate(
- const boost::asio::ip::address& ipAddress [[maybe_unused]],
- Response& res [[maybe_unused]],
- boost::beast::http::verb method [[maybe_unused]],
- const boost::beast::http::header<true>& reqHeader,
- [[maybe_unused]] const std::shared_ptr<persistent_data::UserSession>&
- session)
+inline std::shared_ptr<persistent_data::UserSession> authenticate(
+ const boost::asio::ip::address& ipAddress [[maybe_unused]],
+ Response& res [[maybe_unused]],
+ boost::beast::http::verb method [[maybe_unused]],
+ const boost::beast::http::header<true>& reqHeader,
+ [[maybe_unused]] const std::shared_ptr<persistent_data::UserSession>&
+ session)
{
const persistent_data::AuthConfigMethods& authMethodsConfig =
persistent_data::SessionStore::getInstance().getAuthMethodsConfig();
std::shared_ptr<persistent_data::UserSession> sessionOut = nullptr;
-#ifdef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
- if (authMethodsConfig.tls)
+ if constexpr (BMCWEB_MUTUAL_TLS_AUTH)
{
- sessionOut = performTLSAuth(res, reqHeader, session);
+ if (authMethodsConfig.tls)
+ {
+ sessionOut = performTLSAuth(res, reqHeader, session);
+ }
}
-#endif
-#ifdef BMCWEB_ENABLE_XTOKEN_AUTHENTICATION
- if (sessionOut == nullptr && authMethodsConfig.xtoken)
+ if constexpr (BMCWEB_XTOKEN_AUTH)
{
- sessionOut = performXtokenAuth(reqHeader);
+ if (sessionOut == nullptr && authMethodsConfig.xtoken)
+ {
+ sessionOut = performXtokenAuth(reqHeader);
+ }
}
-#endif
-#ifdef BMCWEB_ENABLE_COOKIE_AUTHENTICATION
- if (sessionOut == nullptr && authMethodsConfig.cookie)
+ if constexpr (BMCWEB_COOKIE_AUTH)
{
- sessionOut = performCookieAuth(method, reqHeader);
+ if (sessionOut == nullptr && authMethodsConfig.cookie)
+ {
+ sessionOut = performCookieAuth(method, reqHeader);
+ }
}
-#endif
std::string_view authHeader = reqHeader["Authorization"];
BMCWEB_LOG_DEBUG("authHeader={}", authHeader);
-
- if (sessionOut == nullptr && authMethodsConfig.sessionToken)
+ if constexpr (BMCWEB_SESSION_AUTH)
{
-#ifdef BMCWEB_ENABLE_SESSION_AUTHENTICATION
- sessionOut = performTokenAuth(authHeader);
-#endif
+ if (sessionOut == nullptr && authMethodsConfig.sessionToken)
+ {
+ sessionOut = performTokenAuth(authHeader);
+ }
}
- if (sessionOut == nullptr && authMethodsConfig.basic)
+ if constexpr (BMCWEB_BASIC_AUTH)
{
-#ifdef BMCWEB_ENABLE_BASIC_AUTHENTICATION
- sessionOut = performBasicAuth(ipAddress, authHeader);
-#endif
+ if (sessionOut == nullptr && authMethodsConfig.basic)
+ {
+ sessionOut = performBasicAuth(ipAddress, authHeader);
+ }
}
if (sessionOut != nullptr)
{
diff --git a/include/sessions.hpp b/include/sessions.hpp
index 1d0b620..50299b8 100644
--- a/include/sessions.hpp
+++ b/include/sessions.hpp
@@ -134,35 +134,11 @@
struct AuthConfigMethods
{
-#ifdef BMCWEB_ENABLE_BASIC_AUTHENTICATION
- bool basic = true;
-#else
- bool basic = false;
-#endif
-
-#ifdef BMCWEB_ENABLE_SESSION_AUTHENTICATION
- bool sessionToken = true;
-#else
- bool sessionToken = false;
-#endif
-
-#ifdef BMCWEB_ENABLE_XTOKEN_AUTHENTICATION
- bool xtoken = true;
-#else
- bool xtoken = false;
-#endif
-
-#ifdef BMCWEB_ENABLE_COOKIE_AUTHENTICATION
- bool cookie = true;
-#else
- bool cookie = false;
-#endif
-
-#ifdef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
- bool tls = true;
-#else
- bool tls = false;
-#endif
+ bool basic = BMCWEB_BASIC_AUTH;
+ bool sessionToken = BMCWEB_SESSION_AUTH;
+ bool xtoken = BMCWEB_XTOKEN_AUTH;
+ bool cookie = BMCWEB_COOKIE_AUTH;
+ bool tls = BMCWEB_MUTUAL_TLS_AUTH;
void fromJson(const nlohmann::json& j)
{
diff --git a/include/ssl_key_handler.hpp b/include/ssl_key_handler.hpp
index d7255dd..36477da 100644
--- a/include/ssl_key_handler.hpp
+++ b/include/ssl_key_handler.hpp
@@ -485,7 +485,7 @@
mSslContext->use_private_key_file(sslPemFile,
boost::asio::ssl::context::pem);
- if constexpr (bmcwebEnableHTTP2)
+ if constexpr (BMCWEB_EXPERIMENTAL_HTTP2)
{
SSL_CTX_set_next_protos_advertised_cb(mSslContext->native_handle(),
nextProtoCallback, nullptr);
diff --git a/include/vm_websocket.hpp b/include/vm_websocket.hpp
index 14672e5..b489a42 100644
--- a/include/vm_websocket.hpp
+++ b/include/vm_websocket.hpp
@@ -517,10 +517,10 @@
inline void requestRoutes(App& app)
{
static_assert(
- !(bmcwebVmWebsocket && bmcwebNbdProxy),
+ !(BMCWEB_VM_WEBSOCKET && BMCWEB_VM_NBDPROXY),
"nbd proxy cannot be turned on at the same time as vm websocket.");
- if constexpr (bmcwebNbdProxy)
+ if constexpr (BMCWEB_VM_NBDPROXY)
{
BMCWEB_ROUTE(app, "/nbd/<str>")
.privileges({{"ConfigureComponents", "ConfigureManager"}})
@@ -536,7 +536,7 @@
.onclose(nbd_proxy::onClose)
.onmessageex(nbd_proxy::onMessage);
}
- if constexpr (bmcwebVmWebsocket)
+ if constexpr (BMCWEB_VM_WEBSOCKET)
{
BMCWEB_ROUTE(app, "/vm/0/0")
.privileges({{"ConfigureComponents", "ConfigureManager"}})
diff --git a/meson.build b/meson.build
index 5bb3fdf..101c0ce 100644
--- a/meson.build
+++ b/meson.build
@@ -57,85 +57,8 @@
incdir = include_directories('include', 'redfish-core/include', 'redfish-core/lib', 'http')
-# Get the options and enable the respective features
-## create a MAP of "options : feature_flag"
-
-feature_map = {
- 'basic-auth': '-DBMCWEB_ENABLE_BASIC_AUTHENTICATION',
- 'cookie-auth': '-DBMCWEB_ENABLE_COOKIE_AUTHENTICATION',
- 'google-api': '-DBMCWEB_ENABLE_GOOGLE_API',
- 'host-serial-socket': '-DBMCWEB_ENABLE_HOST_SERIAL_WEBSOCKET',
- 'ibm-management-console': '-DBMCWEB_ENABLE_IBM_MANAGEMENT_CONSOLE',
- 'insecure-disable-auth': '-DBMCWEB_INSECURE_DISABLE_AUTHX',
- 'insecure-disable-csrf': '-DBMCWEB_INSECURE_DISABLE_CSRF_PREVENTION',
- 'insecure-disable-ssl': '-DBMCWEB_INSECURE_DISABLE_SSL',
- 'insecure-push-style-notification': '-DBMCWEB_INSECURE_ENABLE_HTTP_PUSH_STYLE_EVENTING',
- 'insecure-tftp-update': '-DBMCWEB_INSECURE_ENABLE_REDFISH_FW_TFTP_UPDATE',
- 'insecure-ignore-content-type': '-DBMCWEB_INSECURE_IGNORE_CONTENT_TYPE',
- 'kvm': '-DBMCWEB_ENABLE_KVM',
- 'mutual-tls-auth': '-DBMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION',
- 'redfish-aggregation': '-DBMCWEB_ENABLE_REDFISH_AGGREGATION',
- 'redfish-allow-deprecated-power-thermal': '-DBMCWEB_ALLOW_DEPRECATED_POWER_THERMAL',
- 'redfish-bmc-journal': '-DBMCWEB_ENABLE_REDFISH_BMC_JOURNAL',
- 'redfish-cpu-log': '-DBMCWEB_ENABLE_REDFISH_CPU_LOG',
- 'redfish-dbus-log': '-DBMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES',
- 'redfish-dump-log': '-DBMCWEB_ENABLE_REDFISH_DUMP_LOG',
- 'redfish-host-logger': '-DBMCWEB_ENABLE_REDFISH_HOST_LOGGER',
- 'redfish-new-powersubsystem-thermalsubsystem': '-DBMCWEB_NEW_POWERSUBSYSTEM_THERMALSUBSYSTEM',
- 'redfish-oem-manager-fan-data': '-DBMCWEB_ENABLE_REDFISH_OEM_MANAGER_FAN_DATA',
- 'redfish-provisioning-feature': '-DBMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE',
- 'redfish': '-DBMCWEB_ENABLE_REDFISH',
- 'rest': '-DBMCWEB_ENABLE_DBUS_REST',
- 'session-auth': '-DBMCWEB_ENABLE_SESSION_AUTHENTICATION',
- 'static-hosting': '-DBMCWEB_ENABLE_STATIC_HOSTING',
- 'experimental-redfish-multi-computer-system': '-DBMCWEB_ENABLE_MULTI_COMPUTERSYSTEM',
- 'xtoken-auth': '-DBMCWEB_ENABLE_XTOKEN_AUTHENTICATION',
- #'vm-nbdproxy' : '-DBMCWEB_ENABLE_VM_NBDPROXY',
-}
-
-# Get the options status and build a project summary to show which flags are
-# being enabled during the configuration time.
-
-foreach option_key, option_value : feature_map
- if (get_option(option_key).allowed())
- if (
- option_key == 'mutual-tls-auth'
- or option_key == 'insecure-disable-ssl'
- )
- if (
- get_option('insecure-disable-ssl').disabled()
- or get_option('mutual-tls-auth').disabled()
- )
- add_project_arguments(option_value, language: 'cpp')
- summary(option_key, option_value, section: 'Enabled Features')
- endif
- elif (
- option_key in [
- 'basic-auth',
- 'cookie-auth',
- 'session-auth',
- 'xtoken-auth',
- 'mutual-tls-auth',
- ]
- )
- if (get_option('insecure-disable-auth').disabled())
- add_project_arguments(option_value, language: 'cpp')
- summary(option_key, option_value, section: 'Enabled Features')
- endif
- else
- summary(option_key, option_value, section: 'Enabled Features')
- add_project_arguments(option_value, language: 'cpp')
- endif
- else
- if (option_key == 'insecure-disable-ssl')
- summary('ssl', '-DBMCWEB_ENABLE_SSL', section: 'Enabled Features')
- add_project_arguments('-DBMCWEB_ENABLE_SSL', language: 'cpp')
- endif
- endif
-endforeach
-
if (get_option('tests').allowed())
- summary('unittest', 'NA', section: 'Enabled Features')
+ summary('unittest', 'NA', section: 'Features')
endif
# Add compiler arguments
@@ -211,16 +134,6 @@
endif
endif
endif
-
-if (
- get_option('bmcweb-logging') != 'disabled'
- or get_option('buildtype').startswith('debug')
-)
- add_project_arguments(['-DBMCWEB_ENABLE_DEBUG'], language: 'cpp')
-
- summary('debug', '-DBMCWEB_ENABLE_DEBUG', section: 'Enabled Features')
-endif
-
# Set Compiler Security flags
security_flags = [
diff --git a/redfish-core/include/query.hpp b/redfish-core/include/query.hpp
index e68b89a..063f1a8 100644
--- a/redfish-core/include/query.hpp
+++ b/redfish-core/include/query.hpp
@@ -147,13 +147,15 @@
bool needToCallHandlers = true;
-#ifdef BMCWEB_ENABLE_REDFISH_AGGREGATION
- needToCallHandlers = RedfishAggregator::beginAggregation(req, asyncResp) ==
- Result::LocalHandle;
+ if constexpr (BMCWEB_REDFISH_AGGREGATION)
+ {
+ needToCallHandlers = RedfishAggregator::beginAggregation(
+ req, asyncResp) == Result::LocalHandle;
- // If the request should be forwarded to a satellite BMC then we don't want
- // to write anything to the asyncResp since it will get overwritten later.
-#endif
+ // If the request should be forwarded to a satellite BMC then we don't
+ // want to write anything to the asyncResp since it will get overwritten
+ // later.
+ }
// If this isn't a get, no need to do anything with parameters
if (req.method() != boost::beast::http::verb::get)
diff --git a/redfish-core/include/utils/query_param.hpp b/redfish-core/include/utils/query_param.hpp
index 2441c9f..eadb66e 100644
--- a/redfish-core/include/utils/query_param.hpp
+++ b/redfish-core/include/utils/query_param.hpp
@@ -389,7 +389,7 @@
}
ret.isOnly = true;
}
- else if (it.key == "$expand" && bmcwebInsecureEnableQueryParams)
+ else if (it.key == "$expand" && BMCWEB_INSECURE_ENABLE_REDFISH_QUERY)
{
if (!getExpandType(it.value, ret))
{
diff --git a/redfish-core/lib/account_service.hpp b/redfish-core/lib/account_service.hpp
index aab116e..972512b 100644
--- a/redfish-core/lib/account_service.hpp
+++ b/redfish-core/lib/account_service.hpp
@@ -829,56 +829,62 @@
if (auth.basicAuth)
{
-#ifndef BMCWEB_ENABLE_BASIC_AUTHENTICATION
- messages::actionNotSupported(
- asyncResp->res,
- "Setting BasicAuth when basic-auth feature is disabled");
- return;
-#endif
+ if constexpr (!BMCWEB_BASIC_AUTH)
+ {
+ messages::actionNotSupported(
+ asyncResp->res,
+ "Setting BasicAuth when basic-auth feature is disabled");
+ return;
+ }
+
authMethodsConfig.basic = *auth.basicAuth;
}
if (auth.cookie)
{
-#ifndef BMCWEB_ENABLE_COOKIE_AUTHENTICATION
- messages::actionNotSupported(
- asyncResp->res,
- "Setting Cookie when cookie-auth feature is disabled");
- return;
-#endif
+ if constexpr (!BMCWEB_COOKIE_AUTH)
+ {
+ messages::actionNotSupported(
+ asyncResp->res,
+ "Setting Cookie when cookie-auth feature is disabled");
+ return;
+ }
authMethodsConfig.cookie = *auth.cookie;
}
if (auth.sessionToken)
{
-#ifndef BMCWEB_ENABLE_SESSION_AUTHENTICATION
- messages::actionNotSupported(
- asyncResp->res,
- "Setting SessionToken when session-auth feature is disabled");
- return;
-#endif
+ if constexpr (!BMCWEB_SESSION_AUTH)
+ {
+ messages::actionNotSupported(
+ asyncResp->res,
+ "Setting SessionToken when session-auth feature is disabled");
+ return;
+ }
authMethodsConfig.sessionToken = *auth.sessionToken;
}
if (auth.xToken)
{
-#ifndef BMCWEB_ENABLE_XTOKEN_AUTHENTICATION
- messages::actionNotSupported(
- asyncResp->res,
- "Setting XToken when xtoken-auth feature is disabled");
- return;
-#endif
+ if constexpr (!BMCWEB_XTOKEN_AUTH)
+ {
+ messages::actionNotSupported(
+ asyncResp->res,
+ "Setting XToken when xtoken-auth feature is disabled");
+ return;
+ }
authMethodsConfig.xtoken = *auth.xToken;
}
if (auth.tls)
{
-#ifndef BMCWEB_ENABLE_MUTUAL_TLS_AUTHENTICATION
- messages::actionNotSupported(
- asyncResp->res,
- "Setting TLS when mutual-tls-auth feature is disabled");
- return;
-#endif
+ if constexpr (!BMCWEB_MUTUAL_TLS_AUTH)
+ {
+ messages::actionNotSupported(
+ asyncResp->res,
+ "Setting TLS when mutual-tls-auth feature is disabled");
+ return;
+ }
authMethodsConfig.tls = *auth.tls;
}
@@ -1705,11 +1711,13 @@
boost::beast::http::field::link,
"</redfish/v1/JsonSchemas/ManagerAccount/ManagerAccount.json>; rel=describedby");
-#ifdef BMCWEB_INSECURE_DISABLE_AUTHENTICATION
- // If authentication is disabled, there are no user accounts
- messages::resourceNotFound(asyncResp->res, "ManagerAccount", accountName);
- return;
-#endif // BMCWEB_INSECURE_DISABLE_AUTHENTICATION
+ if constexpr (BMCWEB_INSECURE_DISABLE_AUTH)
+ {
+ // If authentication is disabled, there are no user accounts
+ messages::resourceNotFound(asyncResp->res, "ManagerAccount",
+ accountName);
+ return;
+ }
if (req.session == nullptr)
{
@@ -1882,12 +1890,12 @@
return;
}
-#ifdef BMCWEB_INSECURE_DISABLE_AUTHENTICATION
- // If authentication is disabled, there are no user accounts
- messages::resourceNotFound(asyncResp->res, "ManagerAccount", username);
- return;
-
-#endif // BMCWEB_INSECURE_DISABLE_AUTHENTICATION
+ if constexpr (BMCWEB_INSECURE_DISABLE_AUTH)
+ {
+ // If authentication is disabled, there are no user accounts
+ messages::resourceNotFound(asyncResp->res, "ManagerAccount", username);
+ return;
+ }
sdbusplus::message::object_path tempObjPath(rootUserDbusPath);
tempObjPath /= username;
const std::string userPath(tempObjPath);
@@ -1916,12 +1924,12 @@
{
return;
}
-#ifdef BMCWEB_INSECURE_DISABLE_AUTHENTICATION
- // If authentication is disabled, there are no user accounts
- messages::resourceNotFound(asyncResp->res, "ManagerAccount", username);
- return;
-
-#endif // BMCWEB_INSECURE_DISABLE_AUTHENTICATION
+ if constexpr (BMCWEB_INSECURE_DISABLE_AUTH)
+ {
+ // If authentication is disabled, there are no user accounts
+ messages::resourceNotFound(asyncResp->res, "ManagerAccount", username);
+ return;
+ }
std::optional<std::string> newUserName;
std::optional<std::string> password;
std::optional<bool> enabled;
diff --git a/redfish-core/lib/bios.hpp b/redfish-core/lib/bios.hpp
index 025f436..477c15e 100644
--- a/redfish-core/lib/bios.hpp
+++ b/redfish-core/lib/bios.hpp
@@ -19,7 +19,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -70,7 +70,7 @@
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
diff --git a/redfish-core/lib/chassis.hpp b/redfish-core/lib/chassis.hpp
index 9ee10b5..19728a4 100644
--- a/redfish-core/lib/chassis.hpp
+++ b/redfish-core/lib/chassis.hpp
@@ -402,23 +402,28 @@
asyncResp->res.jsonValue["Name"] = chassisId;
asyncResp->res.jsonValue["Id"] = chassisId;
-#ifdef BMCWEB_ALLOW_DEPRECATED_POWER_THERMAL
- asyncResp->res.jsonValue["Thermal"]["@odata.id"] =
- boost::urls::format("/redfish/v1/Chassis/{}/Thermal", chassisId);
- // Power object
- asyncResp->res.jsonValue["Power"]["@odata.id"] =
- boost::urls::format("/redfish/v1/Chassis/{}/Power", chassisId);
-#endif
-#ifdef BMCWEB_NEW_POWERSUBSYSTEM_THERMALSUBSYSTEM
- asyncResp->res.jsonValue["ThermalSubsystem"]["@odata.id"] =
- boost::urls::format("/redfish/v1/Chassis/{}/ThermalSubsystem",
- chassisId);
- asyncResp->res.jsonValue["PowerSubsystem"]["@odata.id"] =
- boost::urls::format("/redfish/v1/Chassis/{}/PowerSubsystem", chassisId);
- asyncResp->res.jsonValue["EnvironmentMetrics"]["@odata.id"] =
- boost::urls::format("/redfish/v1/Chassis/{}/EnvironmentMetrics",
- chassisId);
-#endif
+
+ if constexpr (BMCWEB_REDFISH_ALLOW_DEPRECATED_POWER_THERMAL)
+ {
+ asyncResp->res.jsonValue["Thermal"]["@odata.id"] =
+ boost::urls::format("/redfish/v1/Chassis/{}/Thermal", chassisId);
+ // Power object
+ asyncResp->res.jsonValue["Power"]["@odata.id"] =
+ boost::urls::format("/redfish/v1/Chassis/{}/Power", chassisId);
+ }
+
+ if constexpr (BMCWEB_REDFISH_NEW_POWERSUBSYSTEM_THERMALSUBSYSTEM)
+ {
+ asyncResp->res.jsonValue["ThermalSubsystem"]["@odata.id"] =
+ boost::urls::format("/redfish/v1/Chassis/{}/ThermalSubsystem",
+ chassisId);
+ asyncResp->res.jsonValue["PowerSubsystem"]["@odata.id"] =
+ boost::urls::format("/redfish/v1/Chassis/{}/PowerSubsystem",
+ chassisId);
+ asyncResp->res.jsonValue["EnvironmentMetrics"]["@odata.id"] =
+ boost::urls::format("/redfish/v1/Chassis/{}/EnvironmentMetrics",
+ chassisId);
+ }
// SensorCollection
asyncResp->res.jsonValue["Sensors"]["@odata.id"] =
boost::urls::format("/redfish/v1/Chassis/{}/Sensors", chassisId);
diff --git a/redfish-core/lib/fabric_adapters.hpp b/redfish-core/lib/fabric_adapters.hpp
index 87015dd..46e67d2 100644
--- a/redfish-core/lib/fabric_adapters.hpp
+++ b/redfish-core/lib/fabric_adapters.hpp
@@ -266,7 +266,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -293,7 +293,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -333,7 +333,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -391,7 +391,7 @@
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
diff --git a/redfish-core/lib/log_services.hpp b/redfish-core/lib/log_services.hpp
index 1e5a34f..1453a4b 100644
--- a/redfish-core/lib/log_services.hpp
+++ b/redfish-core/lib/log_services.hpp
@@ -865,7 +865,7 @@
const std::string& entryID,
const std::string& dumpType)
{
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -1276,7 +1276,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -1305,25 +1305,29 @@
eventLog["@odata.id"] =
"/redfish/v1/Systems/system/LogServices/EventLog";
logServiceArray.emplace_back(std::move(eventLog));
-#ifdef BMCWEB_ENABLE_REDFISH_DUMP_LOG
- nlohmann::json::object_t dumpLog;
- dumpLog["@odata.id"] = "/redfish/v1/Systems/system/LogServices/Dump";
- logServiceArray.emplace_back(std::move(dumpLog));
-#endif
+ if constexpr (BMCWEB_REDFISH_DUMP_LOG)
+ {
+ nlohmann::json::object_t dumpLog;
+ dumpLog["@odata.id"] =
+ "/redfish/v1/Systems/system/LogServices/Dump";
+ logServiceArray.emplace_back(std::move(dumpLog));
+ }
-#ifdef BMCWEB_ENABLE_REDFISH_CPU_LOG
- nlohmann::json::object_t crashdump;
- crashdump["@odata.id"] =
- "/redfish/v1/Systems/system/LogServices/Crashdump";
- logServiceArray.emplace_back(std::move(crashdump));
-#endif
+ if constexpr (BMCWEB_REDFISH_DUMP_LOG)
+ {
+ nlohmann::json::object_t crashdump;
+ crashdump["@odata.id"] =
+ "/redfish/v1/Systems/system/LogServices/Crashdump";
+ logServiceArray.emplace_back(std::move(crashdump));
+ }
-#ifdef BMCWEB_ENABLE_REDFISH_HOST_LOGGER
- nlohmann::json::object_t hostlogger;
- hostlogger["@odata.id"] =
- "/redfish/v1/Systems/system/LogServices/HostLogger";
- logServiceArray.emplace_back(std::move(hostlogger));
-#endif
+ if constexpr (BMCWEB_REDFISH_HOST_LOGGER)
+ {
+ nlohmann::json::object_t hostlogger;
+ hostlogger["@odata.id"] =
+ "/redfish/v1/Systems/system/LogServices/HostLogger";
+ logServiceArray.emplace_back(std::move(hostlogger));
+ }
asyncResp->res.jsonValue["Members@odata.count"] =
logServiceArray.size();
@@ -1556,7 +1560,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -1661,7 +1665,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -1738,7 +1742,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -1935,7 +1939,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -2049,7 +2053,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -2089,7 +2093,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -2229,7 +2233,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -2273,7 +2277,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -2357,7 +2361,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -2435,57 +2439,59 @@
nlohmann::json& logServiceArray = asyncResp->res.jsonValue["Members"];
logServiceArray = nlohmann::json::array();
-#ifdef BMCWEB_ENABLE_REDFISH_BMC_JOURNAL
- nlohmann::json::object_t journal;
- journal["@odata.id"] = "/redfish/v1/Managers/bmc/LogServices/Journal";
- logServiceArray.emplace_back(std::move(journal));
-#endif
+ if constexpr (BMCWEB_REDFISH_BMC_JOURNAL)
+ {
+ nlohmann::json::object_t journal;
+ journal["@odata.id"] = "/redfish/v1/Managers/bmc/LogServices/Journal";
+ logServiceArray.emplace_back(std::move(journal));
+ }
asyncResp->res.jsonValue["Members@odata.count"] = logServiceArray.size();
-#ifdef BMCWEB_ENABLE_REDFISH_DUMP_LOG
- constexpr std::array<std::string_view, 1> interfaces = {
- "xyz.openbmc_project.Collection.DeleteAll"};
- dbus::utility::getSubTreePaths(
- "/xyz/openbmc_project/dump", 0, interfaces,
- [asyncResp](
- const boost::system::error_code& ec,
- const dbus::utility::MapperGetSubTreePathsResponse& subTreePaths) {
- if (ec)
- {
- BMCWEB_LOG_ERROR(
- "handleBMCLogServicesCollectionGet respHandler got error {}",
- ec);
- // Assume that getting an error simply means there are no dump
- // LogServices. Return without adding any error response.
- return;
- }
-
- nlohmann::json& logServiceArrayLocal =
- asyncResp->res.jsonValue["Members"];
-
- for (const std::string& path : subTreePaths)
- {
- if (path == "/xyz/openbmc_project/dump/bmc")
+ if constexpr (BMCWEB_REDFISH_DUMP_LOG)
+ {
+ constexpr std::array<std::string_view, 1> interfaces = {
+ "xyz.openbmc_project.Collection.DeleteAll"};
+ dbus::utility::getSubTreePaths(
+ "/xyz/openbmc_project/dump", 0, interfaces,
+ [asyncResp](const boost::system::error_code& ec,
+ const dbus::utility::MapperGetSubTreePathsResponse&
+ subTreePaths) {
+ if (ec)
{
- nlohmann::json::object_t member;
- member["@odata.id"] =
- "/redfish/v1/Managers/bmc/LogServices/Dump";
- logServiceArrayLocal.emplace_back(std::move(member));
+ BMCWEB_LOG_ERROR(
+ "handleBMCLogServicesCollectionGet respHandler got error {}",
+ ec);
+ // Assume that getting an error simply means there are no dump
+ // LogServices. Return without adding any error response.
+ return;
}
- else if (path == "/xyz/openbmc_project/dump/faultlog")
- {
- nlohmann::json::object_t member;
- member["@odata.id"] =
- "/redfish/v1/Managers/bmc/LogServices/FaultLog";
- logServiceArrayLocal.emplace_back(std::move(member));
- }
- }
- asyncResp->res.jsonValue["Members@odata.count"] =
- logServiceArrayLocal.size();
- });
-#endif
+ nlohmann::json& logServiceArrayLocal =
+ asyncResp->res.jsonValue["Members"];
+
+ for (const std::string& path : subTreePaths)
+ {
+ if (path == "/xyz/openbmc_project/dump/bmc")
+ {
+ nlohmann::json::object_t member;
+ member["@odata.id"] =
+ "/redfish/v1/Managers/bmc/LogServices/Dump";
+ logServiceArrayLocal.emplace_back(std::move(member));
+ }
+ else if (path == "/xyz/openbmc_project/dump/faultlog")
+ {
+ nlohmann::json::object_t member;
+ member["@odata.id"] =
+ "/redfish/v1/Managers/bmc/LogServices/FaultLog";
+ logServiceArrayLocal.emplace_back(std::move(member));
+ }
+ }
+
+ asyncResp->res.jsonValue["Members@odata.count"] =
+ logServiceArrayLocal.size();
+ });
+ }
}
inline void requestRoutesBMCLogServiceCollection(App& app)
@@ -3004,7 +3010,7 @@
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3040,7 +3046,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3242,7 +3248,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3300,7 +3306,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3417,7 +3423,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3493,7 +3499,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3527,7 +3533,7 @@
// Do not call getRedfishRoute here since the crashdump file is not a
// Redfish resource.
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3633,7 +3639,7 @@
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3769,7 +3775,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3823,7 +3829,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3875,7 +3881,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -4236,7 +4242,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -4287,7 +4293,7 @@
asyncResp->res.result(boost::beast::http::status::bad_request);
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -4373,7 +4379,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
diff --git a/redfish-core/lib/managers.hpp b/redfish-core/lib/managers.hpp
index 592bbd8..e6f42be 100644
--- a/redfish-core/lib/managers.hpp
+++ b/redfish-core/lib/managers.hpp
@@ -1945,7 +1945,7 @@
asyncResp->res.jsonValue["EthernetInterfaces"]["@odata.id"] =
"/redfish/v1/Managers/bmc/EthernetInterfaces";
- if constexpr (bmcwebNbdProxy)
+ if constexpr (BMCWEB_VM_NBDPROXY)
{
asyncResp->res.jsonValue["VirtualMedia"]["@odata.id"] =
"/redfish/v1/Managers/bmc/VirtualMedia";
@@ -1998,15 +1998,18 @@
asyncResp->res.jsonValue["SerialConsole"]["MaxConcurrentSessions"] = 15;
asyncResp->res.jsonValue["SerialConsole"]["ConnectTypesSupported"] =
nlohmann::json::array_t({"IPMI", "SSH"});
-#ifdef BMCWEB_ENABLE_KVM
- // Fill in GraphicalConsole info
- asyncResp->res.jsonValue["GraphicalConsole"]["ServiceEnabled"] = true;
- asyncResp->res.jsonValue["GraphicalConsole"]["MaxConcurrentSessions"] =
- 4;
- asyncResp->res.jsonValue["GraphicalConsole"]["ConnectTypesSupported"] =
- nlohmann::json::array_t({"KVMIP"});
-#endif // BMCWEB_ENABLE_KVM
- if constexpr (!bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_KVM)
+ {
+ // Fill in GraphicalConsole info
+ asyncResp->res.jsonValue["GraphicalConsole"]["ServiceEnabled"] =
+ true;
+ asyncResp->res
+ .jsonValue["GraphicalConsole"]["MaxConcurrentSessions"] = 4;
+ asyncResp->res
+ .jsonValue["GraphicalConsole"]["ConnectTypesSupported"] =
+ nlohmann::json::array_t({"KVMIP"});
+ }
+ if constexpr (!BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
asyncResp->res.jsonValue["Links"]["ManagerForServers@odata.count"] =
1;
@@ -2031,10 +2034,11 @@
managerDiagnosticData["@odata.id"] =
"/redfish/v1/Managers/bmc/ManagerDiagnosticData";
-#ifdef BMCWEB_ENABLE_REDFISH_OEM_MANAGER_FAN_DATA
- auto pids = std::make_shared<GetPIDValues>(asyncResp);
- pids->run();
-#endif
+ if constexpr (BMCWEB_REDFISH_OEM_MANAGER_FAN_DATA)
+ {
+ auto pids = std::make_shared<GetPIDValues>(asyncResp);
+ pids->run();
+ }
getMainChassisId(asyncResp,
[](const std::string& chassisId,
@@ -2217,36 +2221,39 @@
if (pidControllers || fanControllers || fanZones ||
stepwiseControllers || profile)
{
-#ifdef BMCWEB_ENABLE_REDFISH_OEM_MANAGER_FAN_DATA
- std::vector<
- std::pair<std::string, std::optional<nlohmann::json::object_t>>>
- configuration;
- if (pidControllers)
+ if constexpr (BMCWEB_REDFISH_OEM_MANAGER_FAN_DATA)
{
- configuration.emplace_back("PidControllers",
- std::move(pidControllers));
+ std::vector<std::pair<std::string,
+ std::optional<nlohmann::json::object_t>>>
+ configuration;
+ if (pidControllers)
+ {
+ configuration.emplace_back("PidControllers",
+ std::move(pidControllers));
+ }
+ if (fanControllers)
+ {
+ configuration.emplace_back("FanControllers",
+ std::move(fanControllers));
+ }
+ if (fanZones)
+ {
+ configuration.emplace_back("FanZones", std::move(fanZones));
+ }
+ if (stepwiseControllers)
+ {
+ configuration.emplace_back("StepwiseControllers",
+ std::move(stepwiseControllers));
+ }
+ auto pid = std::make_shared<SetPIDValues>(
+ asyncResp, std::move(configuration), profile);
+ pid->run();
}
- if (fanControllers)
+ else
{
- configuration.emplace_back("FanControllers",
- std::move(fanControllers));
+ messages::propertyUnknown(asyncResp->res, "Oem");
+ return;
}
- if (fanZones)
- {
- configuration.emplace_back("FanZones", std::move(fanZones));
- }
- if (stepwiseControllers)
- {
- configuration.emplace_back("StepwiseControllers",
- std::move(stepwiseControllers));
- }
- auto pid = std::make_shared<SetPIDValues>(
- asyncResp, std::move(configuration), profile);
- pid->run();
-#else
- messages::propertyUnknown(asyncResp->res, "Oem");
- return;
-#endif
}
if (activeSoftwareImageOdataId)
diff --git a/redfish-core/lib/memory.hpp b/redfish-core/lib/memory.hpp
index 2882da0..49d1962 100644
--- a/redfish-core/lib/memory.hpp
+++ b/redfish-core/lib/memory.hpp
@@ -778,7 +778,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -822,7 +822,7 @@
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
diff --git a/redfish-core/lib/pcie.hpp b/redfish-core/lib/pcie.hpp
index 223522b..af78cc8 100644
--- a/redfish-core/lib/pcie.hpp
+++ b/redfish-core/lib/pcie.hpp
@@ -108,7 +108,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -566,7 +566,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -639,7 +639,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -790,7 +790,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
diff --git a/redfish-core/lib/processor.hpp b/redfish-core/lib/processor.hpp
index ff17ebd..481c2a5 100644
--- a/redfish-core/lib/processor.hpp
+++ b/redfish-core/lib/processor.hpp
@@ -1105,7 +1105,7 @@
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -1184,7 +1184,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -1263,7 +1263,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -1318,7 +1318,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -1356,7 +1356,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
diff --git a/redfish-core/lib/sensors.hpp b/redfish-core/lib/sensors.hpp
index 75eaa7c..9068888 100644
--- a/redfish-core/lib/sensors.hpp
+++ b/redfish-core/lib/sensors.hpp
@@ -64,21 +64,30 @@
"/xyz/openbmc_project/sensors/power"
});
-constexpr auto sensorPaths = std::to_array<std::string_view>({
- "/xyz/openbmc_project/sensors/power",
- "/xyz/openbmc_project/sensors/current",
- "/xyz/openbmc_project/sensors/airflow",
- "/xyz/openbmc_project/sensors/humidity",
-#ifdef BMCWEB_NEW_POWERSUBSYSTEM_THERMALSUBSYSTEM
- "/xyz/openbmc_project/sensors/voltage",
- "/xyz/openbmc_project/sensors/fan_tach",
- "/xyz/openbmc_project/sensors/temperature",
- "/xyz/openbmc_project/sensors/fan_pwm",
- "/xyz/openbmc_project/sensors/altitude",
- "/xyz/openbmc_project/sensors/energy",
-#endif
- "/xyz/openbmc_project/sensors/utilization"
-});
+constexpr auto getSensorPaths(){
+ if constexpr(BMCWEB_REDFISH_NEW_POWERSUBSYSTEM_THERMALSUBSYSTEM){
+ return std::to_array<std::string_view>({
+ "/xyz/openbmc_project/sensors/power",
+ "/xyz/openbmc_project/sensors/current",
+ "/xyz/openbmc_project/sensors/airflow",
+ "/xyz/openbmc_project/sensors/humidity",
+ "/xyz/openbmc_project/sensors/voltage",
+ "/xyz/openbmc_project/sensors/fan_tach",
+ "/xyz/openbmc_project/sensors/temperature",
+ "/xyz/openbmc_project/sensors/fan_pwm",
+ "/xyz/openbmc_project/sensors/altitude",
+ "/xyz/openbmc_project/sensors/energy",
+ "/xyz/openbmc_project/sensors/utilization"});
+ } else {
+ return std::to_array<std::string_view>({"/xyz/openbmc_project/sensors/power",
+ "/xyz/openbmc_project/sensors/current",
+ "/xyz/openbmc_project/sensors/airflow",
+ "/xyz/openbmc_project/sensors/humidity",
+ "/xyz/openbmc_project/sensors/utilization"});
+}
+}
+
+constexpr auto sensorPaths = getSensorPaths();
constexpr auto thermalPaths = std::to_array<std::string_view>({
"/xyz/openbmc_project/sensors/fan_tach",
diff --git a/redfish-core/lib/service_root.hpp b/redfish-core/lib/service_root.hpp
index 6ae16c3..2fc3515 100644
--- a/redfish-core/lib/service_root.hpp
+++ b/redfish-core/lib/service_root.hpp
@@ -62,10 +62,11 @@
"/redfish/v1/SessionService/Sessions";
asyncResp->res.jsonValue["AccountService"]["@odata.id"] =
"/redfish/v1/AccountService";
-#ifdef BMCWEB_ENABLE_REDFISH_AGGREGATION
- asyncResp->res.jsonValue["AggregationService"]["@odata.id"] =
- "/redfish/v1/AggregationService";
-#endif
+ if constexpr (BMCWEB_REDFISH_AGGREGATION)
+ {
+ asyncResp->res.jsonValue["AggregationService"]["@odata.id"] =
+ "/redfish/v1/AggregationService";
+ }
asyncResp->res.jsonValue["Chassis"]["@odata.id"] = "/redfish/v1/Chassis";
asyncResp->res.jsonValue["JsonSchemas"]["@odata.id"] =
"/redfish/v1/JsonSchemas";
@@ -95,16 +96,18 @@
protocolFeatures["ExcerptQuery"] = false;
protocolFeatures["ExpandQuery"]["ExpandAll"] =
- bmcwebInsecureEnableQueryParams;
+ BMCWEB_INSECURE_ENABLE_REDFISH_QUERY;
// This is the maximum level defined in ServiceRoot.v1_13_0.json
- if (bmcwebInsecureEnableQueryParams)
+ if constexpr (BMCWEB_INSECURE_ENABLE_REDFISH_QUERY)
{
protocolFeatures["ExpandQuery"]["MaxLevels"] = 6;
}
- protocolFeatures["ExpandQuery"]["Levels"] = bmcwebInsecureEnableQueryParams;
- protocolFeatures["ExpandQuery"]["Links"] = bmcwebInsecureEnableQueryParams;
+ protocolFeatures["ExpandQuery"]["Levels"] =
+ BMCWEB_INSECURE_ENABLE_REDFISH_QUERY;
+ protocolFeatures["ExpandQuery"]["Links"] =
+ BMCWEB_INSECURE_ENABLE_REDFISH_QUERY;
protocolFeatures["ExpandQuery"]["NoLinks"] =
- bmcwebInsecureEnableQueryParams;
+ BMCWEB_INSECURE_ENABLE_REDFISH_QUERY;
protocolFeatures["FilterQuery"] = false;
protocolFeatures["OnlyMemberQuery"] = true;
protocolFeatures["SelectQuery"] = true;
diff --git a/redfish-core/lib/storage.hpp b/redfish-core/lib/storage.hpp
index 9438144..c6141df 100644
--- a/redfish-core/lib/storage.hpp
+++ b/redfish-core/lib/storage.hpp
@@ -193,7 +193,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -690,7 +690,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
diff --git a/redfish-core/lib/systems.hpp b/redfish-core/lib/systems.hpp
index 5765af8..e12db49 100644
--- a/redfish-core/lib/systems.hpp
+++ b/redfish-core/lib/systems.hpp
@@ -1926,15 +1926,16 @@
"PowerRestorePolicy", powerRestorePolicy);
}
-#ifdef BMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE
/**
* @brief Retrieves provisioning status
*
- * @param[in] asyncResp Shared pointer for completing asynchronous calls.
+ * @param[in] asyncResp Shared pointer for completing asynchronous
+ * calls.
*
* @return None.
*/
-inline void getProvisioningStatus(std::shared_ptr<bmcweb::AsyncResp> asyncResp)
+inline void
+ getProvisioningStatus(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
{
BMCWEB_LOG_DEBUG("Get OEM information.");
sdbusplus::asio::getAllProperties(
@@ -1976,9 +1977,9 @@
return;
}
- if (*provState == true)
+ if (*provState)
{
- if (*lockState == true)
+ if (*lockState)
{
oemPFR["ProvisioningStatus"] = "ProvisionedAndLocked";
}
@@ -1993,7 +1994,6 @@
}
});
}
-#endif
/**
* @brief Translate the PowerMode string to enum value
@@ -2773,7 +2773,7 @@
nlohmann::json& ifaceArray = asyncResp->res.jsonValue["Members"];
ifaceArray = nlohmann::json::array();
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
asyncResp->res.jsonValue["Members@odata.count"] = 0;
// Option currently returns no systems. TBD
@@ -2853,7 +2853,7 @@
systemName);
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -2991,7 +2991,7 @@
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3063,14 +3063,15 @@
getPortStatusAndPath(std::span{protocolToDBusForSystems},
std::bind_front(afterPortRequest, asyncResp));
-#ifdef BMCWEB_ENABLE_KVM
- // Fill in GraphicalConsole info
- asyncResp->res.jsonValue["GraphicalConsole"]["ServiceEnabled"] = true;
- asyncResp->res.jsonValue["GraphicalConsole"]["MaxConcurrentSessions"] = 4;
- asyncResp->res.jsonValue["GraphicalConsole"]["ConnectTypesSupported"] =
- nlohmann::json::array_t({"KVMIP"});
-
-#endif // BMCWEB_ENABLE_KVM
+ if constexpr (BMCWEB_KVM)
+ {
+ // Fill in GraphicalConsole info
+ asyncResp->res.jsonValue["GraphicalConsole"]["ServiceEnabled"] = true;
+ asyncResp->res.jsonValue["GraphicalConsole"]["MaxConcurrentSessions"] =
+ 4;
+ asyncResp->res.jsonValue["GraphicalConsole"]["ConnectTypesSupported"] =
+ nlohmann::json::array_t({"KVMIP"});
+ }
getMainChassisId(asyncResp,
[](const std::string& chassisId,
@@ -3097,9 +3098,10 @@
getStopBootOnFault(asyncResp);
getAutomaticRetryPolicy(asyncResp);
getLastResetTime(asyncResp);
-#ifdef BMCWEB_ENABLE_REDFISH_PROVISIONING_FEATURE
- getProvisioningStatus(asyncResp);
-#endif
+ if constexpr (BMCWEB_REDFISH_PROVISIONING_FEATURE)
+ {
+ getProvisioningStatus(asyncResp);
+ }
getTrustedModuleRequiredToBoot(asyncResp);
getPowerMode(asyncResp);
getIdlePowerSaver(asyncResp);
@@ -3114,7 +3116,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
@@ -3363,7 +3365,7 @@
{
return;
}
- if constexpr (bmcwebEnableMultiHost)
+ if constexpr (BMCWEB_EXPERIMENTAL_REDFISH_MULTI_COMPUTER_SYSTEM)
{
// Option currently returns no systems. TBD
messages::resourceNotFound(asyncResp->res, "ComputerSystem",
diff --git a/redfish-core/lib/update_service.hpp b/redfish-core/lib/update_service.hpp
index 0418d26..6895cb4 100644
--- a/redfish-core/lib/update_service.hpp
+++ b/redfish-core/lib/update_service.hpp
@@ -831,7 +831,7 @@
asyncResp->res.jsonValue["FirmwareInventory"]["@odata.id"] =
"/redfish/v1/UpdateService/FirmwareInventory";
// Get the MaxImageSizeBytes
- asyncResp->res.jsonValue["MaxImageSizeBytes"] = bmcwebHttpReqBodyLimitMb *
+ asyncResp->res.jsonValue["MaxImageSizeBytes"] = BMCWEB_HTTP_BODY_LIMIT *
1024 * 1024;
// Update Actions object.
@@ -842,9 +842,10 @@
nlohmann::json::array_t allowed;
-#ifdef BMCWEB_INSECURE_ENABLE_REDFISH_FW_TFTP_UPDATE
- allowed.emplace_back(update_service::TransferProtocolType::TFTP);
-#endif
+ if constexpr (BMCWEB_INSECURE_PUSH_STYLE_NOTIFICATION)
+ {
+ allowed.emplace_back(update_service::TransferProtocolType::TFTP);
+ }
updateSvcSimpleUpdate["TransferProtocol@Redfish.AllowableValues"] =
std::move(allowed);
diff --git a/redfish-core/src/redfish.cpp b/redfish-core/src/redfish.cpp
index 66a43d7..e7a58c1 100644
--- a/redfish-core/src/redfish.cpp
+++ b/redfish-core/src/redfish.cpp
@@ -51,31 +51,34 @@
RedfishService::RedfishService(App& app)
{
requestAccountServiceRoutes(app);
-#ifdef BMCWEB_ENABLE_REDFISH_AGGREGATION
- requestRoutesAggregationService(app);
- requestRoutesAggregationSourceCollection(app);
- requestRoutesAggregationSource(app);
-#endif
+ if constexpr (BMCWEB_REDFISH_AGGREGATION)
+ {
+ requestRoutesAggregationService(app);
+ requestRoutesAggregationSourceCollection(app);
+ requestRoutesAggregationSource(app);
+ }
requestRoutesRoles(app);
requestRoutesRoleCollection(app);
requestRoutesServiceRoot(app);
requestRoutesNetworkProtocol(app);
requestRoutesSession(app);
requestEthernetInterfacesRoutes(app);
-#ifdef BMCWEB_ALLOW_DEPRECATED_POWER_THERMAL
- requestRoutesThermal(app);
- requestRoutesPower(app);
-#endif
-#ifdef BMCWEB_NEW_POWERSUBSYSTEM_THERMALSUBSYSTEM
- requestRoutesEnvironmentMetrics(app);
- requestRoutesPowerSubsystem(app);
- requestRoutesPowerSupply(app);
- requestRoutesPowerSupplyCollection(app);
- requestRoutesThermalMetrics(app);
- requestRoutesThermalSubsystem(app);
- requestRoutesFan(app);
- requestRoutesFanCollection(app);
-#endif
+ if constexpr (BMCWEB_REDFISH_ALLOW_DEPRECATED_POWER_THERMAL)
+ {
+ requestRoutesThermal(app);
+ requestRoutesPower(app);
+ }
+ if constexpr (BMCWEB_REDFISH_NEW_POWERSUBSYSTEM_THERMALSUBSYSTEM)
+ {
+ requestRoutesEnvironmentMetrics(app);
+ requestRoutesPowerSubsystem(app);
+ requestRoutesPowerSupply(app);
+ requestRoutesPowerSupplyCollection(app);
+ requestRoutesThermalMetrics(app);
+ requestRoutesThermalSubsystem(app);
+ requestRoutesFan(app);
+ requestRoutesFanCollection(app);
+ }
requestRoutesManagerCollection(app);
requestRoutesManager(app);
requestRoutesManagerResetAction(app);
@@ -106,47 +109,51 @@
requestRoutesPostCodesEntry(app);
requestRoutesPostCodesEntryCollection(app);
-#ifdef BMCWEB_ENABLE_REDFISH_DUMP_LOG
- requestRoutesSystemDumpService(app);
- requestRoutesSystemDumpEntryCollection(app);
- requestRoutesSystemDumpEntry(app);
- requestRoutesSystemDumpCreate(app);
- requestRoutesSystemDumpClear(app);
+ if constexpr (BMCWEB_REDFISH_DUMP_LOG)
+ {
+ requestRoutesSystemDumpService(app);
+ requestRoutesSystemDumpEntryCollection(app);
+ requestRoutesSystemDumpEntry(app);
+ requestRoutesSystemDumpCreate(app);
+ requestRoutesSystemDumpClear(app);
- requestRoutesBMCDumpService(app);
- requestRoutesBMCDumpEntryCollection(app);
- requestRoutesBMCDumpEntry(app);
- requestRoutesBMCDumpEntryDownload(app);
- requestRoutesBMCDumpCreate(app);
- requestRoutesBMCDumpClear(app);
+ requestRoutesBMCDumpService(app);
+ requestRoutesBMCDumpEntryCollection(app);
+ requestRoutesBMCDumpEntry(app);
+ requestRoutesBMCDumpEntryDownload(app);
+ requestRoutesBMCDumpCreate(app);
+ requestRoutesBMCDumpClear(app);
- requestRoutesFaultLogDumpService(app);
- requestRoutesFaultLogDumpEntryCollection(app);
- requestRoutesFaultLogDumpEntry(app);
- requestRoutesFaultLogDumpClear(app);
-#endif
+ requestRoutesFaultLogDumpService(app);
+ requestRoutesFaultLogDumpEntryCollection(app);
+ requestRoutesFaultLogDumpEntry(app);
+ requestRoutesFaultLogDumpClear(app);
+ }
-#ifndef BMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES
- requestRoutesJournalEventLogEntryCollection(app);
- requestRoutesJournalEventLogEntry(app);
- requestRoutesJournalEventLogClear(app);
-#endif
+ if constexpr (BMCWEB_REDFISH_DBUS_LOG)
+ {
+ requestRoutesJournalEventLogEntryCollection(app);
+ requestRoutesJournalEventLogEntry(app);
+ requestRoutesJournalEventLogClear(app);
+ }
requestRoutesBMCLogServiceCollection(app);
-#ifdef BMCWEB_ENABLE_REDFISH_BMC_JOURNAL
- requestRoutesBMCJournalLogService(app);
- requestRoutesBMCJournalLogEntryCollection(app);
- requestRoutesBMCJournalLogEntry(app);
-#endif
+ if constexpr (BMCWEB_REDFISH_BMC_JOURNAL)
+ {
+ requestRoutesBMCJournalLogService(app);
+ requestRoutesBMCJournalLogEntryCollection(app);
+ requestRoutesBMCJournalLogEntry(app);
+ }
-#ifdef BMCWEB_ENABLE_REDFISH_CPU_LOG
- requestRoutesCrashdumpService(app);
- requestRoutesCrashdumpEntryCollection(app);
- requestRoutesCrashdumpEntry(app);
- requestRoutesCrashdumpFile(app);
- requestRoutesCrashdumpClear(app);
- requestRoutesCrashdumpCollect(app);
-#endif // BMCWEB_ENABLE_REDFISH_CPU_LOG
+ if constexpr (BMCWEB_REDFISH_CPU_LOG)
+ {
+ requestRoutesCrashdumpService(app);
+ requestRoutesCrashdumpEntryCollection(app);
+ requestRoutesCrashdumpEntry(app);
+ requestRoutesCrashdumpFile(app);
+ requestRoutesCrashdumpClear(app);
+ requestRoutesCrashdumpCollect(app);
+ }
requestRoutesProcessorCollection(app);
requestRoutesProcessor(app);
@@ -160,22 +167,25 @@
requestRoutesBiosService(app);
requestRoutesBiosReset(app);
-#ifdef BMCWEB_ENABLE_VM_NBDPROXY
- requestNBDVirtualMediaRoutes(app);
-#endif // BMCWEB_ENABLE_VM_NBDPROXY
+ if constexpr (BMCWEB_VM_NBDPROXY)
+ {
+ requestNBDVirtualMediaRoutes(app);
+ }
-#ifdef BMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES
- requestRoutesDBusLogServiceActionsClear(app);
- requestRoutesDBusEventLogEntryCollection(app);
- requestRoutesDBusEventLogEntry(app);
- requestRoutesDBusEventLogEntryDownload(app);
-#endif
+ if constexpr (BMCWEB_REDFISH_DBUS_LOG)
+ {
+ requestRoutesDBusLogServiceActionsClear(app);
+ requestRoutesDBusEventLogEntryCollection(app);
+ requestRoutesDBusEventLogEntry(app);
+ requestRoutesDBusEventLogEntryDownload(app);
+ }
-#ifdef BMCWEB_ENABLE_REDFISH_HOST_LOGGER
- requestRoutesSystemHostLogger(app);
- requestRoutesSystemHostLoggerCollection(app);
- requestRoutesSystemHostLoggerLogEntry(app);
-#endif
+ if constexpr (BMCWEB_REDFISH_HOST_LOGGER)
+ {
+ requestRoutesSystemHostLogger(app);
+ requestRoutesSystemHostLoggerCollection(app);
+ requestRoutesSystemHostLoggerLogEntry(app);
+ }
requestRoutesMessageRegistryFileCollection(app);
requestRoutesMessageRegistryFile(app);
diff --git a/src/webserver_run.cpp b/src/webserver_run.cpp
index 81a78cc..8088596 100644
--- a/src/webserver_run.cpp
+++ b/src/webserver_run.cpp
@@ -37,64 +37,67 @@
// Static assets need to be initialized before Authorization, because auth
// needs to build the whitelist from the static routes
-#ifdef BMCWEB_ENABLE_STATIC_HOSTING
- crow::webassets::requestRoutes(app);
-#endif
+ if constexpr (BMCWEB_STATIC_HOSTING)
+ {
+ crow::webassets::requestRoutes(app);
+ }
-#ifdef BMCWEB_ENABLE_KVM
- crow::obmc_kvm::requestRoutes(app);
-#endif
+ if constexpr (BMCWEB_KVM)
+ {
+ crow::obmc_kvm::requestRoutes(app);
+ }
-#ifdef BMCWEB_ENABLE_REDFISH
- redfish::RedfishService redfish(app);
+ if constexpr (BMCWEB_REDFISH)
+ {
+ redfish::RedfishService redfish(app);
- // Create EventServiceManager instance and initialize Config
- redfish::EventServiceManager::getInstance(&*io);
+ // Create EventServiceManager instance and initialize Config
+ redfish::EventServiceManager::getInstance(&*io);
-#ifdef BMCWEB_ENABLE_REDFISH_AGGREGATION
- // Create RedfishAggregator instance and initialize Config
- redfish::RedfishAggregator::getInstance(&*io);
-#endif
-#endif
+ if constexpr (BMCWEB_REDFISH_AGGREGATION)
+ {
+ // Create RedfishAggregator instance and initialize Config
+ redfish::RedfishAggregator::getInstance(&*io);
+ }
+ }
-#ifdef BMCWEB_ENABLE_DBUS_REST
- crow::dbus_monitor::requestRoutes(app);
- crow::image_upload::requestRoutes(app);
- crow::openbmc_mapper::requestRoutes(app);
-#endif
+ if constexpr (BMCWEB_REST)
+ {
+ crow::dbus_monitor::requestRoutes(app);
+ crow::image_upload::requestRoutes(app);
+ crow::openbmc_mapper::requestRoutes(app);
+ }
-#ifdef BMCWEB_ENABLE_HOST_SERIAL_WEBSOCKET
- crow::obmc_console::requestRoutes(app);
-#endif
+ if constexpr (BMCWEB_HOST_SERIAL_SOCKET)
+ {
+ crow::obmc_console::requestRoutes(app);
+ }
-#ifdef BMCWEB_ENABLE_VM_WEBSOCKET
crow::obmc_vm::requestRoutes(app);
-#endif
-#ifdef BMCWEB_ENABLE_IBM_MANAGEMENT_CONSOLE
- crow::ibm_mc::requestRoutes(app);
-#endif
+ if constexpr (BMCWEB_IBM_MANAGEMENT_CONSOLE)
+ {
+ crow::ibm_mc::requestRoutes(app);
+ }
-#ifdef BMCWEB_ENABLE_GOOGLE_API
- crow::google_api::requestRoutes(app);
-#endif
+ if constexpr (BMCWEB_GOOGLE_API)
+ {
+ crow::google_api::requestRoutes(app);
+ }
crow::login_routes::requestRoutes(app);
-#ifdef BMCWEB_ENABLE_VM_NBDPROXY
- crow::nbd_proxy::requestRoutes(app);
-#endif
-
-#ifndef BMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES
- int rc = redfish::EventServiceManager::startEventLogMonitor(*io);
- if (rc != 0)
+ if constexpr (BMCWEB_REDFISH_DBUS_LOG)
{
- BMCWEB_LOG_ERROR("Redfish event handler setup failed...");
- return rc;
+ int rc = redfish::EventServiceManager::startEventLogMonitor(*io);
+ if (rc != 0)
+ {
+ BMCWEB_LOG_ERROR("Redfish event handler setup failed...");
+ return rc;
+ }
}
-#endif
- if constexpr (bmcwebEnableTLS)
+ if constexpr (!BMCWEB_INSECURE_DISABLE_SSL)
{
BMCWEB_LOG_INFO("Start Hostname Monitor Service...");
crow::hostname_monitor::registerHostnameSignal();
diff --git a/test/redfish-core/include/utils/query_param_test.cpp b/test/redfish-core/include/utils/query_param_test.cpp
index 46cc64d..b466f81 100644
--- a/test/redfish-core/include/utils/query_param_test.cpp
+++ b/test/redfish-core/include/utils/query_param_test.cpp
@@ -546,7 +546,7 @@
crow::Response res;
std::optional<Query> query = parseParameters(ret->params(), res);
- if constexpr (bmcwebInsecureEnableQueryParams)
+ if constexpr (BMCWEB_INSECURE_ENABLE_REDFISH_QUERY)
{
ASSERT_TRUE(query);
if (!query)
diff --git a/test/redfish-core/lib/service_root_test.cpp b/test/redfish-core/lib/service_root_test.cpp
index 3d47221..01e48a1 100644
--- a/test/redfish-core/lib/service_root_test.cpp
+++ b/test/redfish-core/lib/service_root_test.cpp
@@ -84,14 +84,14 @@
EXPECT_EQ(json["ProtocolFeaturesSupported"].size(), 6);
EXPECT_FALSE(json["ProtocolFeaturesSupported"]["ExcerptQuery"]);
EXPECT_EQ(json["ProtocolFeaturesSupported"]["ExpandQuery"]["ExpandAll"],
- bmcwebInsecureEnableQueryParams);
+ BMCWEB_INSECURE_ENABLE_REDFISH_QUERY);
EXPECT_EQ(json["ProtocolFeaturesSupported"]["ExpandQuery"]["Levels"],
- bmcwebInsecureEnableQueryParams);
+ BMCWEB_INSECURE_ENABLE_REDFISH_QUERY);
EXPECT_EQ(json["ProtocolFeaturesSupported"]["ExpandQuery"]["Links"],
- bmcwebInsecureEnableQueryParams);
+ BMCWEB_INSECURE_ENABLE_REDFISH_QUERY);
EXPECT_EQ(json["ProtocolFeaturesSupported"]["ExpandQuery"]["NoLinks"],
- bmcwebInsecureEnableQueryParams);
- if (bmcwebInsecureEnableQueryParams)
+ BMCWEB_INSECURE_ENABLE_REDFISH_QUERY);
+ if constexpr (BMCWEB_INSECURE_ENABLE_REDFISH_QUERY)
{
EXPECT_EQ(json["ProtocolFeaturesSupported"]["ExpandQuery"].size(), 5);
EXPECT_EQ(json["ProtocolFeaturesSupported"]["ExpandQuery"]["MaxLevels"],