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

Reply via email to