summaryrefslogtreecommitdiffstats
path: root/include/crm/common/nodes.h
blob: fbc375819a5dd986c21f5010d4086ae1bc6b27d2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * Copyright 2004-2023 the Pacemaker project contributors
 *
 * The version control history for this file may have further details.
 *
 * This source code is licensed under the GNU Lesser General Public License
 * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
 */

#ifndef PCMK__CRM_COMMON_NODES__H
#  define PCMK__CRM_COMMON_NODES__H

#include <glib.h>                       // gboolean, GList, GHashTable

#include <crm/common/scheduler_types.h> // pcmk_resource_t, pcmk_scheduler_t

#ifdef __cplusplus
extern "C" {
#endif

/*!
 * \file
 * \brief Scheduler API for nodes
 * \ingroup core
 */

// Special node attributes

#define PCMK_NODE_ATTR_TERMINATE    "terminate"


//! Possible node types
enum node_type {
    pcmk_node_variant_cluster  = 1,     //!< Cluster layer node
    pcmk_node_variant_remote   = 2,     //!< Pacemaker Remote node

    node_ping   = 0,      //!< \deprecated Do not use
#if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1)
    //! \deprecated Use pcmk_node_variant_cluster instead
    node_member = pcmk_node_variant_cluster,

    //! \deprecated Use pcmk_node_variant_remote instead
    node_remote = pcmk_node_variant_remote,
#endif
};

//! When to probe a resource on a node (as specified in location constraints)
enum pe_discover_e {
    pcmk_probe_always       = 0,    //! Always probe resource on node
    pcmk_probe_never        = 1,    //! Never probe resource on node
    pcmk_probe_exclusive    = 2,    //! Probe only on designated nodes

#if !defined(PCMK_ALLOW_DEPRECATED) || (PCMK_ALLOW_DEPRECATED == 1)
    //! \deprecated Use pcmk_probe_always instead
    pe_discover_always      = pcmk_probe_always,

    //! \deprecated Use pcmk_probe_never instead
    pe_discover_never       = pcmk_probe_never,

    //! \deprecated Use pcmk_probe_exclusive instead
    pe_discover_exclusive   = pcmk_probe_exclusive,
#endif
};

//! Basic node information (all node objects for the same node share this)
struct pe_node_shared_s {
    const char *id;             //!< Node ID at the cluster layer
    const char *uname;          //!< Node name in cluster
    enum node_type type;        //!< Node variant

    // @TODO Convert these into a flag group
    gboolean online;            //!< Whether online
    gboolean standby;           //!< Whether in standby mode
    gboolean standby_onfail;    //!< Whether in standby mode due to on-fail
    gboolean pending;           //!< Whether controller membership is pending
    gboolean unclean;           //!< Whether node requires fencing
    gboolean unseen;            //!< Whether node has never joined cluster
    gboolean shutdown;          //!< Whether shutting down
    gboolean expected_up;       //!< Whether expected join state is member
    gboolean is_dc;             //!< Whether node is cluster's DC
    gboolean maintenance;       //!< Whether in maintenance mode
    gboolean rsc_discovery_enabled; //!< Whether probes are allowed on node

    /*!
     * Whether this is a guest node whose guest resource must be recovered or a
     * remote node that must be fenced
     */
    gboolean remote_requires_reset;

    /*!
     * Whether this is a Pacemaker Remote node that was fenced since it was last
     * connected by the cluster
     */
    gboolean remote_was_fenced;

    /*!
     * Whether this is a Pacemaker Remote node previously marked in its
     * node state as being in maintenance mode
     */
    gboolean remote_maintenance;

    gboolean unpacked;              //!< Whether node history has been unpacked

    /*!
     * Number of resources active on this node (valid after CIB status section
     * has been unpacked, as long as pcmk_sched_no_counts was not set)
     */
    int num_resources;

    //! Remote connection resource for node, if it is a Pacemaker Remote node
    pcmk_resource_t *remote_rsc;

    GList *running_rsc;             //!< List of resources active on node
    GList *allocated_rsc;           //!< List of resources assigned to node
    GHashTable *attrs;              //!< Node attributes
    GHashTable *utilization;        //!< Node utilization attributes
    GHashTable *digest_cache;       //!< Cache of calculated resource digests

    /*!
     * Sum of priorities of all resources active on node and on any guest nodes
     * connected to this node, with +1 for promoted instances (used to compare
     * nodes for priority-fencing-delay)
     */
    int priority;

    pcmk_scheduler_t *data_set;     //!< Cluster that node is part of
};

//! Implementation of pcmk_node_t
struct pe_node_s {
    int weight;         //!< Node score for a given resource
    gboolean fixed;     //!< \deprecated Do not use
    int count;          //!< Counter reused by assignment and promotion code
    struct pe_node_shared_s *details;   //!< Basic node information

    // @COMPAT This should be enum pe_discover_e
    int rsc_discover_mode;              //!< Probe mode (enum pe_discover_e)
};

#ifdef __cplusplus
}
#endif

#endif // PCMK__CRM_COMMON_NODES__H