]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_snapshot: create: move XML def validation to separate function
authorPavel Hrdina <phrdina@redhat.com>
Wed, 3 Nov 2021 09:53:12 +0000 (10:53 +0100)
committerPavel Hrdina <phrdina@redhat.com>
Wed, 1 Dec 2021 11:33:25 +0000 (12:33 +0100)
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_snapshot.c

index 7ffebbbdf240bb0ca3d8e7620a35553cfbbb573e..b4e2fe11f69bbd6faaf9ef3e683900e472770034 100644 (file)
@@ -1554,59 +1554,13 @@ qemuSnapshotCreateXMLParse(virDomainObj *vm,
 }
 
 
-virDomainSnapshotPtr
-qemuSnapshotCreateXML(virDomainPtr domain,
-                      virDomainObj *vm,
-                      const char *xmlDesc,
-                      unsigned int flags)
+static int
+qemuSnapshotCreateXMLValidateDef(virDomainObj *vm,
+                                 virDomainSnapshotDef *def,
+                                 unsigned int flags)
 {
-    virQEMUDriver *driver = domain->conn->privateData;
-    g_autofree char *xml = NULL;
-    virDomainMomentObj *snap = NULL;
-    virDomainSnapshotPtr snapshot = NULL;
-    virDomainMomentObj *current = NULL;
-    bool update_current = true;
     bool redefine = flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE;
-    int align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL;
-    bool align_match = true;
-    g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
-    qemuDomainObjPrivate *priv = vm->privateData;
     virDomainSnapshotState state;
-    g_autoptr(virDomainSnapshotDef) def = NULL;
-
-    virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_HALT |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_LIVE |
-                  VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE, NULL);
-
-    VIR_REQUIRE_FLAG_RET(VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE,
-                         VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY,
-                         NULL);
-    VIR_EXCLUSIVE_FLAGS_RET(VIR_DOMAIN_SNAPSHOT_CREATE_LIVE,
-                            VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE,
-                            NULL);
-
-    if ((redefine && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT)) ||
-        (flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA))
-        update_current = false;
-
-    if (qemuDomainSupportsCheckpointsBlockjobs(vm) < 0)
-        return NULL;
-
-    if (!vm->persistent && (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT)) {
-        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
-                       _("cannot halt after transient domain snapshot"));
-        return NULL;
-    }
-
-    if (!(def = qemuSnapshotCreateXMLParse(vm, driver, xmlDesc, flags)))
-        return NULL;
 
     /* reject snapshot names containing slashes or starting with dot as
      * snapshot definitions are saved in files named by the snapshot name */
@@ -1616,7 +1570,7 @@ qemuSnapshotCreateXML(virDomainPtr domain,
                            _("invalid snapshot name '%s': "
                              "name can't contain '/'"),
                            def->parent.name);
-            return NULL;
+            return -1;
         }
 
         if (def->parent.name[0] == '.') {
@@ -1624,7 +1578,7 @@ qemuSnapshotCreateXML(virDomainPtr domain,
                            _("invalid snapshot name '%s': "
                              "name can't start with '.'"),
                            def->parent.name);
-            return NULL;
+            return -1;
         }
     }
 
@@ -1635,7 +1589,7 @@ qemuSnapshotCreateXML(virDomainPtr domain,
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                        _("live snapshot creation is supported only "
                          "during full system snapshots"));
-        return NULL;
+        return -1;
     }
 
     /* allow snapshots only in certain states */
@@ -1653,7 +1607,7 @@ qemuSnapshotCreateXML(virDomainPtr domain,
         if (!redefine) {
             virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid domain state %s"),
                            virDomainSnapshotStateTypeToString(state));
-            return NULL;
+            return -1;
         }
         break;
 
@@ -1661,7 +1615,7 @@ qemuSnapshotCreateXML(virDomainPtr domain,
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
                        _("qemu doesn't support taking snapshots of "
                          "PMSUSPENDED guests"));
-        return NULL;
+        return -1;
 
         /* invalid states */
     case VIR_DOMAIN_SNAPSHOT_NOSTATE:
@@ -1669,9 +1623,69 @@ qemuSnapshotCreateXML(virDomainPtr domain,
     case VIR_DOMAIN_SNAPSHOT_LAST:
         virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid domain state %s"),
                        virDomainSnapshotStateTypeToString(state));
+        return -1;
+    }
+
+    return 0;
+}
+
+
+virDomainSnapshotPtr
+qemuSnapshotCreateXML(virDomainPtr domain,
+                      virDomainObj *vm,
+                      const char *xmlDesc,
+                      unsigned int flags)
+{
+    virQEMUDriver *driver = domain->conn->privateData;
+    g_autofree char *xml = NULL;
+    virDomainMomentObj *snap = NULL;
+    virDomainSnapshotPtr snapshot = NULL;
+    virDomainMomentObj *current = NULL;
+    bool update_current = true;
+    bool redefine = flags & VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE;
+    int align_location = VIR_DOMAIN_SNAPSHOT_LOCATION_INTERNAL;
+    bool align_match = true;
+    g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+    qemuDomainObjPrivate *priv = vm->privateData;
+    g_autoptr(virDomainSnapshotDef) def = NULL;
+
+    virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_HALT |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_REUSE_EXT |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_ATOMIC |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_LIVE |
+                  VIR_DOMAIN_SNAPSHOT_CREATE_VALIDATE, NULL);
+
+    VIR_REQUIRE_FLAG_RET(VIR_DOMAIN_SNAPSHOT_CREATE_QUIESCE,
+                         VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY,
+                         NULL);
+    VIR_EXCLUSIVE_FLAGS_RET(VIR_DOMAIN_SNAPSHOT_CREATE_LIVE,
+                            VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE,
+                            NULL);
+
+    if ((redefine && !(flags & VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT)) ||
+        (flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA))
+        update_current = false;
+
+    if (qemuDomainSupportsCheckpointsBlockjobs(vm) < 0)
+        return NULL;
+
+    if (!vm->persistent && (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT)) {
+        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                       _("cannot halt after transient domain snapshot"));
         return NULL;
     }
 
+    if (!(def = qemuSnapshotCreateXMLParse(vm, driver, xmlDesc, flags)))
+        return NULL;
+
+    if (qemuSnapshotCreateXMLValidateDef(vm, def, flags) < 0)
+        return NULL;
+
     /* We are going to modify the domain below. Internal snapshots would use
      * a regular job, so we need to set the job mask to disallow query as
      * 'savevm' blocks the monitor. External snapshot will then modify the