mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-25 23:25:24 +00:00
0372295770
This patch adds some new RPC call numbers, but for ease of review, they sit idle until a later patch adds the client counterpart to drive the new RPCs. Also for ease of review, I limited this patch to just the lifecycle event; although converting the remaining 15 domain events will be quite mechanical. On the server side, we have to have a function per RPC call, largely with duplicated bodies (the key difference being that we store in our callback opaque pointer whether events should be fired with old or new style); meanwhile, a single function can drive multiple RPC messages. With a strategic choice of XDR struct layout, we can make the event generation code for both styles fairly compact. I debated about adding a tri-state witness variable per connection (values 'unknown', 'legacy', 'modern'). It would start as 'unknown', move to 'legacy' if any RPC call is made to a legacy event call, and move to 'modern' if the feature probe is made; then the event code could issue an error if the witness state is incorrect (a legacy RPC call while in 'modern', a modern RPC call while in 'unknown' or 'legacy', and a feature probe while in 'legacy' or 'modern'). But while it might prevent odd behavior caused by protocol fuzzing, I don't see that it would prevent any security holes, so I considered it bloat. Note that sticking @acl markers on the new RPCs generates unused functions in access/viraccessapicheck.c, because there is no new API call that needs to use the new checks; however, having a consistent .x file is worth the dead code. * src/libvirt_internal.h (VIR_DRV_FEATURE_REMOTE_EVENT_CALLBACK): New feature. * src/remote/remote_protocol.x (REMOTE_PROC_CONNECT_DOMAIN_EVENT_CALLBACK_REGISTER_ANY) (REMOTE_PROC_CONNECT_DOMAIN_EVENT_CALLBACK_DEREGISTER_ANY) (REMOTE_PROC_DOMAIN_EVENT_CALLBACK_LIFECYCLE): New RPCs. * daemon/remote.c (daemonClientCallback): Add field. (remoteDispatchConnectDomainEventCallbackRegisterAny) (remoteDispatchConnectDomainEventCallbackDeregisterAny): New functions. (remoteDispatchConnectDomainEventRegisterAny) (remoteDispatchConnectDomainEventDeregisterAny): Mark legacy use. (remoteRelayDomainEventLifecycle): Change message based on legacy or new use. (remoteDispatchConnectSupportsFeature): Advertise new feature. * src/remote_protocol-structs: Regenerate. Signed-off-by: Eric Blake <eblake@redhat.com>
289 lines
12 KiB
C
289 lines
12 KiB
C
/*
|
|
* libvirt_internal.h: internally exported APIs, not for public use
|
|
*
|
|
* Copyright (C) 2006-2014 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library. If not, see
|
|
* <http://www.gnu.org/licenses/>.
|
|
*
|
|
* NB This file is ABI sensitive. Things here impact the wire
|
|
* protocol ABI in the remote driver. Same rules as for things
|
|
* include/libvirt/libvirt.h apply. ie this file is *append* only
|
|
*/
|
|
|
|
#ifndef __LIBVIRT_H_
|
|
# define __LIBVIRT_H_
|
|
|
|
# include "internal.h"
|
|
|
|
typedef void (*virStateInhibitCallback)(bool inhibit,
|
|
void *opaque);
|
|
|
|
# ifdef WITH_LIBVIRTD
|
|
int virStateInitialize(bool privileged,
|
|
virStateInhibitCallback inhibit,
|
|
void *opaque);
|
|
int virStateCleanup(void);
|
|
int virStateReload(void);
|
|
int virStateStop(void);
|
|
# endif
|
|
|
|
/* Feature detection. This is a libvirt-private interface for determining
|
|
* what features are supported by the driver.
|
|
*
|
|
* The remote driver passes features through to the real driver at the
|
|
* remote end unmodified, except if you query a VIR_DRV_FEATURE_REMOTE*
|
|
* feature. Queries for VIR_DRV_FEATURE_PROGRAM* features are answered
|
|
* directly by the RPC layer and not by the real driver.
|
|
*/
|
|
enum {
|
|
/* Driver supports V1-style virDomainMigrate, ie. domainMigratePrepare/
|
|
* domainMigratePerform/domainMigrateFinish.
|
|
*/
|
|
VIR_DRV_FEATURE_MIGRATION_V1 = 1,
|
|
|
|
/* Driver is not local. */
|
|
VIR_DRV_FEATURE_REMOTE = 2,
|
|
|
|
/* Driver supports V2-style virDomainMigrate, ie. domainMigratePrepare2/
|
|
* domainMigratePerform/domainMigrateFinish2.
|
|
*/
|
|
VIR_DRV_FEATURE_MIGRATION_V2 = 3,
|
|
|
|
/* Driver supports peer-2-peer virDomainMigrate ie source host
|
|
* does all the prepare/perform/finish steps directly
|
|
*/
|
|
VIR_DRV_FEATURE_MIGRATION_P2P = 4,
|
|
|
|
/* Driver supports migration with only the source host involved,
|
|
* no libvirtd connetions on the destination at all, only the
|
|
* perform step is used.
|
|
*/
|
|
VIR_DRV_FEATURE_MIGRATION_DIRECT = 5,
|
|
|
|
/*
|
|
* Driver supports V3-style virDomainMigrate, ie domainMigrateBegin3/
|
|
* domainMigratePrepare3/domainMigratePerform3/domainMigrateFinish3/
|
|
* domainMigrateConfirm3.
|
|
*/
|
|
VIR_DRV_FEATURE_MIGRATION_V3 = 6,
|
|
|
|
/*
|
|
* Driver supports protecting the whole V3-style migration against changes
|
|
* to domain configuration, i.e., starting from Begin3 and not Perform3.
|
|
*/
|
|
VIR_DRV_FEATURE_MIGRATE_CHANGE_PROTECTION = 7,
|
|
|
|
/*
|
|
* Support for file descriptor passing
|
|
*/
|
|
VIR_DRV_FEATURE_FD_PASSING = 8,
|
|
|
|
/*
|
|
* Support for VIR_TYPED_PARAM_STRING
|
|
*/
|
|
VIR_DRV_FEATURE_TYPED_PARAM_STRING = 9,
|
|
|
|
/*
|
|
* Remote party supports keepalive program (i.e., sending keepalive
|
|
* messages).
|
|
*/
|
|
VIR_DRV_FEATURE_PROGRAM_KEEPALIVE = 10,
|
|
|
|
/*
|
|
* Support for VIR_DOMAIN_XML_MIGRATABLE flag in domainGetXMLDesc
|
|
*/
|
|
VIR_DRV_FEATURE_XML_MIGRATABLE = 11,
|
|
|
|
/*
|
|
* Support for offline migration.
|
|
*/
|
|
VIR_DRV_FEATURE_MIGRATION_OFFLINE = 12,
|
|
|
|
/*
|
|
* Support for migration parameters.
|
|
*/
|
|
VIR_DRV_FEATURE_MIGRATION_PARAMS = 13,
|
|
|
|
/*
|
|
* Support for server-side event filtering via callback ids in events.
|
|
*/
|
|
VIR_DRV_FEATURE_REMOTE_EVENT_CALLBACK = 14,
|
|
};
|
|
|
|
|
|
int virConnectSupportsFeature(virConnectPtr conn, int feature);
|
|
|
|
int virDomainMigratePrepare (virConnectPtr dconn,
|
|
char **cookie,
|
|
int *cookielen,
|
|
const char *uri_in,
|
|
char **uri_out,
|
|
unsigned long flags,
|
|
const char *dname,
|
|
unsigned long resource);
|
|
int virDomainMigratePerform (virDomainPtr domain,
|
|
const char *cookie,
|
|
int cookielen,
|
|
const char *uri,
|
|
unsigned long flags,
|
|
const char *dname,
|
|
unsigned long resource);
|
|
virDomainPtr virDomainMigrateFinish (virConnectPtr dconn,
|
|
const char *dname,
|
|
const char *cookie,
|
|
int cookielen,
|
|
const char *uri,
|
|
unsigned long flags);
|
|
int virDomainMigratePrepare2 (virConnectPtr dconn,
|
|
char **cookie,
|
|
int *cookielen,
|
|
const char *uri_in,
|
|
char **uri_out,
|
|
unsigned long flags,
|
|
const char *dname,
|
|
unsigned long resource,
|
|
const char *dom_xml);
|
|
virDomainPtr virDomainMigrateFinish2 (virConnectPtr dconn,
|
|
const char *dname,
|
|
const char *cookie,
|
|
int cookielen,
|
|
const char *uri,
|
|
unsigned long flags,
|
|
int retcode);
|
|
int virDomainMigratePrepareTunnel(virConnectPtr dconn,
|
|
virStreamPtr st,
|
|
unsigned long flags,
|
|
const char *dname,
|
|
unsigned long resource,
|
|
const char *dom_xml);
|
|
|
|
|
|
char *virDomainMigrateBegin3(virDomainPtr domain,
|
|
const char *xmlin,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
unsigned long flags,
|
|
const char *dname,
|
|
unsigned long resource);
|
|
|
|
int virDomainMigratePrepare3(virConnectPtr dconn,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
const char *uri_in,
|
|
char **uri_out,
|
|
unsigned long flags,
|
|
const char *dname,
|
|
unsigned long resource,
|
|
const char *dom_xml);
|
|
|
|
int virDomainMigratePrepareTunnel3(virConnectPtr dconn,
|
|
virStreamPtr st,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
unsigned long flags,
|
|
const char *dname,
|
|
unsigned long resource,
|
|
const char *dom_xml);
|
|
|
|
|
|
int virDomainMigratePerform3(virDomainPtr dom,
|
|
const char *xmlin,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
const char *dconnuri, /* libvirtd URI if Peer2Peer, NULL otherwise */
|
|
const char *uri, /* VM Migration URI */
|
|
unsigned long flags,
|
|
const char *dname,
|
|
unsigned long resource);
|
|
|
|
virDomainPtr virDomainMigrateFinish3(virConnectPtr dconn,
|
|
const char *dname,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
const char *dconnuri, /* libvirtd URI if Peer2Peer, NULL otherwise */
|
|
const char *uri, /* VM Migration URI, NULL in tunnelled case */
|
|
unsigned long flags,
|
|
int cancelled); /* Kill the dst VM */
|
|
|
|
int virDomainMigrateConfirm3(virDomainPtr domain,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
unsigned long flags,
|
|
int restart); /* Restart the src VM */
|
|
|
|
char *virDomainMigrateBegin3Params(virDomainPtr domain,
|
|
virTypedParameterPtr params,
|
|
int nparams,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
unsigned int flags);
|
|
|
|
int virDomainMigratePrepare3Params(virConnectPtr dconn,
|
|
virTypedParameterPtr params,
|
|
int nparams,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
char **uri_out,
|
|
unsigned int flags);
|
|
|
|
int virDomainMigratePrepareTunnel3Params(virConnectPtr conn,
|
|
virStreamPtr st,
|
|
virTypedParameterPtr params,
|
|
int nparams,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
unsigned int flags);
|
|
|
|
int virDomainMigratePerform3Params(virDomainPtr domain,
|
|
const char *dconnuri,
|
|
virTypedParameterPtr params,
|
|
int nparams,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
unsigned int flags);
|
|
|
|
virDomainPtr virDomainMigrateFinish3Params(virConnectPtr dconn,
|
|
virTypedParameterPtr params,
|
|
int nparams,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
char **cookieout,
|
|
int *cookieoutlen,
|
|
unsigned int flags,
|
|
int cancelled);
|
|
|
|
int virDomainMigrateConfirm3Params(virDomainPtr domain,
|
|
virTypedParameterPtr params,
|
|
int nparams,
|
|
const char *cookiein,
|
|
int cookieinlen,
|
|
unsigned int flags,
|
|
int cancelled);
|
|
#endif
|