blob: 09bcf59c0fa09041d700becee0e3d039f6e5d91f [file] [log] [blame]
Matt Spinlerc8705e22019-09-11 12:36:07 -05001#pragma once
2
Matt Spinler2a28c932020-02-03 14:23:40 -06003#include "dbus_types.hpp"
4#include "dbus_watcher.hpp"
5
Matt Spinler4dcd3f42020-01-22 14:55:07 -06006#include <filesystem>
Matt Spinlera7d9d962019-11-06 15:01:25 -06007#include <phosphor-logging/log.hpp>
Matt Spinlerc8705e22019-09-11 12:36:07 -05008#include <sdbusplus/bus.hpp>
9#include <sdbusplus/bus/match.hpp>
10
11namespace openpower
12{
13namespace pels
14{
15
Matt Spinlerc8705e22019-09-11 12:36:07 -050016/**
17 * @class DataInterface
18 *
Matt Spinler19e89ce2019-11-06 13:02:23 -060019 * A base class for gathering data about the system for use
20 * in PELs. Implemented this way to facilitate mocking.
Matt Spinlerc8705e22019-09-11 12:36:07 -050021 */
22class DataInterfaceBase
23{
24 public:
25 DataInterfaceBase() = default;
26 virtual ~DataInterfaceBase() = default;
27 DataInterfaceBase(const DataInterfaceBase&) = default;
28 DataInterfaceBase& operator=(const DataInterfaceBase&) = default;
29 DataInterfaceBase(DataInterfaceBase&&) = default;
30 DataInterfaceBase& operator=(DataInterfaceBase&&) = default;
31
32 /**
Matt Spinler19e89ce2019-11-06 13:02:23 -060033 * @brief Returns the machine Type/Model
Matt Spinlerc8705e22019-09-11 12:36:07 -050034 *
35 * @return string - The machine Type/Model string
36 */
Matt Spinler19e89ce2019-11-06 13:02:23 -060037 virtual std::string getMachineTypeModel() const
38 {
39 return _machineTypeModel;
40 }
Matt Spinlerc8705e22019-09-11 12:36:07 -050041
42 /**
Matt Spinler19e89ce2019-11-06 13:02:23 -060043 * @brief Returns the machine serial number
Matt Spinlerc8705e22019-09-11 12:36:07 -050044 *
45 * @return string - The machine serial number
46 */
Matt Spinler19e89ce2019-11-06 13:02:23 -060047 virtual std::string getMachineSerialNumber() const
48 {
49 return _machineSerialNumber;
50 }
51
Matt Spinlera7d9d962019-11-06 15:01:25 -060052 /**
Matt Spinlercce14112019-12-11 14:20:36 -060053 * @brief Says if the system is managed by a hardware
54 * management console.
55 * @return bool - If the system is HMC managed
56 */
57 virtual bool isHMCManaged() const
58 {
59 return _hmcManaged;
60 }
61
62 /**
Matt Spinlera7d9d962019-11-06 15:01:25 -060063 * @brief Says if the host is up and running
64 *
65 * @return bool - If the host is running
66 */
67 virtual bool isHostUp() const
68 {
69 return _hostUp;
70 }
71
72 using HostStateChangeFunc = std::function<void(bool)>;
73
74 /**
75 * @brief Register a callback function that will get
76 * called on all host on/off transitions.
77 *
78 * The void(bool) function will get passed the new
79 * value of the host state.
80 *
81 * @param[in] name - The subscription name
82 * @param[in] func - The function to run
83 */
84 void subscribeToHostStateChange(const std::string& name,
85 HostStateChangeFunc func)
86 {
87 _hostChangeCallbacks[name] = func;
88 }
89
90 /**
91 * @brief Unsubscribe from host state changes.
92 *
93 * @param[in] name - The subscription name
94 */
95 void unsubscribeFromHostStateChange(const std::string& name)
96 {
97 _hostChangeCallbacks.erase(name);
98 }
99
Matt Spinlercad9c2b2019-12-02 15:42:01 -0600100 /**
101 * @brief Returns the BMC firmware version
102 *
103 * @return std::string - The BMC version
104 */
105 virtual std::string getBMCFWVersion() const
106 {
107 return _bmcFWVersion;
108 }
109
110 /**
111 * @brief Returns the server firmware version
112 *
113 * @return std::string - The server firmware version
114 */
115 virtual std::string getServerFWVersion() const
116 {
117 return _serverFWVersion;
118 }
119
Matt Spinler4dcd3f42020-01-22 14:55:07 -0600120 /**
Matt Spinler677381b2020-01-23 10:04:29 -0600121 * @brief Returns the BMC FW version ID
122 *
123 * @return std::string - The BMC FW version ID
124 */
125 virtual std::string getBMCFWVersionID() const
126 {
127 return _bmcFWVersionID;
128 }
129
130 /**
Matt Spinler4dcd3f42020-01-22 14:55:07 -0600131 * @brief Returns the process name given its PID.
132 *
133 * @param[in] pid - The PID value as a string
134 *
135 * @return std::optional<std::string> - The name, or std::nullopt
136 */
137 std::optional<std::string> getProcessName(const std::string& pid) const
138 {
139 namespace fs = std::filesystem;
140
141 fs::path path{"/proc"};
142 path /= fs::path{pid} / "exe";
143
144 if (fs::exists(path))
145 {
146 return fs::read_symlink(path);
147 }
148
149 return std::nullopt;
150 }
151
Matt Spinler9cf3cfd2020-02-03 14:41:55 -0600152 /**
153 * @brief Returns the 'send event logs to host' setting.
154 *
155 * @return bool - If sending PELs to the host is enabled.
156 */
157 virtual bool getHostPELEnablement() const
158 {
159 return _sendPELsToHost;
160 }
161
Matt Spinler4aa23a12020-02-03 15:05:09 -0600162 /**
163 * @brief Returns the BMC state
164 *
165 * @return std::string - The BMC state property value
166 */
167 virtual std::string getBMCState() const
168 {
169 return _bmcState;
170 }
171
172 /**
173 * @brief Returns the Chassis state
174 *
175 * @return std::string - The chassis state property value
176 */
177 virtual std::string getChassisState() const
178 {
179 return _chassisState;
180 }
181
182 /**
183 * @brief Returns the chassis requested power
184 * transition value.
185 *
186 * @return std::string - The chassis transition property
187 */
188 virtual std::string getChassisTransition() const
189 {
190 return _chassisTransition;
191 }
192
193 /**
194 * @brief Returns the Host state
195 *
196 * @return std::string - The Host state property value
197 */
198 virtual std::string getHostState() const
199 {
200 return _hostState;
201 }
202
Matt Spinlerb3d488f2020-02-21 15:30:46 -0600203 /**
204 * @brief Returns the motherboard CCIN
205 *
206 * @return std::string The motherboard CCIN
207 */
208 virtual std::string getMotherboardCCIN() const
209 {
210 return _motherboardCCIN;
211 }
212
Matt Spinler60c4e792020-03-13 13:45:36 -0500213 /**
214 * @brief Get the fields from the inventory necessary for doing
215 * a callout on an inventory path.
216 *
217 * @param[in] inventoryPath - The item to get the data for
Matt Spinler60c4e792020-03-13 13:45:36 -0500218 * @param[out] fruPartNumber - Filled in with the VINI/FN keyword
219 * @param[out] ccin - Filled in with the VINI/CC keyword
220 * @param[out] serialNumber - Filled in with the VINI/SN keyword
221 */
222 virtual void getHWCalloutFields(const std::string& inventoryPath,
Matt Spinler60c4e792020-03-13 13:45:36 -0500223 std::string& fruPartNumber,
224 std::string& ccin,
225 std::string& serialNumber) const = 0;
226
Matt Spinler03984582020-04-09 13:17:58 -0500227 /**
Matt Spinler9b90e2a2020-04-14 10:59:04 -0500228 * @brief Get the location code for an inventory item.
229 *
230 * @param[in] inventoryPath - The item to get the data for
231 *
232 * @return std::string - The location code
233 */
234 virtual std::string
235 getLocationCode(const std::string& inventoryPath) const = 0;
236
237 /**
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500238 * @brief Get the list of system type names the system is called.
Matt Spinler03984582020-04-09 13:17:58 -0500239 *
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500240 * @return std::vector<std::string> - The list of names
Matt Spinler03984582020-04-09 13:17:58 -0500241 */
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500242 virtual const std::vector<std::string>& getSystemNames() const
Matt Spinler03984582020-04-09 13:17:58 -0500243 {
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500244 return _systemNames;
Matt Spinler03984582020-04-09 13:17:58 -0500245 }
246
Matt Spinler5fb24c12020-06-04 11:21:33 -0500247 /**
248 * @brief Fills in the placeholder 'Ufcs' in the passed in location
249 * code with the machine feature code and serial number, which
250 * is needed to create a valid location code.
251 *
252 * @param[in] locationCode - Location code value starting with Ufcs-, and
253 * if that isn't present it will be added first.
254 *
255 * @param[in] node - The node number the location is on.
256 *
257 * @return std::string - The expanded location code
258 */
259 virtual std::string expandLocationCode(const std::string& locationCode,
260 uint16_t node) const = 0;
261
262 /**
263 * @brief Returns the inventory path for the FRU that the location
264 * code represents.
265 *
Matt Spinler2f9225a2020-08-05 12:58:49 -0500266 * @param[in] locationCode - If an expanded location code, then the
267 * full location code.
268 * If not expanded, a location code value
269 * starting with Ufcs-, and if that isn't
270 * present it will be added first.
Matt Spinler5fb24c12020-06-04 11:21:33 -0500271 *
Matt Spinler2f9225a2020-08-05 12:58:49 -0500272 * @param[in] node - The node number the location is on. Ignored if the
273 * expanded location code is passed in.
274 *
275 * @param[in] expanded - If the location code already has the relevent
276 * VPD fields embedded in it.
Matt Spinler5fb24c12020-06-04 11:21:33 -0500277 *
278 * @return std::string - The inventory D-Bus object
279 */
Matt Spinler2f9225a2020-08-05 12:58:49 -0500280 virtual std::string getInventoryFromLocCode(const std::string& LocationCode,
281 uint16_t node,
282 bool expanded) const = 0;
Matt Spinler5fb24c12020-06-04 11:21:33 -0500283
Matt Spinler34a904c2020-08-05 14:53:28 -0500284 /**
285 * @brief Returns the fault LED group D-Bus path for the inventory
286 * D-Bus path passed in.
287 *
288 * @param[in] inventoryPath - The inventory D-Bus path
289 *
290 * @return std::string - The fault LED group D-Bus path
291 */
292 virtual std::string
293 getFaultLEDGroup(const std::string& inventoryPath) const = 0;
294
295 /**
296 * @brief Sets the Asserted property on the LED group passed in.
297 *
298 * @param[in] ledGroup - The LED group D-Bus path
299 * @param[in] value - The value to set it to
300 */
301 virtual void assertLEDGroup(const std::string& ledGroup,
302 bool value) const = 0;
303
Matt Spinler19e89ce2019-11-06 13:02:23 -0600304 protected:
305 /**
Matt Spinlera7d9d962019-11-06 15:01:25 -0600306 * @brief Sets the host on/off state and runs any
307 * callback functions (if there was a change).
308 */
Matt Spinler4aa23a12020-02-03 15:05:09 -0600309 void setHostUp(bool hostUp)
Matt Spinlera7d9d962019-11-06 15:01:25 -0600310 {
Matt Spinler4aa23a12020-02-03 15:05:09 -0600311 if (_hostUp != hostUp)
Matt Spinlera7d9d962019-11-06 15:01:25 -0600312 {
Matt Spinler4aa23a12020-02-03 15:05:09 -0600313 _hostUp = hostUp;
Matt Spinlera7d9d962019-11-06 15:01:25 -0600314
315 for (auto& [name, func] : _hostChangeCallbacks)
316 {
317 try
318 {
319 func(_hostUp);
320 }
321 catch (std::exception& e)
322 {
323 using namespace phosphor::logging;
324 log<level::ERR>("A host state change callback threw "
325 "an exception");
326 }
327 }
328 }
329 }
330
331 /**
Matt Spinler19e89ce2019-11-06 13:02:23 -0600332 * @brief The machine type-model. Always kept up to date
333 */
334 std::string _machineTypeModel;
335
336 /**
337 * @brief The machine serial number. Always kept up to date
338 */
339 std::string _machineSerialNumber;
Matt Spinlera7d9d962019-11-06 15:01:25 -0600340
341 /**
Matt Spinlercce14112019-12-11 14:20:36 -0600342 * @brief The hardware management console status. Always kept
343 * up to date.
344 */
345 bool _hmcManaged = false;
346
347 /**
Matt Spinlera7d9d962019-11-06 15:01:25 -0600348 * @brief The host up status. Always kept up to date.
349 */
350 bool _hostUp = false;
351
352 /**
353 * @brief The map of host state change subscriber
354 * names to callback functions.
355 */
356 std::map<std::string, HostStateChangeFunc> _hostChangeCallbacks;
Matt Spinlercad9c2b2019-12-02 15:42:01 -0600357
358 /**
359 * @brief The BMC firmware version string
360 */
361 std::string _bmcFWVersion;
362
363 /**
364 * @brief The server firmware version string
365 */
366 std::string _serverFWVersion;
Matt Spinler677381b2020-01-23 10:04:29 -0600367
368 /**
369 * @brief The BMC firmware version ID string
370 */
371 std::string _bmcFWVersionID;
Matt Spinler9cf3cfd2020-02-03 14:41:55 -0600372
373 /**
374 * @brief If sending PELs is enabled.
375 *
376 * This is usually set to false in manufacturing test.
377 */
378 bool _sendPELsToHost = true;
Matt Spinler4aa23a12020-02-03 15:05:09 -0600379
380 /**
381 * @brief The BMC state property
382 */
383 std::string _bmcState;
384
385 /**
386 * @brief The Chassis current power state property
387 */
388 std::string _chassisState;
389
390 /**
391 * @brief The Chassis requested power transition property
392 */
393 std::string _chassisTransition;
394
395 /**
396 * @brief The host state property
397 */
398 std::string _hostState;
Matt Spinlerb3d488f2020-02-21 15:30:46 -0600399
400 /**
401 * @brief The motherboard CCIN
402 */
403 std::string _motherboardCCIN;
Matt Spinler03984582020-04-09 13:17:58 -0500404
405 /**
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500406 * @brief The compatible system names array
Matt Spinler03984582020-04-09 13:17:58 -0500407 */
Matt Spinler6ea4d5f2020-05-20 13:31:07 -0500408 std::vector<std::string> _systemNames;
Matt Spinlerc8705e22019-09-11 12:36:07 -0500409};
410
411/**
412 * @class DataInterface
413 *
414 * Concrete implementation of DataInterfaceBase.
415 */
416class DataInterface : public DataInterfaceBase
417{
418 public:
419 DataInterface() = delete;
420 ~DataInterface() = default;
421 DataInterface(const DataInterface&) = default;
422 DataInterface& operator=(const DataInterface&) = default;
423 DataInterface(DataInterface&&) = default;
424 DataInterface& operator=(DataInterface&&) = default;
425
426 /**
427 * @brief Constructor
428 *
429 * @param[in] bus - The sdbusplus bus object
430 */
431 explicit DataInterface(sdbusplus::bus::bus& bus);
432
Matt Spinlerb3f51862019-12-09 13:55:10 -0600433 /**
Matt Spinlerc8705e22019-09-11 12:36:07 -0500434 * @brief Finds the D-Bus service name that hosts the
435 * passed in path and interface.
436 *
437 * @param[in] objectPath - The D-Bus object path
438 * @param[in] interface - The D-Bus interface
439 */
440 DBusService getService(const std::string& objectPath,
Matt Spinlerb3f51862019-12-09 13:55:10 -0600441 const std::string& interface) const;
Matt Spinler9cf3cfd2020-02-03 14:41:55 -0600442
Matt Spinlerc8705e22019-09-11 12:36:07 -0500443 /**
444 * @brief Wrapper for the 'GetAll' properties method call
445 *
446 * @param[in] service - The D-Bus service to call it on
447 * @param[in] objectPath - The D-Bus object path
448 * @param[in] interface - The interface to get the props on
449 *
450 * @return DBusPropertyMap - The property results
451 */
452 DBusPropertyMap getAllProperties(const std::string& service,
453 const std::string& objectPath,
Matt Spinler2a28c932020-02-03 14:23:40 -0600454 const std::string& interface) const;
Matt Spinlerc8705e22019-09-11 12:36:07 -0500455 /**
Matt Spinlera7d9d962019-11-06 15:01:25 -0600456 * @brief Wrapper for the 'Get' properties method call
457 *
458 * @param[in] service - The D-Bus service to call it on
459 * @param[in] objectPath - The D-Bus object path
460 * @param[in] interface - The interface to get the property on
461 * @param[in] property - The property name
462 * @param[out] value - Filled in with the property value.
463 */
464 void getProperty(const std::string& service, const std::string& objectPath,
465 const std::string& interface, const std::string& property,
Matt Spinler2a28c932020-02-03 14:23:40 -0600466 DBusValue& value) const;
467
Matt Spinler60c4e792020-03-13 13:45:36 -0500468 /**
469 * @brief Get the fields from the inventory necessary for doing
470 * a callout on an inventory path.
471 *
472 * @param[in] inventoryPath - The item to get the data for
Matt Spinler60c4e792020-03-13 13:45:36 -0500473 * @param[out] fruPartNumber - Filled in with the VINI/FN keyword
474 * @param[out] ccin - Filled in with the VINI/CC keyword
475 * @param[out] serialNumber - Filled in with the VINI/SN keyword
476 */
477 void getHWCalloutFields(const std::string& inventoryPath,
Matt Spinler60c4e792020-03-13 13:45:36 -0500478 std::string& fruPartNumber, std::string& ccin,
479 std::string& serialNumber) const override;
480
Matt Spinler9b90e2a2020-04-14 10:59:04 -0500481 /**
482 * @brief Get the location code for an inventory item.
483 *
484 * Throws an exception if the inventory item doesn't have the
485 * location code interface.
486 *
487 * @param[in] inventoryPath - The item to get the data for
488 *
489 * @return std::string - The location code
490 */
491 std::string
492 getLocationCode(const std::string& inventoryPath) const override;
493
Matt Spinler5fb24c12020-06-04 11:21:33 -0500494 /**
495 * @brief Fills in the placeholder 'Ufcs' in the passed in location
496 * code with the machine feature code and serial number, which
497 * is needed to create a valid location code.
498 *
499 * @param[in] locationCode - Location code value starting with Ufcs-, and
500 * if that isn't present it will be added first.
501 *
502 * @param[in] node - The node number the location is one.
503 *
504 * @return std::string - The expanded location code
505 */
506 std::string expandLocationCode(const std::string& locationCode,
507 uint16_t node) const override;
508
509 /**
510 * @brief Returns the inventory path for the FRU that the location
511 * code represents.
512 *
Matt Spinler2f9225a2020-08-05 12:58:49 -0500513 * @param[in] locationCode - If an expanded location code, then the
514 * full location code.
515 * If not expanded, a location code value
516 * starting with Ufcs-, and if that isn't
517 * present it will be added first.
Matt Spinler5fb24c12020-06-04 11:21:33 -0500518 *
Matt Spinler2f9225a2020-08-05 12:58:49 -0500519 * @param[in] node - The node number the location is on. Ignored if the
520 * expanded location code is passed in.
521 *
522 * @param[in] expanded - If the location code already has the relevent
523 * VPD fields embedded in it.
Matt Spinler5fb24c12020-06-04 11:21:33 -0500524 *
525 * @return std::string - The inventory D-Bus object
526 */
Matt Spinler2f9225a2020-08-05 12:58:49 -0500527 std::string getInventoryFromLocCode(const std::string& locationCode,
528 uint16_t node,
529 bool expanded) const override;
Matt Spinler5fb24c12020-06-04 11:21:33 -0500530
Matt Spinler34a904c2020-08-05 14:53:28 -0500531 /**
532 * @brief Returns the fault LED group D-Bus path for the inventory
533 * D-Bus path passed in.
534 *
535 * @param[in] inventoryPath - The inventory D-Bus path
536 *
537 * @return std::string - The fault LED group D-Bus path
538 */
539 std::string
540 getFaultLEDGroup(const std::string& inventoryPath) const override;
541
542 /**
543 * @brief Sets the Asserted property on the LED group passed in.
544 *
545 * @param[in] ledGroup - The LED group D-Bus path
546 * @param[in] value - The value to set it to
547 */
548 void assertLEDGroup(const std::string& ledGroup, bool value) const override;
549
Matt Spinler2a28c932020-02-03 14:23:40 -0600550 private:
551 /**
552 * @brief Reads the BMC firmware version string and puts it into
553 * _bmcFWVersion.
554 */
555 void readBMCFWVersion();
Matt Spinlera7d9d962019-11-06 15:01:25 -0600556
557 /**
Matt Spinler2a28c932020-02-03 14:23:40 -0600558 * @brief Reads the server firmware version string and puts it into
559 * _serverFWVersion.
Matt Spinlerc8705e22019-09-11 12:36:07 -0500560 */
Matt Spinler2a28c932020-02-03 14:23:40 -0600561 void readServerFWVersion();
Matt Spinlerc8705e22019-09-11 12:36:07 -0500562
563 /**
Matt Spinler2a28c932020-02-03 14:23:40 -0600564 * @brief Reads the BMC firmware version ID and puts it into
565 * _bmcFWVersionID.
Matt Spinlera7d9d962019-11-06 15:01:25 -0600566 */
Matt Spinler2a28c932020-02-03 14:23:40 -0600567 void readBMCFWVersionID();
Matt Spinlera7d9d962019-11-06 15:01:25 -0600568
569 /**
Matt Spinlerb3d488f2020-02-21 15:30:46 -0600570 * @brief Reads the motherboard CCIN and puts it into _motherboardCCIN.
571 *
572 * It finds the motherboard first, possibly having to wait for it to
573 * show up.
574 */
575 void readMotherboardCCIN();
576
577 /**
578 * @brief Finds all D-Bus paths that contain any of the interfaces
579 * passed in, by using GetSubTreePaths.
580 *
581 * @param[in] interfaces - The desired interfaces
582 *
583 * @return The D-Bus paths.
584 */
585 DBusPathList getPaths(const DBusInterfaceList& interfaces) const;
586
587 /**
588 * @brief The interfacesAdded callback used on the inventory to
589 * find the D-Bus object that has the motherboard interface.
590 * When the motherboard is found, it then adds a PropertyWatcher
591 * for the motherboard CCIN.
592 */
593 void motherboardIfaceAdded(sdbusplus::message::message& msg);
594
595 /**
596 * @brief Set the motherboard CCIN from the DBus variant that
597 * contains it.
598 *
599 * @param[in] ccin - The CCIN variant, a vector<uint8_t>.
600 */
601 void setMotherboardCCIN(const DBusValue& ccin)
602 {
603 const auto& c = std::get<std::vector<uint8_t>>(ccin);
604 _motherboardCCIN = std::string{c.begin(), c.end()};
605 }
606
607 /**
Matt Spinler0e4d72e2020-08-05 12:36:53 -0500608 * @brief Adds the Ufcs- prefix to the location code passed in
609 * if necessary.
Matt Spinler5fb24c12020-06-04 11:21:33 -0500610 *
Matt Spinler0e4d72e2020-08-05 12:36:53 -0500611 * Needed because the location codes that come back from the
Matt Spinler5fb24c12020-06-04 11:21:33 -0500612 * message registry and device callout JSON don't have it.
613 *
614 * @param[in] - The location code without a prefix, like P1-C1
615 *
616 * @return std::string - The location code with the prefix
617 */
618 static std::string addLocationCodePrefix(const std::string& locationCode);
619
620 /**
Matt Spinler2a28c932020-02-03 14:23:40 -0600621 * @brief The D-Bus property or interface watchers that have callbacks
622 * registered that will set members in this class when
623 * they change.
Matt Spinlerc8705e22019-09-11 12:36:07 -0500624 */
Matt Spinler2a28c932020-02-03 14:23:40 -0600625 std::vector<std::unique_ptr<DBusWatcher>> _properties;
Matt Spinlera7d9d962019-11-06 15:01:25 -0600626
627 /**
Matt Spinlerc8705e22019-09-11 12:36:07 -0500628 * @brief The sdbusplus bus object for making D-Bus calls.
629 */
630 sdbusplus::bus::bus& _bus;
Matt Spinlerb3d488f2020-02-21 15:30:46 -0600631
632 /**
633 * @brief The interfacesAdded match object used to wait for inventory
634 * interfaces to show up, so that the object with the motherboard
635 * interface can be found. After it is found, this object is
636 * deleted.
637 */
638 std::unique_ptr<sdbusplus::bus::match_t> _inventoryIfacesAddedMatch;
Matt Spinlerc8705e22019-09-11 12:36:07 -0500639};
640
641} // namespace pels
642} // namespace openpower