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 16*480807cfSAnupama 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( 46*480807cfSAnupama B R IFACE, OBJPATH, vpd::constants::vpdCollectionInterface, 47*480807cfSAnupama B R "Status"); 483e1cb49dSSouvik Roy 493e1cb49dSSouvik Roy if (auto l_val = std::get_if<std::string>(&l_propValue)) 503e1cb49dSSouvik Roy { 51*480807cfSAnupama 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 753e1cb49dSSouvik Roy int main(int argc, char** argv) 763e1cb49dSSouvik Roy { 773e1cb49dSSouvik Roy CLI::App l_app{"Wait VPD parser app"}; 783e1cb49dSSouvik Roy 793e1cb49dSSouvik Roy // default retry limit and sleep duration values 803e1cb49dSSouvik Roy unsigned l_retryLimit{100}; 813e1cb49dSSouvik Roy unsigned l_sleepDurationInSeconds{2}; 823e1cb49dSSouvik Roy 833e1cb49dSSouvik Roy l_app.add_option("--retryLimit, -r", l_retryLimit, "Retry limit"); 843e1cb49dSSouvik Roy l_app.add_option("--sleepDurationInSeconds, -s", l_sleepDurationInSeconds, 853e1cb49dSSouvik Roy "Sleep duration in seconds between each retry"); 863e1cb49dSSouvik Roy 873e1cb49dSSouvik Roy CLI11_PARSE(l_app, argc, argv); 883e1cb49dSSouvik Roy 893e1cb49dSSouvik Roy return checkVpdCollectionStatus(l_retryLimit, l_sleepDurationInSeconds); 903e1cb49dSSouvik Roy } 91