14#include <libxml/tree.h>
40 struct assign_data *assign_data = user_data;
42 bool stop_if_fail = assign_data->stop_if_fail;
47 if (replica->
ip != NULL) {
49 bundle->
id, replica->
ip->
id);
54 if (replica->
remote != NULL) {
55 if (pcmk__is_pacemaker_remote_node(container_host)) {
71 if (replica->
child != NULL) {
76 while (g_hash_table_iter_next(&iter, NULL, (gpointer *) &node)) {
77 if (!pcmk__same_node(node, replica->
node)) {
119 GList *containers = NULL;
121 struct assign_data assign_data = { prefer, stop_if_fail };
137 g_list_free(containers);
144 if (bundled_resource != NULL) {
149 while (g_hash_table_iter_next(&iter, NULL, (gpointer *) & node)) {
176 if (replica->
ip != NULL) {
182 if (replica->
remote != NULL) {
198 GList *containers = NULL;
207 g_list_free(containers);
210 if (bundled_resource != NULL) {
249 if (replica->
child != NULL) {
266 if (replica->
ip != NULL) {
281 if (replica->
remote != NULL) {
290 if (replica->
child != NULL) {
313 if (bundled_resource == NULL) {
383 struct match_data *match_data = user_data;
387 match_data->container = replica->
container;
405 if (pcmk__is_bundle_node(node)) {
430 GList *scratch = NULL;
431 struct match_data match_data = { NULL, NULL };
436 match_data.node = get_bundle_node_host(match_data.node);
437 if (match_data.node != NULL) {
440 return match_data.container;
446 for (
const GList *iter = scratch; iter != NULL; iter = iter->next) {
447 match_data.node = iter->data;
448 match_data.node = get_bundle_node_host(match_data.node);
449 if (match_data.node == NULL) {
455 if (match_data.container != NULL) {
459 g_list_free(scratch);
460 return match_data.container;
466 GList *container_hosts;
483 struct coloc_data *coloc_data = user_data;
491 coloc_data->colocation,
494 coloc_data->priority_delta =
507 && ((replica->
child == NULL)
513 "Allowing mandatory colocation %s using %s @%d",
514 coloc_data->colocation->
id, pcmk__node_name(chosen),
516 coloc_data->container_hosts = g_list_prepend(coloc_data->container_hosts,
542 struct coloc_data coloc_data = { colocation, dependent, NULL, 0 };
548 pcmk__assert(pcmk__is_bundle(primary) && pcmk__is_primitive(dependent)
549 && (colocation != NULL) && !for_dependent);
553 "Skipping applying colocation %s "
554 "because %s is still provisional",
555 colocation->
id, primary->
id);
559 colocation->
id, dependent->
id, primary->
id,
568 primary_container = compatible_container(dependent, primary);
569 if (primary_container != NULL) {
571 dependent->
id, primary_container->
id);
580 crm_notice(
"%s cannot run because there is no compatible "
581 "instance of %s to colocate with",
582 dependent->
id, primary->
id);
587 "%s cannot be colocated with any instance of %s",
588 dependent->
id, primary->
id);
598 coloc_data.container_hosts,
false);
600 g_list_free(coloc_data.container_hosts);
601 return coloc_data.priority_delta;
611 pcmk__assert(pcmk__is_bundle(rsc) && (orig_rsc != NULL) && (list != NULL));
614 if ((orig_rsc == rsc)
626 if ((bundled_rsc == NULL)
632 if (orig_rsc == bundled_rsc) {
658 pcmk__assert(pcmk__is_bundle(rsc) && (orig_rsc != NULL) && (list != NULL));
661 if ((orig_rsc == rsc)
673 if ((bundled_rsc == NULL)
679 if (orig_rsc == bundled_rsc) {
710 GList *containers = NULL;
717 if (bundled_resource != NULL) {
737 g_list_free(containers);
757 if (replica->
ip != NULL) {
775 pcmk__assert((location != NULL) && pcmk__is_bundle(rsc));
781 if ((bundled_resource != NULL)
793#define XPATH_REMOTE "//nvpair[@name='" PCMK_REMOTE_RA_ADDR "']"
807 if ((replica->
remote != NULL)
818 const char *calculated_addr = NULL;
823 if (calculated_addr != NULL) {
830 GHashTable *params = NULL;
846 "Unable to determine address for bundle %s "
847 "remote connection", bundle->
id);
850 if (replica->
ip != NULL) {
854 if (replica->
remote != NULL) {
874 if (bundled_resource != NULL) {
900 if ((replica == probed_replica) || (replica->
container == NULL)) {
926 struct probe_data *probe_data = user_data;
934 if ((replica->
ip != NULL)
937 probe_data->any_created =
true;
939 if ((replica->
child != NULL)
940 && pcmk__same_node(probe_data->node, replica->
node)
943 probe_data->any_created =
true;
947 probe_data->any_created =
true;
966 if ((replica->
remote != NULL)
978 NULL, probe_data->node);
981 probe_data->any_created =
true;
984 pcmk__node_name(probe_data->node));
988 NULL, replica->
remote, NULL, probe,
1009 struct probe_data probe_data = { rsc, node,
false };
1013 return probe_data.any_created;
1028 if (replica->
ip != NULL) {
1032 if (replica->
remote != NULL) {
1035 if (replica->
child != NULL) {
1058 GHashTable *utilization)
1073 if (container != NULL) {
@ pcmk__ar_if_on_same_node
Relation applies only if actions are on same node.
@ pcmk__ar_then_implies_first
@ pcmk__ar_then_implies_first_graphed
If 'then' is required, 'first' must be added to the transition graph.
@ pcmk__ar_first_implies_then_graphed
If 'first' is required and runnable, 'then' must be in graph.
@ pcmk__ar_nested_remote_probe
@ pcmk__ar_unrunnable_first_blocks
'then' is runnable (and migratable) only if 'first' is runnable
@ pcmk__ar_ordered
Actions are ordered (optionally, if no other flags are set)
@ pcmk__ar_guest_allowed
Ordering applies even if 'first' runs on guest node created by 'then'.
#define PCMK_ACTION_PROMOTED
#define PCMK_ACTION_RUNNING
#define PCMK_ACTION_PROMOTE
#define PCMK_ACTION_START
#define PCMK_ACTION_STOPPED
#define PCMK_ACTION_MONITOR
#define PCMK_ACTION_DEMOTED
#define PCMK_ACTION_DEMOTE
char * pcmk__op_key(const char *rsc_id, const char *op_type, guint interval_ms)
Generate an operation key (RESOURCE_ACTION_INTERVAL)
@ pcmk__action_unspecified
@ pcmk__clone_promotion_constrained
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
GHashTable * pe_rsc_params(pcmk_resource_t *rsc, const pcmk_node_t *node, pcmk_scheduler_t *scheduler)
Get a table of resource parameters.
G_GNUC_INTERNAL void pcmk__add_this_with_list(GList **list, GList *addition, const pcmk_resource_t *rsc)
#define pcmk__order_starts(rsc1, rsc2, flags)
G_GNUC_INTERNAL void pcmk__colocation_intersect_nodes(pcmk_resource_t *dependent, const pcmk_resource_t *primary, const pcmk__colocation_t *colocation, const GList *primary_nodes, bool merge_scores)
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)
#define pcmk__order_resource_actions(first_rsc, first_task, then_rsc, then_task, flags)
G_GNUC_INTERNAL void pcmk__assign_instances(pcmk_resource_t *collective, GList *instances, int max_total, int max_per_node)
G_GNUC_INTERNAL uint32_t pcmk__collective_action_flags(pcmk_action_t *action, const GList *instances, const pcmk_node_t *node)
G_GNUC_INTERNAL bool pcmk__assign_resource(pcmk_resource_t *rsc, pcmk_node_t *node, bool force, bool stop_if_fail)
G_GNUC_INTERNAL gint pcmk__cmp_instance(gconstpointer a, gconstpointer b)
G_GNUC_INTERNAL GList * pcmk__sort_nodes(GList *nodes, pcmk_node_t *active_node)
G_GNUC_INTERNAL void pcmk__add_with_this_list(GList **list, GList *addition, const pcmk_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__new_colocation(const char *id, const char *node_attr, int score, pcmk_resource_t *dependent, pcmk_resource_t *primary, const char *dependent_role_spec, const char *primary_role_spec, uint32_t flags)
G_GNUC_INTERNAL bool pcmk__threshold_reached(pcmk_resource_t *rsc, const pcmk_node_t *node, pcmk_resource_t **failed)
G_GNUC_INTERNAL void pcmk__promotable_restart_ordering(pcmk_resource_t *rsc)
G_GNUC_INTERNAL bool pcmk__instance_matches(const pcmk_resource_t *instance, const pcmk_node_t *node, enum rsc_role_e role, bool current)
#define pcmk__order_stops(rsc1, rsc2, flags)
G_GNUC_INTERNAL void pcmk__create_instance_actions(pcmk_resource_t *rsc, GList *instances)
G_GNUC_INTERNAL void pcmk__apply_location(pcmk_resource_t *rsc, pcmk__location_t *constraint)
#define crm_notice(fmt, args...)
#define PCMK_REMOTE_RA_ADDR
void pcmk__bundle_apply_location(pcmk_resource_t *rsc, pcmk__location_t *location)
void pcmk__with_bundle_colocations(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList **list)
void pcmk__bundle_add_utilization(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization)
int pcmk__bundle_apply_coloc_score(pcmk_resource_t *dependent, const pcmk_resource_t *primary, const pcmk__colocation_t *colocation, bool for_dependent)
void pcmk__bundle_shutdown_lock(pcmk_resource_t *rsc)
uint32_t pcmk__bundle_action_flags(pcmk_action_t *action, const pcmk_node_t *node)
bool pcmk__bundle_create_probe(pcmk_resource_t *rsc, pcmk_node_t *node)
void pcmk__output_bundle_actions(pcmk_resource_t *rsc)
pcmk_node_t * pcmk__bundle_assign(pcmk_resource_t *rsc, const pcmk_node_t *prefer, bool stop_if_fail)
void pcmk__bundle_add_actions_to_graph(pcmk_resource_t *rsc)
void pcmk__bundle_create_actions(pcmk_resource_t *rsc)
void pcmk__bundle_with_colocations(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList **list)
void pcmk__bundle_internal_constraints(pcmk_resource_t *rsc)
const char * pe__add_bundle_remote_name(pcmk_resource_t *rsc, xmlNode *xml, const char *field)
void pe__foreach_const_bundle_replica(const pcmk_resource_t *bundle, bool(*fn)(const pcmk__bundle_replica_t *, void *), void *user_data)
bool is_set_recursive(const pcmk_resource_t *rsc, long long flag, bool any)
const pcmk_resource_t * pe__const_top_resource(const pcmk_resource_t *rsc, bool include_bundle)
#define pe__show_node_scores(level, rsc, text, nodes, scheduler)
pcmk_action_t * pe__new_rsc_pseudo_action(pcmk_resource_t *rsc, const char *task, bool optional, bool runnable)
bool pe__clone_flag_is_set(const pcmk_resource_t *clone, uint32_t flags)
pcmk_resource_t * pe__first_container(const pcmk_resource_t *bundle)
pcmk_action_t * find_first_action(const GList *input, const char *uuid, const char *task, const pcmk_node_t *on_node)
bool pe__bundle_needs_remote_name(pcmk_resource_t *rsc)
GList * pe__bundle_containers(const pcmk_resource_t *bundle)
pcmk_resource_t * pe__bundled_resource(const pcmk_resource_t *rsc)
enum pcmk__action_type get_complex_task(const pcmk_resource_t *rsc, const char *name)
bool pe__node_is_bundle_instance(const pcmk_resource_t *bundle, const pcmk_node_t *node)
void pe__foreach_bundle_replica(pcmk_resource_t *bundle, bool(*fn)(pcmk__bundle_replica_t *, void *), void *user_data)
int pe__bundle_max(const pcmk_resource_t *rsc)
@ pcmk__rsc_replica_container
#define pcmk__set_rsc_flags(resource, flags_to_set)
@ pcmk__rsc_variant_group
Group resource.
@ pcmk__rsc_node_assigned
#define pcmk__clear_rsc_flags(resource, flags_to_clear)
#define pcmk__assert(expr)
@ pcmk_role_unknown
Resource role is unknown.
@ pcmk_role_unpromoted
Unpromoted.
@ pcmk_role_promoted
Promoted.
#define pcmk__rsc_info(rsc, fmt, args...)
#define pcmk__rsc_trace(rsc, fmt, args...)
#define pcmk__rsc_debug(rsc, fmt, args...)
@ pcmk__sched_output_scores
const char * pcmk_readable_score(int score)
Return a displayable static string for a score value.
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".
int pcmk__add_scores(int score1, int score2)
void pcmk__insert_dup(GHashTable *table, const char *name, const char *value)
pcmk_node_t *(* assign)(pcmk_resource_t *rsc, const pcmk_node_t *prefer, bool stop_if_fail)
void(* create_actions)(pcmk_resource_t *rsc)
int(* apply_coloc_score)(pcmk_resource_t *dependent, const pcmk_resource_t *primary, const pcmk__colocation_t *colocation, bool for_dependent)
void(* internal_constraints)(pcmk_resource_t *rsc)
bool(* create_probe)(pcmk_resource_t *rsc, pcmk_node_t *node)
void(* add_actions_to_graph)(pcmk_resource_t *rsc)
void(* add_utilization)(const pcmk_resource_t *rsc, const pcmk_resource_t *orig_rsc, GList *all_rscs, GHashTable *utilization)
void(* output_actions)(pcmk_resource_t *rsc)
void(* apply_location)(pcmk_resource_t *rsc, pcmk__location_t *location)
A single instance of a bundle.
pcmk_resource_t * child
Instance of bundled resource.
pcmk_resource_t * remote
Pacemaker Remote connection into container.
pcmk_node_t * node
Copy of node created for this instance.
pcmk_resource_t * container
Container associated with this instance.
pcmk_resource_t * ip
IP address resource for ipaddr.
pcmk_resource_t * dependent
Location constraint object.
enum rsc_role_e role_filter
pcmk_node_t * assigned_node
GList * this_with_colocations
GList * with_this_colocations
pcmk_scheduler_t * scheduler
enum pcmk__rsc_variant variant
pcmk_resource_t * launcher
enum rsc_role_e next_role
const pcmk__assignment_methods_t * cmds
const pcmk__rsc_methods_t * fns
GHashTable * allowed_nodes
GList * location_constraints
pcmk__resource_private_t * priv
pcmk_node_t *(* location)(const pcmk_resource_t *rsc, GList **list, uint32_t target)
unsigned int(* max_per_node)(const pcmk_resource_t *rsc)
pcmk__node_private_t * priv
struct pcmk__node_assignment * assign
Wrappers for and extensions to libxml2.
xmlNode * pcmk__xpath_find_one(xmlDoc *doc, const char *path, uint8_t level)