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