Modernize typed parameter fetching in libvirt_virDomainSetBlockIoTune()
authorMichal Privoznik <[email protected]>
Fri, 21 Mar 2025 10:07:59 +0000 (21 11:07 +0100)
committerMichal Privoznik <[email protected]>
Fri, 21 Mar 2025 15:42:44 +0000 (21 16:42 +0100)
Instead of fetching supported tunables and passing only those to
the API (effectively ignoring unsupported ones), pass all
tunables or error out on unsupported ones.

Signed-off-by: Michal Privoznik <[email protected]>
libvirt-override.c

index 419e7ba..d10249a 100644 (file)
@@ -5040,78 +5040,74 @@ libvirt_virDomainGetBlockJobInfo(PyObject *self ATTRIBUTE_UNUSED,
     return NULL;
 }
 
+static virPyTypedParamsHint virPyDomainSetBlockIoTuneParams[] = {
+    { VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC, VIR_TYPED_PARAM_ULLONG },
+#if LIBVIR_CHECK_VERSION(1, 2, 11)
+    { VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_SIZE_IOPS_SEC, VIR_TYPED_PARAM_ULLONG },
+#endif /* LIBVIR_CHECK_VERSION(1, 2, 11)  */
+#if LIBVIR_CHECK_VERSION(2, 4, 0)
+    { VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC_MAX_LENGTH, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC_MAX_LENGTH, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC_MAX_LENGTH, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC_MAX_LENGTH, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC_MAX_LENGTH, VIR_TYPED_PARAM_ULLONG },
+    { VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC_MAX_LENGTH, VIR_TYPED_PARAM_ULLONG },
+#endif /* LIBVIR_CHECK_VERSION(2, 4, 0)  */
+#if LIBVIR_CHECK_VERSION(3, 0, 0)
+    { VIR_DOMAIN_BLOCK_IOTUNE_GROUP_NAME, VIR_TYPED_PARAM_STRING },
+#endif /* LIBVIR_CHECK_VERSION(3, 0, 0) */
+};
+
+
 static PyObject *
 libvirt_virDomainSetBlockIoTune(PyObject *self ATTRIBUTE_UNUSED,
                                 PyObject *args)
 {
     virDomainPtr domain;
-    PyObject *pyobj_domain, *info;
-    PyObject *ret = NULL;
-    int i_retval;
+    PyObject *pyobj_domain = NULL;
+    PyObject *pyobj_dict = NULL;
+    virTypedParameterPtr params = NULL;
     int nparams = 0;
-    Py_ssize_t size = 0;
+    int c_retval;
     const char *disk;
     unsigned int flags;
-    virTypedParameterPtr params = NULL, new_params = NULL;
 
     if (!PyArg_ParseTuple(args, (char *)"OzOI:virDomainSetBlockIoTune",
-                          &pyobj_domain, &disk, &info, &flags))
+                          &pyobj_domain, &disk, &pyobj_dict, &flags))
         return NULL;
-    domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
 
-    if ((size = PyDict_Size(info)) < 0)
-        return NULL;
-
-    if (size == 0) {
-        PyErr_Format(PyExc_LookupError,
+    if (PyDict_Check(pyobj_dict)) {
+        if (virPyDictToTypedParams(pyobj_dict, &params, &nparams,
+                                   virPyDomainSetBlockIoTuneParams,
+                                   VIR_N_ELEMENTS(virPyDomainSetBlockIoTuneParams)) < 0) {
+            return NULL;
+        }
+    } else {
+        PyErr_Format(PyExc_TypeError,
                      "Need non-empty dictionary to set attributes");
         return NULL;
     }
+    domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
 
-    LIBVIRT_BEGIN_ALLOW_THREADS;
-    i_retval = virDomainGetBlockIoTune(domain, disk, NULL, &nparams, flags);
-    LIBVIRT_END_ALLOW_THREADS;
-
-    if (i_retval < 0)
-        return VIR_PY_INT_FAIL;
-
-    if (nparams == 0) {
-        PyErr_Format(PyExc_LookupError,
-                     "Domain has no settable attributes");
-        return NULL;
-    }
-
-    if (VIR_ALLOC_N(params, nparams) < 0)
-        return PyErr_NoMemory();
-
-    LIBVIRT_BEGIN_ALLOW_THREADS;
-    i_retval = virDomainGetBlockIoTune(domain, disk, params, &nparams, flags);
-    LIBVIRT_END_ALLOW_THREADS;
-
-    if (i_retval < 0) {
-        ret = VIR_PY_INT_FAIL;
-        goto cleanup;
-    }
-
-    new_params = setPyVirTypedParameter(info, params, nparams);
-    if (!new_params)
-        goto cleanup;
 
     LIBVIRT_BEGIN_ALLOW_THREADS;
-    i_retval = virDomainSetBlockIoTune(domain, disk, new_params, size, flags);
+    c_retval = virDomainSetBlockIoTune(domain, disk, params, nparams, flags);
     LIBVIRT_END_ALLOW_THREADS;
 
-    if (i_retval < 0) {
-        ret = VIR_PY_INT_FAIL;
-        goto cleanup;
-    }
-
-    ret = VIR_PY_INT_SUCCESS;
-
- cleanup:
     virTypedParamsFree(params, nparams);
-    virTypedParamsFree(new_params, size);
-    return ret;
+
+    return libvirt_intWrap(c_retval);
 }
 
 static PyObject *