lib: introduce virDomainSetLifecycleAction() API

Reviewed-by: John Ferlan <jferlan@redhat.com>
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Pavel Hrdina 2017-10-11 14:02:01 +02:00
parent 17f1a647a0
commit 1a2f34e363
9 changed files with 124 additions and 20 deletions

View File

@ -1622,6 +1622,13 @@
domain will be restarted with the same configuration</dd>
</dl>
<p>
<span class="since">Since 3.9.0</span>, the lifecycle events can
be configured via the
<a href="html/libvirt-libvirt-domain.html#virDomainSetLifecycleAction">
<code>virDomainSetLifecycleAction</code></a> API.
</p>
<p>
The <code>on_lockfailure</code> element (<span class="since">since
1.0.0</span>) may be used to configure what action should be

View File

@ -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__ */

View File

@ -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,

View File

@ -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;
};

View File

@ -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
* <on_$type>$action</on_$type> 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;
}

View File

@ -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 ....

View File

@ -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 = {

View File

@ -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
};

View File

@ -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,
};