xref: /openbmc/bmcweb/features/redfish/lib/systems.hpp (revision 443c2934ac1ae86b6d496e3509e2b8acf283fb18)
1c5b2abe0SLewanczyk, Dawid /*
2c5b2abe0SLewanczyk, Dawid // Copyright (c) 2018 Intel Corporation
3c5b2abe0SLewanczyk, Dawid //
4c5b2abe0SLewanczyk, Dawid // Licensed under the Apache License, Version 2.0 (the "License");
5c5b2abe0SLewanczyk, Dawid // you may not use this file except in compliance with the License.
6c5b2abe0SLewanczyk, Dawid // You may obtain a copy of the License at
7c5b2abe0SLewanczyk, Dawid //
8c5b2abe0SLewanczyk, Dawid //      http://www.apache.org/licenses/LICENSE-2.0
9c5b2abe0SLewanczyk, Dawid //
10c5b2abe0SLewanczyk, Dawid // Unless required by applicable law or agreed to in writing, software
11c5b2abe0SLewanczyk, Dawid // distributed under the License is distributed on an "AS IS" BASIS,
12c5b2abe0SLewanczyk, Dawid // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c5b2abe0SLewanczyk, Dawid // See the License for the specific language governing permissions and
14c5b2abe0SLewanczyk, Dawid // limitations under the License.
15c5b2abe0SLewanczyk, Dawid */
16c5b2abe0SLewanczyk, Dawid #pragma once
17c5b2abe0SLewanczyk, Dawid 
189712f8acSEd Tanous #include <boost/container/flat_map.hpp>
199712f8acSEd Tanous #include <node.hpp>
20c5b2abe0SLewanczyk, Dawid #include <utils/json_utils.hpp>
21c5b2abe0SLewanczyk, Dawid 
221abe55efSEd Tanous namespace redfish
231abe55efSEd Tanous {
24c5b2abe0SLewanczyk, Dawid 
25c5b2abe0SLewanczyk, Dawid /**
26c5b2abe0SLewanczyk, Dawid  * @brief Retrieves computer system properties over dbus
27c5b2abe0SLewanczyk, Dawid  *
28c5b2abe0SLewanczyk, Dawid  * @param[in] aResp Shared pointer for completing asynchronous calls
29c5b2abe0SLewanczyk, Dawid  * @param[in] name  Computer system name from request
30c5b2abe0SLewanczyk, Dawid  *
31c5b2abe0SLewanczyk, Dawid  * @return None.
32c5b2abe0SLewanczyk, Dawid  */
33a0803efaSEd Tanous void getComputerSystem(std::shared_ptr<AsyncResp> aResp,
341abe55efSEd Tanous                        const std::string &name)
351abe55efSEd Tanous {
3655c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get available system components.";
3755c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
38c5b2abe0SLewanczyk, Dawid         [name, aResp{std::move(aResp)}](
39c5b2abe0SLewanczyk, Dawid             const boost::system::error_code ec,
40c5b2abe0SLewanczyk, Dawid             const std::vector<std::pair<
416c34de48SEd Tanous                 std::string,
426c34de48SEd Tanous                 std::vector<std::pair<std::string, std::vector<std::string>>>>>
43c5b2abe0SLewanczyk, Dawid                 &subtree) {
441abe55efSEd Tanous             if (ec)
451abe55efSEd Tanous             {
4655c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error";
47f12894f8SJason M. Bills                 messages::internalError(aResp->res);
48c5b2abe0SLewanczyk, Dawid                 return;
49c5b2abe0SLewanczyk, Dawid             }
50c5b2abe0SLewanczyk, Dawid             bool foundName = false;
51c5b2abe0SLewanczyk, Dawid             // Iterate over all retrieved ObjectPaths.
526c34de48SEd Tanous             for (const std::pair<std::string,
536c34de48SEd Tanous                                  std::vector<std::pair<
546c34de48SEd Tanous                                      std::string, std::vector<std::string>>>>
551abe55efSEd Tanous                      &object : subtree)
561abe55efSEd Tanous             {
57c5b2abe0SLewanczyk, Dawid                 const std::string &path = object.first;
5855c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "Got path: " << path;
591abe55efSEd Tanous                 const std::vector<
601abe55efSEd Tanous                     std::pair<std::string, std::vector<std::string>>>
61c5b2abe0SLewanczyk, Dawid                     &connectionNames = object.second;
621abe55efSEd Tanous                 if (connectionNames.size() < 1)
631abe55efSEd Tanous                 {
64c5b2abe0SLewanczyk, Dawid                     continue;
65c5b2abe0SLewanczyk, Dawid                 }
66c5b2abe0SLewanczyk, Dawid                 // Check if computer system exist
671abe55efSEd Tanous                 if (boost::ends_with(path, name))
681abe55efSEd Tanous                 {
69c5b2abe0SLewanczyk, Dawid                     foundName = true;
7055c7b7a2SEd Tanous                     BMCWEB_LOG_DEBUG << "Found name: " << name;
716c34de48SEd Tanous                     const std::string connectionName = connectionNames[0].first;
7255c7b7a2SEd Tanous                     crow::connections::systemBus->async_method_call(
73c5b2abe0SLewanczyk, Dawid                         [aResp, name(std::string(name))](
74c5b2abe0SLewanczyk, Dawid                             const boost::system::error_code ec,
756c34de48SEd Tanous                             const std::vector<std::pair<
766c34de48SEd Tanous                                 std::string, VariantType>> &propertiesList) {
771abe55efSEd Tanous                             if (ec)
781abe55efSEd Tanous                             {
791abe55efSEd Tanous                                 BMCWEB_LOG_ERROR << "DBUS response error: "
801abe55efSEd Tanous                                                  << ec;
81f12894f8SJason M. Bills                                 messages::internalError(aResp->res);
82c5b2abe0SLewanczyk, Dawid                                 return;
83c5b2abe0SLewanczyk, Dawid                             }
846c34de48SEd Tanous                             BMCWEB_LOG_DEBUG << "Got " << propertiesList.size()
85c5b2abe0SLewanczyk, Dawid                                              << "properties for system";
861abe55efSEd Tanous                             for (const std::pair<std::string, VariantType>
871abe55efSEd Tanous                                      &property : propertiesList)
881abe55efSEd Tanous                             {
89c5b2abe0SLewanczyk, Dawid                                 const std::string *value =
901abe55efSEd Tanous                                     mapbox::getPtr<const std::string>(
911abe55efSEd Tanous                                         property.second);
921abe55efSEd Tanous                                 if (value != nullptr)
931abe55efSEd Tanous                                 {
941abe55efSEd Tanous                                     aResp->res.jsonValue[property.first] =
951abe55efSEd Tanous                                         *value;
96c5b2abe0SLewanczyk, Dawid                                 }
97c5b2abe0SLewanczyk, Dawid                             }
9855c7b7a2SEd Tanous                             aResp->res.jsonValue["Name"] = name;
9955c7b7a2SEd Tanous                             aResp->res.jsonValue["Id"] =
10055c7b7a2SEd Tanous                                 aResp->res.jsonValue["SerialNumber"];
101c5b2abe0SLewanczyk, Dawid                         },
1026c34de48SEd Tanous                         connectionName, path, "org.freedesktop.DBus.Properties",
1036c34de48SEd Tanous                         "GetAll",
1041abe55efSEd Tanous                         "xyz.openbmc_project.Inventory.Decorator.Asset");
1051abe55efSEd Tanous                 }
1061abe55efSEd Tanous                 else
1071abe55efSEd Tanous                 {
1086c34de48SEd Tanous                     // This is not system, so check if it's cpu, dimm, UUID or
1096c34de48SEd Tanous                     // BiosVer
11004a258f4SEd Tanous                     for (const auto &connection : connectionNames)
1111abe55efSEd Tanous                     {
11204a258f4SEd Tanous                         for (const auto &interfaceName : connection.second)
1131abe55efSEd Tanous                         {
11404a258f4SEd Tanous                             if (interfaceName ==
11504a258f4SEd Tanous                                 "xyz.openbmc_project.Inventory.Item.Dimm")
1161abe55efSEd Tanous                             {
1171abe55efSEd Tanous                                 BMCWEB_LOG_DEBUG
11804a258f4SEd Tanous                                     << "Found Dimm, now get its properties.";
11955c7b7a2SEd Tanous                                 crow::connections::systemBus->async_method_call(
1206617338dSEd Tanous                                     [aResp](
1211abe55efSEd Tanous                                         const boost::system::error_code ec,
1226c34de48SEd Tanous                                         const std::vector<
1236c34de48SEd Tanous                                             std::pair<std::string, VariantType>>
1241abe55efSEd Tanous                                             &properties) {
1251abe55efSEd Tanous                                         if (ec)
1261abe55efSEd Tanous                                         {
1271abe55efSEd Tanous                                             BMCWEB_LOG_ERROR
1286c34de48SEd Tanous                                                 << "DBUS response error " << ec;
129f12894f8SJason M. Bills                                             messages::internalError(aResp->res);
130c5b2abe0SLewanczyk, Dawid                                             return;
131c5b2abe0SLewanczyk, Dawid                                         }
1326c34de48SEd Tanous                                         BMCWEB_LOG_DEBUG << "Got "
1336c34de48SEd Tanous                                                          << properties.size()
134c5b2abe0SLewanczyk, Dawid                                                          << "Dimm properties.";
13504a258f4SEd Tanous                                         for (const std::pair<std::string,
13604a258f4SEd Tanous                                                              VariantType>
13704a258f4SEd Tanous                                                  &property : properties)
1381abe55efSEd Tanous                                         {
13904a258f4SEd Tanous                                             if (property.first ==
14004a258f4SEd Tanous                                                 "MemorySizeInKb")
1411abe55efSEd Tanous                                             {
14204a258f4SEd Tanous                                                 const uint64_t *value =
1431abe55efSEd Tanous                                                     mapbox::getPtr<
14404a258f4SEd Tanous                                                         const uint64_t>(
14504a258f4SEd Tanous                                                         property.second);
14604a258f4SEd Tanous                                                 if (value != nullptr)
1471abe55efSEd Tanous                                                 {
1481abe55efSEd Tanous                                                     aResp->res.jsonValue
1496c34de48SEd Tanous                                                         ["TotalSystemMemoryGi"
1506c34de48SEd Tanous                                                          "B"] +=
15104a258f4SEd Tanous                                                         *value / (1024 * 1024);
1521abe55efSEd Tanous                                                     aResp->res.jsonValue
1531abe55efSEd Tanous                                                         ["MemorySummary"]
1546c34de48SEd Tanous                                                         ["Status"]["State"] =
1551abe55efSEd Tanous                                                         "Enabled";
156c5b2abe0SLewanczyk, Dawid                                                 }
157c5b2abe0SLewanczyk, Dawid                                             }
158c5b2abe0SLewanczyk, Dawid                                         }
159c5b2abe0SLewanczyk, Dawid                                     },
16004a258f4SEd Tanous                                     connection.first, path,
1616c34de48SEd Tanous                                     "org.freedesktop.DBus.Properties", "GetAll",
1626c34de48SEd Tanous                                     "xyz.openbmc_project.Inventory.Item.Dimm");
1631abe55efSEd Tanous                             }
16404a258f4SEd Tanous                             else if (interfaceName ==
16504a258f4SEd Tanous                                      "xyz.openbmc_project.Inventory.Item.Cpu")
1661abe55efSEd Tanous                             {
1671abe55efSEd Tanous                                 BMCWEB_LOG_DEBUG
16804a258f4SEd Tanous                                     << "Found Cpu, now get its properties.";
169a0803efaSEd Tanous                                 crow::connections::systemBus->async_method_call(
1706617338dSEd Tanous                                     [aResp](
171a0803efaSEd Tanous                                         const boost::system::error_code ec,
1726c34de48SEd Tanous                                         const std::vector<
1736c34de48SEd Tanous                                             std::pair<std::string, VariantType>>
1741abe55efSEd Tanous                                             &properties) {
1751abe55efSEd Tanous                                         if (ec)
1761abe55efSEd Tanous                                         {
1771abe55efSEd Tanous                                             BMCWEB_LOG_ERROR
1786c34de48SEd Tanous                                                 << "DBUS response error " << ec;
179f12894f8SJason M. Bills                                             messages::internalError(aResp->res);
180c5b2abe0SLewanczyk, Dawid                                             return;
181c5b2abe0SLewanczyk, Dawid                                         }
1826c34de48SEd Tanous                                         BMCWEB_LOG_DEBUG << "Got "
1836c34de48SEd Tanous                                                          << properties.size()
184c5b2abe0SLewanczyk, Dawid                                                          << "Cpu properties.";
18504a258f4SEd Tanous                                         for (const auto &property : properties)
1861abe55efSEd Tanous                                         {
18704a258f4SEd Tanous                                             if (property.first ==
18804a258f4SEd Tanous                                                 "ProcessorFamily")
1891abe55efSEd Tanous                                             {
190a0803efaSEd Tanous                                                 const std::string *value =
1911abe55efSEd Tanous                                                     mapbox::getPtr<
192a0803efaSEd Tanous                                                         const std::string>(
19304a258f4SEd Tanous                                                         property.second);
1941abe55efSEd Tanous                                                 if (value != nullptr)
1951abe55efSEd Tanous                                                 {
19604a258f4SEd Tanous                                                     nlohmann::json
19704a258f4SEd Tanous                                                         &procSummary =
1981abe55efSEd Tanous                                                             aResp->res.jsonValue
1996c34de48SEd Tanous                                                                 ["ProcessorSumm"
20004a258f4SEd Tanous                                                                  "ary"];
20104a258f4SEd Tanous                                                     nlohmann::json &procCount =
20204a258f4SEd Tanous                                                         procSummary["Count"];
20304a258f4SEd Tanous 
20404a258f4SEd Tanous                                                     procCount =
20504a258f4SEd Tanous                                                         procCount.get<int>() +
206c5b2abe0SLewanczyk, Dawid                                                         1;
20704a258f4SEd Tanous                                                     procSummary["Status"]
20804a258f4SEd Tanous                                                                ["State"] =
209c5b2abe0SLewanczyk, Dawid                                                                    "Enabled";
21004a258f4SEd Tanous                                                     procSummary["Model"] =
21104a258f4SEd Tanous                                                         *value;
212c5b2abe0SLewanczyk, Dawid                                                 }
213c5b2abe0SLewanczyk, Dawid                                             }
214c5b2abe0SLewanczyk, Dawid                                         }
215c5b2abe0SLewanczyk, Dawid                                     },
21604a258f4SEd Tanous                                     connection.first, path,
2176c34de48SEd Tanous                                     "org.freedesktop.DBus.Properties", "GetAll",
2186c34de48SEd Tanous                                     "xyz.openbmc_project.Inventory.Item.Cpu");
2191abe55efSEd Tanous                             }
22004a258f4SEd Tanous                             else if (interfaceName ==
22104a258f4SEd Tanous                                      "xyz.openbmc_project.Common.UUID")
2221abe55efSEd Tanous                             {
2231abe55efSEd Tanous                                 BMCWEB_LOG_DEBUG
22404a258f4SEd Tanous                                     << "Found UUID, now get its properties.";
22555c7b7a2SEd Tanous                                 crow::connections::systemBus->async_method_call(
2261abe55efSEd Tanous                                     [aResp](
2271abe55efSEd Tanous                                         const boost::system::error_code ec,
2286c34de48SEd Tanous                                         const std::vector<
2296c34de48SEd Tanous                                             std::pair<std::string, VariantType>>
2301abe55efSEd Tanous                                             &properties) {
2311abe55efSEd Tanous                                         if (ec)
2321abe55efSEd Tanous                                         {
2331abe55efSEd Tanous                                             BMCWEB_LOG_DEBUG
2346c34de48SEd Tanous                                                 << "DBUS response error " << ec;
235f12894f8SJason M. Bills                                             messages::internalError(aResp->res);
236c5b2abe0SLewanczyk, Dawid                                             return;
237c5b2abe0SLewanczyk, Dawid                                         }
2386c34de48SEd Tanous                                         BMCWEB_LOG_DEBUG << "Got "
2396c34de48SEd Tanous                                                          << properties.size()
240c5b2abe0SLewanczyk, Dawid                                                          << "UUID properties.";
2411abe55efSEd Tanous                                         for (const std::pair<std::string,
24204a258f4SEd Tanous                                                              VariantType>
24304a258f4SEd Tanous                                                  &property : properties)
2441abe55efSEd Tanous                                         {
24504a258f4SEd Tanous                                             if (property.first == "BIOSVer")
2461abe55efSEd Tanous                                             {
247c5b2abe0SLewanczyk, Dawid                                                 const std::string *value =
2481abe55efSEd Tanous                                                     mapbox::getPtr<
2491abe55efSEd Tanous                                                         const std::string>(
25004a258f4SEd Tanous                                                         property.second);
2511abe55efSEd Tanous                                                 if (value != nullptr)
2521abe55efSEd Tanous                                                 {
2531abe55efSEd Tanous                                                     aResp->res.jsonValue
2541abe55efSEd Tanous                                                         ["BiosVersion"] =
2551abe55efSEd Tanous                                                         *value;
256c5b2abe0SLewanczyk, Dawid                                                 }
257c5b2abe0SLewanczyk, Dawid                                             }
25804a258f4SEd Tanous                                             if (property.first == "UUID")
2591abe55efSEd Tanous                                             {
260c5b2abe0SLewanczyk, Dawid                                                 const std::string *value =
2611abe55efSEd Tanous                                                     mapbox::getPtr<
2621abe55efSEd Tanous                                                         const std::string>(
26304a258f4SEd Tanous                                                         property.second);
26404a258f4SEd Tanous 
2651abe55efSEd Tanous                                                 if (value != nullptr)
2661abe55efSEd Tanous                                                 {
26704a258f4SEd Tanous                                                     std::string valueStr =
2681abe55efSEd Tanous                                                         *value;
26904a258f4SEd Tanous                                                     if (valueStr.size() == 32)
2701abe55efSEd Tanous                                                     {
27104a258f4SEd Tanous                                                         valueStr.insert(8, 1,
27204a258f4SEd Tanous                                                                         '-');
27304a258f4SEd Tanous                                                         valueStr.insert(13, 1,
27404a258f4SEd Tanous                                                                         '-');
27504a258f4SEd Tanous                                                         valueStr.insert(18, 1,
27604a258f4SEd Tanous                                                                         '-');
27704a258f4SEd Tanous                                                         valueStr.insert(23, 1,
27804a258f4SEd Tanous                                                                         '-');
27904a258f4SEd Tanous                                                     }
28004a258f4SEd Tanous                                                     BMCWEB_LOG_DEBUG
28104a258f4SEd Tanous                                                         << "UUID = "
28204a258f4SEd Tanous                                                         << valueStr;
2836c34de48SEd Tanous                                                     aResp->res
2846c34de48SEd Tanous                                                         .jsonValue["UUID"] =
28504a258f4SEd Tanous                                                         valueStr;
286c5b2abe0SLewanczyk, Dawid                                                 }
287c5b2abe0SLewanczyk, Dawid                                             }
288c5b2abe0SLewanczyk, Dawid                                         }
289c5b2abe0SLewanczyk, Dawid                                     },
29004a258f4SEd Tanous                                     connection.first, path,
2916c34de48SEd Tanous                                     "org.freedesktop.DBus.Properties", "GetAll",
2921abe55efSEd Tanous                                     "xyz.openbmc_project.Common.UUID");
293c5b2abe0SLewanczyk, Dawid                             }
294c5b2abe0SLewanczyk, Dawid                         }
295c5b2abe0SLewanczyk, Dawid                     }
296c5b2abe0SLewanczyk, Dawid                 }
297c5b2abe0SLewanczyk, Dawid             }
2981abe55efSEd Tanous             if (foundName == false)
2991abe55efSEd Tanous             {
300f12894f8SJason M. Bills                 messages::internalError(aResp->res);
301c5b2abe0SLewanczyk, Dawid             }
302c5b2abe0SLewanczyk, Dawid         },
303c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.ObjectMapper",
304c5b2abe0SLewanczyk, Dawid         "/xyz/openbmc_project/object_mapper",
305c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.ObjectMapper", "GetSubTree",
3066617338dSEd Tanous         "/xyz/openbmc_project/inventory", int32_t(0),
3076617338dSEd Tanous         std::array<const char *, 5>{
3086617338dSEd Tanous             "xyz.openbmc_project.Inventory.Decorator.Asset",
3096617338dSEd Tanous             "xyz.openbmc_project.Inventory.Item.Cpu",
3106617338dSEd Tanous             "xyz.openbmc_project.Inventory.Item.Dimm",
3116617338dSEd Tanous             "xyz.openbmc_project.Inventory.Item.System",
3126617338dSEd Tanous             "xyz.openbmc_project.Common.UUID",
3136617338dSEd Tanous         });
314c5b2abe0SLewanczyk, Dawid }
315c5b2abe0SLewanczyk, Dawid 
316c5b2abe0SLewanczyk, Dawid /**
317c5b2abe0SLewanczyk, Dawid  * @brief Retrieves identify led group properties over dbus
318c5b2abe0SLewanczyk, Dawid  *
319c5b2abe0SLewanczyk, Dawid  * @param[in] aResp     Shared pointer for completing asynchronous calls.
320c5b2abe0SLewanczyk, Dawid  * @param[in] callback  Callback for process retrieved data.
321c5b2abe0SLewanczyk, Dawid  *
322c5b2abe0SLewanczyk, Dawid  * @return None.
323c5b2abe0SLewanczyk, Dawid  */
324c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc>
325a0803efaSEd Tanous void getLedGroupIdentify(std::shared_ptr<AsyncResp> aResp,
3261abe55efSEd Tanous                          CallbackFunc &&callback)
3271abe55efSEd Tanous {
32855c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get led groups";
32955c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
3301abe55efSEd Tanous         [aResp{std::move(aResp)},
3316617338dSEd Tanous          callback{std::move(callback)}](const boost::system::error_code &ec,
3321abe55efSEd Tanous                                         const ManagedObjectsType &resp) {
3331abe55efSEd Tanous             if (ec)
3341abe55efSEd Tanous             {
33555c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
336f12894f8SJason M. Bills                 messages::internalError(aResp->res);
337c5b2abe0SLewanczyk, Dawid                 return;
338c5b2abe0SLewanczyk, Dawid             }
3396c34de48SEd Tanous             BMCWEB_LOG_DEBUG << "Got " << resp.size() << "led group objects.";
3401abe55efSEd Tanous             for (const auto &objPath : resp)
3411abe55efSEd Tanous             {
342c5b2abe0SLewanczyk, Dawid                 const std::string &path = objPath.first;
3431abe55efSEd Tanous                 if (path.rfind("enclosure_identify") != std::string::npos)
3441abe55efSEd Tanous                 {
3451abe55efSEd Tanous                     for (const auto &interface : objPath.second)
3461abe55efSEd Tanous                     {
3476c34de48SEd Tanous                         if (interface.first == "xyz.openbmc_project.Led.Group")
3481abe55efSEd Tanous                         {
3491abe55efSEd Tanous                             for (const auto &property : interface.second)
3501abe55efSEd Tanous                             {
3511abe55efSEd Tanous                                 if (property.first == "Asserted")
3521abe55efSEd Tanous                                 {
353c5b2abe0SLewanczyk, Dawid                                     const bool *asserted =
3541abe55efSEd Tanous                                         mapbox::getPtr<const bool>(
3551abe55efSEd Tanous                                             property.second);
3561abe55efSEd Tanous                                     if (nullptr != asserted)
3571abe55efSEd Tanous                                     {
358c5b2abe0SLewanczyk, Dawid                                         callback(*asserted, aResp);
3591abe55efSEd Tanous                                     }
3601abe55efSEd Tanous                                     else
3611abe55efSEd Tanous                                     {
362c5b2abe0SLewanczyk, Dawid                                         callback(false, aResp);
363c5b2abe0SLewanczyk, Dawid                                     }
364c5b2abe0SLewanczyk, Dawid                                 }
365c5b2abe0SLewanczyk, Dawid                             }
366c5b2abe0SLewanczyk, Dawid                         }
367c5b2abe0SLewanczyk, Dawid                     }
368c5b2abe0SLewanczyk, Dawid                 }
369c5b2abe0SLewanczyk, Dawid             }
370c5b2abe0SLewanczyk, Dawid         },
371c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.LED.GroupManager",
3726c34de48SEd Tanous         "/xyz/openbmc_project/led/groups", "org.freedesktop.DBus.ObjectManager",
3736c34de48SEd Tanous         "GetManagedObjects");
374c5b2abe0SLewanczyk, Dawid }
375c5b2abe0SLewanczyk, Dawid 
376c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc>
3776c34de48SEd Tanous void getLedIdentify(std::shared_ptr<AsyncResp> aResp, CallbackFunc &&callback)
3781abe55efSEd Tanous {
37955c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get identify led properties";
38055c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
3816617338dSEd Tanous         [aResp,
3826617338dSEd Tanous          callback{std::move(callback)}](const boost::system::error_code ec,
383c5b2abe0SLewanczyk, Dawid                                         const PropertiesType &properties) {
3841abe55efSEd Tanous             if (ec)
3851abe55efSEd Tanous             {
38655c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
387f12894f8SJason M. Bills                 messages::internalError(aResp->res);
388c5b2abe0SLewanczyk, Dawid                 return;
389c5b2abe0SLewanczyk, Dawid             }
3901abe55efSEd Tanous             BMCWEB_LOG_DEBUG << "Got " << properties.size()
3911abe55efSEd Tanous                              << "led properties.";
392c5b2abe0SLewanczyk, Dawid             std::string output;
3931abe55efSEd Tanous             for (const auto &property : properties)
3941abe55efSEd Tanous             {
3951abe55efSEd Tanous                 if (property.first == "State")
3961abe55efSEd Tanous                 {
397c5b2abe0SLewanczyk, Dawid                     const std::string *s =
39855c7b7a2SEd Tanous                         mapbox::getPtr<std::string>(property.second);
3991abe55efSEd Tanous                     if (nullptr != s)
4001abe55efSEd Tanous                     {
40155c7b7a2SEd Tanous                         BMCWEB_LOG_DEBUG << "Identify Led State: " << *s;
402c5b2abe0SLewanczyk, Dawid                         const auto pos = s->rfind('.');
4031abe55efSEd Tanous                         if (pos != std::string::npos)
4041abe55efSEd Tanous                         {
405c5b2abe0SLewanczyk, Dawid                             auto led = s->substr(pos + 1);
4061abe55efSEd Tanous                             for (const std::pair<const char *, const char *>
4071abe55efSEd Tanous                                      &p :
4081abe55efSEd Tanous                                  std::array<
4096c34de48SEd Tanous                                      std::pair<const char *, const char *>, 3>{
4106c34de48SEd Tanous                                      {{"On", "Lit"},
411c5b2abe0SLewanczyk, Dawid                                       {"Blink", "Blinking"},
4121abe55efSEd Tanous                                       {"Off", "Off"}}})
4131abe55efSEd Tanous                             {
4141abe55efSEd Tanous                                 if (led == p.first)
4151abe55efSEd Tanous                                 {
416c5b2abe0SLewanczyk, Dawid                                     output = p.second;
417c5b2abe0SLewanczyk, Dawid                                 }
418c5b2abe0SLewanczyk, Dawid                             }
419c5b2abe0SLewanczyk, Dawid                         }
420c5b2abe0SLewanczyk, Dawid                     }
421c5b2abe0SLewanczyk, Dawid                 }
422c5b2abe0SLewanczyk, Dawid             }
423c5b2abe0SLewanczyk, Dawid             callback(output, aResp);
424c5b2abe0SLewanczyk, Dawid         },
425c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.LED.Controller.identify",
426c5b2abe0SLewanczyk, Dawid         "/xyz/openbmc_project/led/physical/identify",
427c5b2abe0SLewanczyk, Dawid         "org.freedesktop.DBus.Properties", "GetAll",
428c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.Led.Physical");
429c5b2abe0SLewanczyk, Dawid }
430c5b2abe0SLewanczyk, Dawid 
431c5b2abe0SLewanczyk, Dawid /**
432c5b2abe0SLewanczyk, Dawid  * @brief Retrieves host state properties over dbus
433c5b2abe0SLewanczyk, Dawid  *
434c5b2abe0SLewanczyk, Dawid  * @param[in] aResp     Shared pointer for completing asynchronous calls.
435c5b2abe0SLewanczyk, Dawid  *
436c5b2abe0SLewanczyk, Dawid  * @return None.
437c5b2abe0SLewanczyk, Dawid  */
438a0803efaSEd Tanous void getHostState(std::shared_ptr<AsyncResp> aResp)
4391abe55efSEd Tanous {
44055c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get host information.";
44155c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
4426617338dSEd Tanous         [aResp{std::move(aResp)}](
4436617338dSEd Tanous             const boost::system::error_code ec,
4446617338dSEd Tanous             const sdbusplus::message::variant<std::string> &hostState) {
4451abe55efSEd Tanous             if (ec)
4461abe55efSEd Tanous             {
44755c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
448f12894f8SJason M. Bills                 messages::internalError(aResp->res);
449c5b2abe0SLewanczyk, Dawid                 return;
450c5b2abe0SLewanczyk, Dawid             }
4516617338dSEd Tanous 
4526617338dSEd Tanous             const std::string *s = mapbox::getPtr<const std::string>(hostState);
45355c7b7a2SEd Tanous             BMCWEB_LOG_DEBUG << "Host state: " << *s;
4546617338dSEd Tanous             if (s != nullptr)
4551abe55efSEd Tanous             {
456c5b2abe0SLewanczyk, Dawid                 // Verify Host State
4576617338dSEd Tanous                 if (*s == "xyz.openbmc_project.State.Host.Running")
4581abe55efSEd Tanous                 {
45955c7b7a2SEd Tanous                     aResp->res.jsonValue["PowerState"] = "On";
4606617338dSEd Tanous                     aResp->res.jsonValue["Status"]["State"] = "Enabled";
4611abe55efSEd Tanous                 }
4621abe55efSEd Tanous                 else
4631abe55efSEd Tanous                 {
46455c7b7a2SEd Tanous                     aResp->res.jsonValue["PowerState"] = "Off";
4656617338dSEd Tanous                     aResp->res.jsonValue["Status"]["State"] = "Disabled";
466c5b2abe0SLewanczyk, Dawid                 }
467c5b2abe0SLewanczyk, Dawid             }
468c5b2abe0SLewanczyk, Dawid         },
4696c34de48SEd Tanous         "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0",
4706617338dSEd Tanous         "org.freedesktop.DBus.Properties", "Get",
4716617338dSEd Tanous         "xyz.openbmc_project.State.Host", "CurrentHostState");
472c5b2abe0SLewanczyk, Dawid }
473c5b2abe0SLewanczyk, Dawid 
474c5b2abe0SLewanczyk, Dawid /**
475c5b2abe0SLewanczyk, Dawid  * SystemsCollection derived class for delivering ComputerSystems Collection
476c5b2abe0SLewanczyk, Dawid  * Schema
477c5b2abe0SLewanczyk, Dawid  */
4781abe55efSEd Tanous class SystemsCollection : public Node
4791abe55efSEd Tanous {
480c5b2abe0SLewanczyk, Dawid   public:
4811abe55efSEd Tanous     SystemsCollection(CrowApp &app) : Node(app, "/redfish/v1/Systems/")
4821abe55efSEd Tanous     {
483c5b2abe0SLewanczyk, Dawid         Node::json["@odata.type"] =
484c5b2abe0SLewanczyk, Dawid             "#ComputerSystemCollection.ComputerSystemCollection";
485c5b2abe0SLewanczyk, Dawid         Node::json["@odata.id"] = "/redfish/v1/Systems";
486c5b2abe0SLewanczyk, Dawid         Node::json["@odata.context"] =
487c5b2abe0SLewanczyk, Dawid             "/redfish/v1/"
488c5b2abe0SLewanczyk, Dawid             "$metadata#ComputerSystemCollection.ComputerSystemCollection";
489c5b2abe0SLewanczyk, Dawid         Node::json["Name"] = "Computer System Collection";
490c5b2abe0SLewanczyk, Dawid 
491c5b2abe0SLewanczyk, Dawid         entityPrivileges = {
492c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::get, {{"Login"}}},
493c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::head, {{"Login"}}},
494c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
495c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
496c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
497c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
498c5b2abe0SLewanczyk, Dawid     }
499c5b2abe0SLewanczyk, Dawid 
500c5b2abe0SLewanczyk, Dawid   private:
50155c7b7a2SEd Tanous     void doGet(crow::Response &res, const crow::Request &req,
5021abe55efSEd Tanous                const std::vector<std::string> &params) override
5031abe55efSEd Tanous     {
5046617338dSEd Tanous         BMCWEB_LOG_DEBUG << "Get list of available boards.";
5056617338dSEd Tanous         std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res);
5066617338dSEd Tanous         res.jsonValue = Node::json;
5076617338dSEd Tanous         crow::connections::systemBus->async_method_call(
5086617338dSEd Tanous             [asyncResp](const boost::system::error_code ec,
5096617338dSEd Tanous                         const std::vector<std::string> &resp) {
5106617338dSEd Tanous                 if (ec)
5111abe55efSEd Tanous                 {
512f12894f8SJason M. Bills                     messages::internalError(asyncResp->res);
5136617338dSEd Tanous                     return;
5146617338dSEd Tanous                 }
5156617338dSEd Tanous                 BMCWEB_LOG_DEBUG << "Got " << resp.size() << " boards.";
5166617338dSEd Tanous 
517c5b2abe0SLewanczyk, Dawid                 // ... prepare json array with appropriate @odata.id links
5186617338dSEd Tanous                 nlohmann::json &boardArray =
5196617338dSEd Tanous                     asyncResp->res.jsonValue["Members"];
5206617338dSEd Tanous                 boardArray = nlohmann::json::array();
5216617338dSEd Tanous 
5226617338dSEd Tanous                 // Iterate over all retrieved ObjectPaths.
5236617338dSEd Tanous                 for (const std::string &objpath : resp)
5246617338dSEd Tanous                 {
5256617338dSEd Tanous                     std::size_t lastPos = objpath.rfind("/");
5266617338dSEd Tanous                     if (lastPos != std::string::npos)
5271abe55efSEd Tanous                     {
528c5b2abe0SLewanczyk, Dawid                         boardArray.push_back(
5296617338dSEd Tanous                             {{"@odata.id", "/redfish/v1/Systems/" +
5306617338dSEd Tanous                                                objpath.substr(lastPos + 1)}});
531c5b2abe0SLewanczyk, Dawid                     }
5321abe55efSEd Tanous                 }
5336617338dSEd Tanous 
5346617338dSEd Tanous                 asyncResp->res.jsonValue["Members@odata.count"] =
5356617338dSEd Tanous                     boardArray.size();
5366617338dSEd Tanous             },
5376617338dSEd Tanous             "xyz.openbmc_project.ObjectMapper",
5386617338dSEd Tanous             "/xyz/openbmc_project/object_mapper",
5396617338dSEd Tanous             "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths",
5406617338dSEd Tanous             "/xyz/openbmc_project/inventory", int32_t(0),
5416617338dSEd Tanous             std::array<const char *, 1>{
5426617338dSEd Tanous                 "xyz.openbmc_project.Inventory.Item.Board"});
543c5b2abe0SLewanczyk, Dawid     }
544c5b2abe0SLewanczyk, Dawid };
545c5b2abe0SLewanczyk, Dawid 
546c5b2abe0SLewanczyk, Dawid /**
547cc340dd9SEd Tanous  * SystemActionsReset class supports handle POST method for Reset action.
548cc340dd9SEd Tanous  * The class retrieves and sends data directly to D-Bus.
549cc340dd9SEd Tanous  */
550cc340dd9SEd Tanous class SystemActionsReset : public Node
551cc340dd9SEd Tanous {
552cc340dd9SEd Tanous   public:
553cc340dd9SEd Tanous     SystemActionsReset(CrowApp &app) :
554cc340dd9SEd Tanous         Node(app, "/redfish/v1/Systems/<str>/Actions/ComputerSystem.Reset/",
555cc340dd9SEd Tanous              std::string())
556cc340dd9SEd Tanous     {
557cc340dd9SEd Tanous         entityPrivileges = {
558cc340dd9SEd Tanous             {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
559cc340dd9SEd Tanous     }
560cc340dd9SEd Tanous 
561cc340dd9SEd Tanous   private:
562cc340dd9SEd Tanous     /**
563cc340dd9SEd Tanous      * Function handles POST method request.
564cc340dd9SEd Tanous      * Analyzes POST body message before sends Reset request data to D-Bus.
565cc340dd9SEd Tanous      */
566cc340dd9SEd Tanous     void doPost(crow::Response &res, const crow::Request &req,
567cc340dd9SEd Tanous                 const std::vector<std::string> &params) override
568cc340dd9SEd Tanous     {
569cc340dd9SEd Tanous         auto asyncResp = std::make_shared<AsyncResp>(res);
570cc340dd9SEd Tanous 
5719712f8acSEd Tanous         std::string resetType;
5729712f8acSEd Tanous         if (!json_util::readJson(req, res, "ResetType", resetType))
573cc340dd9SEd Tanous         {
574cc340dd9SEd Tanous             return;
575cc340dd9SEd Tanous         }
576cc340dd9SEd Tanous 
5779712f8acSEd Tanous         if (resetType == "ForceOff")
578cc340dd9SEd Tanous         {
579cc340dd9SEd Tanous             // Force off acts on the chassis
580cc340dd9SEd Tanous             crow::connections::systemBus->async_method_call(
581cc340dd9SEd Tanous                 [asyncResp](const boost::system::error_code ec) {
582cc340dd9SEd Tanous                     if (ec)
583cc340dd9SEd Tanous                     {
5849712f8acSEd Tanous                         BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec;
585f12894f8SJason M. Bills                         messages::internalError(asyncResp->res);
586cc340dd9SEd Tanous                         return;
587cc340dd9SEd Tanous                     }
588cc340dd9SEd Tanous                     // TODO Consider support polling mechanism to verify
589cc340dd9SEd Tanous                     // status of host and chassis after execute the
590cc340dd9SEd Tanous                     // requested action.
591f12894f8SJason M. Bills                     messages::success(asyncResp->res);
592cc340dd9SEd Tanous                 },
593cc340dd9SEd Tanous                 "xyz.openbmc_project.State.Chassis",
594cc340dd9SEd Tanous                 "/xyz/openbmc_project/state/chassis0",
595cc340dd9SEd Tanous                 "org.freedesktop.DBus.Properties", "Set",
5969712f8acSEd Tanous                 "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition",
597cc340dd9SEd Tanous                 sdbusplus::message::variant<std::string>{
5989712f8acSEd Tanous                     "xyz.openbmc_project.State.Chassis.Transition.Off"});
599cc340dd9SEd Tanous             return;
600cc340dd9SEd Tanous         }
601cc340dd9SEd Tanous         // all other actions operate on the host
602cc340dd9SEd Tanous         std::string command;
603cc340dd9SEd Tanous         // Execute Reset Action regarding to each reset type.
6049712f8acSEd Tanous         if (resetType == "On")
605cc340dd9SEd Tanous         {
606cc340dd9SEd Tanous             command = "xyz.openbmc_project.State.Host.Transition.On";
607cc340dd9SEd Tanous         }
6089712f8acSEd Tanous         else if (resetType == "GracefulShutdown")
609cc340dd9SEd Tanous         {
610cc340dd9SEd Tanous             command = "xyz.openbmc_project.State.Host.Transition.Off";
611cc340dd9SEd Tanous         }
6129712f8acSEd Tanous         else if (resetType == "GracefulRestart")
613cc340dd9SEd Tanous         {
6149712f8acSEd Tanous             command = "xyz.openbmc_project.State.Host.Transition.Reboot";
615cc340dd9SEd Tanous         }
616cc340dd9SEd Tanous         else
617cc340dd9SEd Tanous         {
618f12894f8SJason M. Bills             messages::actionParameterUnknown(res, "Reset", resetType);
619cc340dd9SEd Tanous             return;
620cc340dd9SEd Tanous         }
621cc340dd9SEd Tanous 
622cc340dd9SEd Tanous         crow::connections::systemBus->async_method_call(
623cc340dd9SEd Tanous             [asyncResp](const boost::system::error_code ec) {
624cc340dd9SEd Tanous                 if (ec)
625cc340dd9SEd Tanous                 {
626cc340dd9SEd Tanous                     BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec;
627f12894f8SJason M. Bills                     messages::internalError(asyncResp->res);
628cc340dd9SEd Tanous                     return;
629cc340dd9SEd Tanous                 }
630cc340dd9SEd Tanous                 // TODO Consider support polling mechanism to verify
631cc340dd9SEd Tanous                 // status of host and chassis after execute the
632cc340dd9SEd Tanous                 // requested action.
633f12894f8SJason M. Bills                 messages::success(asyncResp->res);
634cc340dd9SEd Tanous             },
635cc340dd9SEd Tanous             "xyz.openbmc_project.State.Host",
636cc340dd9SEd Tanous             "/xyz/openbmc_project/state/host0",
637cc340dd9SEd Tanous             "org.freedesktop.DBus.Properties", "Set",
6389712f8acSEd Tanous             "xyz.openbmc_project.State.Host", "RequestedHostTransition",
639cc340dd9SEd Tanous             sdbusplus::message::variant<std::string>{command});
640cc340dd9SEd Tanous     }
641cc340dd9SEd Tanous };
642cc340dd9SEd Tanous 
643cc340dd9SEd Tanous /**
6446617338dSEd Tanous  * Systems derived class for delivering Computer Systems Schema.
645c5b2abe0SLewanczyk, Dawid  */
6461abe55efSEd Tanous class Systems : public Node
6471abe55efSEd Tanous {
648c5b2abe0SLewanczyk, Dawid   public:
649c5b2abe0SLewanczyk, Dawid     /*
650c5b2abe0SLewanczyk, Dawid      * Default Constructor
651c5b2abe0SLewanczyk, Dawid      */
6521abe55efSEd Tanous     Systems(CrowApp &app) :
6531abe55efSEd Tanous         Node(app, "/redfish/v1/Systems/<str>/", std::string())
6541abe55efSEd Tanous     {
655c5b2abe0SLewanczyk, Dawid         Node::json["@odata.type"] = "#ComputerSystem.v1_3_0.ComputerSystem";
656c5b2abe0SLewanczyk, Dawid         Node::json["@odata.context"] =
657c5b2abe0SLewanczyk, Dawid             "/redfish/v1/$metadata#ComputerSystem.ComputerSystem";
658c5b2abe0SLewanczyk, Dawid         Node::json["SystemType"] = "Physical";
659c5b2abe0SLewanczyk, Dawid         Node::json["Description"] = "Computer System";
660c5b2abe0SLewanczyk, Dawid         Node::json["Boot"]["BootSourceOverrideEnabled"] =
661c5b2abe0SLewanczyk, Dawid             "Disabled"; // TODO(Dawid), get real boot data
662c5b2abe0SLewanczyk, Dawid         Node::json["Boot"]["BootSourceOverrideTarget"] =
663c5b2abe0SLewanczyk, Dawid             "None"; // TODO(Dawid), get real boot data
664c5b2abe0SLewanczyk, Dawid         Node::json["Boot"]["BootSourceOverrideMode"] =
665c5b2abe0SLewanczyk, Dawid             "Legacy"; // TODO(Dawid), get real boot data
6661abe55efSEd Tanous         Node::json["Boot"]["BootSourceOverrideTarget@Redfish.AllowableValues"] =
6671abe55efSEd Tanous             {"None",      "Pxe",       "Hdd", "Cd",
6681abe55efSEd Tanous              "BiosSetup", "UefiShell", "Usb"}; // TODO(Dawid), get real boot
6691abe55efSEd Tanous                                                // data
67004a258f4SEd Tanous         Node::json["ProcessorSummary"]["Count"] = 0;
671c5b2abe0SLewanczyk, Dawid         Node::json["ProcessorSummary"]["Status"]["State"] = "Disabled";
672c5b2abe0SLewanczyk, Dawid         Node::json["MemorySummary"]["TotalSystemMemoryGiB"] = int(0);
673c5b2abe0SLewanczyk, Dawid         Node::json["MemorySummary"]["Status"]["State"] = "Disabled";
674c5b2abe0SLewanczyk, Dawid         entityPrivileges = {
675c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::get, {{"Login"}}},
676c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::head, {{"Login"}}},
677c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
678c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
679c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
680c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
681c5b2abe0SLewanczyk, Dawid     }
682c5b2abe0SLewanczyk, Dawid 
683c5b2abe0SLewanczyk, Dawid   private:
684c5b2abe0SLewanczyk, Dawid     /**
685c5b2abe0SLewanczyk, Dawid      * Functions triggers appropriate requests on DBus
686c5b2abe0SLewanczyk, Dawid      */
68755c7b7a2SEd Tanous     void doGet(crow::Response &res, const crow::Request &req,
6881abe55efSEd Tanous                const std::vector<std::string> &params) override
6891abe55efSEd Tanous     {
690c5b2abe0SLewanczyk, Dawid         // Check if there is required param, truly entering this shall be
691c5b2abe0SLewanczyk, Dawid         // impossible
6921abe55efSEd Tanous         if (params.size() != 1)
6931abe55efSEd Tanous         {
694f12894f8SJason M. Bills             messages::internalError(res);
695c5b2abe0SLewanczyk, Dawid             res.end();
696c5b2abe0SLewanczyk, Dawid             return;
697c5b2abe0SLewanczyk, Dawid         }
698c5b2abe0SLewanczyk, Dawid 
699c5b2abe0SLewanczyk, Dawid         const std::string &name = params[0];
700c5b2abe0SLewanczyk, Dawid 
70104a258f4SEd Tanous         res.jsonValue = Node::json;
70204a258f4SEd Tanous         res.jsonValue["@odata.id"] = "/redfish/v1/Systems/" + name;
70304a258f4SEd Tanous 
704*443c2934SRapkiewicz, Pawel         res.jsonValue["Processors"] = {
705*443c2934SRapkiewicz, Pawel             {"@odata.id", "/redfish/v1/Systems/" + name + "/Processors"}};
706*443c2934SRapkiewicz, Pawel         res.jsonValue["Memory"] = {
707*443c2934SRapkiewicz, Pawel             {"@odata.id", "/redfish/v1/Systems/" + name + "/Memory"}};
708cc340dd9SEd Tanous         // TODO Need to support ForceRestart.
709cc340dd9SEd Tanous         res.jsonValue["Actions"]["#ComputerSystem.Reset"] = {
710cc340dd9SEd Tanous             {"target",
711cc340dd9SEd Tanous              "/redfish/v1/Systems/" + name + "/Actions/ComputerSystem.Reset"},
712cc340dd9SEd Tanous             {"ResetType@Redfish.AllowableValues",
713cc340dd9SEd Tanous              {"On", "ForceOff", "GracefulRestart", "GracefulShutdown"}}};
714c5b2abe0SLewanczyk, Dawid 
715a0803efaSEd Tanous         auto asyncResp = std::make_shared<AsyncResp>(res);
716c5b2abe0SLewanczyk, Dawid 
7176c34de48SEd Tanous         getLedGroupIdentify(
718a0803efaSEd Tanous             asyncResp,
719a0803efaSEd Tanous             [&](const bool &asserted, const std::shared_ptr<AsyncResp> &aResp) {
7201abe55efSEd Tanous                 if (asserted)
7211abe55efSEd Tanous                 {
722c5b2abe0SLewanczyk, Dawid                     // If led group is asserted, then another call is needed to
723c5b2abe0SLewanczyk, Dawid                     // get led status
7246c34de48SEd Tanous                     getLedIdentify(
725a0803efaSEd Tanous                         aResp, [](const std::string &ledStatus,
726a0803efaSEd Tanous                                   const std::shared_ptr<AsyncResp> &aResp) {
7271abe55efSEd Tanous                             if (!ledStatus.empty())
7281abe55efSEd Tanous                             {
7291abe55efSEd Tanous                                 aResp->res.jsonValue["IndicatorLED"] =
7301abe55efSEd Tanous                                     ledStatus;
731c5b2abe0SLewanczyk, Dawid                             }
732c5b2abe0SLewanczyk, Dawid                         });
7331abe55efSEd Tanous                 }
7341abe55efSEd Tanous                 else
7351abe55efSEd Tanous                 {
73655c7b7a2SEd Tanous                     aResp->res.jsonValue["IndicatorLED"] = "Off";
737c5b2abe0SLewanczyk, Dawid                 }
738c5b2abe0SLewanczyk, Dawid             });
7396c34de48SEd Tanous         getComputerSystem(asyncResp, name);
7406c34de48SEd Tanous         getHostState(asyncResp);
741c5b2abe0SLewanczyk, Dawid     }
742c5b2abe0SLewanczyk, Dawid 
74355c7b7a2SEd Tanous     void doPatch(crow::Response &res, const crow::Request &req,
7441abe55efSEd Tanous                  const std::vector<std::string> &params) override
7451abe55efSEd Tanous     {
746c5b2abe0SLewanczyk, Dawid         // Check if there is required param, truly entering this shall be
747c5b2abe0SLewanczyk, Dawid         // impossible
7486617338dSEd Tanous         auto asyncResp = std::make_shared<AsyncResp>(res);
7491abe55efSEd Tanous         if (params.size() != 1)
7501abe55efSEd Tanous         {
751f12894f8SJason M. Bills             messages::internalError(asyncResp->res);
752c5b2abe0SLewanczyk, Dawid             return;
753c5b2abe0SLewanczyk, Dawid         }
754c5b2abe0SLewanczyk, Dawid 
7556617338dSEd Tanous         const std::string &name = params[0];
7566617338dSEd Tanous 
75755c7b7a2SEd Tanous         res.jsonValue = Node::json;
75855c7b7a2SEd Tanous         res.jsonValue["@odata.id"] = "/redfish/v1/Systems/" + name;
759c5b2abe0SLewanczyk, Dawid 
7609712f8acSEd Tanous         std::string indicatorLedTemp;
7619712f8acSEd Tanous         boost::optional<std::string> indicatorLed = indicatorLedTemp;
7629712f8acSEd Tanous         if (!json_util::readJson(req, res, "IndicatorLed", indicatorLed))
7636617338dSEd Tanous         {
7646617338dSEd Tanous             return;
7656617338dSEd Tanous         }
7666617338dSEd Tanous 
7679712f8acSEd Tanous         if (indicatorLed)
7686617338dSEd Tanous         {
7699712f8acSEd Tanous             std::string dbusLedState;
7709712f8acSEd Tanous             if (*indicatorLed == "On")
7719712f8acSEd Tanous             {
7729712f8acSEd Tanous                 dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Lit";
7736617338dSEd Tanous             }
7749712f8acSEd Tanous             else if (*indicatorLed == "Blink")
7756617338dSEd Tanous             {
7766617338dSEd Tanous                 dbusLedState =
7776617338dSEd Tanous                     "xyz.openbmc_project.Led.Physical.Action.Blinking";
7786617338dSEd Tanous             }
7799712f8acSEd Tanous             else if (*indicatorLed == "Off")
7806617338dSEd Tanous             {
7819712f8acSEd Tanous                 dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Off";
7826617338dSEd Tanous             }
7836617338dSEd Tanous             else
7846617338dSEd Tanous             {
785f12894f8SJason M. Bills                 messages::propertyValueNotInList(
786f12894f8SJason M. Bills                     res, *indicatorLed, "IndicatorLED", "IndicatorLED");
7876617338dSEd Tanous                 return;
7886617338dSEd Tanous             }
7896617338dSEd Tanous 
7906c34de48SEd Tanous             getHostState(asyncResp);
7916c34de48SEd Tanous             getComputerSystem(asyncResp, name);
792c5b2abe0SLewanczyk, Dawid 
793c5b2abe0SLewanczyk, Dawid             // Update led group
79455c7b7a2SEd Tanous             BMCWEB_LOG_DEBUG << "Update led group.";
79555c7b7a2SEd Tanous             crow::connections::systemBus->async_method_call(
7966617338dSEd Tanous                 [asyncResp{std::move(asyncResp)}](
797c5b2abe0SLewanczyk, Dawid                     const boost::system::error_code ec) {
7981abe55efSEd Tanous                     if (ec)
7991abe55efSEd Tanous                     {
80055c7b7a2SEd Tanous                         BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
801f12894f8SJason M. Bills                         messages::internalError(asyncResp->res);
802c5b2abe0SLewanczyk, Dawid                         return;
803c5b2abe0SLewanczyk, Dawid                     }
80455c7b7a2SEd Tanous                     BMCWEB_LOG_DEBUG << "Led group update done.";
805c5b2abe0SLewanczyk, Dawid                 },
806c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.LED.GroupManager",
807c5b2abe0SLewanczyk, Dawid                 "/xyz/openbmc_project/led/groups/enclosure_identify",
808c5b2abe0SLewanczyk, Dawid                 "org.freedesktop.DBus.Properties", "Set",
809c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.Led.Group", "Asserted",
810c5b2abe0SLewanczyk, Dawid                 sdbusplus::message::variant<bool>(
8116617338dSEd Tanous                     (dbusLedState ==
8126617338dSEd Tanous                              "xyz.openbmc_project.Led.Physical.Action.Off"
8136617338dSEd Tanous                          ? false
8146617338dSEd Tanous                          : true)));
815c5b2abe0SLewanczyk, Dawid             // Update identify led status
81655c7b7a2SEd Tanous             BMCWEB_LOG_DEBUG << "Update led SoftwareInventoryCollection.";
81755c7b7a2SEd Tanous             crow::connections::systemBus->async_method_call(
8186617338dSEd Tanous                 [asyncResp{std::move(asyncResp)},
8199712f8acSEd Tanous                  indicatorLed{std::move(*indicatorLed)}](
820c5b2abe0SLewanczyk, Dawid                     const boost::system::error_code ec) {
8211abe55efSEd Tanous                     if (ec)
8221abe55efSEd Tanous                     {
82355c7b7a2SEd Tanous                         BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
824f12894f8SJason M. Bills                         messages::internalError(asyncResp->res);
825c5b2abe0SLewanczyk, Dawid                         return;
826c5b2abe0SLewanczyk, Dawid                     }
82755c7b7a2SEd Tanous                     BMCWEB_LOG_DEBUG << "Led state update done.";
8286617338dSEd Tanous                     asyncResp->res.jsonValue["IndicatorLED"] =
8299712f8acSEd Tanous                         std::move(indicatorLed);
830c5b2abe0SLewanczyk, Dawid                 },
831c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.LED.Controller.identify",
832c5b2abe0SLewanczyk, Dawid                 "/xyz/openbmc_project/led/physical/identify",
833c5b2abe0SLewanczyk, Dawid                 "org.freedesktop.DBus.Properties", "Set",
834c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.Led.Physical", "State",
8356617338dSEd Tanous                 sdbusplus::message::variant<std::string>(dbusLedState));
8366617338dSEd Tanous         }
837c5b2abe0SLewanczyk, Dawid     }
838c5b2abe0SLewanczyk, Dawid };
839c5b2abe0SLewanczyk, Dawid } // namespace redfish
840