xref: /openbmc/bmcweb/redfish-core/include/utils/asset_utils.hpp (revision 1ac7f6cf1e1338a5345f15b8c9183f6e6c0107fa)
1 // SPDX-License-Identifier: Apache-2.0
2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors
3 #pragma once
4 
5 #include "async_resp.hpp"
6 #include "dbus_utility.hpp"
7 #include "error_messages.hpp"
8 #include "logging.hpp"
9 #include "utils/dbus_utils.hpp"
10 
11 #include <asm-generic/errno.h>
12 
13 #include <boost/system/error_code.hpp>
14 #include <nlohmann/json.hpp>
15 #include <sdbusplus/unpack_properties.hpp>
16 
17 #include <functional>
18 #include <memory>
19 #include <ranges>
20 #include <string>
21 
22 namespace redfish
23 {
24 namespace asset_utils
25 {
26 
27 inline void extractAssetInfo(
28     const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
29     const nlohmann::json::json_pointer& jsonKeyName,
30     const dbus::utility::DBusPropertiesMap& assetList,
31     bool includeSparePartNumber = false)
32 {
33     const std::string* manufacturer = nullptr;
34     const std::string* model = nullptr;
35     const std::string* partNumber = nullptr;
36     const std::string* serialNumber = nullptr;
37     const std::string* sparePartNumber = nullptr;
38 
39     const bool success = sdbusplus::unpackPropertiesNoThrow(
40         dbus_utils::UnpackErrorPrinter(), assetList, "Manufacturer",
41         manufacturer, "Model", model, "PartNumber", partNumber, "SerialNumber",
42         serialNumber, "SparePartNumber", sparePartNumber);
43     if (!success)
44     {
45         messages::internalError(asyncResp->res);
46         return;
47     }
48 
49     nlohmann::json& assetData = asyncResp->res.jsonValue[jsonKeyName];
50 
51     if (manufacturer != nullptr)
52     {
53         assetData["Manufacturer"] = *manufacturer;
54     }
55     if (model != nullptr)
56     {
57         assetData["Model"] = *model;
58     }
59     if (partNumber != nullptr)
60     {
61         assetData["PartNumber"] = *partNumber;
62     }
63     if (serialNumber != nullptr)
64     {
65         assetData["SerialNumber"] = *serialNumber;
66     }
67     // SparePartNumber is optional on D-Bus so skip if it is empty
68     if (includeSparePartNumber && sparePartNumber != nullptr &&
69         !sparePartNumber->empty())
70     {
71         assetData["SparePartNumber"] = *sparePartNumber;
72     }
73 }
74 
75 inline void getAssetInfo(const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
76                          const std::string& serviceName,
77                          const std::string& dbusPath,
78                          const nlohmann::json::json_pointer& jsonKeyName,
79                          bool includeSparePartNumber = false)
80 {
81     dbus::utility::getAllProperties(
82         serviceName, dbusPath, "xyz.openbmc_project.Inventory.Decorator.Asset",
83         [asyncResp, jsonKeyName, includeSparePartNumber](
84             const boost::system::error_code& ec,
85             const dbus::utility::DBusPropertiesMap& assetList) {
86             if (ec)
87             {
88                 if (ec.value() != EBADR)
89                 {
90                     BMCWEB_LOG_ERROR("DBUS response error for Properties {}",
91                                      ec.value());
92                     messages::internalError(asyncResp->res);
93                 }
94                 return;
95             }
96             extractAssetInfo(asyncResp, jsonKeyName, assetList,
97                              includeSparePartNumber);
98         });
99 }
100 
101 } // namespace asset_utils
102 } // namespace redfish
103