#include "bhyve_process.h"
#include "datatypes.h"
#include "virerror.h"
+#include "virhook.h"
#include "virlog.h"
#include "virfile.h"
#include "viralloc.h"
*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,
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;
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)
BHYVE_STATE_DIR) < 0)
goto cleanup;
+ if (bhyveProcessStartHook(vm, VIR_HOOK_BHYVE_OP_STARTED) < 0)
+ goto cleanup;
+
ret = 0;
cleanup:
if ((priv != NULL) && (priv->mon != NULL))
bhyveMonitorClose(priv->mon);
+ bhyveProcessStopHook(vm, VIR_HOOK_BHYVE_OP_STOPPED);
+
/* Cleanup network interfaces */
bhyveNetCleanup(vm);
vm->pid = -1;
vm->def->id = -1;
+ bhyveProcessStopHook(vm, VIR_HOOK_BHYVE_OP_RELEASE);
+
cleanup:
virCommandFree(cmd);
VIR_ENUM_DECL(virHookLxcOp);
VIR_ENUM_DECL(virHookNetworkOp);
VIR_ENUM_DECL(virHookLibxlOp);
+VIR_ENUM_DECL(virHookBhyveOp);
VIR_ENUM_IMPL(virHookDriver,
VIR_HOOK_DRIVER_LAST,
"lxc",
"network",
"libxl",
+ "bhyve",
);
VIR_ENUM_IMPL(virHookDaemonOp,
"reconnect",
);
+VIR_ENUM_IMPL(virHookBhyveOp,
+ VIR_HOOK_BHYVE_OP_LAST,
+ "start",
+ "stopped",
+ "prepare",
+ "release",
+ "started",
+);
+
static int virHooksFound = -1;
/**
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,
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;
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);