summaryrefslogtreecommitdiff
path: root/redfish-core/include
diff options
context:
space:
mode:
authorEd Tanous <ed.tanous@intel.com>2018-09-05 18:30:59 +0300
committerEd Tanous <ed.tanous@intel.com>2018-09-05 18:44:12 +0300
commit1abe55ef9844afcddcab9d862ae06118f3a2390c (patch)
treed0b5fcfd0b1cd679a8995af3eb0b6d31b368380e /redfish-core/include
parenta38b0b206300c792979b900f506b85e535f5708a (diff)
downloadbmcweb-1abe55ef9844afcddcab9d862ae06118f3a2390c.tar.xz
Move to clang-format-6.0
This commit moves the codebase to the lastest clang-format file from upstream, as well as clang-format-6.0. Change-Id: Ice8313468097c0c42317fbb9e10ddf036e8cff4c Signed-off-by: Ed Tanous <ed.tanous@intel.com>
Diffstat (limited to 'redfish-core/include')
-rw-r--r--redfish-core/include/error_messages.hpp10
-rw-r--r--redfish-core/include/node.hpp277
-rw-r--r--redfish-core/include/privileges.hpp261
-rw-r--r--redfish-core/include/redfish.hpp79
-rw-r--r--redfish-core/include/utils/json_utils.hpp30
5 files changed, 364 insertions, 293 deletions
diff --git a/redfish-core/include/error_messages.hpp b/redfish-core/include/error_messages.hpp
index 4865516b7a..085b76f6bd 100644
--- a/redfish-core/include/error_messages.hpp
+++ b/redfish-core/include/error_messages.hpp
@@ -24,9 +24,11 @@
#pragma once
#include <nlohmann/json.hpp>
-namespace redfish {
+namespace redfish
+{
-namespace messages {
+namespace messages
+{
constexpr const char* messageVersionPrefix = "Base.1.2.0.";
constexpr const char* messageAnnotation = "@Message.ExtendedInfo";
@@ -636,6 +638,6 @@ nlohmann::json queryParameterOutOfRange(const std::string& arg1,
* AUTOGENERATED FUNCTIONS END *
*********************************/
-} // namespace messages
+} // namespace messages
-} // namespace redfish
+} // namespace redfish
diff --git a/redfish-core/include/node.hpp b/redfish-core/include/node.hpp
index 20d295197e..8dbb0c2d70 100644
--- a/redfish-core/include/node.hpp
+++ b/redfish-core/include/node.hpp
@@ -18,161 +18,190 @@
#include "privileges.hpp"
#include "token_authorization_middleware.hpp"
#include "webserver_common.hpp"
+
#include "crow.h"
-namespace redfish {
+namespace redfish
+{
/**
* AsyncResp
* Gathers data needed for response processing after async calls are done
*/
-class AsyncResp {
- public:
- AsyncResp(crow::Response& response) : res(response) {}
+class AsyncResp
+{
+ public:
+ AsyncResp(crow::Response& response) : res(response)
+ {
+ }
- ~AsyncResp() { res.end(); }
+ ~AsyncResp()
+ {
+ res.end();
+ }
- crow::Response& res;
+ crow::Response& res;
};
/**
* @brief Abstract class used for implementing Redfish nodes.
*
*/
-class Node {
- public:
- template <typename... Params>
- Node(CrowApp& app, std::string&& entityUrl, Params... params) {
- app.routeDynamic(entityUrl.c_str())
- .methods("GET"_method, "PATCH"_method, "POST"_method,
- "DELETE"_method)([&](const crow::Request& req,
- crow::Response& res, Params... params) {
- std::vector<std::string> paramVec = {params...};
- dispatchRequest(app, req, res, paramVec);
- });
- }
-
- virtual ~Node() = default;
-
- const std::string* getUrl() const {
- auto odataId = json.find("@odata.id");
- if (odataId == json.end()) {
- return nullptr;
+class Node
+{
+ public:
+ template <typename... Params>
+ Node(CrowApp& app, std::string&& entityUrl, Params... params)
+ {
+ app.routeDynamic(entityUrl.c_str())
+ .methods("GET"_method, "PATCH"_method, "POST"_method,
+ "DELETE"_method)([&](const crow::Request& req,
+ crow::Response& res,
+ Params... params) {
+ std::vector<std::string> paramVec = {params...};
+ dispatchRequest(app, req, res, paramVec);
+ });
}
- return odataId->get_ptr<const std::string*>();
- }
-
- /**
- * @brief Inserts subroute fields into for the node's json in the form:
- * "subroute_name" : { "odata.id": "node_url/subroute_name/" }
- * Excludes metadata urls starting with "$" and child urls having
- * more than one level.
- *
- * @return None
- */
- void getSubRoutes(const std::vector<std::unique_ptr<Node>>& allNodes) {
- const std::string* url = getUrl();
- if (url == nullptr) {
- // BMCWEB_LOG_CRITICAL << "Unable to get url for route";
- return;
- }
+ virtual ~Node() = default;
- for (const auto& node : allNodes) {
- const std::string* route = node->getUrl();
- if (route == nullptr) {
- // BMCWEB_LOG_CRITICAL << "Unable to get url for route";
- continue;
- }
- if (boost::starts_with(*route, *url)) {
- std::string subRoute = route->substr(url->size());
- if (subRoute.empty()) {
- continue;
+ const std::string* getUrl() const
+ {
+ auto odataId = json.find("@odata.id");
+ if (odataId == json.end())
+ {
+ return nullptr;
}
- if (boost::starts_with(subRoute, "/")) {
- subRoute.erase(0, 1);
- }
+ return odataId->get_ptr<const std::string*>();
+ }
- if (boost::ends_with(subRoute, "/")) {
- subRoute.pop_back();
+ /**
+ * @brief Inserts subroute fields into for the node's json in the form:
+ * "subroute_name" : { "odata.id": "node_url/subroute_name/" }
+ * Excludes metadata urls starting with "$" and child urls having
+ * more than one level.
+ *
+ * @return None
+ */
+ void getSubRoutes(const std::vector<std::unique_ptr<Node>>& allNodes)
+ {
+ const std::string* url = getUrl();
+ if (url == nullptr)
+ {
+ // BMCWEB_LOG_CRITICAL << "Unable to get url for route";
+ return;
}
- if (!boost::starts_with(subRoute, "$") &&
- subRoute.find('/') == std::string::npos) {
- json[subRoute] = nlohmann::json{{"@odata.id", *route}};
+ for (const auto& node : allNodes)
+ {
+ const std::string* route = node->getUrl();
+ if (route == nullptr)
+ {
+ // BMCWEB_LOG_CRITICAL << "Unable to get url for route";
+ continue;
+ }
+ if (boost::starts_with(*route, *url))
+ {
+ std::string subRoute = route->substr(url->size());
+ if (subRoute.empty())
+ {
+ continue;
+ }
+
+ if (boost::starts_with(subRoute, "/"))
+ {
+ subRoute.erase(0, 1);
+ }
+
+ if (boost::ends_with(subRoute, "/"))
+ {
+ subRoute.pop_back();
+ }
+
+ if (!boost::starts_with(subRoute, "$") &&
+ subRoute.find('/') == std::string::npos)
+ {
+ json[subRoute] = nlohmann::json{{"@odata.id", *route}};
+ }
+ }
}
- }
- }
- }
-
- OperationMap entityPrivileges;
-
- protected:
- // Node is designed to be an abstract class, so doGet is pure virtual
- virtual void doGet(crow::Response& res, const crow::Request& req,
- const std::vector<std::string>& params) {
- res.result(boost::beast::http::status::method_not_allowed);
- res.end();
- }
-
- virtual void doPatch(crow::Response& res, const crow::Request& req,
- const std::vector<std::string>& params) {
- res.result(boost::beast::http::status::method_not_allowed);
- res.end();
- }
-
- virtual void doPost(crow::Response& res, const crow::Request& req,
- const std::vector<std::string>& params) {
- res.result(boost::beast::http::status::method_not_allowed);
- res.end();
- }
-
- virtual void doDelete(crow::Response& res, const crow::Request& req,
- const std::vector<std::string>& params) {
- res.result(boost::beast::http::status::method_not_allowed);
- res.end();
- }
-
- nlohmann::json json;
-
- private:
- void dispatchRequest(CrowApp& app, const crow::Request& req,
- crow::Response& res,
- const std::vector<std::string>& params) {
- auto ctx =
- app.template getContext<crow::token_authorization::Middleware>(req);
-
- if (!isMethodAllowedForUser(req.method(), entityPrivileges,
- ctx.session->username)) {
- res.result(boost::beast::http::status::method_not_allowed);
- res.end();
- return;
}
- switch (req.method()) {
- case "GET"_method:
- doGet(res, req, params);
- break;
+ OperationMap entityPrivileges;
- case "PATCH"_method:
- doPatch(res, req, params);
- break;
+ protected:
+ // Node is designed to be an abstract class, so doGet is pure virtual
+ virtual void doGet(crow::Response& res, const crow::Request& req,
+ const std::vector<std::string>& params)
+ {
+ res.result(boost::beast::http::status::method_not_allowed);
+ res.end();
+ }
- case "POST"_method:
- doPost(res, req, params);
- break;
+ virtual void doPatch(crow::Response& res, const crow::Request& req,
+ const std::vector<std::string>& params)
+ {
+ res.result(boost::beast::http::status::method_not_allowed);
+ res.end();
+ }
- case "DELETE"_method:
- doDelete(res, req, params);
- break;
+ virtual void doPost(crow::Response& res, const crow::Request& req,
+ const std::vector<std::string>& params)
+ {
+ res.result(boost::beast::http::status::method_not_allowed);
+ res.end();
+ }
- default:
- res.result(boost::beast::http::status::not_found);
+ virtual void doDelete(crow::Response& res, const crow::Request& req,
+ const std::vector<std::string>& params)
+ {
+ res.result(boost::beast::http::status::method_not_allowed);
res.end();
}
- return;
- }
+
+ nlohmann::json json;
+
+ private:
+ void dispatchRequest(CrowApp& app, const crow::Request& req,
+ crow::Response& res,
+ const std::vector<std::string>& params)
+ {
+ auto ctx =
+ app.template getContext<crow::token_authorization::Middleware>(req);
+
+ if (!isMethodAllowedForUser(req.method(), entityPrivileges,
+ ctx.session->username))
+ {
+ res.result(boost::beast::http::status::method_not_allowed);
+ res.end();
+ return;
+ }
+
+ switch (req.method())
+ {
+ case "GET"_method:
+ doGet(res, req, params);
+ break;
+
+ case "PATCH"_method:
+ doPatch(res, req, params);
+ break;
+
+ case "POST"_method:
+ doPost(res, req, params);
+ break;
+
+ case "DELETE"_method:
+ doDelete(res, req, params);
+ break;
+
+ default:
+ res.result(boost::beast::http::status::not_found);
+ res.end();
+ }
+ return;
+ }
};
-} // namespace redfish
+} // namespace redfish
diff --git a/redfish-core/include/privileges.hpp b/redfish-core/include/privileges.hpp
index 437bb15e04..0f6b903793 100644
--- a/redfish-core/include/privileges.hpp
+++ b/redfish-core/include/privileges.hpp
@@ -16,15 +16,21 @@
#pragma once
#include <bitset>
+#include <boost/container/flat_map.hpp>
+#include <boost/optional.hpp>
#include <cstdint>
#include <vector>
+
#include "crow.h"
-#include <boost/container/flat_map.hpp>
-#include <boost/optional.hpp>
-namespace redfish {
+namespace redfish
+{
-enum class PrivilegeType { BASE, OEM };
+enum class PrivilegeType
+{
+ BASE,
+ OEM
+};
/** @brief A fixed array of compile time privileges */
constexpr std::array<const char*, 5> basePrivileges{
@@ -56,105 +62,118 @@ static const std::vector<std::string> privilegeNames{basePrivileges.begin(),
* (user domain) and false otherwise.
*
*/
-class Privileges {
- public:
- /**
- * @brief Constructs object without any privileges active
- *
- */
- Privileges() = default;
-
- /**
- * @brief Constructs object with given privileges active
- *
- * @param[in] privilegeList List of privileges to be activated
- *
- */
- Privileges(std::initializer_list<const char*> privilegeList) {
- for (const char* privilege : privilegeList) {
- if (!setSinglePrivilege(privilege)) {
- BMCWEB_LOG_CRITICAL << "Unable to set privilege " << privilege
- << "in constructor";
- }
+class Privileges
+{
+ public:
+ /**
+ * @brief Constructs object without any privileges active
+ *
+ */
+ Privileges() = default;
+
+ /**
+ * @brief Constructs object with given privileges active
+ *
+ * @param[in] privilegeList List of privileges to be activated
+ *
+ */
+ Privileges(std::initializer_list<const char*> privilegeList)
+ {
+ for (const char* privilege : privilegeList)
+ {
+ if (!setSinglePrivilege(privilege))
+ {
+ BMCWEB_LOG_CRITICAL << "Unable to set privilege " << privilege
+ << "in constructor";
+ }
+ }
}
- }
-
- /**
- * @brief Sets given privilege in the bitset
- *
- * @param[in] privilege Privilege to be set
- *
- * @return None
- *
- */
- bool setSinglePrivilege(const char* privilege) {
- for (int searchIndex = 0; searchIndex < privilegeNames.size();
- searchIndex++) {
- if (privilege == privilegeNames[searchIndex]) {
- privilegeBitset.set(searchIndex);
- return true;
- }
+
+ /**
+ * @brief Sets given privilege in the bitset
+ *
+ * @param[in] privilege Privilege to be set
+ *
+ * @return None
+ *
+ */
+ bool setSinglePrivilege(const char* privilege)
+ {
+ for (int searchIndex = 0; searchIndex < privilegeNames.size();
+ searchIndex++)
+ {
+ if (privilege == privilegeNames[searchIndex])
+ {
+ privilegeBitset.set(searchIndex);
+ return true;
+ }
+ }
+
+ return false;
}
- return false;
- }
-
- /**
- * @brief Sets given privilege in the bitset
- *
- * @param[in] privilege Privilege to be set
- *
- * @return None
- *
- */
- bool setSinglePrivilege(const std::string& privilege) {
- return setSinglePrivilege(privilege.c_str());
- }
-
- /**
- * @brief Retrieves names of all active privileges for a given type
- *
- * @param[in] type Base or OEM
- *
- * @return Vector of active privileges. Pointers are valid until
- * the setSinglePrivilege is called, or the Privilege structure is destroyed
- *
- */
- std::vector<const std::string*> getActivePrivilegeNames(
- const PrivilegeType type) const {
- std::vector<const std::string*> activePrivileges;
-
- int searchIndex = 0;
- int endIndex = basePrivilegeCount;
- if (type == PrivilegeType::OEM) {
- searchIndex = basePrivilegeCount - 1;
- endIndex = privilegeNames.size();
+ /**
+ * @brief Sets given privilege in the bitset
+ *
+ * @param[in] privilege Privilege to be set
+ *
+ * @return None
+ *
+ */
+ bool setSinglePrivilege(const std::string& privilege)
+ {
+ return setSinglePrivilege(privilege.c_str());
}
- for (; searchIndex < endIndex; searchIndex++) {
- if (privilegeBitset.test(searchIndex)) {
- activePrivileges.emplace_back(&privilegeNames[searchIndex]);
- }
+ /**
+ * @brief Retrieves names of all active privileges for a given type
+ *
+ * @param[in] type Base or OEM
+ *
+ * @return Vector of active privileges. Pointers are valid until
+ * the setSinglePrivilege is called, or the Privilege structure is destroyed
+ *
+ */
+ std::vector<const std::string*>
+ getActivePrivilegeNames(const PrivilegeType type) const
+ {
+ std::vector<const std::string*> activePrivileges;
+
+ int searchIndex = 0;
+ int endIndex = basePrivilegeCount;
+ if (type == PrivilegeType::OEM)
+ {
+ searchIndex = basePrivilegeCount - 1;
+ endIndex = privilegeNames.size();
+ }
+
+ for (; searchIndex < endIndex; searchIndex++)
+ {
+ if (privilegeBitset.test(searchIndex))
+ {
+ activePrivileges.emplace_back(&privilegeNames[searchIndex]);
+ }
+ }
+
+ return activePrivileges;
}
- return activePrivileges;
- }
-
- /**
- * @brief Determines if this Privilege set is a superset of the given
- * privilege set
- *
- * @param[in] privilege Privilege to be checked
- *
- * @return None
- *
- */
- bool isSupersetOf(const Privileges& p) const {
- return (privilegeBitset & p.privilegeBitset) == p.privilegeBitset;
- }
-
- private:
- std::bitset<maxPrivilegeCount> privilegeBitset = 0;
+ /**
+ * @brief Determines if this Privilege set is a superset of the given
+ * privilege set
+ *
+ * @param[in] privilege Privilege to be checked
+ *
+ * @return None
+ *
+ */
+ bool isSupersetOf(const Privileges& p) const
+ {
+ return (privilegeBitset & p.privilegeBitset) == p.privilegeBitset;
+ }
+
+ private:
+ std::bitset<maxPrivilegeCount> privilegeBitset = 0;
};
using OperationMap = boost::container::flat_map<boost::beast::http::verb,
@@ -171,23 +190,28 @@ using OperationMap = boost::container::flat_map<boost::beast::http::verb,
*/
inline bool isMethodAllowedWithPrivileges(const boost::beast::http::verb method,
const OperationMap& operationMap,
- const Privileges& userPrivileges) {
- const auto& it = operationMap.find(method);
- if (it == operationMap.end()) {
- return false;
- }
+ const Privileges& userPrivileges)
+{
+ const auto& it = operationMap.find(method);
+ if (it == operationMap.end())
+ {
+ return false;
+ }
- // If there are no privileges assigned, assume no privileges required
- if (it->second.empty()) {
- return true;
- }
+ // If there are no privileges assigned, assume no privileges required
+ if (it->second.empty())
+ {
+ return true;
+ }
- for (auto& requiredPrivileges : it->second) {
- if (userPrivileges.isSupersetOf(requiredPrivileges)) {
- return true;
+ for (auto& requiredPrivileges : it->second)
+ {
+ if (userPrivileges.isSupersetOf(requiredPrivileges))
+ {
+ return true;
+ }
}
- }
- return false;
+ return false;
}
/**
@@ -201,13 +225,14 @@ inline bool isMethodAllowedWithPrivileges(const boost::beast::http::verb method,
*/
inline bool isMethodAllowedForUser(const boost::beast::http::verb method,
const OperationMap& operationMap,
- const std::string& user) {
- // TODO: load user privileges from configuration as soon as its available
- // now we are granting all privileges to everyone.
- Privileges userPrivileges{"Login", "ConfigureManager", "ConfigureSelf",
- "ConfigureUsers", "ConfigureComponents"};
-
- return isMethodAllowedWithPrivileges(method, operationMap, userPrivileges);
+ const std::string& user)
+{
+ // TODO: load user privileges from configuration as soon as its available
+ // now we are granting all privileges to everyone.
+ Privileges userPrivileges{"Login", "ConfigureManager", "ConfigureSelf",
+ "ConfigureUsers", "ConfigureComponents"};
+
+ return isMethodAllowedWithPrivileges(method, operationMap, userPrivileges);
}
-} // namespace redfish
+} // namespace redfish
diff --git a/redfish-core/include/redfish.hpp b/redfish-core/include/redfish.hpp
index ab60abb90f..7f41b6339f 100644
--- a/redfish-core/include/redfish.hpp
+++ b/redfish-core/include/redfish.hpp
@@ -28,48 +28,53 @@
#include "../lib/update_service.hpp"
#include "webserver_common.hpp"
-namespace redfish {
+namespace redfish
+{
/*
* @brief Top level class installing and providing Redfish services
*/
-class RedfishService {
- public:
- /*
- * @brief Redfish service constructor
- *
- * Loads Redfish configuration and installs schema resources
- *
- * @param[in] app Crow app on which Redfish will initialize
- */
- RedfishService(CrowApp& app) {
- nodes.emplace_back(std::make_unique<AccountService>(app));
- nodes.emplace_back(std::make_unique<SessionCollection>(app));
- nodes.emplace_back(std::make_unique<Roles>(app));
- nodes.emplace_back(std::make_unique<RoleCollection>(app));
- nodes.emplace_back(std::make_unique<ServiceRoot>(app));
- nodes.emplace_back(std::make_unique<NetworkProtocol>(app));
- nodes.emplace_back(std::make_unique<SessionService>(app));
- nodes.emplace_back(std::make_unique<EthernetCollection>(app));
- nodes.emplace_back(std::make_unique<EthernetInterface>(app));
- nodes.emplace_back(std::make_unique<Thermal>(app));
- nodes.emplace_back(std::make_unique<ManagerCollection>(app));
- nodes.emplace_back(std::make_unique<Manager>(app));
- nodes.emplace_back(std::make_unique<ChassisCollection>(app));
- nodes.emplace_back(std::make_unique<Chassis>(app));
- nodes.emplace_back(std::make_unique<UpdateService>(app));
- nodes.emplace_back(std::make_unique<SoftwareInventoryCollection>(app));
- nodes.emplace_back(std::make_unique<SoftwareInventory>(app));
- nodes.emplace_back(std::make_unique<VlanNetworkInterfaceCollection>(app));
- nodes.emplace_back(std::make_unique<SystemsCollection>(app));
- nodes.emplace_back(std::make_unique<Systems>(app));
+class RedfishService
+{
+ public:
+ /*
+ * @brief Redfish service constructor
+ *
+ * Loads Redfish configuration and installs schema resources
+ *
+ * @param[in] app Crow app on which Redfish will initialize
+ */
+ RedfishService(CrowApp& app)
+ {
+ nodes.emplace_back(std::make_unique<AccountService>(app));
+ nodes.emplace_back(std::make_unique<SessionCollection>(app));
+ nodes.emplace_back(std::make_unique<Roles>(app));
+ nodes.emplace_back(std::make_unique<RoleCollection>(app));
+ nodes.emplace_back(std::make_unique<ServiceRoot>(app));
+ nodes.emplace_back(std::make_unique<NetworkProtocol>(app));
+ nodes.emplace_back(std::make_unique<SessionService>(app));
+ nodes.emplace_back(std::make_unique<EthernetCollection>(app));
+ nodes.emplace_back(std::make_unique<EthernetInterface>(app));
+ nodes.emplace_back(std::make_unique<Thermal>(app));
+ nodes.emplace_back(std::make_unique<ManagerCollection>(app));
+ nodes.emplace_back(std::make_unique<Manager>(app));
+ nodes.emplace_back(std::make_unique<ChassisCollection>(app));
+ nodes.emplace_back(std::make_unique<Chassis>(app));
+ nodes.emplace_back(std::make_unique<UpdateService>(app));
+ nodes.emplace_back(std::make_unique<SoftwareInventoryCollection>(app));
+ nodes.emplace_back(std::make_unique<SoftwareInventory>(app));
+ nodes.emplace_back(
+ std::make_unique<VlanNetworkInterfaceCollection>(app));
+ nodes.emplace_back(std::make_unique<SystemsCollection>(app));
+ nodes.emplace_back(std::make_unique<Systems>(app));
- for (auto& node : nodes) {
- node->getSubRoutes(nodes);
+ for (auto& node : nodes)
+ {
+ node->getSubRoutes(nodes);
+ }
}
- }
- private:
- std::vector<std::unique_ptr<Node>> nodes;
+ private:
+ std::vector<std::unique_ptr<Node>> nodes;
};
-} // namespace redfish
+} // namespace redfish
diff --git a/redfish-core/include/utils/json_utils.hpp b/redfish-core/include/utils/json_utils.hpp
index 25ac95417d..bde81ce72d 100644
--- a/redfish-core/include/utils/json_utils.hpp
+++ b/redfish-core/include/utils/json_utils.hpp
@@ -14,26 +14,36 @@
// limitations under the License.
*/
#pragma once
-#include <nlohmann/json.hpp>
#include <crow/http_request.h>
#include <crow/http_response.h>
-namespace redfish {
+#include <nlohmann/json.hpp>
+
+namespace redfish
+{
-namespace json_util {
+namespace json_util
+{
/**
* @brief Defines JSON utils operation status
*/
-enum class Result { SUCCESS, NOT_EXIST, WRONG_TYPE, NULL_POINTER };
+enum class Result
+{
+ SUCCESS,
+ NOT_EXIST,
+ WRONG_TYPE,
+ NULL_POINTER
+};
/**
* @brief Describes JSON utils messages requirement
*/
-enum class MessageSetting {
- NONE = 0x0, ///< No messages will be added
- MISSING = 0x1, ///< PropertyMissing message will be added
- TYPE_ERROR = 0x2 ///< PropertyValueTypeError message will be added
+enum class MessageSetting
+{
+ NONE = 0x0, ///< No messages will be added
+ MISSING = 0x1, ///< PropertyMissing message will be added
+ TYPE_ERROR = 0x2 ///< PropertyValueTypeError message will be added
};
/**
@@ -287,6 +297,6 @@ Result getDouble(const char* fieldName, const nlohmann::json& json,
bool processJsonFromRequest(crow::Response& res, const crow::Request& req,
nlohmann::json& reqJson);
-} // namespace json_util
+} // namespace json_util
-} // namespace redfish
+} // namespace redfish