pacemaker  2.0.3-4b1f869f0f
Scalable High-Availability cluster resource manager
pe_output.c
Go to the documentation of this file.
1 /*
2  * Copyright 2019 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 #include <crm_internal.h>
12 #include <crm/pengine/internal.h>
13 
14 int
15 pe__name_and_nvpairs_xml(pcmk__output_t *out, bool is_list, const char *tag_name
16  , size_t pairs_count, ...)
17 {
18  xmlNodePtr xml_node = NULL;
19  va_list args;
20 
21  CRM_ASSERT(tag_name != NULL);
22 
23  xml_node = pcmk__output_xml_peek_parent(out);
24  CRM_ASSERT(xml_node != NULL);
25  xml_node = is_list
26  ? create_xml_node(xml_node, tag_name)
27  : xmlNewChild(xml_node, NULL, (pcmkXmlStr) tag_name, NULL);
28 
29  va_start(args, pairs_count);
30  while(pairs_count--) {
31  const char *param_name = va_arg(args, const char *);
32  const char *param_value = va_arg(args, const char *);
33  if (param_name && param_value) {
34  xmlSetProp(xml_node, (pcmkXmlStr)param_name, (pcmkXmlStr)param_value);
35  }
36  };
37  va_end(args);
38 
39  if (is_list) {
40  pcmk__output_xml_push_parent(out, xml_node);
41  }
42  return 0;
43 }
44 
45 static int
46 pe__ticket_html(pcmk__output_t *out, va_list args) {
47  ticket_t *ticket = va_arg(args, ticket_t *);
48 
49  if (ticket->last_granted > -1) {
50  char *time = pcmk_format_named_time("last-granted", ticket->last_granted);
51  out->list_item(out, NULL, "%s:\t%s%s %s", ticket->id,
52  ticket->granted ? "granted" : "revoked",
53  ticket->standby ? " [standby]" : "",
54  time);
55  free(time);
56  } else {
57  out->list_item(out, NULL, "%s:\t%s%s", ticket->id,
58  ticket->granted ? "granted" : "revoked",
59  ticket->standby ? " [standby]" : "");
60  }
61 
62  return 0;
63 }
64 
65 static int
66 pe__ticket_text(pcmk__output_t *out, va_list args) {
67  ticket_t *ticket = va_arg(args, ticket_t *);
68 
69  if (ticket->last_granted > -1) {
70  char *time = pcmk_format_named_time("last-granted", ticket->last_granted);
71  out->list_item(out, ticket->id, "\t%s%s %s",
72  ticket->granted ? "granted" : "revoked",
73  ticket->standby ? " [standby]" : "",
74  time);
75  free(time);
76  } else {
77  out->list_item(out, ticket->id, "\t%s%s",
78  ticket->granted ? "granted" : "revoked",
79  ticket->standby ? " [standby]" : "");
80  }
81 
82  return 0;
83 }
84 
85 static int
86 pe__ticket_xml(pcmk__output_t *out, va_list args) {
87  xmlNodePtr node = NULL;
88 
89  ticket_t *ticket = va_arg(args, ticket_t *);
90 
91  node = pcmk__output_create_xml_node(out, "ticket");
92  xmlSetProp(node, (pcmkXmlStr) "id", (pcmkXmlStr) ticket->id);
93  xmlSetProp(node, (pcmkXmlStr) "status", (pcmkXmlStr) (ticket->granted ? "granted" : "revoked"));
94  xmlSetProp(node, (pcmkXmlStr) "standby", (pcmkXmlStr) (ticket->standby ? "true" : "false"));
95 
96  if (ticket->last_granted > -1) {
97  xmlSetProp(node, (pcmkXmlStr) "last-granted",
99  }
100 
101  return 0;
102 }
103 
104 static pcmk__message_entry_t fmt_functions[] = {
105  { "bundle", "xml", pe__bundle_xml },
106  { "bundle", "html", pe__bundle_html },
107  { "bundle", "text", pe__bundle_text },
108  { "clone", "xml", pe__clone_xml },
109  { "clone", "html", pe__clone_html },
110  { "clone", "text", pe__clone_text },
111  { "group", "xml", pe__group_xml },
112  { "group", "html", pe__group_html },
113  { "group", "text", pe__group_text },
114  { "primitive", "xml", pe__resource_xml },
115  { "primitive", "html", pe__resource_html },
116  { "primitive", "text", pe__resource_text },
117  { "ticket", "html", pe__ticket_html },
118  { "ticket", "text", pe__ticket_text },
119  { "ticket", "xml", pe__ticket_xml },
120 
121  { NULL, NULL, NULL }
122 };
123 
124 void
126  pcmk__register_messages(out, fmt_functions);
127 }
128 
129 void
130 pe__output_node(node_t *node, gboolean details, pcmk__output_t *out)
131 {
132  if (node == NULL) {
133  crm_trace("<NULL>");
134  return;
135  }
136 
137  CRM_ASSERT(node->details);
138  crm_trace("%sNode %s: (weight=%d, fixed=%s)",
139  node->details->online ? "" : "Unavailable/Unclean ",
140  node->details->uname, node->weight, node->fixed ? "True" : "False");
141 
142  if (details) {
143  char *pe_mutable = strdup("\t\t");
144  GListPtr gIter = node->details->running_rsc;
145 
146  crm_trace("\t\t===Node Attributes");
147  g_hash_table_foreach(node->details->attrs, print_str_str, pe_mutable);
148  free(pe_mutable);
149 
150  crm_trace("\t\t=== Resources");
151 
152  for (; gIter != NULL; gIter = gIter->next) {
153  resource_t *rsc = (resource_t *) gIter->data;
154 
155  // @TODO pe_print_log probably doesn't belong here
156  out->message(out, crm_map_element_name(rsc->xml),
158  }
159  }
160 }
pe_ticket_s::last_granted
time_t last_granted
Definition: pe_types.h:424
GListPtr
GList * GListPtr
Definition: crm.h:215
pe__clone_html
int pe__clone_html(pcmk__output_t *out, va_list args)
Definition: clone.c:600
pe_print_log
@ pe_print_log
Definition: common.h:115
pe_ticket_s::granted
gboolean granted
Definition: pe_types.h:423
create_xml_node
xmlNode * create_xml_node(xmlNode *parent, const char *name)
Definition: xml.c:1970
pe__clone_xml
int pe__clone_xml(pcmk__output_t *out, va_list args)
Definition: clone.c:572
pe_node_shared_s::running_rsc
GListPtr running_rsc
Definition: pe_types.h:209
pcmk__output_create_xml_node
xmlNodePtr pcmk__output_create_xml_node(pcmk__output_t *out, const char *name)
Definition: output_xml.c:358
pe_node_s::weight
int weight
Definition: pe_types.h:218
pe_node_s::details
struct pe_node_shared_s * details
Definition: pe_types.h:221
pcmk__output_s::list_item
void(*) void(* list_item)(pcmk__output_t *out, const char *name, const char *format,...) G_GNUC_PRINTF(3
Definition: output.h:402
internal.h
crm_trace
#define crm_trace(fmt, args...)
Definition: logging.h:247
pe_ticket_s
Definition: pe_types.h:421
pe__group_xml
int pe__group_xml(pcmk__output_t *out, va_list args)
Definition: group.c:187
pe__bundle_text
int pe__bundle_text(pcmk__output_t *out, va_list args)
Definition: bundle.c:1670
pcmk__output_xml_peek_parent
xmlNodePtr pcmk__output_xml_peek_parent(pcmk__output_t *out)
Definition: output_xml.c:394
pe__resource_html
int pe__resource_html(pcmk__output_t *out, va_list args)
Definition: native.c:1141
pcmk__output_s::message
int(* message)(pcmk__output_t *out, const char *message_id,...)
Definition: output.h:308
pe__group_text
int pe__group_text(pcmk__output_t *out, va_list args)
Definition: group.c:235
pcmk__output_xml_push_parent
void pcmk__output_xml_push_parent(pcmk__output_t *out, xmlNodePtr node)
Definition: output_xml.c:374
pe_ticket_s::id
char * id
Definition: pe_types.h:422
pe_resource_s::xml
xmlNode * xml
Definition: pe_types.h:296
pe__output_node
void pe__output_node(node_t *node, gboolean details, pcmk__output_t *out)
Definition: pe_output.c:130
pe__bundle_html
int pe__bundle_html(pcmk__output_t *out, va_list args)
Definition: bundle.c:1580
pe_node_s::fixed
gboolean fixed
Definition: pe_types.h:219
pe__register_messages
void pe__register_messages(pcmk__output_t *out)
Definition: pe_output.c:125
pe__resource_xml
int pe__resource_xml(pcmk__output_t *out, va_list args)
Definition: native.c:1074
pe__bundle_xml
int pe__bundle_xml(pcmk__output_t *out, va_list args)
Definition: bundle.c:1498
pe__group_html
int pe__group_html(pcmk__output_t *out, va_list args)
Definition: group.c:212
crm_now_string
const char * crm_now_string(time_t *when)
Definition: iso8601.c:1701
pcmk__output_s
This structure contains everything that makes up a single output formatter.
Definition: output.h:150
pcmk__message_entry_s
Definition: output.h:73
pcmkXmlStr
const typedef xmlChar * pcmkXmlStr
Definition: xml.h:51
pe_ticket_s::standby
gboolean standby
Definition: pe_types.h:425
pcmk__register_messages
void pcmk__register_messages(pcmk__output_t *out, pcmk__message_entry_t *table)
Definition: output.c:133
pe__clone_text
int pe__clone_text(pcmk__output_t *out, va_list args)
Definition: clone.c:787
pe__resource_text
int pe__resource_text(pcmk__output_t *out, va_list args)
Definition: native.c:1158
CRM_ASSERT
#define CRM_ASSERT(expr)
Definition: results.h:42
print_str_str
void print_str_str(gpointer key, gpointer value, gpointer user_data)
Definition: utils.c:1364
iso8601_internal.h
pe__name_and_nvpairs_xml
int pe__name_and_nvpairs_xml(pcmk__output_t *out, bool is_list, const char *tag_name, size_t pairs_count,...)
Definition: pe_output.c:15
pe_print_pending
@ pe_print_pending
Definition: common.h:127
pe_resource_s
Definition: pe_types.h:293
pe_node_shared_s::online
gboolean online
Definition: pe_types.h:191
pe_node_shared_s::uname
const char * uname
Definition: pe_types.h:187
crm_internal.h
pe_node_s
Definition: pe_types.h:217
pcmk_format_named_time
char * pcmk_format_named_time(const char *name, time_t epoch_time)
Definition: nvpair.c:295
pe_node_shared_s::attrs
GHashTable * attrs
Definition: pe_types.h:212