commit f81b9a3f0eb134df35f1d29742ffe12cbeb74ded Author: Gao,Yan Date: Wed Jan 29 14:07:44 2014 +0800 Feature: pengine: Support id-ref in nvpair with optional "name" If "name" isn't specified, it inherits the name from the referenced nvpair. diff --git a/lib/pengine/rules.c b/lib/pengine/rules.c index f80aa47..626d7b2 100644 --- a/lib/pengine/rules.c +++ b/lib/pengine/rules.c @@ -607,7 +607,7 @@ sort_pairs(gconstpointer a, gconstpointer b) } static void -populate_hash(xmlNode * nvpair_list, GHashTable * hash, gboolean overwrite) +populate_hash(xmlNode * nvpair_list, GHashTable * hash, gboolean overwrite, xmlNode * top) { const char *name = NULL; const char *value = NULL; @@ -622,10 +622,18 @@ populate_hash(xmlNode * nvpair_list, GHashTable * hash, gboolean overwrite) for (an_attr = __xml_first_child(list); an_attr != NULL; an_attr = __xml_next(an_attr)) { if (crm_str_eq((const char *)an_attr->name, XML_CIB_TAG_NVPAIR, TRUE)) { + xmlNode *ref_nvpair = expand_idref(an_attr, top); + name = crm_element_value(an_attr, XML_NVPAIR_ATTR_NAME); + if (name == NULL) { + name = crm_element_value(ref_nvpair, XML_NVPAIR_ATTR_NAME); + } crm_trace("Setting attribute: %s", name); value = crm_element_value(an_attr, XML_NVPAIR_ATTR_VALUE); + if (value == NULL) { + value = crm_element_value(ref_nvpair, XML_NVPAIR_ATTR_VALUE); + } if (name == NULL || value == NULL) { continue; @@ -657,6 +665,7 @@ struct unpack_data_s { GHashTable *node_hash; GHashTable *hash; crm_time_t *now; + xmlNode *top; }; static void @@ -670,7 +679,7 @@ unpack_attr_set(gpointer data, gpointer user_data) } crm_trace("Adding attributes from %s", pair->name); - populate_hash(pair->attr_set, unpack_data->hash, unpack_data->overwrite); + populate_hash(pair->attr_set, unpack_data->hash, unpack_data->overwrite, unpack_data->top); } void @@ -717,6 +726,7 @@ unpack_instance_attributes(xmlNode * top, xmlNode * xml_obj, const char *set_nam data.node_hash = node_hash; data.now = now; data.overwrite = overwrite; + data.top = top; } sorted = g_list_sort(unsorted, sort_pairs); diff --git a/xml/Makefile.am b/xml/Makefile.am index 4a7381b..87340fb 100644 --- a/xml/Makefile.am +++ b/xml/Makefile.am @@ -26,7 +26,7 @@ RNG_FILES = $(VERSIONED_RNG_FILES:%.rng=%-1.0.rng) \ $(VERSIONED_RNG_FILES:%.rng=%-1.2.rng) \ $(VERSIONED_RNG_FILES:%.rng=%-next.rng) \ pacemaker.rng versions.rng score.rng rule.rng nvset.rng \ - fencing.rng + fencing.rng nvset-1.0.rng EXTRA_DIST = crm-1.0.dtd $(dtd_SCRIPTS) dtd_SCRIPTS = crm.dtd $(RNG_FILES) upgrade06.xsl upgrade11.xsl crm-transitional.dtd diff --git a/xml/nvset-1.0.rng b/xml/nvset-1.0.rng new file mode 100644 index 0000000..0d7e72c --- /dev/null +++ b/xml/nvset-1.0.rng @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/xml/nvset.rng b/xml/nvset.rng index 0d7e72c..8f1696c 100644 --- a/xml/nvset.rng +++ b/xml/nvset.rng @@ -17,11 +17,21 @@ - - - - - + + + + + + + + + + + + + + + diff --git a/xml/pacemaker-1.0.rng b/xml/pacemaker-1.0.rng index 7100393..93e5e5f 100644 --- a/xml/pacemaker-1.0.rng +++ b/xml/pacemaker-1.0.rng @@ -15,7 +15,7 @@ - + @@ -23,7 +23,7 @@ - + @@ -32,7 +32,7 @@ - + @@ -94,7 +94,7 @@ - + diff --git a/xml/resources-1.0.rng b/xml/resources-1.0.rng index 7ea2228..743ccba 100644 --- a/xml/resources-1.0.rng +++ b/xml/resources-1.0.rng @@ -95,10 +95,10 @@ - + - +