13e1cb49dSSouvik Roy #include "config.h"
23e1cb49dSSouvik Roy
33e1cb49dSSouvik Roy #include "constants.hpp"
43e1cb49dSSouvik Roy #include "logger.hpp"
5*445819fcSAnupama B R #include "prime_inventory.hpp"
63e1cb49dSSouvik Roy #include "utility/dbus_utility.hpp"
73e1cb49dSSouvik Roy
83e1cb49dSSouvik Roy #include <CLI/CLI.hpp>
93e1cb49dSSouvik Roy
103e1cb49dSSouvik Roy #include <chrono>
113e1cb49dSSouvik Roy #include <thread>
123e1cb49dSSouvik Roy
133e1cb49dSSouvik Roy /**
143e1cb49dSSouvik Roy * @brief API to check for VPD collection status
153e1cb49dSSouvik Roy *
163e1cb49dSSouvik Roy * This API checks for VPD manager collection status by reading the
17480807cfSAnupama B R * collection "Status" property exposed by vpd-manager on Dbus. The read logic
183e1cb49dSSouvik Roy * uses a retry loop with a specific number of retries with specific sleep time
193e1cb49dSSouvik Roy * between each retry.
203e1cb49dSSouvik Roy *
213e1cb49dSSouvik Roy * @param[in] i_retryLimit - Maximum number of retries
223e1cb49dSSouvik Roy * @param[in] i_sleepDurationInSeconds - Sleep time in seconds between each
233e1cb49dSSouvik Roy * retry
243e1cb49dSSouvik Roy *
253e1cb49dSSouvik Roy * @return If "CollectionStatus" property is "Completed", returns 0, otherwise
263e1cb49dSSouvik Roy * returns 1.
273e1cb49dSSouvik Roy */
checkVpdCollectionStatus(const unsigned i_retryLimit,const unsigned i_sleepDurationInSeconds)283e1cb49dSSouvik Roy int checkVpdCollectionStatus(const unsigned i_retryLimit,
293e1cb49dSSouvik Roy const unsigned i_sleepDurationInSeconds) noexcept
303e1cb49dSSouvik Roy {
313e1cb49dSSouvik Roy auto l_logger = vpd::Logger::getLoggerInstance();
323e1cb49dSSouvik Roy
333e1cb49dSSouvik Roy try
343e1cb49dSSouvik Roy {
353e1cb49dSSouvik Roy l_logger->logMessage(
363e1cb49dSSouvik Roy "Checking every " + std::to_string(i_sleepDurationInSeconds) +
373e1cb49dSSouvik Roy "s for VPD collection status ....");
383e1cb49dSSouvik Roy
393e1cb49dSSouvik Roy for (unsigned l_retries = i_retryLimit;
403e1cb49dSSouvik Roy l_retries != vpd::constants::VALUE_0; --l_retries)
413e1cb49dSSouvik Roy {
423e1cb49dSSouvik Roy // check at specified time interval
433e1cb49dSSouvik Roy std::this_thread::sleep_for(
443e1cb49dSSouvik Roy std::chrono::seconds(i_sleepDurationInSeconds));
453e1cb49dSSouvik Roy
463e1cb49dSSouvik Roy const auto l_propValue = vpd::dbusUtility::readDbusProperty(
47480807cfSAnupama B R IFACE, OBJPATH, vpd::constants::vpdCollectionInterface,
48480807cfSAnupama B R "Status");
493e1cb49dSSouvik Roy
503e1cb49dSSouvik Roy if (auto l_val = std::get_if<std::string>(&l_propValue))
513e1cb49dSSouvik Roy {
52480807cfSAnupama B R if (*l_val == vpd::constants::vpdCollectionCompleted)
533e1cb49dSSouvik Roy {
543e1cb49dSSouvik Roy l_logger->logMessage("VPD collection is completed");
553e1cb49dSSouvik Roy return vpd::constants::VALUE_0;
563e1cb49dSSouvik Roy }
573e1cb49dSSouvik Roy }
583e1cb49dSSouvik Roy
593e1cb49dSSouvik Roy l_logger->logMessage(
603e1cb49dSSouvik Roy "Waiting for VPD status update. Retries remaining: " +
613e1cb49dSSouvik Roy std::to_string(l_retries));
623e1cb49dSSouvik Roy }
633e1cb49dSSouvik Roy
643e1cb49dSSouvik Roy l_logger->logMessage(
653e1cb49dSSouvik Roy "Exit wait for VPD services to finish with timeout");
663e1cb49dSSouvik Roy }
673e1cb49dSSouvik Roy catch (const std::exception& l_ex)
683e1cb49dSSouvik Roy {
693e1cb49dSSouvik Roy l_logger->logMessage("Error while checking VPD collection status: " +
703e1cb49dSSouvik Roy std::string(l_ex.what()));
713e1cb49dSSouvik Roy }
723e1cb49dSSouvik Roy
733e1cb49dSSouvik Roy return vpd::constants::VALUE_1;
743e1cb49dSSouvik Roy }
753e1cb49dSSouvik Roy
76c0c007deSSouvik Roy /**
77c0c007deSSouvik Roy * @brief API to trigger VPD collection for all FRUs.
78c0c007deSSouvik Roy *
79c0c007deSSouvik Roy * This API triggers VPD collection for all FRUs by calling Dbus API
80c0c007deSSouvik Roy * "CollectAllFRUVPD" exposed by vpd-manager
81c0c007deSSouvik Roy *
82c0c007deSSouvik Roy * @return - On success returns true, otherwise returns false
83c0c007deSSouvik Roy */
collectAllFruVpd()84c0c007deSSouvik Roy inline bool collectAllFruVpd() noexcept
85c0c007deSSouvik Roy {
86c0c007deSSouvik Roy bool l_rc{true};
87c0c007deSSouvik Roy try
88c0c007deSSouvik Roy {
89c0c007deSSouvik Roy auto l_bus = sdbusplus::bus::new_default();
90c0c007deSSouvik Roy auto l_method =
91c0c007deSSouvik Roy l_bus.new_method_call(IFACE, OBJPATH, IFACE, "CollectAllFRUVPD");
92c0c007deSSouvik Roy
93c0c007deSSouvik Roy l_bus.call_noreply(l_method);
94c0c007deSSouvik Roy }
95c0c007deSSouvik Roy catch (const std::exception& l_ex)
96c0c007deSSouvik Roy {
97c0c007deSSouvik Roy auto l_logger = vpd::Logger::getLoggerInstance();
98c0c007deSSouvik Roy l_logger->logMessage(
99c0c007deSSouvik Roy "Failed to trigger all FRU VPD collection. Error: " +
100c0c007deSSouvik Roy std::string(l_ex.what()));
101c0c007deSSouvik Roy l_rc = false;
102c0c007deSSouvik Roy }
103c0c007deSSouvik Roy return l_rc;
104c0c007deSSouvik Roy }
105c0c007deSSouvik Roy
main(int argc,char ** argv)1063e1cb49dSSouvik Roy int main(int argc, char** argv)
1073e1cb49dSSouvik Roy {
108*445819fcSAnupama B R try
109*445819fcSAnupama B R {
1103e1cb49dSSouvik Roy CLI::App l_app{"Wait VPD parser app"};
1113e1cb49dSSouvik Roy
1123e1cb49dSSouvik Roy // default retry limit and sleep duration values
1133e1cb49dSSouvik Roy unsigned l_retryLimit{100};
1143e1cb49dSSouvik Roy unsigned l_sleepDurationInSeconds{2};
1153e1cb49dSSouvik Roy
1163e1cb49dSSouvik Roy l_app.add_option("--retryLimit, -r", l_retryLimit, "Retry limit");
117*445819fcSAnupama B R l_app.add_option("--sleepDurationInSeconds, -s",
118*445819fcSAnupama B R l_sleepDurationInSeconds,
1193e1cb49dSSouvik Roy "Sleep duration in seconds between each retry");
1203e1cb49dSSouvik Roy
1213e1cb49dSSouvik Roy CLI11_PARSE(l_app, argc, argv);
1223e1cb49dSSouvik Roy
123*445819fcSAnupama B R PrimeInventory l_primeObj;
124*445819fcSAnupama B R l_primeObj.primeSystemBlueprint();
125*445819fcSAnupama B R
126c0c007deSSouvik Roy return collectAllFruVpd()
127c0c007deSSouvik Roy ? checkVpdCollectionStatus(l_retryLimit,
128c0c007deSSouvik Roy l_sleepDurationInSeconds)
129c0c007deSSouvik Roy : vpd::constants::VALUE_1;
1303e1cb49dSSouvik Roy }
131*445819fcSAnupama B R catch (const std::exception& l_ex)
132*445819fcSAnupama B R {
133*445819fcSAnupama B R const auto l_logger = vpd::Logger::getLoggerInstance();
134*445819fcSAnupama B R l_logger->logMessage("Exiting from wait-vpd-parser, reason: " +
135*445819fcSAnupama B R std::string(l_ex.what()));
136*445819fcSAnupama B R return vpd::constants::VALUE_1;
137*445819fcSAnupama B R }
138*445819fcSAnupama B R }
139