diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index b7e145e0fa..58d86f9535 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1622,6 +1622,13 @@ domain will be restarted with the same configuration +

+ Since 3.9.0, the lifecycle events can + be configured via the + + virDomainSetLifecycleAction API. +

+

The on_lockfailure element (since 1.0.0) may be used to configure what action should be diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index 9fb94a9837..4048acf38a 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -4728,4 +4728,32 @@ int virDomainSetBlockThreshold(virDomainPtr domain, unsigned long long threshold, unsigned int flags); +typedef enum { + VIR_DOMAIN_LIFECYCLE_POWEROFF = 0, + VIR_DOMAIN_LIFECYCLE_REBOOT = 1, + VIR_DOMAIN_LIFECYCLE_CRASH = 2, + +# ifdef VIR_ENUM_SENTINELS + VIR_DOMAIN_LIFECYCLE_LAST +# endif +} virDomainLifecycle; + +typedef enum { + VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY = 0, + VIR_DOMAIN_LIFECYCLE_ACTION_RESTART = 1, + VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME = 2, + VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE = 3, + VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY = 4, + VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART = 5, + +# ifdef VIR_ENUM_SENTINELS + VIR_DOMAIN_LIFECYCLE_ACTION_LAST +# endif +} virDomainLifecycleAction; + +int virDomainSetLifecycleAction(virDomainPtr domain, + unsigned int type, + unsigned int action, + unsigned int flags); + #endif /* __VIR_LIBVIRT_DOMAIN_H__ */ diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 38b966f6de..8240433611 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1791,25 +1791,6 @@ typedef enum { VIR_DOMAIN_CAPS_FEATURE_LAST } virDomainCapsFeature; -typedef enum { - VIR_DOMAIN_LIFECYCLE_POWEROFF, - VIR_DOMAIN_LIFECYCLE_REBOOT, - VIR_DOMAIN_LIFECYCLE_CRASH, - - VIR_DOMAIN_LIFECYCLE_LAST -} virDomainLifecycle; - -typedef enum { - VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY, - VIR_DOMAIN_LIFECYCLE_ACTION_RESTART, - VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME, - VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE, - VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY, - VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART, - - VIR_DOMAIN_LIFECYCLE_ACTION_LAST -} virDomainLifecycleAction; - typedef enum { VIR_DOMAIN_LOCK_FAILURE_DEFAULT, VIR_DOMAIN_LOCK_FAILURE_POWEROFF, diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h index 4de0581c3f..ce0e2b2525 100644 --- a/src/driver-hypervisor.h +++ b/src/driver-hypervisor.h @@ -1277,6 +1277,12 @@ typedef int unsigned long long threshold, unsigned int flags); +typedef int +(*virDrvDomainSetLifecycleAction)(virDomainPtr domain, + unsigned int type, + unsigned int action, + unsigned int flags); + typedef struct _virHypervisorDriver virHypervisorDriver; typedef virHypervisorDriver *virHypervisorDriverPtr; @@ -1521,6 +1527,7 @@ struct _virHypervisorDriver { virDrvDomainSetGuestVcpus domainSetGuestVcpus; virDrvDomainSetVcpu domainSetVcpu; virDrvDomainSetBlockThreshold domainSetBlockThreshold; + virDrvDomainSetLifecycleAction domainSetLifecycleAction; }; diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index fc2e4ce381..a51d8e3820 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -12035,3 +12035,59 @@ virDomainSetBlockThreshold(virDomainPtr domain, virDispatchError(domain->conn); return -1; } + + +/** + * virDomainSetLifecycleAction: + * @domain: pointer to domain object + * @type: the lifecycle type from virDomainLifecycle + * @action: the action type from virDomainLifecycleAction + * @flags: bitwise-OR of virDomainModificationImpact + * + * Changes the actions of lifecycle events for domain represented as + * $action in the domain XML. + * + * Returns 0 on success, -1 on failure. + */ +int virDomainSetLifecycleAction(virDomainPtr domain, + unsigned int type, + unsigned int action, + unsigned int flags) +{ + VIR_DOMAIN_DEBUG(domain, "type='%u' action='%u' flags='0x%x'", + type, action, flags); + + virResetLastError(); + + virCheckDomainReturn(domain, -1); + virCheckReadOnlyGoto(domain->conn->flags, error); + + if (type >= VIR_DOMAIN_LIFECYCLE_LAST) { + virReportError(VIR_ERR_INVALID_ARG, + _("invalid lifecycle type '%u'"), type); + goto error; + } + + if (action >= VIR_DOMAIN_LIFECYCLE_ACTION_LAST) { + virReportError(VIR_ERR_INVALID_ARG, + _("invalid lifecycle action '%u'"), action); + goto error; + } + + if (domain->conn->driver->domainSetLifecycleAction) { + int ret; + ret = domain->conn->driver->domainSetLifecycleAction(domain, + type, + action, + flags); + if (ret < 0) + goto error; + return ret; + } + + virReportUnsupportedError(); + + error: + virDispatchError(domain->conn); + return -1; +} diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index 4986019431..0efde25a7f 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -774,4 +774,9 @@ LIBVIRT_3.7.0 { virDomainManagedSaveGetXMLDesc; virDomainManagedSaveDefineXML; } LIBVIRT_3.4.0; + +LIBVIRT_3.9.0 { + global: + virDomainSetLifecycleAction; +} LIBVIRT_3.7.0; # .... define new API here using predicted next version number .... diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 00e8086d51..06719bb825 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -8497,6 +8497,7 @@ static virHypervisorDriver hypervisor_driver = { .domainSetGuestVcpus = remoteDomainSetGuestVcpus, /* 2.0.0 */ .domainSetVcpu = remoteDomainSetVcpu, /* 3.1.0 */ .domainSetBlockThreshold = remoteDomainSetBlockThreshold, /* 3.2.0 */ + .domainSetLifecycleAction = remoteDomainSetLifecycleAction /* 3.9.0 */ }; static virNetworkDriver network_driver = { diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index e3014f66bc..0aed25220d 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -3433,6 +3433,12 @@ struct remote_domain_set_block_threshold_args { unsigned int flags; }; +struct remote_domain_set_lifecycle_action_args { + remote_nonnull_domain dom; + unsigned int type; + unsigned int action; + unsigned int flags; +}; /*----- Protocol. -----*/ @@ -6108,5 +6114,11 @@ enum remote_procedure { * @acl: domain:write * @acl: domain:hibernate */ - REMOTE_PROC_DOMAIN_MANAGED_SAVE_DEFINE_XML = 389 + REMOTE_PROC_DOMAIN_MANAGED_SAVE_DEFINE_XML = 389, + + /** + * @generate: both + * @acl: domain:write + */ + REMOTE_PROC_DOMAIN_SET_LIFECYCLE_ACTION = 390 }; diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index dc78d51c4a..59b0acec69 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -2865,6 +2865,12 @@ struct remote_domain_set_block_threshold_args { uint64_t threshold; u_int flags; }; +struct remote_domain_set_lifecycle_action_args { + remote_nonnull_domain dom; + u_int type; + u_int action; + u_int flags; +}; enum remote_procedure { REMOTE_PROC_CONNECT_OPEN = 1, REMOTE_PROC_CONNECT_CLOSE = 2, @@ -3255,4 +3261,5 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_MIGRATE_GET_MAX_DOWNTIME = 387, REMOTE_PROC_DOMAIN_MANAGED_SAVE_GET_XML_DESC = 388, REMOTE_PROC_DOMAIN_MANAGED_SAVE_DEFINE_XML = 389, + REMOTE_PROC_DOMAIN_SET_LIFECYCLE_ACTION = 390, };