xref: /openbmc/openpower-vpd-parser/vpd-manager/src/backup_restore.cpp (revision fa5e4d325ef9cea3c841fe89d202c340f92bd8c6)
1*fa5e4d32SSunny Srivastava #include "backup_restore.hpp"
2*fa5e4d32SSunny Srivastava 
3*fa5e4d32SSunny Srivastava #include "constants.hpp"
4*fa5e4d32SSunny Srivastava #include "event_logger.hpp"
5*fa5e4d32SSunny Srivastava #include "exceptions.hpp"
6*fa5e4d32SSunny Srivastava #include "logger.hpp"
7*fa5e4d32SSunny Srivastava #include "parser.hpp"
8*fa5e4d32SSunny Srivastava #include "types.hpp"
9*fa5e4d32SSunny Srivastava 
10*fa5e4d32SSunny Srivastava #include <utility/json_utility.hpp>
11*fa5e4d32SSunny Srivastava #include <utility/vpd_specific_utility.hpp>
12*fa5e4d32SSunny Srivastava 
13*fa5e4d32SSunny Srivastava namespace vpd
14*fa5e4d32SSunny Srivastava {
15*fa5e4d32SSunny Srivastava BackupAndRestoreStatus BackupAndRestore::m_backupAndRestoreStatus =
16*fa5e4d32SSunny Srivastava     BackupAndRestoreStatus::NotStarted;
17*fa5e4d32SSunny Srivastava 
BackupAndRestore(const nlohmann::json & i_sysCfgJsonObj)18*fa5e4d32SSunny Srivastava BackupAndRestore::BackupAndRestore(const nlohmann::json& i_sysCfgJsonObj) :
19*fa5e4d32SSunny Srivastava     m_sysCfgJsonObj(i_sysCfgJsonObj)
20*fa5e4d32SSunny Srivastava {
21*fa5e4d32SSunny Srivastava     std::string l_backupAndRestoreCfgFilePath =
22*fa5e4d32SSunny Srivastava         i_sysCfgJsonObj.value("backupRestoreConfigPath", "");
23*fa5e4d32SSunny Srivastava     try
24*fa5e4d32SSunny Srivastava     {
25*fa5e4d32SSunny Srivastava         m_backupAndRestoreCfgJsonObj =
26*fa5e4d32SSunny Srivastava             jsonUtility::getParsedJson(l_backupAndRestoreCfgFilePath);
27*fa5e4d32SSunny Srivastava     }
28*fa5e4d32SSunny Srivastava     catch (const std::exception& ex)
29*fa5e4d32SSunny Srivastava     {
30*fa5e4d32SSunny Srivastava         logging::logMessage(
31*fa5e4d32SSunny Srivastava             "Failed to intialize backup and restore object for file = " +
32*fa5e4d32SSunny Srivastava             l_backupAndRestoreCfgFilePath);
33*fa5e4d32SSunny Srivastava         throw(ex);
34*fa5e4d32SSunny Srivastava     }
35*fa5e4d32SSunny Srivastava }
36*fa5e4d32SSunny Srivastava 
37*fa5e4d32SSunny Srivastava std::tuple<types::VPDMapVariant, types::VPDMapVariant>
backupAndRestore()38*fa5e4d32SSunny Srivastava     BackupAndRestore::backupAndRestore()
39*fa5e4d32SSunny Srivastava {
40*fa5e4d32SSunny Srivastava     auto l_emptyVariantPair =
41*fa5e4d32SSunny Srivastava         std::make_tuple(std::monostate{}, std::monostate{});
42*fa5e4d32SSunny Srivastava 
43*fa5e4d32SSunny Srivastava     if (m_backupAndRestoreStatus >= BackupAndRestoreStatus::Invoked)
44*fa5e4d32SSunny Srivastava     {
45*fa5e4d32SSunny Srivastava         logging::logMessage("Backup and restore invoked already.");
46*fa5e4d32SSunny Srivastava         return l_emptyVariantPair;
47*fa5e4d32SSunny Srivastava     }
48*fa5e4d32SSunny Srivastava 
49*fa5e4d32SSunny Srivastava     m_backupAndRestoreStatus = BackupAndRestoreStatus::Invoked;
50*fa5e4d32SSunny Srivastava     try
51*fa5e4d32SSunny Srivastava     {
52*fa5e4d32SSunny Srivastava         if (m_backupAndRestoreCfgJsonObj.empty() ||
53*fa5e4d32SSunny Srivastava             !m_backupAndRestoreCfgJsonObj.contains("source") ||
54*fa5e4d32SSunny Srivastava             !m_backupAndRestoreCfgJsonObj.contains("destination") ||
55*fa5e4d32SSunny Srivastava             !m_backupAndRestoreCfgJsonObj.contains("type") ||
56*fa5e4d32SSunny Srivastava             !m_backupAndRestoreCfgJsonObj.contains("backupMap"))
57*fa5e4d32SSunny Srivastava         {
58*fa5e4d32SSunny Srivastava             logging::logMessage(
59*fa5e4d32SSunny Srivastava                 "Backup restore config JSON is missing necessary tag(s), can't initiate backup and restore.");
60*fa5e4d32SSunny Srivastava             return l_emptyVariantPair;
61*fa5e4d32SSunny Srivastava         }
62*fa5e4d32SSunny Srivastava 
63*fa5e4d32SSunny Srivastava         std::string l_srcVpdPath;
64*fa5e4d32SSunny Srivastava         types::VPDMapVariant l_srcVpdVariant;
65*fa5e4d32SSunny Srivastava         if (l_srcVpdPath = m_backupAndRestoreCfgJsonObj["source"].value(
66*fa5e4d32SSunny Srivastava                 "hardwarePath", "");
67*fa5e4d32SSunny Srivastava             !l_srcVpdPath.empty() && std::filesystem::exists(l_srcVpdPath))
68*fa5e4d32SSunny Srivastava         {
69*fa5e4d32SSunny Srivastava             std::shared_ptr<Parser> l_vpdParser =
70*fa5e4d32SSunny Srivastava                 std::make_shared<Parser>(l_srcVpdPath, m_sysCfgJsonObj);
71*fa5e4d32SSunny Srivastava             l_srcVpdVariant = l_vpdParser->parse();
72*fa5e4d32SSunny Srivastava         }
73*fa5e4d32SSunny Srivastava         else if (l_srcVpdPath = m_backupAndRestoreCfgJsonObj["source"].value(
74*fa5e4d32SSunny Srivastava                      "inventoryPath", "");
75*fa5e4d32SSunny Srivastava                  l_srcVpdPath.empty())
76*fa5e4d32SSunny Srivastava         {
77*fa5e4d32SSunny Srivastava             logging::logMessage(
78*fa5e4d32SSunny Srivastava                 "Couldn't extract source path, can't initiate backup and restore.");
79*fa5e4d32SSunny Srivastava             return l_emptyVariantPair;
80*fa5e4d32SSunny Srivastava         }
81*fa5e4d32SSunny Srivastava 
82*fa5e4d32SSunny Srivastava         std::string l_dstVpdPath;
83*fa5e4d32SSunny Srivastava         types::VPDMapVariant l_dstVpdVariant;
84*fa5e4d32SSunny Srivastava         if (l_dstVpdPath = m_backupAndRestoreCfgJsonObj["destination"].value(
85*fa5e4d32SSunny Srivastava                 "hardwarePath", "");
86*fa5e4d32SSunny Srivastava             !l_dstVpdPath.empty() && std::filesystem::exists(l_dstVpdPath))
87*fa5e4d32SSunny Srivastava         {
88*fa5e4d32SSunny Srivastava             std::shared_ptr<Parser> l_vpdParser =
89*fa5e4d32SSunny Srivastava                 std::make_shared<Parser>(l_dstVpdPath, m_sysCfgJsonObj);
90*fa5e4d32SSunny Srivastava             l_dstVpdVariant = l_vpdParser->parse();
91*fa5e4d32SSunny Srivastava         }
92*fa5e4d32SSunny Srivastava         else if (l_dstVpdPath = m_backupAndRestoreCfgJsonObj["destination"]
93*fa5e4d32SSunny Srivastava                                     .value("inventoryPath", "");
94*fa5e4d32SSunny Srivastava                  l_dstVpdPath.empty())
95*fa5e4d32SSunny Srivastava         {
96*fa5e4d32SSunny Srivastava             logging::logMessage(
97*fa5e4d32SSunny Srivastava                 "Couldn't extract destination path, can't initiate backup and restore.");
98*fa5e4d32SSunny Srivastava             return l_emptyVariantPair;
99*fa5e4d32SSunny Srivastava         }
100*fa5e4d32SSunny Srivastava 
101*fa5e4d32SSunny Srivastava         // Implement backup and restore for IPZ type VPD
102*fa5e4d32SSunny Srivastava         auto l_backupAndRestoreType =
103*fa5e4d32SSunny Srivastava             m_backupAndRestoreCfgJsonObj.value("type", "");
104*fa5e4d32SSunny Srivastava         if (l_backupAndRestoreType.compare("IPZ") == constants::STR_CMP_SUCCESS)
105*fa5e4d32SSunny Srivastava         {
106*fa5e4d32SSunny Srivastava             types::IPZVpdMap l_srcVpdMap;
107*fa5e4d32SSunny Srivastava             if (auto l_srcVpdPtr =
108*fa5e4d32SSunny Srivastava                     std::get_if<types::IPZVpdMap>(&l_srcVpdVariant))
109*fa5e4d32SSunny Srivastava             {
110*fa5e4d32SSunny Srivastava                 l_srcVpdMap = *l_srcVpdPtr;
111*fa5e4d32SSunny Srivastava             }
112*fa5e4d32SSunny Srivastava             else if (!std::holds_alternative<std::monostate>(l_srcVpdVariant))
113*fa5e4d32SSunny Srivastava             {
114*fa5e4d32SSunny Srivastava                 logging::logMessage("Source VPD is not of IPZ type.");
115*fa5e4d32SSunny Srivastava                 return l_emptyVariantPair;
116*fa5e4d32SSunny Srivastava             }
117*fa5e4d32SSunny Srivastava 
118*fa5e4d32SSunny Srivastava             types::IPZVpdMap l_dstVpdMap;
119*fa5e4d32SSunny Srivastava             if (auto l_dstVpdPtr =
120*fa5e4d32SSunny Srivastava                     std::get_if<types::IPZVpdMap>(&l_dstVpdVariant))
121*fa5e4d32SSunny Srivastava             {
122*fa5e4d32SSunny Srivastava                 l_dstVpdMap = *l_dstVpdPtr;
123*fa5e4d32SSunny Srivastava             }
124*fa5e4d32SSunny Srivastava             else if (!std::holds_alternative<std::monostate>(l_dstVpdVariant))
125*fa5e4d32SSunny Srivastava             {
126*fa5e4d32SSunny Srivastava                 logging::logMessage("Destination VPD is not of IPZ type.");
127*fa5e4d32SSunny Srivastava                 return l_emptyVariantPair;
128*fa5e4d32SSunny Srivastava             }
129*fa5e4d32SSunny Srivastava 
130*fa5e4d32SSunny Srivastava             backupAndRestoreIpzVpd(l_srcVpdMap, l_dstVpdMap, l_srcVpdPath,
131*fa5e4d32SSunny Srivastava                                    l_dstVpdPath);
132*fa5e4d32SSunny Srivastava             m_backupAndRestoreStatus = BackupAndRestoreStatus::Completed;
133*fa5e4d32SSunny Srivastava 
134*fa5e4d32SSunny Srivastava             return std::make_tuple(l_srcVpdMap, l_dstVpdMap);
135*fa5e4d32SSunny Srivastava         }
136*fa5e4d32SSunny Srivastava         // Note: add implementation here to support any other VPD type.
137*fa5e4d32SSunny Srivastava     }
138*fa5e4d32SSunny Srivastava     catch (const std::exception& ex)
139*fa5e4d32SSunny Srivastava     {
140*fa5e4d32SSunny Srivastava         logging::logMessage("Back up and restore failed with exception: " +
141*fa5e4d32SSunny Srivastava                             std::string(ex.what()));
142*fa5e4d32SSunny Srivastava     }
143*fa5e4d32SSunny Srivastava     return l_emptyVariantPair;
144*fa5e4d32SSunny Srivastava }
145*fa5e4d32SSunny Srivastava 
backupAndRestoreIpzVpd(types::IPZVpdMap & io_srcVpdMap,types::IPZVpdMap & io_dstVpdMap,const std::string & i_srcPath,const std::string & i_dstPath)146*fa5e4d32SSunny Srivastava void BackupAndRestore::backupAndRestoreIpzVpd(
147*fa5e4d32SSunny Srivastava     types::IPZVpdMap& io_srcVpdMap, types::IPZVpdMap& io_dstVpdMap,
148*fa5e4d32SSunny Srivastava     const std::string& i_srcPath, const std::string& i_dstPath)
149*fa5e4d32SSunny Srivastava {
150*fa5e4d32SSunny Srivastava     if (!m_backupAndRestoreCfgJsonObj["backupMap"].is_array())
151*fa5e4d32SSunny Srivastava     {
152*fa5e4d32SSunny Srivastava         logging::logMessage(
153*fa5e4d32SSunny Srivastava             "Invalid value found for tag backupMap, in backup and restore config JSON.");
154*fa5e4d32SSunny Srivastava         return;
155*fa5e4d32SSunny Srivastava     }
156*fa5e4d32SSunny Srivastava 
157*fa5e4d32SSunny Srivastava     const std::string l_srcFruPath =
158*fa5e4d32SSunny Srivastava         jsonUtility::getFruPathFromJson(m_sysCfgJsonObj, i_srcPath);
159*fa5e4d32SSunny Srivastava     const std::string l_dstFruPath =
160*fa5e4d32SSunny Srivastava         jsonUtility::getFruPathFromJson(m_sysCfgJsonObj, i_dstPath);
161*fa5e4d32SSunny Srivastava     if (l_srcFruPath.empty() || l_dstFruPath.empty())
162*fa5e4d32SSunny Srivastava     {
163*fa5e4d32SSunny Srivastava         logging::logMessage(
164*fa5e4d32SSunny Srivastava             "Couldn't find either source or destination FRU path.");
165*fa5e4d32SSunny Srivastava         return;
166*fa5e4d32SSunny Srivastava     }
167*fa5e4d32SSunny Srivastava 
168*fa5e4d32SSunny Srivastava     const std::string l_srcInvPath =
169*fa5e4d32SSunny Srivastava         jsonUtility::getInventoryObjPathFromJson(m_sysCfgJsonObj, i_srcPath);
170*fa5e4d32SSunny Srivastava     const std::string l_dstInvPath =
171*fa5e4d32SSunny Srivastava         jsonUtility::getInventoryObjPathFromJson(m_sysCfgJsonObj, i_dstPath);
172*fa5e4d32SSunny Srivastava     if (l_srcInvPath.empty() || l_dstInvPath.empty())
173*fa5e4d32SSunny Srivastava     {
174*fa5e4d32SSunny Srivastava         logging::logMessage(
175*fa5e4d32SSunny Srivastava             "Couldn't find either source or destination inventory path.");
176*fa5e4d32SSunny Srivastava         return;
177*fa5e4d32SSunny Srivastava     }
178*fa5e4d32SSunny Srivastava 
179*fa5e4d32SSunny Srivastava     const std::string l_srcServiceName =
180*fa5e4d32SSunny Srivastava         jsonUtility::getServiceName(m_sysCfgJsonObj, l_srcInvPath);
181*fa5e4d32SSunny Srivastava     const std::string l_dstServiceName =
182*fa5e4d32SSunny Srivastava         jsonUtility::getServiceName(m_sysCfgJsonObj, l_dstInvPath);
183*fa5e4d32SSunny Srivastava     if (l_srcServiceName.empty() || l_dstServiceName.empty())
184*fa5e4d32SSunny Srivastava     {
185*fa5e4d32SSunny Srivastava         logging::logMessage(
186*fa5e4d32SSunny Srivastava             "Couldn't find either source or destination DBus service name.");
187*fa5e4d32SSunny Srivastava         return;
188*fa5e4d32SSunny Srivastava     }
189*fa5e4d32SSunny Srivastava 
190*fa5e4d32SSunny Srivastava     for (const auto& l_aRecordKwInfo :
191*fa5e4d32SSunny Srivastava          m_backupAndRestoreCfgJsonObj["backupMap"])
192*fa5e4d32SSunny Srivastava     {
193*fa5e4d32SSunny Srivastava         const std::string& l_srcRecordName =
194*fa5e4d32SSunny Srivastava             l_aRecordKwInfo.value("sourceRecord", "");
195*fa5e4d32SSunny Srivastava         const std::string& l_srcKeywordName =
196*fa5e4d32SSunny Srivastava             l_aRecordKwInfo.value("sourceKeyword", "");
197*fa5e4d32SSunny Srivastava         const std::string& l_dstRecordName =
198*fa5e4d32SSunny Srivastava             l_aRecordKwInfo.value("destinationRecord", "");
199*fa5e4d32SSunny Srivastava         const std::string& l_dstKeywordName =
200*fa5e4d32SSunny Srivastava             l_aRecordKwInfo.value("destinationKeyword", "");
201*fa5e4d32SSunny Srivastava 
202*fa5e4d32SSunny Srivastava         if (l_srcRecordName.empty() || l_dstRecordName.empty() ||
203*fa5e4d32SSunny Srivastava             l_srcKeywordName.empty() || l_dstKeywordName.empty())
204*fa5e4d32SSunny Srivastava         {
205*fa5e4d32SSunny Srivastava             logging::logMessage(
206*fa5e4d32SSunny Srivastava                 "Record or keyword not found in the backup and restore config JSON.");
207*fa5e4d32SSunny Srivastava             continue;
208*fa5e4d32SSunny Srivastava         }
209*fa5e4d32SSunny Srivastava 
210*fa5e4d32SSunny Srivastava         if (!io_srcVpdMap.empty() &&
211*fa5e4d32SSunny Srivastava             io_srcVpdMap.find(l_srcRecordName) == io_srcVpdMap.end())
212*fa5e4d32SSunny Srivastava         {
213*fa5e4d32SSunny Srivastava             logging::logMessage(
214*fa5e4d32SSunny Srivastava                 "Record: " + l_srcRecordName +
215*fa5e4d32SSunny Srivastava                 ", is not found in the source path: " + i_srcPath);
216*fa5e4d32SSunny Srivastava             continue;
217*fa5e4d32SSunny Srivastava         }
218*fa5e4d32SSunny Srivastava 
219*fa5e4d32SSunny Srivastava         if (!io_dstVpdMap.empty() &&
220*fa5e4d32SSunny Srivastava             io_dstVpdMap.find(l_dstRecordName) == io_dstVpdMap.end())
221*fa5e4d32SSunny Srivastava         {
222*fa5e4d32SSunny Srivastava             logging::logMessage(
223*fa5e4d32SSunny Srivastava                 "Record: " + l_dstRecordName +
224*fa5e4d32SSunny Srivastava                 ", is not found in the destination path: " + i_dstPath);
225*fa5e4d32SSunny Srivastava             continue;
226*fa5e4d32SSunny Srivastava         }
227*fa5e4d32SSunny Srivastava 
228*fa5e4d32SSunny Srivastava         types::BinaryVector l_defaultBinaryValue;
229*fa5e4d32SSunny Srivastava         if (l_aRecordKwInfo.contains("defaultValue") &&
230*fa5e4d32SSunny Srivastava             l_aRecordKwInfo["defaultValue"].is_array())
231*fa5e4d32SSunny Srivastava         {
232*fa5e4d32SSunny Srivastava             l_defaultBinaryValue =
233*fa5e4d32SSunny Srivastava                 l_aRecordKwInfo["defaultValue"].get<types::BinaryVector>();
234*fa5e4d32SSunny Srivastava         }
235*fa5e4d32SSunny Srivastava         else
236*fa5e4d32SSunny Srivastava         {
237*fa5e4d32SSunny Srivastava             logging::logMessage(
238*fa5e4d32SSunny Srivastava                 "Couldn't read default value for record name: " +
239*fa5e4d32SSunny Srivastava                 l_srcRecordName + ", keyword name: " + l_srcKeywordName +
240*fa5e4d32SSunny Srivastava                 " from backup and restore config JSON file.");
241*fa5e4d32SSunny Srivastava             continue;
242*fa5e4d32SSunny Srivastava         }
243*fa5e4d32SSunny Srivastava 
244*fa5e4d32SSunny Srivastava         bool l_isPelRequired = l_aRecordKwInfo.value("isPelRequired", false);
245*fa5e4d32SSunny Srivastava 
246*fa5e4d32SSunny Srivastava         types::BinaryVector l_srcBinaryValue;
247*fa5e4d32SSunny Srivastava         std::string l_srcStrValue;
248*fa5e4d32SSunny Srivastava         if (!io_srcVpdMap.empty())
249*fa5e4d32SSunny Srivastava         {
250*fa5e4d32SSunny Srivastava             vpdSpecificUtility::getKwVal(io_srcVpdMap.at(l_srcRecordName),
251*fa5e4d32SSunny Srivastava                                          l_srcKeywordName, l_srcStrValue);
252*fa5e4d32SSunny Srivastava             l_srcBinaryValue =
253*fa5e4d32SSunny Srivastava                 types::BinaryVector(l_srcStrValue.begin(), l_srcStrValue.end());
254*fa5e4d32SSunny Srivastava         }
255*fa5e4d32SSunny Srivastava         else
256*fa5e4d32SSunny Srivastava         {
257*fa5e4d32SSunny Srivastava             // Read keyword value from DBus
258*fa5e4d32SSunny Srivastava             const auto l_value = dbusUtility::readDbusProperty(
259*fa5e4d32SSunny Srivastava                 l_srcServiceName, l_srcInvPath,
260*fa5e4d32SSunny Srivastava                 constants::ipzVpdInf + l_srcRecordName, l_srcKeywordName);
261*fa5e4d32SSunny Srivastava             if (const auto l_binaryValue =
262*fa5e4d32SSunny Srivastava                     std::get_if<types::BinaryVector>(&l_value))
263*fa5e4d32SSunny Srivastava             {
264*fa5e4d32SSunny Srivastava                 l_srcBinaryValue = *l_binaryValue;
265*fa5e4d32SSunny Srivastava                 l_srcStrValue = std::string(l_srcBinaryValue.begin(),
266*fa5e4d32SSunny Srivastava                                             l_srcBinaryValue.end());
267*fa5e4d32SSunny Srivastava             }
268*fa5e4d32SSunny Srivastava         }
269*fa5e4d32SSunny Srivastava 
270*fa5e4d32SSunny Srivastava         types::BinaryVector l_dstBinaryValue;
271*fa5e4d32SSunny Srivastava         std::string l_dstStrValue;
272*fa5e4d32SSunny Srivastava         if (!io_dstVpdMap.empty())
273*fa5e4d32SSunny Srivastava         {
274*fa5e4d32SSunny Srivastava             vpdSpecificUtility::getKwVal(io_dstVpdMap.at(l_dstRecordName),
275*fa5e4d32SSunny Srivastava                                          l_dstKeywordName, l_dstStrValue);
276*fa5e4d32SSunny Srivastava             l_dstBinaryValue =
277*fa5e4d32SSunny Srivastava                 types::BinaryVector(l_dstStrValue.begin(), l_dstStrValue.end());
278*fa5e4d32SSunny Srivastava         }
279*fa5e4d32SSunny Srivastava         else
280*fa5e4d32SSunny Srivastava         {
281*fa5e4d32SSunny Srivastava             // Read keyword value from DBus
282*fa5e4d32SSunny Srivastava             const auto l_value = dbusUtility::readDbusProperty(
283*fa5e4d32SSunny Srivastava                 l_dstServiceName, l_dstInvPath,
284*fa5e4d32SSunny Srivastava                 constants::ipzVpdInf + l_dstRecordName, l_dstKeywordName);
285*fa5e4d32SSunny Srivastava             if (const auto l_binaryValue =
286*fa5e4d32SSunny Srivastava                     std::get_if<types::BinaryVector>(&l_value))
287*fa5e4d32SSunny Srivastava             {
288*fa5e4d32SSunny Srivastava                 l_dstBinaryValue = *l_binaryValue;
289*fa5e4d32SSunny Srivastava                 l_dstStrValue = std::string(l_dstBinaryValue.begin(),
290*fa5e4d32SSunny Srivastava                                             l_dstBinaryValue.end());
291*fa5e4d32SSunny Srivastava             }
292*fa5e4d32SSunny Srivastava         }
293*fa5e4d32SSunny Srivastava 
294*fa5e4d32SSunny Srivastava         if (l_srcBinaryValue != l_dstBinaryValue)
295*fa5e4d32SSunny Srivastava         {
296*fa5e4d32SSunny Srivastava             // ToDo: Handle if there is no valid default value in the backup and
297*fa5e4d32SSunny Srivastava             // restore config JSON.
298*fa5e4d32SSunny Srivastava             if (l_dstBinaryValue == l_defaultBinaryValue)
299*fa5e4d32SSunny Srivastava             {
300*fa5e4d32SSunny Srivastava                 // Update keyword's value on hardware
301*fa5e4d32SSunny Srivastava                 auto l_vpdParser =
302*fa5e4d32SSunny Srivastava                     std::make_shared<Parser>(l_dstFruPath, m_sysCfgJsonObj);
303*fa5e4d32SSunny Srivastava 
304*fa5e4d32SSunny Srivastava                 auto l_bytesUpdatedOnHardware = l_vpdParser->updateVpdKeyword(
305*fa5e4d32SSunny Srivastava                     types::IpzData(l_dstRecordName, l_dstKeywordName,
306*fa5e4d32SSunny Srivastava                                    l_srcBinaryValue));
307*fa5e4d32SSunny Srivastava 
308*fa5e4d32SSunny Srivastava                 /* To keep the data in sync between hardware and parsed map
309*fa5e4d32SSunny Srivastava                  updating the io_dstVpdMap. This should only be done if write
310*fa5e4d32SSunny Srivastava                  on hardware returns success.*/
311*fa5e4d32SSunny Srivastava                 if (!io_dstVpdMap.empty() && l_bytesUpdatedOnHardware > 0)
312*fa5e4d32SSunny Srivastava                 {
313*fa5e4d32SSunny Srivastava                     io_dstVpdMap[l_dstRecordName][l_dstKeywordName] =
314*fa5e4d32SSunny Srivastava                         l_srcStrValue;
315*fa5e4d32SSunny Srivastava                 }
316*fa5e4d32SSunny Srivastava                 continue;
317*fa5e4d32SSunny Srivastava             }
318*fa5e4d32SSunny Srivastava 
319*fa5e4d32SSunny Srivastava             if (l_srcBinaryValue == l_defaultBinaryValue)
320*fa5e4d32SSunny Srivastava             {
321*fa5e4d32SSunny Srivastava                 // Update keyword's value on hardware
322*fa5e4d32SSunny Srivastava                 auto l_vpdParser =
323*fa5e4d32SSunny Srivastava                     std::make_shared<Parser>(l_srcFruPath, m_sysCfgJsonObj);
324*fa5e4d32SSunny Srivastava 
325*fa5e4d32SSunny Srivastava                 auto l_bytesUpdatedOnHardware = l_vpdParser->updateVpdKeyword(
326*fa5e4d32SSunny Srivastava                     types::IpzData(l_srcRecordName, l_srcKeywordName,
327*fa5e4d32SSunny Srivastava                                    l_dstBinaryValue));
328*fa5e4d32SSunny Srivastava 
329*fa5e4d32SSunny Srivastava                 /* To keep the data in sync between hardware and parsed map
330*fa5e4d32SSunny Srivastava                  updating the io_srcVpdMap. This should only be done if write
331*fa5e4d32SSunny Srivastava                  on hardware returns success.*/
332*fa5e4d32SSunny Srivastava                 if (!io_srcVpdMap.empty() && l_bytesUpdatedOnHardware > 0)
333*fa5e4d32SSunny Srivastava                 {
334*fa5e4d32SSunny Srivastava                     io_srcVpdMap[l_srcRecordName][l_srcKeywordName] =
335*fa5e4d32SSunny Srivastava                         l_dstStrValue;
336*fa5e4d32SSunny Srivastava                 }
337*fa5e4d32SSunny Srivastava             }
338*fa5e4d32SSunny Srivastava             else
339*fa5e4d32SSunny Srivastava             {
340*fa5e4d32SSunny Srivastava                 /**
341*fa5e4d32SSunny Srivastava                  * Update io_srcVpdMap to publish the same data on DBus, which
342*fa5e4d32SSunny Srivastava                  * is already present on the DBus. Because after calling
343*fa5e4d32SSunny Srivastava                  * backupAndRestore API the map value will get published to DBus
344*fa5e4d32SSunny Srivastava                  * in the worker flow.
345*fa5e4d32SSunny Srivastava                  */
346*fa5e4d32SSunny Srivastava                 if (!io_srcVpdMap.empty() && io_dstVpdMap.empty())
347*fa5e4d32SSunny Srivastava                 {
348*fa5e4d32SSunny Srivastava                     io_srcVpdMap[l_srcRecordName][l_srcKeywordName] =
349*fa5e4d32SSunny Srivastava                         l_dstStrValue;
350*fa5e4d32SSunny Srivastava                 }
351*fa5e4d32SSunny Srivastava 
352*fa5e4d32SSunny Srivastava                 std::string l_errorMsg(
353*fa5e4d32SSunny Srivastava                     "Mismatch found between source and destination VPD for record : " +
354*fa5e4d32SSunny Srivastava                     l_srcRecordName + " and keyword : " + l_srcKeywordName +
355*fa5e4d32SSunny Srivastava                     " . Value read from source : " + l_srcStrValue +
356*fa5e4d32SSunny Srivastava                     " . Value read from destination : " + l_dstStrValue);
357*fa5e4d32SSunny Srivastava 
358*fa5e4d32SSunny Srivastava                 EventLogger::createSyncPel(
359*fa5e4d32SSunny Srivastava                     types::ErrorType::VpdMismatch, types::SeverityType::Warning,
360*fa5e4d32SSunny Srivastava                     __FILE__, __FUNCTION__, 0, l_errorMsg, std::nullopt,
361*fa5e4d32SSunny Srivastava                     std::nullopt, std::nullopt, std::nullopt);
362*fa5e4d32SSunny Srivastava             }
363*fa5e4d32SSunny Srivastava         }
364*fa5e4d32SSunny Srivastava         else if (l_srcBinaryValue == l_defaultBinaryValue &&
365*fa5e4d32SSunny Srivastava                  l_dstBinaryValue == l_defaultBinaryValue && l_isPelRequired)
366*fa5e4d32SSunny Srivastava         {
367*fa5e4d32SSunny Srivastava             std::string l_errorMsg(
368*fa5e4d32SSunny Srivastava                 "Default value found on both source and destination VPD, for record: " +
369*fa5e4d32SSunny Srivastava                 l_srcRecordName + " and keyword: " + l_srcKeywordName);
370*fa5e4d32SSunny Srivastava 
371*fa5e4d32SSunny Srivastava             EventLogger::createSyncPel(
372*fa5e4d32SSunny Srivastava                 types::ErrorType::DefaultValue, types::SeverityType::Error,
373*fa5e4d32SSunny Srivastava                 __FILE__, __FUNCTION__, 0, l_errorMsg, std::nullopt,
374*fa5e4d32SSunny Srivastava                 std::nullopt, std::nullopt, std::nullopt);
375*fa5e4d32SSunny Srivastava         }
376*fa5e4d32SSunny Srivastava     }
377*fa5e4d32SSunny Srivastava }
378*fa5e4d32SSunny Srivastava 
setBackupAndRestoreStatus(const BackupAndRestoreStatus & i_status)379*fa5e4d32SSunny Srivastava void BackupAndRestore::setBackupAndRestoreStatus(
380*fa5e4d32SSunny Srivastava     const BackupAndRestoreStatus& i_status)
381*fa5e4d32SSunny Srivastava {
382*fa5e4d32SSunny Srivastava     m_backupAndRestoreStatus = i_status;
383*fa5e4d32SSunny Srivastava }
384*fa5e4d32SSunny Srivastava } // namespace vpd
385