1 /* 2 * Copyright 2004-2023 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_COMMON_NODES__H 11 # define PCMK__CRM_COMMON_NODES__H 12 13 #include <glib.h> // gboolean, GList, GHashTable 14 15 #include <crm/common/scheduler_types.h> // pcmk_resource_t, pcmk_scheduler_t 16 17 #ifdef __cplusplus 18 extern "C" { 19 #endif 20 21 /*! 22 * \file 23 * \brief Scheduler API for nodes 24 * \ingroup core 25 */ 26 27 // Special node attributes 28 29 #define PCMK_NODE_ATTR_TERMINATE "terminate" 30 31 32 //! Possible node types 33 enum node_type { 34 pcmk_node_variant_cluster = 1, //!< Cluster layer node 35 pcmk_node_variant_remote = 2, //!< Pacemaker Remote node 36 37 node_ping = 0, //!< \deprecated Do not use 38 #if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) 39 //! \deprecated Use pcmk_node_variant_cluster instead 40 node_member = pcmk_node_variant_cluster, 41 42 //! \deprecated Use pcmk_node_variant_remote instead 43 node_remote = pcmk_node_variant_remote, 44 #endif 45 }; 46 47 //! When to probe a resource on a node (as specified in location constraints) 48 enum pe_discover_e { 49 pcmk_probe_always = 0, //! Always probe resource on node 50 pcmk_probe_never = 1, //! Never probe resource on node 51 pcmk_probe_exclusive = 2, //! Probe only on designated nodes 52 53 #if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1) 54 //! \deprecated Use pcmk_probe_always instead 55 pe_discover_always = pcmk_probe_always, 56 57 //! \deprecated Use pcmk_probe_never instead 58 pe_discover_never = pcmk_probe_never, 59 60 //! \deprecated Use pcmk_probe_exclusive instead 61 pe_discover_exclusive = pcmk_probe_exclusive, 62 #endif 63 }; 64 65 //! Basic node information (all node objects for the same node share this) 66 struct pe_node_shared_s { 67 const char *id; //!< Node ID at the cluster layer 68 const char *uname; //!< Node name in cluster 69 enum node_type type; //!< Node variant 70 71 // @TODO Convert these into a flag group 72 gboolean online; //!< Whether online 73 gboolean standby; //!< Whether in standby mode 74 gboolean standby_onfail; //!< Whether in standby mode due to on-fail 75 gboolean pending; //!< Whether controller membership is pending 76 gboolean unclean; //!< Whether node requires fencing 77 gboolean unseen; //!< Whether node has never joined cluster 78 gboolean shutdown; //!< Whether shutting down 79 gboolean expected_up; //!< Whether expected join state is member 80 gboolean is_dc; //!< Whether node is cluster's DC 81 gboolean maintenance; //!< Whether in maintenance mode 82 gboolean rsc_discovery_enabled; //!< Whether probes are allowed on node 83 84 /*! 85 * Whether this is a guest node whose guest resource must be recovered or a 86 * remote node that must be fenced 87 */ 88 gboolean remote_requires_reset; 89 90 /*! 91 * Whether this is a Pacemaker Remote node that was fenced since it was last 92 * connected by the cluster 93 */ 94 gboolean remote_was_fenced; 95 96 /*! 97 * Whether this is a Pacemaker Remote node previously marked in its 98 * node state as being in maintenance mode 99 */ 100 gboolean remote_maintenance; 101 102 gboolean unpacked; //!< Whether node history has been unpacked 103 104 /*! 105 * Number of resources active on this node (valid after CIB status section 106 * has been unpacked, as long as pcmk_sched_no_counts was not set) 107 */ 108 int num_resources; 109 110 //! Remote connection resource for node, if it is a Pacemaker Remote node 111 pcmk_resource_t *remote_rsc; 112 113 GList *running_rsc; //!< List of resources active on node 114 GList *allocated_rsc; //!< List of resources assigned to node 115 GHashTable *attrs; //!< Node attributes 116 GHashTable *utilization; //!< Node utilization attributes 117 GHashTable *digest_cache; //!< Cache of calculated resource digests 118 119 /*! 120 * Sum of priorities of all resources active on node and on any guest nodes 121 * connected to this node, with +1 for promoted instances (used to compare 122 * nodes for priority-fencing-delay) 123 */ 124 int priority; 125 126 pcmk_scheduler_t *data_set; //!< Cluster that node is part of 127 }; 128 129 //! Implementation of pcmk_node_t 130 struct pe_node_s { 131 int weight; //!< Node score for a given resource 132 gboolean fixed; //!< \deprecated Do not use 133 int count; //!< Counter reused by assignment and promotion code 134 struct pe_node_shared_s *details; //!< Basic node information 135 136 // @COMPAT This should be enum pe_discover_e 137 int rsc_discover_mode; //!< Probe mode (enum pe_discover_e) 138 }; 139 140 #ifdef __cplusplus 141 } 142 #endif 143 144 #endif // PCMK__CRM_COMMON_NODES__H