[libvirt] [PATCH python 1/1] Set hints for virPyDictToTypedParams

Predefine hints for all parameters possible to avoid wrong type convert. Signed-off-by: Edgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com> --- libvirt-override.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 4 deletions(-) diff --git a/libvirt-override.c b/libvirt-override.c index 78a7f08..dba42d4 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -7750,7 +7750,9 @@ libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, PyObject *dict; unsigned int flags; virTypedParameterPtr params; - int nparams; + virPyTypedParamsHintPtr hparams; + int nparams = 0; + int nhparams = 15; virDomainPtr ddom = NULL; if (!PyArg_ParseTuple(args, (char *) "OOOI:virDomainMigrate3", @@ -7760,14 +7762,64 @@ libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); dconn = (virConnectPtr) PyvirConnect_Get(pyobj_dconn); - if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_MIGRATE_PARAM_URI; + hparams[0].type = VIR_TYPED_PARAM_STRING; + + hparams[1].name = VIR_MIGRATE_PARAM_DEST_NAME; + hparams[1].type = VIR_TYPED_PARAM_STRING; + + hparams[2].name = VIR_MIGRATE_PARAM_DEST_XML; + hparams[2].type = VIR_TYPED_PARAM_STRING; + + hparams[3].name = VIR_MIGRATE_PARAM_GRAPHICS_URI; + hparams[3].type = VIR_TYPED_PARAM_STRING; + + hparams[4].name = VIR_MIGRATE_PARAM_BANDWIDTH; + hparams[4].type = VIR_TYPED_PARAM_ULLONG; + + hparams[5].name = VIR_MIGRATE_PARAM_LISTEN_ADDRESS; + hparams[5].type = VIR_TYPED_PARAM_STRING; + + hparams[6].name = VIR_MIGRATE_PARAM_DISKS_PORT; + hparams[6].type = VIR_TYPED_PARAM_INT; + + hparams[7].name = VIR_MIGRATE_PARAM_COMPRESSION; + hparams[7].type = VIR_TYPED_PARAM_STRING; + + hparams[8].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS; + hparams[8].type = VIR_TYPED_PARAM_INT; + + hparams[9].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL; + hparams[9].type = VIR_TYPED_PARAM_INT; + + hparams[10].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS; + hparams[10].type = VIR_TYPED_PARAM_INT; + + hparams[11].name = VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE; + hparams[11].type = VIR_TYPED_PARAM_ULLONG; + + hparams[12].name = VIR_MIGRATE_PARAM_PERSIST_XML; + hparams[12].type = VIR_TYPED_PARAM_STRING; + + hparams[13].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL; + hparams[13].type = VIR_TYPED_PARAM_INT; + + hparams[14].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT; + hparams[14].type = VIR_TYPED_PARAM_INT; + + if (virPyDictToTypedParams(dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + } LIBVIRT_BEGIN_ALLOW_THREADS; ddom = virDomainMigrate3(domain, dconn, params, nparams, flags); LIBVIRT_END_ALLOW_THREADS; virTypedParamsFree(params, nparams); + free(hparams); return libvirt_virDomainPtrWrap(ddom); } @@ -7781,7 +7833,9 @@ libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED, PyObject *dict; unsigned int flags; virTypedParameterPtr params; + virPyTypedParamsHintPtr hparams; int nparams; + int nhparams = 15; int ret = -1; if (!PyArg_ParseTuple(args, (char *) "OzOI:virDomainMigrate3", @@ -7790,14 +7844,64 @@ libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED, domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); - if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_MIGRATE_PARAM_URI; + hparams[0].type = VIR_TYPED_PARAM_STRING; + + hparams[1].name = VIR_MIGRATE_PARAM_DEST_NAME; + hparams[1].type = VIR_TYPED_PARAM_STRING; + + hparams[2].name = VIR_MIGRATE_PARAM_DEST_XML; + hparams[2].type = VIR_TYPED_PARAM_STRING; + + hparams[3].name = VIR_MIGRATE_PARAM_GRAPHICS_URI; + hparams[3].type = VIR_TYPED_PARAM_STRING; + + hparams[4].name = VIR_MIGRATE_PARAM_BANDWIDTH; + hparams[4].type = VIR_TYPED_PARAM_ULLONG; + + hparams[5].name = VIR_MIGRATE_PARAM_LISTEN_ADDRESS; + hparams[5].type = VIR_TYPED_PARAM_STRING; + + hparams[6].name = VIR_MIGRATE_PARAM_DISKS_PORT; + hparams[6].type = VIR_TYPED_PARAM_INT; + + hparams[7].name = VIR_MIGRATE_PARAM_COMPRESSION; + hparams[7].type = VIR_TYPED_PARAM_STRING; + + hparams[8].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS; + hparams[8].type = VIR_TYPED_PARAM_INT; + + hparams[9].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL; + hparams[9].type = VIR_TYPED_PARAM_INT; + + hparams[10].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS; + hparams[10].type = VIR_TYPED_PARAM_INT; + + hparams[11].name = VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE; + hparams[11].type = VIR_TYPED_PARAM_ULLONG; + + hparams[12].name = VIR_MIGRATE_PARAM_PERSIST_XML; + hparams[12].type = VIR_TYPED_PARAM_STRING; + + hparams[13].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL; + hparams[13].type = VIR_TYPED_PARAM_INT; + + hparams[14].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT; + hparams[14].type = VIR_TYPED_PARAM_INT; + + if (virPyDictToTypedParams(dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + } LIBVIRT_BEGIN_ALLOW_THREADS; ret = virDomainMigrateToURI3(domain, dconnuri, params, nparams, flags); LIBVIRT_END_ALLOW_THREADS; virTypedParamsFree(params, nparams); + free(hparams); return libvirt_intWrap(ret); } #endif /* LIBVIR_CHECK_VERSION(1, 1, 0) */ @@ -8650,7 +8754,9 @@ libvirt_virDomainBlockCopy(PyObject *self ATTRIBUTE_UNUSED, char *disk = NULL; char *destxml = NULL; virTypedParameterPtr params = NULL; + virPyTypedParamsHintPtr hparams; int nparams = 0; + int nhparams = 3; unsigned int flags = 0; int c_retval; @@ -8659,8 +8765,22 @@ libvirt_virDomainBlockCopy(PyObject *self ATTRIBUTE_UNUSED, return NULL; if (PyDict_Check(pyobj_dict)) { - if (virPyDictToTypedParams(pyobj_dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_DOMAIN_BLOCK_COPY_BANDWIDTH; + hparams[0].type = VIR_TYPED_PARAM_ULLONG; + + hparams[1].name = VIR_DOMAIN_BLOCK_COPY_GRANULARITY; + hparams[1].type = VIR_TYPED_PARAM_UINT; + + hparams[2].name = VIR_DOMAIN_BLOCK_COPY_BUF_SIZE; + hparams[2].type = VIR_TYPED_PARAM_UINT; + + if (virPyDictToTypedParams(pyobj_dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + } + free(hparams); } dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom); -- 2.11.0

ping On 02/07/2018 05:49 PM, Edgar Kaziakhmedov wrote:
Predefine hints for all parameters possible to avoid wrong type convert.
Signed-off-by: Edgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com> --- libvirt-override.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 4 deletions(-)
diff --git a/libvirt-override.c b/libvirt-override.c index 78a7f08..dba42d4 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -7750,7 +7750,9 @@ libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, PyObject *dict; unsigned int flags; virTypedParameterPtr params; - int nparams; + virPyTypedParamsHintPtr hparams; + int nparams = 0; + int nhparams = 15; virDomainPtr ddom = NULL;
if (!PyArg_ParseTuple(args, (char *) "OOOI:virDomainMigrate3", @@ -7760,14 +7762,64 @@ libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); dconn = (virConnectPtr) PyvirConnect_Get(pyobj_dconn);
- if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_MIGRATE_PARAM_URI; + hparams[0].type = VIR_TYPED_PARAM_STRING; + + hparams[1].name = VIR_MIGRATE_PARAM_DEST_NAME; + hparams[1].type = VIR_TYPED_PARAM_STRING; + + hparams[2].name = VIR_MIGRATE_PARAM_DEST_XML; + hparams[2].type = VIR_TYPED_PARAM_STRING; + + hparams[3].name = VIR_MIGRATE_PARAM_GRAPHICS_URI; + hparams[3].type = VIR_TYPED_PARAM_STRING; + + hparams[4].name = VIR_MIGRATE_PARAM_BANDWIDTH; + hparams[4].type = VIR_TYPED_PARAM_ULLONG; + + hparams[5].name = VIR_MIGRATE_PARAM_LISTEN_ADDRESS; + hparams[5].type = VIR_TYPED_PARAM_STRING; + + hparams[6].name = VIR_MIGRATE_PARAM_DISKS_PORT; + hparams[6].type = VIR_TYPED_PARAM_INT; + + hparams[7].name = VIR_MIGRATE_PARAM_COMPRESSION; + hparams[7].type = VIR_TYPED_PARAM_STRING; + + hparams[8].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS; + hparams[8].type = VIR_TYPED_PARAM_INT; + + hparams[9].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL; + hparams[9].type = VIR_TYPED_PARAM_INT; + + hparams[10].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS; + hparams[10].type = VIR_TYPED_PARAM_INT; + + hparams[11].name = VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE; + hparams[11].type = VIR_TYPED_PARAM_ULLONG; + + hparams[12].name = VIR_MIGRATE_PARAM_PERSIST_XML; + hparams[12].type = VIR_TYPED_PARAM_STRING; + + hparams[13].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL; + hparams[13].type = VIR_TYPED_PARAM_INT; + + hparams[14].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT; + hparams[14].type = VIR_TYPED_PARAM_INT; + + if (virPyDictToTypedParams(dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + }
LIBVIRT_BEGIN_ALLOW_THREADS; ddom = virDomainMigrate3(domain, dconn, params, nparams, flags); LIBVIRT_END_ALLOW_THREADS;
virTypedParamsFree(params, nparams); + free(hparams); return libvirt_virDomainPtrWrap(ddom); }
@@ -7781,7 +7833,9 @@ libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED, PyObject *dict; unsigned int flags; virTypedParameterPtr params; + virPyTypedParamsHintPtr hparams; int nparams; + int nhparams = 15; int ret = -1;
if (!PyArg_ParseTuple(args, (char *) "OzOI:virDomainMigrate3", @@ -7790,14 +7844,64 @@ libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED,
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
- if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_MIGRATE_PARAM_URI; + hparams[0].type = VIR_TYPED_PARAM_STRING; + + hparams[1].name = VIR_MIGRATE_PARAM_DEST_NAME; + hparams[1].type = VIR_TYPED_PARAM_STRING; + + hparams[2].name = VIR_MIGRATE_PARAM_DEST_XML; + hparams[2].type = VIR_TYPED_PARAM_STRING; + + hparams[3].name = VIR_MIGRATE_PARAM_GRAPHICS_URI; + hparams[3].type = VIR_TYPED_PARAM_STRING; + + hparams[4].name = VIR_MIGRATE_PARAM_BANDWIDTH; + hparams[4].type = VIR_TYPED_PARAM_ULLONG; + + hparams[5].name = VIR_MIGRATE_PARAM_LISTEN_ADDRESS; + hparams[5].type = VIR_TYPED_PARAM_STRING; + + hparams[6].name = VIR_MIGRATE_PARAM_DISKS_PORT; + hparams[6].type = VIR_TYPED_PARAM_INT; + + hparams[7].name = VIR_MIGRATE_PARAM_COMPRESSION; + hparams[7].type = VIR_TYPED_PARAM_STRING; + + hparams[8].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS; + hparams[8].type = VIR_TYPED_PARAM_INT; + + hparams[9].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL; + hparams[9].type = VIR_TYPED_PARAM_INT; + + hparams[10].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS; + hparams[10].type = VIR_TYPED_PARAM_INT; + + hparams[11].name = VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE; + hparams[11].type = VIR_TYPED_PARAM_ULLONG; + + hparams[12].name = VIR_MIGRATE_PARAM_PERSIST_XML; + hparams[12].type = VIR_TYPED_PARAM_STRING; + + hparams[13].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL; + hparams[13].type = VIR_TYPED_PARAM_INT; + + hparams[14].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT; + hparams[14].type = VIR_TYPED_PARAM_INT; + + if (virPyDictToTypedParams(dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + }
LIBVIRT_BEGIN_ALLOW_THREADS; ret = virDomainMigrateToURI3(domain, dconnuri, params, nparams, flags); LIBVIRT_END_ALLOW_THREADS;
virTypedParamsFree(params, nparams); + free(hparams); return libvirt_intWrap(ret); } #endif /* LIBVIR_CHECK_VERSION(1, 1, 0) */ @@ -8650,7 +8754,9 @@ libvirt_virDomainBlockCopy(PyObject *self ATTRIBUTE_UNUSED, char *disk = NULL; char *destxml = NULL; virTypedParameterPtr params = NULL; + virPyTypedParamsHintPtr hparams; int nparams = 0; + int nhparams = 3; unsigned int flags = 0; int c_retval;
@@ -8659,8 +8765,22 @@ libvirt_virDomainBlockCopy(PyObject *self ATTRIBUTE_UNUSED, return NULL;
if (PyDict_Check(pyobj_dict)) { - if (virPyDictToTypedParams(pyobj_dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_DOMAIN_BLOCK_COPY_BANDWIDTH; + hparams[0].type = VIR_TYPED_PARAM_ULLONG; + + hparams[1].name = VIR_DOMAIN_BLOCK_COPY_GRANULARITY; + hparams[1].type = VIR_TYPED_PARAM_UINT; + + hparams[2].name = VIR_DOMAIN_BLOCK_COPY_BUF_SIZE; + hparams[2].type = VIR_TYPED_PARAM_UINT; + + if (virPyDictToTypedParams(pyobj_dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + } + free(hparams); }
dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom); -- 2.11.0
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list .

ping ^ 2 On 02/13/2018 11:20 AM, Edgar Kaziakhmedov wrote:
ping
On 02/07/2018 05:49 PM, Edgar Kaziakhmedov wrote:
Predefine hints for all parameters possible to avoid wrong type convert.
Signed-off-by: Edgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com> --- libvirt-override.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 4 deletions(-)
diff --git a/libvirt-override.c b/libvirt-override.c index 78a7f08..dba42d4 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -7750,7 +7750,9 @@ libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, PyObject *dict; unsigned int flags; virTypedParameterPtr params; - int nparams; + virPyTypedParamsHintPtr hparams; + int nparams = 0; + int nhparams = 15; virDomainPtr ddom = NULL;
if (!PyArg_ParseTuple(args, (char *) "OOOI:virDomainMigrate3", @@ -7760,14 +7762,64 @@ libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); dconn = (virConnectPtr) PyvirConnect_Get(pyobj_dconn);
- if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_MIGRATE_PARAM_URI; + hparams[0].type = VIR_TYPED_PARAM_STRING; + + hparams[1].name = VIR_MIGRATE_PARAM_DEST_NAME; + hparams[1].type = VIR_TYPED_PARAM_STRING; + + hparams[2].name = VIR_MIGRATE_PARAM_DEST_XML; + hparams[2].type = VIR_TYPED_PARAM_STRING; + + hparams[3].name = VIR_MIGRATE_PARAM_GRAPHICS_URI; + hparams[3].type = VIR_TYPED_PARAM_STRING; + + hparams[4].name = VIR_MIGRATE_PARAM_BANDWIDTH; + hparams[4].type = VIR_TYPED_PARAM_ULLONG; + + hparams[5].name = VIR_MIGRATE_PARAM_LISTEN_ADDRESS; + hparams[5].type = VIR_TYPED_PARAM_STRING; + + hparams[6].name = VIR_MIGRATE_PARAM_DISKS_PORT; + hparams[6].type = VIR_TYPED_PARAM_INT; + + hparams[7].name = VIR_MIGRATE_PARAM_COMPRESSION; + hparams[7].type = VIR_TYPED_PARAM_STRING; + + hparams[8].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS; + hparams[8].type = VIR_TYPED_PARAM_INT; + + hparams[9].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL; + hparams[9].type = VIR_TYPED_PARAM_INT; + + hparams[10].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS; + hparams[10].type = VIR_TYPED_PARAM_INT; + + hparams[11].name = VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE; + hparams[11].type = VIR_TYPED_PARAM_ULLONG; + + hparams[12].name = VIR_MIGRATE_PARAM_PERSIST_XML; + hparams[12].type = VIR_TYPED_PARAM_STRING; + + hparams[13].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL; + hparams[13].type = VIR_TYPED_PARAM_INT; + + hparams[14].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT; + hparams[14].type = VIR_TYPED_PARAM_INT; + + if (virPyDictToTypedParams(dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + }
LIBVIRT_BEGIN_ALLOW_THREADS; ddom = virDomainMigrate3(domain, dconn, params, nparams, flags); LIBVIRT_END_ALLOW_THREADS;
virTypedParamsFree(params, nparams); + free(hparams); return libvirt_virDomainPtrWrap(ddom); }
@@ -7781,7 +7833,9 @@ libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED, PyObject *dict; unsigned int flags; virTypedParameterPtr params; + virPyTypedParamsHintPtr hparams; int nparams; + int nhparams = 15; int ret = -1;
if (!PyArg_ParseTuple(args, (char *) "OzOI:virDomainMigrate3", @@ -7790,14 +7844,64 @@ libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED,
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
- if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_MIGRATE_PARAM_URI; + hparams[0].type = VIR_TYPED_PARAM_STRING; + + hparams[1].name = VIR_MIGRATE_PARAM_DEST_NAME; + hparams[1].type = VIR_TYPED_PARAM_STRING; + + hparams[2].name = VIR_MIGRATE_PARAM_DEST_XML; + hparams[2].type = VIR_TYPED_PARAM_STRING; + + hparams[3].name = VIR_MIGRATE_PARAM_GRAPHICS_URI; + hparams[3].type = VIR_TYPED_PARAM_STRING; + + hparams[4].name = VIR_MIGRATE_PARAM_BANDWIDTH; + hparams[4].type = VIR_TYPED_PARAM_ULLONG; + + hparams[5].name = VIR_MIGRATE_PARAM_LISTEN_ADDRESS; + hparams[5].type = VIR_TYPED_PARAM_STRING; + + hparams[6].name = VIR_MIGRATE_PARAM_DISKS_PORT; + hparams[6].type = VIR_TYPED_PARAM_INT; + + hparams[7].name = VIR_MIGRATE_PARAM_COMPRESSION; + hparams[7].type = VIR_TYPED_PARAM_STRING; + + hparams[8].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS; + hparams[8].type = VIR_TYPED_PARAM_INT; + + hparams[9].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL; + hparams[9].type = VIR_TYPED_PARAM_INT; + + hparams[10].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS; + hparams[10].type = VIR_TYPED_PARAM_INT; + + hparams[11].name = VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE; + hparams[11].type = VIR_TYPED_PARAM_ULLONG; + + hparams[12].name = VIR_MIGRATE_PARAM_PERSIST_XML; + hparams[12].type = VIR_TYPED_PARAM_STRING; + + hparams[13].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL; + hparams[13].type = VIR_TYPED_PARAM_INT; + + hparams[14].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT; + hparams[14].type = VIR_TYPED_PARAM_INT; + + if (virPyDictToTypedParams(dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + }
LIBVIRT_BEGIN_ALLOW_THREADS; ret = virDomainMigrateToURI3(domain, dconnuri, params, nparams, flags); LIBVIRT_END_ALLOW_THREADS;
virTypedParamsFree(params, nparams); + free(hparams); return libvirt_intWrap(ret); } #endif /* LIBVIR_CHECK_VERSION(1, 1, 0) */ @@ -8650,7 +8754,9 @@ libvirt_virDomainBlockCopy(PyObject *self ATTRIBUTE_UNUSED, char *disk = NULL; char *destxml = NULL; virTypedParameterPtr params = NULL; + virPyTypedParamsHintPtr hparams; int nparams = 0; + int nhparams = 3; unsigned int flags = 0; int c_retval;
@@ -8659,8 +8765,22 @@ libvirt_virDomainBlockCopy(PyObject *self ATTRIBUTE_UNUSED, return NULL;
if (PyDict_Check(pyobj_dict)) { - if (virPyDictToTypedParams(pyobj_dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_DOMAIN_BLOCK_COPY_BANDWIDTH; + hparams[0].type = VIR_TYPED_PARAM_ULLONG; + + hparams[1].name = VIR_DOMAIN_BLOCK_COPY_GRANULARITY; + hparams[1].type = VIR_TYPED_PARAM_UINT; + + hparams[2].name = VIR_DOMAIN_BLOCK_COPY_BUF_SIZE; + hparams[2].type = VIR_TYPED_PARAM_UINT; + + if (virPyDictToTypedParams(pyobj_dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + } + free(hparams); }
dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom); -- 2.11.0
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list .
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list .

On 02/19/2018 01:08 PM, Edgar Kaziakhmedov wrote:
ping ^ 2
On 02/13/2018 11:20 AM, Edgar Kaziakhmedov wrote:
ping
On 02/07/2018 05:49 PM, Edgar Kaziakhmedov wrote:
Predefine hints for all parameters possible to avoid wrong type convert.
Signed-off-by: Edgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com> --- libvirt-override.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 4 deletions(-)
diff --git a/libvirt-override.c b/libvirt-override.c index 78a7f08..dba42d4 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -7750,7 +7750,9 @@ libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, PyObject *dict; unsigned int flags; virTypedParameterPtr params; - int nparams; + virPyTypedParamsHintPtr hparams; + int nparams = 0; + int nhparams = 15; virDomainPtr ddom = NULL;
if (!PyArg_ParseTuple(args, (char *) "OOOI:virDomainMigrate3", @@ -7760,14 +7762,64 @@ libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); dconn = (virConnectPtr) PyvirConnect_Get(pyobj_dconn);
- if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_MIGRATE_PARAM_URI; + hparams[0].type = VIR_TYPED_PARAM_STRING; + + hparams[1].name = VIR_MIGRATE_PARAM_DEST_NAME; + hparams[1].type = VIR_TYPED_PARAM_STRING; + + hparams[2].name = VIR_MIGRATE_PARAM_DEST_XML; + hparams[2].type = VIR_TYPED_PARAM_STRING; + + hparams[3].name = VIR_MIGRATE_PARAM_GRAPHICS_URI; + hparams[3].type = VIR_TYPED_PARAM_STRING; + + hparams[4].name = VIR_MIGRATE_PARAM_BANDWIDTH; + hparams[4].type = VIR_TYPED_PARAM_ULLONG; + + hparams[5].name = VIR_MIGRATE_PARAM_LISTEN_ADDRESS; + hparams[5].type = VIR_TYPED_PARAM_STRING; + + hparams[6].name = VIR_MIGRATE_PARAM_DISKS_PORT; + hparams[6].type = VIR_TYPED_PARAM_INT; + + hparams[7].name = VIR_MIGRATE_PARAM_COMPRESSION; + hparams[7].type = VIR_TYPED_PARAM_STRING; + + hparams[8].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS; + hparams[8].type = VIR_TYPED_PARAM_INT; + + hparams[9].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL; + hparams[9].type = VIR_TYPED_PARAM_INT; + + hparams[10].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS; + hparams[10].type = VIR_TYPED_PARAM_INT; + + hparams[11].name = VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE; + hparams[11].type = VIR_TYPED_PARAM_ULLONG; + + hparams[12].name = VIR_MIGRATE_PARAM_PERSIST_XML; + hparams[12].type = VIR_TYPED_PARAM_STRING; + + hparams[13].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL; + hparams[13].type = VIR_TYPED_PARAM_INT; + + hparams[14].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT; + hparams[14].type = VIR_TYPED_PARAM_INT; + + if (virPyDictToTypedParams(dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + }
LIBVIRT_BEGIN_ALLOW_THREADS; ddom = virDomainMigrate3(domain, dconn, params, nparams, flags); LIBVIRT_END_ALLOW_THREADS;
virTypedParamsFree(params, nparams); + free(hparams); return libvirt_virDomainPtrWrap(ddom); }
@@ -7781,7 +7833,9 @@ libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED, PyObject *dict; unsigned int flags; virTypedParameterPtr params; + virPyTypedParamsHintPtr hparams; int nparams; + int nhparams = 15; int ret = -1;
if (!PyArg_ParseTuple(args, (char *) "OzOI:virDomainMigrate3", @@ -7790,14 +7844,64 @@ libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED,
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
- if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_MIGRATE_PARAM_URI; + hparams[0].type = VIR_TYPED_PARAM_STRING; + + hparams[1].name = VIR_MIGRATE_PARAM_DEST_NAME; + hparams[1].type = VIR_TYPED_PARAM_STRING; + + hparams[2].name = VIR_MIGRATE_PARAM_DEST_XML; + hparams[2].type = VIR_TYPED_PARAM_STRING; + + hparams[3].name = VIR_MIGRATE_PARAM_GRAPHICS_URI; + hparams[3].type = VIR_TYPED_PARAM_STRING; + + hparams[4].name = VIR_MIGRATE_PARAM_BANDWIDTH; + hparams[4].type = VIR_TYPED_PARAM_ULLONG; + + hparams[5].name = VIR_MIGRATE_PARAM_LISTEN_ADDRESS; + hparams[5].type = VIR_TYPED_PARAM_STRING; + + hparams[6].name = VIR_MIGRATE_PARAM_DISKS_PORT; + hparams[6].type = VIR_TYPED_PARAM_INT; + + hparams[7].name = VIR_MIGRATE_PARAM_COMPRESSION; + hparams[7].type = VIR_TYPED_PARAM_STRING; + + hparams[8].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS; + hparams[8].type = VIR_TYPED_PARAM_INT; + + hparams[9].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL; + hparams[9].type = VIR_TYPED_PARAM_INT; + + hparams[10].name = VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS; + hparams[10].type = VIR_TYPED_PARAM_INT; + + hparams[11].name = VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE; + hparams[11].type = VIR_TYPED_PARAM_ULLONG; + + hparams[12].name = VIR_MIGRATE_PARAM_PERSIST_XML; + hparams[12].type = VIR_TYPED_PARAM_STRING; + + hparams[13].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL; + hparams[13].type = VIR_TYPED_PARAM_INT; + + hparams[14].name = VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT; + hparams[14].type = VIR_TYPED_PARAM_INT; + + if (virPyDictToTypedParams(dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + }
LIBVIRT_BEGIN_ALLOW_THREADS; ret = virDomainMigrateToURI3(domain, dconnuri, params, nparams, flags); LIBVIRT_END_ALLOW_THREADS;
virTypedParamsFree(params, nparams); + free(hparams); return libvirt_intWrap(ret); } #endif /* LIBVIR_CHECK_VERSION(1, 1, 0) */ @@ -8650,7 +8754,9 @@ libvirt_virDomainBlockCopy(PyObject *self ATTRIBUTE_UNUSED, char *disk = NULL; char *destxml = NULL; virTypedParameterPtr params = NULL; + virPyTypedParamsHintPtr hparams; int nparams = 0; + int nhparams = 3; unsigned int flags = 0; int c_retval;
@@ -8659,8 +8765,22 @@ libvirt_virDomainBlockCopy(PyObject *self ATTRIBUTE_UNUSED, return NULL;
if (PyDict_Check(pyobj_dict)) { - if (virPyDictToTypedParams(pyobj_dict, ¶ms, &nparams, NULL, 0) < 0) + hparams = malloc(sizeof(virPyTypedParamsHint) * nhparams); + hparams[0].name = VIR_DOMAIN_BLOCK_COPY_BANDWIDTH; + hparams[0].type = VIR_TYPED_PARAM_ULLONG; + + hparams[1].name = VIR_DOMAIN_BLOCK_COPY_GRANULARITY; + hparams[1].type = VIR_TYPED_PARAM_UINT; + + hparams[2].name = VIR_DOMAIN_BLOCK_COPY_BUF_SIZE; + hparams[2].type = VIR_TYPED_PARAM_UINT; + + if (virPyDictToTypedParams(pyobj_dict, ¶ms, &nparams, + hparams, nhparams) < 0) { + free(hparams); return NULL; + } + free(hparams); }
dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom); -- 2.11.0
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list .
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list .

On Wed, Feb 07, 2018 at 05:49:30PM +0300, Edgar Kaziakhmedov wrote:
Predefine hints for all parameters possible to avoid wrong type convert.
Signed-off-by: Edgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com> --- libvirt-override.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 4 deletions(-)
Thanks, looks good, so I've pushed this now. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|

On Mon, Feb 19, 2018 at 01:09:27PM +0000, Daniel P. Berrangé wrote:
On Wed, Feb 07, 2018 at 05:49:30PM +0300, Edgar Kaziakhmedov wrote:
Predefine hints for all parameters possible to avoid wrong type convert.
Signed-off-by: Edgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com> --- libvirt-override.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 4 deletions(-)
Thanks, looks good, so I've pushed this now.
Actually I wanted to suggest to use static variables to store the hints: diff --git a/libvirt-override.c b/libvirt-override.c index 78a7f08..c41c03c 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -7739,6 +7739,25 @@ libvirt_virDomainMigrateGetMaxDowntime(PyObject *self ATTRIBUT E_UNUSED, #endif /* LIBVIR_CHECK_VERSION(3, 7, 0) */ #if LIBVIR_CHECK_VERSION(1, 1, 0) + +static virPyTypedParamsHint virDomainMigrate3Params[] = { + { VIR_MIGRATE_PARAM_URI, VIR_TYPED_PARAM_STRING }, + { VIR_MIGRATE_PARAM_DEST_NAME, VIR_TYPED_PARAM_STRING }, + { VIR_MIGRATE_PARAM_DEST_XML, VIR_TYPED_PARAM_STRING }, + { VIR_MIGRATE_PARAM_GRAPHICS_URI, VIR_TYPED_PARAM_STRING }, + { VIR_MIGRATE_PARAM_BANDWIDTH, VIR_TYPED_PARAM_ULLONG }, + { VIR_MIGRATE_PARAM_LISTEN_ADDRESS, VIR_TYPED_PARAM_STRING }, + { VIR_MIGRATE_PARAM_DISKS_PORT, VIR_TYPED_PARAM_INT }, + { VIR_MIGRATE_PARAM_COMPRESSION, VIR_TYPED_PARAM_STRING }, + { VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS, VIR_TYPED_PARAM_INT }, + { VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL, VIR_TYPED_PARAM_INT }, + { VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS, VIR_TYPED_PARAM_INT }, + { VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE, VIR_TYPED_PARAM_ULLONG }, + { VIR_MIGRATE_PARAM_PERSIST_XML, VIR_TYPED_PARAM_STRING }, + { VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL, VIR_TYPED_PARAM_INT }, + { VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT, VIR_TYPED_PARAM_INT }, +}; + static PyObject * libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) @@ -7760,7 +7779,9 @@ libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED, domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); dconn = (virConnectPtr) PyvirConnect_Get(pyobj_dconn); - if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0) + if (virPyDictToTypedParams(dict, ¶ms, &nparams, + virDomainMigrate3Params, + VIR_N_ELEMENTS(virDomainMigrate3Params)) < 0) return NULL; LIBVIRT_BEGIN_ALLOW_THREADS; diff --git a/libvirt-utils.h b/libvirt-utils.h index 779fd56..0af1e62 100644 --- a/libvirt-utils.h +++ b/libvirt-utils.h @@ -146,6 +146,8 @@ void virFree(void *ptrptr) ATTRIBUTE_NONNULL(1); # endif +#define VIR_N_ELEMENTS(array) (sizeof(array) / sizeof(*(array))) + /* The two-statement sequence "Py_INCREF(Py_None); return Py_None;" is so common that we encapsulate it here. Now, each use is simply return VIR_PY_NONE; */ Which IMHO looks better. Pavel

On Mon, Feb 19, 2018 at 02:20:30PM +0100, Pavel Hrdina wrote:
On Mon, Feb 19, 2018 at 01:09:27PM +0000, Daniel P. Berrangé wrote:
On Wed, Feb 07, 2018 at 05:49:30PM +0300, Edgar Kaziakhmedov wrote:
Predefine hints for all parameters possible to avoid wrong type convert.
Signed-off-by: Edgar Kaziakhmedov <edgar.kaziakhmedov@virtuozzo.com> --- libvirt-override.c | 128 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 4 deletions(-)
Thanks, looks good, so I've pushed this now.
Actually I wanted to suggest to use static variables to store the hints:
If you want to send a followup todo that its fine by me... Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
participants (4)
-
Daniel P. Berrangé
-
Denis V. Lunev
-
Edgar Kaziakhmedov
-
Pavel Hrdina