blob: 020d52821304407386a5a2a6eaf81614642a0cdc [file] [log] [blame]
Lei YU5e0dcb32019-08-02 18:04:34 +08001#pragma once
2
Lei YU4b9ac392019-10-12 11:02:26 +08003#include "types.hpp"
4
Lei YU5e0dcb32019-08-02 18:04:34 +08005#include <sdbusplus/bus.hpp>
Patrick Williams5670b182023-05-10 07:50:50 -05006
7#include <any>
Lei YU65207482019-10-11 16:39:36 +08008#include <set>
Lei YU5e0dcb32019-08-02 18:04:34 +08009#include <string>
10#include <vector>
11
12namespace utils
13{
14
Lei YUf77189f2019-08-07 14:26:30 +080015class UtilsInterface;
16
Lei YU4b9ac392019-10-12 11:02:26 +080017using AssociationList = phosphor::software::updater::AssociationList;
Patrick Williamsb5f9b822022-06-16 17:26:17 -050018using std::any;
19using std::any_cast;
Lei YUf77189f2019-08-07 14:26:30 +080020
21/**
22 * @brief Get the implementation of UtilsInterface
23 */
24const UtilsInterface& getUtils();
Lei YUad90ad52019-08-06 11:19:28 +080025
Lei YU5e0dcb32019-08-02 18:04:34 +080026/**
27 * @brief Get PSU inventory object path from DBus
28 */
Shawn McCarneyd57bd2f2024-12-02 18:40:28 -060029std::vector<std::string> getPSUInventoryPaths(sdbusplus::bus_t& bus);
Lei YU5e0dcb32019-08-02 18:04:34 +080030
Lei YUad90ad52019-08-06 11:19:28 +080031/** @brief Get service name from object path and interface
32 *
33 * @param[in] bus - The Dbus bus object
34 * @param[in] path - The Dbus object path
35 * @param[in] interface - The Dbus interface
36 *
37 * @return The name of the service
38 */
Patrick Williams374fae52022-07-22 19:26:55 -050039std::string getService(sdbusplus::bus_t& bus, const char* path,
Lei YUad90ad52019-08-06 11:19:28 +080040 const char* interface);
41
Lei YUd0bbfa92019-09-11 16:10:54 +080042/** @brief Get all the service names from object path and interface
43 *
44 * @param[in] bus - The Dbus bus object
45 * @param[in] path - The Dbus object path
46 * @param[in] interface - The Dbus interface
47 *
48 * @return The name of the services
49 */
Patrick Williams374fae52022-07-22 19:26:55 -050050std::vector<std::string> getServices(sdbusplus::bus_t& bus, const char* path,
Lei YUd0bbfa92019-09-11 16:10:54 +080051 const char* interface);
52
Lei YUad90ad52019-08-06 11:19:28 +080053/** @brief The template function to get property from the requested dbus path
54 *
55 * @param[in] bus - The Dbus bus object
56 * @param[in] service - The Dbus service name
57 * @param[in] path - The Dbus object path
58 * @param[in] interface - The Dbus interface
59 * @param[in] propertyName - The property name to get
60 *
61 * @return The value of the property
62 */
63template <typename T>
Patrick Williams374fae52022-07-22 19:26:55 -050064T getProperty(sdbusplus::bus_t& bus, const char* service, const char* path,
Lei YUf77189f2019-08-07 14:26:30 +080065 const char* interface, const char* propertyName);
Lei YUad90ad52019-08-06 11:19:28 +080066
67/**
68 * @brief Calculate the version id from the version string.
69 *
70 * @details The version id is a unique 8 hexadecimal digit id
71 * calculated from the version string.
72 *
73 * @param[in] version - The image version string (e.g. v1.99.10-19).
74 *
75 * @return The id.
76 */
77std::string getVersionId(const std::string& version);
78
Lei YU5f3584d2019-08-27 16:28:53 +080079/** @brief Get version of PSU specified by the inventory path
80 *
81 * @param[in] inventoryPath - The PSU inventory object path
82 *
Shawn McCarney783406e2024-11-17 21:49:37 -060083 * @return The version string, or empty string if it fails to get the version
Lei YU5f3584d2019-08-27 16:28:53 +080084 */
85std::string getVersion(const std::string& inventoryPath);
86
Shawn McCarney783406e2024-11-17 21:49:37 -060087/** @brief Get model of PSU specified by the inventory path
88 *
89 * @param[in] inventoryPath - The PSU inventory object path
90 *
91 * @return The model string, or empty string if it fails to get the model
92 */
93std::string getModel(const std::string& inventoryPath);
94
Lei YU65207482019-10-11 16:39:36 +080095/** @brief Get latest version from the PSU versions
96 *
97 * @param[in] versions - The list of the versions
98 *
99 * @return The latest version string
100 */
101std::string getLatestVersion(const std::set<std::string>& versions);
102
Lei YU4b9ac392019-10-12 11:02:26 +0800103/** @brief Check if the PSU is associated
104 *
105 * @param[in] psuInventoryPath - The PSU inventory path
106 * @param[in] assocs - The list of associations
107 *
108 * @return true if the psu is in the association list
109 */
110bool isAssociated(const std::string& psuInventoryPath,
111 const AssociationList& assocs);
112
Lei YUf77189f2019-08-07 14:26:30 +0800113/**
114 * @brief The interface for utils
115 */
116class UtilsInterface
117{
118 public:
George Liu66a54ad2024-08-23 13:53:39 +0800119 UtilsInterface() = default;
120 UtilsInterface(const UtilsInterface&) = delete;
121 UtilsInterface& operator=(const UtilsInterface&) = delete;
122 UtilsInterface(UtilsInterface&&) = delete;
123 UtilsInterface& operator=(UtilsInterface&&) = delete;
124
Lei YUf77189f2019-08-07 14:26:30 +0800125 // For now the code needs to get property for Present and Version
Patrick Williamsbfa8d162020-05-13 18:00:02 -0500126 using PropertyType = std::variant<std::string, bool>;
Lei YUf77189f2019-08-07 14:26:30 +0800127
128 virtual ~UtilsInterface() = default;
129
130 virtual std::vector<std::string>
Shawn McCarneyd57bd2f2024-12-02 18:40:28 -0600131 getPSUInventoryPaths(sdbusplus::bus_t& bus) const = 0;
Lei YUf77189f2019-08-07 14:26:30 +0800132
Patrick Williams374fae52022-07-22 19:26:55 -0500133 virtual std::string getService(sdbusplus::bus_t& bus, const char* path,
Lei YUf77189f2019-08-07 14:26:30 +0800134 const char* interface) const = 0;
135
Lei YUd0bbfa92019-09-11 16:10:54 +0800136 virtual std::vector<std::string>
Patrick Williams374fae52022-07-22 19:26:55 -0500137 getServices(sdbusplus::bus_t& bus, const char* path,
Lei YUd0bbfa92019-09-11 16:10:54 +0800138 const char* interface) const = 0;
139
Lei YUf77189f2019-08-07 14:26:30 +0800140 virtual std::string getVersionId(const std::string& version) const = 0;
141
Lei YU5f3584d2019-08-27 16:28:53 +0800142 virtual std::string getVersion(const std::string& inventoryPath) const = 0;
143
Shawn McCarney783406e2024-11-17 21:49:37 -0600144 virtual std::string getModel(const std::string& inventoryPath) const = 0;
145
Lei YU65207482019-10-11 16:39:36 +0800146 virtual std::string
147 getLatestVersion(const std::set<std::string>& versions) const = 0;
148
Lei YU4b9ac392019-10-12 11:02:26 +0800149 virtual bool isAssociated(const std::string& psuInventoryPath,
150 const AssociationList& assocs) const = 0;
151
Patrick Williams374fae52022-07-22 19:26:55 -0500152 virtual any getPropertyImpl(sdbusplus::bus_t& bus, const char* service,
Lei YUf77189f2019-08-07 14:26:30 +0800153 const char* path, const char* interface,
154 const char* propertyName) const = 0;
155
156 template <typename T>
Patrick Williams374fae52022-07-22 19:26:55 -0500157 T getProperty(sdbusplus::bus_t& bus, const char* service, const char* path,
158 const char* interface, const char* propertyName) const
Lei YUf77189f2019-08-07 14:26:30 +0800159 {
Patrick Williamsbab5ed92024-08-16 15:20:54 -0400160 any result =
161 getPropertyImpl(bus, service, path, interface, propertyName);
Lei YUf77189f2019-08-07 14:26:30 +0800162 auto value = any_cast<PropertyType>(result);
Patrick Williams2e9a3b22020-05-13 12:23:54 -0500163 return std::get<T>(value);
Lei YUf77189f2019-08-07 14:26:30 +0800164 }
165};
166
167class Utils : public UtilsInterface
168{
169 public:
170 std::vector<std::string>
Shawn McCarneyd57bd2f2024-12-02 18:40:28 -0600171 getPSUInventoryPaths(sdbusplus::bus_t& bus) const override;
Lei YUf77189f2019-08-07 14:26:30 +0800172
Patrick Williams374fae52022-07-22 19:26:55 -0500173 std::string getService(sdbusplus::bus_t& bus, const char* path,
Lei YUf77189f2019-08-07 14:26:30 +0800174 const char* interface) const override;
175
Patrick Williams374fae52022-07-22 19:26:55 -0500176 std::vector<std::string> getServices(sdbusplus::bus_t& bus,
Lei YUd0bbfa92019-09-11 16:10:54 +0800177 const char* path,
178 const char* interface) const override;
179
Lei YUf77189f2019-08-07 14:26:30 +0800180 std::string getVersionId(const std::string& version) const override;
181
Lei YU5f3584d2019-08-27 16:28:53 +0800182 std::string getVersion(const std::string& inventoryPath) const override;
183
Shawn McCarney783406e2024-11-17 21:49:37 -0600184 std::string getModel(const std::string& inventoryPath) const override;
185
Lei YU65207482019-10-11 16:39:36 +0800186 std::string
187 getLatestVersion(const std::set<std::string>& versions) const override;
188
Lei YU4b9ac392019-10-12 11:02:26 +0800189 bool isAssociated(const std::string& psuInventoryPath,
190 const AssociationList& assocs) const override;
191
Patrick Williams374fae52022-07-22 19:26:55 -0500192 any getPropertyImpl(sdbusplus::bus_t& bus, const char* service,
Lei YUf77189f2019-08-07 14:26:30 +0800193 const char* path, const char* interface,
194 const char* propertyName) const override;
195};
196
Patrick Williams374fae52022-07-22 19:26:55 -0500197inline std::string getService(sdbusplus::bus_t& bus, const char* path,
Lei YUf77189f2019-08-07 14:26:30 +0800198 const char* interface)
199{
200 return getUtils().getService(bus, path, interface);
201}
202
Patrick Williams374fae52022-07-22 19:26:55 -0500203inline std::vector<std::string>
204 getServices(sdbusplus::bus_t& bus, const char* path, const char* interface)
Lei YUd0bbfa92019-09-11 16:10:54 +0800205{
206 return getUtils().getServices(bus, path, interface);
207}
208
Shawn McCarneyd57bd2f2024-12-02 18:40:28 -0600209inline std::vector<std::string> getPSUInventoryPaths(sdbusplus::bus_t& bus)
Lei YUf77189f2019-08-07 14:26:30 +0800210{
Shawn McCarneyd57bd2f2024-12-02 18:40:28 -0600211 return getUtils().getPSUInventoryPaths(bus);
Lei YUf77189f2019-08-07 14:26:30 +0800212}
213
214inline std::string getVersionId(const std::string& version)
215{
216 return getUtils().getVersionId(version);
217}
218
Lei YU5f3584d2019-08-27 16:28:53 +0800219inline std::string getVersion(const std::string& inventoryPath)
220{
221 return getUtils().getVersion(inventoryPath);
222}
223
Shawn McCarney783406e2024-11-17 21:49:37 -0600224inline std::string getModel(const std::string& inventoryPath)
225{
226 return getUtils().getModel(inventoryPath);
227}
228
Lei YU65207482019-10-11 16:39:36 +0800229inline std::string getLatestVersion(const std::set<std::string>& versions)
230{
231 return getUtils().getLatestVersion(versions);
232}
233
Lei YU4b9ac392019-10-12 11:02:26 +0800234inline bool isAssociated(const std::string& psuInventoryPath,
235 const AssociationList& assocs)
236{
237 return getUtils().isAssociated(psuInventoryPath, assocs);
238}
239
Lei YUf77189f2019-08-07 14:26:30 +0800240template <typename T>
Patrick Williams374fae52022-07-22 19:26:55 -0500241T getProperty(sdbusplus::bus_t& bus, const char* service, const char* path,
Lei YUf77189f2019-08-07 14:26:30 +0800242 const char* interface, const char* propertyName)
243{
244 return getUtils().getProperty<T>(bus, service, path, interface,
245 propertyName);
246}
247
Lei YU5e0dcb32019-08-02 18:04:34 +0800248} // namespace utils