mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-25 22:15:20 +00:00
Implement extensible migration APIs in remote driver
This commit is contained in:
parent
c0762b6518
commit
cca4d10d82
@ -6042,6 +6042,398 @@ done:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
remoteDomainMigrateBegin3Params(virDomainPtr domain,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int nparams,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
char *rv = NULL;
|
||||||
|
remote_domain_migrate_begin3_params_args args;
|
||||||
|
remote_domain_migrate_begin3_params_ret ret;
|
||||||
|
struct private_data *priv = domain->conn->privateData;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
make_nonnull_domain(&args.dom, domain);
|
||||||
|
args.flags = flags;
|
||||||
|
|
||||||
|
if (remoteSerializeTypedParameters(params, nparams,
|
||||||
|
&args.params.params_val,
|
||||||
|
&args.params.params_len) < 0) {
|
||||||
|
xdr_free((xdrproc_t) xdr_remote_domain_migrate_begin3_params_args,
|
||||||
|
(char *) &args);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_BEGIN3_PARAMS,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_begin3_params_args,
|
||||||
|
(char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_begin3_params_ret,
|
||||||
|
(char *) &ret) == -1)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = ret.xml; /* caller frees */
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
remoteFreeTypedParameters(args.params.params_val, args.params.params_len);
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDomainMigratePrepare3Params(virConnectPtr dconn,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int nparams,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
char **uri_out,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
remote_domain_migrate_prepare3_params_args args;
|
||||||
|
remote_domain_migrate_prepare3_params_ret ret;
|
||||||
|
struct private_data *priv = dconn->privateData;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
if (remoteSerializeTypedParameters(params, nparams,
|
||||||
|
&args.params.params_val,
|
||||||
|
&args.params.params_len) < 0) {
|
||||||
|
xdr_free((xdrproc_t) xdr_remote_domain_migrate_prepare3_params_args,
|
||||||
|
(char *) &args);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
args.cookie_in.cookie_in_val = (char *)cookiein;
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.flags = flags;
|
||||||
|
|
||||||
|
if (call(dconn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE3_PARAMS,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_prepare3_params_args,
|
||||||
|
(char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_prepare3_params_ret,
|
||||||
|
(char *) &ret) == -1)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
}
|
||||||
|
if (ret.uri_out) {
|
||||||
|
if (!uri_out) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores uri_out"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*uri_out = *ret.uri_out; /* Caller frees. */
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
remoteFreeTypedParameters(args.params.params_val, args.params.params_len);
|
||||||
|
VIR_FREE(ret.uri_out);
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
if (ret.uri_out)
|
||||||
|
VIR_FREE(*ret.uri_out);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDomainMigratePrepareTunnel3Params(virConnectPtr dconn,
|
||||||
|
virStreamPtr st,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int nparams,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
struct private_data *priv = dconn->privateData;
|
||||||
|
int rv = -1;
|
||||||
|
remote_domain_migrate_prepare_tunnel3_params_args args;
|
||||||
|
remote_domain_migrate_prepare_tunnel3_params_ret ret;
|
||||||
|
virNetClientStreamPtr netst;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
args.cookie_in.cookie_in_val = (char *)cookiein;
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.flags = flags;
|
||||||
|
|
||||||
|
if (remoteSerializeTypedParameters(params, nparams,
|
||||||
|
&args.params.params_val,
|
||||||
|
&args.params.params_len) < 0) {
|
||||||
|
xdr_free((xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_params_args,
|
||||||
|
(char *) &args);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(netst = virNetClientStreamNew(priv->remoteProgram,
|
||||||
|
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3_PARAMS,
|
||||||
|
priv->counter)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (virNetClientAddStream(priv->client, netst) < 0) {
|
||||||
|
virObjectUnref(netst);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
st->driver = &remoteStreamDrv;
|
||||||
|
st->privateData = netst;
|
||||||
|
|
||||||
|
if (call(dconn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3_PARAMS,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_params_args,
|
||||||
|
(char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_prepare_tunnel3_params_ret,
|
||||||
|
(char *) &ret) == -1) {
|
||||||
|
virNetClientRemoveStream(priv->client, netst);
|
||||||
|
virObjectUnref(netst);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
remoteFreeTypedParameters(args.params.params_val, args.params.params_len);
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDomainMigratePerform3Params(virDomainPtr dom,
|
||||||
|
const char *dconnuri,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int nparams,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
unsigned int flags)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
remote_domain_migrate_perform3_params_args args;
|
||||||
|
remote_domain_migrate_perform3_params_ret ret;
|
||||||
|
struct private_data *priv = dom->conn->privateData;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
make_nonnull_domain(&args.dom, dom);
|
||||||
|
args.dconnuri = dconnuri == NULL ? NULL : (char **) &dconnuri;
|
||||||
|
args.cookie_in.cookie_in_val = (char *)cookiein;
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.flags = flags;
|
||||||
|
|
||||||
|
if (remoteSerializeTypedParameters(params, nparams,
|
||||||
|
&args.params.params_val,
|
||||||
|
&args.params.params_len) < 0) {
|
||||||
|
xdr_free((xdrproc_t) xdr_remote_domain_migrate_perform3_params_args,
|
||||||
|
(char *) &args);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (call(dom->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_PERFORM3_PARAMS,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_perform3_params_args,
|
||||||
|
(char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_perform3_params_ret,
|
||||||
|
(char *) &ret) == -1)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
remoteFreeTypedParameters(args.params.params_val, args.params.params_len);
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static virDomainPtr
|
||||||
|
remoteDomainMigrateFinish3Params(virConnectPtr dconn,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int nparams,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
char **cookieout,
|
||||||
|
int *cookieoutlen,
|
||||||
|
unsigned int flags,
|
||||||
|
int cancelled)
|
||||||
|
{
|
||||||
|
remote_domain_migrate_finish3_params_args args;
|
||||||
|
remote_domain_migrate_finish3_params_ret ret;
|
||||||
|
struct private_data *priv = dconn->privateData;
|
||||||
|
virDomainPtr rv = NULL;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
memset(&ret, 0, sizeof(ret));
|
||||||
|
|
||||||
|
args.cookie_in.cookie_in_val = (char *)cookiein;
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.flags = flags;
|
||||||
|
args.cancelled = cancelled;
|
||||||
|
|
||||||
|
if (remoteSerializeTypedParameters(params, nparams,
|
||||||
|
&args.params.params_val,
|
||||||
|
&args.params.params_len) < 0) {
|
||||||
|
xdr_free((xdrproc_t) xdr_remote_domain_migrate_finish3_params_args,
|
||||||
|
(char *) &args);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (call(dconn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_FINISH3_PARAMS,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_finish3_params_args,
|
||||||
|
(char *) &args,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_finish3_params_ret,
|
||||||
|
(char *) &ret) == -1)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = get_nonnull_domain(dconn, ret.dom);
|
||||||
|
|
||||||
|
if (ret.cookie_out.cookie_out_len > 0) {
|
||||||
|
if (!cookieout || !cookieoutlen) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("caller ignores cookieout or cookieoutlen"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
*cookieout = ret.cookie_out.cookie_out_val; /* Caller frees. */
|
||||||
|
*cookieoutlen = ret.cookie_out.cookie_out_len;
|
||||||
|
ret.cookie_out.cookie_out_val = NULL;
|
||||||
|
ret.cookie_out.cookie_out_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
xdr_free((xdrproc_t) &xdr_remote_domain_migrate_finish3_params_ret,
|
||||||
|
(char *) &ret);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
remoteFreeTypedParameters(args.params.params_val, args.params.params_len);
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
|
||||||
|
error:
|
||||||
|
VIR_FREE(ret.cookie_out.cookie_out_val);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
remoteDomainMigrateConfirm3Params(virDomainPtr domain,
|
||||||
|
virTypedParameterPtr params,
|
||||||
|
int nparams,
|
||||||
|
const char *cookiein,
|
||||||
|
int cookieinlen,
|
||||||
|
unsigned int flags,
|
||||||
|
int cancelled)
|
||||||
|
{
|
||||||
|
int rv = -1;
|
||||||
|
remote_domain_migrate_confirm3_params_args args;
|
||||||
|
struct private_data *priv = domain->conn->privateData;
|
||||||
|
|
||||||
|
remoteDriverLock(priv);
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(args));
|
||||||
|
|
||||||
|
make_nonnull_domain(&args.dom, domain);
|
||||||
|
args.cookie_in.cookie_in_len = cookieinlen;
|
||||||
|
args.cookie_in.cookie_in_val = (char *) cookiein;
|
||||||
|
args.flags = flags;
|
||||||
|
args.cancelled = cancelled;
|
||||||
|
|
||||||
|
if (remoteSerializeTypedParameters(params, nparams,
|
||||||
|
&args.params.params_val,
|
||||||
|
&args.params.params_len) < 0) {
|
||||||
|
xdr_free((xdrproc_t) xdr_remote_domain_migrate_confirm3_params_args,
|
||||||
|
(char *) &args);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (call(domain->conn, priv, 0, REMOTE_PROC_DOMAIN_MIGRATE_CONFIRM3_PARAMS,
|
||||||
|
(xdrproc_t) xdr_remote_domain_migrate_confirm3_params_args,
|
||||||
|
(char *) &args, (xdrproc_t) xdr_void, (char *) NULL) == -1)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
rv = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
remoteFreeTypedParameters(args.params.params_val, args.params.params_len);
|
||||||
|
remoteDriverUnlock(priv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remoteDomainEventQueue(struct private_data *priv, virDomainEventPtr event)
|
remoteDomainEventQueue(struct private_data *priv, virDomainEventPtr event)
|
||||||
{
|
{
|
||||||
@ -6367,6 +6759,12 @@ static virDriver remote_driver = {
|
|||||||
.nodeGetCPUMap = remoteNodeGetCPUMap, /* 1.0.0 */
|
.nodeGetCPUMap = remoteNodeGetCPUMap, /* 1.0.0 */
|
||||||
.domainFSTrim = remoteDomainFSTrim, /* 1.0.1 */
|
.domainFSTrim = remoteDomainFSTrim, /* 1.0.1 */
|
||||||
.domainLxcOpenNamespace = remoteDomainLxcOpenNamespace, /* 1.0.2 */
|
.domainLxcOpenNamespace = remoteDomainLxcOpenNamespace, /* 1.0.2 */
|
||||||
|
.domainMigrateBegin3Params = remoteDomainMigrateBegin3Params, /* 1.1.0 */
|
||||||
|
.domainMigratePrepare3Params = remoteDomainMigratePrepare3Params, /* 1.1.0 */
|
||||||
|
.domainMigratePrepareTunnel3Params = remoteDomainMigratePrepareTunnel3Params, /* 1.1.0 */
|
||||||
|
.domainMigratePerform3Params = remoteDomainMigratePerform3Params, /* 1.1.0 */
|
||||||
|
.domainMigrateFinish3Params = remoteDomainMigrateFinish3Params, /* 1.1.0 */
|
||||||
|
.domainMigrateConfirm3Params = remoteDomainMigrateConfirm3Params, /* 1.1.0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
static virNetworkDriver network_driver = {
|
static virNetworkDriver network_driver = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user