blob: ca640749edfccceaaf24ce9fe6919031e19199f4 [file] [log] [blame]
Borawski.Lukaszb6df6dc2018-01-24 10:20:45 +01001/*
Ed Tanous6be832e2024-09-10 11:44:48 -07002Copyright (c) 2018 Intel Corporation
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
Borawski.Lukaszb6df6dc2018-01-24 10:20:45 +010015*/
16#pragma once
17
Ed Tanous3ccb3ad2023-01-13 17:40:03 -080018#include "bmcweb_config.h"
Ed Tanousf4c99e72021-10-04 17:02:43 -070019
Ed Tanous3ccb3ad2023-01-13 17:40:03 -080020#include "app.hpp"
21#include "async_resp.hpp"
22#include "http_request.hpp"
23#include "persistent_data.hpp"
24#include "query.hpp"
25#include "registries/privilege_registry.hpp"
26#include "utils/systemd_utils.hpp"
27
Nan Zhou96299072022-03-23 09:13:46 -070028#include <nlohmann/json.hpp>
Borawski.Lukaszb6df6dc2018-01-24 10:20:45 +010029
Ed Tanous1abe55e2018-09-05 08:30:59 -070030namespace redfish
31{
Ed Tanous3ebd75f2018-03-05 18:20:01 -080032
John Edward Broadbent83388912021-06-29 10:46:46 -070033inline void
Ed Tanous5b224922022-06-22 19:00:59 -070034 handleServiceRootHead(App& app, const crow::Request& req,
35 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
36{
37 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
38 {
39 return;
40 }
41
42 asyncResp->res.addHeader(
43 boost::beast::http::field::link,
44 "</redfish/v1/JsonSchemas/ServiceRoot/ServiceRoot.json>; rel=describedby");
45}
46
47inline void handleServiceRootGetImpl(
48 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
John Edward Broadbent83388912021-06-29 10:46:46 -070049{
Ed Tanous01a89a12022-08-05 09:18:54 -070050 asyncResp->res.addHeader(
51 boost::beast::http::field::link,
52 "</redfish/v1/JsonSchemas/ServiceRoot/ServiceRoot.json>; rel=describedby");
53
John Edward Broadbent83388912021-06-29 10:46:46 -070054 std::string uuid = persistent_data::getConfig().systemUuid;
Shantappa Teekappanavar9c929be2021-12-16 19:02:52 -060055 asyncResp->res.jsonValue["@odata.type"] =
Ed Tanouse68d1be2023-01-27 10:42:32 -080056 "#ServiceRoot.v1_15_0.ServiceRoot";
John Edward Broadbent83388912021-06-29 10:46:46 -070057 asyncResp->res.jsonValue["@odata.id"] = "/redfish/v1";
58 asyncResp->res.jsonValue["Id"] = "RootService";
59 asyncResp->res.jsonValue["Name"] = "Root Service";
Ed Tanousc16e2922022-07-15 12:46:02 -070060 asyncResp->res.jsonValue["RedfishVersion"] = "1.17.0";
Ed Tanous14766872022-03-15 10:44:42 -070061 asyncResp->res.jsonValue["Links"]["Sessions"]["@odata.id"] =
62 "/redfish/v1/SessionService/Sessions";
63 asyncResp->res.jsonValue["AccountService"]["@odata.id"] =
64 "/redfish/v1/AccountService";
Ed Tanous25b54db2024-04-17 15:40:31 -070065 if constexpr (BMCWEB_REDFISH_AGGREGATION)
66 {
67 asyncResp->res.jsonValue["AggregationService"]["@odata.id"] =
68 "/redfish/v1/AggregationService";
69 }
Ed Tanous14766872022-03-15 10:44:42 -070070 asyncResp->res.jsonValue["Chassis"]["@odata.id"] = "/redfish/v1/Chassis";
71 asyncResp->res.jsonValue["JsonSchemas"]["@odata.id"] =
72 "/redfish/v1/JsonSchemas";
73 asyncResp->res.jsonValue["Managers"]["@odata.id"] = "/redfish/v1/Managers";
74 asyncResp->res.jsonValue["SessionService"]["@odata.id"] =
75 "/redfish/v1/SessionService";
76 asyncResp->res.jsonValue["Systems"]["@odata.id"] = "/redfish/v1/Systems";
77 asyncResp->res.jsonValue["Registries"]["@odata.id"] =
78 "/redfish/v1/Registries";
79 asyncResp->res.jsonValue["UpdateService"]["@odata.id"] =
80 "/redfish/v1/UpdateService";
John Edward Broadbent83388912021-06-29 10:46:46 -070081 asyncResp->res.jsonValue["UUID"] = uuid;
Ed Tanous14766872022-03-15 10:44:42 -070082 asyncResp->res.jsonValue["CertificateService"]["@odata.id"] =
83 "/redfish/v1/CertificateService";
84 asyncResp->res.jsonValue["Tasks"]["@odata.id"] = "/redfish/v1/TaskService";
85 asyncResp->res.jsonValue["EventService"]["@odata.id"] =
86 "/redfish/v1/EventService";
87 asyncResp->res.jsonValue["TelemetryService"]["@odata.id"] =
88 "/redfish/v1/TelemetryService";
89 asyncResp->res.jsonValue["Cables"]["@odata.id"] = "/redfish/v1/Cables";
Nan Zhou96299072022-03-23 09:13:46 -070090
Ed Tanouse68d1be2023-01-27 10:42:32 -080091 asyncResp->res.jsonValue["Links"]["ManagerProvidingService"]["@odata.id"] =
Ed Tanous253f11b2024-05-16 09:38:31 -070092 boost::urls::format("/redfish/v1/Managers/{}",
93 BMCWEB_REDFISH_MANAGER_URI_NAME);
Ed Tanouse68d1be2023-01-27 10:42:32 -080094
Nan Zhou96299072022-03-23 09:13:46 -070095 nlohmann::json& protocolFeatures =
96 asyncResp->res.jsonValue["ProtocolFeaturesSupported"];
97 protocolFeatures["ExcerptQuery"] = false;
Ed Tanous7cf436c2022-03-22 23:53:51 -070098
99 protocolFeatures["ExpandQuery"]["ExpandAll"] =
Ed Tanous25b54db2024-04-17 15:40:31 -0700100 BMCWEB_INSECURE_ENABLE_REDFISH_QUERY;
Ed Tanous7cf436c2022-03-22 23:53:51 -0700101 // This is the maximum level defined in ServiceRoot.v1_13_0.json
Ed Tanous25b54db2024-04-17 15:40:31 -0700102 if constexpr (BMCWEB_INSECURE_ENABLE_REDFISH_QUERY)
Ed Tanous7cf436c2022-03-22 23:53:51 -0700103 {
104 protocolFeatures["ExpandQuery"]["MaxLevels"] = 6;
105 }
Ed Tanous25b54db2024-04-17 15:40:31 -0700106 protocolFeatures["ExpandQuery"]["Levels"] =
107 BMCWEB_INSECURE_ENABLE_REDFISH_QUERY;
108 protocolFeatures["ExpandQuery"]["Links"] =
109 BMCWEB_INSECURE_ENABLE_REDFISH_QUERY;
Ed Tanous7cf436c2022-03-22 23:53:51 -0700110 protocolFeatures["ExpandQuery"]["NoLinks"] =
Ed Tanous25b54db2024-04-17 15:40:31 -0700111 BMCWEB_INSECURE_ENABLE_REDFISH_QUERY;
Ed Tanous25991f72024-06-13 18:10:25 -0700112 protocolFeatures["FilterQuery"] = BMCWEB_INSECURE_ENABLE_REDFISH_QUERY;
Nan Zhou0553fb52022-08-05 17:23:06 +0000113 protocolFeatures["OnlyMemberQuery"] = true;
Nan Zhou07ffa4e2022-08-09 22:46:25 +0000114 protocolFeatures["SelectQuery"] = true;
Nan Zhou96299072022-03-23 09:13:46 -0700115 protocolFeatures["DeepOperations"]["DeepPOST"] = false;
116 protocolFeatures["DeepOperations"]["DeepPATCH"] = false;
John Edward Broadbent83388912021-06-29 10:46:46 -0700117}
Ed Tanous5b224922022-06-22 19:00:59 -0700118inline void
119 handleServiceRootGet(App& app, const crow::Request& req,
120 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
121{
Ed Tanous01a89a12022-08-05 09:18:54 -0700122 if (!redfish::setUpRedfishRoute(app, req, asyncResp))
123 {
124 return;
125 }
126
Ed Tanous5b224922022-06-22 19:00:59 -0700127 handleServiceRootGetImpl(asyncResp);
128}
John Edward Broadbent83388912021-06-29 10:46:46 -0700129
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700130inline void requestRoutesServiceRoot(App& app)
Ed Tanous1abe55e2018-09-05 08:30:59 -0700131{
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700132 BMCWEB_ROUTE(app, "/redfish/v1/")
Ed Tanous5b224922022-06-22 19:00:59 -0700133 .privileges(redfish::privileges::headServiceRoot)
134 .methods(boost::beast::http::verb::head)(
135 std::bind_front(handleServiceRootHead, std::ref(app)));
136 BMCWEB_ROUTE(app, "/redfish/v1/")
Ed Tanoused398212021-06-09 17:05:54 -0700137 .privileges(redfish::privileges::getServiceRoot)
Ed Tanous7cf436c2022-03-22 23:53:51 -0700138 .methods(boost::beast::http::verb::get)(
Ed Tanous5b224922022-06-22 19:00:59 -0700139 std::bind_front(handleServiceRootGet, std::ref(app)));
John Edward Broadbent7e860f12021-04-08 15:57:16 -0700140}
Borawski.Lukaszb6df6dc2018-01-24 10:20:45 +0100141
Ed Tanous1abe55e2018-09-05 08:30:59 -0700142} // namespace redfish