root/include/crm/pengine/pe_types.h

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

INCLUDED FROM


   1 /*
   2  * Copyright 2004-2020 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 PE_TYPES__H
  11 #  define PE_TYPES__H
  12 
  13 #ifdef __cplusplus
  14 extern "C" {
  15 #endif
  16 
  17 /*!
  18  * \file
  19  * \brief Data types for cluster status
  20  * \ingroup pengine
  21  */
  22 
  23 #  include <stdbool.h>              // bool
  24 #  include <sys/types.h>            // time_t
  25 #  include <glib.h>                 // gboolean, guint, GList, GHashTable
  26 #  include <crm/crm.h>              // GListPtr
  27 #  include <crm/common/iso8601.h>
  28 #  include <crm/pengine/common.h>
  29 
  30 typedef struct pe_node_s pe_node_t;
  31 typedef struct pe_action_s pe_action_t;
  32 typedef struct pe_resource_s pe_resource_t;
  33 typedef struct pe_working_set_s pe_working_set_t;
  34 
  35 enum pe_obj_types {
  36     pe_unknown = -1,
  37     pe_native = 0,
  38     pe_group = 1,
  39     pe_clone = 2,
  40     pe_container = 3,
  41 };
  42 
  43 typedef struct resource_object_functions_s {
  44     gboolean (*unpack) (pe_resource_t*, pe_working_set_t*);
  45     pe_resource_t *(*find_rsc) (pe_resource_t *parent, const char *search,
  46                                 const pe_node_t *node, int flags);
  47     /* parameter result must be free'd */
  48     char *(*parameter) (pe_resource_t*, pe_node_t*, gboolean, const char*,
  49                         pe_working_set_t*);
  50     void (*print) (pe_resource_t*, const char*, long, void*);
  51     gboolean (*active) (pe_resource_t*, gboolean);
  52     enum rsc_role_e (*state) (const pe_resource_t*, gboolean);
  53     pe_node_t *(*location) (const pe_resource_t*, GList**, int);
  54     void (*free) (pe_resource_t*);
  55     void (*count) (pe_resource_t*);
  56     gboolean (*is_filtered) (pe_resource_t*, GListPtr, gboolean);
  57 } resource_object_functions_t;
  58 
  59 typedef struct resource_alloc_functions_s resource_alloc_functions_t;
  60 
  61 enum pe_quorum_policy {
  62     no_quorum_freeze,
  63     no_quorum_stop,
  64     no_quorum_ignore,
  65     no_quorum_suicide,
  66     no_quorum_demote
  67 };
  68 
  69 enum node_type {
  70     node_ping,
  71     node_member,
  72     node_remote
  73 };
  74 
  75 //! \deprecated will be removed in a future release
  76 enum pe_restart {
  77     pe_restart_restart,
  78     pe_restart_ignore
  79 };
  80 
  81 //! Determine behavior of pe_find_resource_with_flags()
  82 enum pe_find {
  83     pe_find_renamed  = 0x001, //!< match resource ID or LRM history ID
  84     pe_find_anon     = 0x002, //!< match base name of anonymous clone instances
  85     pe_find_clone    = 0x004, //!< match only clone instances
  86     pe_find_current  = 0x008, //!< match resource active on specified node
  87     pe_find_inactive = 0x010, //!< match resource not running anywhere
  88     pe_find_any      = 0x020, //!< match base name of any clone instance
  89 };
  90 
  91 // @TODO Make these an enum
  92 
  93 #  define pe_flag_have_quorum           0x00000001ULL
  94 #  define pe_flag_symmetric_cluster     0x00000002ULL
  95 #  define pe_flag_maintenance_mode      0x00000008ULL
  96 
  97 #  define pe_flag_stonith_enabled       0x00000010ULL
  98 #  define pe_flag_have_stonith_resource 0x00000020ULL
  99 #  define pe_flag_enable_unfencing      0x00000040ULL
 100 #  define pe_flag_concurrent_fencing    0x00000080ULL
 101 
 102 #  define pe_flag_stop_rsc_orphans      0x00000100ULL
 103 #  define pe_flag_stop_action_orphans   0x00000200ULL
 104 #  define pe_flag_stop_everything       0x00000400ULL
 105 
 106 #  define pe_flag_start_failure_fatal   0x00001000ULL
 107 #  define pe_flag_remove_after_stop     0x00002000ULL
 108 #  define pe_flag_startup_fencing       0x00004000ULL
 109 #  define pe_flag_shutdown_lock         0x00008000ULL
 110 
 111 #  define pe_flag_startup_probes        0x00010000ULL
 112 #  define pe_flag_have_status           0x00020000ULL
 113 #  define pe_flag_have_remote_nodes     0x00040000ULL
 114 
 115 #  define pe_flag_quick_location        0x00100000ULL
 116 #  define pe_flag_sanitized             0x00200000ULL
 117 #  define pe_flag_stdout                0x00400000ULL
 118 
 119 //! Don't count total, disabled and blocked resource instances
 120 #  define pe_flag_no_counts             0x00800000ULL
 121 
 122 /*! Skip deprecated code that is kept solely for backward API compatibility.
 123  * (Internal code should always set this.)
 124  */
 125 #  define pe_flag_no_compat             0x01000000ULL
 126 
 127 struct pe_working_set_s {
 128     xmlNode *input;
 129     crm_time_t *now;
 130 
 131     /* options extracted from the input */
 132     char *dc_uuid;
 133     pe_node_t *dc_node;
 134     const char *stonith_action;
 135     const char *placement_strategy;
 136 
 137     unsigned long long flags;
 138 
 139     int stonith_timeout;
 140     enum pe_quorum_policy no_quorum_policy;
 141 
 142     GHashTable *config_hash;
 143     GHashTable *tickets;
 144 
 145     // Actions for which there can be only one (e.g. fence nodeX)
 146     GHashTable *singletons;
 147 
 148     GListPtr nodes;
 149     GListPtr resources;
 150     GListPtr placement_constraints;
 151     GListPtr ordering_constraints;
 152     GListPtr colocation_constraints;
 153     GListPtr ticket_constraints;
 154 
 155     GListPtr actions;
 156     xmlNode *failed;
 157     xmlNode *op_defaults;
 158     xmlNode *rsc_defaults;
 159 
 160     /* stats */
 161     int num_synapse;
 162     int max_valid_nodes;    //! Deprecated (will be removed in a future release)
 163     int order_id;
 164     int action_id;
 165 
 166     /* final output */
 167     xmlNode *graph;
 168 
 169     GHashTable *template_rsc_sets;
 170     const char *localhost;
 171     GHashTable *tags;
 172 
 173     int blocked_resources;
 174     int disabled_resources;
 175 
 176     GList *param_check; // History entries that need to be checked
 177     GList *stop_needed; // Containers that need stop actions
 178     time_t recheck_by;  // Hint to controller to re-run scheduler by this time
 179     int ninstances;     // Total number of resource instances
 180     guint shutdown_lock;// How long (seconds) to lock resources to shutdown node
 181     int priority_fencing_delay; // Priority fencing delay
 182 };
 183 
 184 enum pe_check_parameters {
 185     /* Clear fail count if parameters changed for un-expired start or monitor
 186      * last_failure.
 187      */
 188     pe_check_last_failure,
 189 
 190     /* Clear fail count if parameters changed for start, monitor, promote, or
 191      * migrate_from actions for active resources.
 192      */
 193     pe_check_active,
 194 };
 195 
 196 struct pe_node_shared_s {
 197     const char *id;
 198     const char *uname;
 199     enum node_type type;
 200 
 201     /* @TODO convert these flags into a bitfield */
 202     gboolean online;
 203     gboolean standby;
 204     gboolean standby_onfail;
 205     gboolean pending;
 206     gboolean unclean;
 207     gboolean unseen;
 208     gboolean shutdown;
 209     gboolean expected_up;
 210     gboolean is_dc;
 211     gboolean maintenance;
 212     gboolean rsc_discovery_enabled;
 213     gboolean remote_requires_reset;
 214     gboolean remote_was_fenced;
 215     gboolean remote_maintenance; /* what the remote-rsc is thinking */
 216     gboolean unpacked;
 217 
 218     int num_resources;
 219     pe_resource_t *remote_rsc;
 220     GListPtr running_rsc;       /* pe_resource_t* */
 221     GListPtr allocated_rsc;     /* pe_resource_t* */
 222 
 223     GHashTable *attrs;          /* char* => char* */
 224     GHashTable *utilization;
 225     GHashTable *digest_cache;   //!< cache of calculated resource digests
 226     int priority; // calculated based on the priority of resources running on the node
 227 };
 228 
 229 struct pe_node_s {
 230     int weight;
 231     gboolean fixed;
 232     int count;
 233     struct pe_node_shared_s *details;
 234     int rsc_discover_mode;
 235 };
 236 
 237 #  define pe_rsc_orphan                     0x00000001ULL
 238 #  define pe_rsc_managed                    0x00000002ULL
 239 #  define pe_rsc_block                      0x00000004ULL
 240 #  define pe_rsc_orphan_container_filler    0x00000008ULL
 241 
 242 #  define pe_rsc_notify                     0x00000010ULL
 243 #  define pe_rsc_unique                     0x00000020ULL
 244 #  define pe_rsc_fence_device               0x00000040ULL
 245 #  define pe_rsc_promotable                 0x00000080ULL
 246 
 247 #  define pe_rsc_provisional                0x00000100ULL
 248 #  define pe_rsc_allocating                 0x00000200ULL
 249 #  define pe_rsc_merging                    0x00000400ULL
 250 
 251 #  define pe_rsc_stop                       0x00001000ULL
 252 #  define pe_rsc_reload                     0x00002000ULL
 253 #  define pe_rsc_allow_remote_remotes       0x00004000ULL
 254 
 255 #  define pe_rsc_failed                     0x00010000ULL
 256 #  define pe_rsc_runnable                   0x00040000ULL
 257 #  define pe_rsc_start_pending              0x00080000ULL
 258 
 259 #  define pe_rsc_starting                   0x00100000ULL
 260 #  define pe_rsc_stopping                   0x00200000ULL
 261 #  define pe_rsc_allow_migrate              0x00800000ULL
 262 
 263 #  define pe_rsc_failure_ignored            0x01000000ULL
 264 #  define pe_rsc_maintenance                0x04000000ULL
 265 #  define pe_rsc_is_container               0x08000000ULL
 266 
 267 #  define pe_rsc_needs_quorum               0x10000000ULL
 268 #  define pe_rsc_needs_fencing              0x20000000ULL
 269 #  define pe_rsc_needs_unfencing            0x40000000ULL
 270 
 271 enum pe_graph_flags {
 272     pe_graph_none = 0x00000,
 273     pe_graph_updated_first = 0x00001,
 274     pe_graph_updated_then = 0x00002,
 275     pe_graph_disable = 0x00004,
 276 };
 277 
 278 /* *INDENT-OFF* */
 279 enum pe_action_flags {
 280     pe_action_pseudo = 0x00001,
 281     pe_action_runnable = 0x00002,
 282     pe_action_optional = 0x00004,
 283     pe_action_print_always = 0x00008,
 284 
 285     pe_action_have_node_attrs = 0x00010,
 286     pe_action_implied_by_stonith = 0x00040,
 287     pe_action_migrate_runnable =   0x00080,
 288 
 289     pe_action_dumped = 0x00100,
 290     pe_action_processed = 0x00200,
 291     pe_action_clear = 0x00400,
 292     pe_action_dangle = 0x00800,
 293 
 294     /* This action requires one or more of its dependencies to be runnable.
 295      * We use this to clear the runnable flag before checking dependencies.
 296      */
 297     pe_action_requires_any = 0x01000,
 298 
 299     pe_action_reschedule = 0x02000,
 300     pe_action_tracking = 0x04000,
 301     pe_action_dedup = 0x08000, //! Internal state tracking when creating graph
 302 
 303     pe_action_dc = 0x10000,         //! Action may run on DC instead of target
 304 };
 305 /* *INDENT-ON* */
 306 
 307 struct pe_resource_s {
 308     char *id;
 309     char *clone_name;
 310     xmlNode *xml;
 311     xmlNode *orig_xml;
 312     xmlNode *ops_xml;
 313 
 314     pe_working_set_t *cluster;
 315     pe_resource_t *parent;
 316 
 317     enum pe_obj_types variant;
 318     void *variant_opaque;
 319     resource_object_functions_t *fns;
 320     resource_alloc_functions_t *cmds;
 321 
 322     enum rsc_recovery_type recovery_type;
 323 
 324     // @TODO only pe_restart_restart is of interest, so merge into flags
 325     enum pe_restart restart_type; //!< \deprecated will be removed in future release
 326 
 327     int priority;
 328     int stickiness;
 329     int sort_index;
 330     int failure_timeout;
 331     int migration_threshold;
 332     guint remote_reconnect_ms;
 333     char *pending_task;
 334 
 335     unsigned long long flags;
 336 
 337     // @TODO merge these into flags
 338     gboolean is_remote_node;
 339     gboolean exclusive_discover;
 340 
 341     //!@{
 342     //! This field should be treated as internal to Pacemaker
 343     GListPtr rsc_cons_lhs;      // List of rsc_colocation_t*
 344     GListPtr rsc_cons;          // List of rsc_colocation_t*
 345     GListPtr rsc_location;      // List of pe__location_t*
 346     GListPtr actions;           // List of pe_action_t*
 347     GListPtr rsc_tickets;       // List of rsc_ticket*
 348     //!@}
 349 
 350     pe_node_t *allocated_to;
 351     pe_node_t *partial_migration_target;
 352     pe_node_t *partial_migration_source;
 353     GListPtr running_on;        /* pe_node_t*   */
 354     GHashTable *known_on;       /* pe_node_t*   */
 355     GHashTable *allowed_nodes;  /* pe_node_t*   */
 356 
 357     enum rsc_role_e role;
 358     enum rsc_role_e next_role;
 359 
 360     GHashTable *meta;
 361     GHashTable *parameters;
 362     GHashTable *utilization;
 363 
 364     GListPtr children;          /* pe_resource_t*   */
 365     GListPtr dangling_migrations;       /* pe_node_t*       */
 366 
 367     pe_resource_t *container;
 368     GListPtr fillers;
 369 
 370     pe_node_t *pending_node;    // Node on which pending_task is happening
 371     pe_node_t *lock_node;       // Resource is shutdown-locked to this node
 372     time_t lock_time;           // When shutdown lock started
 373 
 374 #if ENABLE_VERSIONED_ATTRS
 375     xmlNode *versioned_parameters;
 376 #endif
 377 };
 378 
 379 #if ENABLE_VERSIONED_ATTRS
 380 // Used as action->action_details if action->rsc is not NULL
 381 typedef struct pe_rsc_action_details_s {
 382     xmlNode *versioned_parameters;
 383     xmlNode *versioned_meta;
 384 } pe_rsc_action_details_t;
 385 #endif
 386 
 387 struct pe_action_s {
 388     int id;
 389     int priority;
 390 
 391     pe_resource_t *rsc;
 392     pe_node_t *node;
 393     xmlNode *op_entry;
 394 
 395     char *task;
 396     char *uuid;
 397     char *cancel_task;
 398     char *reason;
 399 
 400     enum pe_action_flags flags;
 401     enum rsc_start_requirement needs;
 402     enum action_fail_response on_fail;
 403     enum rsc_role_e fail_role;
 404 
 405     GHashTable *meta;
 406     GHashTable *extra;
 407 
 408     /* 
 409      * These two varables are associated with the constraint logic
 410      * that involves first having one or more actions runnable before
 411      * then allowing this action to execute.
 412      *
 413      * These varables are used with features such as 'clone-min' which
 414      * requires at minimum X number of cloned instances to be running
 415      * before an order dependency can run. Another option that uses
 416      * this is 'require-all=false' in ordering constrants. This option
 417      * says "only require one instance of a resource to start before
 418      * allowing dependencies to start" -- basically, require-all=false is
 419      * the same as clone-min=1.
 420      */
 421 
 422     /* current number of known runnable actions in the before list. */
 423     int runnable_before;
 424     /* the number of "before" runnable actions required for this action
 425      * to be considered runnable */ 
 426     int required_runnable_before;
 427 
 428     GListPtr actions_before;    /* pe_action_wrapper_t* */
 429     GListPtr actions_after;     /* pe_action_wrapper_t* */
 430 
 431     /* Some of the above fields could be moved to the details,
 432      * except for API backward compatibility.
 433      */
 434     void *action_details; // varies by type of action
 435 };
 436 
 437 typedef struct pe_ticket_s {
 438     char *id;
 439     gboolean granted;
 440     time_t last_granted;
 441     gboolean standby;
 442     GHashTable *state;
 443 } pe_ticket_t;
 444 
 445 typedef struct pe_tag_s {
 446     char *id;
 447     GListPtr refs;
 448 } pe_tag_t;
 449 
 450 //! Internal tracking for transition graph creation
 451 enum pe_link_state {
 452     pe_link_not_dumped, //! Internal tracking for transition graph creation
 453     pe_link_dumped,     //! Internal tracking for transition graph creation
 454     pe_link_dup,        //! \deprecated No longer used by Pacemaker
 455 };
 456 
 457 enum pe_discover_e {
 458     pe_discover_always = 0,
 459     pe_discover_never,
 460     pe_discover_exclusive,
 461 };
 462 
 463 /* *INDENT-OFF* */
 464 enum pe_ordering {
 465     pe_order_none                  = 0x0,       /* deleted */
 466     pe_order_optional              = 0x1,       /* pure ordering, nothing implied */
 467     pe_order_apply_first_non_migratable = 0x2,  /* Only apply this constraint's ordering if first is not migratable. */
 468 
 469     pe_order_implies_first         = 0x10,      /* If 'then' is required, ensure 'first' is too */
 470     pe_order_implies_then          = 0x20,      /* If 'first' is required, ensure 'then' is too */
 471     pe_order_implies_first_master  = 0x40,      /* Imply 'first' is required when 'then' is required and then's rsc holds Master role. */
 472 
 473     /* first requires then to be both runnable and migrate runnable. */
 474     pe_order_implies_first_migratable  = 0x80,
 475 
 476     pe_order_runnable_left         = 0x100,     /* 'then' requires 'first' to be runnable */
 477 
 478     pe_order_pseudo_left           = 0x200,     /* 'then' can only be pseudo if 'first' is runnable */
 479     pe_order_implies_then_on_node  = 0x400,     /* If 'first' is required on 'nodeX',
 480                                                  * ensure instances of 'then' on 'nodeX' are too.
 481                                                  * Only really useful if 'then' is a clone and 'first' is not
 482                                                  */
 483     pe_order_probe                 = 0x800,     /* If 'first->rsc' is
 484                                                  *  - running but about to stop, ignore the constraint
 485                                                  *  - otherwise, behave as runnable_left
 486                                                  */
 487 
 488     pe_order_restart               = 0x1000,    /* 'then' is runnable if 'first' is optional or runnable */
 489     pe_order_stonith_stop          = 0x2000,    /* only applies if the action is non-pseudo */
 490     pe_order_serialize_only        = 0x4000,    /* serialize */
 491     pe_order_same_node             = 0x8000,    /* applies only if 'first' and 'then' are on same node */
 492 
 493     pe_order_implies_first_printed = 0x10000,   /* Like ..implies_first but only ensures 'first' is printed, not mandatory */
 494     pe_order_implies_then_printed  = 0x20000,   /* Like ..implies_then but only ensures 'then' is printed, not mandatory */
 495 
 496     pe_order_asymmetrical          = 0x100000,  /* Indicates asymmetrical one way ordering constraint. */
 497     pe_order_load                  = 0x200000,  /* Only relevant if... */
 498     pe_order_one_or_more           = 0x400000,  /* 'then' is runnable only if one or more of its dependencies are too */
 499     pe_order_anti_colocation       = 0x800000,
 500 
 501     pe_order_preserve              = 0x1000000, /* Hack for breaking user ordering constraints with container resources */
 502     pe_order_then_cancels_first    = 0x2000000, // if 'then' becomes required, 'first' becomes optional
 503     pe_order_trace                 = 0x4000000, /* test marker */
 504 };
 505 /* *INDENT-ON* */
 506 
 507 typedef struct pe_action_wrapper_s {
 508     enum pe_ordering type;
 509     enum pe_link_state state;
 510     pe_action_t *action;
 511 } pe_action_wrapper_t;
 512 
 513 #ifndef PCMK__NO_COMPAT
 514 /* Everything here is deprecated and kept only for public API backward
 515  * compatibility. It will be moved to compatibility.h in a future release.
 516  */
 517 
 518 //!< \deprecated Use pe_action_t instead
 519 typedef struct pe_action_s action_t;
 520 //!< \deprecated Use pe_action_wrapper_t instead
 521 typedef struct pe_action_wrapper_s action_wrapper_t;
 522 //!< \deprecated Use pe_node_t instead
 523 typedef struct pe_node_s node_t;
 524 //!< \deprecated Use enum pe_quorum_policy instead
 525 typedef enum pe_quorum_policy no_quorum_policy_t;
 526 //!< \deprecated use pe_resource_t instead
 527 typedef struct pe_resource_s resource_t;
 528 //!< \deprecated Use pe_tag_t instead
 529 typedef struct pe_tag_s tag_t;
 530 //!< \deprecated Use pe_ticket_t instead
 531 typedef struct pe_ticket_s ticket_t;
 532 
 533 #endif
 534 
 535 #ifdef __cplusplus
 536 }
 537 #endif
 538 
 539 #endif // PE_TYPES__H

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