48 ticket_role_matches(
const pcmk_resource_t *rsc,
const rsc_ticket_t *rsc_ticket)
66 constraints_for_ticket(
pcmk_resource_t *rsc,
const rsc_ticket_t *rsc_ticket)
70 CRM_CHECK((rsc != NULL) && (rsc_ticket != NULL),
return);
79 for (iter = rsc->
priv->
children; iter != NULL; iter = iter->next) {
86 rsc->
id, rsc_ticket->ticket->id, rsc_ticket->id,
92 switch (rsc_ticket->loss_policy) {
103 "__loss_of_ticket__",
109 if (!ticket_role_matches(rsc, rsc_ticket)) {
114 "__loss_of_ticket__",
118 iter != NULL; iter = iter->next) {
122 "deadman ticket was lost", FALSE);
127 if (!ticket_role_matches(rsc, rsc_ticket)) {
157 const char *role_spec,
const char *loss_policy)
159 rsc_ticket_t *new_rsc_ticket = NULL;
164 "does not exist",
id);
173 new_rsc_ticket->id =
id;
174 new_rsc_ticket->ticket = ticket;
175 new_rsc_ticket->rsc = rsc;
176 new_rsc_ticket->role = role;
185 "because fencing is not configured", ticket->
id);
191 crm_debug(
"On loss of ticket '%s': Fence the nodes running %s (%s)",
192 new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id,
196 crm_debug(
"On loss of ticket '%s': Freeze %s (%s)",
197 new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id,
202 crm_debug(
"On loss of ticket '%s': Demote %s (%s)",
203 new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id,
208 crm_debug(
"On loss of ticket '%s': Stop %s (%s)",
209 new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id,
215 crm_debug(
"On loss of ticket '%s': Default to demote %s (%s)",
216 new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id,
221 crm_debug(
"On loss of ticket '%s': Default to stop %s (%s)",
222 new_rsc_ticket->ticket->id, new_rsc_ticket->rsc->id,
236 constraints_for_ticket(rsc, new_rsc_ticket);
245 const char *set_id = NULL;
246 const char *role = NULL;
249 CRM_CHECK(ticket != NULL,
return EINVAL);
251 set_id = pcmk__xe_id(
set);
252 if (set_id == NULL) {
268 pcmk__xe_id(xml_rsc));
269 if (resource == NULL) {
271 set_id, pcmk__xe_id(xml_rsc));
275 resource->
id, ticket->
id);
276 rsc_ticket_new(set_id, resource, ticket, role, loss_policy);
285 const char *
id = NULL;
298 id = pcmk__xe_id(xml_obj);
305 if (ticket_str == NULL) {
314 if (ticket == NULL) {
316 "does not exist",
id, ticket_str);
320 if (rsc_id == NULL) {
330 "does not exist",
id, rsc_id);
334 rsc_ticket_new(
id, rsc, ticket, state, loss_policy);
339 unpack_rsc_ticket_tags(xmlNode *xml_obj, xmlNode **expanded_xml,
342 const char *
id = NULL;
343 const char *rsc_id = NULL;
344 const char *state = NULL;
349 xmlNode *rsc_set = NULL;
351 *expanded_xml = NULL;
353 CRM_CHECK(xml_obj != NULL,
return EINVAL);
355 id = pcmk__xe_id(xml_obj);
364 if (*expanded_xml != NULL) {
370 if (rsc_id == NULL) {
376 "valid resource or tag",
id, rsc_id);
379 }
else if (rsc != NULL) {
394 *expanded_xml = NULL;
398 if (rsc_set != NULL) {
409 *expanded_xml = NULL;
419 bool any_sets =
false;
421 const char *
id = NULL;
422 const char *ticket_str = NULL;
426 xmlNode *orig_xml = NULL;
427 xmlNode *expanded_xml = NULL;
431 id = pcmk__xe_id(xml_obj);
444 if (ticket_str == NULL) {
452 if (ticket == NULL) {
454 if (ticket == NULL) {
459 if (unpack_rsc_ticket_tags(xml_obj, &expanded_xml,
463 if (expanded_xml != NULL) {
465 xml_obj = expanded_xml;
471 const char *loss_policy = NULL;
478 || (unpack_rsc_ticket_set(
set, ticket, loss_policy,
480 if (expanded_xml != NULL) {
493 unpack_simple_rsc_ticket(xml_obj,
scheduler);
510 item != NULL; item = item->next) {
512 rsc_ticket_t *rsc_ticket = (rsc_ticket_t *) item->data;
519 "__stateful_without_ticket__",
#define CRM_CHECK(expr, failure_action)
xmlNode * pcmk__xe_resolve_idref(xmlNode *xml, xmlNode *search)
xmlNode * pcmk__xml_copy(xmlNode *parent, xmlNode *src)
xmlNode * pcmk__xe_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
const char * pcmk_role_text(enum rsc_role_e role)
Get readable description of a resource role.
G_GNUC_INTERNAL bool pcmk__tag_to_set(xmlNode *xml_obj, xmlNode **rsc_set, const char *attr, bool convert_rsc, const pcmk_scheduler_t *scheduler)
#define pcmk__rsc_trace(rsc, fmt, args...)
#define PCMK_XE_RESOURCE_REF
#define pcmk__set_rsc_flags(resource, flags_to_set)
#define pcmk__config_err(fmt...)
pcmk__scheduler_private_t * priv
GHashTable * ticket_constraints
void pe_fence_node(pcmk_scheduler_t *scheduler, pcmk_node_t *node, const char *reason, bool priority_delay)
Schedule a fence action for a node.
void pcmk__xe_remove_attr(xmlNode *element, const char *name)
GList * ticket_constraints
void pcmk__xml_free(xmlNode *xml)
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
#define crm_debug(fmt, args...)
pcmk_scheduler_t * scheduler
G_GNUC_INTERNAL pcmk_resource_t * pcmk__find_constraint_resource(GList *rsc_list, const char *id)
void resource_location(pcmk_resource_t *rsc, const pcmk_node_t *node, int score, const char *tag, pcmk_scheduler_t *scheduler)
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
#define pcmk_is_set(g, f)
Convenience alias for pcmk_all_flags_set(), to check single flag.
pcmk__resource_private_t * priv
#define pcmk__clear_rsc_flags(resource, flags_to_clear)
G_GNUC_INTERNAL int pcmk__parse_constraint_role(const char *id, const char *role_spec, enum rsc_role_e *role)
void pcmk__require_promotion_tickets(pcmk_resource_t *rsc)
xmlNode * pcmk__xe_next(const xmlNode *node, const char *element_name)
Cluster status and scheduling.
GHashTable * pcmk__strkey_table(GDestroyNotify key_destroy_func, GDestroyNotify value_destroy_func)
pcmk_scheduler_t * scheduler
enum rsc_role_e orig_role
G_GNUC_INTERNAL bool pcmk__valid_resource_or_tag(const pcmk_scheduler_t *scheduler, const char *id, pcmk_resource_t **rsc, pcmk__idref_t **tag)
#define PCMK_XE_RESOURCE_SET
void destroy_ticket(gpointer data)
#define crm_log_xml_trace(xml, text)
pcmk__ticket_t * ticket_new(const char *ticket_id, pcmk_scheduler_t *scheduler)
Resource role is unknown.
#define PCMK_VALUE_FREEZE
#define pcmk__assert_alloc(nmemb, size)
#define PCMK_XA_LOSS_POLICY
G_GNUC_INTERNAL xmlNode * pcmk__expand_tags_in_sets(xmlNode *xml_obj, const pcmk_scheduler_t *scheduler)
#define PCMK_VALUE_DEMOTE
void pcmk__unpack_rsc_ticket(xmlNode *xml_obj, pcmk_scheduler_t *scheduler)
#define PCMK_SCORE_INFINITY
Integer score to use to represent "infinity".