[PATCH 1/2] bhyve: respect domain's on_poweroff action
Currently, the bhyve driver shutdown implementation does not take into account domain's on_poweroff action. Update it so it reboots a domain on shutdown when it is configured this way. Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com> --- src/bhyve/bhyve_driver.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 2e7a534396..1f904d8958 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -1077,18 +1077,30 @@ bhyveDomainShutdownFlags(virDomainPtr dom, unsigned int flags) { virDomainObj *vm; int ret = -1; + bhyveDomainObjPrivate *priv; + bool isReboot = false; virCheckFlags(0, -1); if (!(vm = bhyveDomObjFromDomain(dom))) goto cleanup; + if (vm->def->onPoweroff == VIR_DOMAIN_LIFECYCLE_ACTION_RESTART || + vm->def->onPoweroff == VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME) { + isReboot = true; + VIR_INFO("Domain on_poweroff setting overridden, attempting reboot"); + } + if (virDomainShutdownFlagsEnsureACL(dom->conn, vm->def, flags) < 0) goto cleanup; if (virDomainObjCheckActive(vm) < 0) goto cleanup; + if (isReboot) { + priv = vm->privateData; + bhyveMonitorSetReboot(priv->mon); + } ret = virBhyveProcessShutdown(vm); cleanup: -- 2.52.0
Currently, the bhyve driver reboot implementation does not take into account domain's on_reboot action. Update it so it shuts a domain down on reboot when it is configured this way. Additionally, introduce the bhyveDomainShutdownSignal() helper which shares a common shutdown and reboot implementation using a signal. Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com> --- src/bhyve/bhyve_driver.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 1f904d8958..0761e2682e 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -1072,12 +1072,25 @@ bhyveDomainDestroy(virDomainPtr dom) return bhyveDomainDestroyFlags(dom, 0); } +static int +bhyveDomainShutdownSignal(virDomainObj *vm, + bool isReboot) +{ + bhyveDomainObjPrivate *priv; + + if (isReboot) { + priv = vm->privateData; + bhyveMonitorSetReboot(priv->mon); + } + + return virBhyveProcessShutdown(vm); +} + static int bhyveDomainShutdownFlags(virDomainPtr dom, unsigned int flags) { virDomainObj *vm; int ret = -1; - bhyveDomainObjPrivate *priv; bool isReboot = false; virCheckFlags(0, -1); @@ -1097,11 +1110,7 @@ bhyveDomainShutdownFlags(virDomainPtr dom, unsigned int flags) if (virDomainObjCheckActive(vm) < 0) goto cleanup; - if (isReboot) { - priv = vm->privateData; - bhyveMonitorSetReboot(priv->mon); - } - ret = virBhyveProcessShutdown(vm); + ret = bhyveDomainShutdownSignal(vm, isReboot); cleanup: virDomainObjEndAPI(&vm); @@ -1119,7 +1128,7 @@ bhyveDomainReboot(virDomainPtr dom, unsigned int flags) { virConnectPtr conn = dom->conn; virDomainObj *vm; - bhyveDomainObjPrivate *priv; + bool isReboot = true; int ret = -1; virCheckFlags(VIR_DOMAIN_REBOOT_ACPI_POWER_BTN, -1); @@ -1127,16 +1136,19 @@ bhyveDomainReboot(virDomainPtr dom, unsigned int flags) if (!(vm = bhyveDomObjFromDomain(dom))) goto cleanup; + if (vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY || + vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE) { + isReboot = false; + VIR_INFO("Domain on_reboot setting overridden, shutting down"); + } + if (virDomainRebootEnsureACL(conn, vm->def, flags) < 0) goto cleanup; if (virDomainObjCheckActive(vm) < 0) goto cleanup; - priv = vm->privateData; - bhyveMonitorSetReboot(priv->mon); - - ret = virBhyveProcessShutdown(vm); + ret = bhyveDomainShutdownSignal(vm, isReboot); cleanup: virDomainObjEndAPI(&vm); -- 2.52.0
participants (1)
-
Roman Bogorodskiy