2010/3/23 Chris Lalancette <clalance@xxxxxxxxxx>: > Hello, > As some of you know, I've been working on a new snapshot API. > This API is heavily based on DanB's earlier API proposed here: > > https://www.redhat.com/archives/libvir-list/2010-January/msg00626.html > > I've made some modifications to make it more libvirt-ish, and to add a > couple of features I think it lacked. The full documentation is below. > Any comments are appreciated. > > /* NOTE: struct _virDomainSnapshot is a private structure, ala > * struct _virDomain. > */ > typedef struct _virDomainSnapshot virDomainSnapshot; > > /* Take a snapshot of the current VM state */ > 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); Shouldn't this be called virDomainNumOfSnapshots to be consistent with the naming or other num-of functions? > > /* 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); > > /* Set this snapshot as the current one for a domain, to be > * used next time domain is started */ > int virDomainSnapshotActivate(virDomainSnapshotPtr snapshot, > unsigned int flags); This delayed semantic cannot be implemented for ESX. ESX can revert to a snapshot immediately only. I think the same holds true for VirtualBox. Maybe I misunterstand this. What should happen if you call activate on a running domain? > /* 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 base image. With a DISCARD flag, it deletes the snapshot. MERGE > * and DISCARD 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_DISCARD, > } virDomainSnapshotDeactivate; > int virDomainSnapshotDeactivate(virDomainSnapshotPtr snapshot, > unsigned int flags); I'm not sure if virDomainSnapshotDeactivate is a good name. Why would I deactivate a snapshot, but not merge/discard it? What's the use case for this? > 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 empty. If you do want to specify some fields during > virDomainSnapshotCreateXML(), note that the only ones that are settable are > <name>, <description>, <compression>, and <parent>; the rest are ignored, How can <parent> be settable? If I have snapshots A and B A -> B -> current state and I create a new snapshot C, then B will be the parent of C. A -> B -> C -> current state If I create another snapshot D now and specify A to be its parent, what's supposed to happen then? Matthias -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list