]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
ch_driver: Add domainManagedSave callback
authorPurna Pavan Chandra Aekkaladevi <paekkaladevi@linux.microsoft.com>
Mon, 11 Mar 2024 09:44:00 +0000 (09:44 +0000)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 20 Mar 2024 13:05:18 +0000 (14:05 +0100)
Create libvirt managed saveDir and pass it to CH to save the VM

Signed-off-by: Purna Pavan Chandra Aekkaladevi <paekkaladevi@linux.microsoft.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/ch/ch_conf.c
src/ch/ch_conf.h
src/ch/ch_driver.c
src/ch/ch_monitor.c

index a7b228588634f6709cf8b4f25f38407063e87618..cab97639c40400fef95817afd5734bff91160880 100644 (file)
@@ -148,10 +148,12 @@ virCHDriverConfigNew(bool privileged)
     if (privileged) {
         cfg->logDir = g_strdup_printf("%s/log/libvirt/ch", LOCALSTATEDIR);
         cfg->stateDir = g_strdup_printf("%s/libvirt/ch", RUNSTATEDIR);
+        cfg->saveDir = g_strdup_printf("%s/lib/libvirt/ch/save", LOCALSTATEDIR);
 
     } else {
         g_autofree char *rundir = NULL;
         g_autofree char *cachedir = NULL;
+        g_autofree char *configbasedir = NULL;
 
         cachedir = virGetUserCacheDirectory();
 
@@ -159,6 +161,9 @@ virCHDriverConfigNew(bool privileged)
 
         rundir = virGetUserRuntimeDirectory();
         cfg->stateDir = g_strdup_printf("%s/ch/run", rundir);
+
+        configbasedir = virGetUserConfigDirectory();
+        cfg->saveDir = g_strdup_printf("%s/ch/save", configbasedir);
     }
 
     return cfg;
@@ -175,6 +180,7 @@ virCHDriverConfigDispose(void *obj)
 {
     virCHDriverConfig *cfg = obj;
 
+    g_free(cfg->saveDir);
     g_free(cfg->stateDir);
     g_free(cfg->logDir);
 }
index 4b4c3345b6c7db7999a59894a3e1872fc95ca335..a77cad7a2af1f1c58a54f40f3a634d90df209ee2 100644 (file)
@@ -37,6 +37,7 @@ struct _virCHDriverConfig {
 
     char *stateDir;
     char *logDir;
+    char *saveDir;
 
     int cgroupControllers;
 
index 8a00d035c91970017ae8d766a625f7a2df9e675a..f8a987a87f3d1b9a0b93df36322fdb1866394905 100644 (file)
@@ -178,6 +178,14 @@ static char *chConnectGetCapabilities(virConnectPtr conn)
     return xml;
 }
 
+static char *
+chDomainManagedSavePath(virCHDriver *driver, virDomainObj *vm)
+{
+    g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(driver);
+    return g_strdup_printf("%s/%s.save", cfg->saveDir, vm->def->name);
+}
+
+
 /**
  * chDomainCreateXML:
  * @conn: pointer to connection
@@ -763,6 +771,48 @@ chDomainSave(virDomainPtr dom, const char *to)
     return chDomainSaveFlags(dom, to, NULL, 0);
 }
 
+static int
+chDomainManagedSave(virDomainPtr dom, unsigned int flags)
+{
+    virCHDriver *driver = dom->conn->privateData;
+    virDomainObj *vm = NULL;
+    g_autofree char *to = NULL;
+    int ret = -1;
+
+    virCheckFlags(0, -1);
+
+    if (!(vm = virCHDomainObjFromDomain(dom)))
+        goto cleanup;
+
+    if (virDomainManagedSaveEnsureACL(dom->conn, vm->def) < 0)
+        goto cleanup;
+
+    if (virDomainObjBeginJob(vm, VIR_JOB_MODIFY) < 0)
+        goto cleanup;
+
+    if (virDomainObjCheckActive(vm) < 0)
+        goto endjob;
+
+    if (!vm->persistent) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("cannot do managed save for transient domain"));
+        goto endjob;
+    }
+
+    to = chDomainManagedSavePath(driver, vm);
+    if (chDoDomainSave(driver, vm, to, true) < 0)
+        goto endjob;
+
+    ret = 0;
+
+ endjob:
+    virDomainObjEndJob(vm);
+
+ cleanup:
+    virDomainObjEndAPI(&vm);
+    return ret;
+}
+
 static virDomainPtr chDomainLookupByID(virConnectPtr conn,
                                        int id)
 {
@@ -1886,6 +1936,7 @@ static virHypervisorDriver chHypervisorDriver = {
     .domainGetNumaParameters = chDomainGetNumaParameters,   /* 8.1.0 */
     .domainSave = chDomainSave,                             /* 10.2.0 */
     .domainSaveFlags = chDomainSaveFlags,                   /* 10.2.0 */
+    .domainManagedSave = chDomainManagedSave,               /* 10.2.0 */
 };
 
 static virConnectDriver chConnectDriver = {
index 939fa13667e576a6889c400e21c156c3c6ac1cbd..7b6b77de1cb1e472df2a6198a633dbe794bba869 100644 (file)
@@ -557,6 +557,13 @@ virCHMonitorNew(virDomainObj *vm, virCHDriverConfig *cfg)
         return NULL;
     }
 
+    if (g_mkdir_with_parents(cfg->saveDir, 0777) < 0) {
+        virReportSystemError(errno,
+                             _("Cannot create save directory '%1$s'"),
+                             cfg->saveDir);
+        return NULL;
+    }
+
     cmd = virCommandNew(vm->def->emulator);
     virCommandSetUmask(cmd, 0x002);
     socket_fd = chMonitorCreateSocket(mon->socketpath);