[PATCH 05/11] ch_driver: Implement more save callbacks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Following callbacks have been implemented
* domainSaveImageGetXMLDesc
* domainManagedSaveRemove
* domainManagedSaveGetXMLDesc
* domainHasManagedSaveImage

Signed-off-by: Purna Pavan Chandra Aekkaladevi <paekkaladevi@xxxxxxxxxxxxxxxxxxx>
---
 src/ch/ch_driver.c | 180 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 180 insertions(+)

diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
index be6e25c8e2..577544c941 100644
--- a/src/ch/ch_driver.c
+++ b/src/ch/ch_driver.c
@@ -771,6 +771,99 @@ chDomainSave(virDomainPtr dom, const char *to)
     return chDomainSaveFlags(dom, to, NULL, 0);
 }
 
+static char *
+chDomainSaveXMLRead(int fd)
+{
+    g_autofree char *xml = NULL;
+    CHSaveXMLHeader hdr;
+
+    if (saferead(fd, &hdr, sizeof(hdr)) != sizeof(hdr)) {
+        virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                       _("failed to read CHSaveXMLHeader header"));
+        return NULL;
+    }
+
+    if (memcmp(hdr.magic, CH_SAVE_MAGIC, sizeof(hdr.magic))) {
+        virReportError(VIR_ERR_INVALID_ARG, "%s",
+                       _("save image magic is incorrect"));
+        return NULL;
+    }
+
+    if (hdr.xmlLen <= 0) {
+        virReportError(VIR_ERR_OPERATION_FAILED,
+                       _("invalid XML length: %1$d"), hdr.xmlLen);
+        return NULL;
+    }
+
+    xml = g_new0(char, hdr.xmlLen);
+
+    if (saferead(fd, xml, hdr.xmlLen) != hdr.xmlLen) {
+        virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                       _("failed to read XML"));
+        return NULL;
+    }
+
+    return g_steal_pointer(&xml);
+}
+
+static int chDomainSaveImageRead(virCHDriver *driver,
+                                 const char *path,
+                                 virDomainDef **ret_def)
+{
+    g_autoptr(virCHDriverConfig) cfg = virCHDriverGetConfig(driver);
+    g_autoptr(virDomainDef) def = NULL;
+    g_autofree char *from = NULL;
+    g_autofree char *xml = NULL;
+    VIR_AUTOCLOSE fd = -1;
+    int ret = -1;
+
+    from = g_strdup_printf("%s/%s", path, CH_SAVE_XML);
+    if ((fd = virFileOpenAs(from, O_RDONLY, 0, cfg->user, cfg->group, 0)) < 0) {
+        virReportSystemError(errno,
+                             _("Failed to open domain save file '%1$s'"),
+                             from);
+        goto end;
+    }
+
+    if (!(xml = chDomainSaveXMLRead(fd)))
+        goto end;
+
+    if (!(def = virDomainDefParseString(xml, driver->xmlopt, NULL,
+                                        VIR_DOMAIN_DEF_PARSE_INACTIVE |
+                                        VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
+        goto end;
+
+    *ret_def = g_steal_pointer(&def);
+    ret = 0;
+
+ end:
+    return ret;
+}
+
+static char *
+chDomainSaveImageGetXMLDesc(virConnectPtr conn,
+                            const char *path,
+                            unsigned int flags)
+{
+    virCHDriver *driver = conn->privateData;
+    g_autoptr(virDomainDef) def = NULL;
+    char *ret = NULL;
+
+    virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL);
+
+    if (chDomainSaveImageRead(driver, path, &def) < 0)
+        goto cleanup;
+
+    if (virDomainSaveImageGetXMLDescEnsureACL(conn, def) < 0)
+        goto cleanup;
+
+    ret = virDomainDefFormat(def, driver->xmlopt,
+                             virDomainDefFormatConvertXMLFlags(flags));
+
+ cleanup:
+    return ret;
+}
+
 static int
 chDomainManagedSave(virDomainPtr dom, unsigned int flags)
 {
@@ -813,6 +906,89 @@ chDomainManagedSave(virDomainPtr dom, unsigned int flags)
     return ret;
 }
 
+static int
+chDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags)
+{
+    virCHDriver *driver = dom->conn->privateData;
+    virDomainObj *vm;
+    int ret = -1;
+    g_autofree char *path = NULL;
+
+    virCheckFlags(0, -1);
+
+    if (!(vm = virCHDomainObjFromDomain(dom)))
+        return -1;
+
+    if (virDomainManagedSaveRemoveEnsureACL(dom->conn, vm->def) < 0)
+        goto cleanup;
+
+    path = chDomainManagedSavePath(driver, vm);
+
+    if (virFileDeleteTree(path) < 0) {
+        virReportSystemError(errno,
+                             _("Failed to remove managed save path '%1$s'"),
+                             path);
+        goto cleanup;
+    }
+
+    vm->hasManagedSave = false;
+    ret = 0;
+
+ cleanup:
+    virDomainObjEndAPI(&vm);
+    return ret;
+}
+
+static char *
+chDomainManagedSaveGetXMLDesc(virDomainPtr dom, unsigned int flags)
+{
+    virCHDriver *driver = dom->conn->privateData;
+    virDomainObj *vm = NULL;
+    g_autoptr(virDomainDef) def = NULL;
+    char *ret = NULL;
+    g_autofree char *path = NULL;
+
+    virCheckFlags(VIR_DOMAIN_SAVE_IMAGE_XML_SECURE, NULL);
+
+    if (!(vm = virCHDomainObjFromDomain(dom)))
+        goto cleanup;
+
+    path = chDomainManagedSavePath(driver, vm);
+    if (chDomainSaveImageRead(driver, path, &def) < 0)
+        goto cleanup;
+
+    if (virDomainManagedSaveGetXMLDescEnsureACL(dom->conn, def, flags) < 0)
+        goto cleanup;
+
+    ret = virDomainDefFormat(def, driver->xmlopt,
+                             virDomainDefFormatConvertXMLFlags(flags));
+
+ cleanup:
+    virDomainObjEndAPI(&vm);
+    return ret;
+}
+
+static int
+chDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
+{
+    virDomainObj *vm = NULL;
+    int ret = -1;
+
+    virCheckFlags(0, -1);
+
+    if (!(vm = virCHDomainObjFromDomain(dom)))
+        return -1;
+
+    if (virDomainHasManagedSaveImageEnsureACL(dom->conn, vm->def) < 0)
+        goto cleanup;
+
+    ret = vm->hasManagedSave;
+
+ cleanup:
+    virDomainObjEndAPI(&vm);
+    return ret;
+}
+
 static virDomainPtr chDomainLookupByID(virConnectPtr conn,
                                        int id)
 {
@@ -1937,7 +2113,11 @@ static virHypervisorDriver chHypervisorDriver = {
     .domainGetNumaParameters = chDomainGetNumaParameters,   /* 8.1.0 */
     .domainSave = chDomainSave,                             /* 10.2.0 */
     .domainSaveFlags = chDomainSaveFlags,                   /* 10.2.0 */
+    .domainSaveImageGetXMLDesc = chDomainSaveImageGetXMLDesc,   /* 10.2.0 */
     .domainManagedSave = chDomainManagedSave,               /* 10.2.0 */
+    .domainManagedSaveRemove = chDomainManagedSaveRemove,   /* 10.2.0 */
+    .domainManagedSaveGetXMLDesc = chDomainManagedSaveGetXMLDesc,   /* 10.2.0 */
+    .domainHasManagedSaveImage = chDomainHasManagedSaveImage,   /* 10.2.0 */
 };
 
 static virConnectDriver chConnectDriver = {
-- 
2.34.1
_______________________________________________
Devel mailing list -- devel@xxxxxxxxxxxxxxxxx
To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux