1081ebf06SWludzik, Jozef #pragma once 2081ebf06SWludzik, Jozef 34dbb8aeaSWludzik, Jozef #include "dbus_utility.hpp" 4*3ccb3adbSEd Tanous #include "http/utility.hpp" 5*3ccb3adbSEd Tanous #include "logging.hpp" 6456cd875SSzymon Dompke #include "utility.hpp" 74dbb8aeaSWludzik, Jozef 8*3ccb3adbSEd Tanous #include <boost/container/flat_map.hpp> 9*3ccb3adbSEd Tanous #include <boost/container/flat_set.hpp> 10*3ccb3adbSEd Tanous #include <sdbusplus/message/native_types.hpp> 11*3ccb3adbSEd Tanous 12*3ccb3adbSEd Tanous #include <string> 13*3ccb3adbSEd Tanous 14081ebf06SWludzik, Jozef namespace redfish 15081ebf06SWludzik, Jozef { 16081ebf06SWludzik, Jozef 17081ebf06SWludzik, Jozef namespace telemetry 18081ebf06SWludzik, Jozef { 19081ebf06SWludzik, Jozef constexpr const char* service = "xyz.openbmc_project.Telemetry"; 20081ebf06SWludzik, Jozef constexpr const char* reportInterface = "xyz.openbmc_project.Telemetry.Report"; 21081ebf06SWludzik, Jozef 22081ebf06SWludzik, Jozef inline std::string getDbusReportPath(const std::string& id) 23081ebf06SWludzik, Jozef { 24163994a8SSzymon Dompke sdbusplus::message::object_path reportsPath( 25163994a8SSzymon Dompke "/xyz/openbmc_project/Telemetry/Reports/TelemetryService"); 26163994a8SSzymon Dompke return {reportsPath / id}; 27163994a8SSzymon Dompke } 28163994a8SSzymon Dompke 29163994a8SSzymon Dompke inline std::string getDbusTriggerPath(const std::string& id) 30163994a8SSzymon Dompke { 31163994a8SSzymon Dompke sdbusplus::message::object_path triggersPath( 32163994a8SSzymon Dompke "/xyz/openbmc_project/Telemetry/Triggers/TelemetryService"); 33163994a8SSzymon Dompke return {triggersPath / id}; 34081ebf06SWludzik, Jozef } 35081ebf06SWludzik, Jozef 36ca1600c1SSzymon Dompke struct IncorrectMetricUri 37ca1600c1SSzymon Dompke { 38ca1600c1SSzymon Dompke std::string uri; 39ca1600c1SSzymon Dompke size_t index; 40ca1600c1SSzymon Dompke }; 41ca1600c1SSzymon Dompke 42ca1600c1SSzymon Dompke inline std::optional<IncorrectMetricUri> getChassisSensorNode( 43ca1600c1SSzymon Dompke const std::vector<std::string>& uris, 44ca1600c1SSzymon Dompke boost::container::flat_set<std::pair<std::string, std::string>>& matched) 45ca1600c1SSzymon Dompke { 46ca1600c1SSzymon Dompke size_t uriIdx = 0; 47ca1600c1SSzymon Dompke for (const std::string& uri : uris) 48ca1600c1SSzymon Dompke { 49ca1600c1SSzymon Dompke boost::urls::result<boost::urls::url_view> parsed = 50ca1600c1SSzymon Dompke boost::urls::parse_relative_ref(uri); 51ca1600c1SSzymon Dompke 52ca1600c1SSzymon Dompke if (!parsed) 53ca1600c1SSzymon Dompke { 54ca1600c1SSzymon Dompke BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node " 55ca1600c1SSzymon Dompke "from " 56ca1600c1SSzymon Dompke << uri; 57ca1600c1SSzymon Dompke return std::make_optional<IncorrectMetricUri>({uri, uriIdx}); 58ca1600c1SSzymon Dompke } 59ca1600c1SSzymon Dompke 60ca1600c1SSzymon Dompke std::string chassis; 61ca1600c1SSzymon Dompke std::string node; 62ca1600c1SSzymon Dompke 63ca1600c1SSzymon Dompke if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis", 64ca1600c1SSzymon Dompke std::ref(chassis), std::ref(node))) 65ca1600c1SSzymon Dompke { 66ca1600c1SSzymon Dompke matched.emplace(std::move(chassis), std::move(node)); 67ca1600c1SSzymon Dompke uriIdx++; 68ca1600c1SSzymon Dompke continue; 69ca1600c1SSzymon Dompke } 70ca1600c1SSzymon Dompke 71ca1600c1SSzymon Dompke // Those 2 segments cannot be validated here, as we don't know which 72ca1600c1SSzymon Dompke // sensors exist at the moment of parsing. 73ca1600c1SSzymon Dompke std::string ignoredSenorId; 74ca1600c1SSzymon Dompke 75ca1600c1SSzymon Dompke if (crow::utility::readUrlSegments(*parsed, "redfish", "v1", "Chassis", 76ca1600c1SSzymon Dompke std::ref(chassis), "Sensors", 77c1d019a6SEd Tanous std::ref(ignoredSenorId))) 78ca1600c1SSzymon Dompke { 79ca1600c1SSzymon Dompke matched.emplace(std::move(chassis), "Sensors"); 80ca1600c1SSzymon Dompke uriIdx++; 81ca1600c1SSzymon Dompke continue; 82ca1600c1SSzymon Dompke } 83ca1600c1SSzymon Dompke 84ca1600c1SSzymon Dompke BMCWEB_LOG_ERROR << "Failed to get chassis and sensor Node " 85ca1600c1SSzymon Dompke "from " 86ca1600c1SSzymon Dompke << uri; 87ca1600c1SSzymon Dompke return std::make_optional<IncorrectMetricUri>({uri, uriIdx}); 88ca1600c1SSzymon Dompke } 89ca1600c1SSzymon Dompke return std::nullopt; 90ca1600c1SSzymon Dompke } 91ca1600c1SSzymon Dompke 92081ebf06SWludzik, Jozef } // namespace telemetry 93081ebf06SWludzik, Jozef } // namespace redfish 94