Based on discussion, I've modified the snapshot API to the below. I've incorporated most of the semantic changes we talked about; the renaming of various API calls I've left for later, since it is a minor point. More comments welcome! /* NOTE: struct _virDomainSnapshot is a private structure, ala * struct _virDomain. */ typedef struct _virDomainSnapshot virDomainSnapshot; /* Take a snapshot of the current VM state. Throws an error if * the VM is not currently running */ virDomainSnapshotPtr virDomainSnapshotCreateXML(virDomainPtr domain, const char *xmlDesc, unsigned int flags); /* Dump the XML of a snapshot */ /* NOTE: see below for proposed XML */ char *virDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, unsigned int flags); /* Return the number of snapshots for this domain */ int virDomainSnapshotNum(virDomainPtr domain, unsigned int flags); /* Get the names of all snapshots for this domain */ int virDomainListSnapshotNames(virDomainPtr domain, char **names, int nameslen, unsigned int flags); /* Get a handle to a named snapshot */ virDomainSnapshotPtr virDomainSnapshotLookupByName(virDomainPtr domain, const char *name, unsigned int flags); /* Start the guest "domain" from the snapshot "snapshot" */ int virDomainCreateWithSnapshot(virDomainPtr domain, virDomainSnapshotPtr snapshot, unsigned int flags); /* Deactivate a snapshot - with no flags, the snapshot is not used anymore, * but also not removed. With a MERGE flag, it merges the snapshot into * the parent snapshot (or the base image, if there is no parent snapshot). * Note that if other snapshots would be discarded because of this * MERGE action, this operation will fail. If that is really what is intended, * use MERGE_FORCE. * * With a DISCARD flag, it deletes the snapshot. Note that if other snapshots * would be discarded because of this delete action, this operation will * fail. If this is really what is intended, use DISCARD_FORCE. * * MERGE, MERGE_FORCE, DISCARD, and DISCARD_FORCE are mutually-exclusive. * * Note that this operation can generally only happen when the domain is shut * down, though this is hypervisor-specific */ typedef enum { VIR_DOMAIN_SNAPSHOT_DEACTIVATE_MERGE, VIR_DOMAIN_SNAPSHOT_DEACTIVATE_MERGE_FORCE, VIR_DOMAIN_SNAPSHOT_DEACTIVATE_DISCARD, VIR_DOMAIN_SNAPSHOT_DEACTIVATE_DISCARD_FORCE, } virDomainSnapshotDeactivate; int virDomainSnapshotDeactivate(virDomainSnapshotPtr snapshot, unsigned int flags); int virDomainSnapshotFree(virDomainSnapshotPtr snapshot); NOTE: During snapshot creation, *none* of the fields are required. That is, you can call virDomainSnapshotCreateXML() with an XML of "<domainsnapshot/>". In this case, the individual driver will make up a <name> for you, the <creationdate> will be set to the current time+date, <description> will be empty, <state> will be "off", <compression> will be empty, and <parent> will be set to the current snapshot (if any). If you do want to specify some fields during virDomainSnapshotCreateXML(), note that the only ones that are settable are <name>, <description>, and <compression>; the rest are ignored, and filled in by the driver when the snapshot is actually created. NOTE: <compression> is used to compress snapshots, and may or may not be supported by individual hypervisor implementations. If <compression> is specified and the underlying hypervisor does not support it, an error will be thrown. <domainsnapshot> <name>XYZ</name> <creationdate>...</creationdate> <description>...</description> <state>RUNNING</state> <domain> <uuid>XXXXX-XXXX-XXXX-XXXX-XXXXXXXXX</uuid> </domain> <compression>gzip</compression> <parent> <name>ABC</name> </parent> </domainsnapshot> The virsh commands will be: virsh snapshot-create [--compress] <dom> <xmlfile> virsh snapshot-list <dom> virsh snapshot-dumpxml <dom> <name> virsh create-with-snapshot <dom> <snapshotname> virsh snapshot-deactivate <dom> <snapshotname> [--merge|--delete|--mergeforce|--mergedelete] -- Chris Lalancette -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list