Sample session:
>> import libvirt
>> c = libvirt.open('qemu:///session')
>> c.listSecrets()
['12247729-47d2-a783-88ce-b329d4781cd3', 'reee', 'abc']
>> s = c.secretDefineXML("<secret ephemeral='no'
private='no'>\n<description>Something for
use</description>\n<volume>/foo/bar</volume>\n</secret>\n")
>> s.getUUIDString()
'340c2dfb-811b-eda8-da9e-25ccd7bfd650'
>> s.getXMLDesc()
"<secret ephemeral='no'
private='no'>\n
<uuid>340c2dfb-811b-eda8-da9e-25ccd7bfd650</uuid>\n
<description>Something for use</description>\n
<volume>/foo/bar</volume>\n</secret>\n"
>> s.setValue('abc\0xx\xffx')
0
>> s.getValue()
'abc\x00xx\xffx'
>> s.undefine()
0
Changes since the second submission:
- Update for new public API
- s/secret_id/uuid/g
- Use "unsigned char *" for secret value
---
python/generator.py | 28 ++++++++++--
python/libvir.c | 96 +++++++++++++++++++++++++++++++++++++++++
python/libvirt-python-api.xml | 16 +++++++
python/libvirt_wrap.h | 9 ++++
python/types.c | 13 ++++++
5 files changed, 158 insertions(+), 4 deletions(-)
diff --git a/python/generator.py b/python/generator.py
index feff7a3..b9b0ecb 100755
--- a/python/generator.py
+++ b/python/generator.py
@@ -270,6 +270,11 @@ py_types = {
'const virNodeDevicePtr': ('O', "virNodeDevice",
"virNodeDevicePtr", "virNodeDevicePtr"),
'virNodeDevice *': ('O', "virNodeDevice",
"virNodeDevicePtr", "virNodeDevicePtr"),
'const virNodeDevice *': ('O', "virNodeDevice",
"virNodeDevicePtr", "virNodeDevicePtr"),
+
+ 'virSecretPtr': ('O', "virSecret",
"virSecretPtr", "virSecretPtr"),
+ 'const virSecretPtr': ('O', "virSecret",
"virSecretPtr", "virSecretPtr"),
+ 'virSecret *': ('O', "virSecret",
"virSecretPtr", "virSecretPtr"),
+ 'const virSecret *': ('O', "virSecret",
"virSecretPtr", "virSecretPtr"),
}
py_return_types = {
@@ -296,6 +301,7 @@ skip_impl = (
'virConnectListDefinedNetworks',
'virConnectListInterfaces',
'virConnectListDefinedInterfaces',
+ 'virConnectListSecrets',
'virConnectListStoragePools',
'virConnectListDefinedStoragePools',
'virConnectListStorageVols',
@@ -320,6 +326,8 @@ skip_impl = (
'virDomainSetSchedulerParameters',
'virDomainGetVcpus',
'virDomainPinVcpu',
+ 'virSecretGetValue',
+ 'virSecretSetValue',
'virStoragePoolGetUUID',
'virStoragePoolGetUUIDString',
'virStoragePoolLookupByUUID',
@@ -623,6 +631,8 @@ classes_type = {
"virStorageVol *": ("._o", "virStorageVol(self,
_obj=%s)", "virStorageVol"),
"virNodeDevicePtr": ("._o", "virNodeDevice(self,
_obj=%s)", "virNodeDevice"),
"virNodeDevice *": ("._o", "virNodeDevice(self,
_obj=%s)", "virNodeDevice"),
+ "virSecretPtr": ("._o", "virSecret(self, _obj=%s)",
"virSecret"),
+ "virSecret *": ("._o", "virSecret(self, _obj=%s)",
"virSecret"),
"virConnectPtr": ("._o", "virConnect(_obj=%s)",
"virConnect"),
"virConnect *": ("._o", "virConnect(_obj=%s)",
"virConnect"),
}
@@ -632,7 +642,7 @@ converter_type = {
primary_classes = ["virDomain", "virNetwork",
"virInterface",
"virStoragePool", "virStorageVol",
- "virConnect", "virNodeDevice" ]
+ "virConnect", "virNodeDevice",
"virSecret" ]
classes_ancestor = {
}
@@ -642,7 +652,8 @@ classes_destructors = {
"virInterface": "virInterfaceFree",
"virStoragePool": "virStoragePoolFree",
"virStorageVol": "virStorageVolFree",
- "virNodeDevice" : "virNodeDeviceFree"
+ "virNodeDevice" : "virNodeDeviceFree",
+ "virSecret": "virSecretFree"
}
functions_noexcept = {
@@ -714,6 +725,12 @@ def nameFixup(name, classe, type, file):
elif name[0:18] == "virInterfaceLookup":
func = name[3:]
func = string.lower(func[0:1]) + func[1:]
+ elif name[0:15] == "virSecretDefine":
+ func = name[3:]
+ func = string.lower(func[0:1]) + func[1:]
+ elif name[0:15] == "virSecretLookup":
+ func = name[3:]
+ func = string.lower(func[0:1]) + func[1:]
elif name[0:20] == "virStoragePoolDefine":
func = name[3:]
func = string.lower(func[0:1]) + func[1:]
@@ -747,6 +764,9 @@ def nameFixup(name, classe, type, file):
elif name[0:12] == "virInterface":
func = name[10:]
func = string.lower(func[0:1]) + func[1:]
+ elif name[0:9] == 'virSecret':
+ func = name[9:]
+ func = string.lower(func[0:1]) + func[1:]
elif name[0:17] == "virStoragePoolGet":
func = name[17:]
func = string.lower(func[0:1]) + func[1:]
@@ -1018,7 +1038,7 @@ def buildWrappers():
else:
txt.write("Class %s()\n" % (classname))
classes.write("class %s:\n" % (classname))
- if classname in [ "virDomain", "virNetwork",
"virInterface", "virStoragePool", "virStorageVol",
"virNodeDevice" ]:
+ if classname in [ "virDomain", "virNetwork",
"virInterface", "virStoragePool", "virStorageVol",
"virNodeDevice", "virSecret" ]:
classes.write(" def __init__(self, conn,
_obj=None):\n")
else:
classes.write(" def __init__(self, _obj=None):\n")
@@ -1026,7 +1046,7 @@ def buildWrappers():
list = reference_keepers[classname]
for ref in list:
classes.write(" self.%s = None\n" % ref[1])
- if classname in [ "virDomain", "virNetwork",
"virInterface", "virNodeDevice" ]:
+ if classname in [ "virDomain", "virNetwork",
"virInterface", "virNodeDevice", "virSecret" ]:
classes.write(" self._conn = conn\n")
elif classname in [ "virStorageVol", "virStoragePool"
]:
classes.write(" self._conn = conn\n" + \
diff --git a/python/libvir.c b/python/libvir.c
index e210597..ca9ec26 100644
--- a/python/libvir.c
+++ b/python/libvir.c
@@ -1562,6 +1562,99 @@ libvirt_virNodeDeviceListCaps(PyObject *self ATTRIBUTE_UNUSED,
return(py_retval);
}
+static PyObject *
+libvirt_virConnectListSecrets(PyObject *self ATTRIBUTE_UNUSED,
+ PyObject *args) {
+ PyObject *py_retval;
+ char **uuids = NULL;
+ virConnectPtr conn;
+ int c_retval, i;
+ PyObject *pyobj_conn;
+
+ if (!PyArg_ParseTuple(args, (char *)"O:virConnectListSecrets",
&pyobj_conn))
+ return NULL;
+ conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
+
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+ c_retval = virConnectNumOfSecrets(conn);
+ LIBVIRT_END_ALLOW_THREADS;
+ if (c_retval < 0)
+ return VIR_PY_NONE;
+
+ if (c_retval) {
+ uuids = malloc(sizeof(*uuids) * c_retval);
+ if (!uuids)
+ return VIR_PY_NONE;
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+ c_retval = virConnectListSecrets(conn, uuids, c_retval);
+ LIBVIRT_END_ALLOW_THREADS;
+ if (c_retval < 0) {
+ free(uuids);
+ return VIR_PY_NONE;
+ }
+ }
+ py_retval = PyList_New(c_retval);
+
+ if (uuids) {
+ for (i = 0;i < c_retval;i++) {
+ PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(uuids[i]));
+ free(uuids[i]);
+ }
+ free(uuids);
+ }
+
+ return py_retval;
+}
+
+static PyObject *
+libvirt_virSecretGetValue(PyObject *self ATTRIBUTE_UNUSED,
+ PyObject *args) {
+ PyObject *py_retval;
+ unsigned char *c_retval;
+ size_t size;
+ virSecretPtr secret;
+ PyObject *pyobj_secret;
+
+ if (!PyArg_ParseTuple(args, (char *)"O:virSecretGetValue",
&pyobj_secret))
+ return NULL;
+ secret = (virSecretPtr) PyvirSecret_Get(pyobj_secret);
+
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+ c_retval = virSecretGetValue(secret, &size);
+ LIBVIRT_END_ALLOW_THREADS;
+
+ if (c_retval == NULL)
+ return VIR_PY_NONE;
+
+ py_retval = PyString_FromStringAndSize((const char *)c_retval, size);
+ memset(c_retval, 0, size);
+ free(c_retval);
+
+ return py_retval;
+}
+
+static PyObject *
+libvirt_virSecretSetValue(PyObject *self ATTRIBUTE_UNUSED,
+ PyObject *args) {
+ PyObject *py_retval;
+ int c_retval;
+ virSecretPtr secret;
+ PyObject *pyobj_secret;
+ const char *value;
+ int size;
+
+ if (!PyArg_ParseTuple(args, (char *)"Oz#:virSecretSetValue",
&pyobj_secret,
+ &value, &size))
+ return NULL;
+ secret = (virSecretPtr) PyvirSecret_Get(pyobj_secret);
+
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+ c_retval = virSecretSetValue(secret, (const unsigned char *)value, size);
+ LIBVIRT_END_ALLOW_THREADS;
+
+ py_retval = libvirt_intWrap(c_retval);
+ return py_retval;
+}
/*******************************************
* Helper functions to avoid importing modules
@@ -2261,6 +2354,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 *) "virConnectListSecrets", libvirt_virConnectListSecrets,
METH_VARARGS, NULL},
+ {(char *) "virSecretGetValue", libvirt_virSecretGetValue, 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..97193d8 100644
--- a/python/libvirt-python-api.xml
+++ b/python/libvirt-python-api.xml
@@ -172,5 +172,21 @@
<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 value associated with a secret.</info>
+ <return type='char *' info='the secret value or None in case of
error'/>
+ <arg name='secret' type='virSecretPtr' info='virSecret
secret'/>
+ </function>
+ <function name='virConnectListSecrets' 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 value with a secret.</info>
+ <return type='int' info='0 on success, -1 on failure.'/>
+ <arg name='secret' type='virSecretPtr' info='virSecret
secret'/>
+ <arg name='value' type='const char *' info='The secret
value'/>
+ </function>
</symbols>
</api>
diff --git a/python/libvirt_wrap.h b/python/libvirt_wrap.h
index 4a32edd..99d5805 100644
--- a/python/libvirt_wrap.h
+++ b/python/libvirt_wrap.h
@@ -83,6 +83,14 @@ typedef struct {
virNodeDevicePtr obj;
} PyvirNodeDevice_Object;
+#define PyvirSecret_Get(v) (((v) == Py_None) ? NULL : \
+ (((PyvirSecret_Object *)(v))->obj))
+
+typedef struct {
+ PyObject_HEAD
+ virSecretPtr obj;
+} PyvirSecret_Object;
+
#define PyvirEventHandleCallback_Get(v) (((v) == Py_None) ? NULL : \
(((PyvirEventHandleCallback_Object *)(v))->obj))
@@ -135,6 +143,7 @@ PyObject * libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback
node);
PyObject * libvirt_virFreeCallbackWrap(virFreeCallback node);
PyObject * libvirt_virVoidPtrWrap(void* node);
PyObject * libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node);
+PyObject * libvirt_virSecretPtrWrap(virSecretPtr node);
/* Provide simple macro statement wrappers (adapted from GLib, in turn from Perl):
diff --git a/python/types.c b/python/types.c
index de75471..c445f5f 100644
--- a/python/types.c
+++ b/python/types.c
@@ -194,6 +194,19 @@ libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node)
}
PyObject *
+libvirt_virSecretPtrWrap(virSecretPtr node)
+{
+ PyObject *ret;
+
+ if (node == NULL) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+ ret = PyCObject_FromVoidPtrAndDesc(node, (char *) "virSecretPtr", NULL);
+ return (ret);
+}
+
+PyObject *
libvirt_virEventHandleCallbackWrap(virEventHandleCallback node)
{
PyObject *ret;
--
1.6.2.5