[libvirt] [PATCH v3 7/8] test: snapshot: Add REDEFINE support
Cole Robinson
crobinso at redhat.com
Thu Oct 3 21:35:22 UTC 2013
On 09/27/2013 02:13 AM, Michal Privoznik wrote:
> On 25.09.2013 21:15, Cole Robinson wrote:
>> ---
>> src/test/test_driver.c | 67 ++++++++++++++++++++++++++++++++------------------
>> 1 file changed, 43 insertions(+), 24 deletions(-)
>>
>> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
>> index 1b79b70..8a690fd 100644
>> --- a/src/test/test_driver.c
>> +++ b/src/test/test_driver.c
>> @@ -6537,26 +6537,35 @@ testDomainSnapshotCreateXML(virDomainPtr domain,
>> virDomainSnapshotPtr snapshot = NULL;
>> virDomainEventPtr event = NULL;
>> char *xml = NULL;
>> + bool update_current = true;
>> + bool redefine = flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE;
>
> Oh, so you'd done what I suggested in 5/8. Nice.
>
>> unsigned int parse_flags = VIR_DOMAIN_SNAPSHOT_PARSE_DISKS;
>>
>> /*
>> - * REDEFINE + CURRENT: Not implemented yet
>> * DISK_ONLY: Not implemented yet
>> * REUSE_EXT: Not implemented yet
>> *
>> * NO_METADATA: Explicitly not implemented
>> *
>> + * REDEFINE + CURRENT: Implemented
>> * HALT: Implemented
>> * QUIESCE: Nothing to do
>> * ATOMIC: Nothing to do
>> * LIVE: Nothing to do
>> */
>> virCheckFlags(
>> + VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
>> + VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
>> VIR_DOMAIN_SNAPSHOT_CREATE_HALT |
>> VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE |
>> VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC |
>> VIR_DOMAIN_SNAPSHOT_CREATE_LIVE, NULL);
>>
>> + if ((redefine && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT)))
>> + update_current = false;
>> + if (redefine)
>> + parse_flags |= VIR_DOMAIN_SNAPSHOT_PARSE_REDEFINE;
>> +
>> if (!(vm = testDomObjFromDomain(domain)))
>> goto cleanup;
>>
>> @@ -6575,34 +6584,43 @@ testDomainSnapshotCreateXML(virDomainPtr domain,
>> parse_flags)))
>> goto cleanup;
>>
>> - if (!(xml = virDomainDefFormat(vm->def, VIR_DOMAIN_XML_INACTIVE)) ||
>> - !(def->dom = virDomainDefParseString(xml,
>> - privconn->caps,
>> - privconn->xmlopt,
>> - 1 << VIR_DOMAIN_VIRT_TEST,
>> - VIR_DOMAIN_XML_INACTIVE)))
>> - goto cleanup;
>> -
>> - if (testDomainSnapshotAlignDisks(vm, def, flags) < 0)
>> - goto cleanup;
>> -
>> - if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, def)))
>> - goto cleanup;
>> - def = NULL;
>> + if (redefine) {
>> + if (!virDomainSnapshotRedefinePrep(domain, vm, &def, &snap,
>> + &update_current, flags) < 0)
>> + goto cleanup;
>> + } else {
>> + if (!(xml = virDomainDefFormat(vm->def, VIR_DOMAIN_XML_INACTIVE)) ||
>> + !(def->dom = virDomainDefParseString(xml,
>> + privconn->caps,
>> + privconn->xmlopt,
>> + 1 << VIR_DOMAIN_VIRT_TEST,
>> + VIR_DOMAIN_XML_INACTIVE)))
>> + goto cleanup;
>>
>> - if (vm->current_snapshot) {
>> - if (!(flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE) &&
>> - VIR_STRDUP(snap->def->parent, vm->current_snapshot->def->name) < 0)
>> + if (testDomainSnapshotAlignDisks(vm, def, flags) < 0)
>> goto cleanup;
>> }
>>
>> - if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) &&
>> - virDomainObjIsActive(vm)) {
>> - testDomainShutdownState(domain, vm, VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT);
>> - event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
>> - VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT);
>> + if (!snap) {
>> + if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, def)))
>> + goto cleanup;
>> + def = NULL;
>> }
>
> This fixes the bug I'm mentioning in 4/8.
>
>>
>> + if (!redefine) {
>> + if (vm->current_snapshot &&
>> + (VIR_STRDUP(snap->def->parent,
>> + vm->current_snapshot->def->name) < 0))
>> + goto cleanup;
>> +
>> + if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) &&
>> + virDomainObjIsActive(vm)) {
>> + testDomainShutdownState(domain, vm,
>> + VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT);
>> + event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
>> + VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT);
>> + }
>> + }
>>
>> snapshot = virGetDomainSnapshot(domain, snap->def->name);
>> cleanup:
>> @@ -6610,7 +6628,8 @@ cleanup:
>> if (vm) {
>> if (snapshot) {
>> virDomainSnapshotObjPtr other;
>> - vm->current_snapshot = snap;
>> + if (update_current)
>> + vm->current_snapshot = snap;
>> other = virDomainSnapshotFindByName(vm->snapshots,
>> snap->def->parent);
>> snap->parent = other;
>>
>
> ACK
>
Thanks, pushed now.
- Cole
More information about the libvir-list
mailing list