29 unsigned int count = 0;
31 if (pcmk__is_primitive(rsc)) {
57 pcmk__rsc_trace(rsc,
"%s now has priority %d with %s'%s' (priority: %d%s)",
59 (promoted?
"promoted " :
""),
70 gIter != NULL; gIter = gIter->next) {
76 "%s now has priority %d with %s'%s' "
77 "(priority: %d%s) from guest node %s",
79 (promoted?
"promoted " :
""), rsc->
id,
81 pcmk__node_name(node));
95 gIter != NULL; gIter = gIter->next) {
99 if (pcmk__same_node(a_node, node)) {
108 if (pcmk__is_primitive(rsc)) {
110 native_priority_to_node(rsc, node, failed);
132 if (is_multiply_active(rsc)) {
136 GHashTableIter gIter;
146 while (g_hash_table_iter_next(&gIter, NULL, (
void **)&local_node)) {
160 && (
parent->priv->multiply_active_policy
163 for (GList *gIter =
parent->priv->children;
164 gIter != NULL; gIter = gIter->next) {
180 crm_debug(
"%s is active on multiple nodes including %s: %s",
181 rsc->
id, pcmk__node_name(node),
186 rsc->
id, pcmk__node_name(node));
200 g_list_foreach(rsc->
priv->
children, (GFunc) recursive_clear_unique,
216 && pcmk__is_clone(
parent)) {
230 recursive_clear_unique(
parent, NULL);
231 recursive_clear_unique(rsc, NULL);
237 "cannot be used as a promotable clone resource",
248 rsc->
id, pcmk__node_name(node));
254 iter != NULL; iter = iter->next) {
256 if (pcmk__same_node((
pcmk_node_t *) iter->data, node)) {
279 const char *rid = pcmk__xe_id(rsc->
priv->
xml);
288 }
else if (!strcmp(
id, rsc->
id)) {
298 match = pe_base_name_eq(rsc,
id);
301 if (match && on_node) {
302 if (!rsc_is_on_node(rsc, on_node,
flags)) {
312 gIter != NULL; gIter = gIter->next) {
328 gIter != NULL; gIter = gIter->next) {
334 rsc->
id, pcmk__node_name(a_node));
339 rsc->
id, pcmk__node_name(a_node));
342 rsc->
id, pcmk__node_name(a_node));
357 const char *pending_state = NULL;
361 pending_state =
"Starting";
365 pending_state =
"Stopping";
369 pending_state =
"Migrating";
374 pending_state =
"Migrating";
378 pending_state =
"Promoting";
382 pending_state =
"Demoting";
385 return pending_state;
391 const char *pending_action = NULL;
395 pending_action =
"Monitoring";
403 }
else if (pcmk__str_eq(rsc->private->pending_action,
"probe",
405 pending_action =
"Checking";
409 return pending_action;
427native_displayable_state(
const pcmk_resource_t *rsc,
bool print_pending)
429 const char *rsc_state = NULL;
432 rsc_state = native_pending_state(rsc);
434 if (rsc_state == NULL) {
442add_output_flag(GString *s,
const char *flag_desc,
bool have_flags)
444 g_string_append(s, (have_flags?
", " :
" ("));
445 g_string_append(s, flag_desc);
451add_output_node(GString *s,
const char *node,
bool have_nodes)
453 g_string_append(s, (have_nodes?
" " :
" [ "));
454 g_string_append(s, node);
475 const char *target_role,
bool show_nodes)
478 const char *provider = NULL;
480 GString *outstr = NULL;
481 bool have_flags =
false;
483 if (!pcmk__is_primitive(rsc)) {
488 CRM_CHECK(kind != NULL, kind =
"unknown");
489 CRM_CHECK(
class != NULL,
class =
"unknown");
503 outstr = g_string_sized_new(128);
507 name,
"\t(",
class, ((provider == NULL)?
"" :
":"),
508 pcmk__s(provider,
""),
":", kind,
"):\t", NULL);
512 g_string_append(outstr,
" ORPHANED");
515 enum rsc_role_e role = native_displayable_role(rsc);
517 g_string_append(outstr,
" FAILED");
524 pcmk__add_word(&outstr, 0, native_displayable_state(rsc, show_pending));
527 pcmk__add_word(&outstr, 0, pcmk__node_name(node));
534 if (probe_op != NULL) {
545 have_flags = add_output_flag(outstr,
"UNCLEAN", have_flags);
547 if ((node != NULL) && pcmk__same_node(node, rsc->
priv->
lock_node)) {
548 have_flags = add_output_flag(outstr,
"LOCKED", have_flags);
551 const char *pending_action = native_pending_action(rsc);
553 if (pending_action != NULL) {
554 have_flags = add_output_flag(outstr, pending_action, have_flags);
557 if (target_role != NULL) {
561 " %s for resource %s", target_role, rsc->
id);
565 have_flags = add_output_flag(outstr,
"disabled", have_flags);
571 have_flags = add_output_flag(outstr,
574 g_string_append(outstr, target_role);
588 if (pcmk_any_flags_set(rsc->
flags,
591 have_flags = add_output_flag(outstr,
"blocked", have_flags);
594 have_flags = add_output_flag(outstr,
"maintenance", have_flags);
597 have_flags = add_output_flag(outstr,
"unmanaged", have_flags);
601 have_flags = add_output_flag(outstr,
"failure ignored", have_flags);
606 g_string_append_c(outstr,
')');
616 g_string_append(outstr,
" (");
617 g_string_append(outstr, desc);
618 g_string_append(outstr,
")");
625 bool have_nodes =
false;
628 iter != NULL; iter = iter->next) {
632 have_nodes = add_output_node(outstr, n->
priv->
name, have_nodes);
635 g_string_append(outstr,
" ]");
639 return g_string_free(outstr, FALSE);
648 const char *target_role = NULL;
649 const char *cl = NULL;
651 xmlNode *child = NULL;
652 gchar *content = NULL;
654 pcmk__assert((kind != NULL) && pcmk__is_primitive(rsc));
660 crm_trace(
"skipping print of internal resource %s", rsc->
id);
663 target_role = g_hash_table_lookup(rsc->
priv->
meta,
672 }
else if (pcmk__is_primitive(rsc)
701 const char *target_role = NULL;
709 crm_trace(
"skipping print of internal resource %s", rsc->
id);
712 target_role = g_hash_table_lookup(rsc->
priv->
meta,
726PCMK__OUTPUT_ARGS(
"primitive",
"uint32_t",
"pcmk_resource_t *",
"GList *",
731 uint32_t show_opts = va_arg(args, uint32_t);
733 GList *only_node G_GNUC_UNUSED = va_arg(args, GList *);
734 GList *only_rsc = va_arg(args, GList *);
741 char ra_name[LINE_MAX];
742 const char *rsc_state = native_displayable_state(rsc, print_pending);
743 const char *target_role = NULL;
744 const char *active = pcmk__btoa(rsc->
priv->
fns->
active(rsc,
true));
747 const char *maintenance = pcmk__flag_text(rsc->
flags,
752 char *nodes_running_on = NULL;
753 const char *pending = print_pending? native_pending_action(rsc) : NULL;
754 const char *locked_to = NULL;
764 snprintf(ra_name, LINE_MAX,
"%s%s%s:%s",
class,
765 ((prov == NULL)?
"" :
":"), ((prov == NULL)?
"" : prov),
768 target_role = g_hash_table_lookup(rsc->
priv->
meta,
794 free(nodes_running_on);
799 gIter != NULL; gIter = gIter->next) {
802 const char *cached = pcmk__btoa(node->details->online);
816PCMK__OUTPUT_ARGS(
"primitive",
"uint32_t",
"pcmk_resource_t *",
"GList *",
821 uint32_t show_opts = va_arg(args, uint32_t);
823 GList *only_node G_GNUC_UNUSED = va_arg(args, GList *);
824 GList *only_rsc = va_arg(args, GList *);
841PCMK__OUTPUT_ARGS(
"primitive",
"uint32_t",
"pcmk_resource_t *",
"GList *",
846 uint32_t show_opts = va_arg(args, uint32_t);
848 GList *only_node G_GNUC_UNUSED = va_arg(args, GList *);
849 GList *only_rsc = va_arg(args, GList *);
905 gIter != NULL; gIter = gIter->next) {
934 for (; gIter != NULL; gIter = gIter->next) {
939 *list = g_list_append(*list, node);
949get_rscs_brief(GList *rsc_list, GHashTable * rsc_table, GHashTable * active_table)
951 GList *gIter = rsc_list;
953 for (; gIter != NULL; gIter = gIter->next) {
960 char buffer[LINE_MAX];
962 int *rsc_counter = NULL;
963 int *active_counter = NULL;
965 if (!pcmk__is_primitive(rsc)) {
969 offset += snprintf(buffer + offset, LINE_MAX - offset,
"%s",
class);
975 offset += snprintf(buffer + offset, LINE_MAX - offset,
979 offset += snprintf(buffer + offset, LINE_MAX - offset,
":%s", kind);
983 rsc_counter = g_hash_table_lookup(rsc_table, buffer);
984 if (rsc_counter == NULL) {
987 g_hash_table_insert(rsc_table, strdup(buffer), rsc_counter);
994 gIter2 != NULL; gIter2 = gIter2->next) {
997 GHashTable *node_table = NULL;
1004 node_table = g_hash_table_lookup(active_table,
1006 if (node_table == NULL) {
1008 g_hash_table_insert(active_table,
1013 active_counter = g_hash_table_lookup(node_table, buffer);
1014 if (active_counter == NULL) {
1016 *active_counter = 0;
1017 g_hash_table_insert(node_table, strdup(buffer), active_counter);
1019 (*active_counter)++;
1026destroy_node_table(gpointer
data)
1028 GHashTable *node_table =
data;
1031 g_hash_table_destroy(node_table);
1043 get_rscs_brief(rsc_list, rsc_table, active_table);
1048 sorted_rscs = g_hash_table_get_keys(rsc_table);
1049 sorted_rscs = g_list_sort(sorted_rscs, (GCompareFunc) strcmp);
1051 for (GList *gIter = sorted_rscs; gIter; gIter = gIter->next) {
1052 char *
type = (
char *) gIter->data;
1053 int *rsc_counter = g_hash_table_lookup(rsc_table,
type);
1055 GList *sorted_nodes = NULL;
1056 int active_counter_all = 0;
1062 sorted_nodes = g_hash_table_get_keys(active_table);
1065 for (GList *gIter2 = sorted_nodes; gIter2; gIter2 = gIter2->next) {
1066 char *node_name = (
char *) gIter2->data;
1067 GHashTable *node_table = g_hash_table_lookup(active_table, node_name);
1068 int *active_counter = NULL;
1070 if (node_table == NULL) {
1074 active_counter = g_hash_table_lookup(node_table,
type);
1076 if (active_counter == NULL || *active_counter == 0) {
1080 active_counter_all += *active_counter;
1088 out->
list_item(out, NULL,
"%d/%d\t(%s):\tActive %s",
1090 rsc_counter ? *rsc_counter : 0,
type,
1091 (*active_counter > 0) && node_name ? node_name :
"");
1093 out->
list_item(out, NULL,
"%d\t(%s):\tActive %s",
1094 *active_counter,
type,
1095 (*active_counter > 0) && node_name ? node_name :
"");
1102 out->
list_item(out, NULL,
"%d/%d\t(%s):\tActive",
1104 rsc_counter ? *rsc_counter : 0,
type);
1109 g_list_free(sorted_nodes);
1114 g_hash_table_destroy(rsc_table);
1118 g_hash_table_destroy(active_table);
1119 active_table = NULL;
1122 g_list_free(sorted_rscs);
1135 }
else if (check_parent && (rsc->
priv->
parent != NULL)) {
#define PCMK_ACTION_PROMOTE
#define PCMK_ACTION_START
#define PCMK_ACTION_MIGRATE_FROM
#define PCMK_ACTION_MIGRATE_TO
#define PCMK_ACTION_MONITOR
#define PCMK_ACTION_DEMOTE
uint32_t pcmk_get_ra_caps(const char *standard)
Get capabilities of a resource agent standard.
void pe__force_anon(const char *standard, pcmk_resource_t *rsc, const char *rid, pcmk_scheduler_t *scheduler)
#define pcmk__assert_alloc(nmemb, size)
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
pcmk_resource_t * uber_parent(pcmk_resource_t *rsc)
enum pcmk_ipc_server type
#define CRM_LOG_ASSERT(expr)
#define CRM_CHECK(expr, failure_action)
#define crm_debug(fmt, args...)
#define crm_trace(fmt, args...)
#define pcmk__config_err(fmt...)
int pe__common_output_html(pcmk__output_t *out, const pcmk_resource_t *rsc, const char *name, const pcmk_node_t *node, uint32_t show_opts)
int pe__common_output_text(pcmk__output_t *out, const pcmk_resource_t *rsc, const char *name, const pcmk_node_t *node, uint32_t show_opts)
int pe__rscs_brief_output(pcmk__output_t *out, GList *rsc_list, uint32_t show_opts)
bool native_unpack(pcmk_resource_t *rsc)
bool native_active(const pcmk_resource_t *rsc, bool all)
void native_free(pcmk_resource_t *rsc)
pcmk_resource_t * native_find_rsc(pcmk_resource_t *rsc, const char *id, const pcmk_node_t *on_node, uint32_t flags)
bool pe__native_is_filtered(const pcmk_resource_t *rsc, const GList *only_rsc, bool check_parent)
pcmk_node_t * native_location(const pcmk_resource_t *rsc, GList **list, uint32_t target)
unsigned int pe__primitive_max_per_node(const pcmk_resource_t *rsc)
gchar * pcmk__native_output_string(const pcmk_resource_t *rsc, const char *name, const pcmk_node_t *node, uint32_t show_opts, const char *target_role, bool show_nodes)
void native_add_running(pcmk_resource_t *rsc, pcmk_node_t *node, pcmk_scheduler_t *scheduler, gboolean failed)
enum rsc_role_e native_resource_state(const pcmk_resource_t *rsc, bool current)
pcmk_scheduler_t * scheduler
#define pcmk__insert_meta(obj, name, value)
#define PCMK_META_TARGET_ROLE
#define PCMK_META_GLOBALLY_UNIQUE
#define PCMK__VALUE_RSC_OK
#define PCMK__VALUE_RSC_FAILURE_IGNORED
#define PCMK__META_INTERNAL_RSC
#define PCMK__VALUE_RSC_FAILED
#define PCMK__VALUE_RSC_MULTIPLE
#define PCMK__VALUE_RSC_MANAGED
Control output from tools.
@ pcmk_show_implicit_rscs
@ pcmk_show_inactive_rscs
void pcmk__output_xml_pop_parent(pcmk__output_t *out)
xmlNode * pcmk__html_create(xmlNode *parent, const char *name, const char *id, const char *class_name)
xmlNodePtr pcmk__output_create_html_node(pcmk__output_t *out, const char *element_name, const char *id, const char *class_name, const char *text)
pcmk__action_result_t result
GHashTable * pe__node_list2table(const GList *list)
const char * pe__resource_description(const pcmk_resource_t *rsc, uint32_t show_opts)
pcmk_node_t * pe__find_active_requires(const pcmk_resource_t *rsc, unsigned int *count)
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
int pe__name_and_nvpairs_xml(pcmk__output_t *out, bool is_list, const char *tag_name,...) G_GNUC_NULL_TERMINATED
void resource_location(pcmk_resource_t *rsc, const pcmk_node_t *node, int score, const char *tag, pcmk_scheduler_t *scheduler)
xmlNode * pe__failed_probe_for_rsc(const pcmk_resource_t *rsc, const char *name)
void common_free(pcmk_resource_t *rsc)
int pe__resource_xml(pcmk__output_t *out, va_list args)
int pe__resource_text(pcmk__output_t *out, va_list args)
int pe__resource_html(pcmk__output_t *out, va_list args)
@ pcmk_rsc_match_anon_basename
Also match anonymous clone instances by base name.
@ pcmk_rsc_match_clone_only
Match only clones and their instances, by either clone or instance ID.
@ pcmk_rsc_match_basename
Match clone instances (even unique) by base name as well as exact ID.
@ pcmk_rsc_match_history
Also match clone instance ID from resource history.
@ pcmk_rsc_match_current_node
If matching by node, compare current node instead of assigned node.
@ pcmk__rsc_ignore_failure
#define pcmk__set_rsc_flags(resource, flags_to_set)
const char * pcmk__multiply_active_text(const pcmk_resource_t *rsc)
Get readable description of a multiply-active recovery type.
@ pcmk__multiply_active_block
Do nothing to resource.
@ pcmk__multiply_active_stop
Stop on all and leave stopped.
@ pcmk__rsc_node_assigned
#define pcmk__clear_rsc_flags(resource, flags_to_clear)
const char * crm_exit_str(crm_exit_t exit_code)
#define pcmk__assert(expr)
const char * pcmk_role_text(enum rsc_role_e role)
Get readable description of a resource role.
enum rsc_role_e pcmk_parse_role(const char *role)
Parse a resource role from a string role specification.
@ pcmk_role_started
Started.
@ pcmk_role_unknown
Resource role is unknown.
@ pcmk_role_unpromoted
Unpromoted.
@ pcmk_role_promoted
Promoted.
@ pcmk_role_stopped
Stopped.
#define pcmk__rsc_info(rsc, fmt, args...)
#define pcmk__rsc_trace(rsc, fmt, args...)
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
Cluster status and scheduling.
pcmk_node_t * pe_find_node_id(const GList *node_list, const char *id)
Find a node by ID in a list of nodes.
const char * rsc_printable_id(const pcmk_resource_t *rsc)
gboolean crm_is_true(const char *s)
int pcmk__numeric_strcasecmp(const char *s1, const char *s2)
int pcmk__scan_min_int(const char *text, int *result, int minimum)
gboolean pcmk__str_in_list(const gchar *s, const GList *lst, uint32_t flags)
GHashTable * pcmk__strkey_table(GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func)
void pcmk__g_strcat(GString *buffer,...) G_GNUC_NULL_TERMINATED
This structure contains everything that makes up a single output formatter.
void void(* list_item)(pcmk__output_t *out, const char *name, const char *format,...) G_GNUC_PRINTF(3
const pcmk_node_t * pending_node
pcmk_node_t * assigned_node
const pcmk_node_t * lock_node
pcmk_scheduler_t * scheduler
enum pcmk__multiply_active multiply_active_policy
enum rsc_role_e orig_role
pcmk_resource_t * launcher
enum rsc_role_e next_role
const pcmk__rsc_methods_t * fns
GHashTable * allowed_nodes
pcmk__resource_private_t * priv
pcmk_resource_t *(* find_rsc)(pcmk_resource_t *rsc, const char *search, const pcmk_node_t *node, uint32_t flags)
bool(* is_filtered)(const pcmk_resource_t *rsc, const GList *only_rsc, bool check_parent)
pcmk_node_t *(* location)(const pcmk_resource_t *rsc, GList **list, uint32_t target)
bool(* active)(const pcmk_resource_t *rsc, bool all)
pcmk__node_private_t * priv
struct pcmk__node_details * details
struct pcmk__node_assignment * assign
Wrappers for and extensions to libxml2.
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
void pcmk__xe_set_content(xmlNode *node, const char *format,...) G_GNUC_PRINTF(2
#define PCMK_XA_DESCRIPTION
#define PCMK_XA_RESOURCE_AGENT
#define PCMK_XA_LOCKED_TO
#define PCMK_XA_FAILURE_IGNORED
#define PCMK_XA_TARGET_ROLE
#define PCMK_XA_MAINTENANCE
#define PCMK_XA_NODES_RUNNING_ON