Signed-off-by: Roman Bogorodskiy <[email protected]>
---
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