xref: /openbmc/entity-manager/src/entity_manager/topology.hpp (revision 9a5eec91664d61ed47630a616c2e187c7c6a69bc)
1 #pragma once
2 
3 #include <nlohmann/json.hpp>
4 
5 #include <set>
6 #include <unordered_map>
7 
8 using Association = std::tuple<std::string, std::string, std::string>;
9 
10 using BoardPathsView = decltype(std::views::keys(
11     std::declval<std::map<std::string, std::string>&>()));
12 
13 class AssocName
14 {
15   public:
16     std::string name;
17     std::string reverse;
18 
19     AssocName(const std::string& name, const std::string& reverse,
20               const std::set<std::string>& allowedOnBoardTypes,
21               const std::set<std::string>& allowedOnBoardTypesReverse);
22     AssocName() = delete;
23 
24     // The type (e.g. Chassis, Board, Valve, ...) on which the association is
25     // allowed
26     std::set<std::string> allowedOnBoardTypes;
27 
28     // The type (e.g. Chassis, Board, Valve, ...) on which the reverse
29     // association is allowed
30     std::set<std::string> allowedOnBoardTypesReverse;
31 
32     AssocName getReverse() const;
33 
34     bool operator==(const AssocName& other) const = default;
35     bool operator<(const AssocName& other) const;
36 };
37 
38 extern const std::vector<AssocName> supportedAssocs;
39 
40 class Topology
41 {
42   public:
43     explicit Topology() = default;
44 
45     void addBoard(const std::string& path, const std::string& boardType,
46                   const std::string& boardName,
47                   const nlohmann::json& exposesItem);
48     std::unordered_map<std::string, std::set<Association>> getAssocs(
49         BoardPathsView boardPaths);
50 
51     // Adds an entry to probePaths for object mapper board path
52     // and inventory board path.
53     void addProbePath(const std::string& boardPath,
54                       const std::string& probePath);
55     void remove(const std::string& boardName);
56 
57   private:
58     using Path = std::string;
59     using BoardType = std::string;
60     using BoardName = std::string;
61     using PortType = std::string;
62 
63     void addDownstreamPort(const Path& path, const nlohmann::json& exposesItem);
64 
65     // @brief: fill associations map with the associations for a port identifier
66     // such as 'MB Upstream Port'
67     void fillAssocsForPortId(
68         std::unordered_map<std::string, std::set<Association>>& result,
69         BoardPathsView boardPaths,
70         const std::map<Path, std::set<AssocName>>& pathAssocs);
71 
72     void fillAssocForPortId(
73         std::unordered_map<std::string, std::set<Association>>& result,
74         BoardPathsView boardPaths, const Path& upstream, const Path& downstream,
75         const AssocName& assocName);
76 
77     void addConfiguredPort(const Path& path, const nlohmann::json& exposesItem);
78     void addPort(const PortType& port, const Path& path,
79                  const AssocName& assocName);
80 
81     static std::optional<AssocName> getAssocByName(const std::string& name);
82 
83     // Maps the port name to the participating paths.
84     // each path also has their role(s) in the association.
85     // For example a PSU path which is part of "MB Upstream Port"
86     // will have "powering" role.
87     std::unordered_map<PortType, std::map<Path, std::set<AssocName>>> ports;
88 
89     std::unordered_map<Path, BoardType> boardTypes;
90     std::unordered_map<BoardName, Path> boardNames;
91 
92     // Represents the mapping between inventory object pathes of a
93     // probed configuration and the object paths of DBus interfaces
94     // it was probed on.
95     std::unordered_map<Path, std::set<Path>> probePaths;
96 };
97