root/include/crm/cib/cib_types.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


   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

/* [previous][next][first][last][top][bottom][index][help] */