提交 9dc3b993 编写于 作者: M Miloslav Trmač 提交者: Daniel P. Berrange

Secret manipulation API docs refresh & wire up python generator

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.UUIDString()
'340c2dfb-811b-eda8-da9e-25ccd7bfd650'

>>> s.XMLDesc()
"<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.value()
'abc\x00xx\xffx'

>>> s.undefine()
0

* python/generator.py: Add rules for virSecret APIs
* python/libvir.c, python/libvirt-python-api.xml: Manual impl of
  virSecretSetValue, virSecretGetValue$ and virConnectListSecrets APIs
* python/libvirt_wrap.h, python/types.c: Wrapper for virSecret objects
* docs/libvirt-api.xml, docs/libvirt-refs.xml,
  docs/html/libvirt-virterror.html, docs/html/libvirt-libvirt.html,
  docs/devhelp/libvirt-virterror.html, docs/devhelp/libvirt-libvirt.html:
  Re-generate with 'make api'
上级 f68c91fa
此差异已折叠。
...@@ -112,6 +112,7 @@ void <a href="#virConnResetLastError">virConnResetLastError</a> (<a href="libvi ...@@ -112,6 +112,7 @@ void <a href="#virConnResetLastError">virConnResetLastError</a> (<a href="libvi
<a name="VIR_FROM_ONE">VIR_FROM_ONE</a> = 27 /* Error from OpenNebula driver */ <a name="VIR_FROM_ONE">VIR_FROM_ONE</a> = 27 /* Error from OpenNebula driver */
<a name="VIR_FROM_ESX">VIR_FROM_ESX</a> = 28 /* Error from ESX driver */ <a name="VIR_FROM_ESX">VIR_FROM_ESX</a> = 28 /* Error from ESX driver */
<a name="VIR_FROM_PHYP">VIR_FROM_PHYP</a> = 29 /* Error from IBM power hypervisor */ <a name="VIR_FROM_PHYP">VIR_FROM_PHYP</a> = 29 /* Error from IBM power hypervisor */
<a name="VIR_FROM_SECRET">VIR_FROM_SECRET</a> = 30 /* Error from secret storage */
}; };
</pre><p/> </pre><p/>
</div> </div>
...@@ -185,6 +186,8 @@ void <a href="#virConnResetLastError">virConnResetLastError</a> (<a href="libvi ...@@ -185,6 +186,8 @@ void <a href="#virConnResetLastError">virConnResetLastError</a> (<a href="libvi
<a name="VIR_ERR_NO_INTERFACE">VIR_ERR_NO_INTERFACE</a> = 57 /* interface driver not running */ <a name="VIR_ERR_NO_INTERFACE">VIR_ERR_NO_INTERFACE</a> = 57 /* interface driver not running */
<a name="VIR_ERR_INVALID_INTERFACE">VIR_ERR_INVALID_INTERFACE</a> = 58 /* invalid interface object */ <a name="VIR_ERR_INVALID_INTERFACE">VIR_ERR_INVALID_INTERFACE</a> = 58 /* invalid interface object */
<a name="VIR_ERR_MULTIPLE_INTERFACES">VIR_ERR_MULTIPLE_INTERFACES</a> = 59 /* more than one matching interface found */ <a name="VIR_ERR_MULTIPLE_INTERFACES">VIR_ERR_MULTIPLE_INTERFACES</a> = 59 /* more than one matching interface found */
<a name="VIR_WAR_NO_SECRET">VIR_WAR_NO_SECRET</a> = 60 /* failed to start secret storage */
<a name="VIR_ERR_INVALID_SECRET">VIR_ERR_INVALID_SECRET</a> = 61 /* invalid secret */
}; };
</pre><p/> </pre><p/>
</div> </div>
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -270,6 +270,11 @@ py_types = { ...@@ -270,6 +270,11 @@ py_types = {
'const virNodeDevicePtr': ('O', "virNodeDevice", "virNodeDevicePtr", "virNodeDevicePtr"), 'const virNodeDevicePtr': ('O', "virNodeDevice", "virNodeDevicePtr", "virNodeDevicePtr"),
'virNodeDevice *': ('O', "virNodeDevice", "virNodeDevicePtr", "virNodeDevicePtr"), 'virNodeDevice *': ('O', "virNodeDevice", "virNodeDevicePtr", "virNodeDevicePtr"),
'const 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 = { py_return_types = {
...@@ -296,6 +301,7 @@ skip_impl = ( ...@@ -296,6 +301,7 @@ skip_impl = (
'virConnectListDefinedNetworks', 'virConnectListDefinedNetworks',
'virConnectListInterfaces', 'virConnectListInterfaces',
'virConnectListDefinedInterfaces', 'virConnectListDefinedInterfaces',
'virConnectListSecrets',
'virConnectListStoragePools', 'virConnectListStoragePools',
'virConnectListDefinedStoragePools', 'virConnectListDefinedStoragePools',
'virConnectListStorageVols', 'virConnectListStorageVols',
...@@ -320,6 +326,8 @@ skip_impl = ( ...@@ -320,6 +326,8 @@ skip_impl = (
'virDomainSetSchedulerParameters', 'virDomainSetSchedulerParameters',
'virDomainGetVcpus', 'virDomainGetVcpus',
'virDomainPinVcpu', 'virDomainPinVcpu',
'virSecretGetValue',
'virSecretSetValue',
'virStoragePoolGetUUID', 'virStoragePoolGetUUID',
'virStoragePoolGetUUIDString', 'virStoragePoolGetUUIDString',
'virStoragePoolLookupByUUID', 'virStoragePoolLookupByUUID',
...@@ -623,6 +631,8 @@ classes_type = { ...@@ -623,6 +631,8 @@ classes_type = {
"virStorageVol *": ("._o", "virStorageVol(self, _obj=%s)", "virStorageVol"), "virStorageVol *": ("._o", "virStorageVol(self, _obj=%s)", "virStorageVol"),
"virNodeDevicePtr": ("._o", "virNodeDevice(self, _obj=%s)", "virNodeDevice"), "virNodeDevicePtr": ("._o", "virNodeDevice(self, _obj=%s)", "virNodeDevice"),
"virNodeDevice *": ("._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"), "virConnectPtr": ("._o", "virConnect(_obj=%s)", "virConnect"),
"virConnect *": ("._o", "virConnect(_obj=%s)", "virConnect"), "virConnect *": ("._o", "virConnect(_obj=%s)", "virConnect"),
} }
...@@ -632,7 +642,7 @@ converter_type = { ...@@ -632,7 +642,7 @@ converter_type = {
primary_classes = ["virDomain", "virNetwork", "virInterface", primary_classes = ["virDomain", "virNetwork", "virInterface",
"virStoragePool", "virStorageVol", "virStoragePool", "virStorageVol",
"virConnect", "virNodeDevice" ] "virConnect", "virNodeDevice", "virSecret" ]
classes_ancestor = { classes_ancestor = {
} }
...@@ -642,7 +652,8 @@ classes_destructors = { ...@@ -642,7 +652,8 @@ classes_destructors = {
"virInterface": "virInterfaceFree", "virInterface": "virInterfaceFree",
"virStoragePool": "virStoragePoolFree", "virStoragePool": "virStoragePoolFree",
"virStorageVol": "virStorageVolFree", "virStorageVol": "virStorageVolFree",
"virNodeDevice" : "virNodeDeviceFree" "virNodeDevice" : "virNodeDeviceFree",
"virSecret": "virSecretFree"
} }
functions_noexcept = { functions_noexcept = {
...@@ -714,6 +725,12 @@ def nameFixup(name, classe, type, file): ...@@ -714,6 +725,12 @@ def nameFixup(name, classe, type, file):
elif name[0:18] == "virInterfaceLookup": elif name[0:18] == "virInterfaceLookup":
func = name[3:] func = name[3:]
func = string.lower(func[0:1]) + func[1:] 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": elif name[0:20] == "virStoragePoolDefine":
func = name[3:] func = name[3:]
func = string.lower(func[0:1]) + func[1:] func = string.lower(func[0:1]) + func[1:]
...@@ -747,6 +764,12 @@ def nameFixup(name, classe, type, file): ...@@ -747,6 +764,12 @@ def nameFixup(name, classe, type, file):
elif name[0:12] == "virInterface": elif name[0:12] == "virInterface":
func = name[10:] func = name[10:]
func = string.lower(func[0:1]) + func[1:] func = string.lower(func[0:1]) + func[1:]
elif name[0:12] == 'virSecretGet':
func = name[12:]
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": elif name[0:17] == "virStoragePoolGet":
func = name[17:] func = name[17:]
func = string.lower(func[0:1]) + func[1:] func = string.lower(func[0:1]) + func[1:]
...@@ -1018,7 +1041,7 @@ def buildWrappers(): ...@@ -1018,7 +1041,7 @@ def buildWrappers():
else: else:
txt.write("Class %s()\n" % (classname)) txt.write("Class %s()\n" % (classname))
classes.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") classes.write(" def __init__(self, conn, _obj=None):\n")
else: else:
classes.write(" def __init__(self, _obj=None):\n") classes.write(" def __init__(self, _obj=None):\n")
...@@ -1026,7 +1049,7 @@ def buildWrappers(): ...@@ -1026,7 +1049,7 @@ def buildWrappers():
list = reference_keepers[classname] list = reference_keepers[classname]
for ref in list: for ref in list:
classes.write(" self.%s = None\n" % ref[1]) 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") classes.write(" self._conn = conn\n")
elif classname in [ "virStorageVol", "virStoragePool" ]: elif classname in [ "virStorageVol", "virStoragePool" ]:
classes.write(" self._conn = conn\n" + \ classes.write(" self._conn = conn\n" + \
......
...@@ -1562,6 +1562,103 @@ libvirt_virNodeDeviceListCaps(PyObject *self ATTRIBUTE_UNUSED, ...@@ -1562,6 +1562,103 @@ libvirt_virNodeDeviceListCaps(PyObject *self ATTRIBUTE_UNUSED,
return(py_retval); 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;
unsigned int flags;
if (!PyArg_ParseTuple(args, (char *)"Oi:virSecretGetValue", &pyobj_secret,
&flags))
return NULL;
secret = (virSecretPtr) PyvirSecret_Get(pyobj_secret);
LIBVIRT_BEGIN_ALLOW_THREADS;
c_retval = virSecretGetValue(secret, &size, flags);
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;
unsigned int flags;
if (!PyArg_ParseTuple(args, (char *)"Oz#i:virSecretSetValue", &pyobj_secret,
&value, &size, &flags))
return NULL;
secret = (virSecretPtr) PyvirSecret_Get(pyobj_secret);
LIBVIRT_BEGIN_ALLOW_THREADS;
c_retval = virSecretSetValue(secret, (const unsigned char *)value, size,
flags);
LIBVIRT_END_ALLOW_THREADS;
py_retval = libvirt_intWrap(c_retval);
return py_retval;
}
/******************************************* /*******************************************
* Helper functions to avoid importing modules * Helper functions to avoid importing modules
...@@ -2261,6 +2358,9 @@ static PyMethodDef libvirtMethods[] = { ...@@ -2261,6 +2358,9 @@ static PyMethodDef libvirtMethods[] = {
{(char *) "virEventInvokeTimeoutCallback", libvirt_virEventInvokeTimeoutCallback, METH_VARARGS, NULL}, {(char *) "virEventInvokeTimeoutCallback", libvirt_virEventInvokeTimeoutCallback, METH_VARARGS, NULL},
{(char *) "virNodeListDevices", libvirt_virNodeListDevices, METH_VARARGS, NULL}, {(char *) "virNodeListDevices", libvirt_virNodeListDevices, METH_VARARGS, NULL},
{(char *) "virNodeDeviceListCaps", libvirt_virNodeDeviceListCaps, 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} {NULL, NULL, 0, NULL}
}; };
......
...@@ -172,5 +172,23 @@ ...@@ -172,5 +172,23 @@
<arg name='dev' type='virNodeDevicePtr' info='pointer to the node device'/> <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'/> <return type='str *' info='the list of Names or None in case of error'/>
</function> </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'/>
<arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
</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'/>
<arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
</function>
</symbols> </symbols>
</api> </api>
...@@ -83,6 +83,14 @@ typedef struct { ...@@ -83,6 +83,14 @@ typedef struct {
virNodeDevicePtr obj; virNodeDevicePtr obj;
} PyvirNodeDevice_Object; } 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 : \ #define PyvirEventHandleCallback_Get(v) (((v) == Py_None) ? NULL : \
(((PyvirEventHandleCallback_Object *)(v))->obj)) (((PyvirEventHandleCallback_Object *)(v))->obj))
...@@ -135,6 +143,7 @@ PyObject * libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node); ...@@ -135,6 +143,7 @@ PyObject * libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node);
PyObject * libvirt_virFreeCallbackWrap(virFreeCallback node); PyObject * libvirt_virFreeCallbackWrap(virFreeCallback node);
PyObject * libvirt_virVoidPtrWrap(void* node); PyObject * libvirt_virVoidPtrWrap(void* node);
PyObject * libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node); PyObject * libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node);
PyObject * libvirt_virSecretPtrWrap(virSecretPtr node);
/* Provide simple macro statement wrappers (adapted from GLib, in turn from Perl): /* Provide simple macro statement wrappers (adapted from GLib, in turn from Perl):
......
...@@ -193,6 +193,19 @@ libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node) ...@@ -193,6 +193,19 @@ libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node)
return (ret); return (ret);
} }
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 * PyObject *
libvirt_virEventHandleCallbackWrap(virEventHandleCallback node) libvirt_virEventHandleCallbackWrap(virEventHandleCallback node)
{ {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册