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> 21*abf2add6SEd 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 */ 34a0803efaSEd Tanous void getComputerSystem(std::shared_ptr<AsyncResp> aResp, 351abe55efSEd Tanous const std::string &name) 361abe55efSEd Tanous { 3755c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get available system components."; 3855c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 39c5b2abe0SLewanczyk, Dawid [name, aResp{std::move(aResp)}]( 40c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec, 41c5b2abe0SLewanczyk, Dawid const std::vector<std::pair< 426c34de48SEd Tanous std::string, 436c34de48SEd Tanous std::vector<std::pair<std::string, std::vector<std::string>>>>> 44c5b2abe0SLewanczyk, Dawid &subtree) { 451abe55efSEd Tanous if (ec) 461abe55efSEd Tanous { 4755c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error"; 48f12894f8SJason M. Bills messages::internalError(aResp->res); 49c5b2abe0SLewanczyk, Dawid return; 50c5b2abe0SLewanczyk, Dawid } 51c5b2abe0SLewanczyk, Dawid bool foundName = false; 52c5b2abe0SLewanczyk, Dawid // Iterate over all retrieved ObjectPaths. 536c34de48SEd Tanous for (const std::pair<std::string, 546c34de48SEd Tanous std::vector<std::pair< 556c34de48SEd Tanous std::string, std::vector<std::string>>>> 561abe55efSEd Tanous &object : subtree) 571abe55efSEd Tanous { 58c5b2abe0SLewanczyk, Dawid const std::string &path = object.first; 5955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Got path: " << path; 601abe55efSEd Tanous const std::vector< 611abe55efSEd Tanous std::pair<std::string, std::vector<std::string>>> 62c5b2abe0SLewanczyk, Dawid &connectionNames = object.second; 631abe55efSEd Tanous if (connectionNames.size() < 1) 641abe55efSEd Tanous { 65c5b2abe0SLewanczyk, Dawid continue; 66c5b2abe0SLewanczyk, Dawid } 67c5b2abe0SLewanczyk, Dawid // Check if computer system exist 681abe55efSEd Tanous if (boost::ends_with(path, name)) 691abe55efSEd Tanous { 70c5b2abe0SLewanczyk, Dawid foundName = true; 7155c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Found name: " << name; 726c34de48SEd Tanous const std::string connectionName = connectionNames[0].first; 7355c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 74c5b2abe0SLewanczyk, Dawid [aResp, name(std::string(name))]( 75c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec, 766c34de48SEd Tanous const std::vector<std::pair< 776c34de48SEd Tanous std::string, VariantType>> &propertiesList) { 781abe55efSEd Tanous if (ec) 791abe55efSEd Tanous { 801abe55efSEd Tanous BMCWEB_LOG_ERROR << "DBUS response error: " 811abe55efSEd Tanous << ec; 82f12894f8SJason M. Bills messages::internalError(aResp->res); 83c5b2abe0SLewanczyk, Dawid return; 84c5b2abe0SLewanczyk, Dawid } 856c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " << propertiesList.size() 86c5b2abe0SLewanczyk, Dawid << "properties for system"; 871abe55efSEd Tanous for (const std::pair<std::string, VariantType> 881abe55efSEd Tanous &property : propertiesList) 891abe55efSEd Tanous { 90c5b2abe0SLewanczyk, Dawid const std::string *value = 91*abf2add6SEd Tanous std::get_if<std::string>(&property.second); 921abe55efSEd Tanous if (value != nullptr) 931abe55efSEd Tanous { 941abe55efSEd Tanous aResp->res.jsonValue[property.first] = 951abe55efSEd Tanous *value; 96c5b2abe0SLewanczyk, Dawid } 97c5b2abe0SLewanczyk, Dawid } 9855c7b7a2SEd Tanous aResp->res.jsonValue["Name"] = name; 9955c7b7a2SEd Tanous aResp->res.jsonValue["Id"] = 10055c7b7a2SEd Tanous aResp->res.jsonValue["SerialNumber"]; 101c5b2abe0SLewanczyk, Dawid }, 1026c34de48SEd Tanous connectionName, path, "org.freedesktop.DBus.Properties", 1036c34de48SEd Tanous "GetAll", 1041abe55efSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset"); 1051abe55efSEd Tanous } 1061abe55efSEd Tanous else 1071abe55efSEd Tanous { 1086c34de48SEd Tanous // This is not system, so check if it's cpu, dimm, UUID or 1096c34de48SEd Tanous // BiosVer 11004a258f4SEd Tanous for (const auto &connection : connectionNames) 1111abe55efSEd Tanous { 11204a258f4SEd Tanous for (const auto &interfaceName : connection.second) 1131abe55efSEd Tanous { 11404a258f4SEd Tanous if (interfaceName == 11504a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm") 1161abe55efSEd Tanous { 1171abe55efSEd Tanous BMCWEB_LOG_DEBUG 11804a258f4SEd Tanous << "Found Dimm, now get its properties."; 11955c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 1206617338dSEd Tanous [aResp]( 1211abe55efSEd Tanous const boost::system::error_code ec, 1226c34de48SEd Tanous const std::vector< 1236c34de48SEd Tanous std::pair<std::string, VariantType>> 1241abe55efSEd Tanous &properties) { 1251abe55efSEd Tanous if (ec) 1261abe55efSEd Tanous { 1271abe55efSEd Tanous BMCWEB_LOG_ERROR 1286c34de48SEd Tanous << "DBUS response error " << ec; 129f12894f8SJason M. Bills messages::internalError(aResp->res); 130c5b2abe0SLewanczyk, Dawid return; 131c5b2abe0SLewanczyk, Dawid } 1326c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1336c34de48SEd Tanous << properties.size() 134c5b2abe0SLewanczyk, Dawid << "Dimm properties."; 13504a258f4SEd Tanous for (const std::pair<std::string, 13604a258f4SEd Tanous VariantType> 13704a258f4SEd Tanous &property : properties) 1381abe55efSEd Tanous { 13904a258f4SEd Tanous if (property.first == 14004a258f4SEd Tanous "MemorySizeInKb") 1411abe55efSEd Tanous { 14204a258f4SEd Tanous const uint64_t *value = 1431b6b96c5SEd Tanous sdbusplus::message:: 1441b6b96c5SEd Tanous variant_ns::get_if< 1451b6b96c5SEd Tanous uint64_t>( 1461b6b96c5SEd Tanous &property.second); 14704a258f4SEd Tanous if (value != nullptr) 1481abe55efSEd Tanous { 1491abe55efSEd Tanous aResp->res.jsonValue 1506c34de48SEd Tanous ["TotalSystemMemoryGi" 1516c34de48SEd Tanous "B"] += 15204a258f4SEd Tanous *value / (1024 * 1024); 1531abe55efSEd Tanous aResp->res.jsonValue 1541abe55efSEd Tanous ["MemorySummary"] 1556c34de48SEd Tanous ["Status"]["State"] = 1561abe55efSEd Tanous "Enabled"; 157c5b2abe0SLewanczyk, Dawid } 158c5b2abe0SLewanczyk, Dawid } 159c5b2abe0SLewanczyk, Dawid } 160c5b2abe0SLewanczyk, Dawid }, 16104a258f4SEd Tanous connection.first, path, 1626c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 1636c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm"); 1641abe55efSEd Tanous } 16504a258f4SEd Tanous else if (interfaceName == 16604a258f4SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu") 1671abe55efSEd Tanous { 1681abe55efSEd Tanous BMCWEB_LOG_DEBUG 16904a258f4SEd Tanous << "Found Cpu, now get its properties."; 170a0803efaSEd Tanous crow::connections::systemBus->async_method_call( 1716617338dSEd Tanous [aResp]( 172a0803efaSEd Tanous const boost::system::error_code ec, 1736c34de48SEd Tanous const std::vector< 1746c34de48SEd Tanous std::pair<std::string, VariantType>> 1751abe55efSEd Tanous &properties) { 1761abe55efSEd Tanous if (ec) 1771abe55efSEd Tanous { 1781abe55efSEd Tanous BMCWEB_LOG_ERROR 1796c34de48SEd Tanous << "DBUS response error " << ec; 180f12894f8SJason M. Bills messages::internalError(aResp->res); 181c5b2abe0SLewanczyk, Dawid return; 182c5b2abe0SLewanczyk, Dawid } 1836c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 1846c34de48SEd Tanous << properties.size() 185c5b2abe0SLewanczyk, Dawid << "Cpu properties."; 18604a258f4SEd Tanous for (const auto &property : properties) 1871abe55efSEd Tanous { 18804a258f4SEd Tanous if (property.first == 18904a258f4SEd Tanous "ProcessorFamily") 1901abe55efSEd Tanous { 191a0803efaSEd Tanous const std::string *value = 1921b6b96c5SEd Tanous sdbusplus::message:: 1931b6b96c5SEd Tanous variant_ns::get_if< 1941b6b96c5SEd Tanous std::string>( 1951b6b96c5SEd Tanous &property.second); 1961abe55efSEd Tanous if (value != nullptr) 1971abe55efSEd Tanous { 19804a258f4SEd Tanous nlohmann::json 19904a258f4SEd Tanous &procSummary = 2001abe55efSEd Tanous aResp->res.jsonValue 2016c34de48SEd Tanous ["ProcessorSumm" 20204a258f4SEd Tanous "ary"]; 20304a258f4SEd Tanous nlohmann::json &procCount = 20404a258f4SEd Tanous procSummary["Count"]; 20504a258f4SEd Tanous 20604a258f4SEd Tanous procCount = 20704a258f4SEd Tanous procCount.get<int>() + 208c5b2abe0SLewanczyk, Dawid 1; 20904a258f4SEd Tanous procSummary["Status"] 21004a258f4SEd Tanous ["State"] = 211c5b2abe0SLewanczyk, Dawid "Enabled"; 21204a258f4SEd Tanous procSummary["Model"] = 21304a258f4SEd Tanous *value; 214c5b2abe0SLewanczyk, Dawid } 215c5b2abe0SLewanczyk, Dawid } 216c5b2abe0SLewanczyk, Dawid } 217c5b2abe0SLewanczyk, Dawid }, 21804a258f4SEd Tanous connection.first, path, 2196c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 2206c34de48SEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu"); 2211abe55efSEd Tanous } 22204a258f4SEd Tanous else if (interfaceName == 22304a258f4SEd Tanous "xyz.openbmc_project.Common.UUID") 2241abe55efSEd Tanous { 2251abe55efSEd Tanous BMCWEB_LOG_DEBUG 22604a258f4SEd Tanous << "Found UUID, now get its properties."; 22755c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 2281abe55efSEd Tanous [aResp]( 2291abe55efSEd Tanous const boost::system::error_code ec, 2306c34de48SEd Tanous const std::vector< 2316c34de48SEd Tanous std::pair<std::string, VariantType>> 2321abe55efSEd Tanous &properties) { 2331abe55efSEd Tanous if (ec) 2341abe55efSEd Tanous { 2351abe55efSEd Tanous BMCWEB_LOG_DEBUG 2366c34de48SEd Tanous << "DBUS response error " << ec; 237f12894f8SJason M. Bills messages::internalError(aResp->res); 238c5b2abe0SLewanczyk, Dawid return; 239c5b2abe0SLewanczyk, Dawid } 2406c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " 2416c34de48SEd Tanous << properties.size() 242c5b2abe0SLewanczyk, Dawid << "UUID properties."; 2431abe55efSEd Tanous for (const std::pair<std::string, 24404a258f4SEd Tanous VariantType> 24504a258f4SEd Tanous &property : properties) 2461abe55efSEd Tanous { 24704a258f4SEd Tanous if (property.first == "BIOSVer") 2481abe55efSEd Tanous { 249c5b2abe0SLewanczyk, Dawid const std::string *value = 2501b6b96c5SEd Tanous sdbusplus::message:: 2511b6b96c5SEd Tanous variant_ns::get_if< 2521b6b96c5SEd Tanous std::string>( 2531b6b96c5SEd Tanous &property.second); 2541abe55efSEd Tanous if (value != nullptr) 2551abe55efSEd Tanous { 2561abe55efSEd Tanous aResp->res.jsonValue 2571abe55efSEd Tanous ["BiosVersion"] = 2581abe55efSEd Tanous *value; 259c5b2abe0SLewanczyk, Dawid } 260c5b2abe0SLewanczyk, Dawid } 26104a258f4SEd Tanous if (property.first == "UUID") 2621abe55efSEd Tanous { 263c5b2abe0SLewanczyk, Dawid const std::string *value = 2641b6b96c5SEd Tanous sdbusplus::message:: 2651b6b96c5SEd Tanous variant_ns::get_if< 2661b6b96c5SEd Tanous std::string>( 2671b6b96c5SEd Tanous &property.second); 26804a258f4SEd Tanous 2691abe55efSEd Tanous if (value != nullptr) 2701abe55efSEd Tanous { 27104a258f4SEd Tanous std::string valueStr = 2721abe55efSEd Tanous *value; 27304a258f4SEd Tanous if (valueStr.size() == 32) 2741abe55efSEd Tanous { 27504a258f4SEd Tanous valueStr.insert(8, 1, 27604a258f4SEd Tanous '-'); 27704a258f4SEd Tanous valueStr.insert(13, 1, 27804a258f4SEd Tanous '-'); 27904a258f4SEd Tanous valueStr.insert(18, 1, 28004a258f4SEd Tanous '-'); 28104a258f4SEd Tanous valueStr.insert(23, 1, 28204a258f4SEd Tanous '-'); 28304a258f4SEd Tanous } 28404a258f4SEd Tanous BMCWEB_LOG_DEBUG 28504a258f4SEd Tanous << "UUID = " 28604a258f4SEd Tanous << valueStr; 2876c34de48SEd Tanous aResp->res 2886c34de48SEd Tanous .jsonValue["UUID"] = 28904a258f4SEd Tanous valueStr; 290c5b2abe0SLewanczyk, Dawid } 291c5b2abe0SLewanczyk, Dawid } 292c5b2abe0SLewanczyk, Dawid } 293c5b2abe0SLewanczyk, Dawid }, 29404a258f4SEd Tanous connection.first, path, 2956c34de48SEd Tanous "org.freedesktop.DBus.Properties", "GetAll", 2961abe55efSEd Tanous "xyz.openbmc_project.Common.UUID"); 297c5b2abe0SLewanczyk, Dawid } 298c5b2abe0SLewanczyk, Dawid } 299c5b2abe0SLewanczyk, Dawid } 300c5b2abe0SLewanczyk, Dawid } 301c5b2abe0SLewanczyk, Dawid } 3021abe55efSEd Tanous if (foundName == false) 3031abe55efSEd Tanous { 304f12894f8SJason M. Bills messages::internalError(aResp->res); 305c5b2abe0SLewanczyk, Dawid } 306c5b2abe0SLewanczyk, Dawid }, 307c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", 308c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/object_mapper", 309c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.ObjectMapper", "GetSubTree", 3106617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 3116617338dSEd Tanous std::array<const char *, 5>{ 3126617338dSEd Tanous "xyz.openbmc_project.Inventory.Decorator.Asset", 3136617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Cpu", 3146617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Dimm", 3156617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.System", 3166617338dSEd Tanous "xyz.openbmc_project.Common.UUID", 3176617338dSEd Tanous }); 318c5b2abe0SLewanczyk, Dawid } 319c5b2abe0SLewanczyk, Dawid 320c5b2abe0SLewanczyk, Dawid /** 321c5b2abe0SLewanczyk, Dawid * @brief Retrieves identify led group properties over dbus 322c5b2abe0SLewanczyk, Dawid * 323c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 324c5b2abe0SLewanczyk, Dawid * @param[in] callback Callback for process retrieved data. 325c5b2abe0SLewanczyk, Dawid * 326c5b2abe0SLewanczyk, Dawid * @return None. 327c5b2abe0SLewanczyk, Dawid */ 328c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 329a0803efaSEd Tanous void getLedGroupIdentify(std::shared_ptr<AsyncResp> aResp, 3301abe55efSEd Tanous CallbackFunc &&callback) 3311abe55efSEd Tanous { 33255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get led groups"; 33355c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 3341abe55efSEd Tanous [aResp{std::move(aResp)}, 3356617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code &ec, 3361abe55efSEd Tanous const ManagedObjectsType &resp) { 3371abe55efSEd Tanous if (ec) 3381abe55efSEd Tanous { 33955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 340f12894f8SJason M. Bills messages::internalError(aResp->res); 341c5b2abe0SLewanczyk, Dawid return; 342c5b2abe0SLewanczyk, Dawid } 3436c34de48SEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << "led group objects."; 3441abe55efSEd Tanous for (const auto &objPath : resp) 3451abe55efSEd Tanous { 346c5b2abe0SLewanczyk, Dawid const std::string &path = objPath.first; 3471abe55efSEd Tanous if (path.rfind("enclosure_identify") != std::string::npos) 3481abe55efSEd Tanous { 3491abe55efSEd Tanous for (const auto &interface : objPath.second) 3501abe55efSEd Tanous { 3516c34de48SEd Tanous if (interface.first == "xyz.openbmc_project.Led.Group") 3521abe55efSEd Tanous { 3531abe55efSEd Tanous for (const auto &property : interface.second) 3541abe55efSEd Tanous { 3551abe55efSEd Tanous if (property.first == "Asserted") 3561abe55efSEd Tanous { 357c5b2abe0SLewanczyk, Dawid const bool *asserted = 358*abf2add6SEd Tanous std::get_if<bool>(&property.second); 3591abe55efSEd Tanous if (nullptr != asserted) 3601abe55efSEd Tanous { 361c5b2abe0SLewanczyk, Dawid callback(*asserted, aResp); 3621abe55efSEd Tanous } 3631abe55efSEd Tanous else 3641abe55efSEd Tanous { 365c5b2abe0SLewanczyk, Dawid callback(false, aResp); 366c5b2abe0SLewanczyk, Dawid } 367c5b2abe0SLewanczyk, Dawid } 368c5b2abe0SLewanczyk, Dawid } 369c5b2abe0SLewanczyk, Dawid } 370c5b2abe0SLewanczyk, Dawid } 371c5b2abe0SLewanczyk, Dawid } 372c5b2abe0SLewanczyk, Dawid } 373c5b2abe0SLewanczyk, Dawid }, 374c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 3756c34de48SEd Tanous "/xyz/openbmc_project/led/groups", "org.freedesktop.DBus.ObjectManager", 3766c34de48SEd Tanous "GetManagedObjects"); 377c5b2abe0SLewanczyk, Dawid } 378c5b2abe0SLewanczyk, Dawid 379c5b2abe0SLewanczyk, Dawid template <typename CallbackFunc> 3806c34de48SEd Tanous void getLedIdentify(std::shared_ptr<AsyncResp> aResp, CallbackFunc &&callback) 3811abe55efSEd Tanous { 38255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get identify led properties"; 38355c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 3846617338dSEd Tanous [aResp, 3856617338dSEd Tanous callback{std::move(callback)}](const boost::system::error_code ec, 386c5b2abe0SLewanczyk, Dawid const PropertiesType &properties) { 3871abe55efSEd Tanous if (ec) 3881abe55efSEd Tanous { 38955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 390f12894f8SJason M. Bills messages::internalError(aResp->res); 391c5b2abe0SLewanczyk, Dawid return; 392c5b2abe0SLewanczyk, Dawid } 3931abe55efSEd Tanous BMCWEB_LOG_DEBUG << "Got " << properties.size() 3941abe55efSEd Tanous << "led properties."; 395c5b2abe0SLewanczyk, Dawid std::string output; 3961abe55efSEd Tanous for (const auto &property : properties) 3971abe55efSEd Tanous { 3981abe55efSEd Tanous if (property.first == "State") 3991abe55efSEd Tanous { 400c5b2abe0SLewanczyk, Dawid const std::string *s = 401*abf2add6SEd Tanous std::get_if<std::string>(&property.second); 4021abe55efSEd Tanous if (nullptr != s) 4031abe55efSEd Tanous { 40455c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Identify Led State: " << *s; 405c5b2abe0SLewanczyk, Dawid const auto pos = s->rfind('.'); 4061abe55efSEd Tanous if (pos != std::string::npos) 4071abe55efSEd Tanous { 408c5b2abe0SLewanczyk, Dawid auto led = s->substr(pos + 1); 4091abe55efSEd Tanous for (const std::pair<const char *, const char *> 4101abe55efSEd Tanous &p : 4111abe55efSEd Tanous std::array< 4126c34de48SEd Tanous std::pair<const char *, const char *>, 3>{ 4136c34de48SEd Tanous {{"On", "Lit"}, 414c5b2abe0SLewanczyk, Dawid {"Blink", "Blinking"}, 4151abe55efSEd Tanous {"Off", "Off"}}}) 4161abe55efSEd Tanous { 4171abe55efSEd Tanous if (led == p.first) 4181abe55efSEd Tanous { 419c5b2abe0SLewanczyk, Dawid output = p.second; 420c5b2abe0SLewanczyk, Dawid } 421c5b2abe0SLewanczyk, Dawid } 422c5b2abe0SLewanczyk, Dawid } 423c5b2abe0SLewanczyk, Dawid } 424c5b2abe0SLewanczyk, Dawid } 425c5b2abe0SLewanczyk, Dawid } 426c5b2abe0SLewanczyk, Dawid callback(output, aResp); 427c5b2abe0SLewanczyk, Dawid }, 428c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 429c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 430c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "GetAll", 431c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical"); 432c5b2abe0SLewanczyk, Dawid } 433c5b2abe0SLewanczyk, Dawid 434c5b2abe0SLewanczyk, Dawid /** 435c5b2abe0SLewanczyk, Dawid * @brief Retrieves host state properties over dbus 436c5b2abe0SLewanczyk, Dawid * 437c5b2abe0SLewanczyk, Dawid * @param[in] aResp Shared pointer for completing asynchronous calls. 438c5b2abe0SLewanczyk, Dawid * 439c5b2abe0SLewanczyk, Dawid * @return None. 440c5b2abe0SLewanczyk, Dawid */ 441a0803efaSEd Tanous void getHostState(std::shared_ptr<AsyncResp> aResp) 4421abe55efSEd Tanous { 44355c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Get host information."; 44455c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 445*abf2add6SEd Tanous [aResp{std::move(aResp)}](const boost::system::error_code ec, 446*abf2add6SEd Tanous const std::variant<std::string> &hostState) { 4471abe55efSEd Tanous if (ec) 4481abe55efSEd Tanous { 44955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 450f12894f8SJason M. Bills messages::internalError(aResp->res); 451c5b2abe0SLewanczyk, Dawid return; 452c5b2abe0SLewanczyk, Dawid } 4536617338dSEd Tanous 454*abf2add6SEd Tanous const std::string *s = std::get_if<std::string>(&hostState); 45555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Host state: " << *s; 4566617338dSEd Tanous if (s != nullptr) 4571abe55efSEd Tanous { 458c5b2abe0SLewanczyk, Dawid // Verify Host State 45994732661SAndrew Geissler if (*s == "xyz.openbmc_project.State.Host.HostState.Running") 4601abe55efSEd Tanous { 46155c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "On"; 4626617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Enabled"; 4631abe55efSEd Tanous } 4641abe55efSEd Tanous else 4651abe55efSEd Tanous { 46655c7b7a2SEd Tanous aResp->res.jsonValue["PowerState"] = "Off"; 4676617338dSEd Tanous aResp->res.jsonValue["Status"]["State"] = "Disabled"; 468c5b2abe0SLewanczyk, Dawid } 469c5b2abe0SLewanczyk, Dawid } 470c5b2abe0SLewanczyk, Dawid }, 4716c34de48SEd Tanous "xyz.openbmc_project.State.Host", "/xyz/openbmc_project/state/host0", 4726617338dSEd Tanous "org.freedesktop.DBus.Properties", "Get", 4736617338dSEd Tanous "xyz.openbmc_project.State.Host", "CurrentHostState"); 474c5b2abe0SLewanczyk, Dawid } 475c5b2abe0SLewanczyk, Dawid 476c5b2abe0SLewanczyk, Dawid /** 477c5b2abe0SLewanczyk, Dawid * SystemsCollection derived class for delivering ComputerSystems Collection 478c5b2abe0SLewanczyk, Dawid * Schema 479c5b2abe0SLewanczyk, Dawid */ 4801abe55efSEd Tanous class SystemsCollection : public Node 4811abe55efSEd Tanous { 482c5b2abe0SLewanczyk, Dawid public: 4831abe55efSEd Tanous SystemsCollection(CrowApp &app) : Node(app, "/redfish/v1/Systems/") 4841abe55efSEd Tanous { 485c5b2abe0SLewanczyk, Dawid entityPrivileges = { 486c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 487c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 488c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 489c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 490c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 491c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 492c5b2abe0SLewanczyk, Dawid } 493c5b2abe0SLewanczyk, Dawid 494c5b2abe0SLewanczyk, Dawid private: 49555c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 4961abe55efSEd Tanous const std::vector<std::string> ¶ms) override 4971abe55efSEd Tanous { 4986617338dSEd Tanous BMCWEB_LOG_DEBUG << "Get list of available boards."; 4996617338dSEd Tanous std::shared_ptr<AsyncResp> asyncResp = std::make_shared<AsyncResp>(res); 5000f74e643SEd Tanous res.jsonValue["@odata.type"] = 5010f74e643SEd Tanous "#ComputerSystemCollection.ComputerSystemCollection"; 5020f74e643SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems"; 5030f74e643SEd Tanous res.jsonValue["@odata.context"] = 5040f74e643SEd Tanous "/redfish/v1/" 5050f74e643SEd Tanous "$metadata#ComputerSystemCollection.ComputerSystemCollection"; 5060f74e643SEd Tanous res.jsonValue["Name"] = "Computer System Collection"; 5076617338dSEd Tanous crow::connections::systemBus->async_method_call( 5086617338dSEd Tanous [asyncResp](const boost::system::error_code ec, 5096617338dSEd Tanous const std::vector<std::string> &resp) { 5106617338dSEd Tanous if (ec) 5111abe55efSEd Tanous { 512f12894f8SJason M. Bills messages::internalError(asyncResp->res); 5136617338dSEd Tanous return; 5146617338dSEd Tanous } 5156617338dSEd Tanous BMCWEB_LOG_DEBUG << "Got " << resp.size() << " boards."; 5166617338dSEd Tanous 517c5b2abe0SLewanczyk, Dawid // ... prepare json array with appropriate @odata.id links 5186617338dSEd Tanous nlohmann::json &boardArray = 5196617338dSEd Tanous asyncResp->res.jsonValue["Members"]; 5206617338dSEd Tanous boardArray = nlohmann::json::array(); 5216617338dSEd Tanous 5226617338dSEd Tanous // Iterate over all retrieved ObjectPaths. 5236617338dSEd Tanous for (const std::string &objpath : resp) 5246617338dSEd Tanous { 5256617338dSEd Tanous std::size_t lastPos = objpath.rfind("/"); 5266617338dSEd Tanous if (lastPos != std::string::npos) 5271abe55efSEd Tanous { 528c5b2abe0SLewanczyk, Dawid boardArray.push_back( 5296617338dSEd Tanous {{"@odata.id", "/redfish/v1/Systems/" + 5306617338dSEd Tanous objpath.substr(lastPos + 1)}}); 531c5b2abe0SLewanczyk, Dawid } 5321abe55efSEd Tanous } 5336617338dSEd Tanous 5346617338dSEd Tanous asyncResp->res.jsonValue["Members@odata.count"] = 5356617338dSEd Tanous boardArray.size(); 5366617338dSEd Tanous }, 5376617338dSEd Tanous "xyz.openbmc_project.ObjectMapper", 5386617338dSEd Tanous "/xyz/openbmc_project/object_mapper", 5396617338dSEd Tanous "xyz.openbmc_project.ObjectMapper", "GetSubTreePaths", 5406617338dSEd Tanous "/xyz/openbmc_project/inventory", int32_t(0), 5416617338dSEd Tanous std::array<const char *, 1>{ 5426617338dSEd Tanous "xyz.openbmc_project.Inventory.Item.Board"}); 543c5b2abe0SLewanczyk, Dawid } 544c5b2abe0SLewanczyk, Dawid }; 545c5b2abe0SLewanczyk, Dawid 546c5b2abe0SLewanczyk, Dawid /** 547cc340dd9SEd Tanous * SystemActionsReset class supports handle POST method for Reset action. 548cc340dd9SEd Tanous * The class retrieves and sends data directly to D-Bus. 549cc340dd9SEd Tanous */ 550cc340dd9SEd Tanous class SystemActionsReset : public Node 551cc340dd9SEd Tanous { 552cc340dd9SEd Tanous public: 553cc340dd9SEd Tanous SystemActionsReset(CrowApp &app) : 554cc340dd9SEd Tanous Node(app, "/redfish/v1/Systems/<str>/Actions/ComputerSystem.Reset/", 555cc340dd9SEd Tanous std::string()) 556cc340dd9SEd Tanous { 557cc340dd9SEd Tanous entityPrivileges = { 558cc340dd9SEd Tanous {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 559cc340dd9SEd Tanous } 560cc340dd9SEd Tanous 561cc340dd9SEd Tanous private: 562cc340dd9SEd Tanous /** 563cc340dd9SEd Tanous * Function handles POST method request. 564cc340dd9SEd Tanous * Analyzes POST body message before sends Reset request data to D-Bus. 565cc340dd9SEd Tanous */ 566cc340dd9SEd Tanous void doPost(crow::Response &res, const crow::Request &req, 567cc340dd9SEd Tanous const std::vector<std::string> ¶ms) override 568cc340dd9SEd Tanous { 569cc340dd9SEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 570cc340dd9SEd Tanous 5719712f8acSEd Tanous std::string resetType; 5729712f8acSEd Tanous if (!json_util::readJson(req, res, "ResetType", resetType)) 573cc340dd9SEd Tanous { 574cc340dd9SEd Tanous return; 575cc340dd9SEd Tanous } 576cc340dd9SEd Tanous 5779712f8acSEd Tanous if (resetType == "ForceOff") 578cc340dd9SEd Tanous { 579cc340dd9SEd Tanous // Force off acts on the chassis 580cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 581cc340dd9SEd Tanous [asyncResp](const boost::system::error_code ec) { 582cc340dd9SEd Tanous if (ec) 583cc340dd9SEd Tanous { 5849712f8acSEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 585f12894f8SJason M. Bills messages::internalError(asyncResp->res); 586cc340dd9SEd Tanous return; 587cc340dd9SEd Tanous } 588cc340dd9SEd Tanous // TODO Consider support polling mechanism to verify 589cc340dd9SEd Tanous // status of host and chassis after execute the 590cc340dd9SEd Tanous // requested action. 591f12894f8SJason M. Bills messages::success(asyncResp->res); 592cc340dd9SEd Tanous }, 593cc340dd9SEd Tanous "xyz.openbmc_project.State.Chassis", 594cc340dd9SEd Tanous "/xyz/openbmc_project/state/chassis0", 595cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 5969712f8acSEd Tanous "xyz.openbmc_project.State.Chassis", "RequestedPowerTransition", 597*abf2add6SEd Tanous std::variant<std::string>{ 5989712f8acSEd Tanous "xyz.openbmc_project.State.Chassis.Transition.Off"}); 599cc340dd9SEd Tanous return; 600cc340dd9SEd Tanous } 601cc340dd9SEd Tanous // all other actions operate on the host 602cc340dd9SEd Tanous std::string command; 603cc340dd9SEd Tanous // Execute Reset Action regarding to each reset type. 6049712f8acSEd Tanous if (resetType == "On") 605cc340dd9SEd Tanous { 606cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.On"; 607cc340dd9SEd Tanous } 6089712f8acSEd Tanous else if (resetType == "GracefulShutdown") 609cc340dd9SEd Tanous { 610cc340dd9SEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Off"; 611cc340dd9SEd Tanous } 6129712f8acSEd Tanous else if (resetType == "GracefulRestart") 613cc340dd9SEd Tanous { 6149712f8acSEd Tanous command = "xyz.openbmc_project.State.Host.Transition.Reboot"; 615cc340dd9SEd Tanous } 616cc340dd9SEd Tanous else 617cc340dd9SEd Tanous { 618f12894f8SJason M. Bills messages::actionParameterUnknown(res, "Reset", resetType); 619cc340dd9SEd Tanous return; 620cc340dd9SEd Tanous } 621cc340dd9SEd Tanous 622cc340dd9SEd Tanous crow::connections::systemBus->async_method_call( 623cc340dd9SEd Tanous [asyncResp](const boost::system::error_code ec) { 624cc340dd9SEd Tanous if (ec) 625cc340dd9SEd Tanous { 626cc340dd9SEd Tanous BMCWEB_LOG_ERROR << "D-Bus responses error: " << ec; 627f12894f8SJason M. Bills messages::internalError(asyncResp->res); 628cc340dd9SEd Tanous return; 629cc340dd9SEd Tanous } 630cc340dd9SEd Tanous // TODO Consider support polling mechanism to verify 631cc340dd9SEd Tanous // status of host and chassis after execute the 632cc340dd9SEd Tanous // requested action. 633f12894f8SJason M. Bills messages::success(asyncResp->res); 634cc340dd9SEd Tanous }, 635cc340dd9SEd Tanous "xyz.openbmc_project.State.Host", 636cc340dd9SEd Tanous "/xyz/openbmc_project/state/host0", 637cc340dd9SEd Tanous "org.freedesktop.DBus.Properties", "Set", 6389712f8acSEd Tanous "xyz.openbmc_project.State.Host", "RequestedHostTransition", 639*abf2add6SEd Tanous std::variant<std::string>{command}); 640cc340dd9SEd Tanous } 641cc340dd9SEd Tanous }; 642cc340dd9SEd Tanous 643cc340dd9SEd Tanous /** 6446617338dSEd Tanous * Systems derived class for delivering Computer Systems Schema. 645c5b2abe0SLewanczyk, Dawid */ 6461abe55efSEd Tanous class Systems : public Node 6471abe55efSEd Tanous { 648c5b2abe0SLewanczyk, Dawid public: 649c5b2abe0SLewanczyk, Dawid /* 650c5b2abe0SLewanczyk, Dawid * Default Constructor 651c5b2abe0SLewanczyk, Dawid */ 6521abe55efSEd Tanous Systems(CrowApp &app) : 6531abe55efSEd Tanous Node(app, "/redfish/v1/Systems/<str>/", std::string()) 6541abe55efSEd Tanous { 655c5b2abe0SLewanczyk, Dawid entityPrivileges = { 656c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::get, {{"Login"}}}, 657c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::head, {{"Login"}}}, 658c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::patch, {{"ConfigureComponents"}}}, 659c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::put, {{"ConfigureComponents"}}}, 660c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::delete_, {{"ConfigureComponents"}}}, 661c5b2abe0SLewanczyk, Dawid {boost::beast::http::verb::post, {{"ConfigureComponents"}}}}; 662c5b2abe0SLewanczyk, Dawid } 663c5b2abe0SLewanczyk, Dawid 664c5b2abe0SLewanczyk, Dawid private: 665c5b2abe0SLewanczyk, Dawid /** 666c5b2abe0SLewanczyk, Dawid * Functions triggers appropriate requests on DBus 667c5b2abe0SLewanczyk, Dawid */ 66855c7b7a2SEd Tanous void doGet(crow::Response &res, const crow::Request &req, 6691abe55efSEd Tanous const std::vector<std::string> ¶ms) override 6701abe55efSEd Tanous { 671c5b2abe0SLewanczyk, Dawid // Check if there is required param, truly entering this shall be 672c5b2abe0SLewanczyk, Dawid // impossible 6731abe55efSEd Tanous if (params.size() != 1) 6741abe55efSEd Tanous { 675f12894f8SJason M. Bills messages::internalError(res); 676c5b2abe0SLewanczyk, Dawid res.end(); 677c5b2abe0SLewanczyk, Dawid return; 678c5b2abe0SLewanczyk, Dawid } 679c5b2abe0SLewanczyk, Dawid 680c5b2abe0SLewanczyk, Dawid const std::string &name = params[0]; 681c5b2abe0SLewanczyk, Dawid 682bb3d9946SRapkiewicz, Pawel res.jsonValue["@odata.type"] = "#ComputerSystem.v1_5_1.ComputerSystem"; 6830f74e643SEd Tanous res.jsonValue["@odata.context"] = 6840f74e643SEd Tanous "/redfish/v1/$metadata#ComputerSystem.ComputerSystem"; 6850f74e643SEd Tanous res.jsonValue["SystemType"] = "Physical"; 6860f74e643SEd Tanous res.jsonValue["Description"] = "Computer System"; 6870f74e643SEd Tanous res.jsonValue["Boot"]["BootSourceOverrideEnabled"] = 6880f74e643SEd Tanous "Disabled"; // TODO(Dawid), get real boot data 6890f74e643SEd Tanous res.jsonValue["Boot"]["BootSourceOverrideTarget"] = 6900f74e643SEd Tanous "None"; // TODO(Dawid), get real boot data 6910f74e643SEd Tanous res.jsonValue["Boot"]["BootSourceOverrideMode"] = 6920f74e643SEd Tanous "Legacy"; // TODO(Dawid), get real boot data 6930f74e643SEd Tanous res.jsonValue["Boot"] 6940f74e643SEd Tanous ["BootSourceOverrideTarget@Redfish.AllowableValues"] = { 6950f74e643SEd Tanous "None", "Pxe", "Hdd", "Cd", 6960f74e643SEd Tanous "BiosSetup", "UefiShell", "Usb"}; // TODO(Dawid), get real boot 6970f74e643SEd Tanous // data 6980f74e643SEd Tanous res.jsonValue["ProcessorSummary"]["Count"] = 0; 6990f74e643SEd Tanous res.jsonValue["ProcessorSummary"]["Status"]["State"] = "Disabled"; 7000f74e643SEd Tanous res.jsonValue["MemorySummary"]["TotalSystemMemoryGiB"] = int(0); 7010f74e643SEd Tanous res.jsonValue["MemorySummary"]["Status"]["State"] = "Disabled"; 70204a258f4SEd Tanous res.jsonValue["@odata.id"] = "/redfish/v1/Systems/" + name; 70304a258f4SEd Tanous 704443c2934SRapkiewicz, Pawel res.jsonValue["Processors"] = { 705443c2934SRapkiewicz, Pawel {"@odata.id", "/redfish/v1/Systems/" + name + "/Processors"}}; 706443c2934SRapkiewicz, Pawel res.jsonValue["Memory"] = { 707443c2934SRapkiewicz, Pawel {"@odata.id", "/redfish/v1/Systems/" + name + "/Memory"}}; 708cc340dd9SEd Tanous // TODO Need to support ForceRestart. 709cc340dd9SEd Tanous res.jsonValue["Actions"]["#ComputerSystem.Reset"] = { 710cc340dd9SEd Tanous {"target", 711cc340dd9SEd Tanous "/redfish/v1/Systems/" + name + "/Actions/ComputerSystem.Reset"}, 712cc340dd9SEd Tanous {"ResetType@Redfish.AllowableValues", 713cc340dd9SEd Tanous {"On", "ForceOff", "GracefulRestart", "GracefulShutdown"}}}; 714c5b2abe0SLewanczyk, Dawid 715c4bf6374SJason M. Bills res.jsonValue["LogServices"] = { 716c4bf6374SJason M. Bills {"@odata.id", "/redfish/v1/Systems/" + name + "/LogServices"}}; 717c4bf6374SJason M. Bills 718a0803efaSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 719c5b2abe0SLewanczyk, Dawid 7206c34de48SEd Tanous getLedGroupIdentify( 721a0803efaSEd Tanous asyncResp, 722a0803efaSEd Tanous [&](const bool &asserted, const std::shared_ptr<AsyncResp> &aResp) { 7231abe55efSEd Tanous if (asserted) 7241abe55efSEd Tanous { 725c5b2abe0SLewanczyk, Dawid // If led group is asserted, then another call is needed to 726c5b2abe0SLewanczyk, Dawid // get led status 7276c34de48SEd Tanous getLedIdentify( 728a0803efaSEd Tanous aResp, [](const std::string &ledStatus, 729a0803efaSEd Tanous const std::shared_ptr<AsyncResp> &aResp) { 7301abe55efSEd Tanous if (!ledStatus.empty()) 7311abe55efSEd Tanous { 7321abe55efSEd Tanous aResp->res.jsonValue["IndicatorLED"] = 7331abe55efSEd Tanous ledStatus; 734c5b2abe0SLewanczyk, Dawid } 735c5b2abe0SLewanczyk, Dawid }); 7361abe55efSEd Tanous } 7371abe55efSEd Tanous else 7381abe55efSEd Tanous { 73955c7b7a2SEd Tanous aResp->res.jsonValue["IndicatorLED"] = "Off"; 740c5b2abe0SLewanczyk, Dawid } 741c5b2abe0SLewanczyk, Dawid }); 7426c34de48SEd Tanous getComputerSystem(asyncResp, name); 7436c34de48SEd Tanous getHostState(asyncResp); 744c5b2abe0SLewanczyk, Dawid } 745c5b2abe0SLewanczyk, Dawid 74655c7b7a2SEd Tanous void doPatch(crow::Response &res, const crow::Request &req, 7471abe55efSEd Tanous const std::vector<std::string> ¶ms) override 7481abe55efSEd Tanous { 749c5b2abe0SLewanczyk, Dawid // Check if there is required param, truly entering this shall be 750c5b2abe0SLewanczyk, Dawid // impossible 7516617338dSEd Tanous auto asyncResp = std::make_shared<AsyncResp>(res); 7521abe55efSEd Tanous if (params.size() != 1) 7531abe55efSEd Tanous { 754f12894f8SJason M. Bills messages::internalError(asyncResp->res); 755c5b2abe0SLewanczyk, Dawid return; 756c5b2abe0SLewanczyk, Dawid } 757c5b2abe0SLewanczyk, Dawid 7586617338dSEd Tanous const std::string &name = params[0]; 7596617338dSEd Tanous 7600f74e643SEd Tanous messages::success(asyncResp->res); 761c5b2abe0SLewanczyk, Dawid 7629712f8acSEd Tanous std::string indicatorLedTemp; 763a24526dcSEd Tanous std::optional<std::string> indicatorLed = indicatorLedTemp; 7649712f8acSEd Tanous if (!json_util::readJson(req, res, "IndicatorLed", indicatorLed)) 7656617338dSEd Tanous { 7666617338dSEd Tanous return; 7676617338dSEd Tanous } 7686617338dSEd Tanous 7699712f8acSEd Tanous if (indicatorLed) 7706617338dSEd Tanous { 7719712f8acSEd Tanous std::string dbusLedState; 7729712f8acSEd Tanous if (*indicatorLed == "On") 7739712f8acSEd Tanous { 7749712f8acSEd Tanous dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Lit"; 7756617338dSEd Tanous } 7769712f8acSEd Tanous else if (*indicatorLed == "Blink") 7776617338dSEd Tanous { 7786617338dSEd Tanous dbusLedState = 7796617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Blinking"; 7806617338dSEd Tanous } 7819712f8acSEd Tanous else if (*indicatorLed == "Off") 7826617338dSEd Tanous { 7839712f8acSEd Tanous dbusLedState = "xyz.openbmc_project.Led.Physical.Action.Off"; 7846617338dSEd Tanous } 7856617338dSEd Tanous else 7866617338dSEd Tanous { 787a08b46ccSJason M. Bills messages::propertyValueNotInList(res, *indicatorLed, 788a08b46ccSJason M. Bills "IndicatorLED"); 7896617338dSEd Tanous return; 7906617338dSEd Tanous } 7916617338dSEd Tanous 7926c34de48SEd Tanous getHostState(asyncResp); 7936c34de48SEd Tanous getComputerSystem(asyncResp, name); 794c5b2abe0SLewanczyk, Dawid 795c5b2abe0SLewanczyk, Dawid // Update led group 79655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led group."; 79755c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 7986617338dSEd Tanous [asyncResp{std::move(asyncResp)}]( 799c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 8001abe55efSEd Tanous if (ec) 8011abe55efSEd Tanous { 80255c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 803f12894f8SJason M. Bills messages::internalError(asyncResp->res); 804c5b2abe0SLewanczyk, Dawid return; 805c5b2abe0SLewanczyk, Dawid } 80655c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led group update done."; 807c5b2abe0SLewanczyk, Dawid }, 808c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.GroupManager", 809c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/groups/enclosure_identify", 810c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 811c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Group", "Asserted", 812*abf2add6SEd Tanous std::variant<bool>( 8136617338dSEd Tanous (dbusLedState == 8146617338dSEd Tanous "xyz.openbmc_project.Led.Physical.Action.Off" 8156617338dSEd Tanous ? false 8166617338dSEd Tanous : true))); 817c5b2abe0SLewanczyk, Dawid // Update identify led status 81855c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Update led SoftwareInventoryCollection."; 81955c7b7a2SEd Tanous crow::connections::systemBus->async_method_call( 8206617338dSEd Tanous [asyncResp{std::move(asyncResp)}, 8219712f8acSEd Tanous indicatorLed{std::move(*indicatorLed)}]( 822c5b2abe0SLewanczyk, Dawid const boost::system::error_code ec) { 8231abe55efSEd Tanous if (ec) 8241abe55efSEd Tanous { 82555c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "DBUS response error " << ec; 826f12894f8SJason M. Bills messages::internalError(asyncResp->res); 827c5b2abe0SLewanczyk, Dawid return; 828c5b2abe0SLewanczyk, Dawid } 82955c7b7a2SEd Tanous BMCWEB_LOG_DEBUG << "Led state update done."; 830c5b2abe0SLewanczyk, Dawid }, 831c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.LED.Controller.identify", 832c5b2abe0SLewanczyk, Dawid "/xyz/openbmc_project/led/physical/identify", 833c5b2abe0SLewanczyk, Dawid "org.freedesktop.DBus.Properties", "Set", 834c5b2abe0SLewanczyk, Dawid "xyz.openbmc_project.Led.Physical", "State", 835*abf2add6SEd Tanous std::variant<std::string>(dbusLedState)); 8366617338dSEd Tanous } 837c5b2abe0SLewanczyk, Dawid } 838c5b2abe0SLewanczyk, Dawid }; 839c5b2abe0SLewanczyk, Dawid } // namespace redfish 840