13 #include <sys/param.h>    34     bool runnable = 
false;
    47     if ((node == NULL) || !pe_rsc_is_clone(
action->rsc)) {
    92 action_uuid_for_ordering(
const char *first_uuid,
    95     guint interval_ms = 0;
    98     char *first_task_str = NULL;
   110     if (interval_ms > 0) {
   115     switch (first_task) {
   121             remapped_task = first_task + 1;
   128             remapped_task = first_task;
   135             crm_err(
"Unknown action '%s' in ordering", first_task_str);
   144             && (pe_rsc_is_clone(first_rsc) || pe_rsc_is_bundled(first_rsc))) {
   151                      "Remapped action UUID %s to %s for ordering purposes",
   157         uuid = strdup(first_uuid);
   160     free(first_task_str);
   188         && (
action->uuid != NULL)) {
   189         char *uuid = action_uuid_for_ordering(
action->uuid, rsc);
   193             crm_warn(
"Not remapping %s to %s because %s does not have "   194                      "remapped action", 
action->uuid, uuid, rsc->
id);
   221 static inline uint32_t
   245                                  uint32_t first_flags, uint32_t then_flags,
   269                      "%s then %s: mapped pcmk__ar_first_implies_same_node_then "   270                      "to pcmk__ar_first_implies_then on %s",
   271                      first->
uuid, then->
uuid, pe__node_name(node));
   275         if (then->
rsc != NULL) {
   276             changed |= update(then->
rsc, first, then, node,
   286                      "%s then %s: %s after pcmk__ar_first_implies_then",
   288                      (changed? 
"changed" : 
"unchanged"));
   292         && (then->
rsc != NULL)) {
   296         changed |= update(then->
rsc, first, then, node, first_flags, restart,
   299                      "%s then %s: %s after pcmk__ar_intermediate_stop",
   301                      (changed? 
"changed" : 
"unchanged"));
   305         if (first->
rsc != NULL) {
   306             changed |= update(first->
rsc, first, then, node, first_flags,
   315                      "%s then %s: %s after pcmk__ar_then_implies_first",
   317                      (changed? 
"changed" : 
"unchanged"));
   321         if (then->
rsc != NULL) {
   322             changed |= update(then->
rsc, first, then, node,
   328                      "%s then %s: %s after pcmk__ar_promoted_then_implies_first",
   330                      (changed? 
"changed" : 
"unchanged"));
   334         if (then->
rsc != NULL) {
   335             changed |= update(then->
rsc, first, then, node, first_flags,
   355                      (changed? 
"changed" : 
"unchanged"));
   359         && (then->
rsc != NULL)) {
   365                          "%s then %s: ignoring because first is stopping",
   369             changed |= update(then->
rsc, first, then, node, first_flags,
   374                      "%s then %s: %s after pcmk__ar_nested_remote_probe",
   376                      (changed? 
"changed" : 
"unchanged"));
   380         if (then->
rsc != NULL) {
   381             changed |= update(then->
rsc, first, then, node, first_flags,
   392                      "%s then %s: %s after pcmk__ar_unrunnable_first_blocks",
   394                      (changed? 
"changed" : 
"unchanged"));
   398         if (then->
rsc != NULL) {
   399             changed |= update(then->
rsc, first, then, node, first_flags,
   404                      "pcmk__ar_unmigratable_then_blocks",
   406                      (changed? 
"changed" : 
"unchanged"));
   410         if (then->
rsc != NULL) {
   411             changed |= update(then->
rsc, first, then, node, first_flags,
   415         pe_rsc_trace(then->
rsc, 
"%s then %s: %s after pcmk__ar_first_else_then",
   417                      (changed? 
"changed" : 
"unchanged"));
   421         if (then->
rsc != NULL) {
   422             changed |= update(then->
rsc, first, then, node, first_flags,
   428                      (changed? 
"changed" : 
"unchanged"));
   432         if (then->
rsc != NULL) {
   433             changed |= update(then->
rsc, first, then, node, first_flags,
   439                      (changed? 
"changed" : 
"unchanged"));
   464         && (first->
rsc != NULL)
   475                      "is blocked, unmanaged, unrunnable stop",
   477                      (changed? 
"changed" : 
"unchanged"));
   485 #define action_type_str(flags) \   486     (pcmk_is_set((flags), pcmk_action_pseudo)? "pseudo-action" : "action")   488 #define action_optional_str(flags) \   489     (pcmk_is_set((flags), pcmk_action_optional)? "optional" : "required")   491 #define action_runnable_str(flags) \   492     (pcmk_is_set((flags), pcmk_action_runnable)? "runnable" : "unrunnable")   494 #define action_node_str(a) \   495     (((a)->node == NULL)? "no node" : (a)->node->details->uname)   510     int last_flags = then->
flags;
   546         if ((first->
rsc != NULL)
   551             if (first_node != NULL) {
   553                              pe__node_name(first_node), first->
uuid);
   557         if ((then->
rsc != NULL)
   562             if (then_node != NULL) {
   564                              pe__node_name(then_node), then->
uuid);
   570             && (first_node != NULL) && (then_node != NULL)
   571             && !pe__same_node(first_node, then_node)) {
   574                          "Disabled ordering %s on %s then %s on %s: "   576                          other->
action->
uuid, pe__node_name(first_node),
   577                          then->
uuid, pe__node_name(then_node));
   584         if ((first->
rsc != NULL)
   597         if ((first->
rsc != NULL) && (then->
rsc != NULL)
   599             first = action_for_ordering(first);
   601         if (first != other->
action) {
   607                      "%s (%#.6x) then %s (%#.6x): type=%#.6x node=%s",
   611         if (first == other->
action) {
   616             uint32_t first_flags, then_flags;
   618             first_flags = action_flags_for_ordering(first, then_node);
   619             then_flags = action_flags_for_ordering(then, first_node);
   621             changed |= update_action_for_ordering_flags(first, then,
   622                                                         first_flags, then_flags,
   634                          "Disabled ordering %s then %s in favor of %s then %s",
   642             crm_trace(
"Re-processing %s and its 'after' actions "   643                       "because it changed", first->
uuid);
   655         if (last_flags == then->
flags) {
   663         crm_trace(
"Re-processing %s and its 'after' actions because it changed",
   670         for (lpc = then->
actions_after; lpc != NULL; lpc = lpc->next) {
   693 #define clear_action_flag_because(action, flag, reason) do {                \   694         if (pcmk_is_set((action)->flags, (flag))) {                         \   695             pe__clear_action_flags(action, flag);                           \   696             if ((action)->rsc != (reason)->rsc) {                           \   697                 char *reason_text = pe__action2reason((reason), (flag));    \   698                 pe_action_set_reason((action), reason_text, false);         \   720     if ((then->
rsc == NULL)
   765     const char *reason = NULL;
   784         && (first->
rsc == then->
rsc)) {
   788     if (reason == NULL) {
   842                              uint32_t filter, uint32_t 
type,
   846     uint32_t then_flags = 0U;
   847     uint32_t first_flags = 0U;
   851     then_flags = then->
flags;
   852     first_flags = first->
flags;
   854         handle_asymmetric_ordering(first, then);
   926         handle_restart_ordering(first, then, filter);
   929     if (then_flags != then->
flags) {
   932                      "%s on %s: flags are now %#.6x (was %#.6x) "   933                      "because of 'first' %s (%#.6x)",
   934                      then->
uuid, pe__node_name(then->
node),
   937         if ((then->
rsc != NULL) && (then->
rsc->
parent != NULL)) {
   943     if (first_flags != first->
flags) {
   946                      "%s on %s: flags are now %#.6x (was %#.6x) "   947                      "because of 'then' %s (%#.6x)",
   948                      first->
uuid, pe__node_name(first->
node),
   967     const char *node_uname = NULL;
   968     const char *node_uuid = NULL;
   969     const char *desc = NULL;
   974         if (
action->node != NULL) {
   975             node_uname = 
action->node->details->uname;
   976             node_uuid = 
action->node->details->id;
   978             node_uname = 
"<none>";
   990                 desc = 
"!!Non-Startable!! ";
   992                desc = 
"(Provisional) ";
   994             crm_trace(
"%s%s%sAction %d: %s%s%s%s%s%s",
   995                       ((pre_text == NULL)? 
"" : pre_text),
   996                       ((pre_text == NULL)? 
"" : 
": "),
   998                       (node_uname? 
"\ton " : 
""), (node_uname? node_uname : 
""),
   999                       (node_uuid? 
"\t\t(" : 
""), (node_uuid? node_uuid : 
""),
  1000                       (node_uuid? 
")" : 
""));
  1008                 desc = 
"!!Non-Startable!! ";
  1010                desc = 
"(Provisional) ";
  1012             crm_trace(
"%s%s%sAction %d: %s %s%s%s%s%s%s",
  1013                       ((pre_text == NULL)? 
"" : pre_text),
  1014                       ((pre_text == NULL)? 
"" : 
": "),
  1017                       (node_uname? 
"\ton " : 
""), (node_uname? node_uname : 
""),
  1018                       (node_uuid? 
"\t\t(" : 
""), (node_uuid? node_uuid : 
""),
  1019                       (node_uuid? 
")" : 
""));
  1024         const GList *iter = NULL;
  1027         crm_trace(
"\t\t====== Preceding Actions");
  1028         for (iter = 
action->actions_before; iter != NULL; iter = iter->next) {
  1032         crm_trace(
"\t\t====== Subsequent Actions");
  1033         for (iter = 
action->actions_after; iter != NULL; iter = iter->next) {
  1041                   g_list_length(
action->actions_before),
  1042                   g_list_length(
action->actions_after));
  1057     char *shutdown_id = NULL;
  1087     char *digest = NULL;
  1088     xmlNode *args_xml = NULL;
  1090     if (op->
params == NULL) {
  1102 #define FAKE_TE_ID     "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"  1119                          const char *caller_version, 
int target_rc,
  1120                          const char *node, 
const char *origin)
  1125     char *op_id_additional = NULL;
  1126     char *local_user_data = NULL;
  1127     const char *exit_reason = NULL;
  1129     xmlNode *xml_op = NULL;
  1130     const char *task = NULL;
  1133     crm_trace(
"Creating history XML for %s-interval %s action for %s on %s "  1134               "(DC version: %s, origin: %s)",
  1136               ((node == NULL)? 
"no node" : node), caller_version, origin);
  1181         op_id = strdup(key);
  1192         op_id = strdup(key);
  1200     if (xml_op == NULL) {
  1213     if (magic == NULL) {
  1236                       "): last=%u change=%u exec=%u queue=%u",
  1246                                (
long long) op->
t_run);
  1267     add_op_digest_to_xml(op, xml_op);
  1269     if (op_id_additional) {
  1271         op_id = op_id_additional;
  1272         op_id_additional = NULL;
  1276     if (local_user_data) {
  1277         free(local_user_data);
  1305         || !pe__same_node(
action->node, 
action->rsc->lock_node)) {
  1312     if (
action->node->details->shutdown && (
action->task != NULL)
  1322 sort_action_id(gconstpointer a, gconstpointer b)
  1355     action->actions_before = g_list_sort(
action->actions_before,
  1357     for (item = 
action->actions_before; item != NULL; item = next) {
  1361         if ((last_input != NULL)
  1363             crm_trace(
"Input %s (%d) duplicate skipped for action %s (%d)",
  1377             action->actions_before = g_list_delete_link(
action->actions_before,
  1399         char *node_name = NULL;
  1403         if (
action->rsc != NULL) {
  1412             task = strdup(
"Shutdown");
  1416             const char *op = g_hash_table_lookup(
action->meta,
  1429                                           pe__node_name(
action->node),
  1431         } 
else if (
action->node != NULL) {
  1435         out->
message(out, 
"node-action", task, node_name, 
action->reason);
  1459 task_for_digest(
const char *task, guint interval_ms)
  1464     if ((interval_ms == 0)
  1490 only_sanitized_changed(
const xmlNode *xml_op,
  1494     const char *digest_secure = NULL;
  1518 force_restart(
pcmk_resource_t *rsc, 
const char *task, guint interval_ms,
  1538 schedule_reload(gpointer 
data, gpointer user_data)
  1546         g_list_foreach(rsc->
children, schedule_reload, user_data);
  1566         pe_rsc_trace(rsc, 
"%s: preventing agent reload because start pending",
  1604                           const xmlNode *xml_op)
  1606     guint interval_ms = 0;
  1607     const char *task = NULL;
  1610     CRM_CHECK((rsc != NULL) && (node != NULL) && (xml_op != NULL),
  1619     if (interval_ms > 0) {
  1621             pe_rsc_trace(rsc, 
"%s-interval %s for %s on %s is in configuration",
  1623                          pe__node_name(node));
  1629                                   task, interval_ms, node, 
"orphan");
  1632             pe_rsc_debug(rsc, 
"%s-interval %s for %s on %s is orphaned",
  1634                          pe__node_name(node));
  1639     crm_trace(
"Checking %s-interval %s for %s on %s for configuration changes",
  1641               pe__node_name(node));
  1642     task = task_for_digest(task, interval_ms);
  1645     if (only_sanitized_changed(xml_op, digest_data, rsc->
cluster)) {
  1650                       "Only 'private' parameters to %s-interval %s for %s "  1651                       "on %s changed: %s",
  1653                       pe__node_name(node),
  1659     switch (digest_data->
rc) {
  1662             force_restart(rsc, task, interval_ms, node);
  1669             if (interval_ms > 0) {
  1681                                   "Device parameters changed (reload)", NULL,
  1684                 schedule_reload((gpointer) rsc, (gpointer) node);
  1689                              "because agent doesn't support reload", rsc->
id);
  1692                 force_restart(rsc, task, interval_ms, node);
  1711 rsc_history_as_list(
const xmlNode *rsc_entry, 
int *start_index, 
int *stop_index)
  1717         ops = g_list_prepend(ops, rsc_op);
  1744     int start_index = 0;
  1745     GList *sorted_op_list = NULL;
  1750                          "Skipping configuration check "  1751                          "for orphaned clone instance %s",
  1755                          "Skipping configuration check and scheduling clean-up "  1756                          "for orphaned resource %s", rsc->
id);
  1767                      "Skipping configuration check for %s "  1768                      "because no longer active on %s",
  1769                      rsc->
id, pe__node_name(node));
  1773     pe_rsc_trace(rsc, 
"Checking for configuration changes for %s on %s",
  1774                  rsc->
id, pe__node_name(node));
  1780     sorted_op_list = rsc_history_as_list(rsc_entry, &start_index, &stop_index);
  1781     if (start_index < stop_index) {
  1785     for (GList *iter = sorted_op_list; iter != NULL; iter = iter->next) {
  1786         xmlNode *rsc_op = (xmlNode *) iter->data;
  1787         const char *task = NULL;
  1788         guint interval_ms = 0;
  1790         if (++offset < start_index) {
  1798         if ((interval_ms > 0)
  1805                                   task, interval_ms, node, 
"maintenance mode");
  1807         } 
else if ((interval_ms > 0)
  1835     g_list_free(sorted_op_list);
  1852 process_node_history(
pcmk_node_t *node, 
const xmlNode *lrm_rscs)
  1854     crm_trace(
"Processing node history for %s", pe__node_name(node));
  1859         if (rsc_entry->children != NULL) {
  1863             for (GList *iter = 
result; iter != NULL; iter = iter->next) {
  1867                     process_rsc_history(rsc_entry, rsc, node);
  1876 #define XPATH_NODE_HISTORY "/" XML_TAG_CIB "/" XML_CIB_TAG_STATUS             \  1877                            "/" XML_CIB_TAG_STATE "[@" XML_ATTR_UNAME "='%s']" \  1878                            "/" XML_CIB_TAG_LRM "/" XML_LRM_TAG_RESOURCES  1895     crm_trace(
"Check resource and action configuration for changes");
  1901     for (GList *iter = 
scheduler->
nodes; iter != NULL; iter = iter->next) {
  1912             xmlNode *history = NULL;
  1918             process_node_history(node, history);
 pcmk_assignment_methods_t * cmds
Resource assignment methods. 
 
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
 
#define CRM_CHECK(expr, failure_action)
 
Whether resource has clone notifications enabled. 
 
#define XML_RSC_OP_LAST_CHANGE
 
const char * task2text(enum action_tasks task)
 
Relation applies only if actions are on same node. 
 
void trigger_unfencing(pcmk_resource_t *rsc, pcmk_node_t *node, const char *reason, pcmk_action_t *dependency, pcmk_scheduler_t *scheduler)
 
'then' is runnable (and migratable) only if 'first' is runnable 
 
pcmk_scheduler_t * cluster
Cluster that resource is part of. 
 
void(* output_actions)(pcmk_resource_t *rsc)
 
G_GNUC_INTERNAL void pcmk__schedule_cleanup(pcmk_resource_t *rsc, const pcmk_node_t *node, bool optional)
 
#define pe_rsc_debug(rsc, fmt, args...)
 
void pcmk__filter_op_for_digest(xmlNode *param_set)
 
Whether action should not be executed. 
 
User-configured asymmetric ordering. 
 
pcmk_node_t *(* location)(const pcmk_resource_t *rsc, GList **list, int current)
List nodes where a resource (or any of its children) is. 
 
#define pe__set_action_flags(action, flags_to_set)
 
void hash2field(gpointer key, gpointer value, gpointer user_data)
Set XML attribute based on hash table entry. 
 
int runnable_before
For Pacemaker use only. 
 
xmlNode * pcmk__xe_match(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
 
const char * crm_xml_add_ms(xmlNode *node, const char *name, guint ms)
Create an XML attribute with specified name and unsigned value. 
 
#define XML_ATTR_TRANSITION_MAGIC
 
G_GNUC_INTERNAL void pcmk__new_ordering(pcmk_resource_t *first_rsc, char *first_task, pcmk_action_t *first_action, pcmk_resource_t *then_rsc, char *then_task, pcmk_action_t *then_action, uint32_t flags, pcmk_scheduler_t *sched)
 
bool pcmk__strcase_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
 
int(* message)(pcmk__output_t *out, const char *message_id,...)
 
#define clear_action_flag_because(action, flag, reason)
 
enum rsc_role_e role
Resource's current role. 
 
#define PCMK__OP_FMT
printf-style format to create operation key from resource, action, interval 
 
GList * children
Resource's child resources, if any. 
 
enum pcmk__digest_result rc
 
void pcmk__deduplicate_action_inputs(pcmk_action_t *action)
 
gboolean order_actions(pcmk_action_t *lh_action, pcmk_action_t *rh_action, uint32_t flags)
 
xmlNode * first_named_child(const xmlNode *parent, const char *name)
 
enum rsc_role_e(* state)(const pcmk_resource_t *rsc, gboolean current)
Get resource's current or assigned role. 
 
If 'first' is unrunnable, 'then' becomes a real, unmigratable action. 
 
const char * crm_xml_add_int(xmlNode *node, const char *name, int value)
Create an XML attribute with specified name and integer value. 
 
Implementation of pcmk_action_t. 
 
void pcmk__handle_rsc_config_changes(pcmk_scheduler_t *scheduler)
 
G_GNUC_INTERNAL bool pcmk__rsc_agent_changed(pcmk_resource_t *rsc, pcmk_node_t *node, const xmlNode *rsc_entry, bool active_on_node)
 
#define PCMK_ACTION_MONITOR
 
#define XML_RSC_OP_T_EXEC
 
const char * crm_meta_value(GHashTable *hash, const char *field)
 
G_GNUC_INTERNAL void pcmk__block_colocation_dependents(pcmk_action_t *action)
 
Whether resource, its node, or entire cluster is in maintenance mode. 
 
op_digest_cache_t * rsc_action_digest_cmp(pcmk_resource_t *rsc, const xmlNode *xml_op, pcmk_node_t *node, pcmk_scheduler_t *scheduler)
 
#define XML_LRM_TAG_RESOURCE
 
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value. 
 
#define XML_LRM_ATTR_OP_DIGEST
 
void pe_action_set_reason(pcmk_action_t *action, const char *reason, bool overwrite)
 
#define PCMK_ACTION_MIGRATE_TO
 
#define PCMK_ACTION_DO_SHUTDOWN
 
gint sort_op_by_callid(gconstpointer a, gconstpointer b)
 
action_tasks
Possible actions (including some pseudo-actions) 
 
xmlNode * pcmk__create_history_xml(xmlNode *parent, lrmd_event_data_t *op, const char *caller_version, int target_rc, const char *node, const char *origin)
 
enum action_tasks text2task(const char *task)
 
GList * actions
Scheduled actions. 
 
#define CRM_LOG_ASSERT(expr)
 
int(* info)(pcmk__output_t *out, const char *format,...) G_GNUC_PRINTF(2
 
If 'first' is required, 'then' action for instance on same node is. 
 
#define PCMK_ACTION_RELOAD
 
pcmk_action_t * pe__clear_failcount(pcmk_resource_t *rsc, const pcmk_node_t *node, const char *reason, pcmk_scheduler_t *scheduler)
Schedule a controller operation to clear a fail count. 
 
enum crm_ais_msg_types type
 
int id
Counter to identify action. 
 
pcmk_scheduler_t * data_set
Cluster that node is part of. 
 
pcmk_resource_t * container
Resource containing this one, if any. 
 
#define XML_RSC_OP_T_QUEUE
 
Implementation of pcmk_scheduler_t. 
 
#define pe__set_raw_action_flags(action_flags, action_name, flags_to_set)
 
xmlNode * get_xpath_object(const char *xpath, xmlNode *xml_obj, int error_level)
 
int pe_get_failcount(const pcmk_node_t *node, pcmk_resource_t *rsc, time_t *last_failure, uint32_t flags, const xmlNode *xml_op)
 
G_GNUC_INTERNAL bool pcmk__node_available(const pcmk_node_t *node, bool consider_score, bool consider_guest)
 
#define pe__set_resource_flags(resource, flags_to_set)
 
GList * resources
Resources in cluster. 
 
GList * nodes
Nodes in cluster. 
 
#define XML_LRM_ATTR_TASK_KEY
 
#define XML_LRM_ATTR_TASK
 
bool pcmk__check_action_config(pcmk_resource_t *rsc, pcmk_node_t *node, const xmlNode *xml_op)
 
#define PCMK_ACTION_RELOAD_AGENT
 
gboolean did_rsc_op_fail(lrmd_event_data_t *event, int target_rc)
 
pcmk_resource_t * parent
Resource's parent resource, if any. 
 
char * calculate_operation_digest(xmlNode *local_cib, const char *version)
Calculate and return digest of XML operation. 
 
#define crm_warn(fmt, args...)
 
G_GNUC_INTERNAL GList * pcmk__rscs_matching_id(const char *id, const pcmk_scheduler_t *scheduler)
 
char * pcmk__transition_key(int transition_id, int action_id, int target_rc, const char *node)
 
#define action_type_str(flags)
 
pcmk_node_t * node
Node to execute action on, if any. 
 
int crm_element_value_ms(const xmlNode *data, const char *name, guint *dest)
Retrieve the millisecond value of an XML attribute. 
 
#define action_node_str(a)
 
Implementation of pcmk_resource_t. 
 
#define crm_debug(fmt, args...)
 
Actions are ordered (optionally, if no other flags are set) 
 
#define pe__clear_order_flags(order_flags, flags_to_clear)
 
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute. 
 
pcmk_node_t * pe_find_node_id(const GList *node_list, const char *id)
Find a node by ID in a list of nodes. 
 
uint32_t pcmk__update_ordered_actions(pcmk_action_t *first, pcmk_action_t *then, const pcmk_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pcmk_scheduler_t *scheduler)
 
G_GNUC_INTERNAL void pcmk__schedule_cancel(pcmk_resource_t *rsc, const char *call_id, const char *task, guint interval_ms, const pcmk_node_t *node, const char *reason)
 
Whether resource is considered failed. 
 
GList * actions_after
For Pacemaker use only. 
 
#define pe__clear_action_flags(action, flags_to_clear)
 
#define crm_trace(fmt, args...)
 
void pcmk__update_action_for_orderings(pcmk_action_t *then, pcmk_scheduler_t *scheduler)
 
void * priv
For Pacemaker use only. 
 
char * digest_secure_calc
 
char * crm_strdup_printf(char const *format,...) G_GNUC_PRINTF(1
 
GHashTable * meta
Meta-attributes relevant to action. 
 
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag. 
 
struct pe_node_shared_s * details
Basic node information. 
 
bool pe__bundle_needs_remote_name(pcmk_resource_t *rsc)
 
#define crm_log_xml_debug(xml, text)
 
#define PCMK_ACTION_START
 
unsigned long long flags
Group of enum pcmk_rsc_flags. 
 
const char * uname
Node name in cluster. 
 
#define XML_ATTR_TE_NOWAIT
 
xmlNode * create_xml_node(xmlNode *parent, const char *name)
 
Action completed, result is known. 
 
#define PCMK_ACTION_STONITH
 
#define pcmk__clear_updated_flags(au_flags, action, flags_to_clear)
 
pe_action_flags
Action scheduling flags. 
 
#define XML_LRM_ATTR_MIGRATE_TARGET
 
#define XML_LRM_ATTR_EXIT_REASON
 
#define XML_LRM_ATTR_RESTART_DIGEST
 
char * pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms)
Generate an operation key (RESOURCE_ACTION_INTERVAL) 
 
void free_xml(xmlNode *child)
 
Whether resource is blocked from further action. 
 
Implementation of pcmk_node_t. 
 
enum pe_obj_types variant
Resource variant. 
 
bool pcmk__str_any_of(const char *s,...) G_GNUC_NULL_TERMINATED
 
Whether resource has pending start action in history. 
 
const char * id
Node ID at the cluster layer. 
 
Whether sensitive resource attributes have been masked. 
 
pcmk_action_t * custom_action(pcmk_resource_t *rsc, char *key, const char *task, const pcmk_node_t *on_node, gboolean optional, pcmk_scheduler_t *scheduler)
Create or update an action object. 
 
const char * crm_xml_add_ll(xmlNode *node, const char *name, long long value)
Create an XML attribute with specified name and long long int value. 
 
Unspecified or unknown action. 
 
#define XML_ATTR_TRANSITION_KEY
 
#define XML_LRM_ATTR_SECURE_DIGEST
 
#define action_runnable_str(flags)
 
bool pe__is_guest_node(const pcmk_node_t *node)
 
#define action_optional_str(flags)
 
xmlNode * pcmk__find_action_config(const pcmk_resource_t *rsc, const char *action_name, guint interval_ms, bool include_disabled)
 
char * pcmk__notify_key(const char *rsc_id, const char *notify_type, const char *op_type)
 
If 'then' is required, 'first' must be added to the transition graph. 
 
pcmk__action_result_t result
 
Whether action is runnable. 
 
void add_hash_param(GHashTable *hash, const char *name, const char *value)
 
pcmk_rsc_methods_t * fns
Resource object methods. 
 
G_GNUC_INTERNAL void pcmk__reschedule_recurring(pcmk_resource_t *rsc, const char *task, guint interval_ms, pcmk_node_t *node)
 
#define XPATH_NODE_HISTORY
 
pcmk_action_t * find_first_action(const GList *input, const char *uuid, const char *task, const pcmk_node_t *on_node)
 
#define pcmk__set_updated_flags(au_flags, action, flags_to_set)
 
#define crm_err(fmt, args...)
 
pcmk_scheduler_t * scheduler
 
Whether action does not require invoking an agent. 
 
If 'first' is required and runnable, 'then' must be in graph. 
 
void lrmd__set_result(lrmd_event_data_t *event, enum ocf_exitcode rc, int op_status, const char *exit_reason)
 
Whether action should be added to transition graph even if optional. 
 
#define PCMK_ACTION_MIGRATE_FROM
 
void calculate_active_ops(const GList *sorted_op_list, int *start_index, int *stop_index)
 
This structure contains everything that makes up a single output formatter. 
 
int compare_version(const char *version1, const char *version2)
 
gboolean parse_op_key(const char *key, char **rsc_id, char **op_type, guint *interval_ms)
 
#define XML_LRM_ATTR_INTERVAL_MS
 
#define XML_LRM_ATTR_CALLID
 
gboolean is_parent(pcmk_resource_t *child, pcmk_resource_t *rsc)
 
#define pe__clear_resource_flags(resource, flags_to_clear)
 
#define XML_LRM_ATTR_OPSTATUS
 
#define XML_ATTR_CRM_VERSION
 
If 'then' action becomes required, 'first' becomes optional. 
 
#define PCMK_ACTION_PROMOTE
 
GList * running_on
Nodes where resource may be active. 
 
enum pe_action_flags flags
Group of enum pe_action_flags. 
 
gboolean maintenance
Whether in maintenance mode. 
 
uint32_t(* update_ordered_actions)(pcmk_action_t *first, pcmk_action_t *then, const pcmk_node_t *node, uint32_t flags, uint32_t filter, uint32_t type, pcmk_scheduler_t *scheduler)
 
Whether a reload action has been scheduled for resource. 
 
Whether action is allowed to be part of a live migration. 
 
bool pcmk__action_locks_rsc_to_node(const pcmk_action_t *action)
 
const char * pcmk__readable_interval(guint interval_ms)
 
pcmk_action_t * pcmk__new_shutdown_action(pcmk_node_t *node)
 
pcmk_resource_t * rsc
Resource to apply action to, if any. 
 
G_GNUC_INTERNAL void pcmk__order_stops_before_shutdown(pcmk_node_t *node, pcmk_action_t *shutdown_op)
 
#define XML_LRM_ATTR_TARGET
 
#define XML_LRM_TAG_RSC_OP
 
#define pe_rsc_trace(rsc, fmt, args...)
 
#define pe__set_order_flags(order_flags, flags_to_set)
 
unsigned long long flags
Group of enum pcmk_scheduler_flags. 
 
bool pe__rsc_running_on_only(const pcmk_resource_t *rsc, const pcmk_node_t *node)
 
#define XML_LRM_ATTR_MIGRATE_SOURCE
 
Whether resource is managed. 
 
'then' action is runnable if certain number of 'first' instances are 
 
void pe__add_param_check(const xmlNode *rsc_op, pcmk_resource_t *rsc, pcmk_node_t *node, enum pcmk__check_parameters, pcmk_scheduler_t *scheduler)
 
void pcmk__log_action(const char *pre_text, const pcmk_action_t *action, bool details)
 
Whether resource has been removed from the configuration. 
 
GList * actions_before
For Pacemaker use only. 
 
int required_runnable_before
 
#define PCMK_ACTION_NOTIFY
 
No relation (compare with equality rather than bit set) 
 
char * id
Resource ID in configuration. 
 
void pcmk__output_actions(pcmk_scheduler_t *scheduler)
 
xmlNode * crm_next_same_xml(const xmlNode *sibling)
Get next instance of same XML tag.