On Fri, Apr 08, 2016 at 11:47:29PM +0300, Maxim Nestratov wrote:
Hello all,
Here is the first more detailed view on the list of the backup API functions
that
look reasonable to have. Though they are presented with parameters and short
description all these are the subject to discuss and I kindly ask you to
take a
look and comment. Your ideas and considerations are very welcome.
--------------------------------------------------------------------------------
virBackupPtr virDomainBackupCreateXML(virDomainPtr domain,
const char * xmlDesc,
unsigned int flags)
Nitpick, lets call it virDomainBackupPtr rather than just virBackupPtr.
Likewise use virDomainBackup as name prefix for other data types
and method names
Create a new backup of a domain based on the backup xml contained in
xmlDesc.
- domain: a domain object
- xmlDesc: string containing an XML description of the backup
- flags: bitwise-OR of virBackupCreateFlags
- returns: an opaque virBackupPtr on success or NULL on failure
enum virBackupCreateFlags {
to be defined
}
An example of backup xml:
<domainbackup>
<uuid>54c70d40-26bb-48cd-9639-b3a1e9adf650</uuid>
<description>Any string</description>
<parent>
<uuid>d2ee2566-bef2-408f-ac7a-eb8004186074</uuid>
<parent>
<disks>
<disk name='vda'>
<target>
... volume, file, or any possible target
</target>
</disk>
<disk name='vdb'>
<target>
...
</target>
</disk>
</disks>
</domainbackup>
--------------------------------------------------------------------------------
virBackupPtr virBackupStartUnmanaged(virDomainPtr domain,
const char * xmlDesc,
unsigned int flags)
Start a new unmanaged backup of a domain based on the backup xml contained
in
xmlDesc. This function starts 'blockdev-backup' QMP command to block
devices
exposed as nbd servers by qemu. It is for 3d party managed backups.
- domain: a domain object
- xmlDesc: string containing an XML description of the backup
- flags: bitwise-OR of virBackupCreateFlags
- returns: an opaque virBackupPtr on success or NULL on failure
An example of backup xml:
<domainbackup>
<uuid>54c70d40-26bb-48cd-9639-b3a1e9adf650</uuid>
<description>Any string</description>
<disks>
<disk name='hda'>
<target>
... nbd server parameters for 'nbd-server-start' command
followed by
'blockdev-backup' and 'nbd-server-add' QMP commands
OR some other suitable target
</target>
</disk>
<disk name='hdb'>
<target>
... nbd server parameters
</target>
</disk>
</disks>
</domainbackup>
I'm assuming an 'unmanaged' backup would not be shown when calling
virDomainBackupList later on ?
Also with the QEMU built-in NBD server, you just have a single
nbd-server-start to do, and that one server will export multiple
disks as named exports. So you wouldn't repeat the NBD server
parameters for all disks.
--------------------------------------------------------------------------------
int virDomainBackupList(virDomainPtr domain,
virBackupPtr ** backups,
unsigned int flags)
Collect the list of domain backups for the given domain, and allocate an
array
to store those objects
- domain: a domain object
- backups: pointer to variable to store the array containing backup
objects,
or NULL if the list is not required (just returns number of backups)
- flags: bitwise-OR of virBackupListFlags
- returns: the number of backups on success or -1 on failure
enum virBackupListFlags {
VIR_BACKUP_LIST_FULL = 1,
VIR_BACKUP_LIST_LATEST = 2,
...
}
--------------------------------------------------------------------------------
int virBackupListChildren(virBackupPtr backup,
virBackupPtr ** backups,
unsigned int flags)
Collect the list of child backups for the given backup, and allocate an
array
to store them
- backup: a backup object
- backups: pointer to variable to store the array containing backup
objects,
or NULL if the list is not required (just returns number of backups)
- flags: bitwise-OR of virBackupListFlags
- returns: the number of backups on success or -1 on failure
--------------------------------------------------------------------------------
int virBackupRestore(const char * xmlDesc,
unsigned int flags)
For the "managed backups" case it feels like this should be accepting
a virDomainBackupPtr rather than an xmlDesc string.
For the "unmanaged backups", then IIUC, we would need to have
a virDOmainPtr and the xmlDesc. So probably want a separate
API for that. virBackupRestoreUnmanaged ?
Restore a domain from a given backup.
- xmlDesc: string containing an XML description of what to restore. It
can
repeate complete backup xml or specify some part of disks to restore.
- flags: bitwise-OR of virBackupRestoreFlags
- returns: 0 on success or -1 on failure
enum virBackupRestoreFlags {
VIR_BACKUP_RESTORE_NEW_DOMAIN = 1,
VIR_BACKUP_RESTORE_REWRITE_EXISTING_DISK = 2,
...
}
An example of restore xml:
<domainbackup>
<uuid>54c70d40-26bb-48cd-9639-b3a1e9adf650</uuid>
<disks>
<disk name='vda'>
<target>
... volume, file, or any possible target, (if absent, reuses
current
disk target)
</target>
</disk>
<disk name='vdb'>
<target>
...
</target>
</disk>
</disks>
</domainbackup>
--------------------------------------------------------------------------------
int virBackupDelete(virBackupPtr backup,
unsigned int flags)
Delete the specified backup
- backup: a backup object
- flags: bitwise-OR of virBackupDeleteFlags
- returns: 0 on success or -1 on failure
enum virBackupDeleteFlags {
VIR_BACKUP_DELETE_ALL = 1,
VIR_BACKUP_DELETE_ALL_CHILDREN = 2,
...
}
--------------------------------------------------------------------------------
int virBackupFree(virBackupPtr backup)
Free the backup object. The backup itself is not modified. The data
structure
is freed and should not be used thereafter.
- backup: a backup object
- returns: 0 on success or -1 on failure
--------------------------------------------------------------------------------
char* virBackupGetXMLDesc(virBackupPtr backup,
unsigned int flags)
Provide an XML description of the backup
- backup: a backup object
- flags: bitwise-OR of virDomainXMLFlags
- returns: a 0 terminated UTF-8 encoded XML instance, or NULL in case of
error. The caller must free() the returned value
An example of dumped xml:
<domainbackup>
<uuid>54c70d40-26bb-48cd-9639-b3a1e9adf650</uuid>
<creationTime>1270477159</creationTime>
<description>Any string</description>
<parent>
<uuid>d2ee2566-bef2-408f-ac7a-eb8004186074</uuid>
<parent>
<disks>
<disk name='vda'>
<target>
... volume, file, or any possible target
</target>
</disk>
<disk name='vdb'>
<target>
...
</target>
</disk>
</disks>
</domainbackup>
--------------------------------------------------------------------------------
virBackupPtr virBackupLookupByUUID(const char * uuid,
unsigned int flags)
Try to lookup a backup by its UUID
- uuid: a backup uuid
- flags: for future use
- returns: an opaque virBackupPtr on success or NULL on failure
--------------------------------------------------------------------------------
virDomainPtr virBackupGetDomain(virBackupPtr backup)
Provide the domain pointer associated with a backup. The reference counter
on
the domain is not increased by this call
- backup: a backup object
- returns: a domain object on success or NULL on failure
--------------------------------------------------------------------------------
int virBackupFinishJob(virBackupPtr backup,
unsigned int flags)
Finish async job associated with specified backup
- backup: a backup object
- flags: bitwise-OR of virBackupDeleteFlags
- returns: 0 on if the job for the specified backup was finished or
cancelled
successfully or -1 otherwise
enum virBackupFinishJobFlags {
VIR_BACKUP_FINISH_JOB_CANCEL = 1,
VIR_BACKUP_FINISH_JOB_CHECK = 2,
...
}
Probablt want a corresponding virBackupAbortJob too.
--------------------------------------------------------------------------------
int virBackupGetParameters(virBackupPtr backup,
virTypedParameterPtr params,
int * nparams,
unsigned int flags)
Get backup parameters. On input, @nparams gives the size of the @params
array;
on output, @nparams gives how many slots were filled with parameter
information, which might be less but will not exceed the input value
- backup: a backup object
- params: pointer to backup parameter object (return value, allocated by
the
caller)
- nparams: pointer to number of blkio parameters; input and output
- flags: for future use
- returns: 0 on success or -1 on failure
--------------------------------------------------------------------------------
int virDomainSetDefaultTarget(virDomainPtr domain,
const char * xmlDesc,
unsigned int flags)
Set default store target for backup, snapshot, managed saved state metadata
- domain: a domain object
- xmlDesc: string containing an XML description of the backup
- flags: bitwise-OR of virDomainDeviceModifyFlags
- returns: 0 on success or -1 on failure
Not sure I understand what this is doing, but probably not a big deal.
Also, virDomainUndefineFlagsValues should be expanded with
VIR_DOMAIN_UNDEFINE_BACKUP and virDomainUndefineFlags implementations should
take into account this flag when undefining domains.
Overall I think this looks like a reasonable API design to start
implementing.
Regards,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|