1 /* 2 * Copyright 2004-2024 the Pacemaker project contributors 3 * 4 * The version control history for this file may have further details. 5 * 6 * This source code is licensed under the GNU Lesser General Public License 7 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY. 8 */ 9 10 #ifndef PCMK__CRM_CIB_CIB_TYPES__H 11 # define PCMK__CRM_CIB_CIB_TYPES__H 12 13 # include <glib.h> // gboolean, GList 14 # include <libxml/tree.h> // xmlNode 15 # include <crm/common/ipc.h> 16 # include <crm/common/xml.h> 17 18 #ifdef __cplusplus 19 extern "C" { 20 #endif 21 22 /** 23 * \file 24 * \brief Data types for Cluster Information Base access 25 * \ingroup cib 26 */ 27 28 enum cib_variant { 29 cib_undefined = 0, 30 cib_native = 1, 31 cib_file = 2, 32 cib_remote = 3, 33 34 #if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) 35 //! \deprecated This value will be removed in a future release 36 cib_database = 4, 37 #endif // !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) 38 }; 39 40 enum cib_state { 41 // NOTE: sbd (as of at least 1.5.2) uses this value 42 cib_connected_command, 43 44 // NOTE: sbd (as of at least 1.5.2) uses this value 45 cib_connected_query, 46 47 cib_disconnected 48 }; 49 50 enum cib_conn_type { 51 cib_command, 52 53 // NOTE: sbd (as of at least 1.5.2) uses this value 54 cib_query, 55 56 cib_no_connection, 57 cib_command_nonblocking, 58 }; 59 60 enum cib_call_options { 61 cib_none = 0, 62 cib_verbose = (1 << 0), //!< Prefer stderr to logs 63 cib_xpath = (1 << 1), 64 cib_multiple = (1 << 2), 65 cib_can_create = (1 << 3), 66 cib_discard_reply = (1 << 4), 67 cib_no_children = (1 << 5), 68 cib_xpath_address = (1 << 6), 69 70 //! \deprecated This value will be removed in a future release 71 cib_mixed_update = (1 << 7), 72 73 /* @COMPAT: cib_scope_local is processed only in the legacy function 74 * parse_local_options_v1(). 75 * 76 * If (host == NULL): 77 * * In legacy mode, the CIB manager forwards a request to the primary 78 * instance unless cib_scope_local is set or the local node is primary. 79 * * Outside of legacy mode: 80 * * If a request modifies the CIB, the CIB manager forwards it to all 81 * nodes. 82 * * Otherwise, the CIB manager processes the request locally. 83 * 84 * There is no current use case for this implementing this flag in 85 * non-legacy mode. 86 */ 87 88 // NOTE: sbd (as of at least 1.5.2) uses this value 89 //! \deprecated This value will be removed in a future release 90 cib_scope_local = (1 << 8), 91 92 cib_dryrun = (1 << 9), 93 94 /*! 95 * \brief Process request when the client commits the active transaction 96 * 97 * Add the request to the client's active transaction instead of processing 98 * it immediately. If the client has no active transaction, or if the 99 * request is not supported in transactions, the call will fail. 100 * 101 * The request is added to the transaction synchronously, and the return 102 * value indicates whether it was added successfully. 103 * 104 * Refer to \p cib_api_operations_t:init_transaction() and 105 * \p cib_api_operations_t:end_transaction() for more details on CIB 106 * transactions. 107 */ 108 cib_transaction = (1 << 10), 109 110 /*! 111 * \brief Treat new attribute values as atomic score updates where possible 112 * 113 * This option takes effect when updating XML attributes. For an attribute 114 * named \c "name", if the new value is \c "name++" or \c "name+=X" for some 115 * score \c X, the new value is set as follows: 116 * * If attribute \c "name" is not already set to some value in the element 117 * being updated, the new value is set as a literal string. 118 * * If the new value is \c "name++", then the attribute is set to its 119 * existing value (parsed as a score) plus 1. 120 * * If the new value is \c "name+=X" for some score \c X, then the 121 * attribute is set to its existing value plus \c X, where the existing 122 * value and \c X are parsed and added as scores. 123 * 124 * Scores are integer values capped at \c INFINITY and \c -INFINITY. Refer 125 * to Pacemaker Explained and to the \c pcmk_parse_score() function for more 126 * details on scores, including how they're parsed and added. 127 * 128 * Note: This is implemented only for modify operations. 129 */ 130 cib_score_update = (1 << 11), 131 132 // NOTE: sbd (as of at least 1.5.2) uses this value 133 cib_sync_call = (1 << 12), 134 135 cib_no_mtime = (1 << 13), 136 137 #if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) 138 //! \deprecated This value will be removed in a future release 139 cib_zero_copy = (1 << 14), 140 #endif // !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) 141 142 cib_inhibit_notify = (1 << 16), 143 144 #if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) 145 //! \deprecated This value will be removed in a future release 146 cib_quorum_override = (1 << 20), 147 #endif // !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) 148 149 //! \deprecated This value will be removed in a future release 150 cib_inhibit_bcast = (1 << 24), 151 152 cib_force_diff = (1 << 28), 153 }; 154 155 typedef struct cib_s cib_t; 156 157 typedef struct cib_api_operations_s { 158 // NOTE: sbd (as of at least 1.5.2) uses this 159 int (*signon) (cib_t *cib, const char *name, enum cib_conn_type type); 160 161 //! \deprecated This method will be removed and should not be used 162 int (*signon_raw) (cib_t *cib, const char *name, enum cib_conn_type type, 163 int *event_fd); 164 165 // NOTE: sbd (as of at least 1.5.2) uses this 166 int (*signoff) (cib_t *cib); 167 168 int (*free) (cib_t *cib); 169 170 //! \deprecated This method will be removed and should not be used 171 int (*set_op_callback) (cib_t *cib, void (*callback) (const xmlNode *msg, 172 int callid, int rc, 173 xmlNode *output)); 174 175 // NOTE: sbd (as of at least 1.5.2) uses this 176 int (*add_notify_callback) (cib_t *cib, const char *event, 177 void (*callback) (const char *event, 178 xmlNode *msg)); 179 180 // NOTE: sbd (as of at least 1.5.2) uses this 181 int (*del_notify_callback) (cib_t *cib, const char *event, 182 void (*callback) (const char *event, 183 xmlNode *msg)); 184 // NOTE: sbd (as of at least 1.5.2) uses this 185 int (*set_connection_dnotify) (cib_t *cib, 186 void (*dnotify) (gpointer user_data)); 187 188 //! \deprecated This method will be removed and should not be used 189 int (*inputfd) (cib_t *cib); 190 191 // NOTE: sbd (as of at least 1.5.2) uses this 192 //! \deprecated This method will be removed and should not be used 193 int (*noop) (cib_t *cib, int call_options); 194 195 int (*ping) (cib_t *cib, xmlNode **output_data, int call_options); 196 197 // NOTE: sbd (as of at least 1.5.2) uses this 198 int (*query) (cib_t *cib, const char *section, xmlNode **output_data, 199 int call_options); 200 201 int (*query_from) (cib_t *cib, const char *host, const char *section, 202 xmlNode **output_data, int call_options); 203 204 //! \deprecated This method will be removed and should not be used 205 int (*is_master) (cib_t *cib); 206 207 //! \deprecated Use the set_primary() method instead 208 int (*set_master) (cib_t *cib, int call_options); 209 210 //! \deprecated Use the set_secondary() method instead 211 int (*set_slave) (cib_t *cib, int call_options); 212 213 //! \deprecated This method will be removed and should not be used 214 int (*set_slave_all) (cib_t *cib, int call_options); 215 216 int (*sync) (cib_t *cib, const char *section, int call_options); 217 int (*sync_from) (cib_t *cib, const char *host, const char *section, 218 int call_options); 219 int (*upgrade) (cib_t *cib, int call_options); 220 int (*bump_epoch) (cib_t *cib, int call_options); 221 222 /*! 223 * The \c <failed> element in the reply to a failed creation call is 224 * deprecated since 2.1.8. 225 */ 226 int (*create) (cib_t *cib, const char *section, xmlNode *data, 227 int call_options); 228 int (*modify) (cib_t *cib, const char *section, xmlNode *data, 229 int call_options); 230 231 //! \deprecated Use the \p modify() method instead 232 int (*update) (cib_t *cib, const char *section, xmlNode *data, 233 int call_options); 234 235 int (*replace) (cib_t *cib, const char *section, xmlNode *data, 236 int call_options); 237 int (*remove) (cib_t *cib, const char *section, xmlNode *data, 238 int call_options); 239 int (*erase) (cib_t *cib, xmlNode **output_data, int call_options); 240 241 //! \deprecated This method does nothing and should not be called 242 int (*delete_absolute) (cib_t *cib, const char *section, xmlNode *data, 243 int call_options); 244 245 //! \deprecated This method is not implemented and should not be used 246 int (*quit) (cib_t *cib, int call_options); 247 248 int (*register_notification) (cib_t *cib, const char *callback, 249 int enabled); 250 gboolean (*register_callback) (cib_t *cib, int call_id, int timeout, 251 gboolean only_success, void *user_data, 252 const char *callback_name, 253 void (*callback) (xmlNode*, int, int, 254 xmlNode*, void *)); 255 gboolean (*register_callback_full)(cib_t *cib, int call_id, int timeout, 256 gboolean only_success, void *user_data, 257 const char *callback_name, 258 void (*callback)(xmlNode *, int, int, 259 xmlNode *, void *), 260 void (*free_func)(void *)); 261 262 /*! 263 * \brief Set the local CIB manager as the cluster's primary instance 264 * 265 * \param[in,out] cib CIB connection 266 * \param[in] call_options Group of enum cib_call_options flags 267 * 268 * \return Legacy Pacemaker return code (in particular, pcmk_ok on success) 269 */ 270 int (*set_primary)(cib_t *cib, int call_options); 271 272 /*! 273 * \brief Set the local CIB manager as a secondary instance 274 * 275 * \param[in,out] cib CIB connection 276 * \param[in] call_options Group of enum cib_call_options flags 277 * 278 * \return Legacy Pacemaker return code (in particular, pcmk_ok on success) 279 */ 280 int (*set_secondary)(cib_t *cib, int call_options); 281 282 /*! 283 * \brief Get the given CIB connection's unique client identifier(s) 284 * 285 * These can be used to check whether this client requested the action that 286 * triggered a CIB notification. 287 * 288 * \param[in] cib CIB connection 289 * \param[out] async_id If not \p NULL, where to store asynchronous client 290 * ID 291 * \param[out] sync_id If not \p NULL, where to store synchronous client 292 * ID 293 * 294 * \return Legacy Pacemaker return code 295 * 296 * \note Some variants may have only one client for both asynchronous and 297 * synchronous requests. 298 */ 299 int (*client_id)(const cib_t *cib, const char **async_id, 300 const char **sync_id); 301 302 /*! 303 * \brief Initiate an atomic CIB transaction for this client 304 * 305 * If the client has initiated a transaction and a new request's call 306 * options contain \p cib_transaction, the new request is appended to the 307 * transaction for later processing. 308 * 309 * Supported requests are those that meet the following conditions: 310 * * can be processed synchronously (with any changes applied to a working 311 * CIB copy) 312 * * are not queries 313 * * do not involve other nodes 314 * * do not affect the state of pacemaker-based itself 315 * 316 * Currently supported CIB API functions include: 317 * * \p bump_epoch() 318 * * \p create() 319 * * \p erase() 320 * * \p modify() 321 * * \p remove() 322 * * \p replace() 323 * * \p upgrade() 324 * 325 * Because the transaction is atomic, individual requests do not trigger 326 * callbacks or notifications when they are processed, and they do not 327 * receive output XML. The commit request itself can trigger callbacks and 328 * notifications if any are registered. 329 * 330 * An \c init_transaction() call is always synchronous. 331 * 332 * \param[in,out] cib CIB connection 333 * 334 * \return Legacy Pacemaker return code 335 */ 336 int (*init_transaction)(cib_t *cib); 337 338 /*! 339 * \brief End and optionally commit this client's CIB transaction 340 * 341 * When a client commits a transaction, all requests in the transaction are 342 * processed in a FIFO manner until either a request fails or all requests 343 * have been processed. Changes are applied to a working copy of the CIB. 344 * If a request fails, the transaction and working CIB copy are discarded, 345 * and an error is returned. If all requests succeed, the working CIB copy 346 * replaces the initial CIB copy. 347 * 348 * Callbacks and notifications can be triggered by the commit request itself 349 * but not by the individual requests in a transaction. 350 * 351 * An \c end_transaction() call with \p commit set to \c false is always 352 * synchronous. 353 * 354 * \param[in,out] cib CIB connection 355 * \param[in] commit If \p true, commit transaction; otherwise, 356 * discard it 357 * \param[in] call_options Group of <tt>enum cib_call_options</tt> 358 * flags 359 * 360 * \return Legacy Pacemaker return code 361 */ 362 int (*end_transaction)(cib_t *cib, bool commit, int call_options); 363 364 /*! 365 * \brief Set the user as whom all CIB requests via methods will be executed 366 * 367 * By default, the value of the \c CIB_user environment variable is used if 368 * set. Otherwise, the current effective user is used. 369 * 370 * \param[in,out] cib CIB connection 371 * \param[in] user Name of user whose permissions to use when 372 * processing requests 373 */ 374 void (*set_user)(cib_t *cib, const char *user); 375 376 int (*fetch_schemas)(cib_t *cib, xmlNode **output_data, const char *after_ver, 377 int call_options); 378 } cib_api_operations_t; 379 380 struct cib_s { 381 // NOTE: sbd (as of at least 1.5.2) uses this 382 enum cib_state state; 383 384 enum cib_conn_type type; 385 enum cib_variant variant; 386 387 int call_id; 388 int call_timeout; 389 void *variant_opaque; 390 void *delegate_fn; 391 392 GList *notify_list; 393 394 //! \deprecated This method will be removed in a future release 395 void (*op_callback) (const xmlNode *msg, int call_id, int rc, 396 xmlNode *output); 397 398 // NOTE: sbd (as of at least 1.5.2) uses this 399 cib_api_operations_t *cmds; 400 401 xmlNode *transaction; 402 403 char *user; 404 }; 405 406 #ifdef __cplusplus 407 } 408 #endif 409 410 #endif // PCMK__CRM_CIB_CIB_TYPES__H