Instead of hardcoded actions for poweroff, reboot and crash.
Known limitations:
1. Crash actions not fully implemented (namely no coredump done).
2. VIR_DOMAIN_LIFECYCLE_PRESERVE emit VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN
event but do not mark domain object as stopped. So effectively use of
'preserve' can cause Weird Effects (tm).
Signed-off-by: Marek Marczykowski-Górecki <marmarek(a)invisiblethingslab.com>
---
src/libxl/libxl_driver.c | 54 +++++++++++++++++++++++++++++++++++++++---------
1 file changed, 44 insertions(+), 10 deletions(-)
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 448db73..04142bb 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -721,7 +721,8 @@ libxlEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event
*event)
libxl_shutdown_reason xl_reason = event->u.domain_shutdown.shutdown_reason;
if (event->type == LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
- virDomainShutoffReason reason;
+ virDomainShutoffReason reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
+ int action = VIR_DOMAIN_LIFECYCLE_DESTROY;
/*
* Similar to the xl implementation, ignore SUSPEND. Any actions needed
@@ -739,27 +740,60 @@ libxlEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event
*event)
switch (xl_reason) {
case LIBXL_SHUTDOWN_REASON_POWEROFF:
+ reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
+ action = vm->def->onPoweroff;
+ break;
case LIBXL_SHUTDOWN_REASON_CRASH:
- if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) {
- dom_event = virDomainEventNewFromObj(vm,
- VIR_DOMAIN_EVENT_STOPPED,
- VIR_DOMAIN_EVENT_STOPPED_CRASHED);
- reason = VIR_DOMAIN_SHUTOFF_CRASHED;
- } else {
- reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
+ dom_event = virDomainEventNewFromObj(vm,
+ VIR_DOMAIN_EVENT_STOPPED,
+ VIR_DOMAIN_EVENT_STOPPED_CRASHED);
+ reason = VIR_DOMAIN_SHUTOFF_CRASHED;
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY:
+ /* TODO: coredump here */
+ VIR_ERROR("Coredump on crash not supported yet");
+ action = VIR_DOMAIN_LIFECYCLE_DESTROY;
+ break;
+ case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_RESTART:
+ /* TODO: coredump here */
+ VIR_ERROR("Coredump on crash not supported yet");
+ action = VIR_DOMAIN_LIFECYCLE_RESTART;
+ break;
+ default:
+ action = vm->def->onCrash;
+ break;
}
+ break;
+ case LIBXL_SHUTDOWN_REASON_REBOOT:
+ reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
+ action = vm->def->onReboot;
+ break;
+ default:
+ VIR_INFO("Unhandled shutdown_reason %d", xl_reason);
+ break;
+ }
+ switch (action) {
+ case VIR_DOMAIN_LIFECYCLE_DESTROY:
libxlVmReap(driver, vm, reason);
if (!vm->persistent) {
virDomainObjListRemove(driver->domains, vm);
vm = NULL;
}
break;
- case LIBXL_SHUTDOWN_REASON_REBOOT:
+ case VIR_DOMAIN_LIFECYCLE_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME:
libxlVmReap(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
libxlVmStart(driver, vm, 0, -1);
break;
+ case VIR_DOMAIN_LIFECYCLE_PRESERVE:
+ if (xl_reason != LIBXL_SHUTDOWN_REASON_CRASH) {
+ dom_event = virDomainEventNewFromObj(vm,
+ VIR_DOMAIN_EVENT_STOPPED,
+ VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
+ }
+ break;
default:
- VIR_INFO("Unhandled shutdown_reason %d", xl_reason);
+ VIR_INFO("Unsupported shutdown action: %d", action);
break;
}
}
--
1.8.1.4