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