[libvirt] [REPOSTv2 PATCH v3 1/6] conf: Add VM Generation ID parse/format support

John Ferlan jferlan at redhat.com
Fri May 25 10:52:13 UTC 2018



On 05/25/2018 04:24 AM, Michal Privoznik wrote:
> On 05/17/2018 02:42 PM, John Ferlan wrote:
>> The VM Generation ID is a mechanism to provide a unique 128-bit,
>> cryptographically random, and integer value identifier known as
>> the GUID (Globally Unique Identifier) to the guest OS. The value
>> is used to help notify the guest operating system when the virtual
>> machine is executed with a different configuration.
>>
>> This patch adds support for a new "genid" XML element similar to
>> the "uuid" element. The "genid" element can have two forms "<genid/>"
>> or "<genid>$GUID</genid>". If the $GUID is not provided, libvirt
>> will generate one and save it in the XML.
>>
>> Since adding support for a generated GUID (or UUID like) value to
>> be displayed modifying the xml2xml test to include virrandommock.so
>> is necessary since it will generate a "known" value.
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>  docs/formatdomain.html.in                        | 27 ++++++++++++
>>  docs/schemas/domaincommon.rng                    |  8 ++++
>>  src/conf/domain_conf.c                           | 54 ++++++++++++++++++++++++
>>  src/conf/domain_conf.h                           |  5 +++
>>  tests/qemuxml2argvdata/genid-auto.xml            | 32 ++++++++++++++
>>  tests/qemuxml2argvdata/genid.xml                 | 32 ++++++++++++++
>>  tests/qemuxml2xmloutdata/genid-active.xml        | 32 ++++++++++++++
>>  tests/qemuxml2xmloutdata/genid-auto-active.xml   | 32 ++++++++++++++
>>  tests/qemuxml2xmloutdata/genid-auto-inactive.xml | 32 ++++++++++++++
>>  tests/qemuxml2xmloutdata/genid-inactive.xml      | 32 ++++++++++++++
>>  tests/qemuxml2xmltest.c                          |  5 ++-
>>  11 files changed, 290 insertions(+), 1 deletion(-)
>>  create mode 100644 tests/qemuxml2argvdata/genid-auto.xml
>>  create mode 100644 tests/qemuxml2argvdata/genid.xml
>>  create mode 100644 tests/qemuxml2xmloutdata/genid-active.xml
>>  create mode 100644 tests/qemuxml2xmloutdata/genid-auto-active.xml
>>  create mode 100644 tests/qemuxml2xmloutdata/genid-auto-inactive.xml
>>  create mode 100644 tests/qemuxml2xmloutdata/genid-inactive.xml
>>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index 0d0fd3b9f3..72a55ff075 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -34,6 +34,7 @@
>>  <domain type='kvm' id='1'>
>>    <name>MyGuest</name>
>>    <uuid>4dea22b3-1d52-d8f3-2516-782e98ab3fa0</uuid>
>> +  <genid>43dc0cf8-809b-4adb-9bea-a9abb5f3d90e</genid>
>>    <title>A short description - title - of the domain</title>
>>    <description>Some human readable description</description>
>>    <metadata>
>> @@ -61,6 +62,32 @@
>>          specification. <span class="since">Since 0.0.1, sysinfo
>>          since 0.8.7</span></dd>
>>  
>> +      <dt><code>genid</code></dt>
>> +      <dd><span class="since">Since 4.4.0</span>, the <code>genid</code>
>> +        element can be used to add a Virtual Machine Generation ID which
>> +        exposes a 128-bit, cryptographically random, integer value identifier,
>> +        referred to as a Globally Unique Identifier (GUID) using the same
>> +        format as the <code>uuid</code>. The value is used to help notify
>> +        the guest operating system when the virtual machine is re-executing
>> +        something that has already executed before, such as:
>> +
>> +        <ul>
>> +          <li>VM starts executing a snapshot</li>
>> +          <li>VM is recovered from backup</li>
>> +          <li>VM is failover in a disaster recovery environment</li>
>> +          <li>VM is imported, copied, or cloned</li>
>> +        </ul>
>> +
>> +        The guest operating system notices the change and is then able to
>> +        react as appropriate by marking its copies of distributed databases
>> +        as dirty, re-initializing its random number generator, etc.
>> +
>> +        <p>
>> +        The libvirt XML parser will accept both a provided GUID value
>> +        or just <genid/> in which case a GUID will be generated
>> +        and saved in the XML. For the transitions such as above, libvirt
>> +        will change the GUID before re-executing.</p></dd>
>> +
>>        <dt><code>title</code></dt>
>>        <dd>The optional element <code>title</code> provides space for a
>>          short description of the domain. The title should not contain
>> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
>> index 71ac3d079c..1fba108927 100644
>> --- a/docs/schemas/domaincommon.rng
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -502,6 +502,14 @@
>>            <ref name="UUID"/>
>>          </element>
>>        </optional>
>> +      <optional>
>> +        <element name="genid">
>> +          <choice>
>> +            <ref name="UUID"/>
>> +            <empty/>
>> +          </choice>
>> +        </element>
>> +      </optional>
>>      </interleave>
>>    </define>
>>    <define name="idmap">
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 3689ac0a82..4d5f3c6740 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -18919,6 +18919,34 @@ virDomainDefParseXML(xmlDocPtr xml,
>>          VIR_FREE(tmp);
>>      }
>>  
>> +    /* Extract domain genid - a genid can either be provided or generated */
>> +    if ((n = virXPathNodeSet("./genid", ctxt, &nodes)) < 0)
>> +        goto error;
>> +
>> +    if (n > 0) {
>> +        if (n != 1) {
>> +            virReportError(VIR_ERR_XML_ERROR, "%s",
>> +                          _("element 'genid' can only appear once"));
> 
> This _() seems misaligned.
> 

Right - good eyes. Fixed.

>> +            goto error;
>> +        }
>> +        def->genidRequested = true;
>> +        if (!(tmp = virXPathString("string(./genid[1])", ctxt))) {
> 
> Since you check that there's only onde <genid/> above, this [1] seems
> redundant.
> 

As with many other XML parses, the code is essentially copied from
elsewhere. Where exactly, I don't recall - I've removed the [1] though.

John

>> +            if (virUUIDGenerate(def->genid) < 0) {
>> +                virReportError(VIR_ERR_INTERNAL_ERROR,
>> +                               "%s", _("Failed to generate genid"));
>> +                goto error;
>> +            }
>> +            def->genidGenerated = true;
>> +        } else {
>> +            if (virUUIDParse(tmp, def->genid) < 0) {
>> +                virReportError(VIR_ERR_INTERNAL_ERROR,
>> +                               "%s", _("malformed genid element"));
>> +                goto error;
>> +            }
>> +        }
>> +    }
>> +    VIR_FREE(nodes);
>> +
> 
> Michal
> 




More information about the libvir-list mailing list