13e1cb49dSSouvik Roy #include "config.h" 23e1cb49dSSouvik Roy 33e1cb49dSSouvik Roy #include "constants.hpp" 43e1cb49dSSouvik Roy #include "logger.hpp" 53e1cb49dSSouvik Roy #include "utility/dbus_utility.hpp" 63e1cb49dSSouvik Roy 73e1cb49dSSouvik Roy #include <CLI/CLI.hpp> 83e1cb49dSSouvik Roy 93e1cb49dSSouvik Roy #include <chrono> 103e1cb49dSSouvik Roy #include <thread> 113e1cb49dSSouvik Roy 123e1cb49dSSouvik Roy /** 133e1cb49dSSouvik Roy * @brief API to check for VPD collection status 143e1cb49dSSouvik Roy * 153e1cb49dSSouvik Roy * This API checks for VPD manager collection status by reading the 16480807cfSAnupama B R * collection "Status" property exposed by vpd-manager on Dbus. The read logic 173e1cb49dSSouvik Roy * uses a retry loop with a specific number of retries with specific sleep time 183e1cb49dSSouvik Roy * between each retry. 193e1cb49dSSouvik Roy * 203e1cb49dSSouvik Roy * @param[in] i_retryLimit - Maximum number of retries 213e1cb49dSSouvik Roy * @param[in] i_sleepDurationInSeconds - Sleep time in seconds between each 223e1cb49dSSouvik Roy * retry 233e1cb49dSSouvik Roy * 243e1cb49dSSouvik Roy * @return If "CollectionStatus" property is "Completed", returns 0, otherwise 253e1cb49dSSouvik Roy * returns 1. 263e1cb49dSSouvik Roy */ 273e1cb49dSSouvik Roy int checkVpdCollectionStatus(const unsigned i_retryLimit, 283e1cb49dSSouvik Roy const unsigned i_sleepDurationInSeconds) noexcept 293e1cb49dSSouvik Roy { 303e1cb49dSSouvik Roy auto l_logger = vpd::Logger::getLoggerInstance(); 313e1cb49dSSouvik Roy 323e1cb49dSSouvik Roy try 333e1cb49dSSouvik Roy { 343e1cb49dSSouvik Roy l_logger->logMessage( 353e1cb49dSSouvik Roy "Checking every " + std::to_string(i_sleepDurationInSeconds) + 363e1cb49dSSouvik Roy "s for VPD collection status ...."); 373e1cb49dSSouvik Roy 383e1cb49dSSouvik Roy for (unsigned l_retries = i_retryLimit; 393e1cb49dSSouvik Roy l_retries != vpd::constants::VALUE_0; --l_retries) 403e1cb49dSSouvik Roy { 413e1cb49dSSouvik Roy // check at specified time interval 423e1cb49dSSouvik Roy std::this_thread::sleep_for( 433e1cb49dSSouvik Roy std::chrono::seconds(i_sleepDurationInSeconds)); 443e1cb49dSSouvik Roy 453e1cb49dSSouvik Roy const auto l_propValue = vpd::dbusUtility::readDbusProperty( 46480807cfSAnupama B R IFACE, OBJPATH, vpd::constants::vpdCollectionInterface, 47480807cfSAnupama B R "Status"); 483e1cb49dSSouvik Roy 493e1cb49dSSouvik Roy if (auto l_val = std::get_if<std::string>(&l_propValue)) 503e1cb49dSSouvik Roy { 51480807cfSAnupama B R if (*l_val == vpd::constants::vpdCollectionCompleted) 523e1cb49dSSouvik Roy { 533e1cb49dSSouvik Roy l_logger->logMessage("VPD collection is completed"); 543e1cb49dSSouvik Roy return vpd::constants::VALUE_0; 553e1cb49dSSouvik Roy } 563e1cb49dSSouvik Roy } 573e1cb49dSSouvik Roy 583e1cb49dSSouvik Roy l_logger->logMessage( 593e1cb49dSSouvik Roy "Waiting for VPD status update. Retries remaining: " + 603e1cb49dSSouvik Roy std::to_string(l_retries)); 613e1cb49dSSouvik Roy } 623e1cb49dSSouvik Roy 633e1cb49dSSouvik Roy l_logger->logMessage( 643e1cb49dSSouvik Roy "Exit wait for VPD services to finish with timeout"); 653e1cb49dSSouvik Roy } 663e1cb49dSSouvik Roy catch (const std::exception& l_ex) 673e1cb49dSSouvik Roy { 683e1cb49dSSouvik Roy l_logger->logMessage("Error while checking VPD collection status: " + 693e1cb49dSSouvik Roy std::string(l_ex.what())); 703e1cb49dSSouvik Roy } 713e1cb49dSSouvik Roy 723e1cb49dSSouvik Roy return vpd::constants::VALUE_1; 733e1cb49dSSouvik Roy } 743e1cb49dSSouvik Roy 75*c0c007deSSouvik Roy /** 76*c0c007deSSouvik Roy * @brief API to trigger VPD collection for all FRUs. 77*c0c007deSSouvik Roy * 78*c0c007deSSouvik Roy * This API triggers VPD collection for all FRUs by calling Dbus API 79*c0c007deSSouvik Roy * "CollectAllFRUVPD" exposed by vpd-manager 80*c0c007deSSouvik Roy * 81*c0c007deSSouvik Roy * @return - On success returns true, otherwise returns false 82*c0c007deSSouvik Roy */ 83*c0c007deSSouvik Roy inline bool collectAllFruVpd() noexcept 84*c0c007deSSouvik Roy { 85*c0c007deSSouvik Roy bool l_rc{true}; 86*c0c007deSSouvik Roy try 87*c0c007deSSouvik Roy { 88*c0c007deSSouvik Roy auto l_bus = sdbusplus::bus::new_default(); 89*c0c007deSSouvik Roy auto l_method = 90*c0c007deSSouvik Roy l_bus.new_method_call(IFACE, OBJPATH, IFACE, "CollectAllFRUVPD"); 91*c0c007deSSouvik Roy 92*c0c007deSSouvik Roy l_bus.call_noreply(l_method); 93*c0c007deSSouvik Roy } 94*c0c007deSSouvik Roy catch (const std::exception& l_ex) 95*c0c007deSSouvik Roy { 96*c0c007deSSouvik Roy auto l_logger = vpd::Logger::getLoggerInstance(); 97*c0c007deSSouvik Roy l_logger->logMessage( 98*c0c007deSSouvik Roy "Failed to trigger all FRU VPD collection. Error: " + 99*c0c007deSSouvik Roy std::string(l_ex.what())); 100*c0c007deSSouvik Roy l_rc = false; 101*c0c007deSSouvik Roy } 102*c0c007deSSouvik Roy return l_rc; 103*c0c007deSSouvik Roy } 104*c0c007deSSouvik Roy 1053e1cb49dSSouvik Roy int main(int argc, char** argv) 1063e1cb49dSSouvik Roy { 1073e1cb49dSSouvik Roy CLI::App l_app{"Wait VPD parser app"}; 1083e1cb49dSSouvik Roy 1093e1cb49dSSouvik Roy // default retry limit and sleep duration values 1103e1cb49dSSouvik Roy unsigned l_retryLimit{100}; 1113e1cb49dSSouvik Roy unsigned l_sleepDurationInSeconds{2}; 1123e1cb49dSSouvik Roy 1133e1cb49dSSouvik Roy l_app.add_option("--retryLimit, -r", l_retryLimit, "Retry limit"); 1143e1cb49dSSouvik Roy l_app.add_option("--sleepDurationInSeconds, -s", l_sleepDurationInSeconds, 1153e1cb49dSSouvik Roy "Sleep duration in seconds between each retry"); 1163e1cb49dSSouvik Roy 1173e1cb49dSSouvik Roy CLI11_PARSE(l_app, argc, argv); 1183e1cb49dSSouvik Roy 119*c0c007deSSouvik Roy return collectAllFruVpd() 120*c0c007deSSouvik Roy ? checkVpdCollectionStatus(l_retryLimit, 121*c0c007deSSouvik Roy l_sleepDurationInSeconds) 122*c0c007deSSouvik Roy : vpd::constants::VALUE_1; 1233e1cb49dSSouvik Roy } 124