Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com> --- src/bhyve/bhyve_command.c | 12 ++++++++++++ src/bhyve/bhyve_command.h | 3 +++ src/bhyve/bhyve_driver.c | 28 ++++++++++++++++++++++++++++ src/bhyve/bhyve_process.c | 11 +++++++++++ src/bhyve/bhyve_process.h | 3 +++ 5 files changed, 57 insertions(+) diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index 41c3767c3e..e3133c4b62 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -1346,6 +1346,18 @@ virBhyveProcessBuildDestroyCmd(struct _bhyveConn *driver G_GNUC_UNUSED, return cmd; } +virCommand * +virBhyveProcessBuildResetCmd(struct _bhyveConn *driver G_GNUC_UNUSED, + virDomainDef *def) +{ + virCommand *cmd = virCommandNew("bhyvectl"); + + virCommandAddArg(cmd, "--force-reset"); + virCommandAddArgPair(cmd, "--vm", def->name); + + return cmd; +} + static void virAppendBootloaderArgs(virCommand *cmd, virDomainDef *def) { diff --git a/src/bhyve/bhyve_command.h b/src/bhyve/bhyve_command.h index 45c6a1a57c..e946090411 100644 --- a/src/bhyve/bhyve_command.h +++ b/src/bhyve/bhyve_command.h @@ -40,3 +40,6 @@ virBhyveProcessBuildDestroyCmd(struct _bhyveConn *driver, virCommand * virBhyveProcessBuildLoadCmd(struct _bhyveConn *driver, virDomainDef *def, const char *devmap_file, char **devicesmap_out); + +virCommand * +virBhyveProcessBuildResetCmd(struct _bhyveConn *driver, virDomainDef *def); diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index f48543e205..3058420bae 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -3201,6 +3201,33 @@ bhyveDomainGetGuestInfo(virDomainPtr domain, goto cleanup; } + +static int +bhyveDomainReset(virDomainPtr domain, unsigned int flags) +{ + virDomainObj *vm; + struct _bhyveConn *privconn = domain->conn->privateData; + int ret = -1; + + virCheckFlags(0, -1); + + if (!(vm = bhyveDomObjFromDomain(domain))) + goto cleanup; + + if (virDomainResetEnsureACL(domain->conn, vm->def) < 0) + goto cleanup; + + if (virDomainObjCheckActive(vm) < 0) + goto cleanup; + + ret = virBhyveProcessReset(privconn, vm); + + cleanup: + virDomainObjEndAPI(&vm); + return ret; +} + + static virHypervisorDriver bhyveHypervisorDriver = { .name = "bhyve", .connectURIProbe = bhyveConnectURIProbe, @@ -3282,6 +3309,7 @@ static virHypervisorDriver bhyveHypervisorDriver = { .domainAgentSetResponseTimeout = bhyveDomainAgentSetResponseTimeout, /* 12.7.0 */ .domainGetGuestInfo = bhyveDomainGetGuestInfo, /* 12.7.0 */ .domainSetLifecycleAction = bhyveDomainSetLifecycleAction, /* 12.8.0 */ + .domainReset = bhyveDomainReset, /* 12.9.0 */ }; diff --git a/src/bhyve/bhyve_process.c b/src/bhyve/bhyve_process.c index c42d9ec092..170889f651 100644 --- a/src/bhyve/bhyve_process.c +++ b/src/bhyve/bhyve_process.c @@ -788,6 +788,17 @@ virBhyveProcessRestart(struct _bhyveConn *driver, return 0; } +int +virBhyveProcessReset(struct _bhyveConn *driver, virDomainObj *vm) +{ + g_autoptr(virCommand) cmd = virBhyveProcessBuildResetCmd(driver, vm->def); + + if (virCommandRun(cmd, NULL) < 0) + return -1; + + return 0; +} + int virBhyveGetDomainTotalCpuStats(virDomainObj *vm, unsigned long long *cpustats) diff --git a/src/bhyve/bhyve_process.h b/src/bhyve/bhyve_process.h index 339e5d429a..832925851c 100644 --- a/src/bhyve/bhyve_process.h +++ b/src/bhyve/bhyve_process.h @@ -50,6 +50,9 @@ int virBhyveProcessStop(struct _bhyveConn *driver, int virBhyveProcessRestart(struct _bhyveConn *driver, virDomainObj *vm); +int virBhyveProcessReset(struct _bhyveConn *driver, + virDomainObj *vm); + int virBhyveProcessShutdown(virDomainObj *vm); int virBhyveGetDomainTotalCpuStats(virDomainObj *vm, -- 2.55.0