Sample session: >>> import libvirt >>> c = libvirt.open('qemu:///session') >>> c.virSecretListSecrets() ['12247729-47d2-a783-88ce-b329d4781cd3', 'reee', 'abc'] >>> c.virSecretAllocateID() '17427ed8-4040-b6c8-10ba-9cce86dc3d8f' >>> c.virSecretDelete('17427ed8-4040-b6c8-10ba-9cce86dc3d8f') 0 >>> c.virSecretSetXML('abc', "<secret ephemeral='no' private='yes'>\n<description>Something for use</description>\n<volume>/foo/bar</volume>\n</secret>\n") 0 >>> c.virSecretGetXML('abc') "<secret ephemeral='no' private='yes'>\n <description>Something for use</description>\n <volume>/foo/bar</volume>\n</secret>\n" >>> c.virSecretSetValue('reee', 'abc\0xx\xffx') 0 >>> c.virSecretGetValue('reee') 'abc\x00xx\xffx' --- python/generator.py | 6 +++ python/libvir.c | 98 +++++++++++++++++++++++++++++++++++++++++ python/libvirt-python-api.xml | 18 ++++++++ 3 files changed, 122 insertions(+), 0 deletions(-) diff --git a/python/generator.py b/python/generator.py index feff7a3..49b7f68 100755 --- a/python/generator.py +++ b/python/generator.py @@ -332,6 +332,9 @@ skip_impl = ( 'virEventRegisterImpl', 'virNodeListDevices', 'virNodeDeviceListCaps', + 'virSecretGetValue', + 'virSecretListSecrets', + 'virSecretSetValue', ) @@ -729,6 +732,9 @@ def nameFixup(name, classe, type, file): elif name[0:19] == "virStorageVolLookup": func = name[3:] func = string.lower(func[0:1]) + func[1:] + elif name[0:9] == 'virSecret': + func = name[3:] + func = string.lower(func[0:1]) + func[1:] elif name[0:12] == "virDomainGet": func = name[12:] func = string.lower(func[0:1]) + func[1:] diff --git a/python/libvir.c b/python/libvir.c index e210597..b91a801 100644 --- a/python/libvir.c +++ b/python/libvir.c @@ -1562,6 +1562,101 @@ libvirt_virNodeDeviceListCaps(PyObject *self ATTRIBUTE_UNUSED, return(py_retval); } +static PyObject * +libvirt_virSecretGetValue(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { + PyObject *py_retval; + void *c_retval; + size_t size; + virConnectPtr conn; + const char *secret_id; + PyObject *pyobj_conn; + + if (!PyArg_ParseTuple(args, (char *)"Oz:virSecreteGetValue", &pyobj_conn, + &secret_id)) + return NULL; + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virSecretGetValue(conn, secret_id, &size); + LIBVIRT_END_ALLOW_THREADS; + + if (c_retval == NULL) + return VIR_PY_NONE; + + py_retval = PyString_FromStringAndSize(c_retval, size); + memset(c_retval, 0, size); + free(c_retval); + + return py_retval; +} + +static PyObject * +libvirt_virSecretListSecrets(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { + PyObject *py_retval; + char **ids = NULL; + virConnectPtr conn; + int c_retval, i; + PyObject *pyobj_conn; + + if (!PyArg_ParseTuple(args, (char *)"O:virSecretListSecrets", &pyobj_conn)) + return NULL; + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virSecretNumOfSecrets(conn); + LIBVIRT_END_ALLOW_THREADS; + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + ids = malloc(sizeof(*ids) * c_retval); + if (!ids) + return VIR_PY_NONE; + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virSecretListSecrets(conn, ids, c_retval); + LIBVIRT_END_ALLOW_THREADS; + if (c_retval < 0) { + free(ids); + return VIR_PY_NONE; + } + } + py_retval = PyList_New(c_retval); + + if (ids) { + for (i = 0;i < c_retval;i++) { + PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(ids[i])); + free(ids[i]); + } + free(ids); + } + + return py_retval; +} + +static PyObject * +libvirt_virSecretSetValue(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { + PyObject *py_retval; + int c_retval; + virConnectPtr conn; + PyObject *pyobj_conn; + const char *secret_id, *secret; + int size; + + if (!PyArg_ParseTuple(args, (char *)"Ozz#:virSecretSetValue", &pyobj_conn, + &secret_id, &secret, &size)) + return(NULL); + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virSecretSetValue(conn, secret_id, secret, size); + LIBVIRT_END_ALLOW_THREADS; + + py_retval = libvirt_intWrap(c_retval); + return(py_retval); +} /******************************************* * Helper functions to avoid importing modules @@ -2261,6 +2356,9 @@ static PyMethodDef libvirtMethods[] = { {(char *) "virEventInvokeTimeoutCallback", libvirt_virEventInvokeTimeoutCallback, METH_VARARGS, NULL}, {(char *) "virNodeListDevices", libvirt_virNodeListDevices, METH_VARARGS, NULL}, {(char *) "virNodeDeviceListCaps", libvirt_virNodeDeviceListCaps, METH_VARARGS, NULL}, + {(char *) "virSecretGetValue", libvirt_virSecretGetValue, METH_VARARGS, NULL}, + {(char *) "virSecretListSecrets", libvirt_virSecretListSecrets, METH_VARARGS, NULL}, + {(char *) "virSecretSetValue", libvirt_virSecretSetValue, METH_VARARGS, NULL}, {NULL, NULL, 0, NULL} }; diff --git a/python/libvirt-python-api.xml b/python/libvirt-python-api.xml index 43a5b4e..c1d6546 100644 --- a/python/libvirt-python-api.xml +++ b/python/libvirt-python-api.xml @@ -172,5 +172,23 @@ <arg name='dev' type='virNodeDevicePtr' info='pointer to the node device'/> <return type='str *' info='the list of Names or None in case of error'/> </function> + <function name='virSecretGetValue' file='libvirt' module='libvirt'> + <info>Fetches the secret value associated with secret_id.</info> + <return type='char *' info='the secret value or None in case of error'/> + <arg name='conn' type='virConnectPtr' info='virConnect connection'/> + <arg name='secret_id' type='const char *' info='A secret ID'/> + </function> + <function name='virSecretListSecrets' file='libvirt' module='libvirt'> + <info>List the defined secret IDs</info> + <arg name='conn' type='virConnectPtr' info='virConnect connection'/> + <return type='str *' info='the list of secret IDs or None in case of error'/> + </function> + <function name='virSecretSetValue' file='libvirt' module='libvirt'> + <info>Associates a secret value with secret_id. Allocates secret_id if it was not previously allocated.</info> + <return type='int' info='0 on success, -1 on failure.'/> + <arg name='conn' type='virConnectPtr' info='virConnect connection'/> + <arg name='secret_id' type='const char *' info='A secret ID'/> + <arg name='secret' type='const char *' info='The secret'/> + </function> </symbols> </api> -- 1.6.2.5 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list