xref: /openbmc/bmcweb/features/redfish/lib/systems.hpp (revision fc5afcf941d24a9049b61e715596ee87828a6c7d)
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>
21abf2add6SEd Tanous #include <variant>
22c5b2abe0SLewanczyk, Dawid 
231abe55efSEd Tanous namespace redfish
241abe55efSEd Tanous {
25c5b2abe0SLewanczyk, Dawid 
26c5b2abe0SLewanczyk, Dawid /**
27c5b2abe0SLewanczyk, Dawid  * @brief Retrieves computer system properties over dbus
28c5b2abe0SLewanczyk, Dawid  *
29c5b2abe0SLewanczyk, Dawid  * @param[in] aResp Shared pointer for completing asynchronous calls
30c5b2abe0SLewanczyk, Dawid  * @param[in] name  Computer system name from request
31c5b2abe0SLewanczyk, Dawid  *
32c5b2abe0SLewanczyk, Dawid  * @return None.
33c5b2abe0SLewanczyk, Dawid  */
34029573d4SEd Tanous void getComputerSystem(std::shared_ptr<AsyncResp> aResp)
351abe55efSEd Tanous {
3655c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get available system components.";
3755c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
38029573d4SEd Tanous         [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             // Iterate over all retrieved ObjectPaths.
516c34de48SEd Tanous             for (const std::pair<std::string,
526c34de48SEd Tanous                                  std::vector<std::pair<
536c34de48SEd Tanous                                      std::string, std::vector<std::string>>>>
541abe55efSEd Tanous                      &object : subtree)
551abe55efSEd Tanous             {
56c5b2abe0SLewanczyk, Dawid                 const std::string &path = object.first;
5755c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "Got path: " << path;
581abe55efSEd Tanous                 const std::vector<
591abe55efSEd Tanous                     std::pair<std::string, std::vector<std::string>>>
60c5b2abe0SLewanczyk, Dawid                     &connectionNames = object.second;
611abe55efSEd Tanous                 if (connectionNames.size() < 1)
621abe55efSEd Tanous                 {
63c5b2abe0SLewanczyk, Dawid                     continue;
64c5b2abe0SLewanczyk, Dawid                 }
65029573d4SEd Tanous 
666c34de48SEd Tanous                 // This is not system, so check if it's cpu, dimm, UUID or
676c34de48SEd Tanous                 // BiosVer
6804a258f4SEd Tanous                 for (const auto &connection : connectionNames)
691abe55efSEd Tanous                 {
7004a258f4SEd Tanous                     for (const auto &interfaceName : connection.second)
711abe55efSEd Tanous                     {
7204a258f4SEd Tanous                         if (interfaceName ==
7304a258f4SEd Tanous                             "xyz.openbmc_project.Inventory.Item.Dimm")
741abe55efSEd Tanous                         {
751abe55efSEd Tanous                             BMCWEB_LOG_DEBUG
7604a258f4SEd Tanous                                 << "Found Dimm, now get its properties.";
7755c7b7a2SEd Tanous                             crow::connections::systemBus->async_method_call(
78029573d4SEd Tanous                                 [aResp](const boost::system::error_code ec,
796c34de48SEd Tanous                                         const std::vector<
806c34de48SEd Tanous                                             std::pair<std::string, VariantType>>
811abe55efSEd Tanous                                             &properties) {
821abe55efSEd Tanous                                     if (ec)
831abe55efSEd Tanous                                     {
841abe55efSEd Tanous                                         BMCWEB_LOG_ERROR
856c34de48SEd Tanous                                             << "DBUS response error " << ec;
86f12894f8SJason M. Bills                                         messages::internalError(aResp->res);
87c5b2abe0SLewanczyk, Dawid                                         return;
88c5b2abe0SLewanczyk, Dawid                                     }
896c34de48SEd Tanous                                     BMCWEB_LOG_DEBUG << "Got "
906c34de48SEd Tanous                                                      << properties.size()
91c5b2abe0SLewanczyk, Dawid                                                      << "Dimm properties.";
9204a258f4SEd Tanous                                     for (const std::pair<std::string,
9304a258f4SEd Tanous                                                          VariantType>
9404a258f4SEd Tanous                                              &property : properties)
951abe55efSEd Tanous                                     {
96029573d4SEd Tanous                                         if (property.first == "MemorySizeInKb")
971abe55efSEd Tanous                                         {
9804a258f4SEd Tanous                                             const uint64_t *value =
99029573d4SEd Tanous                                                 sdbusplus::message::variant_ns::
100029573d4SEd Tanous                                                     get_if<uint64_t>(
1011b6b96c5SEd Tanous                                                         &property.second);
10204a258f4SEd Tanous                                             if (value != nullptr)
1031abe55efSEd Tanous                                             {
1041abe55efSEd Tanous                                                 aResp->res.jsonValue
1056c34de48SEd Tanous                                                     ["TotalSystemMemoryGi"
1066c34de48SEd Tanous                                                      "B"] +=
10704a258f4SEd Tanous                                                     *value / (1024 * 1024);
108029573d4SEd Tanous                                                 aResp->res
109029573d4SEd Tanous                                                     .jsonValue["MemorySummary"]
110029573d4SEd Tanous                                                               ["Status"]
111029573d4SEd Tanous                                                               ["State"] =
1121abe55efSEd Tanous                                                     "Enabled";
113c5b2abe0SLewanczyk, Dawid                                             }
114c5b2abe0SLewanczyk, Dawid                                         }
115c5b2abe0SLewanczyk, Dawid                                     }
116c5b2abe0SLewanczyk, Dawid                                 },
11704a258f4SEd Tanous                                 connection.first, path,
1186c34de48SEd Tanous                                 "org.freedesktop.DBus.Properties", "GetAll",
1196c34de48SEd Tanous                                 "xyz.openbmc_project.Inventory.Item.Dimm");
1201abe55efSEd Tanous                         }
12104a258f4SEd Tanous                         else if (interfaceName ==
12204a258f4SEd Tanous                                  "xyz.openbmc_project.Inventory.Item.Cpu")
1231abe55efSEd Tanous                         {
1241abe55efSEd Tanous                             BMCWEB_LOG_DEBUG
12504a258f4SEd Tanous                                 << "Found Cpu, now get its properties.";
126a0803efaSEd Tanous                             crow::connections::systemBus->async_method_call(
127029573d4SEd Tanous                                 [aResp](const boost::system::error_code ec,
1286c34de48SEd Tanous                                         const std::vector<
1296c34de48SEd Tanous                                             std::pair<std::string, VariantType>>
1301abe55efSEd Tanous                                             &properties) {
1311abe55efSEd Tanous                                     if (ec)
1321abe55efSEd Tanous                                     {
1331abe55efSEd Tanous                                         BMCWEB_LOG_ERROR
1346c34de48SEd Tanous                                             << "DBUS response error " << ec;
135f12894f8SJason M. Bills                                         messages::internalError(aResp->res);
136c5b2abe0SLewanczyk, Dawid                                         return;
137c5b2abe0SLewanczyk, Dawid                                     }
1386c34de48SEd Tanous                                     BMCWEB_LOG_DEBUG << "Got "
1396c34de48SEd Tanous                                                      << properties.size()
140c5b2abe0SLewanczyk, Dawid                                                      << "Cpu properties.";
14104a258f4SEd Tanous                                     for (const auto &property : properties)
1421abe55efSEd Tanous                                     {
143029573d4SEd Tanous                                         if (property.first == "ProcessorFamily")
1441abe55efSEd Tanous                                         {
145a0803efaSEd Tanous                                             const std::string *value =
146029573d4SEd Tanous                                                 sdbusplus::message::variant_ns::
147029573d4SEd Tanous                                                     get_if<std::string>(
1481b6b96c5SEd Tanous                                                         &property.second);
1491abe55efSEd Tanous                                             if (value != nullptr)
1501abe55efSEd Tanous                                             {
151029573d4SEd Tanous                                                 nlohmann::json &procSummary =
1521abe55efSEd Tanous                                                     aResp->res.jsonValue
1536c34de48SEd Tanous                                                         ["ProcessorSumm"
15404a258f4SEd Tanous                                                          "ary"];
15504a258f4SEd Tanous                                                 nlohmann::json &procCount =
15604a258f4SEd Tanous                                                     procSummary["Count"];
15704a258f4SEd Tanous 
15804a258f4SEd Tanous                                                 procCount =
159029573d4SEd Tanous                                                     procCount.get<int>() + 1;
160029573d4SEd Tanous                                                 procSummary["Status"]["State"] =
161c5b2abe0SLewanczyk, Dawid                                                     "Enabled";
162029573d4SEd Tanous                                                 procSummary["Model"] = *value;
163c5b2abe0SLewanczyk, Dawid                                             }
164c5b2abe0SLewanczyk, Dawid                                         }
165c5b2abe0SLewanczyk, Dawid                                     }
166c5b2abe0SLewanczyk, Dawid                                 },
16704a258f4SEd Tanous                                 connection.first, path,
1686c34de48SEd Tanous                                 "org.freedesktop.DBus.Properties", "GetAll",
1696c34de48SEd Tanous                                 "xyz.openbmc_project.Inventory.Item.Cpu");
1701abe55efSEd Tanous                         }
17104a258f4SEd Tanous                         else if (interfaceName ==
17204a258f4SEd Tanous                                  "xyz.openbmc_project.Common.UUID")
1731abe55efSEd Tanous                         {
1741abe55efSEd Tanous                             BMCWEB_LOG_DEBUG
17504a258f4SEd Tanous                                 << "Found UUID, now get its properties.";
17655c7b7a2SEd Tanous                             crow::connections::systemBus->async_method_call(
177029573d4SEd Tanous                                 [aResp](const boost::system::error_code ec,
1786c34de48SEd Tanous                                         const std::vector<
1796c34de48SEd Tanous                                             std::pair<std::string, VariantType>>
1801abe55efSEd Tanous                                             &properties) {
1811abe55efSEd Tanous                                     if (ec)
1821abe55efSEd Tanous                                     {
1831abe55efSEd Tanous                                         BMCWEB_LOG_DEBUG
1846c34de48SEd Tanous                                             << "DBUS response error " << ec;
185f12894f8SJason M. Bills                                         messages::internalError(aResp->res);
186c5b2abe0SLewanczyk, Dawid                                         return;
187c5b2abe0SLewanczyk, Dawid                                     }
1886c34de48SEd Tanous                                     BMCWEB_LOG_DEBUG << "Got "
1896c34de48SEd Tanous                                                      << properties.size()
190c5b2abe0SLewanczyk, Dawid                                                      << "UUID properties.";
1911abe55efSEd Tanous                                     for (const std::pair<std::string,
19204a258f4SEd Tanous                                                          VariantType>
19304a258f4SEd Tanous                                              &property : properties)
1941abe55efSEd Tanous                                     {
19504a258f4SEd Tanous                                         if (property.first == "BIOSVer")
1961abe55efSEd Tanous                                         {
197c5b2abe0SLewanczyk, Dawid                                             const std::string *value =
198029573d4SEd Tanous                                                 sdbusplus::message::variant_ns::
199029573d4SEd Tanous                                                     get_if<std::string>(
2001b6b96c5SEd Tanous                                                         &property.second);
2011abe55efSEd Tanous                                             if (value != nullptr)
2021abe55efSEd Tanous                                             {
203029573d4SEd Tanous                                                 aResp->res
204029573d4SEd Tanous                                                     .jsonValue["BiosVersion"] =
2051abe55efSEd Tanous                                                     *value;
206c5b2abe0SLewanczyk, Dawid                                             }
207c5b2abe0SLewanczyk, Dawid                                         }
20804a258f4SEd Tanous                                         if (property.first == "UUID")
2091abe55efSEd Tanous                                         {
210c5b2abe0SLewanczyk, Dawid                                             const std::string *value =
211029573d4SEd Tanous                                                 sdbusplus::message::variant_ns::
212029573d4SEd Tanous                                                     get_if<std::string>(
2131b6b96c5SEd Tanous                                                         &property.second);
21404a258f4SEd Tanous 
2151abe55efSEd Tanous                                             if (value != nullptr)
2161abe55efSEd Tanous                                             {
217029573d4SEd Tanous                                                 std::string valueStr = *value;
21804a258f4SEd Tanous                                                 if (valueStr.size() == 32)
2191abe55efSEd Tanous                                                 {
220029573d4SEd Tanous                                                     valueStr.insert(8, 1, '-');
221029573d4SEd Tanous                                                     valueStr.insert(13, 1, '-');
222029573d4SEd Tanous                                                     valueStr.insert(18, 1, '-');
223029573d4SEd Tanous                                                     valueStr.insert(23, 1, '-');
22404a258f4SEd Tanous                                                 }
225029573d4SEd Tanous                                                 BMCWEB_LOG_DEBUG << "UUID = "
22604a258f4SEd Tanous                                                                  << valueStr;
227029573d4SEd Tanous                                                 aResp->res.jsonValue["UUID"] =
22804a258f4SEd Tanous                                                     valueStr;
229c5b2abe0SLewanczyk, Dawid                                             }
230c5b2abe0SLewanczyk, Dawid                                         }
231c5b2abe0SLewanczyk, Dawid                                     }
232c5b2abe0SLewanczyk, Dawid                                 },
23304a258f4SEd Tanous                                 connection.first, path,
2346c34de48SEd Tanous                                 "org.freedesktop.DBus.Properties", "GetAll",
2351abe55efSEd Tanous                                 "xyz.openbmc_project.Common.UUID");
236c5b2abe0SLewanczyk, Dawid                         }
237029573d4SEd Tanous                         else if (interfaceName ==
238029573d4SEd Tanous                                  "xyz.openbmc_project.Inventory.Item.System")
2391abe55efSEd Tanous                         {
240029573d4SEd Tanous                             crow::connections::systemBus->async_method_call(
241029573d4SEd Tanous                                 [aResp](const boost::system::error_code ec,
242029573d4SEd Tanous                                         const std::vector<
243029573d4SEd Tanous                                             std::pair<std::string, VariantType>>
244029573d4SEd Tanous                                             &propertiesList) {
245029573d4SEd Tanous                                     if (ec)
246029573d4SEd Tanous                                     {
247029573d4SEd Tanous                                         BMCWEB_LOG_ERROR
248029573d4SEd Tanous                                             << "DBUS response error: " << ec;
249f12894f8SJason M. Bills                                         messages::internalError(aResp->res);
250029573d4SEd Tanous                                         return;
251029573d4SEd Tanous                                     }
252029573d4SEd Tanous                                     BMCWEB_LOG_DEBUG << "Got "
253029573d4SEd Tanous                                                      << propertiesList.size()
254029573d4SEd Tanous                                                      << "properties for system";
255029573d4SEd Tanous                                     for (const std::pair<std::string,
256029573d4SEd Tanous                                                          VariantType>
257029573d4SEd Tanous                                              &property : propertiesList)
258029573d4SEd Tanous                                     {
259*fc5afcf9Sbeccabroek                                         const std::string &propertyName =
260*fc5afcf9Sbeccabroek                                             property.first;
261*fc5afcf9Sbeccabroek                                         if ((propertyName == "PartNumber") ||
262*fc5afcf9Sbeccabroek                                             (propertyName == "SerialNumber") ||
263*fc5afcf9Sbeccabroek                                             (propertyName == "Manufacturer") ||
264*fc5afcf9Sbeccabroek                                             (propertyName == "Model"))
265*fc5afcf9Sbeccabroek                                         {
266029573d4SEd Tanous                                             const std::string *value =
267*fc5afcf9Sbeccabroek                                                 std::get_if<std::string>(
268029573d4SEd Tanous                                                     &property.second);
269029573d4SEd Tanous                                             if (value != nullptr)
270029573d4SEd Tanous                                             {
271029573d4SEd Tanous                                                 aResp->res
272*fc5afcf9Sbeccabroek                                                     .jsonValue[propertyName] =
273029573d4SEd Tanous                                                     *value;
274029573d4SEd Tanous                                             }
275029573d4SEd Tanous                                         }
276*fc5afcf9Sbeccabroek                                     }
277029573d4SEd Tanous                                     aResp->res.jsonValue["Name"] = "system";
278029573d4SEd Tanous                                     aResp->res.jsonValue["Id"] =
279029573d4SEd Tanous                                         aResp->res.jsonValue["SerialNumber"];
280029573d4SEd Tanous                                 },
281029573d4SEd Tanous                                 connection.first, path,
282029573d4SEd Tanous                                 "org.freedesktop.DBus.Properties", "GetAll",
283029573d4SEd Tanous                                 "xyz.openbmc_project.Inventory.Decorator."
284029573d4SEd Tanous                                 "Asset");
285029573d4SEd Tanous                         }
286029573d4SEd Tanous                     }
287029573d4SEd Tanous                 }
288c5b2abe0SLewanczyk, Dawid             }
289c5b2abe0SLewanczyk, Dawid         },
290c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.ObjectMapper",
291c5b2abe0SLewanczyk, Dawid         "/xyz/openbmc_project/object_mapper",
292c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.ObjectMapper", "GetSubTree",
2936617338dSEd Tanous         "/xyz/openbmc_project/inventory", int32_t(0),
2946617338dSEd Tanous         std::array<const char *, 5>{
2956617338dSEd Tanous             "xyz.openbmc_project.Inventory.Decorator.Asset",
2966617338dSEd Tanous             "xyz.openbmc_project.Inventory.Item.Cpu",
2976617338dSEd Tanous             "xyz.openbmc_project.Inventory.Item.Dimm",
2986617338dSEd Tanous             "xyz.openbmc_project.Inventory.Item.System",
2996617338dSEd Tanous             "xyz.openbmc_project.Common.UUID",
3006617338dSEd Tanous         });
301c5b2abe0SLewanczyk, Dawid }
302c5b2abe0SLewanczyk, Dawid 
303c5b2abe0SLewanczyk, Dawid /**
304c5b2abe0SLewanczyk, Dawid  * @brief Retrieves identify led group properties over dbus
305c5b2abe0SLewanczyk, Dawid  *
306c5b2abe0SLewanczyk, Dawid  * @param[in] aResp     Shared pointer for completing asynchronous calls.
307c5b2abe0SLewanczyk, Dawid  * @param[in] callback  Callback for process retrieved data.
308c5b2abe0SLewanczyk, Dawid  *
309c5b2abe0SLewanczyk, Dawid  * @return None.
310c5b2abe0SLewanczyk, Dawid  */
311c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc>
312a0803efaSEd Tanous void getLedGroupIdentify(std::shared_ptr<AsyncResp> aResp,
3131abe55efSEd Tanous                          CallbackFunc &&callback)
3141abe55efSEd Tanous {
31555c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get led groups";
31655c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
3171abe55efSEd Tanous         [aResp{std::move(aResp)},
3186617338dSEd Tanous          callback{std::move(callback)}](const boost::system::error_code &ec,
3191abe55efSEd Tanous                                         const ManagedObjectsType &resp) {
3201abe55efSEd Tanous             if (ec)
3211abe55efSEd Tanous             {
32255c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
323f12894f8SJason M. Bills                 messages::internalError(aResp->res);
324c5b2abe0SLewanczyk, Dawid                 return;
325c5b2abe0SLewanczyk, Dawid             }
3266c34de48SEd Tanous             BMCWEB_LOG_DEBUG << "Got " << resp.size() << "led group objects.";
3271abe55efSEd Tanous             for (const auto &objPath : resp)
3281abe55efSEd Tanous             {
329c5b2abe0SLewanczyk, Dawid                 const std::string &path = objPath.first;
3301abe55efSEd Tanous                 if (path.rfind("enclosure_identify") != std::string::npos)
3311abe55efSEd Tanous                 {
3321abe55efSEd Tanous                     for (const auto &interface : objPath.second)
3331abe55efSEd Tanous                     {
3346c34de48SEd Tanous                         if (interface.first == "xyz.openbmc_project.Led.Group")
3351abe55efSEd Tanous                         {
3361abe55efSEd Tanous                             for (const auto &property : interface.second)
3371abe55efSEd Tanous                             {
3381abe55efSEd Tanous                                 if (property.first == "Asserted")
3391abe55efSEd Tanous                                 {
340c5b2abe0SLewanczyk, Dawid                                     const bool *asserted =
341abf2add6SEd Tanous                                         std::get_if<bool>(&property.second);
3421abe55efSEd Tanous                                     if (nullptr != asserted)
3431abe55efSEd Tanous                                     {
344c5b2abe0SLewanczyk, Dawid                                         callback(*asserted, aResp);
3451abe55efSEd Tanous                                     }
3461abe55efSEd Tanous                                     else
3471abe55efSEd Tanous                                     {
348c5b2abe0SLewanczyk, Dawid                                         callback(false, aResp);
349c5b2abe0SLewanczyk, Dawid                                     }
350c5b2abe0SLewanczyk, Dawid                                 }
351c5b2abe0SLewanczyk, Dawid                             }
352c5b2abe0SLewanczyk, Dawid                         }
353c5b2abe0SLewanczyk, Dawid                     }
354c5b2abe0SLewanczyk, Dawid                 }
355c5b2abe0SLewanczyk, Dawid             }
356c5b2abe0SLewanczyk, Dawid         },
357c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.LED.GroupManager",
3586c34de48SEd Tanous         "/xyz/openbmc_project/led/groups", "org.freedesktop.DBus.ObjectManager",
3596c34de48SEd Tanous         "GetManagedObjects");
360c5b2abe0SLewanczyk, Dawid }
361c5b2abe0SLewanczyk, Dawid 
362c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc>
3636c34de48SEd Tanous void getLedIdentify(std::shared_ptr<AsyncResp> aResp, CallbackFunc &&callback)
3641abe55efSEd Tanous {
36555c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get identify led properties";
36655c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
3676617338dSEd Tanous         [aResp,
3686617338dSEd Tanous          callback{std::move(callback)}](const boost::system::error_code ec,
369c5b2abe0SLewanczyk, Dawid                                         const PropertiesType &properties) {
3701abe55efSEd Tanous             if (ec)
3711abe55efSEd Tanous             {
37255c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
373f12894f8SJason M. Bills                 messages::internalError(aResp->res);
374c5b2abe0SLewanczyk, Dawid                 return;
375c5b2abe0SLewanczyk, Dawid             }
3761abe55efSEd Tanous             BMCWEB_LOG_DEBUG << "Got " << properties.size()
3771abe55efSEd Tanous                              << "led properties.";
378c5b2abe0SLewanczyk, Dawid             std::string output;
3791abe55efSEd Tanous             for (const auto &property : properties)
3801abe55efSEd Tanous             {
3811abe55efSEd Tanous                 if (property.first == "State")
3821abe55efSEd Tanous                 {
383c5b2abe0SLewanczyk, Dawid                     const std::string *s =
384abf2add6SEd Tanous                         std::get_if<std::string>(&property.second);
3851abe55efSEd Tanous                     if (nullptr != s)
3861abe55efSEd Tanous                     {
38755c7b7a2SEd Tanous                         BMCWEB_LOG_DEBUG << "Identify Led State: " << *s;
388c5b2abe0SLewanczyk, Dawid                         const auto pos = s->rfind('.');
3891abe55efSEd Tanous                         if (pos != std::string::npos)
3901abe55efSEd Tanous                         {
391c5b2abe0SLewanczyk, Dawid                             auto led = s->substr(pos + 1);
3921abe55efSEd Tanous                             for (const std::pair<const char *, const char *>
3931abe55efSEd Tanous                                      &p :
3941abe55efSEd Tanous                                  std::array<
3956c34de48SEd Tanous                                      std::pair<const char *, const char *>, 3>{
3966c34de48SEd Tanous                                      {{"On", "Lit"},
397c5b2abe0SLewanczyk, Dawid                                       {"Blink", "Blinking"},
3981abe55efSEd Tanous                                       {"Off", "Off"}}})
3991abe55efSEd Tanous                             {
4001abe55efSEd Tanous                                 if (led == p.first)
4011abe55efSEd Tanous                                 {
402c5b2abe0SLewanczyk, Dawid                                     output = p.second;
403c5b2abe0SLewanczyk, Dawid                                 }
404c5b2abe0SLewanczyk, Dawid                             }
405c5b2abe0SLewanczyk, Dawid                         }
406c5b2abe0SLewanczyk, Dawid                     }
407c5b2abe0SLewanczyk, Dawid                 }
408c5b2abe0SLewanczyk, Dawid             }
409c5b2abe0SLewanczyk, Dawid             callback(output, aResp);
410c5b2abe0SLewanczyk, Dawid         },
411c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.LED.Controller.identify",
412c5b2abe0SLewanczyk, Dawid         "/xyz/openbmc_project/led/physical/identify",
413c5b2abe0SLewanczyk, Dawid         "org.freedesktop.DBus.Properties", "GetAll",
414c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.Led.Physical");
415c5b2abe0SLewanczyk, Dawid }
416c5b2abe0SLewanczyk, Dawid 
417c5b2abe0SLewanczyk, Dawid /**
418c5b2abe0SLewanczyk, Dawid  * @brief Retrieves host state properties over dbus
419c5b2abe0SLewanczyk, Dawid  *
420c5b2abe0SLewanczyk, Dawid  * @param[in] aResp     Shared pointer for completing asynchronous calls.
421c5b2abe0SLewanczyk, Dawid  *
422c5b2abe0SLewanczyk, Dawid  * @return None.
423c5b2abe0SLewanczyk, Dawid  */
424a0803efaSEd Tanous void getHostState(std::shared_ptr<AsyncResp> aResp)
4251abe55efSEd Tanous {
42655c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get host information.";
42755c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
428abf2add6SEd Tanous         [aResp{std::move(aResp)}](const boost::system::error_code ec,
429abf2add6SEd Tanous                                   const std::variant<std::string> &hostState) {
4301abe55efSEd Tanous             if (ec)
4311abe55efSEd Tanous             {
43255c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
433f12894f8SJason M. Bills                 messages::internalError(aResp->res);
434c5b2abe0SLewanczyk, Dawid                 return;
435c5b2abe0SLewanczyk, Dawid             }
4366617338dSEd Tanous 
437abf2add6SEd Tanous             const std::string *s = std::get_if<std::string>(&hostState);
43855c7b7a2SEd Tanous             BMCWEB_LOG_DEBUG << "Host state: " << *s;
4396617338dSEd Tanous             if (s != nullptr)
4401abe55efSEd Tanous             {
441c5b2abe0SLewanczyk, Dawid                 // Verify Host State
44294732661SAndrew Geissler                 if (*s == "xyz.openbmc_project.State.Host.HostState.Running")
4431abe55efSEd Tanous                 {
44455c7b7a2SEd Tanous                     aResp->res.jsonValue["PowerState"] = "On";
4456617338dSEd Tanous                     aResp->res.jsonValue["Status"]["State"] = "Enabled";
4461abe55efSEd Tanous                 }
4471abe55efSEd Tanous                 else
4481abe55efSEd Tanous                 {
44955c7b7a2SEd Tanous                     aResp->res.jsonValue["PowerState"] = "Off";
4506617338dSEd Tanous                     aResp->res.jsonValue["Status"]["State"] = "Disabled";
451c5b2abe0SLewanczyk, Dawid                 }
452c5b2abe0SLewanczyk, Dawid             }
453c5b2abe0SLewanczyk, Dawid         },
4546c34de48SEd Tanous         "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0",
4556617338dSEd Tanous         "org.freedesktop.DBus.Properties", "Get",
4566617338dSEd Tanous         "xyz.openbmc_project.State.Host", "CurrentHostState");
457c5b2abe0SLewanczyk, Dawid }
458c5b2abe0SLewanczyk, Dawid 
459c5b2abe0SLewanczyk, Dawid /**
460c5b2abe0SLewanczyk, Dawid  * SystemsCollection derived class for delivering ComputerSystems Collection
461c5b2abe0SLewanczyk, Dawid  * Schema
462c5b2abe0SLewanczyk, Dawid  */
4631abe55efSEd Tanous class SystemsCollection : public Node
4641abe55efSEd Tanous {
465c5b2abe0SLewanczyk, Dawid   public:
4661abe55efSEd Tanous     SystemsCollection(CrowApp &app) : Node(app, "/redfish/v1/Systems/")
4671abe55efSEd Tanous     {
468c5b2abe0SLewanczyk, Dawid         entityPrivileges = {
469c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::get, {{"Login"}}},
470c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::head, {{"Login"}}},
471c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
472c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
473c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
474c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
475c5b2abe0SLewanczyk, Dawid     }
476c5b2abe0SLewanczyk, Dawid 
477c5b2abe0SLewanczyk, Dawid   private:
47855c7b7a2SEd Tanous     void doGet(crow::Response &res, const crow::Request &req,
4791abe55efSEd Tanous                const std::vector<std::string> &params) override
4801abe55efSEd Tanous     {
4810f74e643SEd Tanous         res.jsonValue["@odata.type"] =
4820f74e643SEd Tanous             "#ComputerSystemCollection.ComputerSystemCollection";
4830f74e643SEd Tanous         res.jsonValue["@odata.id"] = "/redfish/v1/Systems";
4840f74e643SEd Tanous         res.jsonValue["@odata.context"] =
4850f74e643SEd Tanous             "/redfish/v1/"
4860f74e643SEd Tanous             "$metadata#ComputerSystemCollection.ComputerSystemCollection";
4870f74e643SEd Tanous         res.jsonValue["Name"] = "Computer System Collection";
488029573d4SEd Tanous         res.jsonValue["Members"] = {
489029573d4SEd Tanous             {{"@odata.id", "/redfish/v1/Systems/system"}}};
490029573d4SEd Tanous         res.jsonValue["Members@odata.count"] = 1;
491029573d4SEd Tanous         res.end();
492c5b2abe0SLewanczyk, Dawid     }
493c5b2abe0SLewanczyk, Dawid };
494c5b2abe0SLewanczyk, Dawid 
495c5b2abe0SLewanczyk, Dawid /**
496cc340dd9SEd Tanous  * SystemActionsReset class supports handle POST method for Reset action.
497cc340dd9SEd Tanous  * The class retrieves and sends data directly to D-Bus.
498cc340dd9SEd Tanous  */
499cc340dd9SEd Tanous class SystemActionsReset : public Node
500cc340dd9SEd Tanous {
501cc340dd9SEd Tanous   public:
502cc340dd9SEd Tanous     SystemActionsReset(CrowApp &app) :
503029573d4SEd Tanous         Node(app, "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset/")
504cc340dd9SEd Tanous     {
505cc340dd9SEd Tanous         entityPrivileges = {
506cc340dd9SEd Tanous             {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
507cc340dd9SEd Tanous     }
508cc340dd9SEd Tanous 
509cc340dd9SEd Tanous   private:
510cc340dd9SEd Tanous     /**
511cc340dd9SEd Tanous      * Function handles POST method request.
512cc340dd9SEd Tanous      * Analyzes POST body message before sends Reset request data to D-Bus.
513cc340dd9SEd Tanous      */
514cc340dd9SEd Tanous     void doPost(crow::Response &res, const crow::Request &req,
515cc340dd9SEd Tanous                 const std::vector<std::string> &params) override
516cc340dd9SEd Tanous     {
517cc340dd9SEd Tanous         auto asyncResp = std::make_shared<AsyncResp>(res);
518cc340dd9SEd Tanous 
5199712f8acSEd Tanous         std::string resetType;
5209712f8acSEd Tanous         if (!json_util::readJson(req, res, "ResetType", resetType))
521cc340dd9SEd Tanous         {
522cc340dd9SEd Tanous             return;
523cc340dd9SEd Tanous         }
524cc340dd9SEd Tanous 
5259712f8acSEd Tanous         if (resetType == "ForceOff")
526cc340dd9SEd Tanous         {
527cc340dd9SEd Tanous             // Force off acts on the chassis
528cc340dd9SEd Tanous             crow::connections::systemBus->async_method_call(
529cc340dd9SEd Tanous                 [asyncResp](const boost::system::error_code ec) {
530cc340dd9SEd Tanous                     if (ec)
531cc340dd9SEd Tanous                     {
5329712f8acSEd Tanous                         BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec;
533f12894f8SJason M. Bills                         messages::internalError(asyncResp->res);
534cc340dd9SEd Tanous                         return;
535cc340dd9SEd Tanous                     }
536cc340dd9SEd Tanous                     // TODO Consider support polling mechanism to verify
537cc340dd9SEd Tanous                     // status of host and chassis after execute the
538cc340dd9SEd Tanous                     // requested action.
539f12894f8SJason M. Bills                     messages::success(asyncResp->res);
540cc340dd9SEd Tanous                 },
541cc340dd9SEd Tanous                 "xyz.openbmc_project.State.Chassis",
542cc340dd9SEd Tanous                 "/xyz/openbmc_project/state/chassis0",
543cc340dd9SEd Tanous                 "org.freedesktop.DBus.Properties", "Set",
5449712f8acSEd Tanous                 "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition",
545abf2add6SEd Tanous                 std::variant<std::string>{
5469712f8acSEd Tanous                     "xyz.openbmc_project.State.Chassis.Transition.Off"});
547cc340dd9SEd Tanous             return;
548cc340dd9SEd Tanous         }
549cc340dd9SEd Tanous         // all other actions operate on the host
550cc340dd9SEd Tanous         std::string command;
551cc340dd9SEd Tanous         // Execute Reset Action regarding to each reset type.
5529712f8acSEd Tanous         if (resetType == "On")
553cc340dd9SEd Tanous         {
554cc340dd9SEd Tanous             command = "xyz.openbmc_project.State.Host.Transition.On";
555cc340dd9SEd Tanous         }
5569712f8acSEd Tanous         else if (resetType == "GracefulShutdown")
557cc340dd9SEd Tanous         {
558cc340dd9SEd Tanous             command = "xyz.openbmc_project.State.Host.Transition.Off";
559cc340dd9SEd Tanous         }
5609712f8acSEd Tanous         else if (resetType == "GracefulRestart")
561cc340dd9SEd Tanous         {
5629712f8acSEd Tanous             command = "xyz.openbmc_project.State.Host.Transition.Reboot";
563cc340dd9SEd Tanous         }
564cc340dd9SEd Tanous         else
565cc340dd9SEd Tanous         {
566f12894f8SJason M. Bills             messages::actionParameterUnknown(res, "Reset", resetType);
567cc340dd9SEd Tanous             return;
568cc340dd9SEd Tanous         }
569cc340dd9SEd Tanous 
570cc340dd9SEd Tanous         crow::connections::systemBus->async_method_call(
571cc340dd9SEd Tanous             [asyncResp](const boost::system::error_code ec) {
572cc340dd9SEd Tanous                 if (ec)
573cc340dd9SEd Tanous                 {
574cc340dd9SEd Tanous                     BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec;
575f12894f8SJason M. Bills                     messages::internalError(asyncResp->res);
576cc340dd9SEd Tanous                     return;
577cc340dd9SEd Tanous                 }
578cc340dd9SEd Tanous                 // TODO Consider support polling mechanism to verify
579cc340dd9SEd Tanous                 // status of host and chassis after execute the
580cc340dd9SEd Tanous                 // requested action.
581f12894f8SJason M. Bills                 messages::success(asyncResp->res);
582cc340dd9SEd Tanous             },
583cc340dd9SEd Tanous             "xyz.openbmc_project.State.Host",
584cc340dd9SEd Tanous             "/xyz/openbmc_project/state/host0",
585cc340dd9SEd Tanous             "org.freedesktop.DBus.Properties", "Set",
5869712f8acSEd Tanous             "xyz.openbmc_project.State.Host", "RequestedHostTransition",
587abf2add6SEd Tanous             std::variant<std::string>{command});
588cc340dd9SEd Tanous     }
589cc340dd9SEd Tanous };
590cc340dd9SEd Tanous 
591cc340dd9SEd Tanous /**
5926617338dSEd Tanous  * Systems derived class for delivering Computer Systems Schema.
593c5b2abe0SLewanczyk, Dawid  */
5941abe55efSEd Tanous class Systems : public Node
5951abe55efSEd Tanous {
596c5b2abe0SLewanczyk, Dawid   public:
597c5b2abe0SLewanczyk, Dawid     /*
598c5b2abe0SLewanczyk, Dawid      * Default Constructor
599c5b2abe0SLewanczyk, Dawid      */
600029573d4SEd Tanous     Systems(CrowApp &app) : Node(app, "/redfish/v1/Systems/system/")
6011abe55efSEd Tanous     {
602c5b2abe0SLewanczyk, Dawid         entityPrivileges = {
603c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::get, {{"Login"}}},
604c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::head, {{"Login"}}},
605c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
606c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
607c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
608c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
609c5b2abe0SLewanczyk, Dawid     }
610c5b2abe0SLewanczyk, Dawid 
611c5b2abe0SLewanczyk, Dawid   private:
612c5b2abe0SLewanczyk, Dawid     /**
613c5b2abe0SLewanczyk, Dawid      * Functions triggers appropriate requests on DBus
614c5b2abe0SLewanczyk, Dawid      */
61555c7b7a2SEd Tanous     void doGet(crow::Response &res, const crow::Request &req,
6161abe55efSEd Tanous                const std::vector<std::string> &params) override
6171abe55efSEd Tanous     {
618bb3d9946SRapkiewicz, Pawel         res.jsonValue["@odata.type"] = "#ComputerSystem.v1_5_1.ComputerSystem";
6190f74e643SEd Tanous         res.jsonValue["@odata.context"] =
6200f74e643SEd Tanous             "/redfish/v1/$metadata#ComputerSystem.ComputerSystem";
621029573d4SEd Tanous         res.jsonValue["Name"] = "Computer System";
622029573d4SEd Tanous         res.jsonValue["Id"] = "system";
6230f74e643SEd Tanous         res.jsonValue["SystemType"] = "Physical";
6240f74e643SEd Tanous         res.jsonValue["Description"] = "Computer System";
6250f74e643SEd Tanous         res.jsonValue["Boot"]["BootSourceOverrideEnabled"] =
6260f74e643SEd Tanous             "Disabled"; // TODO(Dawid), get real boot data
6270f74e643SEd Tanous         res.jsonValue["Boot"]["BootSourceOverrideTarget"] =
6280f74e643SEd Tanous             "None"; // TODO(Dawid), get real boot data
6290f74e643SEd Tanous         res.jsonValue["Boot"]["BootSourceOverrideMode"] =
6300f74e643SEd Tanous             "Legacy"; // TODO(Dawid), get real boot data
6310f74e643SEd Tanous         res.jsonValue["Boot"]
6320f74e643SEd Tanous                      ["BootSourceOverrideTarget@Redfish.AllowableValues"] = {
6330f74e643SEd Tanous             "None",      "Pxe",       "Hdd", "Cd",
6340f74e643SEd Tanous             "BiosSetup", "UefiShell", "Usb"}; // TODO(Dawid), get real boot
6350f74e643SEd Tanous                                               // data
6360f74e643SEd Tanous         res.jsonValue["ProcessorSummary"]["Count"] = 0;
6370f74e643SEd Tanous         res.jsonValue["ProcessorSummary"]["Status"]["State"] = "Disabled";
6380f74e643SEd Tanous         res.jsonValue["MemorySummary"]["TotalSystemMemoryGiB"] = int(0);
6390f74e643SEd Tanous         res.jsonValue["MemorySummary"]["Status"]["State"] = "Disabled";
640029573d4SEd Tanous         res.jsonValue["@odata.id"] = "/redfish/v1/Systems/system";
64104a258f4SEd Tanous 
642443c2934SRapkiewicz, Pawel         res.jsonValue["Processors"] = {
643029573d4SEd Tanous             {"@odata.id", "/redfish/v1/Systems/system/Processors"}};
644443c2934SRapkiewicz, Pawel         res.jsonValue["Memory"] = {
645029573d4SEd Tanous             {"@odata.id", "/redfish/v1/Systems/system/Memory"}};
646029573d4SEd Tanous 
647cc340dd9SEd Tanous         // TODO Need to support ForceRestart.
648cc340dd9SEd Tanous         res.jsonValue["Actions"]["#ComputerSystem.Reset"] = {
649cc340dd9SEd Tanous             {"target",
650029573d4SEd Tanous              "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"},
651cc340dd9SEd Tanous             {"ResetType@Redfish.AllowableValues",
652cc340dd9SEd Tanous              {"On", "ForceOff", "GracefulRestart", "GracefulShutdown"}}};
653c5b2abe0SLewanczyk, Dawid 
654c4bf6374SJason M. Bills         res.jsonValue["LogServices"] = {
655029573d4SEd Tanous             {"@odata.id", "/redfish/v1/Systems/system/LogServices"}};
656c4bf6374SJason M. Bills 
657a0803efaSEd Tanous         auto asyncResp = std::make_shared<AsyncResp>(res);
658c5b2abe0SLewanczyk, Dawid 
6596c34de48SEd Tanous         getLedGroupIdentify(
660a0803efaSEd Tanous             asyncResp,
661a0803efaSEd Tanous             [&](const bool &asserted, const std::shared_ptr<AsyncResp> &aResp) {
6621abe55efSEd Tanous                 if (asserted)
6631abe55efSEd Tanous                 {
664c5b2abe0SLewanczyk, Dawid                     // If led group is asserted, then another call is needed to
665c5b2abe0SLewanczyk, Dawid                     // get led status
6666c34de48SEd Tanous                     getLedIdentify(
667a0803efaSEd Tanous                         aResp, [](const std::string &ledStatus,
668a0803efaSEd Tanous                                   const std::shared_ptr<AsyncResp> &aResp) {
6691abe55efSEd Tanous                             if (!ledStatus.empty())
6701abe55efSEd Tanous                             {
6711abe55efSEd Tanous                                 aResp->res.jsonValue["IndicatorLED"] =
6721abe55efSEd Tanous                                     ledStatus;
673c5b2abe0SLewanczyk, Dawid                             }
674c5b2abe0SLewanczyk, Dawid                         });
6751abe55efSEd Tanous                 }
6761abe55efSEd Tanous                 else
6771abe55efSEd Tanous                 {
67855c7b7a2SEd Tanous                     aResp->res.jsonValue["IndicatorLED"] = "Off";
679c5b2abe0SLewanczyk, Dawid                 }
680c5b2abe0SLewanczyk, Dawid             });
681029573d4SEd Tanous         getComputerSystem(asyncResp);
6826c34de48SEd Tanous         getHostState(asyncResp);
683c5b2abe0SLewanczyk, Dawid     }
684c5b2abe0SLewanczyk, Dawid 
68555c7b7a2SEd Tanous     void doPatch(crow::Response &res, const crow::Request &req,
6861abe55efSEd Tanous                  const std::vector<std::string> &params) override
6871abe55efSEd Tanous     {
688cde19e5fSSantosh Puranik         std::optional<std::string> indicatorLed;
689cde19e5fSSantosh Puranik         if (!json_util::readJson(req, res, "IndicatorLED", indicatorLed))
6906617338dSEd Tanous         {
6916617338dSEd Tanous             return;
6926617338dSEd Tanous         }
693029573d4SEd Tanous         auto asyncResp = std::make_shared<AsyncResp>(res);
694029573d4SEd Tanous         messages::success(asyncResp->res);
6959712f8acSEd Tanous         if (indicatorLed)
6966617338dSEd Tanous         {
6979712f8acSEd Tanous             std::string dbusLedState;
6989712f8acSEd Tanous             if (*indicatorLed == "On")
6999712f8acSEd Tanous             {
7009712f8acSEd Tanous                 dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Lit";
7016617338dSEd Tanous             }
7029712f8acSEd Tanous             else if (*indicatorLed == "Blink")
7036617338dSEd Tanous             {
7046617338dSEd Tanous                 dbusLedState =
7056617338dSEd Tanous                     "xyz.openbmc_project.Led.Physical.Action.Blinking";
7066617338dSEd Tanous             }
7079712f8acSEd Tanous             else if (*indicatorLed == "Off")
7086617338dSEd Tanous             {
7099712f8acSEd Tanous                 dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Off";
7106617338dSEd Tanous             }
7116617338dSEd Tanous             else
7126617338dSEd Tanous             {
713a08b46ccSJason M. Bills                 messages::propertyValueNotInList(res, *indicatorLed,
714a08b46ccSJason M. Bills                                                  "IndicatorLED");
7156617338dSEd Tanous                 return;
7166617338dSEd Tanous             }
7176617338dSEd Tanous 
7186c34de48SEd Tanous             getHostState(asyncResp);
719029573d4SEd Tanous             getComputerSystem(asyncResp);
720c5b2abe0SLewanczyk, Dawid 
721c5b2abe0SLewanczyk, Dawid             // Update led group
72255c7b7a2SEd Tanous             BMCWEB_LOG_DEBUG << "Update led group.";
72355c7b7a2SEd Tanous             crow::connections::systemBus->async_method_call(
724cde19e5fSSantosh Puranik                 [asyncResp](const boost::system::error_code ec) {
7251abe55efSEd Tanous                     if (ec)
7261abe55efSEd Tanous                     {
72755c7b7a2SEd Tanous                         BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
728f12894f8SJason M. Bills                         messages::internalError(asyncResp->res);
729c5b2abe0SLewanczyk, Dawid                         return;
730c5b2abe0SLewanczyk, Dawid                     }
73155c7b7a2SEd Tanous                     BMCWEB_LOG_DEBUG << "Led group update done.";
732c5b2abe0SLewanczyk, Dawid                 },
733c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.LED.GroupManager",
734c5b2abe0SLewanczyk, Dawid                 "/xyz/openbmc_project/led/groups/enclosure_identify",
735c5b2abe0SLewanczyk, Dawid                 "org.freedesktop.DBus.Properties", "Set",
736c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.Led.Group", "Asserted",
737abf2add6SEd Tanous                 std::variant<bool>(
7386617338dSEd Tanous                     (dbusLedState ==
7396617338dSEd Tanous                              "xyz.openbmc_project.Led.Physical.Action.Off"
7406617338dSEd Tanous                          ? false
7416617338dSEd Tanous                          : true)));
742c5b2abe0SLewanczyk, Dawid             // Update identify led status
74355c7b7a2SEd Tanous             BMCWEB_LOG_DEBUG << "Update led SoftwareInventoryCollection.";
74455c7b7a2SEd Tanous             crow::connections::systemBus->async_method_call(
7456617338dSEd Tanous                 [asyncResp{std::move(asyncResp)},
7469712f8acSEd Tanous                  indicatorLed{std::move(*indicatorLed)}](
747c5b2abe0SLewanczyk, Dawid                     const boost::system::error_code ec) {
7481abe55efSEd Tanous                     if (ec)
7491abe55efSEd Tanous                     {
75055c7b7a2SEd Tanous                         BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
751f12894f8SJason M. Bills                         messages::internalError(asyncResp->res);
752c5b2abe0SLewanczyk, Dawid                         return;
753c5b2abe0SLewanczyk, Dawid                     }
75455c7b7a2SEd Tanous                     BMCWEB_LOG_DEBUG << "Led state update done.";
755c5b2abe0SLewanczyk, Dawid                 },
756c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.LED.Controller.identify",
757c5b2abe0SLewanczyk, Dawid                 "/xyz/openbmc_project/led/physical/identify",
758c5b2abe0SLewanczyk, Dawid                 "org.freedesktop.DBus.Properties", "Set",
759c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.Led.Physical", "State",
760abf2add6SEd Tanous                 std::variant<std::string>(dbusLedState));
7616617338dSEd Tanous         }
762c5b2abe0SLewanczyk, Dawid     }
763c5b2abe0SLewanczyk, Dawid };
764c5b2abe0SLewanczyk, Dawid } // namespace redfish
765