xref: /openbmc/bmcweb/features/redfish/lib/systems.hpp (revision cde19e5f6440af949f0d2a62cef91539f1eb4e29)
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                                     {
259029573d4SEd Tanous                                         const std::string *value =
260029573d4SEd Tanous                                             sdbusplus::message::variant_ns::
261029573d4SEd Tanous                                                 get_if<std::string>(
262029573d4SEd Tanous                                                     &property.second);
263029573d4SEd Tanous                                         if (value != nullptr)
264029573d4SEd Tanous                                         {
265029573d4SEd Tanous                                             aResp->res
266029573d4SEd Tanous                                                 .jsonValue[property.first] =
267029573d4SEd Tanous                                                 *value;
268029573d4SEd Tanous                                         }
269029573d4SEd Tanous                                     }
270029573d4SEd Tanous                                     aResp->res.jsonValue["Name"] = "system";
271029573d4SEd Tanous                                     aResp->res.jsonValue["Id"] =
272029573d4SEd Tanous                                         aResp->res.jsonValue["SerialNumber"];
273029573d4SEd Tanous                                 },
274029573d4SEd Tanous                                 connection.first, path,
275029573d4SEd Tanous                                 "org.freedesktop.DBus.Properties", "GetAll",
276029573d4SEd Tanous                                 "xyz.openbmc_project.Inventory.Decorator."
277029573d4SEd Tanous                                 "Asset");
278029573d4SEd Tanous                         }
279029573d4SEd Tanous                     }
280029573d4SEd Tanous                 }
281c5b2abe0SLewanczyk, Dawid             }
282c5b2abe0SLewanczyk, Dawid         },
283c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.ObjectMapper",
284c5b2abe0SLewanczyk, Dawid         "/xyz/openbmc_project/object_mapper",
285c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.ObjectMapper", "GetSubTree",
2866617338dSEd Tanous         "/xyz/openbmc_project/inventory", int32_t(0),
2876617338dSEd Tanous         std::array<const char *, 5>{
2886617338dSEd Tanous             "xyz.openbmc_project.Inventory.Decorator.Asset",
2896617338dSEd Tanous             "xyz.openbmc_project.Inventory.Item.Cpu",
2906617338dSEd Tanous             "xyz.openbmc_project.Inventory.Item.Dimm",
2916617338dSEd Tanous             "xyz.openbmc_project.Inventory.Item.System",
2926617338dSEd Tanous             "xyz.openbmc_project.Common.UUID",
2936617338dSEd Tanous         });
294c5b2abe0SLewanczyk, Dawid }
295c5b2abe0SLewanczyk, Dawid 
296c5b2abe0SLewanczyk, Dawid /**
297c5b2abe0SLewanczyk, Dawid  * @brief Retrieves identify led group properties over dbus
298c5b2abe0SLewanczyk, Dawid  *
299c5b2abe0SLewanczyk, Dawid  * @param[in] aResp     Shared pointer for completing asynchronous calls.
300c5b2abe0SLewanczyk, Dawid  * @param[in] callback  Callback for process retrieved data.
301c5b2abe0SLewanczyk, Dawid  *
302c5b2abe0SLewanczyk, Dawid  * @return None.
303c5b2abe0SLewanczyk, Dawid  */
304c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc>
305a0803efaSEd Tanous void getLedGroupIdentify(std::shared_ptr<AsyncResp> aResp,
3061abe55efSEd Tanous                          CallbackFunc &&callback)
3071abe55efSEd Tanous {
30855c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get led groups";
30955c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
3101abe55efSEd Tanous         [aResp{std::move(aResp)},
3116617338dSEd Tanous          callback{std::move(callback)}](const boost::system::error_code &ec,
3121abe55efSEd Tanous                                         const ManagedObjectsType &resp) {
3131abe55efSEd Tanous             if (ec)
3141abe55efSEd Tanous             {
31555c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
316f12894f8SJason M. Bills                 messages::internalError(aResp->res);
317c5b2abe0SLewanczyk, Dawid                 return;
318c5b2abe0SLewanczyk, Dawid             }
3196c34de48SEd Tanous             BMCWEB_LOG_DEBUG << "Got " << resp.size() << "led group objects.";
3201abe55efSEd Tanous             for (const auto &objPath : resp)
3211abe55efSEd Tanous             {
322c5b2abe0SLewanczyk, Dawid                 const std::string &path = objPath.first;
3231abe55efSEd Tanous                 if (path.rfind("enclosure_identify") != std::string::npos)
3241abe55efSEd Tanous                 {
3251abe55efSEd Tanous                     for (const auto &interface : objPath.second)
3261abe55efSEd Tanous                     {
3276c34de48SEd Tanous                         if (interface.first == "xyz.openbmc_project.Led.Group")
3281abe55efSEd Tanous                         {
3291abe55efSEd Tanous                             for (const auto &property : interface.second)
3301abe55efSEd Tanous                             {
3311abe55efSEd Tanous                                 if (property.first == "Asserted")
3321abe55efSEd Tanous                                 {
333c5b2abe0SLewanczyk, Dawid                                     const bool *asserted =
334abf2add6SEd Tanous                                         std::get_if<bool>(&property.second);
3351abe55efSEd Tanous                                     if (nullptr != asserted)
3361abe55efSEd Tanous                                     {
337c5b2abe0SLewanczyk, Dawid                                         callback(*asserted, aResp);
3381abe55efSEd Tanous                                     }
3391abe55efSEd Tanous                                     else
3401abe55efSEd Tanous                                     {
341c5b2abe0SLewanczyk, Dawid                                         callback(false, aResp);
342c5b2abe0SLewanczyk, Dawid                                     }
343c5b2abe0SLewanczyk, Dawid                                 }
344c5b2abe0SLewanczyk, Dawid                             }
345c5b2abe0SLewanczyk, Dawid                         }
346c5b2abe0SLewanczyk, Dawid                     }
347c5b2abe0SLewanczyk, Dawid                 }
348c5b2abe0SLewanczyk, Dawid             }
349c5b2abe0SLewanczyk, Dawid         },
350c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.LED.GroupManager",
3516c34de48SEd Tanous         "/xyz/openbmc_project/led/groups", "org.freedesktop.DBus.ObjectManager",
3526c34de48SEd Tanous         "GetManagedObjects");
353c5b2abe0SLewanczyk, Dawid }
354c5b2abe0SLewanczyk, Dawid 
355c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc>
3566c34de48SEd Tanous void getLedIdentify(std::shared_ptr<AsyncResp> aResp, CallbackFunc &&callback)
3571abe55efSEd Tanous {
35855c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get identify led properties";
35955c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
3606617338dSEd Tanous         [aResp,
3616617338dSEd Tanous          callback{std::move(callback)}](const boost::system::error_code ec,
362c5b2abe0SLewanczyk, Dawid                                         const PropertiesType &properties) {
3631abe55efSEd Tanous             if (ec)
3641abe55efSEd Tanous             {
36555c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
366f12894f8SJason M. Bills                 messages::internalError(aResp->res);
367c5b2abe0SLewanczyk, Dawid                 return;
368c5b2abe0SLewanczyk, Dawid             }
3691abe55efSEd Tanous             BMCWEB_LOG_DEBUG << "Got " << properties.size()
3701abe55efSEd Tanous                              << "led properties.";
371c5b2abe0SLewanczyk, Dawid             std::string output;
3721abe55efSEd Tanous             for (const auto &property : properties)
3731abe55efSEd Tanous             {
3741abe55efSEd Tanous                 if (property.first == "State")
3751abe55efSEd Tanous                 {
376c5b2abe0SLewanczyk, Dawid                     const std::string *s =
377abf2add6SEd Tanous                         std::get_if<std::string>(&property.second);
3781abe55efSEd Tanous                     if (nullptr != s)
3791abe55efSEd Tanous                     {
38055c7b7a2SEd Tanous                         BMCWEB_LOG_DEBUG << "Identify Led State: " << *s;
381c5b2abe0SLewanczyk, Dawid                         const auto pos = s->rfind('.');
3821abe55efSEd Tanous                         if (pos != std::string::npos)
3831abe55efSEd Tanous                         {
384c5b2abe0SLewanczyk, Dawid                             auto led = s->substr(pos + 1);
3851abe55efSEd Tanous                             for (const std::pair<const char *, const char *>
3861abe55efSEd Tanous                                      &p :
3871abe55efSEd Tanous                                  std::array<
3886c34de48SEd Tanous                                      std::pair<const char *, const char *>, 3>{
3896c34de48SEd Tanous                                      {{"On", "Lit"},
390c5b2abe0SLewanczyk, Dawid                                       {"Blink", "Blinking"},
3911abe55efSEd Tanous                                       {"Off", "Off"}}})
3921abe55efSEd Tanous                             {
3931abe55efSEd Tanous                                 if (led == p.first)
3941abe55efSEd Tanous                                 {
395c5b2abe0SLewanczyk, Dawid                                     output = p.second;
396c5b2abe0SLewanczyk, Dawid                                 }
397c5b2abe0SLewanczyk, Dawid                             }
398c5b2abe0SLewanczyk, Dawid                         }
399c5b2abe0SLewanczyk, Dawid                     }
400c5b2abe0SLewanczyk, Dawid                 }
401c5b2abe0SLewanczyk, Dawid             }
402c5b2abe0SLewanczyk, Dawid             callback(output, aResp);
403c5b2abe0SLewanczyk, Dawid         },
404c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.LED.Controller.identify",
405c5b2abe0SLewanczyk, Dawid         "/xyz/openbmc_project/led/physical/identify",
406c5b2abe0SLewanczyk, Dawid         "org.freedesktop.DBus.Properties", "GetAll",
407c5b2abe0SLewanczyk, Dawid         "xyz.openbmc_project.Led.Physical");
408c5b2abe0SLewanczyk, Dawid }
409c5b2abe0SLewanczyk, Dawid 
410c5b2abe0SLewanczyk, Dawid /**
411c5b2abe0SLewanczyk, Dawid  * @brief Retrieves host state properties over dbus
412c5b2abe0SLewanczyk, Dawid  *
413c5b2abe0SLewanczyk, Dawid  * @param[in] aResp     Shared pointer for completing asynchronous calls.
414c5b2abe0SLewanczyk, Dawid  *
415c5b2abe0SLewanczyk, Dawid  * @return None.
416c5b2abe0SLewanczyk, Dawid  */
417a0803efaSEd Tanous void getHostState(std::shared_ptr<AsyncResp> aResp)
4181abe55efSEd Tanous {
41955c7b7a2SEd Tanous     BMCWEB_LOG_DEBUG << "Get host information.";
42055c7b7a2SEd Tanous     crow::connections::systemBus->async_method_call(
421abf2add6SEd Tanous         [aResp{std::move(aResp)}](const boost::system::error_code ec,
422abf2add6SEd Tanous                                   const std::variant<std::string> &hostState) {
4231abe55efSEd Tanous             if (ec)
4241abe55efSEd Tanous             {
42555c7b7a2SEd Tanous                 BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
426f12894f8SJason M. Bills                 messages::internalError(aResp->res);
427c5b2abe0SLewanczyk, Dawid                 return;
428c5b2abe0SLewanczyk, Dawid             }
4296617338dSEd Tanous 
430abf2add6SEd Tanous             const std::string *s = std::get_if<std::string>(&hostState);
43155c7b7a2SEd Tanous             BMCWEB_LOG_DEBUG << "Host state: " << *s;
4326617338dSEd Tanous             if (s != nullptr)
4331abe55efSEd Tanous             {
434c5b2abe0SLewanczyk, Dawid                 // Verify Host State
43594732661SAndrew Geissler                 if (*s == "xyz.openbmc_project.State.Host.HostState.Running")
4361abe55efSEd Tanous                 {
43755c7b7a2SEd Tanous                     aResp->res.jsonValue["PowerState"] = "On";
4386617338dSEd Tanous                     aResp->res.jsonValue["Status"]["State"] = "Enabled";
4391abe55efSEd Tanous                 }
4401abe55efSEd Tanous                 else
4411abe55efSEd Tanous                 {
44255c7b7a2SEd Tanous                     aResp->res.jsonValue["PowerState"] = "Off";
4436617338dSEd Tanous                     aResp->res.jsonValue["Status"]["State"] = "Disabled";
444c5b2abe0SLewanczyk, Dawid                 }
445c5b2abe0SLewanczyk, Dawid             }
446c5b2abe0SLewanczyk, Dawid         },
4476c34de48SEd Tanous         "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0",
4486617338dSEd Tanous         "org.freedesktop.DBus.Properties", "Get",
4496617338dSEd Tanous         "xyz.openbmc_project.State.Host", "CurrentHostState");
450c5b2abe0SLewanczyk, Dawid }
451c5b2abe0SLewanczyk, Dawid 
452c5b2abe0SLewanczyk, Dawid /**
453c5b2abe0SLewanczyk, Dawid  * SystemsCollection derived class for delivering ComputerSystems Collection
454c5b2abe0SLewanczyk, Dawid  * Schema
455c5b2abe0SLewanczyk, Dawid  */
4561abe55efSEd Tanous class SystemsCollection : public Node
4571abe55efSEd Tanous {
458c5b2abe0SLewanczyk, Dawid   public:
4591abe55efSEd Tanous     SystemsCollection(CrowApp &app) : Node(app, "/redfish/v1/Systems/")
4601abe55efSEd Tanous     {
461c5b2abe0SLewanczyk, Dawid         entityPrivileges = {
462c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::get, {{"Login"}}},
463c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::head, {{"Login"}}},
464c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
465c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
466c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
467c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
468c5b2abe0SLewanczyk, Dawid     }
469c5b2abe0SLewanczyk, Dawid 
470c5b2abe0SLewanczyk, Dawid   private:
47155c7b7a2SEd Tanous     void doGet(crow::Response &res, const crow::Request &req,
4721abe55efSEd Tanous                const std::vector<std::string> &params) override
4731abe55efSEd Tanous     {
4740f74e643SEd Tanous         res.jsonValue["@odata.type"] =
4750f74e643SEd Tanous             "#ComputerSystemCollection.ComputerSystemCollection";
4760f74e643SEd Tanous         res.jsonValue["@odata.id"] = "/redfish/v1/Systems";
4770f74e643SEd Tanous         res.jsonValue["@odata.context"] =
4780f74e643SEd Tanous             "/redfish/v1/"
4790f74e643SEd Tanous             "$metadata#ComputerSystemCollection.ComputerSystemCollection";
4800f74e643SEd Tanous         res.jsonValue["Name"] = "Computer System Collection";
481029573d4SEd Tanous         res.jsonValue["Members"] = {
482029573d4SEd Tanous             {{"@odata.id", "/redfish/v1/Systems/system"}}};
483029573d4SEd Tanous         res.jsonValue["Members@odata.count"] = 1;
484029573d4SEd Tanous         res.end();
485c5b2abe0SLewanczyk, Dawid     }
486c5b2abe0SLewanczyk, Dawid };
487c5b2abe0SLewanczyk, Dawid 
488c5b2abe0SLewanczyk, Dawid /**
489cc340dd9SEd Tanous  * SystemActionsReset class supports handle POST method for Reset action.
490cc340dd9SEd Tanous  * The class retrieves and sends data directly to D-Bus.
491cc340dd9SEd Tanous  */
492cc340dd9SEd Tanous class SystemActionsReset : public Node
493cc340dd9SEd Tanous {
494cc340dd9SEd Tanous   public:
495cc340dd9SEd Tanous     SystemActionsReset(CrowApp &app) :
496029573d4SEd Tanous         Node(app, "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset/")
497cc340dd9SEd Tanous     {
498cc340dd9SEd Tanous         entityPrivileges = {
499cc340dd9SEd Tanous             {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
500cc340dd9SEd Tanous     }
501cc340dd9SEd Tanous 
502cc340dd9SEd Tanous   private:
503cc340dd9SEd Tanous     /**
504cc340dd9SEd Tanous      * Function handles POST method request.
505cc340dd9SEd Tanous      * Analyzes POST body message before sends Reset request data to D-Bus.
506cc340dd9SEd Tanous      */
507cc340dd9SEd Tanous     void doPost(crow::Response &res, const crow::Request &req,
508cc340dd9SEd Tanous                 const std::vector<std::string> &params) override
509cc340dd9SEd Tanous     {
510cc340dd9SEd Tanous         auto asyncResp = std::make_shared<AsyncResp>(res);
511cc340dd9SEd Tanous 
5129712f8acSEd Tanous         std::string resetType;
5139712f8acSEd Tanous         if (!json_util::readJson(req, res, "ResetType", resetType))
514cc340dd9SEd Tanous         {
515cc340dd9SEd Tanous             return;
516cc340dd9SEd Tanous         }
517cc340dd9SEd Tanous 
5189712f8acSEd Tanous         if (resetType == "ForceOff")
519cc340dd9SEd Tanous         {
520cc340dd9SEd Tanous             // Force off acts on the chassis
521cc340dd9SEd Tanous             crow::connections::systemBus->async_method_call(
522cc340dd9SEd Tanous                 [asyncResp](const boost::system::error_code ec) {
523cc340dd9SEd Tanous                     if (ec)
524cc340dd9SEd Tanous                     {
5259712f8acSEd Tanous                         BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec;
526f12894f8SJason M. Bills                         messages::internalError(asyncResp->res);
527cc340dd9SEd Tanous                         return;
528cc340dd9SEd Tanous                     }
529cc340dd9SEd Tanous                     // TODO Consider support polling mechanism to verify
530cc340dd9SEd Tanous                     // status of host and chassis after execute the
531cc340dd9SEd Tanous                     // requested action.
532f12894f8SJason M. Bills                     messages::success(asyncResp->res);
533cc340dd9SEd Tanous                 },
534cc340dd9SEd Tanous                 "xyz.openbmc_project.State.Chassis",
535cc340dd9SEd Tanous                 "/xyz/openbmc_project/state/chassis0",
536cc340dd9SEd Tanous                 "org.freedesktop.DBus.Properties", "Set",
5379712f8acSEd Tanous                 "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition",
538abf2add6SEd Tanous                 std::variant<std::string>{
5399712f8acSEd Tanous                     "xyz.openbmc_project.State.Chassis.Transition.Off"});
540cc340dd9SEd Tanous             return;
541cc340dd9SEd Tanous         }
542cc340dd9SEd Tanous         // all other actions operate on the host
543cc340dd9SEd Tanous         std::string command;
544cc340dd9SEd Tanous         // Execute Reset Action regarding to each reset type.
5459712f8acSEd Tanous         if (resetType == "On")
546cc340dd9SEd Tanous         {
547cc340dd9SEd Tanous             command = "xyz.openbmc_project.State.Host.Transition.On";
548cc340dd9SEd Tanous         }
5499712f8acSEd Tanous         else if (resetType == "GracefulShutdown")
550cc340dd9SEd Tanous         {
551cc340dd9SEd Tanous             command = "xyz.openbmc_project.State.Host.Transition.Off";
552cc340dd9SEd Tanous         }
5539712f8acSEd Tanous         else if (resetType == "GracefulRestart")
554cc340dd9SEd Tanous         {
5559712f8acSEd Tanous             command = "xyz.openbmc_project.State.Host.Transition.Reboot";
556cc340dd9SEd Tanous         }
557cc340dd9SEd Tanous         else
558cc340dd9SEd Tanous         {
559f12894f8SJason M. Bills             messages::actionParameterUnknown(res, "Reset", resetType);
560cc340dd9SEd Tanous             return;
561cc340dd9SEd Tanous         }
562cc340dd9SEd Tanous 
563cc340dd9SEd Tanous         crow::connections::systemBus->async_method_call(
564cc340dd9SEd Tanous             [asyncResp](const boost::system::error_code ec) {
565cc340dd9SEd Tanous                 if (ec)
566cc340dd9SEd Tanous                 {
567cc340dd9SEd Tanous                     BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec;
568f12894f8SJason M. Bills                     messages::internalError(asyncResp->res);
569cc340dd9SEd Tanous                     return;
570cc340dd9SEd Tanous                 }
571cc340dd9SEd Tanous                 // TODO Consider support polling mechanism to verify
572cc340dd9SEd Tanous                 // status of host and chassis after execute the
573cc340dd9SEd Tanous                 // requested action.
574f12894f8SJason M. Bills                 messages::success(asyncResp->res);
575cc340dd9SEd Tanous             },
576cc340dd9SEd Tanous             "xyz.openbmc_project.State.Host",
577cc340dd9SEd Tanous             "/xyz/openbmc_project/state/host0",
578cc340dd9SEd Tanous             "org.freedesktop.DBus.Properties", "Set",
5799712f8acSEd Tanous             "xyz.openbmc_project.State.Host", "RequestedHostTransition",
580abf2add6SEd Tanous             std::variant<std::string>{command});
581cc340dd9SEd Tanous     }
582cc340dd9SEd Tanous };
583cc340dd9SEd Tanous 
584cc340dd9SEd Tanous /**
5856617338dSEd Tanous  * Systems derived class for delivering Computer Systems Schema.
586c5b2abe0SLewanczyk, Dawid  */
5871abe55efSEd Tanous class Systems : public Node
5881abe55efSEd Tanous {
589c5b2abe0SLewanczyk, Dawid   public:
590c5b2abe0SLewanczyk, Dawid     /*
591c5b2abe0SLewanczyk, Dawid      * Default Constructor
592c5b2abe0SLewanczyk, Dawid      */
593029573d4SEd Tanous     Systems(CrowApp &app) : Node(app, "/redfish/v1/Systems/system/")
5941abe55efSEd Tanous     {
595c5b2abe0SLewanczyk, Dawid         entityPrivileges = {
596c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::get, {{"Login"}}},
597c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::head, {{"Login"}}},
598c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::patch, {{"ConfigureComponents"}}},
599c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::put, {{"ConfigureComponents"}}},
600c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}},
601c5b2abe0SLewanczyk, Dawid             {boost::beast::http::verb::post, {{"ConfigureComponents"}}}};
602c5b2abe0SLewanczyk, Dawid     }
603c5b2abe0SLewanczyk, Dawid 
604c5b2abe0SLewanczyk, Dawid   private:
605c5b2abe0SLewanczyk, Dawid     /**
606c5b2abe0SLewanczyk, Dawid      * Functions triggers appropriate requests on DBus
607c5b2abe0SLewanczyk, Dawid      */
60855c7b7a2SEd Tanous     void doGet(crow::Response &res, const crow::Request &req,
6091abe55efSEd Tanous                const std::vector<std::string> &params) override
6101abe55efSEd Tanous     {
611bb3d9946SRapkiewicz, Pawel         res.jsonValue["@odata.type"] = "#ComputerSystem.v1_5_1.ComputerSystem";
6120f74e643SEd Tanous         res.jsonValue["@odata.context"] =
6130f74e643SEd Tanous             "/redfish/v1/$metadata#ComputerSystem.ComputerSystem";
614029573d4SEd Tanous         res.jsonValue["Name"] = "Computer System";
615029573d4SEd Tanous         res.jsonValue["Id"] = "system";
6160f74e643SEd Tanous         res.jsonValue["SystemType"] = "Physical";
6170f74e643SEd Tanous         res.jsonValue["Description"] = "Computer System";
6180f74e643SEd Tanous         res.jsonValue["Boot"]["BootSourceOverrideEnabled"] =
6190f74e643SEd Tanous             "Disabled"; // TODO(Dawid), get real boot data
6200f74e643SEd Tanous         res.jsonValue["Boot"]["BootSourceOverrideTarget"] =
6210f74e643SEd Tanous             "None"; // TODO(Dawid), get real boot data
6220f74e643SEd Tanous         res.jsonValue["Boot"]["BootSourceOverrideMode"] =
6230f74e643SEd Tanous             "Legacy"; // TODO(Dawid), get real boot data
6240f74e643SEd Tanous         res.jsonValue["Boot"]
6250f74e643SEd Tanous                      ["BootSourceOverrideTarget@Redfish.AllowableValues"] = {
6260f74e643SEd Tanous             "None",      "Pxe",       "Hdd", "Cd",
6270f74e643SEd Tanous             "BiosSetup", "UefiShell", "Usb"}; // TODO(Dawid), get real boot
6280f74e643SEd Tanous                                               // data
6290f74e643SEd Tanous         res.jsonValue["ProcessorSummary"]["Count"] = 0;
6300f74e643SEd Tanous         res.jsonValue["ProcessorSummary"]["Status"]["State"] = "Disabled";
6310f74e643SEd Tanous         res.jsonValue["MemorySummary"]["TotalSystemMemoryGiB"] = int(0);
6320f74e643SEd Tanous         res.jsonValue["MemorySummary"]["Status"]["State"] = "Disabled";
633029573d4SEd Tanous         res.jsonValue["@odata.id"] = "/redfish/v1/Systems/system";
63404a258f4SEd Tanous 
635443c2934SRapkiewicz, Pawel         res.jsonValue["Processors"] = {
636029573d4SEd Tanous             {"@odata.id", "/redfish/v1/Systems/system/Processors"}};
637443c2934SRapkiewicz, Pawel         res.jsonValue["Memory"] = {
638029573d4SEd Tanous             {"@odata.id", "/redfish/v1/Systems/system/Memory"}};
639029573d4SEd Tanous 
640cc340dd9SEd Tanous         // TODO Need to support ForceRestart.
641cc340dd9SEd Tanous         res.jsonValue["Actions"]["#ComputerSystem.Reset"] = {
642cc340dd9SEd Tanous             {"target",
643029573d4SEd Tanous              "/redfish/v1/Systems/system/Actions/ComputerSystem.Reset"},
644cc340dd9SEd Tanous             {"ResetType@Redfish.AllowableValues",
645cc340dd9SEd Tanous              {"On", "ForceOff", "GracefulRestart", "GracefulShutdown"}}};
646c5b2abe0SLewanczyk, Dawid 
647c4bf6374SJason M. Bills         res.jsonValue["LogServices"] = {
648029573d4SEd Tanous             {"@odata.id", "/redfish/v1/Systems/system/LogServices"}};
649c4bf6374SJason M. Bills 
650a0803efaSEd Tanous         auto asyncResp = std::make_shared<AsyncResp>(res);
651c5b2abe0SLewanczyk, Dawid 
6526c34de48SEd Tanous         getLedGroupIdentify(
653a0803efaSEd Tanous             asyncResp,
654a0803efaSEd Tanous             [&](const bool &asserted, const std::shared_ptr<AsyncResp> &aResp) {
6551abe55efSEd Tanous                 if (asserted)
6561abe55efSEd Tanous                 {
657c5b2abe0SLewanczyk, Dawid                     // If led group is asserted, then another call is needed to
658c5b2abe0SLewanczyk, Dawid                     // get led status
6596c34de48SEd Tanous                     getLedIdentify(
660a0803efaSEd Tanous                         aResp, [](const std::string &ledStatus,
661a0803efaSEd Tanous                                   const std::shared_ptr<AsyncResp> &aResp) {
6621abe55efSEd Tanous                             if (!ledStatus.empty())
6631abe55efSEd Tanous                             {
6641abe55efSEd Tanous                                 aResp->res.jsonValue["IndicatorLED"] =
6651abe55efSEd Tanous                                     ledStatus;
666c5b2abe0SLewanczyk, Dawid                             }
667c5b2abe0SLewanczyk, Dawid                         });
6681abe55efSEd Tanous                 }
6691abe55efSEd Tanous                 else
6701abe55efSEd Tanous                 {
67155c7b7a2SEd Tanous                     aResp->res.jsonValue["IndicatorLED"] = "Off";
672c5b2abe0SLewanczyk, Dawid                 }
673c5b2abe0SLewanczyk, Dawid             });
674029573d4SEd Tanous         getComputerSystem(asyncResp);
6756c34de48SEd Tanous         getHostState(asyncResp);
676c5b2abe0SLewanczyk, Dawid     }
677c5b2abe0SLewanczyk, Dawid 
67855c7b7a2SEd Tanous     void doPatch(crow::Response &res, const crow::Request &req,
6791abe55efSEd Tanous                  const std::vector<std::string> &params) override
6801abe55efSEd Tanous     {
681*cde19e5fSSantosh Puranik         std::optional<std::string> indicatorLed;
682*cde19e5fSSantosh Puranik         if (!json_util::readJson(req, res, "IndicatorLED", indicatorLed))
6836617338dSEd Tanous         {
6846617338dSEd Tanous             return;
6856617338dSEd Tanous         }
686029573d4SEd Tanous         auto asyncResp = std::make_shared<AsyncResp>(res);
687029573d4SEd Tanous         messages::success(asyncResp->res);
6889712f8acSEd Tanous         if (indicatorLed)
6896617338dSEd Tanous         {
6909712f8acSEd Tanous             std::string dbusLedState;
6919712f8acSEd Tanous             if (*indicatorLed == "On")
6929712f8acSEd Tanous             {
6939712f8acSEd Tanous                 dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Lit";
6946617338dSEd Tanous             }
6959712f8acSEd Tanous             else if (*indicatorLed == "Blink")
6966617338dSEd Tanous             {
6976617338dSEd Tanous                 dbusLedState =
6986617338dSEd Tanous                     "xyz.openbmc_project.Led.Physical.Action.Blinking";
6996617338dSEd Tanous             }
7009712f8acSEd Tanous             else if (*indicatorLed == "Off")
7016617338dSEd Tanous             {
7029712f8acSEd Tanous                 dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Off";
7036617338dSEd Tanous             }
7046617338dSEd Tanous             else
7056617338dSEd Tanous             {
706a08b46ccSJason M. Bills                 messages::propertyValueNotInList(res, *indicatorLed,
707a08b46ccSJason M. Bills                                                  "IndicatorLED");
7086617338dSEd Tanous                 return;
7096617338dSEd Tanous             }
7106617338dSEd Tanous 
7116c34de48SEd Tanous             getHostState(asyncResp);
712029573d4SEd Tanous             getComputerSystem(asyncResp);
713c5b2abe0SLewanczyk, Dawid 
714c5b2abe0SLewanczyk, Dawid             // Update led group
71555c7b7a2SEd Tanous             BMCWEB_LOG_DEBUG << "Update led group.";
71655c7b7a2SEd Tanous             crow::connections::systemBus->async_method_call(
717*cde19e5fSSantosh Puranik                 [asyncResp](const boost::system::error_code ec) {
7181abe55efSEd Tanous                     if (ec)
7191abe55efSEd Tanous                     {
72055c7b7a2SEd Tanous                         BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
721f12894f8SJason M. Bills                         messages::internalError(asyncResp->res);
722c5b2abe0SLewanczyk, Dawid                         return;
723c5b2abe0SLewanczyk, Dawid                     }
72455c7b7a2SEd Tanous                     BMCWEB_LOG_DEBUG << "Led group update done.";
725c5b2abe0SLewanczyk, Dawid                 },
726c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.LED.GroupManager",
727c5b2abe0SLewanczyk, Dawid                 "/xyz/openbmc_project/led/groups/enclosure_identify",
728c5b2abe0SLewanczyk, Dawid                 "org.freedesktop.DBus.Properties", "Set",
729c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.Led.Group", "Asserted",
730abf2add6SEd Tanous                 std::variant<bool>(
7316617338dSEd Tanous                     (dbusLedState ==
7326617338dSEd Tanous                              "xyz.openbmc_project.Led.Physical.Action.Off"
7336617338dSEd Tanous                          ? false
7346617338dSEd Tanous                          : true)));
735c5b2abe0SLewanczyk, Dawid             // Update identify led status
73655c7b7a2SEd Tanous             BMCWEB_LOG_DEBUG << "Update led SoftwareInventoryCollection.";
73755c7b7a2SEd Tanous             crow::connections::systemBus->async_method_call(
7386617338dSEd Tanous                 [asyncResp{std::move(asyncResp)},
7399712f8acSEd Tanous                  indicatorLed{std::move(*indicatorLed)}](
740c5b2abe0SLewanczyk, Dawid                     const boost::system::error_code ec) {
7411abe55efSEd Tanous                     if (ec)
7421abe55efSEd Tanous                     {
74355c7b7a2SEd Tanous                         BMCWEB_LOG_DEBUG << "DBUS response error " << ec;
744f12894f8SJason M. Bills                         messages::internalError(asyncResp->res);
745c5b2abe0SLewanczyk, Dawid                         return;
746c5b2abe0SLewanczyk, Dawid                     }
74755c7b7a2SEd Tanous                     BMCWEB_LOG_DEBUG << "Led state update done.";
748c5b2abe0SLewanczyk, Dawid                 },
749c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.LED.Controller.identify",
750c5b2abe0SLewanczyk, Dawid                 "/xyz/openbmc_project/led/physical/identify",
751c5b2abe0SLewanczyk, Dawid                 "org.freedesktop.DBus.Properties", "Set",
752c5b2abe0SLewanczyk, Dawid                 "xyz.openbmc_project.Led.Physical", "State",
753abf2add6SEd Tanous                 std::variant<std::string>(dbusLedState));
7546617338dSEd Tanous         }
755c5b2abe0SLewanczyk, Dawid     }
756c5b2abe0SLewanczyk, Dawid };
757c5b2abe0SLewanczyk, Dawid } // namespace redfish
758