backup: Implement checkpoint APIs for remote driver

The remote code generator had to be taught about the new
virDomainCheckpointPtr type, at which point the remote driver code for
checkpoints can be generated.

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Eric Blake 2019-03-06 11:54:47 -06:00
parent 4f0438ef7c
commit cfe0920906
5 changed files with 252 additions and 16 deletions

View File

@ -90,6 +90,7 @@ static virStorageVolPtr get_nonnull_storage_vol(virConnectPtr conn, remote_nonnu
static virSecretPtr get_nonnull_secret(virConnectPtr conn, remote_nonnull_secret secret);
static virNWFilterPtr get_nonnull_nwfilter(virConnectPtr conn, remote_nonnull_nwfilter nwfilter);
static virNWFilterBindingPtr get_nonnull_nwfilter_binding(virConnectPtr conn, remote_nonnull_nwfilter_binding binding);
static virDomainCheckpointPtr get_nonnull_domain_checkpoint(virDomainPtr dom, remote_nonnull_domain_checkpoint checkpoint);
static virDomainSnapshotPtr get_nonnull_domain_snapshot(virDomainPtr dom, remote_nonnull_domain_snapshot snapshot);
static virNodeDevicePtr get_nonnull_node_device(virConnectPtr conn, remote_nonnull_node_device dev);
static int make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPtr dom_src) ATTRIBUTE_RETURN_CHECK;
@ -102,6 +103,7 @@ static int make_nonnull_node_device(remote_nonnull_node_device *dev_dst, virNode
static int make_nonnull_secret(remote_nonnull_secret *secret_dst, virSecretPtr secret_src) ATTRIBUTE_RETURN_CHECK;
static int make_nonnull_nwfilter(remote_nonnull_nwfilter *net_dst, virNWFilterPtr nwfilter_src) ATTRIBUTE_RETURN_CHECK;
static int make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *binding_dst, virNWFilterBindingPtr binding_src) ATTRIBUTE_RETURN_CHECK;
static int make_nonnull_domain_checkpoint(remote_nonnull_domain_checkpoint *checkpoint_dst, virDomainCheckpointPtr checkpoint_src) ATTRIBUTE_RETURN_CHECK;
static int make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src) ATTRIBUTE_RETURN_CHECK;
static int
@ -7301,6 +7303,12 @@ get_nonnull_nwfilter_binding(virConnectPtr conn, remote_nonnull_nwfilter_binding
return virGetNWFilterBinding(conn, binding.portdev, binding.filtername);
}
static virDomainCheckpointPtr
get_nonnull_domain_checkpoint(virDomainPtr dom, remote_nonnull_domain_checkpoint checkpoint)
{
return virGetDomainCheckpoint(dom, checkpoint.name);
}
static virDomainSnapshotPtr
get_nonnull_domain_snapshot(virDomainPtr dom, remote_nonnull_domain_snapshot snapshot)
{
@ -7421,6 +7429,18 @@ make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *binding_dst, virN
return 0;
}
static int
make_nonnull_domain_checkpoint(remote_nonnull_domain_checkpoint *checkpoint_dst, virDomainCheckpointPtr checkpoint_src)
{
if (VIR_STRDUP(checkpoint_dst->name, checkpoint_src->name) < 0)
return -1;
if (make_nonnull_domain(&checkpoint_dst->dom, checkpoint_src->domain) < 0) {
VIR_FREE(checkpoint_dst->name);
return -1;
}
return 0;
}
static int
make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src)
{

View File

@ -146,6 +146,7 @@ static virStoragePoolPtr get_nonnull_storage_pool(virConnectPtr conn, remote_non
static virStorageVolPtr get_nonnull_storage_vol(virConnectPtr conn, remote_nonnull_storage_vol vol);
static virNodeDevicePtr get_nonnull_node_device(virConnectPtr conn, remote_nonnull_node_device dev);
static virSecretPtr get_nonnull_secret(virConnectPtr conn, remote_nonnull_secret secret);
static virDomainCheckpointPtr get_nonnull_domain_checkpoint(virDomainPtr domain, remote_nonnull_domain_checkpoint checkpoint);
static virDomainSnapshotPtr get_nonnull_domain_snapshot(virDomainPtr domain, remote_nonnull_domain_snapshot snapshot);
static void make_nonnull_domain(remote_nonnull_domain *dom_dst, virDomainPtr dom_src);
static void make_nonnull_network(remote_nonnull_network *net_dst, virNetworkPtr net_src);
@ -158,6 +159,7 @@ make_nonnull_node_device(remote_nonnull_node_device *dev_dst, virNodeDevicePtr d
static void make_nonnull_secret(remote_nonnull_secret *secret_dst, virSecretPtr secret_src);
static void make_nonnull_nwfilter(remote_nonnull_nwfilter *nwfilter_dst, virNWFilterPtr nwfilter_src);
static void make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *binding_dst, virNWFilterBindingPtr binding_src);
static void make_nonnull_domain_checkpoint(remote_nonnull_domain_checkpoint *checkpoint_dst, virDomainCheckpointPtr checkpoint_src);
static void make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src);
/*----------------------------------------------------------------------*/
@ -8242,6 +8244,12 @@ get_nonnull_nwfilter_binding(virConnectPtr conn, remote_nonnull_nwfilter_binding
return virGetNWFilterBinding(conn, binding.portdev, binding.filtername);
}
static virDomainCheckpointPtr
get_nonnull_domain_checkpoint(virDomainPtr domain, remote_nonnull_domain_checkpoint checkpoint)
{
return virGetDomainCheckpoint(domain, checkpoint.name);
}
static virDomainSnapshotPtr
get_nonnull_domain_snapshot(virDomainPtr domain, remote_nonnull_domain_snapshot snapshot)
{
@ -8324,6 +8332,13 @@ make_nonnull_nwfilter_binding(remote_nonnull_nwfilter_binding *binding_dst, virN
binding_dst->filtername = binding_src->filtername;
}
static void
make_nonnull_domain_checkpoint(remote_nonnull_domain_checkpoint *checkpoint_dst, virDomainCheckpointPtr checkpoint_src)
{
checkpoint_dst->name = checkpoint_src->name;
make_nonnull_domain(&checkpoint_dst->dom, checkpoint_src->domain);
}
static void
make_nonnull_domain_snapshot(remote_nonnull_domain_snapshot *snapshot_dst, virDomainSnapshotPtr snapshot_src)
{
@ -8573,7 +8588,14 @@ static virHypervisorDriver hypervisor_driver = {
.connectCompareHypervisorCPU = remoteConnectCompareHypervisorCPU, /* 4.4.0 */
.connectBaselineHypervisorCPU = remoteConnectBaselineHypervisorCPU, /* 4.4.0 */
.nodeGetSEVInfo = remoteNodeGetSEVInfo, /* 4.5.0 */
.domainGetLaunchSecurityInfo = remoteDomainGetLaunchSecurityInfo /* 4.5.0 */
.domainGetLaunchSecurityInfo = remoteDomainGetLaunchSecurityInfo, /* 4.5.0 */
.domainCheckpointCreateXML = remoteDomainCheckpointCreateXML, /* 5.6.0 */
.domainCheckpointGetXMLDesc = remoteDomainCheckpointGetXMLDesc, /* 5.6.0 */
.domainListAllCheckpoints = remoteDomainListAllCheckpoints, /* 5.6.0 */
.domainCheckpointListAllChildren = remoteDomainCheckpointListAllChildren, /* 5.6.0 */
.domainCheckpointLookupByName = remoteDomainCheckpointLookupByName, /* 5.6.0 */
.domainCheckpointGetParent = remoteDomainCheckpointGetParent, /* 5.6.0 */
.domainCheckpointDelete = remoteDomainCheckpointDelete, /* 5.6.0 */
};
static virNetworkDriver network_driver = {

View File

@ -140,6 +140,9 @@ const REMOTE_AUTH_TYPE_LIST_MAX = 20;
/* Upper limit on list of memory stats */
const REMOTE_DOMAIN_MEMORY_STATS_MAX = 1024;
/* Upper limit on lists of domain checkpoints. */
const REMOTE_DOMAIN_CHECKPOINT_LIST_MAX = 16384;
/* Upper limit on lists of domain snapshots. */
const REMOTE_DOMAIN_SNAPSHOT_LIST_MAX = 16384;
@ -336,6 +339,12 @@ struct remote_nonnull_secret {
remote_nonnull_string usageID;
};
/* A checkpoint which may not be NULL. */
struct remote_nonnull_domain_checkpoint {
remote_nonnull_string name;
remote_nonnull_domain dom;
};
/* A snapshot which may not be NULL. */
struct remote_nonnull_domain_snapshot {
remote_nonnull_string name;
@ -3649,6 +3658,70 @@ struct remote_network_port_delete_args {
unsigned int flags;
};
struct remote_domain_checkpoint_create_xml_args {
remote_nonnull_domain dom;
remote_nonnull_string xml_desc;
unsigned int flags;
};
struct remote_domain_checkpoint_create_xml_ret {
remote_nonnull_domain_checkpoint checkpoint;
};
struct remote_domain_checkpoint_get_xml_desc_args {
remote_nonnull_domain_checkpoint checkpoint;
unsigned int flags;
};
struct remote_domain_checkpoint_get_xml_desc_ret {
remote_nonnull_string xml;
};
struct remote_domain_list_all_checkpoints_args {
remote_nonnull_domain dom;
int need_results;
unsigned int flags;
};
struct remote_domain_list_all_checkpoints_ret { /* insert@1 */
remote_nonnull_domain_checkpoint checkpoints<REMOTE_DOMAIN_CHECKPOINT_LIST_MAX>;
int ret;
};
struct remote_domain_checkpoint_list_all_children_args {
remote_nonnull_domain_checkpoint checkpoint;
int need_results;
unsigned int flags;
};
struct remote_domain_checkpoint_list_all_children_ret { /* insert@1 */
remote_nonnull_domain_checkpoint checkpoints<REMOTE_DOMAIN_CHECKPOINT_LIST_MAX>;
int ret;
};
struct remote_domain_checkpoint_lookup_by_name_args {
remote_nonnull_domain dom;
remote_nonnull_string name;
unsigned int flags;
};
struct remote_domain_checkpoint_lookup_by_name_ret {
remote_nonnull_domain_checkpoint checkpoint;
};
struct remote_domain_checkpoint_get_parent_args {
remote_nonnull_domain_checkpoint checkpoint;
unsigned int flags;
};
struct remote_domain_checkpoint_get_parent_ret {
remote_nonnull_domain_checkpoint parent;
};
struct remote_domain_checkpoint_delete_args {
remote_nonnull_domain_checkpoint checkpoint;
unsigned int flags;
};
/*----- Protocol. -----*/
@ -6463,5 +6536,53 @@ enum remote_procedure {
* @generate: both
* @acl: network_port:delete
*/
REMOTE_PROC_NETWORK_PORT_DELETE = 410
REMOTE_PROC_NETWORK_PORT_DELETE = 410,
/**
* @generate: both
* @acl: domain:checkpoint
* @acl: domain:fs_freeze:VIR_DOMAIN_CHECKPOINT_CREATE_QUIESCE
*/
REMOTE_PROC_DOMAIN_CHECKPOINT_CREATE_XML = 411,
/**
* @generate: both
* @acl: domain:read
* @acl: domain:read_secure:VIR_DOMAIN_CHECKPOINT_XML_SECURE
*/
REMOTE_PROC_DOMAIN_CHECKPOINT_GET_XML_DESC = 412,
/**
* @generate: both
* @priority: high
* @acl: domain:read
*/
REMOTE_PROC_DOMAIN_LIST_ALL_CHECKPOINTS = 413,
/**
* @generate: both
* @priority: high
* @acl: domain:read
*/
REMOTE_PROC_DOMAIN_CHECKPOINT_LIST_ALL_CHILDREN = 414,
/**
* @generate: both
* @priority: high
* @acl: domain:read
*/
REMOTE_PROC_DOMAIN_CHECKPOINT_LOOKUP_BY_NAME = 415,
/**
* @generate: both
* @priority: high
* @acl: domain:read
*/
REMOTE_PROC_DOMAIN_CHECKPOINT_GET_PARENT = 416,
/**
* @generate: both
* @acl: domain:checkpoint
*/
REMOTE_PROC_DOMAIN_CHECKPOINT_DELETE = 417
};

View File

@ -50,6 +50,10 @@ struct remote_nonnull_secret {
int usageType;
remote_nonnull_string usageID;
};
struct remote_nonnull_domain_checkpoint {
remote_nonnull_string name;
remote_nonnull_domain dom;
};
struct remote_nonnull_domain_snapshot {
remote_nonnull_string name;
remote_nonnull_domain dom;
@ -3043,6 +3047,64 @@ struct remote_network_port_delete_args {
remote_nonnull_network_port port;
u_int flags;
};
struct remote_domain_checkpoint_create_xml_args {
remote_nonnull_domain dom;
remote_nonnull_string xml_desc;
u_int flags;
};
struct remote_domain_checkpoint_create_xml_ret {
remote_nonnull_domain_checkpoint checkpoint;
};
struct remote_domain_checkpoint_get_xml_desc_args {
remote_nonnull_domain_checkpoint checkpoint;
u_int flags;
};
struct remote_domain_checkpoint_get_xml_desc_ret {
remote_nonnull_string xml;
};
struct remote_domain_list_all_checkpoints_args {
remote_nonnull_domain dom;
int need_results;
u_int flags;
};
struct remote_domain_list_all_checkpoints_ret {
struct {
u_int checkpoints_len;
remote_nonnull_domain_checkpoint * checkpoints_val;
} checkpoints;
int ret;
};
struct remote_domain_checkpoint_list_all_children_args {
remote_nonnull_domain_checkpoint checkpoint;
int need_results;
u_int flags;
};
struct remote_domain_checkpoint_list_all_children_ret {
struct {
u_int checkpoints_len;
remote_nonnull_domain_checkpoint * checkpoints_val;
} checkpoints;
int ret;
};
struct remote_domain_checkpoint_lookup_by_name_args {
remote_nonnull_domain dom;
remote_nonnull_string name;
u_int flags;
};
struct remote_domain_checkpoint_lookup_by_name_ret {
remote_nonnull_domain_checkpoint checkpoint;
};
struct remote_domain_checkpoint_get_parent_args {
remote_nonnull_domain_checkpoint checkpoint;
u_int flags;
};
struct remote_domain_checkpoint_get_parent_ret {
remote_nonnull_domain_checkpoint parent;
};
struct remote_domain_checkpoint_delete_args {
remote_nonnull_domain_checkpoint checkpoint;
u_int flags;
};
enum remote_procedure {
REMOTE_PROC_CONNECT_OPEN = 1,
REMOTE_PROC_CONNECT_CLOSE = 2,
@ -3454,4 +3516,11 @@ enum remote_procedure {
REMOTE_PROC_NETWORK_PORT_SET_PARAMETERS = 408,
REMOTE_PROC_NETWORK_PORT_GET_XML_DESC = 409,
REMOTE_PROC_NETWORK_PORT_DELETE = 410,
REMOTE_PROC_DOMAIN_CHECKPOINT_CREATE_XML = 411,
REMOTE_PROC_DOMAIN_CHECKPOINT_GET_XML_DESC = 412,
REMOTE_PROC_DOMAIN_LIST_ALL_CHECKPOINTS = 413,
REMOTE_PROC_DOMAIN_CHECKPOINT_LIST_ALL_CHILDREN = 414,
REMOTE_PROC_DOMAIN_CHECKPOINT_LOOKUP_BY_NAME = 415,
REMOTE_PROC_DOMAIN_CHECKPOINT_GET_PARENT = 416,
REMOTE_PROC_DOMAIN_CHECKPOINT_DELETE = 417,
};

View File

@ -58,6 +58,7 @@ sub fixup_name {
$name =~ s/Nwfilter/NWFilter/;
$name =~ s/Xml$/XML/;
$name =~ s/Xml2$/XML2/;
$name =~ s/Uri$/URI/;
$name =~ s/Uuid$/UUID/;
$name =~ s/Id$/ID/;
@ -567,18 +568,20 @@ elsif ($mode eq "server") {
push(@args_list, "$2");
push(@free_list,
" virObjectUnref($2);");
} elsif ($args_member =~ m/^remote_nonnull_domain_snapshot (\S+);$/) {
} elsif ($args_member =~ m/^remote_nonnull_domain_(checkpoint|snapshot) (\S+);$/) {
my $type_name = name_to_TypeName($1);
push(@vars_list, "virDomainPtr dom = NULL");
push(@vars_list, "virDomainSnapshotPtr snapshot = NULL");
push(@vars_list, "virDomain${type_name}Ptr ${1} = NULL");
push(@getters_list,
" if (!(dom = get_nonnull_domain($conn, args->${1}.dom)))\n" .
" if (!(dom = get_nonnull_domain($conn, args->${2}.dom)))\n" .
" goto cleanup;\n" .
"\n" .
" if (!(snapshot = get_nonnull_domain_snapshot(dom, args->${1})))\n" .
" if (!($1 = get_nonnull_domain_${1}(dom, args->$2)))\n" .
" goto cleanup;\n");
push(@args_list, "snapshot");
push(@args_list, "$1");
push(@free_list,
" virObjectUnref(snapshot);\n" .
" virObjectUnref($1);\n" .
" virObjectUnref(dom);");
} elsif ($args_member =~ m/^(?:(?:admin|remote)_string|remote_uuid) (\S+)<\S+>;/) {
push(@args_list, $conn) if !@args_list;
@ -722,7 +725,7 @@ elsif ($mode eq "server") {
if (!$modern_ret_as_list) {
push(@ret_list, "ret->$3 = tmp.$3;");
}
} elsif ($ret_member =~ m/(?:admin|remote)_nonnull_(secret|nwfilter|nwfilter_binding|node_device|interface|network|network_port|storage_vol|storage_pool|domain_snapshot|domain|server|client) (\S+)<(\S+)>;/) {
} elsif ($ret_member =~ m/(?:admin|remote)_nonnull_(secret|nwfilter|nwfilter_binding|node_device|interface|network|network_port|storage_vol|storage_pool|domain_checkpoint|domain_snapshot|domain|server|client) (\S+)<(\S+)>;/) {
$modern_ret_struct_name = $1;
$single_ret_list_error_msg_type = $1;
$single_ret_list_name = $2;
@ -780,7 +783,7 @@ elsif ($mode eq "server") {
$single_ret_var = $1;
$single_ret_by_ref = 0;
$single_ret_check = " == NULL";
} elsif ($ret_member =~ m/^remote_nonnull_(domain|network|network_port|storage_pool|storage_vol|interface|node_device|secret|nwfilter|nwfilter_binding|domain_snapshot) (\S+);/) {
} elsif ($ret_member =~ m/^remote_nonnull_(domain|network|network_port|storage_pool|storage_vol|interface|node_device|secret|nwfilter|nwfilter_binding|domain_checkpoint|domain_snapshot) (\S+);/) {
my $type_name = name_to_TypeName($1);
if ($call->{ProcName} eq "DomainCreateWithFlags") {
@ -1328,13 +1331,14 @@ elsif ($mode eq "client") {
$priv_src = "dev->conn";
push(@args_list, "virNodeDevicePtr dev");
push(@setters_list, "args.name = dev->name;");
} elsif ($args_member =~ m/^remote_nonnull_(domain|network|network_port|storage_pool|storage_vol|interface|secret|nwfilter|nwfilter_binding|domain_snapshot) (\S+);/) {
} elsif ($args_member =~ m/^remote_nonnull_(domain|network|network_port|storage_pool|storage_vol|interface|secret|nwfilter|nwfilter_binding|domain_checkpoint|domain_snapshot) (\S+);/) {
my $name = $1;
my $arg_name = $2;
my $type_name = name_to_TypeName($name);
if ($is_first_arg) {
if ($name eq "domain_snapshot") {
if ($name eq "domain_snapshot" ||
$name eq "domain_checkpoint") {
$priv_src = "$arg_name->domain->conn";
} elsif ($name eq "network_port") {
$priv_src = "$arg_name->net->conn";
@ -1523,7 +1527,7 @@ elsif ($mode eq "client") {
}
push(@ret_list, "memcpy(result->$3, ret.$3, sizeof(result->$3));");
} elsif ($ret_member =~ m/(?:admin|remote)_nonnull_(secret|nwfilter|nwfilter_binding|node_device|interface|network|network_port|storage_vol|storage_pool|domain_snapshot|domain|server|client) (\S+)<(\S+)>;/) {
} elsif ($ret_member =~ m/(?:admin|remote)_nonnull_(secret|nwfilter|nwfilter_binding|node_device|interface|network|network_port|storage_vol|storage_pool|domain_checkpoint|domain_snapshot|domain|server|client) (\S+)<(\S+)>;/) {
my $proc_name = name_to_TypeName($1);
if ($structprefix eq "admin") {
@ -1576,7 +1580,7 @@ elsif ($mode eq "client") {
push(@ret_list, "VIR_FREE(ret.$1);");
$single_ret_var = "char *rv = NULL";
$single_ret_type = "char *";
} elsif ($ret_member =~ m/^remote_nonnull_(domain|network|network_port|storage_pool|storage_vol|node_device|interface|secret|nwfilter|nwfilter_binding|domain_snapshot) (\S+);/) {
} elsif ($ret_member =~ m/^remote_nonnull_(domain|network|network_port|storage_pool|storage_vol|node_device|interface|secret|nwfilter|nwfilter_binding|domain_checkpoint|domain_snapshot) (\S+);/) {
my $name = $1;
my $arg_name = $2;
my $type_name = name_to_TypeName($name);
@ -1590,7 +1594,7 @@ elsif ($mode eq "client") {
$single_ret_var = "int rv = -1";
$single_ret_type = "int";
} else {
if ($name eq "domain_snapshot") {
if ($name =~ m/^domain_.*/) {
my $dom = "$priv_src";
$dom =~ s/->conn//;
push(@ret_list, "rv = get_nonnull_$name($dom, ret.$arg_name);");
@ -1934,7 +1938,7 @@ elsif ($mode eq "client") {
print " }\n";
print "\n";
} elsif ($modern_ret_as_list) {
if ($modern_ret_struct_name =~ m/domain_snapshot|client/) {
if ($modern_ret_struct_name =~ m/domain_checkpoint|domain_snapshot|client/) {
$priv_src =~ s/->conn//;
}
print " if (result) {\n";