On 04/25/2018 04:32 AM, Peter Krempa wrote:
On Tue, Apr 24, 2018 at 15:38:40 -0400, John Ferlan wrote:
>
>
> On 04/24/2018 03:21 AM, Peter Krempa wrote:
>> On Mon, Apr 23, 2018 at 20:00:00 -0400, 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.
>>>
>>> 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(a)redhat.com>
>>> ---
>>> 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 ada0df227f..6a140f3e40 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>
>>
>> Since we encourage to use the variant with this being empty I'd show
>> that here.
>>
>
> I'd agree except for the fact this is a "live" XML example since
> "id='1'", so it should stay as is unless of course it's desired
to never
> show the GUID for the running VM.
Hmm, right. It feels slightly wrong though that we are describing
configuration on the example of a live XML.
I can remove the id='1' and then use <genid/>... It's not that
important to print the GUID to me...
>
>>> <title>A short description - title - of the
domain</title>
>>> <description>Some human readable
description</description>
>>> <metadata>
[...]
>>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>>> index 6d4db50998..8c30adf850 100644
>>> --- a/src/conf/domain_conf.c
>>> +++ b/src/conf/domain_conf.c
>>> @@ -18793,6 +18793,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"));
>>
>> Generating this here is pointless, the code using it throws this away
>> and generates a new one. While we don't show this value to the user and
>> thus don't create any false impressions I think that the logic should be
>> shuffled around so that it's generated only when it's required.
>>
>>
>
> How so? Not generating one here would cause active xml-2-xml to fail (as
Basically because a GUID for an inactive definition is nonsense. It will
necessarily change upon startup, so having it generated in the parser is
pointless.
As noted in the other part of this reply thread - it changes for
specific transactions. It's not clear "how" it's initially generated -
whether user specified or self generated - only that for certain
transitions, it must change and doing so is done by generating a new one.
The parser only needs to restore a user-provided GUID or the one
which
is store
> I expect) because the GUID would be 00000-0000-0000-0000-000000000000.
> At the end of the series the usage of virUUIDGenerate for ->genid is
> done for:
>
> 1. This code, virDomainDefParseXML
> 2. virDomainDefCopy when genidRequested and flags &
> VIR_DOMAIN_DEF_COPY_NEWGENID which is currently only used by the
> snapshot code, but could be used elsewhere - something I may have been
> thinking about at least w/r/t one of the qemu_driver paths.
> 3. qemuProcessGenID *when* flags & VIR_QEMU_PROCESS_START_GEN_VMID
>
> If anything, perhaps what you may be referring to is qemuProcessGenID
> processing using the VIR_QEMU_PROCESS_START_GEN_VMID flag when called
> from qemuDomainRevertToSnapshot. The transitions there caused me to be
> "super cautious", but the Copy, then Start I think upon reflection does
> overwrite. The same flag is used in qemuDomainSaveImageStartVM, which
> yes does overwrite, but that's by rule/design.
>
> Perhaps it'll help to summarize the transitions...
>
> Change is not required for the following transitions:
>
> -> Pause/Resume
> -> VM Reboot
Both above are the same emulator instance.
> -> Host reboot
This is wrong. Host reboot causes the VM to be killed. So when booting
the GUID will change since we start a new process. While it should not
result in any problems if the ID would not change (since the guest OS
rebooted anyways) we should treat this as start of the VM.
Well you may call it wrong, but that's what is in the spec.
> -> Live migrate
This is technically the same emulator instance. No rollback of execution
was possible.
> -> Failover in a clustered environment
Thankfully it does not apply at this point since we don't support any of
this implicitly. It also probably depends on the way the failover
scenario is executed. In the qemu world I read only about coarse-grained
lockstepping as a case of failover and that has situations where some
rollback could happen, so in that case the VM id should probably change.
But as said, thankfully we don't have to deal with it currenly and also
it would not be possible since qemu can't change the id during runtime.
> Change is required for the following transitions:
>
> -> Application of offline/online snapshot
> -> Restoring from backup
This is too vague. If you mean a disk backup, the VM will boot, thus the
ID should change (unless the user specified an explicit one).
Hopefully covered in the other half of this thread.
> -> Failover to replication target
See above.
> -> Importing a VM (or copy or clone)
>
> Change is "Unspecified" when a VM's configuration changes.
So in our case it will change.
It can change based on transitions that require it or it can be used as
found in the config file. This is the real bugger in the description.
>
> So the 'design decisions' were:
>
> - For snapshot, the choice was use the virDomainDefCopy and ABI flags.
Actually, the GUID when creating the snapshot is irrelevant. When
reverting a snapshot the ID should always change thus it will always
require an emulator restart.
Wouldn't the GUID for the creation of the snapshot be whatever was set?
The whole snapshot config and domain config saved within is not
something I depend on others to understand in greater detail than I do.
Still, my choice was alter the GUID when starting and causing an error
for the transition to use qemuMonitorLoadSnapshot since we cannot modify
the genid. Again, another area that I hoped review would provide details
if this was the "wrong choice".
> - For the restore from backup, the choice was regenerate and
store in
> the config during startup processing. The docs indicate "The restore
> sequence will be modified to post process the restore target and apply
> new generation identifiers to the restored configuration files." - so
> where it was done would
As pointed out above, this is vague. If it's a restore of the disk state
only, the guid will necessarily change in our design when we start the
new qemu process.
Cannot disagree - the choice was to change only when/if we restart the
VM since that's really the only time it matters.
> - It's not 100% clear if we need something special for
failover from
> replication target. Seems like Snapshot or Save/Restore is in the same
> category, but perhaps there's some hypervisor specific transition.
What is a failover here? You mean if a management starts a new VM after
a different host with VM has failed? In such case it's a new start of VM
for us and thus will get a new GUID.
It was me commenting and trying not to read too much into things.
Perhaps the shorter version of your failover comments from above.
> - For import and copy, changing the genid of the copy
"seems right".
> The tricky part is the clone code which would require a separate change
> to virt-clone since it uses parses and formats XML in separate passes.
That depends on the implementation. Currently yes.
> So given all that - are you still of the opinion that the design needs
> to change even more? If so, then please also characterize your view of
> how this should work.
Well, that depends. I did not read the docs for this thoroughly enough.
If it is okay for us to generate a new GUID upon every boot of a VM then
this will be for a rather simple implementation, since we have a very
limited set of situations when we are starting a new qemu process which
should NOT change the GUID and we will change it in all other scenarios.
It's not really clear that a new GUID for every new boot is "required".
If the documentation does not allow for the above it will be more
complex and we'll need to discuss that further.
We shouldn't over complicate things either.
John
[the rest is covered in the other thread - this is the hazards of
cutting threads up like this]
A second consideration then is whether to allow user-specified GUID at
all, but I guess mgmt applications may have a different idea when it's
necessary to change and thus it makes sense to allow that. For that
situation the provided GUID should be always honoured.
This means that we'll probably need a new attribute which will specify
that the GUID is custom (or the opposite, that it was generated). If
that property is in the default state the startup procedure should
generate a new GUID exept for the migration case.
We also might want to consider the managed-save case to bear the same
GUID after startup, since we know that we start the new qemu process
from the same state as we've saved it.