49 const char *tag = (
const char *) xml_obj->name;
57 crm_trace(
"Unpacking %s constraint '%s'", tag,
id);
83 for (GList *iter = rsc_list; iter != NULL; iter = iter->next) {
121 NULL, (gpointer *) tag)) {
123 crm_notice(
"No resource is derived from template '%s'",
id);
131 NULL, (gpointer *) tag)) {
133 crm_notice(
"No resource is tagged with '%s'",
id);
164 if (role_spec != NULL) {
205 if ((tag != NULL) && find_constraint_tag(
scheduler,
id, tag)) {
232 xmlNode *new_xml = NULL;
233 bool any_refs =
false;
247 GList *tag_refs = NULL;
261 "because '%s' is not a valid resource or tag",
262 pcmk__xe_id(xml_obj), pcmk__xe_id(xml_rsc));
273 xmlNode *last_ref = xml_rsc;
294 for (iter = tag->
refs; iter != NULL; iter = iter->next) {
295 const char *ref_id = iter->data;
300 xmlAddNextSibling(last_ref, new_ref);
310 tag_refs = g_list_append(tag_refs, xml_rsc);
324 for (iter = tag_refs; iter != NULL; iter = iter->next) {
325 xmlNode *tag_ref = iter->data;
329 g_list_free(tag_refs);
354 const char *cons_id = NULL;
355 const char *
id = NULL;
362 CRM_CHECK((xml_obj != NULL) && (attr != NULL),
return false);
364 cons_id = pcmk__xe_id(xml_obj);
365 if (cons_id == NULL) {
378 "valid resource or tag", cons_id,
id);
389 for (GList *iter = tag->
refs; iter != NULL; iter = iter->next) {
390 const char *obj_ref = iter->data;
391 xmlNode *rsc_ref = NULL;
400 }
else if ((rsc != NULL) && convert_rsc) {
405 xmlNode *rsc_ref = NULL;
418 if (*rsc_set != NULL) {
434 crm_trace(
"Create internal constraints");
436 iter != NULL; iter = iter->next) {
xmlNode * pcmk_find_cib_element(xmlNode *cib, const char *element_name)
Find an element in the CIB.
pcmk_resource_t * uber_parent(pcmk_resource_t *rsc)
G_GNUC_INTERNAL void pcmk__unpack_ordering(xmlNode *xml_obj, pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__unpack_location(xmlNode *xml_obj, pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__unpack_colocation(xmlNode *xml_obj, pcmk_scheduler_t *scheduler)
G_GNUC_INTERNAL void pcmk__unpack_rsc_ticket(xmlNode *xml_obj, pcmk_scheduler_t *scheduler)
#define crm_notice(fmt, args...)
#define CRM_CHECK(expr, failure_action)
#define crm_debug(fmt, args...)
#define crm_trace(fmt, args...)
#define pcmk__config_warn(fmt...)
#define pcmk__config_err(fmt...)
pcmk_scheduler_t * scheduler
pcmk_resource_t * pcmk__find_constraint_resource(GList *rsc_list, const char *id)
xmlNode * pcmk__expand_tags_in_sets(xmlNode *xml_obj, const pcmk_scheduler_t *scheduler)
bool pcmk__valid_resource_or_tag(const pcmk_scheduler_t *scheduler, const char *id, pcmk_resource_t **rsc, pcmk__idref_t **tag)
void pcmk__unpack_constraints(pcmk_scheduler_t *scheduler)
void pcmk__create_internal_constraints(pcmk_scheduler_t *scheduler)
bool pcmk__tag_to_set(xmlNode *xml_obj, xmlNode **rsc_set, const char *attr, bool convert_rsc, const pcmk_scheduler_t *scheduler)
int pcmk__parse_constraint_role(const char *id, const char *role_spec, enum rsc_role_e *role)
@ pcmk_rsc_match_history
Also match clone instance ID from resource history.
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.
Cluster status and scheduling.
void(* internal_constraints)(pcmk_resource_t *rsc)
const pcmk__assignment_methods_t * cmds
const pcmk__rsc_methods_t * fns
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)
pcmk__scheduler_private_t * priv
Wrappers for and extensions to libxml2.
const char * crm_element_value(const xmlNode *data, const char *name)
Retrieve the value of an XML attribute.
const char * crm_xml_add(xmlNode *node, const char *name, const char *value)
Create an XML attribute with specified name and value.
void pcmk__xe_remove_attr(xmlNode *element, const char *name)
xmlNode * pcmk__xe_first_child(const xmlNode *parent, const char *node_name, const char *attr_n, const char *attr_v)
xmlNode * pcmk__xe_next(const xmlNode *node, const char *element_name)
xmlNode * pcmk__xe_create(xmlNode *parent, const char *name)
void pcmk__xe_set_bool_attr(xmlNodePtr node, const char *name, bool value)
xmlNode * pcmk__xml_copy(xmlNode *parent, xmlNode *src)
void pcmk__xml_free(xmlNode *xml)
#define PCMK_XE_CONSTRAINTS
#define PCMK_XE_RSC_TICKET
#define PCMK_XE_RESOURCE_REF
#define PCMK_XE_RSC_ORDER
#define PCMK_XE_RSC_COLOCATION
#define PCMK_XE_RESOURCE_SET
#define PCMK_XE_RSC_LOCATION
#define PCMK_XA_SEQUENTIAL