On Wed, Apr 11, 2018 at 10:10 PM +0200, John Ferlan <jferlan@xxxxxxxxxx> 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. > > For the ABI checks add avoidance for the genid comparison if the > appropriate flag is set. > > Since adding support for a generated GUID (or UUID like) value to > be displayed only for an active guest, modifying the xml2xml test > to include virrandommock.so is necessary since it will generate a > "known" UUID value that can be compared against for the active test. > > Signed-off-by: John Ferlan <jferlan@xxxxxxxxxx> > --- > docs/formatdomain.html.in | 29 ++++++++++++ > docs/schemas/domaincommon.rng | 8 ++++ > src/conf/domain_conf.c | 59 ++++++++++++++++++++++++ > src/conf/domain_conf.h | 3 ++ > 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, 295 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 5e99884dc5..fe9c3b19f0 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,34 @@ > 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.3.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 executed > + with a different configuration, such as: > + > + <ul> > + <li>snapshot execution</li> > + <li>backup recovery</li> > + <li>failover in a disaster recovery environment</li> > + <li>creation from template (import, copy, clone)</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> > + When a GUID value is not provided, e.g. using the XML syntax > + <genid/>, then libvirt will automatically generate a GUID. > + This is the recommended configuration since the hypervisor then > + can handle changing the GUID value for specific state transitions. > + Using a static GUID value may result in failures for starting from > + snapshot, restoring from backup, starting a cloned domain, etc.</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 4cab55f05d..1892a7c63c 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 385ba4ce8c..0fa9386270 100644 > --- a/src/conf/domain_conf.c > +++ b/src/conf/domain_conf.c > @@ -18791,6 +18791,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")); > + goto error; > + } > + def->genidRequested = true; > + if (!(tmp = virXPathString("string(./genid[1])", ctxt))) { > + 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) { You haven’t added these struct members to _virDomainDef (genid and genidRequested) anywhere. > + virReportError(VIR_ERR_INTERNAL_ERROR, > + "%s", _("malformed genid element")); > + goto error; > + } > + } > + } […snip] -- Beste Grüße / Kind regards Marc Hartmayer IBM Deutschland Research & Development GmbH Vorsitzende des Aufsichtsrats: Martina Koederitz Geschäftsführung: Dirk Wittkopp Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list