mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
snapshot: make cloning of domain definition easier
Upcoming patches for revert-and-clone branching of snapshots need to be able to copy a domain definition; make this step reusable. * src/conf/domain_conf.h (virDomainDefCopy): New prototype. * src/conf/domain_conf.c (virDomainObjCopyPersistentDef): Split... (virDomainDefCopy): ...into new function. (virDomainObjSetDefTransient): Use it. * src/libvirt_private.syms (domain_conf.h): Export it. * src/qemu/qemu_driver.c (qemuDomainRevertToSnapshot): Use it.
This commit is contained in:
parent
0f9b6ee42d
commit
0b5617a607
@ -1861,8 +1861,6 @@ virDomainObjSetDefTransient(virCapsPtr caps,
|
|||||||
bool live)
|
bool live)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
char *xml = NULL;
|
|
||||||
virDomainDefPtr newDef = NULL;
|
|
||||||
|
|
||||||
if (!virDomainObjIsActive(domain) && !live)
|
if (!virDomainObjIsActive(domain) && !live)
|
||||||
return 0;
|
return 0;
|
||||||
@ -1873,17 +1871,11 @@ virDomainObjSetDefTransient(virCapsPtr caps,
|
|||||||
if (domain->newDef)
|
if (domain->newDef)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!(xml = virDomainDefFormat(domain->def, VIR_DOMAIN_XML_WRITE_FLAGS)))
|
if (!(domain->newDef = virDomainDefCopy(caps, domain->def, false)))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (!(newDef = virDomainDefParseString(caps, xml, -1,
|
|
||||||
VIR_DOMAIN_XML_READ_FLAGS)))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
domain->newDef = newDef;
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
out:
|
out:
|
||||||
VIR_FREE(xml);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -14917,24 +14909,41 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Copy src into a new definition; with the quality of the copy
|
||||||
|
* depending on the migratable flag (false for transitions between
|
||||||
|
* persistent and active, true for transitions across save files or
|
||||||
|
* snapshots). */
|
||||||
virDomainDefPtr
|
virDomainDefPtr
|
||||||
virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom)
|
virDomainDefCopy(virCapsPtr caps, virDomainDefPtr src, bool migratable)
|
||||||
{
|
{
|
||||||
char *xml;
|
char *xml;
|
||||||
virDomainDefPtr cur, ret;
|
virDomainDefPtr ret;
|
||||||
|
unsigned int write_flags = VIR_DOMAIN_XML_WRITE_FLAGS;
|
||||||
|
unsigned int read_flags = VIR_DOMAIN_XML_READ_FLAGS;
|
||||||
|
|
||||||
cur = virDomainObjGetPersistentDef(caps, dom);
|
if (migratable)
|
||||||
|
write_flags |= VIR_DOMAIN_XML_INACTIVE | VIR_DOMAIN_XML_MIGRATABLE;
|
||||||
|
|
||||||
xml = virDomainDefFormat(cur, VIR_DOMAIN_XML_WRITE_FLAGS);
|
/* Easiest to clone via a round-trip through XML. */
|
||||||
|
xml = virDomainDefFormat(src, write_flags);
|
||||||
if (!xml)
|
if (!xml)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ret = virDomainDefParseString(caps, xml, -1, VIR_DOMAIN_XML_READ_FLAGS);
|
ret = virDomainDefParseString(caps, xml, -1, read_flags);
|
||||||
|
|
||||||
VIR_FREE(xml);
|
VIR_FREE(xml);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virDomainDefPtr
|
||||||
|
virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom)
|
||||||
|
{
|
||||||
|
virDomainDefPtr cur;
|
||||||
|
|
||||||
|
cur = virDomainObjGetPersistentDef(caps, dom);
|
||||||
|
return virDomainDefCopy(caps, cur, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
virDomainState
|
virDomainState
|
||||||
virDomainObjGetState(virDomainObjPtr dom, int *reason)
|
virDomainObjGetState(virDomainObjPtr dom, int *reason)
|
||||||
|
@ -1943,6 +1943,8 @@ virDomainLiveConfigHelperMethod(virCapsPtr caps,
|
|||||||
unsigned int *flags,
|
unsigned int *flags,
|
||||||
virDomainDefPtr *persistentDef);
|
virDomainDefPtr *persistentDef);
|
||||||
|
|
||||||
|
virDomainDefPtr virDomainDefCopy(virCapsPtr caps, virDomainDefPtr src,
|
||||||
|
bool migratable);
|
||||||
virDomainDefPtr
|
virDomainDefPtr
|
||||||
virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom);
|
virDomainObjCopyPersistentDef(virCapsPtr caps, virDomainObjPtr dom);
|
||||||
|
|
||||||
|
@ -312,6 +312,7 @@ virDomainDefCheckABIStability;
|
|||||||
virDomainDefClearDeviceAliases;
|
virDomainDefClearDeviceAliases;
|
||||||
virDomainDefClearPCIAddresses;
|
virDomainDefClearPCIAddresses;
|
||||||
virDomainDefCompatibleDevice;
|
virDomainDefCompatibleDevice;
|
||||||
|
virDomainDefCopy;
|
||||||
virDomainDefFormat;
|
virDomainDefFormat;
|
||||||
virDomainDefFormatInternal;
|
virDomainDefFormatInternal;
|
||||||
virDomainDefFree;
|
virDomainDefFree;
|
||||||
|
@ -12189,23 +12189,13 @@ static int qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Prepare to copy the snapshot inactive xml as the config of this
|
/* Prepare to copy the snapshot inactive xml as the config of this
|
||||||
* domain. Easiest way is by a round trip through xml.
|
* domain.
|
||||||
*
|
*
|
||||||
* XXX Should domain snapshots track live xml rather
|
* XXX Should domain snapshots track live xml rather
|
||||||
* than inactive xml? */
|
* than inactive xml? */
|
||||||
snap->def->current = true;
|
snap->def->current = true;
|
||||||
if (snap->def->dom) {
|
if (snap->def->dom) {
|
||||||
char *xml;
|
config = virDomainDefCopy(driver->caps, snap->def->dom, true);
|
||||||
if (!(xml = qemuDomainDefFormatXML(driver,
|
|
||||||
snap->def->dom,
|
|
||||||
VIR_DOMAIN_XML_INACTIVE |
|
|
||||||
VIR_DOMAIN_XML_SECURE |
|
|
||||||
VIR_DOMAIN_XML_MIGRATABLE)))
|
|
||||||
goto cleanup;
|
|
||||||
config = virDomainDefParseString(driver->caps, xml,
|
|
||||||
QEMU_EXPECTED_VIRT_TYPES,
|
|
||||||
VIR_DOMAIN_XML_INACTIVE);
|
|
||||||
VIR_FREE(xml);
|
|
||||||
if (!config)
|
if (!config)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user