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