Skip to content

Commit

Permalink
Feature: pengine: Support id-ref in nvpair with optional "name"
Browse files Browse the repository at this point in the history
If "name" isn't specified, it inherits the name from the referenced
nvpair.
  • Loading branch information
gao-yan committed Apr 8, 2014
1 parent d9fbba5 commit 3912538
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 8 deletions.
14 changes: 12 additions & 2 deletions lib/pengine/rules.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -657,6 +665,7 @@ struct unpack_data_s {
GHashTable *node_hash;
GHashTable *hash;
crm_time_t *now;
xmlNode *top;
};

static void
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions xml/nodes-1.3.rng
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@
<zeroOrMore>
<choice>
<element name="instance_attributes">
<externalRef href="nvset.rng"/>
<externalRef href="nvset-1.3.rng"/>
</element>
<element name="utilization">
<externalRef href="nvset.rng"/>
<externalRef href="nvset-1.3.rng"/>
</element>
</choice>
</zeroOrMore>
Expand Down
45 changes: 45 additions & 0 deletions xml/nvset-1.3.rng
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- types: http://www.w3.org/TR/xmlschema-2/#dateTime -->
<grammar xmlns="http://relaxng.org/ns/structure/1.0"
datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
<start>
<ref name="element-nvset"/>
</start>

<define name="element-nvset">
<choice>
<attribute name="id-ref"><data type="IDREF"/></attribute>
<group>
<attribute name="id"><data type="ID"/></attribute>
<interleave>
<optional>
<externalRef href="rule.rng"/>
</optional>
<zeroOrMore>
<element name="nvpair">
<choice>
<group>
<attribute name="id-ref"><data type="IDREF"/></attribute>
<optional>
<attribute name="name"><text/></attribute>
</optional>
</group>
<group>
<attribute name="id"><data type="ID"/></attribute>
<attribute name="name"><text/></attribute>
<optional>
<attribute name="value"><text/></attribute>
</optional>
</group>
</choice>
</element>
</zeroOrMore>
<optional>
<externalRef href="score.rng"/>
</optional>
</interleave>
</group>
</choice>
</define>

</grammar>
8 changes: 4 additions & 4 deletions xml/resources-1.3.rng
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
<ref name="element-operations"/>
<zeroOrMore>
<element name="utilization">
<externalRef href="nvset.rng"/>
<externalRef href="nvset-1.3.rng"/>
</element>
</zeroOrMore>
</interleave>
Expand Down Expand Up @@ -86,7 +86,7 @@
<ref name="element-operations"/>
<zeroOrMore>
<element name="utilization">
<externalRef href="nvset.rng"/>
<externalRef href="nvset-1.3.rng"/>
</element>
</zeroOrMore>
</interleave>
Expand Down Expand Up @@ -144,10 +144,10 @@
<zeroOrMore>
<choice>
<element name="meta_attributes">
<externalRef href="nvset.rng"/>
<externalRef href="nvset-1.3.rng"/>
</element>
<element name="instance_attributes">
<externalRef href="nvset.rng"/>
<externalRef href="nvset-1.3.rng"/>
</element>
</choice>
</zeroOrMore>
Expand Down

0 comments on commit 3912538

Please sign in to comment.