1*3e1cb49dSSouvik Roy #include "config.h" 2*3e1cb49dSSouvik Roy 3*3e1cb49dSSouvik Roy #include "constants.hpp" 4*3e1cb49dSSouvik Roy #include "logger.hpp" 5*3e1cb49dSSouvik Roy #include "utility/dbus_utility.hpp" 6*3e1cb49dSSouvik Roy 7*3e1cb49dSSouvik Roy #include <CLI/CLI.hpp> 8*3e1cb49dSSouvik Roy 9*3e1cb49dSSouvik Roy #include <chrono> 10*3e1cb49dSSouvik Roy #include <thread> 11*3e1cb49dSSouvik Roy 12*3e1cb49dSSouvik Roy /** 13*3e1cb49dSSouvik Roy * @brief API to check for VPD collection status 14*3e1cb49dSSouvik Roy * 15*3e1cb49dSSouvik Roy * This API checks for VPD manager collection status by reading the 16*3e1cb49dSSouvik Roy * "CollectionStatus" property exposed by vpd-manager on Dbus. The read logic 17*3e1cb49dSSouvik Roy * uses a retry loop with a specific number of retries with specific sleep time 18*3e1cb49dSSouvik Roy * between each retry. 19*3e1cb49dSSouvik Roy * 20*3e1cb49dSSouvik Roy * @param[in] i_retryLimit - Maximum number of retries 21*3e1cb49dSSouvik Roy * @param[in] i_sleepDurationInSeconds - Sleep time in seconds between each 22*3e1cb49dSSouvik Roy * retry 23*3e1cb49dSSouvik Roy * 24*3e1cb49dSSouvik Roy * @return If "CollectionStatus" property is "Completed", returns 0, otherwise 25*3e1cb49dSSouvik Roy * returns 1. 26*3e1cb49dSSouvik Roy */ 27*3e1cb49dSSouvik Roy int checkVpdCollectionStatus(const unsigned i_retryLimit, 28*3e1cb49dSSouvik Roy const unsigned i_sleepDurationInSeconds) noexcept 29*3e1cb49dSSouvik Roy { 30*3e1cb49dSSouvik Roy auto l_logger = vpd::Logger::getLoggerInstance(); 31*3e1cb49dSSouvik Roy 32*3e1cb49dSSouvik Roy try 33*3e1cb49dSSouvik Roy { 34*3e1cb49dSSouvik Roy l_logger->logMessage( 35*3e1cb49dSSouvik Roy "Checking every " + std::to_string(i_sleepDurationInSeconds) + 36*3e1cb49dSSouvik Roy "s for VPD collection status ...."); 37*3e1cb49dSSouvik Roy 38*3e1cb49dSSouvik Roy for (unsigned l_retries = i_retryLimit; 39*3e1cb49dSSouvik Roy l_retries != vpd::constants::VALUE_0; --l_retries) 40*3e1cb49dSSouvik Roy { 41*3e1cb49dSSouvik Roy // check at specified time interval 42*3e1cb49dSSouvik Roy std::this_thread::sleep_for( 43*3e1cb49dSSouvik Roy std::chrono::seconds(i_sleepDurationInSeconds)); 44*3e1cb49dSSouvik Roy 45*3e1cb49dSSouvik Roy // TODO: revisit this once "CollectionStatus" property is moved to 46*3e1cb49dSSouvik Roy // xyz interface 47*3e1cb49dSSouvik Roy const auto l_propValue = vpd::dbusUtility::readDbusProperty( 48*3e1cb49dSSouvik Roy IFACE, OBJPATH, IFACE, "CollectionStatus"); 49*3e1cb49dSSouvik Roy 50*3e1cb49dSSouvik Roy if (auto l_val = std::get_if<std::string>(&l_propValue)) 51*3e1cb49dSSouvik Roy { 52*3e1cb49dSSouvik Roy if (*l_val == "Completed") 53*3e1cb49dSSouvik Roy { 54*3e1cb49dSSouvik Roy l_logger->logMessage("VPD collection is completed"); 55*3e1cb49dSSouvik Roy return vpd::constants::VALUE_0; 56*3e1cb49dSSouvik Roy } 57*3e1cb49dSSouvik Roy } 58*3e1cb49dSSouvik Roy 59*3e1cb49dSSouvik Roy l_logger->logMessage( 60*3e1cb49dSSouvik Roy "Waiting for VPD status update. Retries remaining: " + 61*3e1cb49dSSouvik Roy std::to_string(l_retries)); 62*3e1cb49dSSouvik Roy } 63*3e1cb49dSSouvik Roy 64*3e1cb49dSSouvik Roy l_logger->logMessage( 65*3e1cb49dSSouvik Roy "Exit wait for VPD services to finish with timeout"); 66*3e1cb49dSSouvik Roy } 67*3e1cb49dSSouvik Roy catch (const std::exception& l_ex) 68*3e1cb49dSSouvik Roy { 69*3e1cb49dSSouvik Roy l_logger->logMessage("Error while checking VPD collection status: " + 70*3e1cb49dSSouvik Roy std::string(l_ex.what())); 71*3e1cb49dSSouvik Roy } 72*3e1cb49dSSouvik Roy 73*3e1cb49dSSouvik Roy return vpd::constants::VALUE_1; 74*3e1cb49dSSouvik Roy } 75*3e1cb49dSSouvik Roy 76*3e1cb49dSSouvik Roy int main(int argc, char** argv) 77*3e1cb49dSSouvik Roy { 78*3e1cb49dSSouvik Roy CLI::App l_app{"Wait VPD parser app"}; 79*3e1cb49dSSouvik Roy 80*3e1cb49dSSouvik Roy // default retry limit and sleep duration values 81*3e1cb49dSSouvik Roy unsigned l_retryLimit{100}; 82*3e1cb49dSSouvik Roy unsigned l_sleepDurationInSeconds{2}; 83*3e1cb49dSSouvik Roy 84*3e1cb49dSSouvik Roy l_app.add_option("--retryLimit, -r", l_retryLimit, "Retry limit"); 85*3e1cb49dSSouvik Roy l_app.add_option("--sleepDurationInSeconds, -s", l_sleepDurationInSeconds, 86*3e1cb49dSSouvik Roy "Sleep duration in seconds between each retry"); 87*3e1cb49dSSouvik Roy 88*3e1cb49dSSouvik Roy CLI11_PARSE(l_app, argc, argv); 89*3e1cb49dSSouvik Roy 90*3e1cb49dSSouvik Roy return checkVpdCollectionStatus(l_retryLimit, l_sleepDurationInSeconds); 91*3e1cb49dSSouvik Roy } 92