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> ¶ms) 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> ¶ms) 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> ¶ms) 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> ¶ms) 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