1 #pragma once
2 
3 #include "types.hpp"
4 
5 constexpr const char* xyzAssociationInterface =
6     "xyz.openbmc_project.Association";
7 
8 /** @brief Remove input association
9  *
10  * @param[in] sourcePath          - Path of the object that contains the
11  *                                  org.openbmc.Associations
12  * @param[in] owner               - The Dbus service having its associations
13  *                                  removed
14  * @param[in,out] server          - sdbus system object
15  * @param[in,out] assocMaps       - The association maps
16  *
17  * @return Void, server, assocMaps updated if needed
18  */
19 void removeAssociation(const std::string& sourcePath, const std::string& owner,
20                        sdbusplus::asio::object_server& server,
21                        AssociationMaps& assocMaps);
22 
23 /** @brief Remove input paths from endpoints of an association
24  *
25  * If the last endpoint was removed, then remove the whole
26  * association object, otherwise just set the property
27  *
28  * @param[in] objectServer        - sdbus system object
29  * @param[in] assocPath           - Path of the object that contains the
30  *                                  org.openbmc.Associations
31  * @param[in] endpointsToRemove   - Endpoints to remove
32  * @param[in,out] assocMaps       - The association maps
33  *
34  * @return Void, objectServer and assocMaps updated if needed
35  */
36 void removeAssociationEndpoints(
37     sdbusplus::asio::object_server& objectServer, const std::string& assocPath,
38     const boost::container::flat_set<std::string>& endpointsToRemove,
39     AssociationMaps& assocMaps);
40 
41 /** @brief Check and remove any changed associations
42  *
43  * Based on the latest values of the org.openbmc.Associations.associations
44  * property, passed in via the newAssociations param, check if any of the
45  * paths in the xyz.openbmc_project.Association.endpoints D-Bus property
46  * for that association need to be removed.  If the last path is removed
47  * from the endpoints property, remove that whole association object from
48  * D-Bus.
49  *
50  * @param[in] sourcePath         - Path of the object that contains the
51  *                                 org.openbmc.Associations
52  * @param[in] owner              - The Dbus service having it's associatons
53  *                                 changed
54  * @param[in] newAssociations    - New associations to look at for change
55  * @param[in,out] objectServer   - sdbus system object
56  * @param[in,out] assocMaps      - The association maps
57  *
58  * @return Void, objectServer and assocMaps updated if needed
59  */
60 void checkAssociationEndpointRemoves(
61     const std::string& sourcePath, const std::string& owner,
62     const AssociationPaths& newAssociations,
63     sdbusplus::asio::object_server& objectServer, AssociationMaps& assocMaps);
64 
65 /** @brief Handle new or changed association interfaces
66  *
67  * Called when either a new org.openbmc.Associations interface was
68  * created, or the associations property on that interface changed
69  *
70  * @param[in,out] objectServer    - sdbus system object
71  * @param[in] associations        - New associations to look at for change
72  * @param[in] path                - Path of the object that contains the
73  *                                  org.openbmc.Associations
74  * @param[in] owner               - The Dbus service having it's associatons
75  *                                  changed
76  * @param[in] interfaceMap        - The full interface map
77  * @param[in,out] assocMaps       - The association maps
78  *
79  * @return Void, objectServer and assocMaps updated if needed
80  */
81 void associationChanged(sdbusplus::asio::object_server& objectServer,
82                         const std::vector<Association>& associations,
83                         const std::string& path, const std::string& owner,
84                         const InterfaceMapType& interfaceMap,
85                         AssociationMaps& assocMaps);
86 
87 /** @brief Add a pending associations entry
88  *
89  *  Used when a client wants to create an association between
90  *  2 D-Bus endpoint paths, but one of the paths doesn't exist.
91  *  When the path does show up in D-Bus, if there is a pending
92  *  association then the real association objects can be created.
93  *
94  * @param[in] objectPath    - The D-Bus object path that should be an
95  *                            association endpoint but doesn't exist
96  *                            on D-Bus.
97  * @param[in] type          - The association type.  Gets used in the final
98  *                            association path of <objectPath>/<type>.
99  * @param[in] endpointPath  - The D-Bus path on the other side
100  *                            of the association. This path exists.
101  * @param[in] endpointType  - The endpoint association type. Gets used
102  *                            in the final association path of
103  *                            <endpointPath>/<endpointType>.
104  * @param[in] owner         - The service name that owns the association.
105  * @param[in,out] assocMaps - The association maps
106  */
107 void addPendingAssociation(const std::string& objectPath,
108                            const std::string& type,
109                            const std::string& endpointPath,
110                            const std::string& endpointType,
111                            const std::string& owner,
112                            AssociationMaps& assocMaps);
113 
114 /** @brief Removes an endpoint from the pending associations map
115  *
116  * If the last endpoint is removed, removes the whole entry
117  *
118  * @param[in] endpointPath  - the endpoint path to remove
119  * @param[in,out] assocMaps - The association maps
120  */
121 void removeFromPendingAssociations(const std::string& endpointPath,
122                                    AssociationMaps& assocMaps);
123 
124 /** @brief Adds a single association D-Bus object (<path>/<type>)
125  *
126  * @param[in,out] server    - sdbus system object
127  * @param[in] assocPath     - The association D-Bus path
128  * @param[in] endpoint      - The association's D-Bus endpoint path
129  * @param[in] owner         - The owning D-Bus well known name
130  * @param[in] ownerPath     - The D-Bus path hosting the Associations property
131  * @param[in,out] assocMaps - The association maps
132  */
133 void addSingleAssociation(sdbusplus::asio::object_server& server,
134                           const std::string& assocPath,
135                           const std::string& endpoint, const std::string& owner,
136                           const std::string& ownerPath,
137                           AssociationMaps& assocMaps);
138 
139 /** @brief Create a real association out of a pending association
140  *         if there is one for this path.
141  *
142  * If objectPath is now on D-Bus, and it is also in the pending associations
143  * map, create the 2 real association objects and remove its pending
144  * associations entry.  Used when a new path shows up in D-Bus.
145  *
146  * @param[in] objectPath    - the path to check
147  * @param[in] interfaceMap  - The master interface map
148  * @param[in,out] assocMaps - The association maps
149  * @param[in,out] server    - sdbus system object
150  */
151 void checkIfPendingAssociation(const std::string& objectPath,
152                                const InterfaceMapType& interfaceMap,
153                                AssociationMaps& assocMaps,
154                                sdbusplus::asio::object_server& server);
155 
156 /** @brief Find all associations in the association owners map with the
157  *         specified endpoint path.
158  *
159  * @param[in] endpointPath     - the endpoint path to look for
160  * @param[in] assocMaps        - The association maps
161  * @param[out] associationData - A vector of {owner, Association} tuples
162  *                               of all the associations with that endpoint.
163  */
164 void findAssociations(const std::string& endpointPath,
165                       AssociationMaps& assocMaps,
166                       FindAssocResults& associationData);
167 
168 /** @brief If endpointPath is in an association, move that association
169  *         to pending and remove the association objects.
170  *
171  *  Called when a path is going off of D-Bus.  If this path is an
172  *  association endpoint (the path that owns the association is still
173  *  on D-Bus), then move the association it's involved in to pending.
174  *
175  * @param[in] endpointPath  - the D-Bus endpoint path to check
176  * @param[in,out] assocMaps - The association maps
177  * @param[in,out] server    - sdbus system object
178  */
179 void moveAssociationToPending(const std::string& endpointPath,
180                               AssociationMaps& assocMaps,
181                               sdbusplus::asio::object_server& server);
182