This source file includes following definitions.
- pe__unpack_node_health_scores
- add_node_health_value
- pe__sum_node_health_scores
- pe__node_health
1
2
3
4
5
6
7
8
9
10 #include <crm_internal.h>
11
12 #include <crm/pengine/status.h>
13 #include <crm/pengine/internal.h>
14 #include "pe_status_private.h"
15
16
17
18
19
20
21
22 void
23 pe__unpack_node_health_scores(pcmk_scheduler_t *scheduler)
24 {
25 switch (pe__health_strategy(scheduler)) {
26 case pcmk__health_strategy_none:
27 pcmk__score_red = 0;
28 pcmk__score_yellow = 0;
29 pcmk__score_green = 0;
30 break;
31
32 case pcmk__health_strategy_no_red:
33 pcmk__score_red = -INFINITY;
34 pcmk__score_yellow = 0;
35 pcmk__score_green = 0;
36 break;
37
38 case pcmk__health_strategy_only_green:
39 pcmk__score_red = -INFINITY;
40 pcmk__score_yellow = -INFINITY;
41 pcmk__score_green = 0;
42 break;
43
44 default:
45 pcmk__score_red = pe__health_score(PCMK__OPT_NODE_HEALTH_RED,
46 scheduler);
47 pcmk__score_green = pe__health_score(PCMK__OPT_NODE_HEALTH_GREEN,
48 scheduler);
49 pcmk__score_yellow = pe__health_score(PCMK__OPT_NODE_HEALTH_YELLOW,
50 scheduler);
51 break;
52 }
53
54 if ((pcmk__score_red != 0) || (pcmk__score_yellow != 0)
55 || (pcmk__score_green != 0)) {
56 crm_debug("Values of node health scores: "
57 PCMK__VALUE_RED "=%d "
58 PCMK__VALUE_YELLOW "=%d "
59 PCMK__VALUE_GREEN "=%d",
60 pcmk__score_red, pcmk__score_yellow, pcmk__score_green);
61 }
62 }
63
64
65
66
67
68
69
70
71
72
73 static void
74 add_node_health_value(gpointer key, gpointer value, gpointer user_data)
75 {
76 if (pcmk__starts_with((const char *) key, "#health")) {
77 int score = char2score((const char *) value);
78 int *health = (int *) user_data;
79
80 *health = pcmk__add_scores(score, *health);
81 crm_trace("Combined '%s' into node health score (now %s)",
82 (const char *) value, pcmk_readable_score(*health));
83 }
84 }
85
86
87
88
89
90
91
92
93
94
95 int
96 pe__sum_node_health_scores(const pcmk_node_t *node, int base_health)
97 {
98 CRM_ASSERT(node != NULL);
99 g_hash_table_foreach(node->details->attrs, add_node_health_value,
100 &base_health);
101 return base_health;
102 }
103
104
105
106
107
108
109
110
111
112
113 int
114 pe__node_health(pcmk_node_t *node)
115 {
116 GHashTableIter iter;
117 const char *name = NULL;
118 const char *value = NULL;
119 enum pcmk__health_strategy strategy;
120 int score = 0;
121 int rc = 1;
122
123 CRM_ASSERT(node != NULL);
124
125 strategy = pe__health_strategy(node->details->data_set);
126 if (strategy == pcmk__health_strategy_none) {
127 return rc;
128 }
129
130 g_hash_table_iter_init(&iter, node->details->attrs);
131 while (g_hash_table_iter_next(&iter, (gpointer *) &name,
132 (gpointer *) &value)) {
133 if (pcmk__starts_with(name, "#health")) {
134
135
136
137
138 if (pcmk__str_eq(value, PCMK__VALUE_RED, pcmk__str_casei)) {
139 return -1;
140 } else if (pcmk__str_eq(value, PCMK__VALUE_YELLOW,
141 pcmk__str_casei)) {
142 rc = 0;
143 continue;
144 }
145
146
147 score = char2score(value);
148 if (score <= pcmk__score_red) {
149 return -1;
150 } else if ((score <= pcmk__score_yellow)
151 && (pcmk__score_yellow != pcmk__score_green)) {
152 rc = 0;
153 }
154 }
155 }
156 return rc;
157 }