xref: /openbmc/openpower-vpd-parser/wait-vpd-parser/src/wait_vpd_parser.cpp (revision 480807cf8a3ef27eef4063bac422d69343b123d1)
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