[ClusterLabs] Antw: Re: Why is last-lrm-refresh part of the CIB config?

Ulrich Windl Ulrich.Windl at rz.uni-regensburg.de
Thu Sep 12 06:31:43 EDT 2019


>>> Jan Pokorný <jpokorny at redhat.com> schrieb am 12.09.2019 um 11:48 in
Nachricht
<20190912094840.GL29300 at redhat.com>:
> On 12/09/19 09:27 +0200, Ulrich Windl wrote:
>>>>> Jan Pokorný <jpokorny at redhat.com> schrieb am 10.09.2019 um 17:38
>>>>> in Nachricht <20190910153832.GJ29300 at redhat.com>:
>>> 
>>> Just looking at how to provisionally satisfy the needs here, I can
>>> suggest this "one-liner" as a filter to let the to-archive-copies
>>> through (depending on the aposteriori diff):
>>> 
>>>   { xsltproc - <(cibadmin -Q) | cat; } <<EOF
>>>   <xsl:stylesheet version="1.0" 
>>> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>>>     <xsl:template match="@*|node()">
>>>       <xsl:copy>
>>>         <xsl:apply-templates select="@*|node()"/>
>>>       </xsl:copy>
>>>     </xsl:template>
>>>     <xsl:template match="status|nvpair[@name='last-lrm-refresh']
>>>                          |text()[preceding-sibling::*[
>>>                            name() = 'status'
>>>                            or
>>>                            name() = 'nvpair' and @name='last-lrm-refresh'
>>>                          ]]"/>
>>>   </xsl:stylesheet>
>>>   EOF
>>> 
>> 
>> [...]
>>> plain POSIX shell.  The additional complexity stems from the desire
>>> so as not to keep blank lines where anything got filtered out.
>> 
>> Actually it "eats up" the line break and identation before
>> </cluster_property_set> also, like here:
>> 
>>        <nvpair name="stonith-enabled" value="true"
>> id="cib-bootstrap-options-stonith-enabled"/>
>>        <nvpair name="placement-strategy" value="utilization"
>> id="cib-bootstrap-options-placement-strategy"/>
>> -      <nvpair id="cib-bootstrap-options-last-lrm-refresh"
>> name="last-lrm-refresh" value="1567945827"/>
>> -      <nvpair name="maintenance-mode" value="false"
>> id="cib-bootstrap-options-maintenance-mode"/>
>> -    </cluster_property_set>
>> +      <nvpair name="maintenance-mode" value="false"
>> id="cib-bootstrap-options-maintenance-mode"/></cluster_property_set>
>>    </crm_config>
>>    <nodes>
> 
> Good spot :-)
> 
> Untested fix (you'll get the idea, check just the first match element
> on the preceding-sibling axis):

Those, who can, can ;-) (fix confirmed):
--- /tmp/cib2   2019-09-12 09:21:31.427435264 +0200
+++ /tmp/cib1   2019-09-12 12:18:28.115354718 +0200
@@ -1,3 +1,4 @@
+<?xml version="1.0"?>
 <configuration>
   <crm_config>
     <cluster_property_set id="cib-bootstrap-options">
@@ -7,7 +8,6 @@
       <nvpair id="cib-bootstrap-options-cluster-name" name="cluster-name"
value="cluster3"/>
       <nvpair name="stonith-enabled" value="true"
id="cib-bootstrap-options-stonith-enabled"/>
       <nvpair name="placement-strategy" value="utilization"
id="cib-bootstrap-options-placement-strategy"/>
-      <nvpair id="cib-bootstrap-options-last-lrm-refresh"
name="last-lrm-refresh" value="1567945827"/>
       <nvpair name="maintenance-mode" value="false"
id="cib-bootstrap-options-maintenance-mode"/>
     </cluster_property_set>
   </crm_config>

> 
>   { xsltproc - <(cibadmin -Q) | cat; } <<EOF
>   <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
>     <xsl:template match="@*|node()">
>       <xsl:copy>
>         <xsl:apply-templates select="@*|node()"/>
>       </xsl:copy>
>     </xsl:template>
>     <xsl:template match="status|nvpair[@name='last-lrm-refresh']
>                          |text()[preceding-sibling::*[1][
>                            name() = 'status'
>                            or
>                            name() = 'nvpair' and @name='last-lrm-refresh'
>                          ]]"/>
>   </xsl:stylesheet>
>   EOF
> 
> Some wiggling around this idea would certainly lead to desired results.
> OTOH, if you backfeed that output back to crm (to get the reinstating
> sequence), whitespaces are pretty irrelevant, allowing for vast
> simplification.
> 
> And when you are after the actual XML diff, text-based diff is
> a *bad choice* in general anyway.  An identical XML content can be

I agree that there are many ways to represent one XML content. Fortunately
cibadmin does not put everything in one line ;-)

> expressed with a countless number of variations in the serialized
> form (plain text projection), and you are really interested in the
> semantical identity only.  That text-based diff more or less work
> is rather an implementation detail not to be relied upon across
> SW updates, etc. (libxml2-specific environment variables could affect
> the output as well!).  There are multiple "XML diff" tools, perhaps
> even crm_diff would do (but specialities like comments, processing
> instructions etc. may not work well with it, admittedly they probably
> won't be present to begin with).

I'm hoping on the constant (same locale) "same input, same program, same
output" ;-)

> 
> -- 
> Poki





More information about the Users mailing list