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 <[email protected]>
---
 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

Reply via email to