Signed-off-by: Ryan Moeller <r...@ixsystems.com>
---
 src/bhyve/bhyve_process.c | 33 +++++++++++++++++++++++++++++++++
 src/util/virhook.c        | 15 +++++++++++++++
 src/util/virhook.h        | 11 +++++++++++
 3 files changed, 59 insertions(+)

diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c
index a11f75a894..45162503d4 100644
--- a/src/bhyve/bhyve_process.c
+++ b/src/bhyve/bhyve_process.c
@@ -37,6 +37,7 @@
 #include "bhyve_process.h"
 #include "datatypes.h"
 #include "virerror.h"
+#include "virhook.h"
 #include "virlog.h"
 #include "virfile.h"
 #include "viralloc.h"
@@ -91,6 +92,24 @@ virBhyveFormatDevMapFile(const char *vm_name, char **fn_out)
     *fn_out = g_strdup_printf("%s/grub_bhyve-%s-device.map", BHYVE_STATE_DIR, 
vm_name);
 }
 
+static int
+bhyveProcessStartHook(virDomainObjPtr vm, virHookBhyveOpType op)
+{
+    if (!virHookPresent(VIR_HOOK_DRIVER_BHYVE))
+        return 0;
+
+    return virHookCall(VIR_HOOK_DRIVER_BHYVE, vm->def->name, op,
+                       VIR_HOOK_SUBOP_BEGIN, NULL, NULL, NULL);
+}
+
+static void
+bhyveProcessStopHook(virDomainObjPtr vm, virHookBhyveOpType op)
+{
+    if (virHookPresent(VIR_HOOK_DRIVER_BHYVE))
+        virHookCall(VIR_HOOK_DRIVER_BHYVE, vm->def->name, op,
+                    VIR_HOOK_SUBOP_END, NULL, NULL, NULL);
+}
+
 int
 virBhyveProcessStart(virConnectPtr conn,
                      virDomainObjPtr vm,
@@ -135,6 +154,10 @@ virBhyveProcessStart(virConnectPtr conn,
     if (bhyveDomainAssignAddresses(vm->def, NULL) < 0)
         goto cleanup;
 
+    /* Run an early hook to setup missing devices. */
+    if (bhyveProcessStartHook(vm, VIR_HOOK_BHYVE_OP_PREPARE) < 0)
+        goto cleanup;
+
     /* Call bhyve to start the VM */
     if (!(cmd = virBhyveProcessBuildBhyveCmd(driver, vm->def, false)))
         goto cleanup;
@@ -176,6 +199,9 @@ virBhyveProcessStart(virConnectPtr conn,
             goto cleanup;
     }
 
+    if (bhyveProcessStartHook(vm, VIR_HOOK_BHYVE_OP_START) < 0)
+        goto cleanup;
+
     /* Now we can start the domain */
     VIR_DEBUG("Starting domain '%s'", vm->def->name);
     if (virCommandRun(cmd, NULL) < 0)
@@ -200,6 +226,9 @@ virBhyveProcessStart(virConnectPtr conn,
                          BHYVE_STATE_DIR) < 0)
         goto cleanup;
 
+    if (bhyveProcessStartHook(vm, VIR_HOOK_BHYVE_OP_STARTED) < 0)
+        goto cleanup;
+
     ret = 0;
 
  cleanup:
@@ -263,6 +292,8 @@ virBhyveProcessStop(bhyveConnPtr driver,
     if ((priv != NULL) && (priv->mon != NULL))
          bhyveMonitorClose(priv->mon);
 
+    bhyveProcessStopHook(vm, VIR_HOOK_BHYVE_OP_STOPPED);
+
     /* Cleanup network interfaces */
     bhyveNetCleanup(vm);
 
@@ -284,6 +315,8 @@ virBhyveProcessStop(bhyveConnPtr driver,
     vm->pid = -1;
     vm->def->id = -1;
 
+    bhyveProcessStopHook(vm, VIR_HOOK_BHYVE_OP_RELEASE);
+
  cleanup:
     virCommandFree(cmd);
 
diff --git a/src/util/virhook.c b/src/util/virhook.c
index 5bdacdd79f..e499841f66 100644
--- a/src/util/virhook.c
+++ b/src/util/virhook.c
@@ -47,6 +47,7 @@ VIR_ENUM_DECL(virHookQemuOp);
 VIR_ENUM_DECL(virHookLxcOp);
 VIR_ENUM_DECL(virHookNetworkOp);
 VIR_ENUM_DECL(virHookLibxlOp);
+VIR_ENUM_DECL(virHookBhyveOp);
 
 VIR_ENUM_IMPL(virHookDriver,
               VIR_HOOK_DRIVER_LAST,
@@ -55,6 +56,7 @@ VIR_ENUM_IMPL(virHookDriver,
               "lxc",
               "network",
               "libxl",
+              "bhyve",
 );
 
 VIR_ENUM_IMPL(virHookDaemonOp,
@@ -115,6 +117,15 @@ VIR_ENUM_IMPL(virHookLibxlOp,
               "reconnect",
 );
 
+VIR_ENUM_IMPL(virHookBhyveOp,
+              VIR_HOOK_BHYVE_OP_LAST,
+              "start",
+              "stopped",
+              "prepare",
+              "release",
+              "started",
+);
+
 static int virHooksFound = -1;
 
 /**
@@ -283,6 +294,10 @@ virHookCall(int driver,
             break;
         case VIR_HOOK_DRIVER_NETWORK:
             opstr = virHookNetworkOpTypeToString(op);
+            break;
+        case VIR_HOOK_DRIVER_BHYVE:
+            opstr = virHookBhyveOpTypeToString(op);
+            break;
     }
     if (opstr == NULL) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
diff --git a/src/util/virhook.h b/src/util/virhook.h
index f91cb87b10..d8237c837e 100644
--- a/src/util/virhook.h
+++ b/src/util/virhook.h
@@ -29,6 +29,7 @@ typedef enum {
     VIR_HOOK_DRIVER_LXC,               /* LXC domains related events */
     VIR_HOOK_DRIVER_NETWORK,           /* network related events */
     VIR_HOOK_DRIVER_LIBXL,             /* Xen libxl domains related events */
+    VIR_HOOK_DRIVER_BHYVE,             /* Bhyve domains related events */
 
     VIR_HOOK_DRIVER_LAST,
 } virHookDriverType;
@@ -97,6 +98,16 @@ typedef enum {
     VIR_HOOK_LIBXL_OP_LAST,
 } virHookLibxlOpType;
 
+typedef enum {
+    VIR_HOOK_BHYVE_OP_START,            /* domain is about to start */
+    VIR_HOOK_BHYVE_OP_STOPPED,          /* domain has stopped */
+    VIR_HOOK_BHYVE_OP_PREPARE,          /* domain startup initiated */
+    VIR_HOOK_BHYVE_OP_RELEASE,          /* domain destruction is over */
+    VIR_HOOK_BHYVE_OP_STARTED,          /* domain has started */
+
+    VIR_HOOK_BHYVE_OP_LAST,
+} virHookBhyveOpType;
+
 int virHookInitialize(void);
 
 int virHookPresent(int driver);
-- 
2.24.1


Reply via email to