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