Implement virDomainSetLifecycleAction() API for the bhyve driver.
Support both config and live configuration update.

Signed-off-by: Roman Bogorodskiy <[email protected]>
---
 src/bhyve/bhyve_driver.c | 110 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 110 insertions(+)

diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c
index 668e46ad37..feeb140ba4 100644
--- a/src/bhyve/bhyve_driver.c
+++ b/src/bhyve/bhyve_driver.c
@@ -2807,6 +2807,115 @@ bhyveDomainRename(virDomainPtr domain,
     return ret;
 }
 
+static int
+bhyveDomainSetLifecycleActionValidate(virDomainDef *def,
+                                      virDomainLifecycle type,
+                                      virDomainLifecycleAction action)
+{
+    virDomainLifecycleAction onPoweroff = def->onPoweroff;
+    virDomainLifecycleAction onReboot = def->onReboot;
+    virDomainLifecycleAction onCrash = def->onCrash;
+
+    switch (type) {
+    case VIR_DOMAIN_LIFECYCLE_POWEROFF:
+        onPoweroff = action;
+        break;
+    case VIR_DOMAIN_LIFECYCLE_REBOOT:
+        onReboot = action;
+        break;
+    case VIR_DOMAIN_LIFECYCLE_CRASH:
+        onCrash = action;
+        break;
+    case VIR_DOMAIN_LIFECYCLE_LAST:
+        break;
+    }
+
+    if (bhyveValidateLifecycleAction(onPoweroff, onReboot, onCrash) < 0)
+        return -1;
+
+    return 0;
+}
+
+static void
+bhyveDomainModifyLifecycleAction(virDomainDef *def,
+                                 virDomainLifecycle type,
+                                 virDomainLifecycleAction action)
+{
+    switch (type) {
+        case VIR_DOMAIN_LIFECYCLE_POWEROFF:
+            def->onPoweroff = action;
+            break;
+        case VIR_DOMAIN_LIFECYCLE_REBOOT:
+            def->onReboot = action;
+            break;
+        case VIR_DOMAIN_LIFECYCLE_CRASH:
+            def->onCrash = action;
+            break;
+        case VIR_DOMAIN_LIFECYCLE_LAST:
+            break;
+    }
+}
+
+static int
+bhyveDomainSetLifecycleAction(virDomainPtr domain,
+                              unsigned int type,
+                              unsigned int action,
+                              unsigned int flags)
+{
+    struct _bhyveConn *privconn = domain->conn->privateData;
+    virDomainObj *vm = NULL;
+    virDomainDef *def = NULL;
+    virDomainDef *persistentDef = NULL;
+    int ret = -1;
+
+    virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
+                  VIR_DOMAIN_AFFECT_CONFIG, -1);
+
+    if (!virDomainDefLifecycleActionAllowed(type, action))
+        goto cleanup;
+
+    if (!(vm = bhyveDomObjFromDomain(domain)))
+        return -1;
+
+    if (virDomainSetLifecycleActionEnsureACL(domain->conn, vm->def) < 0)
+        goto cleanup;
+
+    if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
+        goto cleanup;
+
+    if (virDomainObjGetDefs(vm, flags, &def, &persistentDef) < 0)
+        goto endjob;
+
+    if ((def && bhyveDomainSetLifecycleActionValidate(def, type, action) < 0) 
||
+         (persistentDef && 
bhyveDomainSetLifecycleActionValidate(persistentDef, type, action) < 0))
+        goto endjob;
+
+    if (def) {
+        bhyveDomainModifyLifecycleAction(def, type, action);
+
+        if (virDomainObjSave(vm, privconn->xmlopt,
+                             BHYVE_STATE_DIR) < 0)
+            goto endjob;
+    }
+
+    if (persistentDef) {
+        bhyveDomainModifyLifecycleAction(persistentDef, type, action);
+
+        if (virDomainDefSave(persistentDef, privconn->xmlopt,
+                             BHYVE_CONFIG_DIR) < 0)
+            goto endjob;
+    }
+
+    ret = 0;
+
+ endjob:
+    virDomainObjEndJob(vm);
+
+ cleanup:
+    virDomainObjEndAPI(&vm);
+    return ret;
+}
+
 static virHypervisorDriver bhyveHypervisorDriver = {
     .name = "bhyve",
     .connectURIProbe = bhyveConnectURIProbe,
@@ -2885,6 +2994,7 @@ static virHypervisorDriver bhyveHypervisorDriver = {
     .domainAuthorizedSSHKeysGet = bhyveDomainAuthorizedSSHKeysGet, /* 12.6.0 */
     .domainAuthorizedSSHKeysSet = bhyveDomainAuthorizedSSHKeysSet, /* 12.6.0 */
     .domainRename = bhyveDomainRename, /* 12.6.0 */
+    .domainSetLifecycleAction = bhyveDomainSetLifecycleAction, /* 12.7.0 */
 };
 
 
-- 
2.52.0

Reply via email to