pacemaker  2.1.2-ada5c3b36
Scalable High-Availability cluster resource manager
pcmk_sched_messages.c
Go to the documentation of this file.
1 /*
2  * Copyright 2004-2021 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 General Public License version 2
7  * or later (GPLv2+) WITHOUT ANY WARRANTY.
8  */
9 
10 #include <crm_internal.h>
11 
12 #include <sys/param.h>
13 
14 #include <crm/crm.h>
15 #include <crm/cib.h>
16 #include <crm/msg_xml.h>
17 #include <crm/common/xml.h>
18 
19 #include <glib.h>
20 
21 #include <crm/pengine/status.h>
22 #include <pacemaker-internal.h>
24 #include "libpacemaker_private.h"
25 
26 extern bool pcmk__is_daemon;
27 
28 static void
29 log_resource_details(pe_working_set_t *data_set)
30 {
31  pcmk__output_t *out = data_set->priv;
32  GList *all = NULL;
33 
34  /* We need a list of nodes that we are allowed to output information for.
35  * This is necessary because out->message for all the resource-related
36  * messages expects such a list, due to the `crm_mon --node=` feature. Here,
37  * we just make it a list of all the nodes.
38  */
39  all = g_list_prepend(all, (gpointer) "*");
40 
41  for (GList *item = data_set->resources; item != NULL; item = item->next) {
42  pe_resource_t *rsc = (pe_resource_t *) item->data;
43 
44  // Log all resources except inactive orphans
45  if (!pcmk_is_set(rsc->flags, pe_rsc_orphan)
46  || (rsc->role != RSC_ROLE_STOPPED)) {
47  out->message(out, crm_map_element_name(rsc->xml), 0, rsc, all, all);
48  }
49  }
50 
51  g_list_free(all);
52 }
53 
54 static void
55 log_all_actions(pe_working_set_t *data_set)
56 {
57  /* This only ever outputs to the log, so ignore whatever output object was
58  * previously set and just log instead.
59  */
60  pcmk__output_t *prev_out = data_set->priv;
62 
63  if (out == NULL) {
64  return;
65  }
66 
67  pcmk__output_set_log_level(out, LOG_NOTICE);
68  data_set->priv = out;
69 
70  out->begin_list(out, NULL, NULL, "Actions");
71  LogNodeActions(data_set);
72 
73  g_list_foreach(data_set->resources, (GFunc) LogActions, data_set);
74 
75  out->end_list(out);
76  out->finish(out, CRM_EX_OK, true, NULL);
77  pcmk__output_free(out);
78 
79  data_set->priv = prev_out;
80 }
81 
90 xmlNode *
91 pcmk__schedule_actions(pe_working_set_t *data_set, xmlNode *xml_input,
92  crm_time_t *now)
93 {
94  GList *gIter = NULL;
95 
96  CRM_ASSERT(xml_input || pcmk_is_set(data_set->flags, pe_flag_have_status));
97 
98  if (!pcmk_is_set(data_set->flags, pe_flag_have_status)) {
99  set_working_set_defaults(data_set);
100  data_set->input = xml_input;
101  data_set->now = now;
102 
103  } else {
104  crm_trace("Already have status - reusing");
105  }
106 
107  if (data_set->now == NULL) {
108  data_set->now = crm_time_new(NULL);
109  }
110 
111  crm_trace("Calculate cluster status");
112  stage0(data_set);
113  if (!pcmk_is_set(data_set->flags, pe_flag_quick_location) &&
114  pcmk__is_daemon) {
115  log_resource_details(data_set);
116  }
117 
118  crm_trace("Applying location constraints");
119  stage2(data_set);
120 
121  if (pcmk_is_set(data_set->flags, pe_flag_quick_location)) {
122  return NULL;
123  }
124 
126 
127  crm_trace("Check actions");
128  stage4(data_set);
129 
130  crm_trace("Allocate resources");
131  stage5(data_set);
132 
133  crm_trace("Processing fencing and shutdown cases");
134  stage6(data_set);
135 
136  pcmk__apply_orderings(data_set);
137  log_all_actions(data_set);
138 
139  crm_trace("Create transition graph");
140  stage8(data_set);
141 
142  crm_trace("=#=#=#=#= Summary =#=#=#=#=");
143  crm_trace("\t========= Set %d (Un-runnable) =========", -1);
144  if (get_crm_log_level() == LOG_TRACE) {
145  gIter = data_set->actions;
146  for (; gIter != NULL; gIter = gIter->next) {
147  pe_action_t *action = (pe_action_t *) gIter->data;
148 
149  if (!pcmk_any_flags_set(action->flags,
152  |pe_action_pseudo)) {
153  log_action(LOG_TRACE, "\t", action, TRUE);
154  }
155  }
156  }
157 
158  return data_set->graph;
159 }
void(* end_list)(pcmk__output_t *out)
#define LOG_TRACE
Definition: logging.h:36
A dumping ground.
gboolean stage2(pe_working_set_t *data_set)
gboolean stage5(pe_working_set_t *data_set)
int(* message)(pcmk__output_t *out, const char *message_id,...)
struct crm_time_s crm_time_t
Definition: iso8601.h:32
void pcmk__output_set_log_level(pcmk__output_t *out, int log_level)
Definition: output_log.c:303
enum rsc_role_e role
Definition: pe_types.h:370
gboolean stage0(pe_working_set_t *data_set)
xmlNode * xml
Definition: pe_types.h:324
bool pcmk__is_daemon
Definition: logging.c:47
#define pe_flag_have_status
Definition: pe_types.h:116
GList * actions
Definition: pe_types.h:164
const char * action
Definition: pcmk_fence.c:30
GList * resources
Definition: pe_types.h:158
gboolean stage8(pe_working_set_t *data_set)
pcmk__output_t * pcmk__new_logger(void)
gboolean stage4(pe_working_set_t *data_set)
#define crm_trace(fmt, args...)
Definition: logging.h:363
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
Definition: util.h:114
void set_working_set_defaults(pe_working_set_t *data_set)
Definition: status.c:359
unsigned long long flags
Definition: pe_types.h:348
Wrappers for and extensions to libxml2.
void(* finish)(pcmk__output_t *out, crm_exit_t exit_status, bool print, void **copy_dest)
void LogActions(pe_resource_t *rsc, pe_working_set_t *data_set)
Success.
Definition: results.h:239
G_GNUC_INTERNAL void pcmk__create_internal_constraints(pe_working_set_t *data_set)
xmlNode * input
Definition: pe_types.h:137
void LogNodeActions(pe_working_set_t *data_set)
void pcmk__output_free(pcmk__output_t *out)
Definition: output.c:19
unsigned int get_crm_log_level(void)
Definition: logging.c:1019
xmlNode * pcmk__schedule_actions(pe_working_set_t *data_set, xmlNode *xml_input, crm_time_t *now)
void log_action(unsigned int log_level, const char *pre_text, pe_action_t *action, gboolean details)
#define pe_flag_quick_location
Definition: pe_types.h:119
Cluster status and scheduling.
#define CRM_ASSERT(expr)
Definition: results.h:42
Cluster Configuration.
crm_time_t * crm_time_new(const char *string)
Definition: iso8601.c:92
This structure contains everything that makes up a single output formatter.
gboolean stage6(pe_working_set_t *data_set)
void(* begin_list)(pcmk__output_t *out, const char *singular_noun, const char *plural_noun, const char *format,...) G_GNUC_PRINTF(4
unsigned long long flags
Definition: pe_types.h:146
G_GNUC_INTERNAL void pcmk__apply_orderings(pe_working_set_t *data_set)
crm_time_t * now
Definition: pe_types.h:138
#define pe_rsc_orphan
Definition: pe_types.h:248
xmlNode * graph
Definition: pe_types.h:176