test: snapshot: Add REDEFINE support
This commit is contained in:
parent
670e86bfd7
commit
68cc45b6f9
@ -6633,26 +6633,35 @@ testDomainSnapshotCreateXML(virDomainPtr domain,
|
|||||||
virDomainSnapshotPtr snapshot = NULL;
|
virDomainSnapshotPtr snapshot = NULL;
|
||||||
virDomainEventPtr event = NULL;
|
virDomainEventPtr event = NULL;
|
||||||
char *xml = NULL;
|
char *xml = NULL;
|
||||||
|
bool update_current = true;
|
||||||
|
bool redefine = flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE;
|
||||||
unsigned int parse_flags = VIR_DOMAIN_SNAPSHOT_PARSE_DISKS;
|
unsigned int parse_flags = VIR_DOMAIN_SNAPSHOT_PARSE_DISKS;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* REDEFINE + CURRENT: Not implemented yet
|
|
||||||
* DISK_ONLY: Not implemented yet
|
* DISK_ONLY: Not implemented yet
|
||||||
* REUSE_EXT: Not implemented yet
|
* REUSE_EXT: Not implemented yet
|
||||||
*
|
*
|
||||||
* NO_METADATA: Explicitly not implemented
|
* NO_METADATA: Explicitly not implemented
|
||||||
*
|
*
|
||||||
|
* REDEFINE + CURRENT: Implemented
|
||||||
* HALT: Implemented
|
* HALT: Implemented
|
||||||
* QUIESCE: Nothing to do
|
* QUIESCE: Nothing to do
|
||||||
* ATOMIC: Nothing to do
|
* ATOMIC: Nothing to do
|
||||||
* LIVE: Nothing to do
|
* LIVE: Nothing to do
|
||||||
*/
|
*/
|
||||||
virCheckFlags(
|
virCheckFlags(
|
||||||
|
VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
|
||||||
|
VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
|
||||||
VIR_DOMAIN_SNAPSHOT_CREATE_HALT |
|
VIR_DOMAIN_SNAPSHOT_CREATE_HALT |
|
||||||
VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE |
|
VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE |
|
||||||
VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC |
|
VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC |
|
||||||
VIR_DOMAIN_SNAPSHOT_CREATE_LIVE, NULL);
|
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)))
|
if (!(vm = testDomObjFromDomain(domain)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -6669,32 +6678,41 @@ testDomainSnapshotCreateXML(virDomainPtr domain,
|
|||||||
parse_flags)))
|
parse_flags)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (!(def->dom = virDomainDefCopy(vm->def,
|
if (redefine) {
|
||||||
privconn->caps,
|
if (!virDomainSnapshotRedefinePrep(domain, vm, &def, &snap,
|
||||||
privconn->xmlopt,
|
&update_current, flags) < 0)
|
||||||
true)))
|
goto cleanup;
|
||||||
goto cleanup;
|
} else {
|
||||||
|
if (!(def->dom = virDomainDefCopy(vm->def,
|
||||||
|
privconn->caps,
|
||||||
|
privconn->xmlopt,
|
||||||
|
true)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if (testDomainSnapshotAlignDisks(vm, def, flags) < 0)
|
if (testDomainSnapshotAlignDisks(vm, def, flags) < 0)
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, def)))
|
|
||||||
goto cleanup;
|
|
||||||
def = NULL;
|
|
||||||
|
|
||||||
if (vm->current_snapshot) {
|
|
||||||
if (!(flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE) &&
|
|
||||||
VIR_STRDUP(snap->def->parent, vm->current_snapshot->def->name) < 0)
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) &&
|
if (!snap) {
|
||||||
virDomainObjIsActive(vm)) {
|
if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, def)))
|
||||||
testDomainShutdownState(domain, vm, VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT);
|
goto cleanup;
|
||||||
event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
|
def = NULL;
|
||||||
VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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);
|
snapshot = virGetDomainSnapshot(domain, snap->def->name);
|
||||||
cleanup:
|
cleanup:
|
||||||
@ -6702,7 +6720,8 @@ cleanup:
|
|||||||
if (vm) {
|
if (vm) {
|
||||||
if (snapshot) {
|
if (snapshot) {
|
||||||
virDomainSnapshotObjPtr other;
|
virDomainSnapshotObjPtr other;
|
||||||
vm->current_snapshot = snap;
|
if (update_current)
|
||||||
|
vm->current_snapshot = snap;
|
||||||
other = virDomainSnapshotFindByName(vm->snapshots,
|
other = virDomainSnapshotFindByName(vm->snapshots,
|
||||||
snap->def->parent);
|
snap->def->parent);
|
||||||
snap->parent = other;
|
snap->parent = other;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user