2005-12-19 16:34:11 +00:00
|
|
|
/*
|
|
|
|
* libvir.c: this modules implements the main part of the glue of the
|
|
|
|
* libvir library and the Python interpreter. It provides the
|
|
|
|
* entry points where an automatically generated stub is
|
|
|
|
* unpractical
|
|
|
|
*
|
2013-04-19 20:18:14 +00:00
|
|
|
* Copyright (C) 2005, 2007-2013 Red Hat, Inc.
|
2005-12-19 16:34:11 +00:00
|
|
|
*
|
|
|
|
* Daniel Veillard <veillard@redhat.com>
|
|
|
|
*/
|
|
|
|
|
2008-01-29 18:15:54 +00:00
|
|
|
#include <config.h>
|
2007-12-07 10:08:06 +00:00
|
|
|
|
2008-04-18 18:07:40 +00:00
|
|
|
/* Horrible kludge to work around even more horrible name-space pollution
|
|
|
|
via Python.h. That file includes /usr/include/python2.5/pyconfig*.h,
|
|
|
|
which has over 180 autoconf-style HAVE_* definitions. Shame on them. */
|
|
|
|
#undef HAVE_PTHREAD_H
|
|
|
|
|
2012-02-08 12:20:50 +00:00
|
|
|
/* We want to see *_LAST enums. */
|
|
|
|
#define VIR_ENUM_SENTINELS
|
|
|
|
|
2005-12-19 16:34:11 +00:00
|
|
|
#include <Python.h>
|
2013-04-17 10:19:19 +00:00
|
|
|
#include <libvirt/libvirt.h>
|
|
|
|
#include <libvirt/virterror.h>
|
2009-09-16 13:03:53 +00:00
|
|
|
#include "typewrappers.h"
|
|
|
|
#include "libvirt.h"
|
2012-12-12 18:06:53 +00:00
|
|
|
#include "viralloc.h"
|
2012-02-08 12:20:50 +00:00
|
|
|
#include "virtypedparam.h"
|
|
|
|
#include "ignore-value.h"
|
2012-12-13 17:44:57 +00:00
|
|
|
#include "virutil.h"
|
2013-04-03 10:36:23 +00:00
|
|
|
#include "virstring.h"
|
2005-12-19 16:34:11 +00:00
|
|
|
|
2007-11-30 11:10:53 +00:00
|
|
|
#ifndef __CYGWIN__
|
2007-03-06 21:55:44 +00:00
|
|
|
extern void initlibvirtmod(void);
|
2007-11-30 11:10:53 +00:00
|
|
|
#else
|
|
|
|
extern void initcygvirtmod(void);
|
|
|
|
#endif
|
2005-12-19 16:34:11 +00:00
|
|
|
|
2011-06-14 16:59:44 +00:00
|
|
|
#if 0
|
|
|
|
# define DEBUG_ERROR 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if DEBUG_ERROR
|
|
|
|
# define DEBUG(fmt, ...) \
|
|
|
|
printf(fmt, __VA_ARGS__)
|
|
|
|
#else
|
|
|
|
# define DEBUG(fmt, ...) \
|
|
|
|
do {} while (0)
|
|
|
|
#endif
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
/* 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; */
|
|
|
|
#define VIR_PY_NONE (Py_INCREF (Py_None), Py_None)
|
2008-02-07 09:49:13 +00:00
|
|
|
#define VIR_PY_INT_FAIL (libvirt_intWrap(-1))
|
|
|
|
#define VIR_PY_INT_SUCCESS (libvirt_intWrap(0))
|
2008-01-17 22:13:55 +00:00
|
|
|
|
2011-05-23 12:41:00 +00:00
|
|
|
/* We don't want to free() returned value. As written in doc:
|
|
|
|
* PyString_AsString returns pointer to 'internal buffer of string,
|
|
|
|
* not a copy' and 'It must not be deallocated'. */
|
2008-11-24 19:28:12 +00:00
|
|
|
static char *py_str(PyObject *obj)
|
|
|
|
{
|
|
|
|
PyObject *str = PyObject_Str(obj);
|
|
|
|
if (!str) {
|
|
|
|
PyErr_Print();
|
|
|
|
PyErr_Clear();
|
|
|
|
return NULL;
|
|
|
|
};
|
|
|
|
return PyString_AsString(str);
|
|
|
|
}
|
|
|
|
|
2012-02-08 12:20:50 +00:00
|
|
|
/* Helper function to convert a virTypedParameter output array into a
|
|
|
|
* Python dictionary for return to the user. Return NULL on failure,
|
|
|
|
* after raising a python exception. */
|
2012-05-02 15:05:59 +00:00
|
|
|
static PyObject *
|
2012-02-08 12:20:50 +00:00
|
|
|
getPyVirTypedParameter(const virTypedParameterPtr params, int nparams)
|
|
|
|
{
|
|
|
|
PyObject *key, *val, *info;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-02-08 12:20:50 +00:00
|
|
|
|
|
|
|
if ((info = PyDict_New()) == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
2013-05-21 08:05:06 +00:00
|
|
|
for (i = 0; i < nparams; i++) {
|
2012-02-08 12:20:50 +00:00
|
|
|
switch (params[i].type) {
|
|
|
|
case VIR_TYPED_PARAM_INT:
|
|
|
|
val = PyInt_FromLong(params[i].value.i);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_TYPED_PARAM_UINT:
|
|
|
|
val = PyInt_FromLong(params[i].value.ui);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_TYPED_PARAM_LLONG:
|
|
|
|
val = PyLong_FromLongLong(params[i].value.l);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_TYPED_PARAM_ULLONG:
|
|
|
|
val = PyLong_FromUnsignedLongLong(params[i].value.ul);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_TYPED_PARAM_DOUBLE:
|
|
|
|
val = PyFloat_FromDouble(params[i].value.d);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_TYPED_PARAM_BOOLEAN:
|
|
|
|
val = PyBool_FromLong(params[i].value.b);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case VIR_TYPED_PARAM_STRING:
|
|
|
|
val = libvirt_constcharPtrWrap(params[i].value.s);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
/* Possible if a newer server has a bug and sent stuff we
|
|
|
|
* don't recognize. */
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Type value \"%d\" not recognized",
|
|
|
|
params[i].type);
|
|
|
|
val = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
key = libvirt_constcharPtrWrap(params[i].field);
|
|
|
|
if (!key || !val)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (PyDict_SetItem(info, key, val) < 0) {
|
|
|
|
Py_DECREF(info);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_DECREF(key);
|
|
|
|
Py_DECREF(val);
|
|
|
|
}
|
|
|
|
return info;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
Py_XDECREF(key);
|
|
|
|
Py_XDECREF(val);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Allocate a new typed parameter array with the same contents and
|
|
|
|
* length as info, and using the array params of length nparams as
|
|
|
|
* hints on what types to use when creating the new array. The caller
|
|
|
|
* must NOT clear the array before freeing it, as it points into info
|
|
|
|
* rather than allocated strings. Return NULL on failure, after
|
|
|
|
* raising a python exception. */
|
|
|
|
static virTypedParameterPtr ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
|
|
|
|
setPyVirTypedParameter(PyObject *info,
|
|
|
|
const virTypedParameterPtr params, int nparams)
|
|
|
|
{
|
|
|
|
PyObject *key, *value;
|
2013-05-08 14:42:03 +00:00
|
|
|
#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION <= 4
|
|
|
|
int pos = 0;
|
|
|
|
#else
|
2012-02-08 12:20:50 +00:00
|
|
|
Py_ssize_t pos = 0;
|
2013-05-08 14:42:03 +00:00
|
|
|
#endif
|
2012-02-08 12:20:50 +00:00
|
|
|
virTypedParameterPtr temp = NULL, ret = NULL;
|
2012-02-10 10:17:26 +00:00
|
|
|
Py_ssize_t size;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-02-08 12:20:50 +00:00
|
|
|
|
|
|
|
if ((size = PyDict_Size(info)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
/* Libvirt APIs use NULL array and 0 size as a special case;
|
|
|
|
* setting should have at least one parameter. */
|
|
|
|
if (size == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError, "Dictionary must not be empty");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(ret, size) < 0) {
|
2012-02-08 12:20:50 +00:00
|
|
|
PyErr_NoMemory();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
temp = &ret[0];
|
|
|
|
while (PyDict_Next(info, &pos, &key, &value)) {
|
|
|
|
char *keystr = NULL;
|
|
|
|
|
|
|
|
if ((keystr = PyString_AsString(key)) == NULL)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < nparams; i++) {
|
|
|
|
if (STREQ(params[i].field, keystr))
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (i == nparams) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Attribute name \"%s\" could not be recognized",
|
|
|
|
keystr);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ignore_value(virStrcpyStatic(temp->field, keystr));
|
|
|
|
temp->type = params[i].type;
|
|
|
|
|
2012-10-17 09:23:12 +00:00
|
|
|
switch (params[i].type) {
|
2012-02-08 12:20:50 +00:00
|
|
|
case VIR_TYPED_PARAM_INT:
|
2012-03-27 06:06:47 +00:00
|
|
|
if (libvirt_intUnwrap(value, &temp->value.i) < 0)
|
2012-02-08 12:20:50 +00:00
|
|
|
goto cleanup;
|
2012-03-27 06:06:47 +00:00
|
|
|
break;
|
|
|
|
|
2012-02-08 12:20:50 +00:00
|
|
|
case VIR_TYPED_PARAM_UINT:
|
2012-03-27 06:06:47 +00:00
|
|
|
if (libvirt_uintUnwrap(value, &temp->value.ui) < 0)
|
2012-02-08 12:20:50 +00:00
|
|
|
goto cleanup;
|
2012-03-27 06:06:47 +00:00
|
|
|
break;
|
|
|
|
|
2012-02-08 12:20:50 +00:00
|
|
|
case VIR_TYPED_PARAM_LLONG:
|
2012-03-27 06:06:47 +00:00
|
|
|
if (libvirt_longlongUnwrap(value, &temp->value.l) < 0)
|
2012-02-08 12:20:50 +00:00
|
|
|
goto cleanup;
|
2012-03-27 06:06:47 +00:00
|
|
|
break;
|
|
|
|
|
2012-02-08 12:20:50 +00:00
|
|
|
case VIR_TYPED_PARAM_ULLONG:
|
2012-03-27 06:06:47 +00:00
|
|
|
if (libvirt_ulonglongUnwrap(value, &temp->value.ul) < 0)
|
2012-02-08 12:20:50 +00:00
|
|
|
goto cleanup;
|
2012-03-27 06:06:47 +00:00
|
|
|
break;
|
|
|
|
|
2012-02-08 12:20:50 +00:00
|
|
|
case VIR_TYPED_PARAM_DOUBLE:
|
2012-03-27 06:06:47 +00:00
|
|
|
if (libvirt_doubleUnwrap(value, &temp->value.d) < 0)
|
2012-02-08 12:20:50 +00:00
|
|
|
goto cleanup;
|
2012-03-27 06:06:47 +00:00
|
|
|
break;
|
|
|
|
|
2012-02-08 12:20:50 +00:00
|
|
|
case VIR_TYPED_PARAM_BOOLEAN:
|
|
|
|
{
|
2012-03-27 06:06:47 +00:00
|
|
|
bool b;
|
|
|
|
if (libvirt_boolUnwrap(value, &b) < 0)
|
2012-02-08 12:20:50 +00:00
|
|
|
goto cleanup;
|
2012-03-27 06:06:47 +00:00
|
|
|
temp->value.b = b;
|
|
|
|
break;
|
2012-02-08 12:20:50 +00:00
|
|
|
}
|
|
|
|
case VIR_TYPED_PARAM_STRING:
|
|
|
|
{
|
|
|
|
char *string_val = PyString_AsString(value);
|
|
|
|
if (!string_val)
|
|
|
|
goto cleanup;
|
|
|
|
temp->value.s = string_val;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
/* Possible if a newer server has a bug and sent stuff we
|
|
|
|
* don't recognize. */
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Type value \"%d\" not recognized",
|
|
|
|
params[i].type);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
temp++;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
VIR_FREE(ret);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-06-14 09:20:54 +00:00
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
const char *name;
|
|
|
|
int type;
|
|
|
|
} virPyTypedParamsHint;
|
|
|
|
typedef virPyTypedParamsHint *virPyTypedParamsHintPtr;
|
|
|
|
|
|
|
|
/* Automatically convert dict into type parameters based on types reported
|
|
|
|
* by python. All integer types are converted into LLONG (in case of a negative
|
|
|
|
* value) or ULLONG (in case of a positive value). If you need different
|
|
|
|
* handling, use @hints to explicitly specify what types should be used for
|
|
|
|
* specific parameters.
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
|
|
|
virPyDictToTypedParams(PyObject *dict,
|
|
|
|
virTypedParameterPtr *ret_params,
|
|
|
|
int *ret_nparams,
|
|
|
|
virPyTypedParamsHintPtr hints,
|
|
|
|
int nhints)
|
|
|
|
{
|
|
|
|
PyObject *key;
|
|
|
|
PyObject *value;
|
|
|
|
#if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION <= 4
|
|
|
|
int pos = 0;
|
|
|
|
#else
|
|
|
|
Py_ssize_t pos = 0;
|
|
|
|
#endif
|
|
|
|
virTypedParameterPtr params = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2013-06-14 09:20:54 +00:00
|
|
|
int n = 0;
|
|
|
|
int max = 0;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
*ret_params = NULL;
|
|
|
|
*ret_nparams = 0;
|
|
|
|
|
|
|
|
if (PyDict_Size(dict) < 0)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
while (PyDict_Next(dict, &pos, &key, &value)) {
|
|
|
|
char *keystr;
|
|
|
|
int type = -1;
|
|
|
|
|
|
|
|
if (!(keystr = PyString_AsString(key)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < nhints; i++) {
|
|
|
|
if (STREQ(hints[i].name, keystr)) {
|
|
|
|
type = hints[i].type;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (type == -1) {
|
|
|
|
if (PyString_Check(value)) {
|
|
|
|
type = VIR_TYPED_PARAM_STRING;
|
|
|
|
} else if (PyBool_Check(value)) {
|
|
|
|
type = VIR_TYPED_PARAM_BOOLEAN;
|
|
|
|
} else if (PyLong_Check(value)) {
|
|
|
|
unsigned long long ull = PyLong_AsUnsignedLongLong(value);
|
|
|
|
if (ull == (unsigned long long) -1 && PyErr_Occurred())
|
|
|
|
type = VIR_TYPED_PARAM_LLONG;
|
|
|
|
else
|
|
|
|
type = VIR_TYPED_PARAM_ULLONG;
|
|
|
|
} else if (PyInt_Check(value)) {
|
|
|
|
if (PyInt_AS_LONG(value) < 0)
|
|
|
|
type = VIR_TYPED_PARAM_LLONG;
|
|
|
|
else
|
|
|
|
type = VIR_TYPED_PARAM_ULLONG;
|
|
|
|
} else if (PyFloat_Check(value)) {
|
|
|
|
type = VIR_TYPED_PARAM_DOUBLE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (type == -1) {
|
|
|
|
PyErr_Format(PyExc_TypeError,
|
|
|
|
"Unknown type of \"%s\" field", keystr);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch ((virTypedParameterType) type) {
|
|
|
|
case VIR_TYPED_PARAM_INT:
|
|
|
|
{
|
|
|
|
int val;
|
|
|
|
if (libvirt_intUnwrap(value, &val) < 0 ||
|
|
|
|
virTypedParamsAddInt(¶ms, &n, &max, keystr, val) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case VIR_TYPED_PARAM_UINT:
|
|
|
|
{
|
|
|
|
unsigned int val;
|
|
|
|
if (libvirt_uintUnwrap(value, &val) < 0 ||
|
|
|
|
virTypedParamsAddUInt(¶ms, &n, &max, keystr, val) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case VIR_TYPED_PARAM_LLONG:
|
|
|
|
{
|
|
|
|
long long val;
|
|
|
|
if (libvirt_longlongUnwrap(value, &val) < 0 ||
|
|
|
|
virTypedParamsAddLLong(¶ms, &n, &max, keystr, val) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case VIR_TYPED_PARAM_ULLONG:
|
|
|
|
{
|
|
|
|
unsigned long long val;
|
|
|
|
if (libvirt_ulonglongUnwrap(value, &val) < 0 ||
|
|
|
|
virTypedParamsAddULLong(¶ms, &n, &max, keystr, val) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case VIR_TYPED_PARAM_DOUBLE:
|
|
|
|
{
|
|
|
|
double val;
|
|
|
|
if (libvirt_doubleUnwrap(value, &val) < 0 ||
|
|
|
|
virTypedParamsAddDouble(¶ms, &n, &max, keystr, val) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case VIR_TYPED_PARAM_BOOLEAN:
|
|
|
|
{
|
|
|
|
bool val;
|
|
|
|
if (libvirt_boolUnwrap(value, &val) < 0 ||
|
|
|
|
virTypedParamsAddBoolean(¶ms, &n, &max, keystr, val) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case VIR_TYPED_PARAM_STRING:
|
|
|
|
{
|
|
|
|
char *val = PyString_AsString(value);
|
|
|
|
if (!val ||
|
|
|
|
virTypedParamsAddString(¶ms, &n, &max, keystr, val) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case VIR_TYPED_PARAM_LAST:
|
|
|
|
break; /* unreachable */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*ret_params = params;
|
|
|
|
*ret_nparams = n;
|
|
|
|
params = NULL;
|
|
|
|
ret = 0;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
virTypedParamsFree(params, n);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
/*
|
|
|
|
* Utility function to retrieve the number of node CPUs present.
|
|
|
|
* It first tries virGetNodeCPUMap, which will return the
|
|
|
|
* number reliably, if available.
|
|
|
|
* As a fallback and for compatibility with backlevel libvirt
|
|
|
|
* versions virGetNodeInfo will be called to calculate the
|
|
|
|
* CPU number, which has the potential to return a too small
|
|
|
|
* number if some host CPUs are offline.
|
|
|
|
*/
|
|
|
|
static int
|
|
|
|
getPyNodeCPUCount(virConnectPtr conn) {
|
|
|
|
int i_retval;
|
|
|
|
virNodeInfo nodeinfo;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virNodeGetCPUMap(conn, NULL, NULL, 0);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
|
|
|
/* fallback: use nodeinfo */
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virNodeGetInfo(conn, &nodeinfo);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (i_retval < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
i_retval = VIR_NODEINFO_MAXCPUS(nodeinfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
return i_retval;
|
|
|
|
}
|
|
|
|
|
2007-09-30 20:52:13 +00:00
|
|
|
/************************************************************************
|
|
|
|
* *
|
|
|
|
* Statistics *
|
|
|
|
* *
|
|
|
|
************************************************************************/
|
|
|
|
|
2008-01-21 15:55:53 +00:00
|
|
|
static PyObject *
|
2007-09-30 20:52:13 +00:00
|
|
|
libvirt_virDomainBlockStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
char * path;
|
|
|
|
int c_retval;
|
|
|
|
virDomainBlockStatsStruct stats;
|
|
|
|
PyObject *info;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oz:virDomainBlockStats",
|
|
|
|
&pyobj_domain,&path))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-09-30 20:52:13 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2007-09-30 20:52:13 +00:00
|
|
|
c_retval = virDomainBlockStats(domain, path, &stats, sizeof(stats));
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
2006-10-24 20:28:16 +00:00
|
|
|
|
2008-01-17 22:14:57 +00:00
|
|
|
/* convert to a Python tuple of long objects */
|
|
|
|
if ((info = PyTuple_New(5)) == NULL)
|
|
|
|
return VIR_PY_NONE;
|
2007-09-30 20:52:13 +00:00
|
|
|
PyTuple_SetItem(info, 0, PyLong_FromLongLong(stats.rd_req));
|
|
|
|
PyTuple_SetItem(info, 1, PyLong_FromLongLong(stats.rd_bytes));
|
|
|
|
PyTuple_SetItem(info, 2, PyLong_FromLongLong(stats.wr_req));
|
|
|
|
PyTuple_SetItem(info, 3, PyLong_FromLongLong(stats.wr_bytes));
|
|
|
|
PyTuple_SetItem(info, 4, PyLong_FromLongLong(stats.errs));
|
2012-03-22 11:33:35 +00:00
|
|
|
return info;
|
2007-09-30 20:52:13 +00:00
|
|
|
}
|
|
|
|
|
2011-09-05 08:24:21 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainBlockStatsFlags(PyObject *self ATTRIBUTE_UNUSED,
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2011-09-05 08:24:21 +00:00
|
|
|
virDomainPtr domain;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *ret = NULL;
|
2011-09-05 08:24:21 +00:00
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
2011-09-05 08:24:21 +00:00
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
const char *path;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainBlockStatsFlags",
|
|
|
|
&pyobj_domain, &path, &flags))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2011-09-05 08:24:21 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainBlockStatsFlags(domain, path, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (!nparams)
|
|
|
|
return PyDict_New();
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-09-05 08:24:21 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainBlockStatsFlags(domain, path, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_NONE;
|
|
|
|
goto cleanup;
|
2011-09-05 08:24:21 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = getPyVirTypedParameter(params, nparams);
|
2011-09-05 08:24:21 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
return ret;
|
2011-09-05 08:24:21 +00:00
|
|
|
}
|
|
|
|
|
2012-03-20 04:34:06 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetCPUStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *totalbool;
|
|
|
|
PyObject *cpu, *total;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
PyObject *error = NULL;
|
|
|
|
int ncpus = -1, start_cpu = 0;
|
|
|
|
int sumparams = 0, nparams = -1;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
|
|
|
int i_retval;
|
2012-03-27 06:06:47 +00:00
|
|
|
unsigned int flags;
|
|
|
|
bool totalflag;
|
2012-03-20 04:34:06 +00:00
|
|
|
virTypedParameterPtr params = NULL, cpuparams;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OOi:virDomainGetCPUStats",
|
|
|
|
&pyobj_domain, &totalbool, &flags))
|
|
|
|
return NULL;
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-03-27 06:06:47 +00:00
|
|
|
if (libvirt_boolUnwrap(totalbool, &totalflag) < 0)
|
2012-03-20 04:34:06 +00:00
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if ((ret = PyList_New(0)) == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (!totalflag) {
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ncpus = virDomainGetCPUStats(domain, NULL, 0, 0, 0, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (ncpus < 0) {
|
|
|
|
error = VIR_PY_NONE;
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
nparams = virDomainGetCPUStats(domain, NULL, 0, 0, 1, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (nparams < 0) {
|
|
|
|
error = VIR_PY_NONE;
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
sumparams = nparams * MIN(ncpus, 128);
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, sumparams) < 0) {
|
2012-03-20 04:34:06 +00:00
|
|
|
error = PyErr_NoMemory();
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
while (ncpus) {
|
|
|
|
int queried_ncpus = MIN(ncpus, 128);
|
|
|
|
if (nparams) {
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetCPUStats(domain, params,
|
|
|
|
nparams, start_cpu, queried_ncpus, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
|
|
|
error = VIR_PY_NONE;
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
i_retval = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < queried_ncpus; i++) {
|
|
|
|
cpuparams = ¶ms[i * nparams];
|
|
|
|
if ((cpu = getPyVirTypedParameter(cpuparams, i_retval)) == NULL) {
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (PyList_Append(ret, cpu) < 0) {
|
|
|
|
Py_DECREF(cpu);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
Py_DECREF(cpu);
|
|
|
|
}
|
|
|
|
|
|
|
|
start_cpu += queried_ncpus;
|
|
|
|
ncpus -= queried_ncpus;
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsClear(params, sumparams);
|
2012-03-20 04:34:06 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
nparams = virDomainGetCPUStats(domain, NULL, 0, -1, 1, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (nparams < 0) {
|
|
|
|
error = VIR_PY_NONE;
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nparams) {
|
|
|
|
sumparams = nparams;
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0) {
|
2012-03-20 04:34:06 +00:00
|
|
|
error = PyErr_NoMemory();
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetCPUStats(domain, params, nparams, -1, 1, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
|
|
|
error = VIR_PY_NONE;
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
i_retval = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((total = getPyVirTypedParameter(params, i_retval)) == NULL) {
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
if (PyList_Append(ret, total) < 0) {
|
|
|
|
Py_DECREF(total);
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
Py_DECREF(total);
|
|
|
|
}
|
|
|
|
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, sumparams);
|
2012-03-20 04:34:06 +00:00
|
|
|
return ret;
|
|
|
|
|
|
|
|
error:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, sumparams);
|
2012-03-20 04:34:06 +00:00
|
|
|
Py_DECREF(ret);
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
|
2008-01-21 15:55:53 +00:00
|
|
|
static PyObject *
|
2007-09-30 20:52:13 +00:00
|
|
|
libvirt_virDomainInterfaceStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
char * path;
|
|
|
|
int c_retval;
|
|
|
|
virDomainInterfaceStatsStruct stats;
|
|
|
|
PyObject *info;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oz:virDomainInterfaceStats",
|
|
|
|
&pyobj_domain,&path))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-09-30 20:52:13 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2007-09-30 20:52:13 +00:00
|
|
|
c_retval = virDomainInterfaceStats(domain, path, &stats, sizeof(stats));
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
2007-09-30 20:52:13 +00:00
|
|
|
|
2008-01-17 22:14:57 +00:00
|
|
|
/* convert to a Python tuple of long objects */
|
|
|
|
if ((info = PyTuple_New(8)) == NULL)
|
|
|
|
return VIR_PY_NONE;
|
2007-09-30 20:52:13 +00:00
|
|
|
PyTuple_SetItem(info, 0, PyLong_FromLongLong(stats.rx_bytes));
|
|
|
|
PyTuple_SetItem(info, 1, PyLong_FromLongLong(stats.rx_packets));
|
|
|
|
PyTuple_SetItem(info, 2, PyLong_FromLongLong(stats.rx_errs));
|
|
|
|
PyTuple_SetItem(info, 3, PyLong_FromLongLong(stats.rx_drop));
|
|
|
|
PyTuple_SetItem(info, 4, PyLong_FromLongLong(stats.tx_bytes));
|
|
|
|
PyTuple_SetItem(info, 5, PyLong_FromLongLong(stats.tx_packets));
|
|
|
|
PyTuple_SetItem(info, 6, PyLong_FromLongLong(stats.tx_errs));
|
|
|
|
PyTuple_SetItem(info, 7, PyLong_FromLongLong(stats.tx_drop));
|
2012-03-22 11:33:35 +00:00
|
|
|
return info;
|
2007-09-30 20:52:13 +00:00
|
|
|
}
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2009-12-20 12:48:37 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainMemoryStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
unsigned int nr_stats;
|
|
|
|
size_t i;
|
2009-12-20 12:48:37 +00:00
|
|
|
virDomainMemoryStatStruct stats[VIR_DOMAIN_MEMORY_STAT_NR];
|
|
|
|
PyObject *info;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainMemoryStats", &pyobj_domain))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2009-12-20 12:48:37 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
nr_stats = virDomainMemoryStats(domain, stats,
|
|
|
|
VIR_DOMAIN_MEMORY_STAT_NR, 0);
|
|
|
|
if (nr_stats == -1)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
/* convert to a Python dictionary */
|
|
|
|
if ((info = PyDict_New()) == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
for (i = 0; i < nr_stats; i++) {
|
|
|
|
if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_SWAP_IN)
|
|
|
|
PyDict_SetItem(info, libvirt_constcharPtrWrap("swap_in"),
|
|
|
|
PyLong_FromUnsignedLongLong(stats[i].val));
|
|
|
|
else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_SWAP_OUT)
|
|
|
|
PyDict_SetItem(info, libvirt_constcharPtrWrap("swap_out"),
|
|
|
|
PyLong_FromUnsignedLongLong(stats[i].val));
|
|
|
|
else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT)
|
|
|
|
PyDict_SetItem(info, libvirt_constcharPtrWrap("major_fault"),
|
|
|
|
PyLong_FromUnsignedLongLong(stats[i].val));
|
|
|
|
else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT)
|
|
|
|
PyDict_SetItem(info, libvirt_constcharPtrWrap("minor_fault"),
|
|
|
|
PyLong_FromUnsignedLongLong(stats[i].val));
|
|
|
|
else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_UNUSED)
|
|
|
|
PyDict_SetItem(info, libvirt_constcharPtrWrap("unused"),
|
|
|
|
PyLong_FromUnsignedLongLong(stats[i].val));
|
|
|
|
else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_AVAILABLE)
|
|
|
|
PyDict_SetItem(info, libvirt_constcharPtrWrap("available"),
|
|
|
|
PyLong_FromUnsignedLongLong(stats[i].val));
|
2012-02-03 14:53:06 +00:00
|
|
|
else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON)
|
|
|
|
PyDict_SetItem(info, libvirt_constcharPtrWrap("actual"),
|
|
|
|
PyLong_FromUnsignedLongLong(stats[i].val));
|
|
|
|
else if (stats[i].tag == VIR_DOMAIN_MEMORY_STAT_RSS)
|
|
|
|
PyDict_SetItem(info, libvirt_constcharPtrWrap("rss"),
|
|
|
|
PyLong_FromUnsignedLongLong(stats[i].val));
|
2009-12-20 12:48:37 +00:00
|
|
|
}
|
|
|
|
return info;
|
|
|
|
}
|
2008-01-21 15:41:15 +00:00
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetSchedulerType(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *info;
|
|
|
|
char *c_retval;
|
|
|
|
int nparams;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetScedulerType",
|
|
|
|
&pyobj_domain))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-01-21 15:41:15 +00:00
|
|
|
c_retval = virDomainGetSchedulerType(domain, &nparams);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-01-21 15:41:15 +00:00
|
|
|
if (c_retval == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
2008-02-29 12:53:10 +00:00
|
|
|
/* convert to a Python tuple of long objects */
|
2008-01-21 15:41:15 +00:00
|
|
|
if ((info = PyTuple_New(2)) == NULL) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(c_retval);
|
2008-01-21 15:41:15 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
PyTuple_SetItem(info, 0, libvirt_constcharPtrWrap(c_retval));
|
|
|
|
PyTuple_SetItem(info, 1, PyInt_FromLong((long)nparams));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(c_retval);
|
2012-03-22 11:33:35 +00:00
|
|
|
return info;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED,
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2008-01-21 15:41:15 +00:00
|
|
|
virDomainPtr domain;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *ret = NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
char *c_retval;
|
2009-11-25 12:04:47 +00:00
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
2011-05-29 10:24:20 +00:00
|
|
|
virTypedParameterPtr params;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetScedulerParameters",
|
|
|
|
&pyobj_domain))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-01-21 15:41:15 +00:00
|
|
|
c_retval = virDomainGetSchedulerType(domain, &nparams);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-01-21 15:41:15 +00:00
|
|
|
if (c_retval == NULL)
|
|
|
|
return VIR_PY_NONE;
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(c_retval);
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (!nparams)
|
|
|
|
return PyDict_New();
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetSchedulerParameters(domain, params, &nparams);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_NONE;
|
|
|
|
goto cleanup;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = getPyVirTypedParameter(params, nparams);
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
return ret;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
|
|
|
|
2011-07-25 06:54:34 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetSchedulerParametersFlags(PyObject *self ATTRIBUTE_UNUSED,
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2011-07-25 06:54:34 +00:00
|
|
|
virDomainPtr domain;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *ret = NULL;
|
2011-07-25 06:54:34 +00:00
|
|
|
char *c_retval;
|
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
2011-07-25 06:54:34 +00:00
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetScedulerParametersFlags",
|
|
|
|
&pyobj_domain, &flags))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2011-07-25 06:54:34 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainGetSchedulerType(domain, &nparams);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval == NULL)
|
|
|
|
return VIR_PY_NONE;
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(c_retval);
|
2011-07-25 06:54:34 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (!nparams)
|
|
|
|
return PyDict_New();
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-07-25 06:54:34 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetSchedulerParametersFlags(domain, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_NONE;
|
|
|
|
goto cleanup;
|
2011-07-25 06:54:34 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = getPyVirTypedParameter(params, nparams);
|
2011-07-25 06:54:34 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
return ret;
|
2011-07-25 06:54:34 +00:00
|
|
|
}
|
|
|
|
|
2008-01-21 15:41:15 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED,
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2008-01-21 15:41:15 +00:00
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *info;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *ret = NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
char *c_retval;
|
2009-11-25 12:04:47 +00:00
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
|
|
|
Py_ssize_t size = 0;
|
2012-09-11 14:41:49 +00:00
|
|
|
virTypedParameterPtr params, new_params = NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OO:virDomainSetScedulerParameters",
|
|
|
|
&pyobj_domain, &info))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if ((size = PyDict_Size(info)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (size == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Need non-empty dictionary to set attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-01-21 15:41:15 +00:00
|
|
|
c_retval = virDomainGetSchedulerType(domain, &nparams);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-01-21 15:41:15 +00:00
|
|
|
if (c_retval == NULL)
|
2008-02-07 09:49:13 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(c_retval);
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (nparams == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Domain has no settable attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetSchedulerParameters(domain, params, &nparams);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
new_params = setPyVirTypedParameter(info, params, nparams);
|
|
|
|
if (!new_params)
|
|
|
|
goto cleanup;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
i_retval = virDomainSetSchedulerParameters(domain, new_params, size);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
VIR_FREE(new_params);
|
|
|
|
return ret;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
|
|
|
|
2011-07-25 06:57:33 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSetSchedulerParametersFlags(PyObject *self ATTRIBUTE_UNUSED,
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2011-07-25 06:57:33 +00:00
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *info;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *ret = NULL;
|
2011-07-25 06:57:33 +00:00
|
|
|
char *c_retval;
|
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
|
|
|
Py_ssize_t size = 0;
|
2011-07-25 06:57:33 +00:00
|
|
|
unsigned int flags;
|
2013-01-15 23:44:29 +00:00
|
|
|
virTypedParameterPtr params, new_params = NULL;
|
2011-07-25 06:57:33 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args,
|
|
|
|
(char *)"OOi:virDomainSetScedulerParametersFlags",
|
|
|
|
&pyobj_domain, &info, &flags))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2011-07-25 06:57:33 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if ((size = PyDict_Size(info)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (size == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Need non-empty dictionary to set attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2011-07-25 06:57:33 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainGetSchedulerType(domain, &nparams);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval == NULL)
|
|
|
|
return VIR_PY_INT_FAIL;
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(c_retval);
|
2011-07-25 06:57:33 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (nparams == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Domain has no settable attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-02-22 05:30:33 +00:00
|
|
|
|
2011-07-25 06:57:33 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetSchedulerParametersFlags(domain, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2011-07-25 06:57:33 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
new_params = setPyVirTypedParameter(info, params, nparams);
|
|
|
|
if (!new_params)
|
|
|
|
goto cleanup;
|
2011-07-25 06:57:33 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
i_retval = virDomainSetSchedulerParametersFlags(domain, new_params, size, flags);
|
2011-07-25 06:57:33 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
|
2011-07-25 06:57:33 +00:00
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2011-07-25 06:57:33 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
VIR_FREE(new_params);
|
|
|
|
return ret;
|
2011-07-25 06:57:33 +00:00
|
|
|
}
|
2011-02-22 05:30:33 +00:00
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSetBlkioParameters(PyObject *self ATTRIBUTE_UNUSED,
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2011-07-27 02:13:09 +00:00
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *info;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *ret = NULL;
|
2011-07-27 02:13:09 +00:00
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
|
|
|
Py_ssize_t size = 0;
|
2011-07-27 02:13:09 +00:00
|
|
|
unsigned int flags;
|
2013-01-15 23:44:29 +00:00
|
|
|
virTypedParameterPtr params, new_params = NULL;
|
2011-07-27 02:13:09 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args,
|
|
|
|
(char *)"OOi:virDomainSetBlkioParameters",
|
|
|
|
&pyobj_domain, &info, &flags))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2011-07-27 02:13:09 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if ((size = PyDict_Size(info)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (size == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Need non-empty dictionary to set attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2011-07-27 02:13:09 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetBlkioParameters(domain, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (nparams == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Domain has no settable attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-07-27 02:13:09 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetBlkioParameters(domain, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2011-07-27 02:13:09 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
new_params = setPyVirTypedParameter(info, params, nparams);
|
|
|
|
if (!new_params)
|
|
|
|
goto cleanup;
|
2011-07-27 02:13:09 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
i_retval = virDomainSetBlkioParameters(domain, new_params, size, flags);
|
2011-07-27 02:13:09 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
|
2011-07-27 02:13:09 +00:00
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2011-07-27 02:13:09 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
VIR_FREE(new_params);
|
|
|
|
return ret;
|
2011-02-22 05:30:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetBlkioParameters(PyObject *self ATTRIBUTE_UNUSED,
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2011-07-27 02:13:08 +00:00
|
|
|
virDomainPtr domain;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *ret = NULL;
|
2011-07-27 02:13:08 +00:00
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
2011-07-27 02:13:08 +00:00
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetBlkioParameters",
|
|
|
|
&pyobj_domain, &flags))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2011-07-27 02:13:08 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetBlkioParameters(domain, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (!nparams)
|
|
|
|
return PyDict_New();
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-07-27 02:13:08 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetBlkioParameters(domain, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_NONE;
|
|
|
|
goto cleanup;
|
2011-07-27 02:13:08 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = getPyVirTypedParameter(params, nparams);
|
2011-07-27 02:13:08 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
return ret;
|
2011-02-22 05:30:33 +00:00
|
|
|
}
|
|
|
|
|
2010-10-12 13:43:27 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSetMemoryParameters(PyObject *self ATTRIBUTE_UNUSED,
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2011-07-27 02:13:11 +00:00
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *info;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *ret = NULL;
|
2011-07-27 02:13:11 +00:00
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
|
|
|
Py_ssize_t size = 0;
|
2011-07-27 02:13:11 +00:00
|
|
|
unsigned int flags;
|
2013-01-15 23:44:29 +00:00
|
|
|
virTypedParameterPtr params, new_params = NULL;
|
2011-07-27 02:13:11 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args,
|
|
|
|
(char *)"OOi:virDomainSetMemoryParameters",
|
|
|
|
&pyobj_domain, &info, &flags))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2011-07-27 02:13:11 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if ((size = PyDict_Size(info)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (size == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Need non-empty dictionary to set attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2011-07-27 02:13:11 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetMemoryParameters(domain, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (nparams == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Domain has no settable attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-07-27 02:13:11 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetMemoryParameters(domain, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2011-07-27 02:13:11 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
new_params = setPyVirTypedParameter(info, params, nparams);
|
|
|
|
if (!new_params)
|
|
|
|
goto cleanup;
|
2011-07-27 02:13:11 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
i_retval = virDomainSetMemoryParameters(domain, new_params, size, flags);
|
2011-07-27 02:13:11 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
|
2011-07-27 02:13:11 +00:00
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2011-07-27 02:13:11 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
VIR_FREE(new_params);
|
|
|
|
return ret;
|
2010-10-12 13:43:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetMemoryParameters(PyObject *self ATTRIBUTE_UNUSED,
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2011-07-27 02:13:10 +00:00
|
|
|
virDomainPtr domain;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *ret = NULL;
|
2011-07-27 02:13:10 +00:00
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
2011-07-27 02:13:10 +00:00
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetMemoryParameters",
|
|
|
|
&pyobj_domain, &flags))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2011-07-27 02:13:10 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetMemoryParameters(domain, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (!nparams)
|
|
|
|
return PyDict_New();
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-07-27 02:13:10 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetMemoryParameters(domain, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_NONE;
|
|
|
|
goto cleanup;
|
2011-07-27 02:13:10 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = getPyVirTypedParameter(params, nparams);
|
2011-07-27 02:13:10 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
return ret;
|
2010-10-12 13:43:27 +00:00
|
|
|
}
|
|
|
|
|
2012-02-08 12:20:50 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSetNumaParameters(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *info;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
int i_retval;
|
2012-02-10 10:17:26 +00:00
|
|
|
int nparams = 0;
|
|
|
|
Py_ssize_t size = 0;
|
2012-02-08 12:20:50 +00:00
|
|
|
unsigned int flags;
|
2013-01-15 23:44:29 +00:00
|
|
|
virTypedParameterPtr params, new_params = NULL;
|
2012-02-08 12:20:50 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args,
|
|
|
|
(char *)"OOi:virDomainSetNumaParameters",
|
|
|
|
&pyobj_domain, &info, &flags))
|
|
|
|
return NULL;
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
if ((size = PyDict_Size(info)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (size == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Need non-empty dictionary to set attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetNumaParameters(domain, 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;
|
|
|
|
}
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-08 12:20:50 +00:00
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetNumaParameters(domain, 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 = virDomainSetNumaParameters(domain, new_params, size, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-08 12:20:50 +00:00
|
|
|
VIR_FREE(new_params);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetNumaParameters(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
int i_retval;
|
|
|
|
int nparams = 0;
|
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetNumaParameters",
|
|
|
|
&pyobj_domain, &flags))
|
|
|
|
return NULL;
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetNumaParameters(domain, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!nparams)
|
|
|
|
return PyDict_New();
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-08 12:20:50 +00:00
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetNumaParameters(domain, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_NONE;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = getPyVirTypedParameter(params, nparams);
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-08 12:20:50 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
python: Expose virDomain{G,S}etInterfaceParameters APIs in python binding
The v4 patch corrects indentation issues.
The v3 patch follows latest python binding codes and change 'size'
type from int to Py_ssize_t.
An simple example to show how to use it:
#!/usr/bin/env python
import libvirt
conn = libvirt.open(None)
dom = conn.lookupByName('foo')
print dom.interfaceParameters('vnet0', 0)
params = {'outbound.peak': 10,
'inbound.peak': 10,
'inbound.burst': 20,
'inbound.average': 20,
'outbound.average': 30,
'outbound.burst': 30}
print dom.setInterfaceParameters('vnet0', params, 0)
print dom.interfaceParameters('vnet0', 0)
Signed-off-by: Alex Jia <ajia@redhat.com>
2012-02-14 02:46:23 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSetInterfaceParameters(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *info;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
int i_retval;
|
|
|
|
int nparams = 0;
|
|
|
|
Py_ssize_t size = 0;
|
|
|
|
unsigned int flags;
|
|
|
|
const char *device = NULL;
|
2013-01-15 23:44:29 +00:00
|
|
|
virTypedParameterPtr params, new_params = NULL;
|
python: Expose virDomain{G,S}etInterfaceParameters APIs in python binding
The v4 patch corrects indentation issues.
The v3 patch follows latest python binding codes and change 'size'
type from int to Py_ssize_t.
An simple example to show how to use it:
#!/usr/bin/env python
import libvirt
conn = libvirt.open(None)
dom = conn.lookupByName('foo')
print dom.interfaceParameters('vnet0', 0)
params = {'outbound.peak': 10,
'inbound.peak': 10,
'inbound.burst': 20,
'inbound.average': 20,
'outbound.average': 30,
'outbound.burst': 30}
print dom.setInterfaceParameters('vnet0', params, 0)
print dom.interfaceParameters('vnet0', 0)
Signed-off-by: Alex Jia <ajia@redhat.com>
2012-02-14 02:46:23 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args,
|
|
|
|
(char *)"OzOi:virDomainSetInterfaceParameters",
|
|
|
|
&pyobj_domain, &device, &info, &flags))
|
|
|
|
return NULL;
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
if ((size = PyDict_Size(info)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (size == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Need non-empty dictionary to set attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetInterfaceParameters(domain, device, 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;
|
|
|
|
}
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
python: Expose virDomain{G,S}etInterfaceParameters APIs in python binding
The v4 patch corrects indentation issues.
The v3 patch follows latest python binding codes and change 'size'
type from int to Py_ssize_t.
An simple example to show how to use it:
#!/usr/bin/env python
import libvirt
conn = libvirt.open(None)
dom = conn.lookupByName('foo')
print dom.interfaceParameters('vnet0', 0)
params = {'outbound.peak': 10,
'inbound.peak': 10,
'inbound.burst': 20,
'inbound.average': 20,
'outbound.average': 30,
'outbound.burst': 30}
print dom.setInterfaceParameters('vnet0', params, 0)
print dom.interfaceParameters('vnet0', 0)
Signed-off-by: Alex Jia <ajia@redhat.com>
2012-02-14 02:46:23 +00:00
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetInterfaceParameters(domain, device, 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 = virDomainSetInterfaceParameters(domain, device, new_params, size, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
python: Expose virDomain{G,S}etInterfaceParameters APIs in python binding
The v4 patch corrects indentation issues.
The v3 patch follows latest python binding codes and change 'size'
type from int to Py_ssize_t.
An simple example to show how to use it:
#!/usr/bin/env python
import libvirt
conn = libvirt.open(None)
dom = conn.lookupByName('foo')
print dom.interfaceParameters('vnet0', 0)
params = {'outbound.peak': 10,
'inbound.peak': 10,
'inbound.burst': 20,
'inbound.average': 20,
'outbound.average': 30,
'outbound.burst': 30}
print dom.setInterfaceParameters('vnet0', params, 0)
print dom.interfaceParameters('vnet0', 0)
Signed-off-by: Alex Jia <ajia@redhat.com>
2012-02-14 02:46:23 +00:00
|
|
|
VIR_FREE(new_params);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetInterfaceParameters(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
int i_retval;
|
|
|
|
int nparams = 0;
|
|
|
|
unsigned int flags;
|
|
|
|
const char *device = NULL;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainGetInterfaceParameters",
|
|
|
|
&pyobj_domain, &device, &flags))
|
|
|
|
return NULL;
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetInterfaceParameters(domain, device, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!nparams)
|
|
|
|
return PyDict_New();
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
python: Expose virDomain{G,S}etInterfaceParameters APIs in python binding
The v4 patch corrects indentation issues.
The v3 patch follows latest python binding codes and change 'size'
type from int to Py_ssize_t.
An simple example to show how to use it:
#!/usr/bin/env python
import libvirt
conn = libvirt.open(None)
dom = conn.lookupByName('foo')
print dom.interfaceParameters('vnet0', 0)
params = {'outbound.peak': 10,
'inbound.peak': 10,
'inbound.burst': 20,
'inbound.average': 20,
'outbound.average': 30,
'outbound.burst': 30}
print dom.setInterfaceParameters('vnet0', params, 0)
print dom.interfaceParameters('vnet0', 0)
Signed-off-by: Alex Jia <ajia@redhat.com>
2012-02-14 02:46:23 +00:00
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetInterfaceParameters(domain, device, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_NONE;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = getPyVirTypedParameter(params, nparams);
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
python: Expose virDomain{G,S}etInterfaceParameters APIs in python binding
The v4 patch corrects indentation issues.
The v3 patch follows latest python binding codes and change 'size'
type from int to Py_ssize_t.
An simple example to show how to use it:
#!/usr/bin/env python
import libvirt
conn = libvirt.open(None)
dom = conn.lookupByName('foo')
print dom.interfaceParameters('vnet0', 0)
params = {'outbound.peak': 10,
'inbound.peak': 10,
'inbound.burst': 20,
'inbound.average': 20,
'outbound.average': 30,
'outbound.burst': 30}
print dom.setInterfaceParameters('vnet0', params, 0)
print dom.interfaceParameters('vnet0', 0)
Signed-off-by: Alex Jia <ajia@redhat.com>
2012-02-14 02:46:23 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2008-01-21 15:41:15 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetVcpus(PyObject *self ATTRIBUTE_UNUSED,
|
2012-09-28 08:27:38 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2008-01-21 15:41:15 +00:00
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *pyretval = NULL, *pycpuinfo = NULL, *pycpumap = NULL;
|
2012-09-28 08:27:38 +00:00
|
|
|
PyObject *error = NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
virDomainInfo dominfo;
|
|
|
|
virVcpuInfoPtr cpuinfo = NULL;
|
|
|
|
unsigned char *cpumap = NULL;
|
2011-06-03 19:53:26 +00:00
|
|
|
size_t cpumaplen, i;
|
2012-11-13 12:54:38 +00:00
|
|
|
int i_retval, cpunum;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetVcpus",
|
|
|
|
&pyobj_domain))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
|
2012-09-28 08:27:38 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetInfo(domain, &dominfo);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (i_retval < 0)
|
2012-09-28 08:27:38 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(cpuinfo, dominfo.nrVirtCpu) < 0)
|
2012-09-28 08:27:38 +00:00
|
|
|
return PyErr_NoMemory();
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
cpumaplen = VIR_CPU_MAPLEN(cpunum);
|
2012-02-02 22:45:54 +00:00
|
|
|
if (xalloc_oversized(dominfo.nrVirtCpu, cpumaplen) ||
|
2013-06-07 08:37:25 +00:00
|
|
|
VIR_ALLOC_N_QUIET(cpumap, dominfo.nrVirtCpu * cpumaplen) < 0) {
|
2012-09-28 08:27:38 +00:00
|
|
|
error = PyErr_NoMemory();
|
2008-01-21 15:41:15 +00:00
|
|
|
goto cleanup;
|
2012-09-28 08:27:38 +00:00
|
|
|
}
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetVcpus(domain,
|
|
|
|
cpuinfo, dominfo.nrVirtCpu,
|
|
|
|
cpumap, cpumaplen);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2012-09-28 08:27:38 +00:00
|
|
|
if (i_retval < 0) {
|
|
|
|
error = VIR_PY_INT_FAIL;
|
2008-01-21 15:41:15 +00:00
|
|
|
goto cleanup;
|
2012-09-28 08:27:38 +00:00
|
|
|
}
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2008-02-29 12:53:10 +00:00
|
|
|
/* convert to a Python tuple of long objects */
|
2008-01-21 15:41:15 +00:00
|
|
|
if ((pyretval = PyTuple_New(2)) == NULL)
|
|
|
|
goto cleanup;
|
|
|
|
if ((pycpuinfo = PyList_New(dominfo.nrVirtCpu)) == NULL)
|
|
|
|
goto cleanup;
|
|
|
|
if ((pycpumap = PyList_New(dominfo.nrVirtCpu)) == NULL)
|
|
|
|
goto cleanup;
|
|
|
|
|
2013-05-21 08:05:06 +00:00
|
|
|
for (i = 0; i < dominfo.nrVirtCpu; i++) {
|
2008-01-21 15:41:15 +00:00
|
|
|
PyObject *info = PyTuple_New(4);
|
2012-09-28 08:27:38 +00:00
|
|
|
PyObject *item = NULL;
|
|
|
|
|
2008-01-21 15:41:15 +00:00
|
|
|
if (info == NULL)
|
|
|
|
goto cleanup;
|
2012-09-28 08:27:38 +00:00
|
|
|
|
|
|
|
if ((item = PyInt_FromLong((long)cpuinfo[i].number)) == NULL ||
|
|
|
|
PyTuple_SetItem(info, 0, item) < 0)
|
|
|
|
goto itemError;
|
|
|
|
|
|
|
|
if ((item = PyInt_FromLong((long)cpuinfo[i].state)) == NULL ||
|
|
|
|
PyTuple_SetItem(info, 1, item) < 0)
|
|
|
|
goto itemError;
|
|
|
|
|
|
|
|
if ((item = PyLong_FromLongLong((long long)cpuinfo[i].cpuTime)) == NULL ||
|
|
|
|
PyTuple_SetItem(info, 2, item) < 0)
|
|
|
|
goto itemError;
|
|
|
|
|
|
|
|
if ((item = PyInt_FromLong((long)cpuinfo[i].cpu)) == NULL ||
|
|
|
|
PyTuple_SetItem(info, 3, item) < 0)
|
|
|
|
goto itemError;
|
|
|
|
|
|
|
|
if (PyList_SetItem(pycpuinfo, i, info) < 0)
|
|
|
|
goto itemError;
|
|
|
|
|
|
|
|
continue;
|
|
|
|
itemError:
|
|
|
|
Py_DECREF(info);
|
|
|
|
Py_XDECREF(item);
|
|
|
|
goto cleanup;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
2013-05-21 08:05:06 +00:00
|
|
|
for (i = 0; i < dominfo.nrVirtCpu; i++) {
|
2012-11-13 12:54:38 +00:00
|
|
|
PyObject *info = PyTuple_New(cpunum);
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t j;
|
2008-01-21 15:41:15 +00:00
|
|
|
if (info == NULL)
|
|
|
|
goto cleanup;
|
2013-05-21 08:05:06 +00:00
|
|
|
for (j = 0; j < cpunum; j++) {
|
2012-09-28 08:27:38 +00:00
|
|
|
PyObject *item = NULL;
|
|
|
|
if ((item = PyBool_FromLong(VIR_CPU_USABLE(cpumap, cpumaplen, i, j))) == NULL ||
|
|
|
|
PyTuple_SetItem(info, j, item) < 0) {
|
|
|
|
Py_DECREF(info);
|
|
|
|
Py_XDECREF(item);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (PyList_SetItem(pycpumap, i, info) < 0) {
|
|
|
|
Py_DECREF(info);
|
|
|
|
goto cleanup;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
|
|
|
}
|
2012-09-28 08:27:38 +00:00
|
|
|
if (PyTuple_SetItem(pyretval, 0, pycpuinfo) < 0 ||
|
|
|
|
PyTuple_SetItem(pyretval, 1, pycpumap) < 0)
|
|
|
|
goto cleanup;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(cpuinfo);
|
|
|
|
VIR_FREE(cpumap);
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return pyretval;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-09-28 08:27:38 +00:00
|
|
|
cleanup:
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(cpuinfo);
|
|
|
|
VIR_FREE(cpumap);
|
2012-06-11 20:32:47 +00:00
|
|
|
Py_XDECREF(pyretval);
|
|
|
|
Py_XDECREF(pycpuinfo);
|
|
|
|
Py_XDECREF(pycpumap);
|
2012-09-28 08:27:38 +00:00
|
|
|
return error;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainPinVcpu(PyObject *self ATTRIBUTE_UNUSED,
|
2012-09-28 08:27:38 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2008-01-21 15:41:15 +00:00
|
|
|
virDomainPtr domain;
|
2012-09-28 08:27:38 +00:00
|
|
|
PyObject *pyobj_domain, *pycpumap;
|
|
|
|
PyObject *ret = NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
unsigned char *cpumap;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int cpumaplen, vcpu, tuple_size, cpunum;
|
|
|
|
size_t i;
|
2009-11-25 12:04:47 +00:00
|
|
|
int i_retval;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OiO:virDomainPinVcpu",
|
|
|
|
&pyobj_domain, &vcpu, &pycpumap))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-01-21 15:41:15 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
|
2008-02-07 09:49:13 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-09-28 08:27:38 +00:00
|
|
|
if (PyTuple_Check(pycpumap)) {
|
|
|
|
tuple_size = PyTuple_Size(pycpumap);
|
|
|
|
if (tuple_size == -1)
|
|
|
|
return ret;
|
|
|
|
} else {
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Unexpected type, tuple is required");
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
cpumaplen = VIR_CPU_MAPLEN(cpunum);
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(cpumap, cpumaplen) < 0)
|
2012-09-28 08:27:38 +00:00
|
|
|
return PyErr_NoMemory();
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-09-28 08:27:38 +00:00
|
|
|
for (i = 0; i < tuple_size; i++) {
|
2008-01-21 15:41:15 +00:00
|
|
|
PyObject *flag = PyTuple_GetItem(pycpumap, i);
|
2012-09-28 08:27:38 +00:00
|
|
|
bool b;
|
|
|
|
|
|
|
|
if (!flag || libvirt_boolUnwrap(flag, &b) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (b)
|
2008-01-21 15:41:15 +00:00
|
|
|
VIR_USE_CPU(cpumap, i);
|
|
|
|
else
|
|
|
|
VIR_UNUSE_CPU(cpumap, i);
|
|
|
|
}
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
for (; i < cpunum; i++)
|
2012-09-28 08:27:38 +00:00
|
|
|
VIR_UNUSE_CPU(cpumap, i);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainPinVcpu(domain, vcpu, cpumap, cpumaplen);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2012-09-28 08:27:38 +00:00
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
2009-11-25 12:04:47 +00:00
|
|
|
|
2012-09-28 08:27:38 +00:00
|
|
|
cleanup:
|
|
|
|
VIR_FREE(cpumap);
|
|
|
|
return ret;
|
2008-01-21 15:41:15 +00:00
|
|
|
}
|
|
|
|
|
2011-07-25 07:00:11 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainPinVcpuFlags(PyObject *self ATTRIBUTE_UNUSED,
|
2012-09-28 08:27:38 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2011-07-25 07:00:11 +00:00
|
|
|
virDomainPtr domain;
|
2012-09-28 08:27:38 +00:00
|
|
|
PyObject *pyobj_domain, *pycpumap;
|
|
|
|
PyObject *ret = NULL;
|
2011-07-25 07:00:11 +00:00
|
|
|
unsigned char *cpumap;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int cpumaplen, vcpu, tuple_size, cpunum;
|
|
|
|
size_t i;
|
2011-07-25 07:00:11 +00:00
|
|
|
unsigned int flags;
|
|
|
|
int i_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OiOi:virDomainPinVcpuFlags",
|
|
|
|
&pyobj_domain, &vcpu, &pycpumap, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2011-07-25 07:00:11 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
|
2011-07-25 07:00:11 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
2012-09-28 08:27:38 +00:00
|
|
|
if (PyTuple_Check(pycpumap)) {
|
|
|
|
tuple_size = PyTuple_Size(pycpumap);
|
|
|
|
if (tuple_size == -1)
|
|
|
|
return ret;
|
|
|
|
} else {
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Unexpected type, tuple is required");
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
cpumaplen = VIR_CPU_MAPLEN(cpunum);
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(cpumap, cpumaplen) < 0)
|
2012-09-28 08:27:38 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-07-25 07:00:11 +00:00
|
|
|
|
2012-09-28 08:27:38 +00:00
|
|
|
for (i = 0; i < tuple_size; i++) {
|
2011-07-25 07:00:11 +00:00
|
|
|
PyObject *flag = PyTuple_GetItem(pycpumap, i);
|
2012-09-28 08:27:38 +00:00
|
|
|
bool b;
|
|
|
|
|
|
|
|
if (!flag || libvirt_boolUnwrap(flag, &b) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (b)
|
2011-07-25 07:00:11 +00:00
|
|
|
VIR_USE_CPU(cpumap, i);
|
|
|
|
else
|
|
|
|
VIR_UNUSE_CPU(cpumap, i);
|
|
|
|
}
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
for (; i < cpunum; i++)
|
2012-09-28 08:27:38 +00:00
|
|
|
VIR_UNUSE_CPU(cpumap, i);
|
|
|
|
|
2011-07-25 07:00:11 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainPinVcpuFlags(domain, vcpu, cpumap, cpumaplen, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2012-09-28 08:27:38 +00:00
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
2011-07-25 07:00:11 +00:00
|
|
|
|
2012-09-28 08:27:38 +00:00
|
|
|
cleanup:
|
|
|
|
VIR_FREE(cpumap);
|
|
|
|
return ret;
|
2011-07-25 07:00:11 +00:00
|
|
|
}
|
2008-01-21 15:41:15 +00:00
|
|
|
|
2011-07-25 07:04:50 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetVcpuPinInfo(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *pycpumaps = NULL;
|
|
|
|
virDomainInfo dominfo;
|
2013-09-20 12:54:13 +00:00
|
|
|
unsigned char *cpumaps = NULL;
|
2011-08-02 16:03:41 +00:00
|
|
|
size_t cpumaplen, vcpu, pcpu;
|
2011-07-25 07:04:50 +00:00
|
|
|
unsigned int flags;
|
2012-11-13 12:54:38 +00:00
|
|
|
int i_retval, cpunum;
|
2011-07-25 07:04:50 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetVcpuPinInfo",
|
|
|
|
&pyobj_domain, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2011-07-25 07:04:50 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
|
|
|
|
return VIR_PY_INT_FAIL;
|
2011-07-25 07:04:50 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetInfo(domain, &dominfo);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
cpumaplen = VIR_CPU_MAPLEN(cpunum);
|
2012-02-02 22:45:54 +00:00
|
|
|
if (xalloc_oversized(dominfo.nrVirtCpu, cpumaplen) ||
|
2013-06-07 08:37:25 +00:00
|
|
|
VIR_ALLOC_N_QUIET(cpumaps, dominfo.nrVirtCpu * cpumaplen) < 0)
|
2011-07-25 07:04:50 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainGetVcpuPinInfo(domain, dominfo.nrVirtCpu,
|
|
|
|
cpumaps, cpumaplen, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (i_retval < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if ((pycpumaps = PyList_New(dominfo.nrVirtCpu)) == NULL)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (vcpu = 0; vcpu < dominfo.nrVirtCpu; vcpu++) {
|
2012-11-13 12:54:38 +00:00
|
|
|
PyObject *mapinfo = PyTuple_New(cpunum);
|
2011-07-25 07:04:50 +00:00
|
|
|
if (mapinfo == NULL)
|
|
|
|
goto cleanup;
|
|
|
|
|
2012-11-13 12:54:38 +00:00
|
|
|
for (pcpu = 0; pcpu < cpunum; pcpu++) {
|
2011-07-25 07:04:50 +00:00
|
|
|
PyTuple_SetItem(mapinfo, pcpu,
|
|
|
|
PyBool_FromLong(VIR_CPU_USABLE(cpumaps, cpumaplen, vcpu, pcpu)));
|
|
|
|
}
|
|
|
|
PyList_SetItem(pycpumaps, vcpu, mapinfo);
|
|
|
|
}
|
|
|
|
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(cpumaps);
|
2011-07-25 07:04:50 +00:00
|
|
|
|
|
|
|
return pycpumaps;
|
|
|
|
|
|
|
|
cleanup:
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(cpumaps);
|
2011-07-25 07:04:50 +00:00
|
|
|
|
2012-06-11 20:32:47 +00:00
|
|
|
Py_XDECREF(pycpumaps);
|
2011-07-25 07:04:50 +00:00
|
|
|
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
|
2013-03-20 10:43:41 +00:00
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainPinEmulator(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain, *pycpumap;
|
|
|
|
unsigned char *cpumap = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int cpumaplen, tuple_size, cpunum;
|
|
|
|
size_t i;
|
2013-03-20 10:43:41 +00:00
|
|
|
int i_retval;
|
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OOi:virDomainPinVcpu",
|
|
|
|
&pyobj_domain, &pycpumap, &flags))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
cpumaplen = VIR_CPU_MAPLEN(cpunum);
|
|
|
|
|
|
|
|
if (!PyTuple_Check(pycpumap)) {
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Unexpected type, tuple is required");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((tuple_size = PyTuple_Size(pycpumap)) == -1)
|
|
|
|
return NULL;
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(cpumap, cpumaplen) < 0)
|
2013-03-20 10:43:41 +00:00
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
for (i = 0; i < tuple_size; i++) {
|
|
|
|
PyObject *flag = PyTuple_GetItem(pycpumap, i);
|
|
|
|
bool b;
|
|
|
|
|
|
|
|
if (!flag || libvirt_boolUnwrap(flag, &b) < 0) {
|
|
|
|
VIR_FREE(cpumap);
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (b)
|
|
|
|
VIR_USE_CPU(cpumap, i);
|
|
|
|
else
|
|
|
|
VIR_UNUSE_CPU(cpumap, i);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (; i < cpunum; i++)
|
|
|
|
VIR_UNUSE_CPU(cpumap, i);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virDomainPinEmulator(domain, cpumap, cpumaplen, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
VIR_FREE(cpumap);
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
return VIR_PY_INT_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetEmulatorPinInfo(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *pycpumap;
|
|
|
|
unsigned char *cpumap;
|
|
|
|
size_t cpumaplen;
|
|
|
|
size_t pcpu;
|
|
|
|
unsigned int flags;
|
|
|
|
int ret;
|
|
|
|
int cpunum;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainEmulatorPinInfo",
|
|
|
|
&pyobj_domain, &flags))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
cpumaplen = VIR_CPU_MAPLEN(cpunum);
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(cpumap, cpumaplen) < 0)
|
2013-03-20 10:43:41 +00:00
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virDomainGetEmulatorPinInfo(domain, cpumap, cpumaplen, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (ret < 0) {
|
|
|
|
VIR_FREE(cpumap);
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(pycpumap = PyTuple_New(cpunum))) {
|
|
|
|
VIR_FREE(cpumap);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (pcpu = 0; pcpu < cpunum; pcpu++)
|
|
|
|
PyTuple_SET_ITEM(pycpumap, pcpu,
|
|
|
|
PyBool_FromLong(VIR_CPU_USABLE(cpumap, cpumaplen,
|
|
|
|
0, pcpu)));
|
|
|
|
|
|
|
|
VIR_FREE(cpumap);
|
|
|
|
return pycpumap;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-02-28 12:17:00 +00:00
|
|
|
/************************************************************************
|
|
|
|
* *
|
|
|
|
* Global error handler at the Python level *
|
|
|
|
* *
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
static PyObject *libvirt_virPythonErrorFuncHandler = NULL;
|
|
|
|
static PyObject *libvirt_virPythonErrorFuncCtxt = NULL;
|
|
|
|
|
2008-01-21 15:55:53 +00:00
|
|
|
static PyObject *
|
2006-11-07 23:18:56 +00:00
|
|
|
libvirt_virGetLastError(PyObject *self ATTRIBUTE_UNUSED, PyObject *args ATTRIBUTE_UNUSED)
|
|
|
|
{
|
2009-01-20 22:10:52 +00:00
|
|
|
virError *err;
|
2006-11-07 23:18:56 +00:00
|
|
|
PyObject *info;
|
|
|
|
|
2009-01-20 22:10:52 +00:00
|
|
|
if ((err = virGetLastError()) == NULL)
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2006-11-07 23:18:56 +00:00
|
|
|
|
2008-01-17 22:14:57 +00:00
|
|
|
if ((info = PyTuple_New(9)) == NULL)
|
|
|
|
return VIR_PY_NONE;
|
2009-01-20 22:10:52 +00:00
|
|
|
PyTuple_SetItem(info, 0, PyInt_FromLong((long) err->code));
|
|
|
|
PyTuple_SetItem(info, 1, PyInt_FromLong((long) err->domain));
|
|
|
|
PyTuple_SetItem(info, 2, libvirt_constcharPtrWrap(err->message));
|
|
|
|
PyTuple_SetItem(info, 3, PyInt_FromLong((long) err->level));
|
|
|
|
PyTuple_SetItem(info, 4, libvirt_constcharPtrWrap(err->str1));
|
|
|
|
PyTuple_SetItem(info, 5, libvirt_constcharPtrWrap(err->str2));
|
|
|
|
PyTuple_SetItem(info, 6, libvirt_constcharPtrWrap(err->str3));
|
|
|
|
PyTuple_SetItem(info, 7, PyInt_FromLong((long) err->int1));
|
|
|
|
PyTuple_SetItem(info, 8, PyInt_FromLong((long) err->int2));
|
2006-11-07 23:18:56 +00:00
|
|
|
|
|
|
|
return info;
|
|
|
|
}
|
|
|
|
|
2008-01-21 15:55:53 +00:00
|
|
|
static PyObject *
|
2006-11-07 23:18:56 +00:00
|
|
|
libvirt_virConnGetLastError(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
|
|
|
|
{
|
2009-01-20 22:10:52 +00:00
|
|
|
virError *err;
|
2006-11-07 23:18:56 +00:00
|
|
|
PyObject *info;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConGetLastError", &pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2006-11-07 23:18:56 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
err = virConnGetLastError(conn);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (err == NULL)
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2006-11-07 23:18:56 +00:00
|
|
|
|
2008-01-17 22:14:57 +00:00
|
|
|
if ((info = PyTuple_New(9)) == NULL)
|
|
|
|
return VIR_PY_NONE;
|
2009-01-20 22:10:52 +00:00
|
|
|
PyTuple_SetItem(info, 0, PyInt_FromLong((long) err->code));
|
|
|
|
PyTuple_SetItem(info, 1, PyInt_FromLong((long) err->domain));
|
|
|
|
PyTuple_SetItem(info, 2, libvirt_constcharPtrWrap(err->message));
|
|
|
|
PyTuple_SetItem(info, 3, PyInt_FromLong((long) err->level));
|
|
|
|
PyTuple_SetItem(info, 4, libvirt_constcharPtrWrap(err->str1));
|
|
|
|
PyTuple_SetItem(info, 5, libvirt_constcharPtrWrap(err->str2));
|
|
|
|
PyTuple_SetItem(info, 6, libvirt_constcharPtrWrap(err->str3));
|
|
|
|
PyTuple_SetItem(info, 7, PyInt_FromLong((long) err->int1));
|
|
|
|
PyTuple_SetItem(info, 8, PyInt_FromLong((long) err->int2));
|
2006-11-07 23:18:56 +00:00
|
|
|
|
|
|
|
return info;
|
|
|
|
}
|
|
|
|
|
2006-02-28 12:17:00 +00:00
|
|
|
static void
|
|
|
|
libvirt_virErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, virErrorPtr err)
|
|
|
|
{
|
|
|
|
PyObject *list, *info;
|
|
|
|
PyObject *result;
|
|
|
|
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("libvirt_virErrorFuncHandler(%p, %s, ...) called\n", ctx,
|
|
|
|
err->message);
|
2006-02-28 12:17:00 +00:00
|
|
|
|
|
|
|
if ((err == NULL) || (err->code == VIR_ERR_OK))
|
|
|
|
return;
|
|
|
|
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
2006-02-28 12:17:00 +00:00
|
|
|
if ((libvirt_virPythonErrorFuncHandler == NULL) ||
|
|
|
|
(libvirt_virPythonErrorFuncHandler == Py_None)) {
|
|
|
|
virDefaultErrorFunc(err);
|
|
|
|
} else {
|
|
|
|
list = PyTuple_New(2);
|
|
|
|
info = PyTuple_New(9);
|
|
|
|
PyTuple_SetItem(list, 0, libvirt_virPythonErrorFuncCtxt);
|
|
|
|
PyTuple_SetItem(list, 1, info);
|
|
|
|
Py_XINCREF(libvirt_virPythonErrorFuncCtxt);
|
|
|
|
PyTuple_SetItem(info, 0, PyInt_FromLong((long) err->code));
|
|
|
|
PyTuple_SetItem(info, 1, PyInt_FromLong((long) err->domain));
|
2008-04-10 16:54:54 +00:00
|
|
|
PyTuple_SetItem(info, 2, libvirt_constcharPtrWrap(err->message));
|
2006-02-28 12:17:00 +00:00
|
|
|
PyTuple_SetItem(info, 3, PyInt_FromLong((long) err->level));
|
2008-04-10 16:54:54 +00:00
|
|
|
PyTuple_SetItem(info, 4, libvirt_constcharPtrWrap(err->str1));
|
|
|
|
PyTuple_SetItem(info, 5, libvirt_constcharPtrWrap(err->str2));
|
|
|
|
PyTuple_SetItem(info, 6, libvirt_constcharPtrWrap(err->str3));
|
2006-02-28 12:17:00 +00:00
|
|
|
PyTuple_SetItem(info, 7, PyInt_FromLong((long) err->int1));
|
|
|
|
PyTuple_SetItem(info, 8, PyInt_FromLong((long) err->int2));
|
2008-04-10 16:54:54 +00:00
|
|
|
/* TODO pass conn and dom if available */
|
2006-02-28 12:17:00 +00:00
|
|
|
result = PyEval_CallObject(libvirt_virPythonErrorFuncHandler, list);
|
|
|
|
Py_XDECREF(list);
|
|
|
|
Py_XDECREF(result);
|
|
|
|
}
|
2006-10-24 20:28:16 +00:00
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
2006-02-28 12:17:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self,
|
|
|
|
PyObject * args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
PyObject *pyobj_f;
|
|
|
|
PyObject *pyobj_ctx;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple
|
|
|
|
(args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f,
|
|
|
|
&pyobj_ctx))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2006-02-28 12:17:00 +00:00
|
|
|
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("libvirt_virRegisterErrorHandler(%p, %p) called\n", pyobj_ctx,
|
|
|
|
pyobj_f);
|
2006-02-28 12:17:00 +00:00
|
|
|
|
|
|
|
virSetErrorFunc(NULL, libvirt_virErrorFuncHandler);
|
|
|
|
if (libvirt_virPythonErrorFuncHandler != NULL) {
|
|
|
|
Py_XDECREF(libvirt_virPythonErrorFuncHandler);
|
|
|
|
}
|
|
|
|
if (libvirt_virPythonErrorFuncCtxt != NULL) {
|
|
|
|
Py_XDECREF(libvirt_virPythonErrorFuncCtxt);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((pyobj_f == Py_None) && (pyobj_ctx == Py_None)) {
|
|
|
|
libvirt_virPythonErrorFuncHandler = NULL;
|
2008-04-10 16:54:54 +00:00
|
|
|
libvirt_virPythonErrorFuncCtxt = NULL;
|
2006-02-28 12:17:00 +00:00
|
|
|
} else {
|
2008-04-10 16:54:54 +00:00
|
|
|
Py_XINCREF(pyobj_ctx);
|
|
|
|
Py_XINCREF(pyobj_f);
|
2006-02-28 12:17:00 +00:00
|
|
|
|
2008-04-10 16:54:54 +00:00
|
|
|
/* TODO: check f is a function ! */
|
|
|
|
libvirt_virPythonErrorFuncHandler = pyobj_f;
|
|
|
|
libvirt_virPythonErrorFuncCtxt = pyobj_ctx;
|
2006-02-28 12:17:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
py_retval = libvirt_intWrap(1);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2006-02-28 12:17:00 +00:00
|
|
|
}
|
|
|
|
|
2007-12-05 19:09:23 +00:00
|
|
|
static int virConnectCredCallbackWrapper(virConnectCredentialPtr cred,
|
|
|
|
unsigned int ncred,
|
|
|
|
void *cbdata) {
|
|
|
|
PyObject *list;
|
|
|
|
PyObject *pycred;
|
|
|
|
PyObject *pyauth = (PyObject *)cbdata;
|
|
|
|
PyObject *pycbdata;
|
|
|
|
PyObject *pycb;
|
|
|
|
PyObject *pyret;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int ret = -1;
|
|
|
|
size_t i;
|
2007-12-05 19:09:23 +00:00
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
pycb = PyList_GetItem(pyauth, 1);
|
|
|
|
pycbdata = PyList_GetItem(pyauth, 2);
|
|
|
|
|
|
|
|
list = PyTuple_New(2);
|
|
|
|
pycred = PyTuple_New(ncred);
|
2013-05-21 08:05:06 +00:00
|
|
|
for (i = 0; i < ncred; i++) {
|
2007-12-05 19:09:23 +00:00
|
|
|
PyObject *pycreditem;
|
|
|
|
pycreditem = PyList_New(5);
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
PyTuple_SetItem(pycred, i, pycreditem);
|
|
|
|
PyList_SetItem(pycreditem, 0, PyInt_FromLong((long) cred[i].type));
|
|
|
|
PyList_SetItem(pycreditem, 1, PyString_FromString(cred[i].prompt));
|
|
|
|
if (cred[i].challenge) {
|
|
|
|
PyList_SetItem(pycreditem, 2, PyString_FromString(cred[i].challenge));
|
|
|
|
} else {
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
PyList_SetItem(pycreditem, 2, Py_None);
|
|
|
|
}
|
|
|
|
if (cred[i].defresult) {
|
|
|
|
PyList_SetItem(pycreditem, 3, PyString_FromString(cred[i].defresult));
|
|
|
|
} else {
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
PyList_SetItem(pycreditem, 3, Py_None);
|
|
|
|
}
|
|
|
|
PyList_SetItem(pycreditem, 4, Py_None);
|
|
|
|
}
|
|
|
|
|
|
|
|
PyTuple_SetItem(list, 0, pycred);
|
|
|
|
Py_XINCREF(pycbdata);
|
|
|
|
PyTuple_SetItem(list, 1, pycbdata);
|
|
|
|
|
|
|
|
PyErr_Clear();
|
|
|
|
pyret = PyEval_CallObject(pycb, list);
|
2012-09-10 15:44:40 +00:00
|
|
|
if (PyErr_Occurred()) {
|
|
|
|
PyErr_Print();
|
2007-12-05 19:09:23 +00:00
|
|
|
goto cleanup;
|
2012-09-10 15:44:40 +00:00
|
|
|
}
|
2007-12-05 19:09:23 +00:00
|
|
|
|
|
|
|
ret = PyLong_AsLong(pyret);
|
|
|
|
if (ret == 0) {
|
2013-05-21 08:05:06 +00:00
|
|
|
for (i = 0; i < ncred; i++) {
|
2007-12-05 19:09:23 +00:00
|
|
|
PyObject *pycreditem;
|
|
|
|
PyObject *pyresult;
|
|
|
|
char *result = NULL;
|
|
|
|
pycreditem = PyTuple_GetItem(pycred, i);
|
|
|
|
pyresult = PyList_GetItem(pycreditem, 4);
|
|
|
|
if (pyresult != Py_None)
|
|
|
|
result = PyString_AsString(pyresult);
|
|
|
|
if (result != NULL) {
|
|
|
|
cred[i].result = strdup(result);
|
|
|
|
cred[i].resultlen = strlen(result);
|
|
|
|
} else {
|
|
|
|
cred[i].result = NULL;
|
|
|
|
cred[i].resultlen = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
Py_XDECREF(list);
|
|
|
|
Py_XDECREF(pyret);
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectOpenAuth(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
virConnectPtr c_retval;
|
|
|
|
char * name;
|
2011-07-07 18:13:45 +00:00
|
|
|
unsigned int flags;
|
2007-12-05 19:09:23 +00:00
|
|
|
PyObject *pyauth;
|
|
|
|
PyObject *pycredcb;
|
|
|
|
PyObject *pycredtype;
|
|
|
|
virConnectAuth auth;
|
|
|
|
|
2012-09-10 15:00:05 +00:00
|
|
|
memset(&auth, 0, sizeof(auth));
|
2007-12-05 19:09:23 +00:00
|
|
|
if (!PyArg_ParseTuple(args, (char *)"zOi:virConnectOpenAuth", &name, &pyauth, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-12-05 19:09:23 +00:00
|
|
|
|
|
|
|
pycredtype = PyList_GetItem(pyauth, 0);
|
|
|
|
pycredcb = PyList_GetItem(pyauth, 1);
|
|
|
|
|
|
|
|
auth.ncredtype = PyList_Size(pycredtype);
|
|
|
|
if (auth.ncredtype) {
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(auth.credtype, auth.ncredtype) < 0)
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2013-05-21 08:05:06 +00:00
|
|
|
for (i = 0; i < auth.ncredtype; i++) {
|
2007-12-05 19:09:23 +00:00
|
|
|
PyObject *val;
|
|
|
|
val = PyList_GetItem(pycredtype, i);
|
|
|
|
auth.credtype[i] = (int)PyLong_AsLong(val);
|
|
|
|
}
|
|
|
|
}
|
2012-09-10 15:45:53 +00:00
|
|
|
if (pycredcb && pycredcb != Py_None)
|
|
|
|
auth.cb = virConnectCredCallbackWrapper;
|
2007-12-05 19:09:23 +00:00
|
|
|
auth.cbdata = pyauth;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
|
|
|
c_retval = virConnectOpenAuth(name, &auth, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(auth.credtype);
|
2007-12-05 19:09:23 +00:00
|
|
|
py_retval = libvirt_virConnectPtrWrap((virConnectPtr) c_retval);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2007-12-05 19:09:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-02-28 12:17:00 +00:00
|
|
|
/************************************************************************
|
|
|
|
* *
|
|
|
|
* Wrappers for functions where generator fails *
|
|
|
|
* *
|
|
|
|
************************************************************************/
|
|
|
|
|
2007-05-29 14:58:27 +00:00
|
|
|
static PyObject *
|
2012-10-17 09:23:12 +00:00
|
|
|
libvirt_virGetVersion(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
|
2007-05-29 14:58:27 +00:00
|
|
|
{
|
|
|
|
char *type = NULL;
|
|
|
|
unsigned long libVer, typeVer = 0;
|
|
|
|
int c_retval;
|
|
|
|
|
2012-10-17 09:23:12 +00:00
|
|
|
if (!PyArg_ParseTuple(args, (char *) "|s", &type))
|
2007-05-29 14:58:27 +00:00
|
|
|
return NULL;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (type == NULL)
|
2012-10-17 09:23:12 +00:00
|
|
|
c_retval = virGetVersion(&libVer, NULL, NULL);
|
2007-05-29 14:58:27 +00:00
|
|
|
else
|
2012-10-17 09:23:12 +00:00
|
|
|
c_retval = virGetVersion(&libVer, type, &typeVer);
|
2007-05-29 14:58:27 +00:00
|
|
|
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval == -1)
|
|
|
|
return VIR_PY_NONE;
|
2007-05-29 14:58:27 +00:00
|
|
|
|
|
|
|
if (type == NULL)
|
2012-10-17 09:23:12 +00:00
|
|
|
return PyInt_FromLong(libVer);
|
2007-05-29 14:58:27 +00:00
|
|
|
else
|
2012-10-17 09:23:12 +00:00
|
|
|
return Py_BuildValue((char *) "kk", libVer, typeVer);
|
2007-05-29 14:58:27 +00:00
|
|
|
}
|
|
|
|
|
2010-01-22 10:01:09 +00:00
|
|
|
static PyObject *
|
2012-10-17 09:23:12 +00:00
|
|
|
libvirt_virConnectGetVersion(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
2010-01-22 10:01:09 +00:00
|
|
|
{
|
|
|
|
unsigned long hvVersion;
|
|
|
|
int c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectGetVersion",
|
|
|
|
&pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-01-22 10:01:09 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
|
|
|
c_retval = virConnectGetVersion(conn, &hvVersion);
|
|
|
|
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval == -1)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
2012-10-17 09:23:12 +00:00
|
|
|
return PyInt_FromLong(hvVersion);
|
2010-01-22 10:01:09 +00:00
|
|
|
}
|
|
|
|
|
2013-09-23 09:46:04 +00:00
|
|
|
PyObject *
|
|
|
|
libvirt_virConnectGetCPUModelNames(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
int c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *rv = NULL, *pyobj_conn;
|
|
|
|
char **models = NULL;
|
|
|
|
size_t i;
|
|
|
|
int flags = 0;
|
|
|
|
const char *arch = NULL;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Osi:virConnectGetCPUModelNames",
|
|
|
|
&pyobj_conn, &arch, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
|
|
|
c_retval = virConnectGetCPUModelNames(conn, arch, &models, flags);
|
|
|
|
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval == -1)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
if ((rv = PyList_New(c_retval)) == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
PyObject *str;
|
|
|
|
if ((str = PyString_FromString(models[i])) == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
PyList_SET_ITEM(rv, i, str);
|
|
|
|
}
|
|
|
|
|
|
|
|
done:
|
|
|
|
if (models) {
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
VIR_FREE(models[i]);
|
|
|
|
VIR_FREE(models);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
|
|
|
|
|
|
|
error:
|
|
|
|
Py_XDECREF(rv);
|
|
|
|
rv = VIR_PY_INT_FAIL;
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
|
2009-11-12 15:53:26 +00:00
|
|
|
static PyObject *
|
2012-10-17 09:23:12 +00:00
|
|
|
libvirt_virConnectGetLibVersion(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
2009-11-12 15:53:26 +00:00
|
|
|
{
|
|
|
|
unsigned long libVer;
|
|
|
|
int c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectGetLibVersion",
|
|
|
|
&pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2009-11-12 15:53:26 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
|
|
|
c_retval = virConnectGetLibVersion(conn, &libVer);
|
|
|
|
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval == -1)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
2012-10-17 09:23:12 +00:00
|
|
|
return PyInt_FromLong(libVer);
|
2009-11-12 15:53:26 +00:00
|
|
|
}
|
2006-01-28 20:24:55 +00:00
|
|
|
|
2006-01-31 10:24:12 +00:00
|
|
|
static PyObject *
|
2006-02-09 17:45:11 +00:00
|
|
|
libvirt_virConnectListDomainsID(PyObject *self ATTRIBUTE_UNUSED,
|
2012-05-20 14:20:11 +00:00
|
|
|
PyObject *args) {
|
2006-01-31 10:24:12 +00:00
|
|
|
PyObject *py_retval;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int *ids = NULL, c_retval;
|
|
|
|
size_t i;
|
2006-01-31 10:24:12 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDomains", &pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2006-01-31 10:24:12 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2011-12-29 08:20:00 +00:00
|
|
|
c_retval = virConnectNumOfDomains(conn);
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
2011-12-29 08:20:00 +00:00
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(ids, c_retval) < 0)
|
2011-12-29 08:20:00 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListDomains(conn, ids, c_retval);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(ids);
|
2011-12-29 08:20:00 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
2006-01-31 10:24:12 +00:00
|
|
|
py_retval = PyList_New(c_retval);
|
2011-12-29 08:20:00 +00:00
|
|
|
|
|
|
|
if (ids) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2011-12-29 08:20:00 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_intWrap(ids[i]));
|
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(ids);
|
2006-01-31 10:24:12 +00:00
|
|
|
}
|
2011-12-29 08:20:00 +00:00
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2006-01-31 10:24:12 +00:00
|
|
|
}
|
|
|
|
|
2012-05-20 14:20:11 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListAllDomains(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
PyObject *tmp = NULL;
|
|
|
|
virConnectPtr conn;
|
|
|
|
virDomainPtr *doms = NULL;
|
|
|
|
int c_retval = 0;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-05-20 14:20:11 +00:00
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllDomains",
|
|
|
|
&pyobj_conn, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListAllDomains(conn, &doms, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if (!(tmp = libvirt_virDomainPtrWrap(doms[i])) ||
|
|
|
|
PyList_SetItem(py_retval, i, tmp) < 0) {
|
|
|
|
Py_XDECREF(tmp);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
/* python steals the pointer */
|
|
|
|
doms[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (doms[i])
|
|
|
|
virDomainFree(doms[i]);
|
|
|
|
VIR_FREE(doms);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2006-11-16 00:17:10 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListDefinedDomains(PyObject *self ATTRIBUTE_UNUSED,
|
2008-04-10 16:54:54 +00:00
|
|
|
PyObject *args) {
|
2006-11-16 00:17:10 +00:00
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2006-11-16 00:17:10 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
|
2007-03-09 15:42:50 +00:00
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDefinedDomains", &pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2006-11-16 00:17:10 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2006-11-16 00:17:10 +00:00
|
|
|
c_retval = virConnectNumOfDefinedDomains(conn);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2006-11-16 00:17:10 +00:00
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2007-03-06 21:55:44 +00:00
|
|
|
c_retval = virConnectListDefinedDomains(conn, names, c_retval);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2006-11-16 00:17:10 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2006-11-16 00:17:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2006-11-16 00:17:10 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2006-11-16 00:17:10 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2006-11-16 00:17:10 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2006-11-16 00:17:10 +00:00
|
|
|
}
|
|
|
|
|
2010-04-20 09:49:27 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSnapshotListNames(PyObject *self ATTRIBUTE_UNUSED,
|
2012-06-11 20:49:03 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2010-04-20 09:49:27 +00:00
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2010-04-20 09:49:27 +00:00
|
|
|
virDomainPtr dom;
|
|
|
|
PyObject *pyobj_dom;
|
2012-06-11 20:49:03 +00:00
|
|
|
PyObject *pyobj_snap;
|
2011-07-07 18:13:45 +00:00
|
|
|
unsigned int flags;
|
2010-04-20 09:49:27 +00:00
|
|
|
|
2012-06-11 20:49:03 +00:00
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainSnapshotListNames",
|
|
|
|
&pyobj_dom, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-04-20 09:49:27 +00:00
|
|
|
dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainSnapshotNum(dom, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2012-06-11 20:49:03 +00:00
|
|
|
return PyErr_NoMemory();
|
2010-04-20 09:49:27 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainSnapshotListNames(dom, names, c_retval, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2010-04-20 09:49:27 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
2012-06-11 20:49:03 +00:00
|
|
|
if (!py_retval)
|
|
|
|
goto cleanup;
|
2010-04-20 09:49:27 +00:00
|
|
|
|
2012-06-11 20:49:03 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if ((pyobj_snap = libvirt_constcharPtrWrap(names[i])) == NULL ||
|
|
|
|
PyList_SetItem(py_retval, i, pyobj_snap) < 0) {
|
|
|
|
Py_XDECREF(pyobj_snap);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
2011-09-25 01:56:26 +00:00
|
|
|
}
|
2012-06-11 20:49:03 +00:00
|
|
|
VIR_FREE(names[i]);
|
2011-09-25 01:56:26 +00:00
|
|
|
}
|
|
|
|
|
2012-06-11 20:49:03 +00:00
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
VIR_FREE(names[i]);
|
|
|
|
VIR_FREE(names);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2011-09-25 01:56:26 +00:00
|
|
|
}
|
|
|
|
|
2012-06-09 15:55:36 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainListAllSnapshots(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
virDomainSnapshotPtr *snaps = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2012-06-09 15:55:36 +00:00
|
|
|
virDomainPtr dom;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
unsigned int flags;
|
|
|
|
PyObject *pyobj_snap;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainListAllSnapshots",
|
|
|
|
&pyobj_dom, &flags))
|
|
|
|
return NULL;
|
|
|
|
dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainListAllSnapshots(dom, &snaps, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if ((pyobj_snap = libvirt_virDomainSnapshotPtrWrap(snaps[i])) == NULL ||
|
|
|
|
PyList_SetItem(py_retval, i, pyobj_snap) < 0) {
|
|
|
|
Py_XDECREF(pyobj_snap);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
snaps[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (snaps[i])
|
|
|
|
virDomainSnapshotFree(snaps[i]);
|
|
|
|
VIR_FREE(snaps);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2011-09-25 01:56:26 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSnapshotListChildrenNames(PyObject *self ATTRIBUTE_UNUSED,
|
2012-06-11 20:49:03 +00:00
|
|
|
PyObject *args)
|
|
|
|
{
|
2011-09-25 01:56:26 +00:00
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2011-09-25 01:56:26 +00:00
|
|
|
virDomainSnapshotPtr snap;
|
|
|
|
PyObject *pyobj_snap;
|
|
|
|
unsigned int flags;
|
|
|
|
|
2012-06-11 20:49:03 +00:00
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainSnapshotListChildrenNames",
|
|
|
|
&pyobj_snap, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2011-09-25 01:56:26 +00:00
|
|
|
snap = (virDomainSnapshotPtr) PyvirDomainSnapshot_Get(pyobj_snap);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainSnapshotNumChildren(snap, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2012-06-11 20:49:03 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-09-25 01:56:26 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-06-11 20:49:03 +00:00
|
|
|
c_retval = virDomainSnapshotListChildrenNames(snap, names, c_retval,
|
|
|
|
flags);
|
2011-09-25 01:56:26 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2011-09-25 01:56:26 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
|
2012-06-11 20:49:03 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if ((pyobj_snap = libvirt_constcharPtrWrap(names[i])) == NULL ||
|
|
|
|
PyList_SetItem(py_retval, i, pyobj_snap) < 0) {
|
|
|
|
Py_XDECREF(pyobj_snap);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
2010-04-20 09:49:27 +00:00
|
|
|
}
|
2012-06-11 20:49:03 +00:00
|
|
|
VIR_FREE(names[i]);
|
2010-04-20 09:49:27 +00:00
|
|
|
}
|
|
|
|
|
2012-06-11 20:49:03 +00:00
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
VIR_FREE(names[i]);
|
|
|
|
VIR_FREE(names);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2010-04-20 09:49:27 +00:00
|
|
|
}
|
|
|
|
|
2012-06-09 15:55:36 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSnapshotListAllChildren(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
virDomainSnapshotPtr *snaps = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2012-06-09 15:55:36 +00:00
|
|
|
virDomainSnapshotPtr parent;
|
|
|
|
PyObject *pyobj_parent;
|
|
|
|
unsigned int flags;
|
|
|
|
PyObject *pyobj_snap;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainSnapshotListAllChildren",
|
|
|
|
&pyobj_parent, &flags))
|
|
|
|
return NULL;
|
|
|
|
parent = (virDomainSnapshotPtr) PyvirDomainSnapshot_Get(pyobj_parent);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainSnapshotListAllChildren(parent, &snaps, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if ((pyobj_snap = libvirt_virDomainSnapshotPtrWrap(snaps[i])) == NULL ||
|
|
|
|
PyList_SetItem(py_retval, i, pyobj_snap) < 0) {
|
|
|
|
Py_XDECREF(pyobj_snap);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
snaps[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (snaps[i])
|
|
|
|
virDomainSnapshotFree(snaps[i]);
|
|
|
|
VIR_FREE(snaps);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2010-05-19 13:02:30 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainRevertToSnapshot(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
int c_retval;
|
|
|
|
virDomainSnapshotPtr snap;
|
|
|
|
PyObject *pyobj_snap;
|
|
|
|
PyObject *pyobj_dom;
|
2011-07-07 18:13:45 +00:00
|
|
|
unsigned int flags;
|
2010-05-19 13:02:30 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OOi:virDomainRevertToSnapshot", &pyobj_dom, &pyobj_snap, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-05-19 13:02:30 +00:00
|
|
|
snap = (virDomainSnapshotPtr) PyvirDomainSnapshot_Get(pyobj_snap);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainRevertToSnapshot(snap, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
return PyInt_FromLong(c_retval);
|
|
|
|
}
|
|
|
|
|
2006-01-31 10:24:12 +00:00
|
|
|
static PyObject *
|
2006-02-09 17:45:11 +00:00
|
|
|
libvirt_virDomainGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
2006-01-31 10:24:12 +00:00
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
virDomainInfo info;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetInfo", &pyobj_domain))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2006-01-31 10:24:12 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2006-01-31 10:24:12 +00:00
|
|
|
c_retval = virDomainGetInfo(domain, &info);
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
2006-01-31 10:24:12 +00:00
|
|
|
py_retval = PyList_New(5);
|
2006-02-09 17:45:11 +00:00
|
|
|
PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.state));
|
2006-11-15 19:40:00 +00:00
|
|
|
PyList_SetItem(py_retval, 1, libvirt_ulongWrap(info.maxMem));
|
|
|
|
PyList_SetItem(py_retval, 2, libvirt_ulongWrap(info.memory));
|
2006-02-09 17:45:11 +00:00
|
|
|
PyList_SetItem(py_retval, 3, libvirt_intWrap((int) info.nrVirtCpu));
|
2006-01-31 10:24:12 +00:00
|
|
|
PyList_SetItem(py_retval, 4,
|
2006-02-09 17:45:11 +00:00
|
|
|
libvirt_longlongWrap((unsigned long long) info.cpuTime));
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2006-01-31 10:24:12 +00:00
|
|
|
}
|
|
|
|
|
2011-04-22 11:31:35 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetState(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
int state;
|
|
|
|
int reason;
|
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetState",
|
|
|
|
&pyobj_domain, &flags))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainGetState(domain, &state, &reason, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
py_retval = PyList_New(2);
|
|
|
|
PyList_SetItem(py_retval, 0, libvirt_intWrap(state));
|
|
|
|
PyList_SetItem(py_retval, 1, libvirt_intWrap(reason));
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2011-05-24 08:28:50 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetControlInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
virDomainControlInfo info;
|
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainGetControlInfo",
|
|
|
|
&pyobj_domain, &flags))
|
|
|
|
return NULL;
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainGetControlInfo(domain, &info, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
py_retval = PyList_New(3);
|
|
|
|
PyList_SetItem(py_retval, 0, libvirt_intWrap(info.state));
|
|
|
|
PyList_SetItem(py_retval, 1, libvirt_intWrap(info.details));
|
|
|
|
PyList_SetItem(py_retval, 2, libvirt_longlongWrap(info.stateTime));
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2010-04-28 12:42:13 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetBlockInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
virDomainBlockInfo info;
|
|
|
|
const char *path;
|
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainGetInfo", &pyobj_domain, &path, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-04-28 12:42:13 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainGetBlockInfo(domain, path, &info, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
py_retval = PyList_New(3);
|
|
|
|
PyList_SetItem(py_retval, 0, libvirt_ulonglongWrap(info.capacity));
|
|
|
|
PyList_SetItem(py_retval, 1, libvirt_ulonglongWrap(info.allocation));
|
|
|
|
PyList_SetItem(py_retval, 2, libvirt_ulonglongWrap(info.physical));
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2010-04-28 12:42:13 +00:00
|
|
|
}
|
|
|
|
|
2006-03-29 12:46:03 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNodeGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
virNodeInfo info;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetInfo", &pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2006-03-29 12:46:03 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2006-03-29 12:46:03 +00:00
|
|
|
c_retval = virNodeGetInfo(conn, &info);
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
2006-03-29 12:46:03 +00:00
|
|
|
py_retval = PyList_New(8);
|
2006-03-29 13:33:37 +00:00
|
|
|
PyList_SetItem(py_retval, 0, libvirt_constcharPtrWrap(&info.model[0]));
|
|
|
|
PyList_SetItem(py_retval, 1, libvirt_longWrap((long) info.memory >> 10));
|
2006-03-29 12:46:03 +00:00
|
|
|
PyList_SetItem(py_retval, 2, libvirt_intWrap((int) info.cpus));
|
|
|
|
PyList_SetItem(py_retval, 3, libvirt_intWrap((int) info.mhz));
|
|
|
|
PyList_SetItem(py_retval, 4, libvirt_intWrap((int) info.nodes));
|
|
|
|
PyList_SetItem(py_retval, 5, libvirt_intWrap((int) info.sockets));
|
|
|
|
PyList_SetItem(py_retval, 6, libvirt_intWrap((int) info.cores));
|
|
|
|
PyList_SetItem(py_retval, 7, libvirt_intWrap((int) info.threads));
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2006-03-29 12:46:03 +00:00
|
|
|
}
|
|
|
|
|
2008-01-21 15:55:53 +00:00
|
|
|
static PyObject *
|
2006-02-23 11:26:17 +00:00
|
|
|
libvirt_virDomainGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
Mon Jan 23 14:36:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
* include/libvirt/libvirt.h.in: add VIR_UUID_BUFLEN and
VIR_UUID_STRING_BUFLEN
* libvirt/proxy/libvirt_proxy.c, libvirt/src/hash.c,
libvirt/src/internal.h, libvirt/src/libvirt.c,
libvirt/src/proxy_internal.c, libvirt/src/test.c,
libvirt/src/virsh.c, libvirt/src/xend_internal.c,
libvirt/src/xm_internal.c, libvirt/src/xml.c,
libvirt/python/libvir.c: use them
2007-01-23 14:39:45 +00:00
|
|
|
unsigned char uuid[VIR_UUID_BUFLEN];
|
2006-02-23 11:26:17 +00:00
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
2006-10-24 20:28:16 +00:00
|
|
|
int c_retval;
|
2006-02-23 11:26:17 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetUUID", &pyobj_domain))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2006-02-23 11:26:17 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if (domain == NULL)
|
|
|
|
return VIR_PY_NONE;
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainGetUUID(domain, &uuid[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
Mon Jan 23 14:36:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
* include/libvirt/libvirt.h.in: add VIR_UUID_BUFLEN and
VIR_UUID_STRING_BUFLEN
* libvirt/proxy/libvirt_proxy.c, libvirt/src/hash.c,
libvirt/src/internal.h, libvirt/src/libvirt.c,
libvirt/src/proxy_internal.c, libvirt/src/test.c,
libvirt/src/virsh.c, libvirt/src/xend_internal.c,
libvirt/src/xm_internal.c, libvirt/src/xml.c,
libvirt/python/libvir.c: use them
2007-01-23 14:39:45 +00:00
|
|
|
py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
|
2006-02-23 11:26:17 +00:00
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2006-02-23 11:26:17 +00:00
|
|
|
}
|
|
|
|
|
2008-06-10 15:20:25 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
|
|
virDomainPtr dom;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
int c_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetUUIDString",
|
|
|
|
&pyobj_dom))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-06-10 15:20:25 +00:00
|
|
|
dom = (virDomainPtr) PyvirDomain_Get(pyobj_dom);
|
|
|
|
|
|
|
|
if (dom == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainGetUUIDString(dom, &uuidstr[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
py_retval = PyString_FromString((char *) &uuidstr[0]);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-06-10 15:20:25 +00:00
|
|
|
}
|
|
|
|
|
2007-03-06 21:55:44 +00:00
|
|
|
static PyObject *
|
2006-02-24 12:26:56 +00:00
|
|
|
libvirt_virDomainLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
virDomainPtr c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
unsigned char * uuid;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oz#:virDomainLookupByUUID", &pyobj_conn, &uuid, &len))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2006-02-24 12:26:56 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
|
|
|
|
return VIR_PY_NONE;
|
2006-02-24 12:26:56 +00:00
|
|
|
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2006-02-24 12:26:56 +00:00
|
|
|
c_retval = virDomainLookupByUUID(conn, uuid);
|
2006-10-24 20:28:16 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2006-02-24 12:26:56 +00:00
|
|
|
py_retval = libvirt_virDomainPtrWrap((virDomainPtr) c_retval);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2006-02-24 12:26:56 +00:00
|
|
|
}
|
|
|
|
|
2007-03-09 15:42:50 +00:00
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListNetworks(PyObject *self ATTRIBUTE_UNUSED,
|
2008-04-10 16:54:54 +00:00
|
|
|
PyObject *args) {
|
2007-03-09 15:42:50 +00:00
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2007-03-09 15:42:50 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectListNetworks", &pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-03-09 15:42:50 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2007-03-09 15:42:50 +00:00
|
|
|
c_retval = virConnectNumOfNetworks(conn);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
2007-03-09 15:42:50 +00:00
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2007-03-09 15:42:50 +00:00
|
|
|
c_retval = virConnectListNetworks(conn, names, c_retval);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2007-03-09 15:42:50 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2007-03-09 15:42:50 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListDefinedNetworks(PyObject *self ATTRIBUTE_UNUSED,
|
2008-04-10 16:54:54 +00:00
|
|
|
PyObject *args) {
|
2007-03-09 15:42:50 +00:00
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2007-03-09 15:42:50 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDefinedNetworks", &pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-03-09 15:42:50 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2007-03-09 15:42:50 +00:00
|
|
|
c_retval = virConnectNumOfDefinedNetworks(conn);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
2008-02-05 19:27:37 +00:00
|
|
|
|
2007-03-09 15:42:50 +00:00
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2007-03-09 15:42:50 +00:00
|
|
|
c_retval = virConnectListDefinedNetworks(conn, names, c_retval);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2007-03-09 15:42:50 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2007-03-09 15:42:50 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
|
|
|
|
2012-09-04 15:55:21 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListAllNetworks(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
PyObject *tmp = NULL;
|
|
|
|
virConnectPtr conn;
|
|
|
|
virNetworkPtr *nets = NULL;
|
|
|
|
int c_retval = 0;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-09-04 15:55:21 +00:00
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllNetworks",
|
|
|
|
&pyobj_conn, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListAllNetworks(conn, &nets, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if (!(tmp = libvirt_virNetworkPtrWrap(nets[i])) ||
|
|
|
|
PyList_SetItem(py_retval, i, tmp) < 0) {
|
|
|
|
Py_XDECREF(tmp);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
/* python steals the pointer */
|
|
|
|
nets[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (nets[i])
|
|
|
|
virNetworkFree(nets[i]);
|
|
|
|
VIR_FREE(nets);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2007-03-09 15:42:50 +00:00
|
|
|
|
2008-01-21 15:55:53 +00:00
|
|
|
static PyObject *
|
2007-03-09 15:42:50 +00:00
|
|
|
libvirt_virNetworkGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
unsigned char uuid[VIR_UUID_BUFLEN];
|
|
|
|
virNetworkPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
int c_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virNetworkGetUUID", &pyobj_domain))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-03-09 15:42:50 +00:00
|
|
|
domain = (virNetworkPtr) PyvirNetwork_Get(pyobj_domain);
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if (domain == NULL)
|
|
|
|
return VIR_PY_NONE;
|
2007-03-09 15:42:50 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNetworkGetUUID(domain, &uuid[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
2007-03-09 15:42:50 +00:00
|
|
|
py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
|
|
|
|
2008-06-10 15:20:25 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNetworkGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
|
|
virNetworkPtr net;
|
|
|
|
PyObject *pyobj_net;
|
|
|
|
int c_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virNetworkGetUUIDString",
|
|
|
|
&pyobj_net))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-06-10 15:20:25 +00:00
|
|
|
net = (virNetworkPtr) PyvirNetwork_Get(pyobj_net);
|
|
|
|
|
|
|
|
if (net == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNetworkGetUUIDString(net, &uuidstr[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
py_retval = PyString_FromString((char *) &uuidstr[0]);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-06-10 15:20:25 +00:00
|
|
|
}
|
|
|
|
|
2007-03-09 15:42:50 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNetworkLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
virNetworkPtr c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
unsigned char * uuid;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oz#:virNetworkLookupByUUID", &pyobj_conn, &uuid, &len))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-03-09 15:42:50 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
|
|
|
|
return VIR_PY_NONE;
|
2007-03-09 15:42:50 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNetworkLookupByUUID(conn, uuid);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
py_retval = libvirt_virNetworkPtrWrap((virNetworkPtr) c_retval);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2007-03-09 15:42:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-01-21 15:55:53 +00:00
|
|
|
static PyObject *
|
2007-04-10 23:15:58 +00:00
|
|
|
libvirt_virDomainGetAutostart(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval, autostart;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetAutostart", &pyobj_domain))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-04-10 23:15:58 +00:00
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainGetAutostart(domain, &autostart);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
2008-02-07 09:49:13 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
2007-04-10 23:15:58 +00:00
|
|
|
py_retval = libvirt_intWrap(autostart);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2007-04-10 23:15:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-01-21 15:55:53 +00:00
|
|
|
static PyObject *
|
2007-04-10 23:15:58 +00:00
|
|
|
libvirt_virNetworkGetAutostart(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval, autostart;
|
|
|
|
virNetworkPtr network;
|
|
|
|
PyObject *pyobj_network;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virNetworkGetAutostart", &pyobj_network))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-04-10 23:15:58 +00:00
|
|
|
|
|
|
|
network = (virNetworkPtr) PyvirNetwork_Get(pyobj_network);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNetworkGetAutostart(network, &autostart);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-01-17 22:13:55 +00:00
|
|
|
if (c_retval < 0)
|
2008-02-07 09:49:13 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
2007-04-10 23:15:58 +00:00
|
|
|
py_retval = libvirt_intWrap(autostart);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2007-04-10 23:15:58 +00:00
|
|
|
}
|
|
|
|
|
2008-01-21 15:55:53 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNodeGetCellsFreeMemory(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
|
2007-12-07 08:41:01 +00:00
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
PyObject *pyobj_conn;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int startCell, maxCells, c_retval;
|
|
|
|
size_t i;
|
2007-12-07 08:41:01 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
unsigned long long *freeMems;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oii:virNodeGetCellsFreeMemory", &pyobj_conn, &startCell, &maxCells))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2007-04-10 23:15:58 +00:00
|
|
|
|
2007-12-07 08:41:01 +00:00
|
|
|
if ((startCell < 0) || (maxCells <= 0) || (startCell + maxCells > 10000))
|
2011-07-06 17:25:18 +00:00
|
|
|
return VIR_PY_NONE;
|
2007-12-07 08:41:01 +00:00
|
|
|
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(freeMems, maxCells) < 0)
|
2011-07-06 17:25:18 +00:00
|
|
|
return VIR_PY_NONE;
|
2007-12-07 08:41:01 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNodeGetCellsFreeMemory(conn, freeMems, startCell, maxCells);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(freeMems);
|
2008-01-17 22:13:55 +00:00
|
|
|
return VIR_PY_NONE;
|
2007-12-07 08:41:01 +00:00
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2008-04-10 16:54:54 +00:00
|
|
|
PyList_SetItem(py_retval, i,
|
|
|
|
libvirt_longlongWrap((long long) freeMems[i]));
|
2007-12-07 08:41:01 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(freeMems);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2007-12-07 08:41:01 +00:00
|
|
|
}
|
2007-03-09 15:42:50 +00:00
|
|
|
|
2011-11-28 17:19:27 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNodeGetCPUStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
|
|
|
|
{
|
2012-03-21 16:25:22 +00:00
|
|
|
PyObject *ret = NULL;
|
|
|
|
PyObject *key = NULL;
|
|
|
|
PyObject *val = NULL;
|
2011-11-28 17:19:27 +00:00
|
|
|
PyObject *pyobj_conn;
|
|
|
|
virConnectPtr conn;
|
|
|
|
unsigned int flags;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int cpuNum, c_retval;
|
|
|
|
size_t i;
|
2011-11-28 17:19:27 +00:00
|
|
|
int nparams = 0;
|
|
|
|
virNodeCPUStatsPtr stats = NULL;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oii:virNodeGetCPUStats", &pyobj_conn, &cpuNum, &flags))
|
2012-03-21 16:25:22 +00:00
|
|
|
return ret;
|
2011-11-28 17:19:27 +00:00
|
|
|
conn = (virConnectPtr)(PyvirConnect_Get(pyobj_conn));
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNodeGetCPUStats(conn, cpuNum, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (nparams) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(stats, nparams) < 0)
|
2012-03-21 16:25:22 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-11-28 17:19:27 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNodeGetCPUStats(conn, cpuNum, stats, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(stats);
|
2011-11-28 17:19:27 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
2012-03-21 16:25:22 +00:00
|
|
|
|
|
|
|
if (!(ret = PyDict_New()))
|
|
|
|
goto error;
|
|
|
|
|
2011-11-28 17:19:27 +00:00
|
|
|
for (i = 0; i < nparams; i++) {
|
2012-03-21 16:25:22 +00:00
|
|
|
key = libvirt_constcharPtrWrap(stats[i].field);
|
|
|
|
val = libvirt_ulonglongWrap(stats[i].value);
|
|
|
|
|
|
|
|
if (!key || !val || PyDict_SetItem(ret, key, val) < 0) {
|
|
|
|
Py_DECREF(ret);
|
|
|
|
ret = NULL;
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_DECREF(key);
|
|
|
|
Py_DECREF(val);
|
2011-11-28 17:19:27 +00:00
|
|
|
}
|
|
|
|
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(stats);
|
2011-11-28 17:19:27 +00:00
|
|
|
return ret;
|
2012-03-21 16:25:22 +00:00
|
|
|
|
|
|
|
error:
|
|
|
|
VIR_FREE(stats);
|
|
|
|
Py_XDECREF(key);
|
|
|
|
Py_XDECREF(val);
|
|
|
|
return ret;
|
2011-11-28 17:19:27 +00:00
|
|
|
}
|
2008-02-20 15:26:22 +00:00
|
|
|
|
2011-11-28 17:19:28 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNodeGetMemoryStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
|
|
|
|
{
|
2012-03-21 15:30:03 +00:00
|
|
|
PyObject *ret = NULL;
|
|
|
|
PyObject *key = NULL;
|
|
|
|
PyObject *val = NULL;
|
2011-11-28 17:19:28 +00:00
|
|
|
PyObject *pyobj_conn;
|
|
|
|
virConnectPtr conn;
|
|
|
|
unsigned int flags;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int cellNum, c_retval;
|
|
|
|
size_t i;
|
2011-11-28 17:19:28 +00:00
|
|
|
int nparams = 0;
|
|
|
|
virNodeMemoryStatsPtr stats = NULL;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oii:virNodeGetMemoryStats", &pyobj_conn, &cellNum, &flags))
|
2012-03-21 15:30:03 +00:00
|
|
|
return ret;
|
2011-11-28 17:19:28 +00:00
|
|
|
conn = (virConnectPtr)(PyvirConnect_Get(pyobj_conn));
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNodeGetMemoryStats(conn, cellNum, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (nparams) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(stats, nparams) < 0)
|
2012-03-21 15:30:03 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-11-28 17:19:28 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNodeGetMemoryStats(conn, cellNum, stats, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(stats);
|
2011-11-28 17:19:28 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
2012-03-21 15:30:03 +00:00
|
|
|
|
|
|
|
if (!(ret = PyDict_New()))
|
|
|
|
goto error;
|
|
|
|
|
2011-11-28 17:19:28 +00:00
|
|
|
for (i = 0; i < nparams; i++) {
|
2012-03-21 15:30:03 +00:00
|
|
|
key = libvirt_constcharPtrWrap(stats[i].field);
|
|
|
|
val = libvirt_ulonglongWrap(stats[i].value);
|
|
|
|
|
|
|
|
if (!key || !val || PyDict_SetItem(ret, key, val) < 0) {
|
|
|
|
Py_DECREF(ret);
|
|
|
|
ret = NULL;
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_DECREF(key);
|
|
|
|
Py_DECREF(val);
|
2011-11-28 17:19:28 +00:00
|
|
|
}
|
|
|
|
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(stats);
|
2011-11-28 17:19:28 +00:00
|
|
|
return ret;
|
2012-03-21 15:30:03 +00:00
|
|
|
|
|
|
|
error:
|
|
|
|
VIR_FREE(stats);
|
|
|
|
Py_XDECREF(key);
|
|
|
|
Py_XDECREF(val);
|
|
|
|
return ret;
|
2011-11-28 17:19:28 +00:00
|
|
|
}
|
|
|
|
|
2008-02-20 15:26:22 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListStoragePools(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2008-02-20 15:26:22 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectListStoragePools", &pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-02-20 15:26:22 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
c_retval = virConnectNumOfStoragePools(conn);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2008-02-20 15:26:22 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
c_retval = virConnectListStoragePools(conn, names, c_retval);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-02-20 15:26:22 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
if (py_retval == NULL) {
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++)
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
|
|
|
VIR_FREE(names);
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2008-02-20 15:26:22 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListDefinedStoragePools(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2008-02-20 15:26:22 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDefinedStoragePools", &pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-02-20 15:26:22 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
c_retval = virConnectNumOfDefinedStoragePools(conn);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2008-02-20 15:26:22 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
c_retval = virConnectListDefinedStoragePools(conn, names, c_retval);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-02-20 15:26:22 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
if (py_retval == NULL) {
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++)
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
|
|
|
VIR_FREE(names);
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2008-02-20 15:26:22 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
2012-09-04 15:16:33 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListAllStoragePools(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
PyObject *tmp = NULL;
|
|
|
|
virConnectPtr conn;
|
|
|
|
virStoragePoolPtr *pools = NULL;
|
|
|
|
int c_retval = 0;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-09-04 15:16:33 +00:00
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllStoragePools",
|
|
|
|
&pyobj_conn, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListAllStoragePools(conn, &pools, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if (!(tmp = libvirt_virStoragePoolPtrWrap(pools[i])) ||
|
|
|
|
PyList_SetItem(py_retval, i, tmp) < 0) {
|
|
|
|
Py_XDECREF(tmp);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
/* python steals the pointer */
|
|
|
|
pools[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (pools[i])
|
|
|
|
virStoragePoolFree(pools[i]);
|
|
|
|
VIR_FREE(pools);
|
|
|
|
return py_retval;
|
|
|
|
}
|
2008-02-20 15:26:22 +00:00
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virStoragePoolListVolumes(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2008-02-20 15:26:22 +00:00
|
|
|
virStoragePoolPtr pool;
|
|
|
|
PyObject *pyobj_pool;
|
|
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolListVolumes", &pyobj_pool))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-02-20 15:26:22 +00:00
|
|
|
pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
c_retval = virStoragePoolNumOfVolumes(pool);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2008-02-20 15:26:22 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
c_retval = virStoragePoolListVolumes(pool, names, c_retval);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-02-20 15:26:22 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-02-20 15:26:22 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
if (py_retval == NULL) {
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++)
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
|
|
|
VIR_FREE(names);
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2008-02-20 15:26:22 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
2012-09-04 15:32:58 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virStoragePoolListAllVolumes(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
PyObject *tmp = NULL;
|
|
|
|
virStoragePoolPtr pool;
|
|
|
|
virStorageVolPtr *vols = NULL;
|
|
|
|
int c_retval = 0;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-09-04 15:32:58 +00:00
|
|
|
unsigned int flags;
|
|
|
|
PyObject *pyobj_pool;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virStoragePoolListAllVolumes",
|
|
|
|
&pyobj_pool, &flags))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virStoragePoolListAllVolumes(pool, &vols, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if (!(tmp = libvirt_virStorageVolPtrWrap(vols[i])) ||
|
|
|
|
PyList_SetItem(py_retval, i, tmp) < 0) {
|
|
|
|
Py_XDECREF(tmp);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
/* python steals the pointer */
|
|
|
|
vols[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (vols[i])
|
|
|
|
virStorageVolFree(vols[i]);
|
|
|
|
VIR_FREE(vols);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-02-20 15:26:22 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virStoragePoolGetAutostart(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval, autostart;
|
|
|
|
virStoragePoolPtr pool;
|
|
|
|
PyObject *pyobj_pool;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolGetAutostart", &pyobj_pool))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-02-20 15:26:22 +00:00
|
|
|
|
|
|
|
pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virStoragePoolGetAutostart(pool, &autostart);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
py_retval = libvirt_intWrap(autostart);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virStoragePoolGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval;
|
|
|
|
virStoragePoolPtr pool;
|
|
|
|
PyObject *pyobj_pool;
|
|
|
|
virStoragePoolInfo info;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolGetInfo", &pyobj_pool))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-02-20 15:26:22 +00:00
|
|
|
pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virStoragePoolGetInfo(pool, &info);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if ((py_retval = PyList_New(4)) == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.state));
|
|
|
|
PyList_SetItem(py_retval, 1,
|
|
|
|
libvirt_longlongWrap((unsigned long long) info.capacity));
|
|
|
|
PyList_SetItem(py_retval, 2,
|
|
|
|
libvirt_longlongWrap((unsigned long long) info.allocation));
|
|
|
|
PyList_SetItem(py_retval, 3,
|
|
|
|
libvirt_longlongWrap((unsigned long long) info.available));
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virStorageVolGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval;
|
|
|
|
virStorageVolPtr pool;
|
|
|
|
PyObject *pyobj_pool;
|
|
|
|
virStorageVolInfo info;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virStorageVolGetInfo", &pyobj_pool))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-02-20 15:26:22 +00:00
|
|
|
pool = (virStorageVolPtr) PyvirStorageVol_Get(pyobj_pool);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virStorageVolGetInfo(pool, &info);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if ((py_retval = PyList_New(3)) == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.type));
|
|
|
|
PyList_SetItem(py_retval, 1,
|
|
|
|
libvirt_longlongWrap((unsigned long long) info.capacity));
|
|
|
|
PyList_SetItem(py_retval, 2,
|
|
|
|
libvirt_longlongWrap((unsigned long long) info.allocation));
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virStoragePoolGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
unsigned char uuid[VIR_UUID_BUFLEN];
|
|
|
|
virStoragePoolPtr pool;
|
|
|
|
PyObject *pyobj_pool;
|
|
|
|
int c_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolGetUUID", &pyobj_pool))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-02-20 15:26:22 +00:00
|
|
|
pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
|
|
|
|
|
|
|
|
if (pool == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virStoragePoolGetUUID(pool, &uuid[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
2008-06-10 15:20:25 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virStoragePoolGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
|
|
virStoragePoolPtr pool;
|
|
|
|
PyObject *pyobj_pool;
|
|
|
|
int c_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virStoragePoolGetUUIDString", &pyobj_pool))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-06-10 15:20:25 +00:00
|
|
|
pool = (virStoragePoolPtr) PyvirStoragePool_Get(pyobj_pool);
|
|
|
|
|
|
|
|
if (pool == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virStoragePoolGetUUIDString(pool, &uuidstr[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
py_retval = PyString_FromString((char *) &uuidstr[0]);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-06-10 15:20:25 +00:00
|
|
|
}
|
2008-02-20 15:26:22 +00:00
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virStoragePoolLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
virStoragePoolPtr c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
unsigned char * uuid;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oz#:virStoragePoolLookupByUUID", &pyobj_conn, &uuid, &len))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-02-20 15:26:22 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virStoragePoolLookupByUUID(conn, uuid);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
py_retval = libvirt_virStoragePoolPtrWrap((virStoragePoolPtr) c_retval);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-02-20 15:26:22 +00:00
|
|
|
}
|
|
|
|
|
2008-11-21 12:41:15 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNodeListDevices(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2008-11-21 12:41:15 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
char *cap;
|
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Ozi:virNodeListDevices",
|
|
|
|
&pyobj_conn, &cap, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-11-21 12:41:15 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-11-21 12:41:15 +00:00
|
|
|
c_retval = virNodeNumOfDevices(conn, cap, flags);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-11-21 12:41:15 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2008-11-21 12:41:15 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-11-21 12:41:15 +00:00
|
|
|
c_retval = virNodeListDevices(conn, cap, names, c_retval, flags);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-11-21 12:41:15 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-11-21 12:41:15 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2008-11-21 12:41:15 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2008-11-21 12:41:15 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-11-21 12:41:15 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-11-21 12:41:15 +00:00
|
|
|
}
|
|
|
|
|
2012-09-05 05:34:11 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListAllNodeDevices(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
PyObject *tmp = NULL;
|
|
|
|
virConnectPtr conn;
|
|
|
|
virNodeDevicePtr *devices = NULL;
|
|
|
|
int c_retval = 0;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-09-05 05:34:11 +00:00
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllNodeDevices",
|
|
|
|
&pyobj_conn, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListAllNodeDevices(conn, &devices, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if (!(tmp = libvirt_virNodeDevicePtrWrap(devices[i])) ||
|
|
|
|
PyList_SetItem(py_retval, i, tmp) < 0) {
|
|
|
|
Py_XDECREF(tmp);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
/* python steals the pointer */
|
|
|
|
devices[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (devices[i])
|
|
|
|
virNodeDeviceFree(devices[i]);
|
|
|
|
VIR_FREE(devices);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2008-11-21 12:41:15 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNodeDeviceListCaps(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2008-11-21 12:41:15 +00:00
|
|
|
virNodeDevicePtr dev;
|
|
|
|
PyObject *pyobj_dev;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virNodeDeviceListCaps", &pyobj_dev))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-11-21 12:41:15 +00:00
|
|
|
dev = (virNodeDevicePtr) PyvirNodeDevice_Get(pyobj_dev);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-11-21 12:41:15 +00:00
|
|
|
c_retval = virNodeDeviceNumOfCaps(dev);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-11-21 12:41:15 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2008-11-21 12:41:15 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2008-11-21 12:41:15 +00:00
|
|
|
c_retval = virNodeDeviceListCaps(dev, names, c_retval);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2008-11-21 12:41:15 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-11-21 12:41:15 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2008-11-21 12:41:15 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2008-11-21 12:41:15 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2008-11-21 12:41:15 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-11-21 12:41:15 +00:00
|
|
|
}
|
|
|
|
|
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 16:44:12 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virSecretGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
unsigned char uuid[VIR_UUID_BUFLEN];
|
|
|
|
virSecretPtr secret;
|
|
|
|
PyObject *pyobj_secret;
|
|
|
|
int c_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virSecretGetUUID", &pyobj_secret))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 16:44:12 +00:00
|
|
|
secret = (virSecretPtr) PyvirSecret_Get(pyobj_secret);
|
|
|
|
|
|
|
|
if (secret == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virSecretGetUUID(secret, &uuid[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 16:44:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virSecretGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
|
|
virSecretPtr dom;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
int c_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virSecretGetUUIDString",
|
|
|
|
&pyobj_dom))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 16:44:12 +00:00
|
|
|
dom = (virSecretPtr) PyvirSecret_Get(pyobj_dom);
|
|
|
|
|
|
|
|
if (dom == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virSecretGetUUIDString(dom, &uuidstr[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
py_retval = PyString_FromString((char *) &uuidstr[0]);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 16:44:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virSecretLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
virSecretPtr c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
unsigned char * uuid;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oz#:virSecretLookupByUUID", &pyobj_conn, &uuid, &len))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 16:44:12 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virSecretLookupByUUID(conn, uuid);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
py_retval = libvirt_virSecretPtrWrap((virSecretPtr) c_retval);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 16:44:12 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListSecrets(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char **uuids = NULL;
|
|
|
|
virConnectPtr conn;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
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) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(uuids, c_retval) < 0)
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListSecrets(conn, uuids, c_retval);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(uuids);
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
|
|
|
|
if (uuids) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(uuids[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(uuids[i]);
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(uuids);
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2012-09-14 08:38:51 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListAllSecrets(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
PyObject *tmp = NULL;
|
|
|
|
virConnectPtr conn;
|
|
|
|
virSecretPtr *secrets = NULL;
|
|
|
|
int c_retval = 0;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-09-14 08:38:51 +00:00
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllSecrets",
|
|
|
|
&pyobj_conn, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListAllSecrets(conn, &secrets, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if (!(tmp = libvirt_virSecretPtrWrap(secrets[i])) ||
|
|
|
|
PyList_SetItem(py_retval, i, tmp) < 0) {
|
|
|
|
Py_XDECREF(tmp);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
/* python steals the pointer */
|
|
|
|
secrets[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (secrets[i])
|
|
|
|
virSecretFree(secrets[i]);
|
|
|
|
VIR_FREE(secrets);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
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);
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(c_retval);
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
2008-11-21 12:41:15 +00:00
|
|
|
|
2010-04-29 10:46:01 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNWFilterGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
unsigned char uuid[VIR_UUID_BUFLEN];
|
|
|
|
virNWFilterPtr nwfilter;
|
|
|
|
PyObject *pyobj_nwfilter;
|
|
|
|
int c_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virNWFilterGetUUID", &pyobj_nwfilter))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-04-29 10:46:01 +00:00
|
|
|
nwfilter = (virNWFilterPtr) PyvirNWFilter_Get(pyobj_nwfilter);
|
|
|
|
|
|
|
|
if (nwfilter == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNWFilterGetUUID(nwfilter, &uuid[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
py_retval = PyString_FromStringAndSize((char *) &uuid[0], VIR_UUID_BUFLEN);
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2010-04-29 10:46:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virNWFilterGetUUIDString(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char uuidstr[VIR_UUID_STRING_BUFLEN];
|
|
|
|
virNWFilterPtr nwfilter;
|
|
|
|
PyObject *pyobj_nwfilter;
|
|
|
|
int c_retval;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virNWFilterGetUUIDString",
|
|
|
|
&pyobj_nwfilter))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-04-29 10:46:01 +00:00
|
|
|
nwfilter = (virNWFilterPtr) PyvirNWFilter_Get(pyobj_nwfilter);
|
|
|
|
|
|
|
|
if (nwfilter == NULL)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNWFilterGetUUIDString(nwfilter, &uuidstr[0]);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
py_retval = PyString_FromString((char *) &uuidstr[0]);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2010-04-29 10:46:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virNWFilterLookupByUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
virNWFilterPtr c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
unsigned char * uuid;
|
|
|
|
int len;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oz#:virNWFilterLookupByUUID", &pyobj_conn, &uuid, &len))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-04-29 10:46:01 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
if ((uuid == NULL) || (len != VIR_UUID_BUFLEN))
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virNWFilterLookupByUUID(conn, uuid);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
py_retval = libvirt_virNWFilterPtrWrap((virNWFilterPtr) c_retval);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2010-04-29 10:46:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListNWFilters(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char **uuids = NULL;
|
|
|
|
virConnectPtr conn;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2010-04-29 10:46:01 +00:00
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectListNWFilters", &pyobj_conn))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectNumOfNWFilters(conn);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(uuids, c_retval) < 0)
|
2010-04-29 10:46:01 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListNWFilters(conn, uuids, c_retval);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(uuids);
|
2010-04-29 10:46:01 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
|
|
|
|
if (uuids) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2010-04-29 10:46:01 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(uuids[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(uuids[i]);
|
2010-04-29 10:46:01 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(uuids);
|
2010-04-29 10:46:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2012-09-05 06:02:06 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListAllNWFilters(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
PyObject *tmp = NULL;
|
|
|
|
virConnectPtr conn;
|
|
|
|
virNWFilterPtr *filters = NULL;
|
|
|
|
int c_retval = 0;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-09-05 06:02:06 +00:00
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllNWFilters",
|
|
|
|
&pyobj_conn, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListAllNWFilters(conn, &filters, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if (!(tmp = libvirt_virNWFilterPtrWrap(filters[i])) ||
|
|
|
|
PyList_SetItem(py_retval, i, tmp) < 0) {
|
|
|
|
Py_XDECREF(tmp);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
/* python steals the pointer */
|
|
|
|
filters[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (filters[i])
|
|
|
|
virNWFilterFree(filters[i]);
|
|
|
|
VIR_FREE(filters);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2009-11-20 15:22:42 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListInterfaces(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2009-11-20 15:22:42 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectListInterfaces", &pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2009-11-20 15:22:42 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2009-11-20 15:22:42 +00:00
|
|
|
c_retval = virConnectNumOfInterfaces(conn);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2009-11-20 15:22:42 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2009-11-20 15:22:42 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2009-11-20 15:22:42 +00:00
|
|
|
c_retval = virConnectListInterfaces(conn, names, c_retval);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2009-11-20 15:22:42 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2009-11-20 15:22:42 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
if (py_retval == NULL) {
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++)
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
|
|
|
VIR_FREE(names);
|
2009-11-20 15:22:42 +00:00
|
|
|
}
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2009-11-20 15:22:42 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2009-11-20 15:22:42 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2009-11-20 15:22:42 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2009-11-20 15:22:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListDefinedInterfaces(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
char **names = NULL;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int c_retval;
|
|
|
|
size_t i;
|
2009-11-20 15:22:42 +00:00
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDefinedInterfaces",
|
|
|
|
&pyobj_conn))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2009-11-20 15:22:42 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2009-11-20 15:22:42 +00:00
|
|
|
c_retval = virConnectNumOfDefinedInterfaces(conn);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2009-11-20 15:22:42 +00:00
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (c_retval) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(names, c_retval) < 0)
|
2009-11-20 15:22:42 +00:00
|
|
|
return VIR_PY_NONE;
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2009-11-20 15:22:42 +00:00
|
|
|
c_retval = virConnectListDefinedInterfaces(conn, names, c_retval);
|
2009-11-25 12:04:47 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2009-11-20 15:22:42 +00:00
|
|
|
if (c_retval < 0) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2009-11-20 15:22:42 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
py_retval = PyList_New(c_retval);
|
|
|
|
if (py_retval == NULL) {
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++)
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
|
|
|
VIR_FREE(names);
|
2009-11-20 15:22:42 +00:00
|
|
|
}
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (names) {
|
2013-05-24 16:58:25 +00:00
|
|
|
for (i = 0; i < c_retval; i++) {
|
2009-11-20 15:22:42 +00:00
|
|
|
PyList_SetItem(py_retval, i, libvirt_constcharPtrWrap(names[i]));
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names[i]);
|
2009-11-20 15:22:42 +00:00
|
|
|
}
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(names);
|
2009-11-20 15:22:42 +00:00
|
|
|
}
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2009-11-20 15:22:42 +00:00
|
|
|
}
|
|
|
|
|
2010-01-22 13:52:41 +00:00
|
|
|
|
2012-09-04 16:10:19 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectListAllInterfaces(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
PyObject *tmp = NULL;
|
|
|
|
virConnectPtr conn;
|
|
|
|
virInterfacePtr *ifaces = NULL;
|
|
|
|
int c_retval = 0;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-09-04 16:10:19 +00:00
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virConnectListAllInterfaces",
|
|
|
|
&pyobj_conn, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virConnectListAllInterfaces(conn, &ifaces, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!(py_retval = PyList_New(c_retval)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < c_retval; i++) {
|
|
|
|
if (!(tmp = libvirt_virInterfacePtrWrap(ifaces[i])) ||
|
|
|
|
PyList_SetItem(py_retval, i, tmp) < 0) {
|
|
|
|
Py_XDECREF(tmp);
|
|
|
|
Py_DECREF(py_retval);
|
|
|
|
py_retval = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
/* python steals the pointer */
|
|
|
|
ifaces[i] = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
for (i = 0; i < c_retval; i++)
|
|
|
|
if (ifaces[i])
|
|
|
|
virInterfaceFree(ifaces[i]);
|
|
|
|
VIR_FREE(ifaces);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2010-01-22 13:52:41 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectBaselineCPU(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *list;
|
|
|
|
virConnectPtr conn;
|
|
|
|
unsigned int flags;
|
|
|
|
const char **xmlcpus = NULL;
|
|
|
|
int ncpus = 0;
|
|
|
|
char *base_cpu;
|
|
|
|
PyObject *pybase_cpu;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OOi:virConnectBaselineCPU",
|
|
|
|
&pyobj_conn, &list, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-01-22 13:52:41 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
if (PyList_Check(list)) {
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2010-01-22 13:52:41 +00:00
|
|
|
|
|
|
|
ncpus = PyList_Size(list);
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(xmlcpus, ncpus) < 0)
|
2010-01-22 13:52:41 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
for (i = 0; i < ncpus; i++) {
|
|
|
|
xmlcpus[i] = PyString_AsString(PyList_GetItem(list, i));
|
2010-02-16 07:07:38 +00:00
|
|
|
if (xmlcpus[i] == NULL) {
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(xmlcpus);
|
2010-01-22 13:52:41 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
2010-02-16 07:07:38 +00:00
|
|
|
}
|
2010-01-22 13:52:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
base_cpu = virConnectBaselineCPU(conn, xmlcpus, ncpus, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(xmlcpus);
|
2010-01-22 13:52:41 +00:00
|
|
|
|
|
|
|
if (base_cpu == NULL)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
pybase_cpu = PyString_FromString(base_cpu);
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(base_cpu);
|
2010-01-22 13:52:41 +00:00
|
|
|
|
|
|
|
if (pybase_cpu == NULL)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
return pybase_cpu;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-02-03 11:31:45 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetJobInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
virDomainJobInfo info;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetJobInfo", &pyobj_domain))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-02-03 11:31:45 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainGetJobInfo(domain, &info);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
py_retval = PyList_New(12);
|
|
|
|
PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.type));
|
|
|
|
PyList_SetItem(py_retval, 1, libvirt_ulonglongWrap(info.timeElapsed));
|
|
|
|
PyList_SetItem(py_retval, 2, libvirt_ulonglongWrap(info.timeRemaining));
|
|
|
|
PyList_SetItem(py_retval, 3, libvirt_ulonglongWrap(info.dataTotal));
|
|
|
|
PyList_SetItem(py_retval, 4, libvirt_ulonglongWrap(info.dataProcessed));
|
|
|
|
PyList_SetItem(py_retval, 5, libvirt_ulonglongWrap(info.dataRemaining));
|
|
|
|
PyList_SetItem(py_retval, 6, libvirt_ulonglongWrap(info.memTotal));
|
|
|
|
PyList_SetItem(py_retval, 7, libvirt_ulonglongWrap(info.memProcessed));
|
|
|
|
PyList_SetItem(py_retval, 8, libvirt_ulonglongWrap(info.memRemaining));
|
|
|
|
PyList_SetItem(py_retval, 9, libvirt_ulonglongWrap(info.fileTotal));
|
|
|
|
PyList_SetItem(py_retval, 10, libvirt_ulonglongWrap(info.fileProcessed));
|
|
|
|
PyList_SetItem(py_retval, 11, libvirt_ulonglongWrap(info.fileRemaining));
|
|
|
|
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2010-02-03 11:31:45 +00:00
|
|
|
}
|
|
|
|
|
2013-02-18 22:20:08 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetJobStats(PyObject *self ATTRIBUTE_UNUSED, PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
virDomainPtr domain;
|
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params = NULL;
|
|
|
|
int nparams = 0;
|
|
|
|
int type;
|
|
|
|
PyObject *dict = NULL;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *) "Oi:virDomainGetJobStats",
|
|
|
|
&pyobj_domain, &flags))
|
|
|
|
goto cleanup;
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
rc = virDomainGetJobStats(domain, &type, ¶ms, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
if (rc < 0)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (!(dict = getPyVirTypedParameter(params, nparams)))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (PyDict_SetItem(dict, libvirt_constcharPtrWrap("type"),
|
|
|
|
libvirt_intWrap(type)) < 0) {
|
|
|
|
Py_DECREF(dict);
|
|
|
|
dict = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
virTypedParamsFree(params, nparams);
|
|
|
|
if (dict)
|
|
|
|
return dict;
|
|
|
|
else
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
|
2011-07-22 05:43:53 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetBlockJobInfo(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
const char *path;
|
|
|
|
unsigned int flags;
|
|
|
|
virDomainBlockJobInfo info;
|
|
|
|
int c_ret;
|
2013-05-17 06:30:10 +00:00
|
|
|
PyObject *type = NULL, *bandwidth = NULL, *cur = NULL, *end = NULL;
|
|
|
|
PyObject *dict;
|
2011-07-22 05:43:53 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainGetBlockJobInfo",
|
|
|
|
&pyobj_domain, &path, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2011-07-22 05:43:53 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2013-05-17 06:30:10 +00:00
|
|
|
if ((dict = PyDict_New()) == NULL)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2011-07-22 05:43:53 +00:00
|
|
|
c_ret = virDomainGetBlockJobInfo(domain, path, &info, flags);
|
2013-05-17 06:30:10 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
2011-07-22 05:43:53 +00:00
|
|
|
|
2013-05-17 06:30:10 +00:00
|
|
|
if (c_ret == 0) {
|
|
|
|
return dict;
|
|
|
|
} else if (c_ret < 0) {
|
|
|
|
Py_DECREF(dict);
|
2011-07-22 05:43:53 +00:00
|
|
|
return VIR_PY_NONE;
|
2013-05-17 06:30:10 +00:00
|
|
|
}
|
2011-07-22 05:43:53 +00:00
|
|
|
|
2013-05-17 06:30:10 +00:00
|
|
|
if ((type = libvirt_intWrap(info.type)) == NULL ||
|
|
|
|
PyDict_SetItemString(dict, "type", type) < 0)
|
|
|
|
goto error;
|
|
|
|
Py_DECREF(type);
|
2011-07-22 05:43:53 +00:00
|
|
|
|
2013-05-17 06:30:10 +00:00
|
|
|
if ((bandwidth = libvirt_ulongWrap(info.bandwidth)) == NULL ||
|
|
|
|
PyDict_SetItemString(dict, "bandwidth", bandwidth) < 0)
|
|
|
|
goto error;
|
|
|
|
Py_DECREF(bandwidth);
|
2011-07-22 05:43:53 +00:00
|
|
|
|
2013-05-17 06:30:10 +00:00
|
|
|
if ((cur = libvirt_ulonglongWrap(info.cur)) == NULL ||
|
|
|
|
PyDict_SetItemString(dict, "cur", cur) < 0)
|
|
|
|
goto error;
|
|
|
|
Py_DECREF(cur);
|
|
|
|
|
|
|
|
if ((end = libvirt_ulonglongWrap(info.end)) == NULL ||
|
|
|
|
PyDict_SetItemString(dict, "end", end) < 0)
|
|
|
|
goto error;
|
|
|
|
Py_DECREF(end);
|
|
|
|
|
|
|
|
return dict;
|
|
|
|
|
|
|
|
error:
|
|
|
|
Py_DECREF(dict);
|
|
|
|
Py_XDECREF(type);
|
|
|
|
Py_XDECREF(bandwidth);
|
|
|
|
Py_XDECREF(cur);
|
|
|
|
Py_XDECREF(end);
|
|
|
|
return NULL;
|
2011-07-22 05:43:53 +00:00
|
|
|
}
|
2010-02-03 11:31:45 +00:00
|
|
|
|
2011-11-15 09:02:49 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSetBlockIoTune(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *pyobj_domain, *info;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
int i_retval;
|
|
|
|
int nparams = 0;
|
|
|
|
Py_ssize_t size = 0;
|
2011-11-15 09:02:49 +00:00
|
|
|
const char *disk;
|
|
|
|
unsigned int flags;
|
2013-01-15 23:44:29 +00:00
|
|
|
virTypedParameterPtr params, new_params = NULL;
|
2011-11-15 09:02:49 +00:00
|
|
|
|
2011-12-29 05:22:52 +00:00
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OzOi:virDomainSetBlockIoTune",
|
2012-02-10 10:17:26 +00:00
|
|
|
&pyobj_domain, &disk, &info, &flags))
|
|
|
|
return NULL;
|
2011-11-15 09:02:49 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if ((size = PyDict_Size(info)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (size == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Need non-empty dictionary to set attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2011-11-15 09:02:49 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
i_retval = virDomainGetBlockIoTune(domain, disk, NULL, &nparams, flags);
|
2011-11-15 09:02:49 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (i_retval < 0)
|
2011-11-15 09:02:49 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (nparams == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Domain has no settable attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-11-15 09:02:49 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
i_retval = virDomainGetBlockIoTune(domain, disk, params, &nparams, flags);
|
2011-11-15 09:02:49 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2011-11-15 09:02:49 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
new_params = setPyVirTypedParameter(info, params, nparams);
|
|
|
|
if (!new_params)
|
|
|
|
goto cleanup;
|
2011-11-15 09:02:49 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
i_retval = virDomainSetBlockIoTune(domain, disk, new_params, size, flags);
|
2011-11-15 09:02:49 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
2011-11-15 09:02:49 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
VIR_FREE(new_params);
|
|
|
|
return ret;
|
2011-11-15 09:02:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetBlockIoTune(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virDomainPtr domain;
|
2012-02-10 10:17:26 +00:00
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
int i_retval;
|
|
|
|
int nparams = 0;
|
2011-11-15 09:02:49 +00:00
|
|
|
const char *disk;
|
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
|
2011-12-29 05:22:52 +00:00
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainGetBlockIoTune",
|
2011-11-15 09:02:49 +00:00
|
|
|
&pyobj_domain, &disk, &flags))
|
2012-02-10 10:17:26 +00:00
|
|
|
return NULL;
|
2011-11-15 09:02:49 +00:00
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
i_retval = virDomainGetBlockIoTune(domain, disk, NULL, &nparams, flags);
|
2011-11-15 09:02:49 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (i_retval < 0)
|
2011-11-15 09:02:49 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (!nparams)
|
|
|
|
return PyDict_New();
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-02-10 10:17:26 +00:00
|
|
|
return PyErr_NoMemory();
|
2011-11-15 09:02:49 +00:00
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-10 10:17:26 +00:00
|
|
|
i_retval = virDomainGetBlockIoTune(domain, disk, params, &nparams, flags);
|
2011-11-15 09:02:49 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_NONE;
|
|
|
|
goto cleanup;
|
2011-11-15 09:02:49 +00:00
|
|
|
}
|
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
ret = getPyVirTypedParameter(params, nparams);
|
2011-11-15 09:02:49 +00:00
|
|
|
|
2012-02-10 10:17:26 +00:00
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-02-10 10:17:26 +00:00
|
|
|
return ret;
|
2011-11-15 09:02:49 +00:00
|
|
|
}
|
|
|
|
|
2012-01-31 06:34:51 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainGetDiskErrors(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval = VIR_PY_NONE;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
unsigned int flags;
|
|
|
|
virDomainDiskErrorPtr disks = NULL;
|
|
|
|
unsigned int ndisks;
|
|
|
|
int count;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-01-31 06:34:51 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *) "Oi:virDomainGetDiskErrors",
|
|
|
|
&pyobj_domain, &flags))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
if ((count = virDomainGetDiskErrors(domain, NULL, 0, 0)) < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
ndisks = count;
|
|
|
|
|
|
|
|
if (ndisks) {
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(disks, ndisks) < 0)
|
2012-01-31 06:34:51 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
count = virDomainGetDiskErrors(domain, disks, ndisks, 0);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (count < 0)
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(py_retval = PyDict_New()))
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
for (i = 0; i < count; i++) {
|
|
|
|
PyDict_SetItem(py_retval,
|
|
|
|
libvirt_constcharPtrWrap(disks[i].disk),
|
|
|
|
libvirt_intWrap(disks[i].error));
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
if (disks) {
|
|
|
|
for (i = 0; i < count; i++)
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(disks[i].disk);
|
|
|
|
VIR_FREE(disks);
|
2012-01-31 06:34:51 +00:00
|
|
|
}
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
/*******************************************
|
|
|
|
* Helper functions to avoid importing modules
|
|
|
|
* for every callback
|
|
|
|
*******************************************/
|
|
|
|
static PyObject *libvirt_module = NULL;
|
|
|
|
static PyObject *libvirt_dict = NULL;
|
|
|
|
static PyObject *libvirt_dom_class = NULL;
|
2008-02-20 15:26:22 +00:00
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
static PyObject *
|
2012-10-17 09:23:12 +00:00
|
|
|
getLibvirtModuleObject(void) {
|
2012-10-25 17:36:43 +00:00
|
|
|
if (libvirt_module)
|
2008-10-31 10:13:45 +00:00
|
|
|
return libvirt_module;
|
|
|
|
|
|
|
|
// PyImport_ImportModule returns a new reference
|
2008-11-25 10:44:52 +00:00
|
|
|
/* Bogus (char *) cast for RHEL-5 python API brokenness */
|
|
|
|
libvirt_module = PyImport_ImportModule((char *)"libvirt");
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!libvirt_module) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s Error importing libvirt module\n", __FUNCTION__);
|
2008-10-31 10:13:45 +00:00
|
|
|
PyErr_Print();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return libvirt_module;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
2012-10-17 09:23:12 +00:00
|
|
|
getLibvirtDictObject(void) {
|
2012-10-25 17:36:43 +00:00
|
|
|
if (libvirt_dict)
|
2008-10-31 10:13:45 +00:00
|
|
|
return libvirt_dict;
|
|
|
|
|
|
|
|
// PyModule_GetDict returns a borrowed reference
|
|
|
|
libvirt_dict = PyModule_GetDict(getLibvirtModuleObject());
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!libvirt_dict) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s Error importing libvirt dictionary\n", __FUNCTION__);
|
2008-10-31 10:13:45 +00:00
|
|
|
PyErr_Print();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_INCREF(libvirt_dict);
|
|
|
|
return libvirt_dict;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
2012-10-17 09:23:12 +00:00
|
|
|
getLibvirtDomainClassObject(void) {
|
2012-10-25 17:36:43 +00:00
|
|
|
if (libvirt_dom_class)
|
2008-10-31 10:13:45 +00:00
|
|
|
return libvirt_dom_class;
|
|
|
|
|
|
|
|
// PyDict_GetItemString returns a borrowed reference
|
|
|
|
libvirt_dom_class = PyDict_GetItemString(getLibvirtDictObject(),
|
|
|
|
"virDomain");
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!libvirt_dom_class) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s Error importing virDomain class\n", __FUNCTION__);
|
2008-10-31 10:13:45 +00:00
|
|
|
PyErr_Print();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_INCREF(libvirt_dom_class);
|
|
|
|
return libvirt_dom_class;
|
|
|
|
}
|
2011-06-15 23:35:44 +00:00
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_lookupPythonFunc(const char *funcname)
|
|
|
|
{
|
|
|
|
PyObject *python_cb;
|
|
|
|
|
|
|
|
/* Lookup the python callback */
|
|
|
|
python_cb = PyDict_GetItemString(getLibvirtDictObject(), funcname);
|
|
|
|
|
|
|
|
if (!python_cb) {
|
|
|
|
DEBUG("%s: Error finding %s\n", __FUNCTION__, funcname);
|
|
|
|
PyErr_Print();
|
|
|
|
PyErr_Clear();
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!PyCallable_Check(python_cb)) {
|
|
|
|
DEBUG("%s: %s is not callable\n", __FUNCTION__, funcname);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return python_cb;
|
|
|
|
}
|
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
/*******************************************
|
|
|
|
* Domain Events
|
|
|
|
*******************************************/
|
|
|
|
|
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
int event,
|
2008-11-17 16:43:00 +00:00
|
|
|
int detail,
|
2008-10-31 10:13:45 +00:00
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
|
|
|
|
PyObject *pyobj_conn_inst = (PyObject*)opaque;
|
2008-11-17 10:26:09 +00:00
|
|
|
PyObject *pyobj_dom;
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
PyObject *pyobj_dom_args;
|
|
|
|
PyObject *pyobj_dom_inst;
|
|
|
|
|
|
|
|
PyObject *dom_class;
|
2008-11-17 10:26:09 +00:00
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
2009-05-28 11:02:11 +00:00
|
|
|
virDomainRef(dom);
|
2008-11-17 10:26:09 +00:00
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
2008-10-31 10:13:45 +00:00
|
|
|
pyobj_dom_args = PyTuple_New(2);
|
2012-10-25 17:36:43 +00:00
|
|
|
if (PyTuple_SetItem(pyobj_dom_args, 0, pyobj_conn_inst)!=0) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s error creating tuple",__FUNCTION__);
|
2008-11-17 10:26:09 +00:00
|
|
|
goto cleanup;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
2012-10-25 17:36:43 +00:00
|
|
|
if (PyTuple_SetItem(pyobj_dom_args, 1, pyobj_dom)!=0) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s error creating tuple",__FUNCTION__);
|
2008-11-17 10:26:09 +00:00
|
|
|
goto cleanup;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
Py_INCREF(pyobj_conn_inst);
|
|
|
|
|
|
|
|
dom_class = getLibvirtDomainClassObject();
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!PyClass_Check(dom_class)) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s dom_class is not a class!\n", __FUNCTION__);
|
2008-11-17 10:26:09 +00:00
|
|
|
goto cleanup;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pyobj_dom_inst = PyInstance_New(dom_class,
|
|
|
|
pyobj_dom_args,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_dom_args);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_dom_inst) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s Error creating a python instance of virDomain\n",
|
|
|
|
__FUNCTION__);
|
2008-10-31 10:13:45 +00:00
|
|
|
PyErr_Print();
|
2008-11-17 10:26:09 +00:00
|
|
|
goto cleanup;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn_inst,
|
2011-06-16 00:14:45 +00:00
|
|
|
(char*)"_dispatchDomainEventCallbacks",
|
2008-11-17 16:43:00 +00:00
|
|
|
(char*)"Oii",
|
2008-10-31 10:13:45 +00:00
|
|
|
pyobj_dom_inst,
|
2008-11-17 16:43:00 +00:00
|
|
|
event,
|
|
|
|
detail);
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
Py_DECREF(pyobj_dom_inst);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
2008-10-31 10:13:45 +00:00
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
2008-11-17 10:26:09 +00:00
|
|
|
ret = 0;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
|
|
|
|
cleanup:
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
2009-09-03 12:09:49 +00:00
|
|
|
return ret;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,
|
|
|
|
PyObject * args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval; /* return value */
|
|
|
|
PyObject *pyobj_conn; /* virConnectPtr */
|
|
|
|
PyObject *pyobj_conn_inst; /* virConnect Python object */
|
|
|
|
|
|
|
|
virConnectPtr conn;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple
|
|
|
|
(args, (char *) "OO:virConnectDomainEventRegister",
|
|
|
|
&pyobj_conn, &pyobj_conn_inst)) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s failed parsing tuple\n", __FUNCTION__);
|
2008-10-31 10:13:45 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
2008-11-17 10:26:09 +00:00
|
|
|
}
|
2008-10-31 10:13:45 +00:00
|
|
|
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("libvirt_virConnectDomainEventRegister(%p %p) called\n",
|
|
|
|
pyobj_conn, pyobj_conn_inst);
|
2008-10-31 10:13:45 +00:00
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_conn_inst);
|
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
ret = virConnectDomainEventRegister(conn,
|
|
|
|
libvirt_virConnectDomainEventCallback,
|
2008-11-19 15:25:24 +00:00
|
|
|
(void *)pyobj_conn_inst, NULL);
|
2008-10-31 10:13:45 +00:00
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
py_retval = libvirt_intWrap(ret);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectDomainEventDeregister(ATTRIBUTE_UNUSED PyObject * self,
|
|
|
|
PyObject * args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *pyobj_conn_inst;
|
|
|
|
|
|
|
|
virConnectPtr conn;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple
|
|
|
|
(args, (char *) "OO:virConnectDomainEventDeregister",
|
|
|
|
&pyobj_conn, &pyobj_conn_inst))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2008-10-31 10:13:45 +00:00
|
|
|
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("libvirt_virConnectDomainEventDeregister(%p) called\n", pyobj_conn);
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
ret = virConnectDomainEventDeregister(conn, libvirt_virConnectDomainEventCallback);
|
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
Py_DECREF(pyobj_conn_inst);
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*******************************************
|
|
|
|
* Event Impl
|
|
|
|
*******************************************/
|
|
|
|
static PyObject *addHandleObj = NULL;
|
2008-11-24 19:28:12 +00:00
|
|
|
static char *addHandleName = NULL;
|
2008-10-31 10:13:45 +00:00
|
|
|
static PyObject *updateHandleObj = NULL;
|
2008-11-24 19:28:12 +00:00
|
|
|
static char *updateHandleName = NULL;
|
2008-10-31 10:13:45 +00:00
|
|
|
static PyObject *removeHandleObj = NULL;
|
2008-11-24 19:28:12 +00:00
|
|
|
static char *removeHandleName = NULL;
|
2008-10-31 10:13:45 +00:00
|
|
|
static PyObject *addTimeoutObj = NULL;
|
2008-11-24 19:28:12 +00:00
|
|
|
static char *addTimeoutName = NULL;
|
2008-10-31 10:13:45 +00:00
|
|
|
static PyObject *updateTimeoutObj = NULL;
|
2008-11-24 19:28:12 +00:00
|
|
|
static char *updateTimeoutName = NULL;
|
2008-10-31 10:13:45 +00:00
|
|
|
static PyObject *removeTimeoutObj = NULL;
|
2008-11-24 19:28:12 +00:00
|
|
|
static char *removeTimeoutName = NULL;
|
2008-10-31 10:13:45 +00:00
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
#define NAME(fn) ( fn ## Name ? fn ## Name : # fn )
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
static int
|
2008-11-19 16:24:01 +00:00
|
|
|
libvirt_virEventAddHandleFunc (int fd,
|
|
|
|
int event,
|
|
|
|
virEventHandleCallback cb,
|
|
|
|
void *opaque,
|
|
|
|
virFreeCallback ff)
|
2008-10-31 10:13:45 +00:00
|
|
|
{
|
2008-11-24 19:28:12 +00:00
|
|
|
PyObject *result;
|
2008-10-31 10:13:45 +00:00
|
|
|
PyObject *python_cb;
|
|
|
|
PyObject *cb_obj;
|
2008-11-19 16:24:01 +00:00
|
|
|
PyObject *ff_obj;
|
2008-10-31 10:13:45 +00:00
|
|
|
PyObject *opaque_obj;
|
|
|
|
PyObject *cb_args;
|
|
|
|
PyObject *pyobj_args;
|
2008-11-24 19:28:12 +00:00
|
|
|
int retval = -1;
|
2008-10-31 10:13:45 +00:00
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
/* Lookup the python callback */
|
2011-06-16 00:14:45 +00:00
|
|
|
python_cb = libvirt_lookupPythonFunc("_eventInvokeHandleCallback");
|
2011-06-15 23:35:44 +00:00
|
|
|
if (!python_cb) {
|
2008-11-17 10:26:09 +00:00
|
|
|
goto cleanup;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
Py_INCREF(python_cb);
|
|
|
|
|
|
|
|
/* create tuple for cb */
|
|
|
|
cb_obj = libvirt_virEventHandleCallbackWrap(cb);
|
2008-11-19 16:24:01 +00:00
|
|
|
ff_obj = libvirt_virFreeCallbackWrap(ff);
|
2008-10-31 10:13:45 +00:00
|
|
|
opaque_obj = libvirt_virVoidPtrWrap(opaque);
|
|
|
|
|
2008-11-19 16:24:01 +00:00
|
|
|
cb_args = PyTuple_New(3);
|
2008-10-31 10:13:45 +00:00
|
|
|
PyTuple_SetItem(cb_args, 0, cb_obj);
|
|
|
|
PyTuple_SetItem(cb_args, 1, opaque_obj);
|
2008-11-19 16:24:01 +00:00
|
|
|
PyTuple_SetItem(cb_args, 2, ff_obj);
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
pyobj_args = PyTuple_New(4);
|
|
|
|
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd));
|
|
|
|
PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event));
|
|
|
|
PyTuple_SetItem(pyobj_args, 2, python_cb);
|
|
|
|
PyTuple_SetItem(pyobj_args, 3, cb_args);
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
result = PyEval_CallObject(addHandleObj, pyobj_args);
|
|
|
|
if (!result) {
|
|
|
|
PyErr_Print();
|
|
|
|
PyErr_Clear();
|
|
|
|
} else if (!PyInt_Check(result)) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s: %s should return an int\n", __FUNCTION__, NAME(addHandle));
|
2008-11-24 19:28:12 +00:00
|
|
|
} else {
|
|
|
|
retval = (int)PyInt_AsLong(result);
|
|
|
|
}
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
Py_XDECREF(result);
|
|
|
|
Py_DECREF(pyobj_args);
|
2008-11-17 10:26:09 +00:00
|
|
|
|
|
|
|
cleanup:
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
return retval;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2008-11-24 19:28:12 +00:00
|
|
|
libvirt_virEventUpdateHandleFunc(int watch, int event)
|
2008-10-31 10:13:45 +00:00
|
|
|
{
|
2008-11-24 19:28:12 +00:00
|
|
|
PyObject *result;
|
2008-11-17 10:26:09 +00:00
|
|
|
PyObject *pyobj_args;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
pyobj_args = PyTuple_New(2);
|
2008-11-24 19:28:12 +00:00
|
|
|
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch));
|
2008-10-31 10:13:45 +00:00
|
|
|
PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event));
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
result = PyEval_CallObject(updateHandleObj, pyobj_args);
|
|
|
|
if (!result) {
|
|
|
|
PyErr_Print();
|
|
|
|
PyErr_Clear();
|
|
|
|
}
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
Py_XDECREF(result);
|
|
|
|
Py_DECREF(pyobj_args);
|
2008-11-17 10:26:09 +00:00
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
static int
|
2008-11-24 19:28:12 +00:00
|
|
|
libvirt_virEventRemoveHandleFunc(int watch)
|
2008-10-31 10:13:45 +00:00
|
|
|
{
|
2008-11-24 19:28:12 +00:00
|
|
|
PyObject *result;
|
2008-11-17 10:26:09 +00:00
|
|
|
PyObject *pyobj_args;
|
2008-11-24 19:28:12 +00:00
|
|
|
PyObject *opaque;
|
|
|
|
PyObject *ff;
|
|
|
|
int retval = -1;
|
|
|
|
virFreeCallback cff;
|
2008-11-17 10:26:09 +00:00
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
pyobj_args = PyTuple_New(1);
|
2008-11-24 19:28:12 +00:00
|
|
|
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch));
|
2008-10-31 10:13:45 +00:00
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
result = PyEval_CallObject(removeHandleObj, pyobj_args);
|
|
|
|
if (!result) {
|
|
|
|
PyErr_Print();
|
|
|
|
PyErr_Clear();
|
|
|
|
} else if (!PyTuple_Check(result) || PyTuple_Size(result) != 3) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s: %s must return opaque obj registered with %s"
|
|
|
|
"to avoid leaking libvirt memory\n",
|
|
|
|
__FUNCTION__, NAME(removeHandle), NAME(addHandle));
|
2008-11-24 19:28:12 +00:00
|
|
|
} else {
|
|
|
|
opaque = PyTuple_GetItem(result, 1);
|
|
|
|
ff = PyTuple_GetItem(result, 2);
|
|
|
|
cff = PyvirFreeCallback_Get(ff);
|
|
|
|
if (cff)
|
|
|
|
(*cff)(PyvirVoidPtr_Get(opaque));
|
|
|
|
retval = 0;
|
|
|
|
}
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
Py_XDECREF(result);
|
|
|
|
Py_DECREF(pyobj_args);
|
2008-11-17 10:26:09 +00:00
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
return retval;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
2011-06-15 23:35:44 +00:00
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
static int
|
2008-11-19 16:24:01 +00:00
|
|
|
libvirt_virEventAddTimeoutFunc(int timeout,
|
|
|
|
virEventTimeoutCallback cb,
|
|
|
|
void *opaque,
|
|
|
|
virFreeCallback ff)
|
2008-10-31 10:13:45 +00:00
|
|
|
{
|
2008-11-24 19:28:12 +00:00
|
|
|
PyObject *result;
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
PyObject *python_cb;
|
|
|
|
|
|
|
|
PyObject *cb_obj;
|
2008-11-19 16:24:01 +00:00
|
|
|
PyObject *ff_obj;
|
2008-10-31 10:13:45 +00:00
|
|
|
PyObject *opaque_obj;
|
|
|
|
PyObject *cb_args;
|
|
|
|
PyObject *pyobj_args;
|
2008-11-24 19:28:12 +00:00
|
|
|
int retval = -1;
|
2008-10-31 10:13:45 +00:00
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
/* Lookup the python callback */
|
2011-06-16 00:14:45 +00:00
|
|
|
python_cb = libvirt_lookupPythonFunc("_eventInvokeTimeoutCallback");
|
2011-06-15 23:35:44 +00:00
|
|
|
if (!python_cb) {
|
2008-11-17 10:26:09 +00:00
|
|
|
goto cleanup;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
Py_INCREF(python_cb);
|
|
|
|
|
|
|
|
/* create tuple for cb */
|
|
|
|
cb_obj = libvirt_virEventTimeoutCallbackWrap(cb);
|
2008-11-19 16:24:01 +00:00
|
|
|
ff_obj = libvirt_virFreeCallbackWrap(ff);
|
2008-10-31 10:13:45 +00:00
|
|
|
opaque_obj = libvirt_virVoidPtrWrap(opaque);
|
|
|
|
|
2008-11-19 16:24:01 +00:00
|
|
|
cb_args = PyTuple_New(3);
|
2008-10-31 10:13:45 +00:00
|
|
|
PyTuple_SetItem(cb_args, 0, cb_obj);
|
|
|
|
PyTuple_SetItem(cb_args, 1, opaque_obj);
|
2008-11-19 16:24:01 +00:00
|
|
|
PyTuple_SetItem(cb_args, 2, ff_obj);
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
pyobj_args = PyTuple_New(3);
|
|
|
|
|
|
|
|
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timeout));
|
|
|
|
PyTuple_SetItem(pyobj_args, 1, python_cb);
|
|
|
|
PyTuple_SetItem(pyobj_args, 2, cb_args);
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
result = PyEval_CallObject(addTimeoutObj, pyobj_args);
|
|
|
|
if (!result) {
|
|
|
|
PyErr_Print();
|
|
|
|
PyErr_Clear();
|
|
|
|
} else if (!PyInt_Check(result)) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s: %s should return an int\n", __FUNCTION__, NAME(addTimeout));
|
2008-11-24 19:28:12 +00:00
|
|
|
} else {
|
|
|
|
retval = (int)PyInt_AsLong(result);
|
|
|
|
}
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
Py_XDECREF(result);
|
|
|
|
Py_DECREF(pyobj_args);
|
2008-11-17 10:26:09 +00:00
|
|
|
|
|
|
|
cleanup:
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
2008-11-24 19:28:12 +00:00
|
|
|
return retval;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
libvirt_virEventUpdateTimeoutFunc(int timer, int timeout)
|
|
|
|
{
|
|
|
|
PyObject *result = NULL;
|
2008-11-17 10:26:09 +00:00
|
|
|
PyObject *pyobj_args;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
pyobj_args = PyTuple_New(2);
|
2008-10-31 10:13:45 +00:00
|
|
|
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
|
|
|
|
PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(timeout));
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
result = PyEval_CallObject(updateTimeoutObj, pyobj_args);
|
|
|
|
if (!result) {
|
|
|
|
PyErr_Print();
|
|
|
|
PyErr_Clear();
|
|
|
|
}
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
Py_XDECREF(result);
|
|
|
|
Py_DECREF(pyobj_args);
|
2008-11-17 10:26:09 +00:00
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
libvirt_virEventRemoveTimeoutFunc(int timer)
|
|
|
|
{
|
|
|
|
PyObject *result = NULL;
|
2008-11-17 10:26:09 +00:00
|
|
|
PyObject *pyobj_args;
|
2008-11-24 19:28:12 +00:00
|
|
|
PyObject *opaque;
|
|
|
|
PyObject *ff;
|
|
|
|
int retval = -1;
|
|
|
|
virFreeCallback cff;
|
2008-11-17 10:26:09 +00:00
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
pyobj_args = PyTuple_New(1);
|
2008-10-31 10:13:45 +00:00
|
|
|
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
result = PyEval_CallObject(removeTimeoutObj, pyobj_args);
|
|
|
|
if (!result) {
|
|
|
|
PyErr_Print();
|
|
|
|
PyErr_Clear();
|
|
|
|
} else if (!PyTuple_Check(result) || PyTuple_Size(result) != 3) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s: %s must return opaque obj registered with %s"
|
|
|
|
"to avoid leaking libvirt memory\n",
|
|
|
|
__FUNCTION__, NAME(removeTimeout), NAME(addTimeout));
|
2008-11-24 19:28:12 +00:00
|
|
|
} else {
|
|
|
|
opaque = PyTuple_GetItem(result, 1);
|
|
|
|
ff = PyTuple_GetItem(result, 2);
|
|
|
|
cff = PyvirFreeCallback_Get(ff);
|
|
|
|
if (cff)
|
|
|
|
(*cff)(PyvirVoidPtr_Get(opaque));
|
|
|
|
retval = 0;
|
|
|
|
}
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
Py_XDECREF(result);
|
|
|
|
Py_DECREF(pyobj_args);
|
2008-11-17 10:26:09 +00:00
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
return retval;
|
2008-10-31 10:13:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virEventRegisterImpl(ATTRIBUTE_UNUSED PyObject * self,
|
|
|
|
PyObject * args)
|
|
|
|
{
|
2008-11-24 19:28:12 +00:00
|
|
|
/* Unref the previously-registered impl (if any) */
|
2008-10-31 10:13:45 +00:00
|
|
|
Py_XDECREF(addHandleObj);
|
|
|
|
Py_XDECREF(updateHandleObj);
|
|
|
|
Py_XDECREF(removeHandleObj);
|
|
|
|
Py_XDECREF(addTimeoutObj);
|
|
|
|
Py_XDECREF(updateTimeoutObj);
|
|
|
|
Py_XDECREF(removeTimeoutObj);
|
2008-11-24 19:28:12 +00:00
|
|
|
|
|
|
|
/* Parse and check arguments */
|
|
|
|
if (!PyArg_ParseTuple(args, (char *) "OOOOOO:virEventRegisterImpl",
|
|
|
|
&addHandleObj, &updateHandleObj,
|
|
|
|
&removeHandleObj, &addTimeoutObj,
|
|
|
|
&updateTimeoutObj, &removeTimeoutObj) ||
|
|
|
|
!PyCallable_Check(addHandleObj) ||
|
|
|
|
!PyCallable_Check(updateHandleObj) ||
|
|
|
|
!PyCallable_Check(removeHandleObj) ||
|
|
|
|
!PyCallable_Check(addTimeoutObj) ||
|
|
|
|
!PyCallable_Check(updateTimeoutObj) ||
|
|
|
|
!PyCallable_Check(removeTimeoutObj))
|
2008-10-31 10:13:45 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
/* Get argument string representations (for error reporting) */
|
2011-05-23 08:51:46 +00:00
|
|
|
addHandleName = py_str(addHandleObj);
|
2008-11-24 19:28:12 +00:00
|
|
|
updateHandleName = py_str(updateHandleObj);
|
|
|
|
removeHandleName = py_str(removeHandleObj);
|
|
|
|
addTimeoutName = py_str(addTimeoutObj);
|
|
|
|
updateTimeoutName = py_str(updateTimeoutObj);
|
|
|
|
removeTimeoutName = py_str(removeTimeoutObj);
|
|
|
|
|
2013-04-19 20:18:14 +00:00
|
|
|
/* Inc refs since we're holding on to these objects until
|
2008-11-24 19:28:12 +00:00
|
|
|
* the next call (if any) to this function.
|
|
|
|
*/
|
2008-10-31 10:13:45 +00:00
|
|
|
Py_INCREF(addHandleObj);
|
|
|
|
Py_INCREF(updateHandleObj);
|
|
|
|
Py_INCREF(removeHandleObj);
|
|
|
|
Py_INCREF(addTimeoutObj);
|
|
|
|
Py_INCREF(updateTimeoutObj);
|
|
|
|
Py_INCREF(removeTimeoutObj);
|
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
2008-11-24 19:28:12 +00:00
|
|
|
/* Now register our C EventImpl, which will dispatch
|
|
|
|
* to the Python callbacks passed in as args.
|
|
|
|
*/
|
2008-10-31 10:13:45 +00:00
|
|
|
virEventRegisterImpl(libvirt_virEventAddHandleFunc,
|
|
|
|
libvirt_virEventUpdateHandleFunc,
|
|
|
|
libvirt_virEventRemoveHandleFunc,
|
|
|
|
libvirt_virEventAddTimeoutFunc,
|
|
|
|
libvirt_virEventUpdateTimeoutFunc,
|
|
|
|
libvirt_virEventRemoveTimeoutFunc);
|
|
|
|
|
2008-11-17 10:26:09 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
2008-10-31 10:13:45 +00:00
|
|
|
return VIR_PY_INT_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virEventInvokeHandleCallback(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
2008-11-19 16:19:36 +00:00
|
|
|
int watch, fd, event;
|
2008-10-31 10:13:45 +00:00
|
|
|
PyObject *py_f;
|
|
|
|
PyObject *py_opaque;
|
|
|
|
virEventHandleCallback cb;
|
|
|
|
void *opaque;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple
|
2008-11-19 16:19:36 +00:00
|
|
|
(args, (char *) "iiiOO:virEventInvokeHandleCallback",
|
|
|
|
&watch, &fd, &event, &py_f, &py_opaque
|
2008-10-31 10:13:45 +00:00
|
|
|
))
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
cb = (virEventHandleCallback) PyvirEventHandleCallback_Get(py_f);
|
|
|
|
opaque = (void *) PyvirVoidPtr_Get(py_opaque);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (cb) {
|
2009-11-03 17:42:16 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-10-17 09:23:12 +00:00
|
|
|
cb(watch, fd, event, opaque);
|
2009-11-03 17:42:16 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
}
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
return VIR_PY_INT_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virEventInvokeTimeoutCallback(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
int timer;
|
|
|
|
PyObject *py_f;
|
|
|
|
PyObject *py_opaque;
|
|
|
|
virEventTimeoutCallback cb;
|
|
|
|
void *opaque;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple
|
|
|
|
(args, (char *) "iOO:virEventInvokeTimeoutCallback",
|
|
|
|
&timer, &py_f, &py_opaque
|
|
|
|
))
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
cb = (virEventTimeoutCallback) PyvirEventTimeoutCallback_Get(py_f);
|
|
|
|
opaque = (void *) PyvirVoidPtr_Get(py_opaque);
|
2012-10-25 17:36:43 +00:00
|
|
|
if (cb) {
|
2009-11-03 17:42:16 +00:00
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-10-17 09:23:12 +00:00
|
|
|
cb(timer, opaque);
|
2009-11-03 17:42:16 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
}
|
2008-10-31 10:13:45 +00:00
|
|
|
|
|
|
|
return VIR_PY_INT_SUCCESS;
|
|
|
|
}
|
2008-02-20 15:26:22 +00:00
|
|
|
|
2011-06-15 23:35:44 +00:00
|
|
|
static void
|
|
|
|
libvirt_virEventHandleCallback(int watch,
|
|
|
|
int fd,
|
|
|
|
int events,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject *)opaque;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *python_cb;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Lookup the python callback */
|
|
|
|
python_cb = libvirt_lookupPythonFunc("_dispatchEventHandleCallback");
|
|
|
|
if (!python_cb) {
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
/* Call the pure python dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallFunction(python_cb,
|
|
|
|
(char *)"iiiO",
|
|
|
|
watch, fd, events, pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
|
|
|
|
if (!pyobj_ret) {
|
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virEventAddHandle(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
PyObject *pyobj_cbData;
|
|
|
|
virEventHandleCallback cb = libvirt_virEventHandleCallback;
|
|
|
|
int events;
|
|
|
|
int fd;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *) "iiO:virEventAddHandle",
|
|
|
|
&fd, &events, &pyobj_cbData)) {
|
|
|
|
DEBUG("%s failed to parse tuple\n", __FUNCTION__);
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virEventAddHandle(fd, events, cb, pyobj_cbData, NULL);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (ret < 0) {
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
}
|
|
|
|
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
libvirt_virEventTimeoutCallback(int timer,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject *)opaque;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *python_cb;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Lookup the python callback */
|
|
|
|
python_cb = libvirt_lookupPythonFunc("_dispatchEventTimeoutCallback");
|
|
|
|
if (!python_cb) {
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
/* Call the pure python dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallFunction(python_cb,
|
|
|
|
(char *)"iO",
|
|
|
|
timer, pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
|
|
|
|
if (!pyobj_ret) {
|
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virEventAddTimeout(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
PyObject *pyobj_cbData;
|
|
|
|
virEventTimeoutCallback cb = libvirt_virEventTimeoutCallback;
|
|
|
|
int timeout;
|
|
|
|
int ret;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *) "iO:virEventAddTimeout",
|
|
|
|
&timeout, &pyobj_cbData)) {
|
|
|
|
DEBUG("%s failed to parse tuple\n", __FUNCTION__);
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virEventAddTimeout(timeout, cb, pyobj_cbData, NULL);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (ret < 0) {
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
}
|
|
|
|
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
|
|
|
return py_retval;
|
|
|
|
}
|
2010-03-26 13:22:06 +00:00
|
|
|
|
|
|
|
static void
|
|
|
|
libvirt_virConnectDomainEventFreeFunc(void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_conn = (PyObject*)opaque;
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
Py_DECREF(pyobj_conn);
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventLifecycleCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
int event,
|
|
|
|
int detail,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
2011-06-16 00:14:45 +00:00
|
|
|
(char*)"_dispatchDomainEventLifecycleCallback",
|
2010-03-26 13:22:06 +00:00
|
|
|
(char*)"OiiO",
|
|
|
|
pyobj_dom,
|
|
|
|
event, detail,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
2010-03-26 13:22:06 +00:00
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventGenericCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
2011-06-16 00:14:45 +00:00
|
|
|
(char*)"_dispatchDomainEventGenericCallback",
|
2010-03-26 13:22:06 +00:00
|
|
|
(char*)"OO",
|
|
|
|
pyobj_dom, pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
2010-03-26 13:22:06 +00:00
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventRTCChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
long long utcoffset,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
2011-06-16 00:14:45 +00:00
|
|
|
(char*)"_dispatchDomainEventRTCChangeCallback",
|
2010-03-26 13:22:06 +00:00
|
|
|
(char*)"OLO",
|
|
|
|
pyobj_dom,
|
|
|
|
(PY_LONG_LONG)utcoffset,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
2010-03-26 13:22:06 +00:00
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventWatchdogCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
int action,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
2011-06-16 00:14:45 +00:00
|
|
|
(char*)"_dispatchDomainEventWatchdogCallback",
|
2010-03-26 13:22:06 +00:00
|
|
|
(char*)"OiO",
|
|
|
|
pyobj_dom,
|
|
|
|
action,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
2010-03-26 13:22:06 +00:00
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventIOErrorCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
const char *srcPath,
|
|
|
|
const char *devAlias,
|
|
|
|
int action,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
2011-06-16 00:14:45 +00:00
|
|
|
(char*)"_dispatchDomainEventIOErrorCallback",
|
2010-03-26 13:22:06 +00:00
|
|
|
(char*)"OssiO",
|
|
|
|
pyobj_dom,
|
|
|
|
srcPath, devAlias, action,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
2010-03-26 13:22:06 +00:00
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
Add support for another explicit IO error event
This introduces a new event type
VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON
This event is the same as the previous VIR_DOMAIN_ID_IO_ERROR
event, but also includes a string describing the cause of
the event.
Thus there is a new callback definition for this event type
typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn,
virDomainPtr dom,
const char *srcPath,
const char *devAlias,
int action,
const char *reason,
void *opaque);
This is currently wired up to the QEMU block IO error events
* daemon/remote.c: Dispatch IO error events to client
* examples/domain-events/events-c/event-test.c: Watch for
IO error events
* include/libvirt/libvirt.h.in: Define new IO error event ID
and callback signature
* src/conf/domain_event.c, src/conf/domain_event.h,
src/libvirt_private.syms: Extend API to handle IO error events
* src/qemu/qemu_driver.c: Connect to the QEMU monitor event
for block IO errors and emit a libvirt IO error event
* src/remote/remote_driver.c: Receive and dispatch IO error
events to application
* src/remote/remote_protocol.x: Wire protocol definition for
IO error events
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
src/qemu/qemu_monitor_json.c: Watch for BLOCK_IO_ERROR event
from QEMU monitor
2010-03-18 19:37:44 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventIOErrorReasonCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
const char *srcPath,
|
|
|
|
const char *devAlias,
|
|
|
|
int action,
|
|
|
|
const char *reason,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
2011-06-16 00:14:45 +00:00
|
|
|
(char*)"_dispatchDomainEventIOErrorReasonCallback",
|
Add support for another explicit IO error event
This introduces a new event type
VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON
This event is the same as the previous VIR_DOMAIN_ID_IO_ERROR
event, but also includes a string describing the cause of
the event.
Thus there is a new callback definition for this event type
typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn,
virDomainPtr dom,
const char *srcPath,
const char *devAlias,
int action,
const char *reason,
void *opaque);
This is currently wired up to the QEMU block IO error events
* daemon/remote.c: Dispatch IO error events to client
* examples/domain-events/events-c/event-test.c: Watch for
IO error events
* include/libvirt/libvirt.h.in: Define new IO error event ID
and callback signature
* src/conf/domain_event.c, src/conf/domain_event.h,
src/libvirt_private.syms: Extend API to handle IO error events
* src/qemu/qemu_driver.c: Connect to the QEMU monitor event
for block IO errors and emit a libvirt IO error event
* src/remote/remote_driver.c: Receive and dispatch IO error
events to application
* src/remote/remote_protocol.x: Wire protocol definition for
IO error events
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
src/qemu/qemu_monitor_json.c: Watch for BLOCK_IO_ERROR event
from QEMU monitor
2010-03-18 19:37:44 +00:00
|
|
|
(char*)"OssisO",
|
|
|
|
pyobj_dom,
|
|
|
|
srcPath, devAlias, action, reason,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
Add support for another explicit IO error event
This introduces a new event type
VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON
This event is the same as the previous VIR_DOMAIN_ID_IO_ERROR
event, but also includes a string describing the cause of
the event.
Thus there is a new callback definition for this event type
typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn,
virDomainPtr dom,
const char *srcPath,
const char *devAlias,
int action,
const char *reason,
void *opaque);
This is currently wired up to the QEMU block IO error events
* daemon/remote.c: Dispatch IO error events to client
* examples/domain-events/events-c/event-test.c: Watch for
IO error events
* include/libvirt/libvirt.h.in: Define new IO error event ID
and callback signature
* src/conf/domain_event.c, src/conf/domain_event.h,
src/libvirt_private.syms: Extend API to handle IO error events
* src/qemu/qemu_driver.c: Connect to the QEMU monitor event
for block IO errors and emit a libvirt IO error event
* src/remote/remote_driver.c: Receive and dispatch IO error
events to application
* src/remote/remote_protocol.x: Wire protocol definition for
IO error events
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
src/qemu/qemu_monitor_json.c: Watch for BLOCK_IO_ERROR event
from QEMU monitor
2010-03-18 19:37:44 +00:00
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2010-03-26 13:22:06 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventGraphicsCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
int phase,
|
|
|
|
virDomainEventGraphicsAddressPtr local,
|
|
|
|
virDomainEventGraphicsAddressPtr remote,
|
|
|
|
const char *authScheme,
|
|
|
|
virDomainEventGraphicsSubjectPtr subject,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
PyObject *pyobj_local;
|
|
|
|
PyObject *pyobj_remote;
|
|
|
|
PyObject *pyobj_subject;
|
|
|
|
int ret = -1;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2010-03-26 13:22:06 +00:00
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
pyobj_local = PyDict_New();
|
|
|
|
PyDict_SetItem(pyobj_local,
|
|
|
|
libvirt_constcharPtrWrap("family"),
|
|
|
|
libvirt_intWrap(local->family));
|
|
|
|
PyDict_SetItem(pyobj_local,
|
|
|
|
libvirt_constcharPtrWrap("node"),
|
|
|
|
libvirt_constcharPtrWrap(local->node));
|
|
|
|
PyDict_SetItem(pyobj_local,
|
|
|
|
libvirt_constcharPtrWrap("service"),
|
|
|
|
libvirt_constcharPtrWrap(local->service));
|
|
|
|
|
|
|
|
pyobj_remote = PyDict_New();
|
|
|
|
PyDict_SetItem(pyobj_remote,
|
|
|
|
libvirt_constcharPtrWrap("family"),
|
|
|
|
libvirt_intWrap(remote->family));
|
|
|
|
PyDict_SetItem(pyobj_remote,
|
|
|
|
libvirt_constcharPtrWrap("node"),
|
|
|
|
libvirt_constcharPtrWrap(remote->node));
|
|
|
|
PyDict_SetItem(pyobj_remote,
|
|
|
|
libvirt_constcharPtrWrap("service"),
|
|
|
|
libvirt_constcharPtrWrap(remote->service));
|
|
|
|
|
|
|
|
pyobj_subject = PyList_New(subject->nidentity);
|
2013-05-21 08:05:06 +00:00
|
|
|
for (i = 0; i < subject->nidentity; i++) {
|
2010-03-26 13:22:06 +00:00
|
|
|
PyObject *pair = PyTuple_New(2);
|
|
|
|
PyTuple_SetItem(pair, 0, libvirt_constcharPtrWrap(subject->identities[i].type));
|
|
|
|
PyTuple_SetItem(pair, 1, libvirt_constcharPtrWrap(subject->identities[i].name));
|
|
|
|
|
|
|
|
PyList_SetItem(pyobj_subject, i, pair);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
2011-06-16 00:14:45 +00:00
|
|
|
(char*)"_dispatchDomainEventGraphicsCallback",
|
2010-03-26 13:22:06 +00:00
|
|
|
(char*)"OiOOsOO",
|
|
|
|
pyobj_dom,
|
|
|
|
phase, pyobj_local, pyobj_remote,
|
|
|
|
authScheme, pyobj_subject,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
2010-03-26 13:22:06 +00:00
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2011-07-22 05:57:42 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventBlockJobCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
const char *path,
|
|
|
|
int type,
|
|
|
|
int status,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
|
|
|
(char*)"dispatchDomainEventBlockPullCallback",
|
|
|
|
(char*)"OsiiO",
|
|
|
|
pyobj_dom, path, type, status, pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-07-22 05:57:42 +00:00
|
|
|
#if DEBUG_ERROR
|
|
|
|
printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
#endif
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2011-10-18 14:15:42 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventDiskChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
const char *oldSrcPath,
|
|
|
|
const char *newSrcPath,
|
|
|
|
const char *devAlias,
|
|
|
|
int reason,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
|
|
|
(char*)"_dispatchDomainEventDiskChangeCallback",
|
|
|
|
(char*)"OsssiO",
|
|
|
|
pyobj_dom,
|
|
|
|
oldSrcPath, newSrcPath,
|
|
|
|
devAlias, reason, pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2011-10-18 14:15:42 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-03-23 13:44:50 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventTrayChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
const char *devAlias,
|
|
|
|
int reason,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
|
|
|
(char*)"_dispatchDomainEventTrayChangeCallback",
|
|
|
|
(char*)"OsiO",
|
|
|
|
pyobj_dom,
|
|
|
|
devAlias, reason, pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2012-03-23 13:44:50 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-03-23 14:43:14 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventPMWakeupCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
int reason,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
|
|
|
(char*)"_dispatchDomainEventPMWakeupCallback",
|
2012-09-06 14:56:08 +00:00
|
|
|
(char*)"OiO",
|
2012-03-23 14:43:14 +00:00
|
|
|
pyobj_dom,
|
|
|
|
reason,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2012-03-23 14:43:14 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-03-23 14:50:36 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventPMSuspendCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
int reason,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
|
|
|
(char*)"_dispatchDomainEventPMSuspendCallback",
|
2012-09-06 14:56:08 +00:00
|
|
|
(char*)"OiO",
|
2012-03-23 14:50:36 +00:00
|
|
|
pyobj_dom,
|
|
|
|
reason,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2012-03-23 14:50:36 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-07-13 09:05:17 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventBalloonChangeCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
unsigned long long actual,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
|
|
|
(char*)"_dispatchDomainEventBalloonChangeCallback",
|
|
|
|
(char*)"OLO",
|
|
|
|
pyobj_dom,
|
|
|
|
(PY_LONG_LONG)actual,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2012-07-13 09:05:17 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-10-12 19:13:39 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventPMSuspendDiskCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
int reason,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
|
|
|
(char*)"_dispatchDomainEventPMSuspendDiskCallback",
|
|
|
|
(char*)"OiO",
|
|
|
|
pyobj_dom,
|
|
|
|
reason,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
2012-10-25 17:36:43 +00:00
|
|
|
if (!pyobj_ret) {
|
2012-10-12 19:13:39 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2013-06-19 13:27:29 +00:00
|
|
|
static int
|
|
|
|
libvirt_virConnectDomainEventDeviceRemovedCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
virDomainPtr dom,
|
|
|
|
const char *devAlias,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
/* Create a python instance of this virDomainPtr */
|
|
|
|
virDomainRef(dom);
|
|
|
|
|
|
|
|
pyobj_dom = libvirt_virDomainPtrWrap(dom);
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
|
|
|
(char*)"_dispatchDomainEventDeviceRemovedCallback",
|
|
|
|
(char*)"OsO",
|
|
|
|
pyobj_dom, devAlias, pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
Py_DECREF(pyobj_dom);
|
|
|
|
|
|
|
|
if (!pyobj_ret) {
|
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
ret = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2010-03-26 13:22:06 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self,
|
|
|
|
PyObject * args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval; /* return value */
|
|
|
|
PyObject *pyobj_conn; /* virConnectPtr */
|
|
|
|
PyObject *pyobj_dom;
|
|
|
|
PyObject *pyobj_cbData; /* hash of callback data */
|
|
|
|
int eventID;
|
|
|
|
virConnectPtr conn;
|
|
|
|
int ret = 0;
|
|
|
|
virConnectDomainEventGenericCallback cb = NULL;
|
|
|
|
virDomainPtr dom;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple
|
|
|
|
(args, (char *) "OOiO:virConnectDomainEventRegisterAny",
|
|
|
|
&pyobj_conn, &pyobj_dom, &eventID, &pyobj_cbData)) {
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("%s failed parsing tuple\n", __FUNCTION__);
|
2010-03-26 13:22:06 +00:00
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("libvirt_virConnectDomainEventRegister(%p %p %d %p) called\n",
|
2010-03-26 13:22:06 +00:00
|
|
|
pyobj_conn, pyobj_dom, eventID, pyobj_cbData);
|
|
|
|
conn = PyvirConnect_Get(pyobj_conn);
|
|
|
|
if (pyobj_dom == Py_None)
|
|
|
|
dom = NULL;
|
|
|
|
else
|
|
|
|
dom = PyvirDomain_Get(pyobj_dom);
|
|
|
|
|
2013-06-19 13:27:29 +00:00
|
|
|
switch ((virDomainEventID) eventID) {
|
2010-03-26 13:22:06 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_LIFECYCLE:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventLifecycleCallback);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_EVENT_ID_REBOOT:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventGenericCallback);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_EVENT_ID_RTC_CHANGE:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventRTCChangeCallback);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_EVENT_ID_WATCHDOG:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventWatchdogCallback);
|
|
|
|
break;
|
|
|
|
case VIR_DOMAIN_EVENT_ID_IO_ERROR:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventIOErrorCallback);
|
|
|
|
break;
|
Add support for another explicit IO error event
This introduces a new event type
VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON
This event is the same as the previous VIR_DOMAIN_ID_IO_ERROR
event, but also includes a string describing the cause of
the event.
Thus there is a new callback definition for this event type
typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn,
virDomainPtr dom,
const char *srcPath,
const char *devAlias,
int action,
const char *reason,
void *opaque);
This is currently wired up to the QEMU block IO error events
* daemon/remote.c: Dispatch IO error events to client
* examples/domain-events/events-c/event-test.c: Watch for
IO error events
* include/libvirt/libvirt.h.in: Define new IO error event ID
and callback signature
* src/conf/domain_event.c, src/conf/domain_event.h,
src/libvirt_private.syms: Extend API to handle IO error events
* src/qemu/qemu_driver.c: Connect to the QEMU monitor event
for block IO errors and emit a libvirt IO error event
* src/remote/remote_driver.c: Receive and dispatch IO error
events to application
* src/remote/remote_protocol.x: Wire protocol definition for
IO error events
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
src/qemu/qemu_monitor_json.c: Watch for BLOCK_IO_ERROR event
from QEMU monitor
2010-03-18 19:37:44 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventIOErrorReasonCallback);
|
|
|
|
break;
|
2010-03-26 13:22:06 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_GRAPHICS:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventGraphicsCallback);
|
|
|
|
break;
|
2011-05-29 12:21:53 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_CONTROL_ERROR:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventGenericCallback);
|
|
|
|
break;
|
2011-07-22 05:57:42 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_BLOCK_JOB:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventBlockJobCallback);
|
|
|
|
break;
|
2011-10-18 14:15:42 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_DISK_CHANGE:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventDiskChangeCallback);
|
|
|
|
break;
|
2012-03-23 13:44:50 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_TRAY_CHANGE:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventTrayChangeCallback);
|
|
|
|
break;
|
2012-03-23 14:43:14 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_PMWAKEUP:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventPMWakeupCallback);
|
|
|
|
break;
|
2012-03-23 14:50:36 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_PMSUSPEND:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventPMSuspendCallback);
|
|
|
|
break;
|
2012-07-13 09:05:17 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_BALLOON_CHANGE:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventBalloonChangeCallback);
|
|
|
|
break;
|
2012-10-12 19:13:39 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_PMSUSPEND_DISK:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventPMSuspendDiskCallback);
|
|
|
|
break;
|
2013-06-19 13:27:29 +00:00
|
|
|
case VIR_DOMAIN_EVENT_ID_DEVICE_REMOVED:
|
|
|
|
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventDeviceRemovedCallback);
|
|
|
|
|
|
|
|
case VIR_DOMAIN_EVENT_ID_LAST:
|
|
|
|
break;
|
2010-03-26 13:22:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!cb) {
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virConnectDomainEventRegisterAny(conn, dom, eventID,
|
|
|
|
cb, pyobj_cbData,
|
|
|
|
libvirt_virConnectDomainEventFreeFunc);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (ret < 0) {
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
}
|
|
|
|
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2010-03-26 13:22:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectDomainEventDeregisterAny(ATTRIBUTE_UNUSED PyObject * self,
|
|
|
|
PyObject * args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
int callbackID;
|
|
|
|
virConnectPtr conn;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple
|
|
|
|
(args, (char *) "Oi:virConnectDomainEventDeregister",
|
|
|
|
&pyobj_conn, &callbackID))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2010-03-26 13:22:06 +00:00
|
|
|
|
2011-06-14 16:59:44 +00:00
|
|
|
DEBUG("libvirt_virConnectDomainEventDeregister(%p) called\n", pyobj_conn);
|
2010-03-26 13:22:06 +00:00
|
|
|
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
|
|
|
ret = virConnectDomainEventDeregisterAny(conn, callbackID);
|
|
|
|
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2010-03-26 13:22:06 +00:00
|
|
|
}
|
|
|
|
|
2012-07-30 16:30:42 +00:00
|
|
|
|
|
|
|
static void
|
|
|
|
libvirt_virConnectCloseCallbackDispatch(virConnectPtr conn ATTRIBUTE_UNUSED,
|
|
|
|
int reason,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject*)opaque;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *dictKey;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
dictKey = libvirt_constcharPtrWrap("conn");
|
|
|
|
pyobj_conn = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the Callback Dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_conn,
|
|
|
|
(char*)"_dispatchCloseCallback",
|
|
|
|
(char*)"iO",
|
|
|
|
reason,
|
|
|
|
pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
|
2012-12-04 15:37:41 +00:00
|
|
|
if (!pyobj_ret) {
|
2012-07-30 16:30:42 +00:00
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectRegisterCloseCallback(ATTRIBUTE_UNUSED PyObject * self,
|
|
|
|
PyObject * args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval; /* return value */
|
|
|
|
PyObject *pyobj_conn; /* virConnectPtr */
|
|
|
|
PyObject *pyobj_cbData; /* hash of callback data */
|
|
|
|
virConnectPtr conn;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple
|
|
|
|
(args, (char *) "OO:virConnectRegisterCloseCallback",
|
|
|
|
&pyobj_conn, &pyobj_cbData)) {
|
|
|
|
DEBUG("%s failed parsing tuple\n", __FUNCTION__);
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEBUG("libvirt_virConnectRegisterCloseCallback(%p %p) called\n",
|
|
|
|
pyobj_conn, pyobj_cbData);
|
|
|
|
conn = PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virConnectRegisterCloseCallback(conn,
|
|
|
|
libvirt_virConnectCloseCallbackDispatch,
|
|
|
|
pyobj_cbData,
|
|
|
|
libvirt_virConnectDomainEventFreeFunc);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (ret < 0) {
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
}
|
|
|
|
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virConnectUnregisterCloseCallback(ATTRIBUTE_UNUSED PyObject * self,
|
|
|
|
PyObject * args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
virConnectPtr conn;
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple
|
|
|
|
(args, (char *) "O:virConnectDomainEventUnregister",
|
|
|
|
&pyobj_conn))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
DEBUG("libvirt_virConnectDomainEventUnregister(%p) called\n",
|
|
|
|
pyobj_conn);
|
|
|
|
|
|
|
|
conn = PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
|
|
|
|
ret = virConnectUnregisterCloseCallback(conn,
|
|
|
|
libvirt_virConnectCloseCallbackDispatch);
|
|
|
|
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2011-06-14 17:49:22 +00:00
|
|
|
static void
|
|
|
|
libvirt_virStreamEventFreeFunc(void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_stream = (PyObject*)opaque;
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
Py_DECREF(pyobj_stream);
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
libvirt_virStreamEventCallback(virStreamPtr st ATTRIBUTE_UNUSED,
|
|
|
|
int events,
|
|
|
|
void *opaque)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_cbData = (PyObject *)opaque;
|
|
|
|
PyObject *pyobj_stream;
|
|
|
|
PyObject *pyobj_ret;
|
|
|
|
PyObject *dictKey;
|
|
|
|
|
|
|
|
LIBVIRT_ENSURE_THREAD_STATE;
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
dictKey = libvirt_constcharPtrWrap("stream");
|
|
|
|
pyobj_stream = PyDict_GetItem(pyobj_cbData, dictKey);
|
|
|
|
Py_DECREF(dictKey);
|
|
|
|
|
|
|
|
/* Call the pure python dispatcher */
|
|
|
|
pyobj_ret = PyObject_CallMethod(pyobj_stream,
|
2011-06-16 00:14:45 +00:00
|
|
|
(char *)"_dispatchStreamEventCallback",
|
2011-06-14 17:49:22 +00:00
|
|
|
(char *)"iO",
|
|
|
|
events, pyobj_cbData);
|
|
|
|
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
|
|
|
|
if (!pyobj_ret) {
|
|
|
|
DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
|
|
|
|
PyErr_Print();
|
|
|
|
} else {
|
|
|
|
Py_DECREF(pyobj_ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_RELEASE_THREAD_STATE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virStreamEventAddCallback(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
PyObject *pyobj_stream;
|
|
|
|
PyObject *pyobj_cbData;
|
|
|
|
virStreamPtr stream;
|
|
|
|
virStreamEventCallback cb = libvirt_virStreamEventCallback;
|
|
|
|
int ret;
|
|
|
|
int events;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *) "OiO:virStreamEventAddCallback",
|
|
|
|
&pyobj_stream, &events, &pyobj_cbData)) {
|
|
|
|
DEBUG("%s failed to parse tuple\n", __FUNCTION__);
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
DEBUG("libvirt_virStreamEventAddCallback(%p, %d, %p) called\n",
|
|
|
|
pyobj_stream, events, pyobj_cbData);
|
|
|
|
stream = PyvirStream_Get(pyobj_stream);
|
|
|
|
|
|
|
|
Py_INCREF(pyobj_cbData);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virStreamEventAddCallback(stream, events, cb, pyobj_cbData,
|
|
|
|
libvirt_virStreamEventFreeFunc);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (ret < 0) {
|
|
|
|
Py_DECREF(pyobj_cbData);
|
|
|
|
}
|
|
|
|
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
|
|
|
return py_retval;
|
|
|
|
}
|
2010-03-26 13:22:06 +00:00
|
|
|
|
2011-06-14 20:07:43 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virStreamRecv(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_stream;
|
|
|
|
virStreamPtr stream;
|
|
|
|
char *buf = NULL;
|
|
|
|
int ret;
|
|
|
|
int nbytes;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *) "Oi:virStreamRecv",
|
|
|
|
&pyobj_stream, &nbytes)) {
|
|
|
|
DEBUG("%s failed to parse tuple\n", __FUNCTION__);
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
}
|
|
|
|
stream = PyvirStream_Get(pyobj_stream);
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(buf, nbytes+1 > 0 ? nbytes+1 : 1) < 0)
|
2011-06-14 20:07:43 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virStreamRecv(stream, buf, nbytes);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
buf[ret > -1 ? ret : 0] = '\0';
|
|
|
|
DEBUG("StreamRecv ret=%d strlen=%d\n", ret, (int) strlen(buf));
|
|
|
|
|
2011-07-26 23:25:43 +00:00
|
|
|
if (ret == -2)
|
2011-06-14 20:07:43 +00:00
|
|
|
return libvirt_intWrap(ret);
|
2011-07-26 23:25:43 +00:00
|
|
|
if (ret < 0)
|
|
|
|
return VIR_PY_NONE;
|
2011-06-14 20:07:43 +00:00
|
|
|
return libvirt_charPtrSizeWrap((char *) buf, (Py_ssize_t) ret);
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virStreamSend(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
PyObject *pyobj_stream;
|
|
|
|
virStreamPtr stream;
|
|
|
|
char *data;
|
2011-07-25 15:44:36 +00:00
|
|
|
int datalen;
|
2011-06-14 20:07:43 +00:00
|
|
|
int ret;
|
|
|
|
int nbytes;
|
|
|
|
|
2011-07-25 15:44:36 +00:00
|
|
|
if (!PyArg_ParseTuple(args, (char *) "Oz#i:virStreamRecv",
|
|
|
|
&pyobj_stream, &data, &datalen, &nbytes)) {
|
2011-06-14 20:07:43 +00:00
|
|
|
DEBUG("%s failed to parse tuple\n", __FUNCTION__);
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
stream = PyvirStream_Get(pyobj_stream);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virStreamSend(stream, data, nbytes);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
DEBUG("StreamSend ret=%d\n", ret);
|
|
|
|
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2011-07-21 09:21:10 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainSendKey(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *py_retval;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *pyobj_list;
|
|
|
|
int codeset;
|
|
|
|
int holdtime;
|
|
|
|
unsigned int flags;
|
|
|
|
int ret;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2011-07-21 09:21:10 +00:00
|
|
|
unsigned int keycodes[VIR_DOMAIN_SEND_KEY_MAX_KEYS];
|
|
|
|
unsigned int nkeycodes;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OiiOii:virDomainSendKey",
|
|
|
|
&pyobj_domain, &codeset, &holdtime, &pyobj_list,
|
|
|
|
&nkeycodes, &flags)) {
|
|
|
|
DEBUG("%s failed to parse tuple\n", __FUNCTION__);
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
if (!PyList_Check(pyobj_list)) {
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nkeycodes != PyList_Size(pyobj_list) ||
|
|
|
|
nkeycodes > VIR_DOMAIN_SEND_KEY_MAX_KEYS) {
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < nkeycodes; i++) {
|
|
|
|
keycodes[i] = (int)PyInt_AsLong(PyList_GetItem(pyobj_list, i));
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virDomainSendKey(domain, codeset, holdtime, keycodes, nkeycodes, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
DEBUG("virDomainSendKey ret=%d\n", ret);
|
|
|
|
|
|
|
|
py_retval = libvirt_intWrap(ret);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2013-02-18 22:20:48 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainMigrateGetCompressionCache(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
virDomainPtr domain;
|
|
|
|
unsigned int flags;
|
|
|
|
unsigned long long cacheSize;
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args,
|
|
|
|
(char *) "Oi:virDomainMigrateGetCompressionCache",
|
|
|
|
&pyobj_domain, &flags))
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
rc = virDomainMigrateGetCompressionCache(domain, &cacheSize, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (rc < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
return libvirt_ulonglongWrap(cacheSize);
|
|
|
|
}
|
|
|
|
|
2011-08-26 18:10:21 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainMigrateGetMaxSpeed(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval;
|
|
|
|
int c_retval;
|
|
|
|
unsigned long bandwidth;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
2012-02-08 09:33:22 +00:00
|
|
|
unsigned int flags = 0;
|
2011-08-26 18:10:21 +00:00
|
|
|
|
2012-02-08 09:33:22 +00:00
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainMigrateGetMaxSpeed",
|
|
|
|
&pyobj_domain, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2011-08-26 18:10:21 +00:00
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
2012-02-08 09:33:22 +00:00
|
|
|
c_retval = virDomainMigrateGetMaxSpeed(domain, &bandwidth, flags);
|
2011-08-26 18:10:21 +00:00
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (c_retval < 0)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
py_retval = libvirt_ulongWrap(bandwidth);
|
2012-03-22 11:33:35 +00:00
|
|
|
return py_retval;
|
2011-08-26 18:10:21 +00:00
|
|
|
}
|
|
|
|
|
2013-06-14 09:20:54 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainMigrate3(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_dconn;
|
|
|
|
virConnectPtr dconn;
|
|
|
|
PyObject *dict;
|
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
int nparams;
|
|
|
|
virDomainPtr ddom = NULL;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *) "OOOi:virDomainMigrate3",
|
|
|
|
&pyobj_domain, &pyobj_dconn, &dict, &flags))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
dconn = (virConnectPtr) PyvirConnect_Get(pyobj_dconn);
|
|
|
|
|
|
|
|
if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ddom = virDomainMigrate3(domain, dconn, params, nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
virTypedParamsFree(params, nparams);
|
|
|
|
return libvirt_virDomainPtrWrap(ddom);
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainMigrateToURI3(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
virDomainPtr domain;
|
|
|
|
char *dconnuri;
|
|
|
|
PyObject *dict;
|
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
int nparams;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *) "OzOi:virDomainMigrate3",
|
|
|
|
&pyobj_domain, &dconnuri, &dict, &flags))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
if (virPyDictToTypedParams(dict, ¶ms, &nparams, NULL, 0) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
ret = virDomainMigrateToURI3(domain, dconnuri, params, nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
virTypedParamsFree(params, nparams);
|
|
|
|
return libvirt_intWrap(ret);
|
|
|
|
}
|
|
|
|
|
2011-12-15 13:01:33 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainBlockPeek(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
int c_retval;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
const char *disk;
|
|
|
|
unsigned long long offset;
|
|
|
|
size_t size;
|
|
|
|
char *buf;
|
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OzLni:virDomainBlockPeek", &pyobj_domain,
|
|
|
|
&disk, &offset, &size, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2011-12-15 13:01:33 +00:00
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(buf, size) < 0)
|
2011-12-15 13:01:33 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainBlockPeek(domain, disk, offset, size, buf, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
python: don't mask libvirt errors
A user reported this crash when using python bindings:
File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 134, in trigger
hook.trigger(event)
File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 33, in trigger
self.handlers[event]()
File "/home/nox/workspace/NOX/hooks/volatility.py", line 81, in memory_dump
for block in Memory(self.ctx):
File "/home/see/workspace/NOX/src/NOX/lib/libtools.py", line 179, in next
libvirt.VIR_MEMORY_PHYSICAL)
File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1759, in memoryPeek
ret = libvirtmod.virDomainMemoryPeek(self._o, start, size, flags)
SystemError: error return without exception set
In the python bindings, returning NULL makes python think an
exception was thrown, while returning the None object lets the
wrappers know that a libvirt error exists.
Reported by Nox DaFox, fix suggested by Dan Berrange.
* python/libvirt-override.c (libvirt_virDomainBlockPeek)
(libvirt_virDomainMemoryPeek): Return python's None object, so
wrapper knows to check libvirt error.
2012-08-31 17:07:19 +00:00
|
|
|
if (c_retval < 0) {
|
|
|
|
py_retval = VIR_PY_NONE;
|
2011-12-15 13:01:33 +00:00
|
|
|
goto cleanup;
|
python: don't mask libvirt errors
A user reported this crash when using python bindings:
File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 134, in trigger
hook.trigger(event)
File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 33, in trigger
self.handlers[event]()
File "/home/nox/workspace/NOX/hooks/volatility.py", line 81, in memory_dump
for block in Memory(self.ctx):
File "/home/see/workspace/NOX/src/NOX/lib/libtools.py", line 179, in next
libvirt.VIR_MEMORY_PHYSICAL)
File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1759, in memoryPeek
ret = libvirtmod.virDomainMemoryPeek(self._o, start, size, flags)
SystemError: error return without exception set
In the python bindings, returning NULL makes python think an
exception was thrown, while returning the None object lets the
wrappers know that a libvirt error exists.
Reported by Nox DaFox, fix suggested by Dan Berrange.
* python/libvirt-override.c (libvirt_virDomainBlockPeek)
(libvirt_virDomainMemoryPeek): Return python's None object, so
wrapper knows to check libvirt error.
2012-08-31 17:07:19 +00:00
|
|
|
}
|
2011-12-15 13:01:33 +00:00
|
|
|
|
|
|
|
py_retval = PyString_FromStringAndSize(buf, size);
|
|
|
|
|
|
|
|
cleanup:
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(buf);
|
2011-12-15 13:01:33 +00:00
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainMemoryPeek(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args) {
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
int c_retval;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
unsigned long long start;
|
|
|
|
size_t size;
|
|
|
|
char *buf;
|
|
|
|
unsigned int flags;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OLni:virDomainMemoryPeek", &pyobj_domain,
|
|
|
|
&start, &size, &flags))
|
2012-03-22 11:33:35 +00:00
|
|
|
return NULL;
|
2011-12-15 13:01:33 +00:00
|
|
|
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(buf, size) < 0)
|
2011-12-15 13:01:33 +00:00
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainMemoryPeek(domain, start, size, buf, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
python: don't mask libvirt errors
A user reported this crash when using python bindings:
File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 134, in trigger
hook.trigger(event)
File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 33, in trigger
self.handlers[event]()
File "/home/nox/workspace/NOX/hooks/volatility.py", line 81, in memory_dump
for block in Memory(self.ctx):
File "/home/see/workspace/NOX/src/NOX/lib/libtools.py", line 179, in next
libvirt.VIR_MEMORY_PHYSICAL)
File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1759, in memoryPeek
ret = libvirtmod.virDomainMemoryPeek(self._o, start, size, flags)
SystemError: error return without exception set
In the python bindings, returning NULL makes python think an
exception was thrown, while returning the None object lets the
wrappers know that a libvirt error exists.
Reported by Nox DaFox, fix suggested by Dan Berrange.
* python/libvirt-override.c (libvirt_virDomainBlockPeek)
(libvirt_virDomainMemoryPeek): Return python's None object, so
wrapper knows to check libvirt error.
2012-08-31 17:07:19 +00:00
|
|
|
if (c_retval < 0) {
|
|
|
|
py_retval = VIR_PY_NONE;
|
2011-12-15 13:01:33 +00:00
|
|
|
goto cleanup;
|
python: don't mask libvirt errors
A user reported this crash when using python bindings:
File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 134, in trigger
hook.trigger(event)
File "/home/nox/workspace/NOX/src/NOX/hooks.py", line 33, in trigger
self.handlers[event]()
File "/home/nox/workspace/NOX/hooks/volatility.py", line 81, in memory_dump
for block in Memory(self.ctx):
File "/home/see/workspace/NOX/src/NOX/lib/libtools.py", line 179, in next
libvirt.VIR_MEMORY_PHYSICAL)
File "/usr/lib/python2.7/dist-packages/libvirt.py", line 1759, in memoryPeek
ret = libvirtmod.virDomainMemoryPeek(self._o, start, size, flags)
SystemError: error return without exception set
In the python bindings, returning NULL makes python think an
exception was thrown, while returning the None object lets the
wrappers know that a libvirt error exists.
Reported by Nox DaFox, fix suggested by Dan Berrange.
* python/libvirt-override.c (libvirt_virDomainBlockPeek)
(libvirt_virDomainMemoryPeek): Return python's None object, so
wrapper knows to check libvirt error.
2012-08-31 17:07:19 +00:00
|
|
|
}
|
2011-12-15 13:01:33 +00:00
|
|
|
|
|
|
|
py_retval = PyString_FromStringAndSize(buf, size);
|
|
|
|
|
|
|
|
cleanup:
|
2012-02-02 22:45:54 +00:00
|
|
|
VIR_FREE(buf);
|
2011-12-15 13:01:33 +00:00
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
2012-09-14 14:42:19 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNodeSetMemoryParameters(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn, *info;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
int i_retval;
|
|
|
|
int nparams = 0;
|
|
|
|
Py_ssize_t size = 0;
|
|
|
|
unsigned int flags;
|
2013-01-15 23:44:29 +00:00
|
|
|
virTypedParameterPtr params, new_params = NULL;
|
2012-09-14 14:42:19 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args,
|
|
|
|
(char *)"OOi:virNodeSetMemoryParameters",
|
|
|
|
&pyobj_conn, &info, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
if ((size = PyDict_Size(info)) < 0)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (size == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"Need non-empty dictionary to set attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virNodeGetMemoryParameters(conn, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_INT_FAIL;
|
|
|
|
|
|
|
|
if (nparams == 0) {
|
|
|
|
PyErr_Format(PyExc_LookupError,
|
|
|
|
"no settable attributes");
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-09-14 14:42:19 +00:00
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virNodeGetMemoryParameters(conn, 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 = virNodeSetMemoryParameters(conn, new_params, size, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_INT_FAIL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = VIR_PY_INT_SUCCESS;
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-09-14 14:42:19 +00:00
|
|
|
VIR_FREE(new_params);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virNodeGetMemoryParameters(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
int i_retval;
|
|
|
|
int nparams = 0;
|
|
|
|
unsigned int flags;
|
|
|
|
virTypedParameterPtr params;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virNodeGetMemoryParameters",
|
|
|
|
&pyobj_conn, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virNodeGetMemoryParameters(conn, NULL, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if (!nparams)
|
|
|
|
return PyDict_New();
|
|
|
|
|
2013-06-07 08:37:25 +00:00
|
|
|
if (VIR_ALLOC_N_QUIET(params, nparams) < 0)
|
2012-09-14 14:42:19 +00:00
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virNodeGetMemoryParameters(conn, params, &nparams, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0) {
|
|
|
|
ret = VIR_PY_NONE;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = getPyVirTypedParameter(params, nparams);
|
|
|
|
|
|
|
|
cleanup:
|
2013-01-15 23:42:35 +00:00
|
|
|
virTypedParamsFree(params, nparams);
|
2012-09-14 14:42:19 +00:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-10-25 14:59:08 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virNodeGetCPUMap(PyObject *self ATTRIBUTE_UNUSED,
|
|
|
|
PyObject *args)
|
|
|
|
{
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
PyObject *ret = NULL;
|
|
|
|
PyObject *pycpumap = NULL;
|
|
|
|
PyObject *pyused = NULL;
|
|
|
|
PyObject *pycpunum = NULL;
|
|
|
|
PyObject *pyonline = NULL;
|
|
|
|
int i_retval;
|
|
|
|
unsigned char *cpumap = NULL;
|
|
|
|
unsigned int online = 0;
|
|
|
|
unsigned int flags;
|
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
size_t i;
|
2012-10-25 14:59:08 +00:00
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"Oi:virNodeGetCPUMap",
|
|
|
|
&pyobj_conn, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
i_retval = virNodeGetCPUMap(conn, &cpumap, &online, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
|
|
|
|
if (i_retval < 0)
|
|
|
|
return VIR_PY_NONE;
|
|
|
|
|
|
|
|
if ((ret = PyTuple_New(3)) == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* 0: number of CPUs */
|
|
|
|
if ((pycpunum = PyLong_FromLong(i_retval)) == NULL ||
|
|
|
|
PyTuple_SetItem(ret, 0, pycpunum) < 0)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* 1: CPU map */
|
|
|
|
if ((pycpumap = PyList_New(i_retval)) == NULL)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
for (i = 0; i < i_retval; i++) {
|
|
|
|
if ((pyused = PyBool_FromLong(VIR_CPU_USED(cpumap, i))) == NULL)
|
|
|
|
goto error;
|
|
|
|
if (PyList_SetItem(pycpumap, i, pyused) < 0)
|
|
|
|
goto error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (PyTuple_SetItem(ret, 1, pycpumap) < 0)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
/* 2: number of online CPUs */
|
|
|
|
if ((pyonline = PyLong_FromLong(online)) == NULL ||
|
|
|
|
PyTuple_SetItem(ret, 2, pyonline) < 0)
|
|
|
|
goto error;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
VIR_FREE(cpumap);
|
|
|
|
return ret;
|
|
|
|
error:
|
|
|
|
Py_XDECREF(ret);
|
|
|
|
Py_XDECREF(pycpumap);
|
|
|
|
Py_XDECREF(pyused);
|
|
|
|
Py_XDECREF(pycpunum);
|
|
|
|
Py_XDECREF(pyonline);
|
|
|
|
ret = NULL;
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2012-09-14 14:42:19 +00:00
|
|
|
|
Introduce new domain create APIs to pass pre-opened FDs to LXC
With container based virt, it is useful to be able to pass
pre-opened file descriptors to the container init process.
This allows for containers to be auto-activated from incoming
socket connections, passing the active socket into the container.
To do this, introduce a pair of new APIs, virDomainCreateXMLWithFiles
and virDomainCreateWithFiles, which accept an array of file
descriptors. For the LXC driver, UNIX file descriptor passing
will be used to send them to libvirtd, which will them pass
them down to libvirt_lxc, which will then pass them to the container
init process.
This will only be implemented for LXC right now, but the design
is generic enough it could work with other hypervisors, hence
I suggest adding this to libvirt.so, rather than libvirt-lxc.so
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-09 16:12:38 +00:00
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainCreateWithFiles(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
int c_retval;
|
|
|
|
virDomainPtr domain;
|
|
|
|
PyObject *pyobj_domain;
|
|
|
|
PyObject *pyobj_files;
|
|
|
|
unsigned int flags;
|
|
|
|
unsigned int nfiles;
|
|
|
|
int *files = NULL;
|
|
|
|
size_t i;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OOi:virDomainCreateWithFiles",
|
|
|
|
&pyobj_domain, &pyobj_files, &flags))
|
|
|
|
return NULL;
|
|
|
|
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
|
|
|
|
|
|
|
|
nfiles = PyList_Size(pyobj_files);
|
|
|
|
|
|
|
|
if (VIR_ALLOC_N_QUIET(files, nfiles) < 0)
|
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
for (i = 0; i < nfiles; i++) {
|
|
|
|
PyObject *pyfd;
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
pyfd = PyList_GetItem(pyobj_files, i);
|
|
|
|
|
|
|
|
if (libvirt_intUnwrap(pyfd, &fd) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainCreateWithFiles(domain, nfiles, files, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
py_retval = libvirt_intWrap((int) c_retval);
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
VIR_FREE(files);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static PyObject *
|
|
|
|
libvirt_virDomainCreateXMLWithFiles(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
|
|
|
|
PyObject *py_retval = NULL;
|
|
|
|
virDomainPtr c_retval;
|
|
|
|
virConnectPtr conn;
|
|
|
|
PyObject *pyobj_conn;
|
|
|
|
char * xmlDesc;
|
|
|
|
PyObject *pyobj_files;
|
|
|
|
unsigned int flags;
|
|
|
|
unsigned int nfiles;
|
|
|
|
int *files = NULL;
|
|
|
|
size_t i;
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, (char *)"OzOi:virDomainCreateXMLWithFiles",
|
|
|
|
&pyobj_conn, &xmlDesc, &pyobj_files, &flags))
|
|
|
|
return NULL;
|
|
|
|
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
|
|
|
|
|
|
|
|
nfiles = PyList_Size(pyobj_files);
|
|
|
|
|
|
|
|
if (VIR_ALLOC_N_QUIET(files, nfiles) < 0)
|
|
|
|
return PyErr_NoMemory();
|
|
|
|
|
|
|
|
for (i = 0; i < nfiles; i++) {
|
|
|
|
PyObject *pyfd;
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
pyfd = PyList_GetItem(pyobj_files, i);
|
|
|
|
|
|
|
|
if (libvirt_intUnwrap(pyfd, &fd) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
LIBVIRT_BEGIN_ALLOW_THREADS;
|
|
|
|
c_retval = virDomainCreateXMLWithFiles(conn, xmlDesc, nfiles, files, flags);
|
|
|
|
LIBVIRT_END_ALLOW_THREADS;
|
|
|
|
py_retval = libvirt_virDomainPtrWrap((virDomainPtr) c_retval);
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
VIR_FREE(files);
|
|
|
|
return py_retval;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-12-19 16:34:11 +00:00
|
|
|
/************************************************************************
|
|
|
|
* *
|
|
|
|
* The registration stuff *
|
|
|
|
* *
|
|
|
|
************************************************************************/
|
2006-02-09 17:45:11 +00:00
|
|
|
static PyMethodDef libvirtMethods[] = {
|
|
|
|
#include "libvirt-export.c"
|
2007-05-29 14:58:27 +00:00
|
|
|
{(char *) "virGetVersion", libvirt_virGetVersion, METH_VARARGS, NULL},
|
2010-01-22 10:01:09 +00:00
|
|
|
{(char *) "virConnectGetVersion", libvirt_virConnectGetVersion, METH_VARARGS, NULL},
|
2013-09-23 09:46:04 +00:00
|
|
|
{(char *) "virConnectGetCPUModelNames", libvirt_virConnectGetCPUModelNames, METH_VARARGS, NULL},
|
2009-11-12 15:53:26 +00:00
|
|
|
{(char *) "virConnectGetLibVersion", libvirt_virConnectGetLibVersion, METH_VARARGS, NULL},
|
2007-12-05 19:09:23 +00:00
|
|
|
{(char *) "virConnectOpenAuth", libvirt_virConnectOpenAuth, METH_VARARGS, NULL},
|
2006-02-09 17:45:11 +00:00
|
|
|
{(char *) "virConnectListDomainsID", libvirt_virConnectListDomainsID, METH_VARARGS, NULL},
|
2006-11-16 00:17:10 +00:00
|
|
|
{(char *) "virConnectListDefinedDomains", libvirt_virConnectListDefinedDomains, METH_VARARGS, NULL},
|
2012-05-20 14:20:11 +00:00
|
|
|
{(char *) "virConnectListAllDomains", libvirt_virConnectListAllDomains, METH_VARARGS, NULL},
|
2008-10-31 10:13:45 +00:00
|
|
|
{(char *) "virConnectDomainEventRegister", libvirt_virConnectDomainEventRegister, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virConnectDomainEventDeregister", libvirt_virConnectDomainEventDeregister, METH_VARARGS, NULL},
|
2010-03-26 13:22:06 +00:00
|
|
|
{(char *) "virConnectDomainEventRegisterAny", libvirt_virConnectDomainEventRegisterAny, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virConnectDomainEventDeregisterAny", libvirt_virConnectDomainEventDeregisterAny, METH_VARARGS, NULL},
|
2012-07-30 16:30:42 +00:00
|
|
|
{(char *) "virConnectRegisterCloseCallback", libvirt_virConnectRegisterCloseCallback, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virConnectUnregisterCloseCallback", libvirt_virConnectUnregisterCloseCallback, METH_VARARGS, NULL},
|
2011-06-14 17:49:22 +00:00
|
|
|
{(char *) "virStreamEventAddCallback", libvirt_virStreamEventAddCallback, METH_VARARGS, NULL},
|
2011-06-14 20:07:43 +00:00
|
|
|
{(char *) "virStreamRecv", libvirt_virStreamRecv, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virStreamSend", libvirt_virStreamSend, METH_VARARGS, NULL},
|
2006-02-09 17:45:11 +00:00
|
|
|
{(char *) "virDomainGetInfo", libvirt_virDomainGetInfo, METH_VARARGS, NULL},
|
2011-04-22 11:31:35 +00:00
|
|
|
{(char *) "virDomainGetState", libvirt_virDomainGetState, METH_VARARGS, NULL},
|
2011-05-24 08:28:50 +00:00
|
|
|
{(char *) "virDomainGetControlInfo", libvirt_virDomainGetControlInfo, METH_VARARGS, NULL},
|
2010-04-28 12:42:13 +00:00
|
|
|
{(char *) "virDomainGetBlockInfo", libvirt_virDomainGetBlockInfo, METH_VARARGS, NULL},
|
2006-03-29 12:46:03 +00:00
|
|
|
{(char *) "virNodeGetInfo", libvirt_virNodeGetInfo, METH_VARARGS, NULL},
|
2011-11-28 17:19:27 +00:00
|
|
|
{(char *) "virNodeGetCPUStats", libvirt_virNodeGetCPUStats, METH_VARARGS, NULL},
|
2011-11-28 17:19:28 +00:00
|
|
|
{(char *) "virNodeGetMemoryStats", libvirt_virNodeGetMemoryStats, METH_VARARGS, NULL},
|
2006-02-23 11:26:17 +00:00
|
|
|
{(char *) "virDomainGetUUID", libvirt_virDomainGetUUID, METH_VARARGS, NULL},
|
2008-06-10 15:20:25 +00:00
|
|
|
{(char *) "virDomainGetUUIDString", libvirt_virDomainGetUUIDString, METH_VARARGS, NULL},
|
2006-02-24 12:26:56 +00:00
|
|
|
{(char *) "virDomainLookupByUUID", libvirt_virDomainLookupByUUID, METH_VARARGS, NULL},
|
2006-02-28 12:17:00 +00:00
|
|
|
{(char *) "virRegisterErrorHandler", libvirt_virRegisterErrorHandler, METH_VARARGS, NULL},
|
2006-11-07 23:18:56 +00:00
|
|
|
{(char *) "virGetLastError", libvirt_virGetLastError, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virConnGetLastError", libvirt_virConnGetLastError, METH_VARARGS, NULL},
|
2007-03-09 15:42:50 +00:00
|
|
|
{(char *) "virConnectListNetworks", libvirt_virConnectListNetworks, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virConnectListDefinedNetworks", libvirt_virConnectListDefinedNetworks, METH_VARARGS, NULL},
|
2012-09-04 15:55:21 +00:00
|
|
|
{(char *) "virConnectListAllNetworks", libvirt_virConnectListAllNetworks, METH_VARARGS, NULL},
|
2007-03-09 15:42:50 +00:00
|
|
|
{(char *) "virNetworkGetUUID", libvirt_virNetworkGetUUID, METH_VARARGS, NULL},
|
2008-06-10 15:20:25 +00:00
|
|
|
{(char *) "virNetworkGetUUIDString", libvirt_virNetworkGetUUIDString, METH_VARARGS, NULL},
|
2007-03-09 15:42:50 +00:00
|
|
|
{(char *) "virNetworkLookupByUUID", libvirt_virNetworkLookupByUUID, METH_VARARGS, NULL},
|
2007-04-10 23:15:58 +00:00
|
|
|
{(char *) "virDomainGetAutostart", libvirt_virDomainGetAutostart, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virNetworkGetAutostart", libvirt_virNetworkGetAutostart, METH_VARARGS, NULL},
|
2007-09-30 20:52:13 +00:00
|
|
|
{(char *) "virDomainBlockStats", libvirt_virDomainBlockStats, METH_VARARGS, NULL},
|
2011-09-05 08:24:21 +00:00
|
|
|
{(char *) "virDomainBlockStatsFlags", libvirt_virDomainBlockStatsFlags, METH_VARARGS, NULL},
|
2012-03-20 04:34:06 +00:00
|
|
|
{(char *) "virDomainGetCPUStats", libvirt_virDomainGetCPUStats, METH_VARARGS, NULL},
|
2007-09-30 20:52:13 +00:00
|
|
|
{(char *) "virDomainInterfaceStats", libvirt_virDomainInterfaceStats, METH_VARARGS, NULL},
|
2009-12-20 12:48:37 +00:00
|
|
|
{(char *) "virDomainMemoryStats", libvirt_virDomainMemoryStats, METH_VARARGS, NULL},
|
2007-12-07 08:41:01 +00:00
|
|
|
{(char *) "virNodeGetCellsFreeMemory", libvirt_virNodeGetCellsFreeMemory, METH_VARARGS, NULL},
|
2008-01-21 15:41:15 +00:00
|
|
|
{(char *) "virDomainGetSchedulerType", libvirt_virDomainGetSchedulerType, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainGetSchedulerParameters", libvirt_virDomainGetSchedulerParameters, METH_VARARGS, NULL},
|
2011-07-25 06:54:34 +00:00
|
|
|
{(char *) "virDomainGetSchedulerParametersFlags", libvirt_virDomainGetSchedulerParametersFlags, METH_VARARGS, NULL},
|
2008-01-21 15:41:15 +00:00
|
|
|
{(char *) "virDomainSetSchedulerParameters", libvirt_virDomainSetSchedulerParameters, METH_VARARGS, NULL},
|
2011-07-25 06:57:33 +00:00
|
|
|
{(char *) "virDomainSetSchedulerParametersFlags", libvirt_virDomainSetSchedulerParametersFlags, METH_VARARGS, NULL},
|
2011-02-22 05:30:33 +00:00
|
|
|
{(char *) "virDomainSetBlkioParameters", libvirt_virDomainSetBlkioParameters, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainGetBlkioParameters", libvirt_virDomainGetBlkioParameters, METH_VARARGS, NULL},
|
2010-10-12 19:24:11 +00:00
|
|
|
{(char *) "virDomainSetMemoryParameters", libvirt_virDomainSetMemoryParameters, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainGetMemoryParameters", libvirt_virDomainGetMemoryParameters, METH_VARARGS, NULL},
|
2012-02-08 12:20:50 +00:00
|
|
|
{(char *) "virDomainSetNumaParameters", libvirt_virDomainSetNumaParameters, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainGetNumaParameters", libvirt_virDomainGetNumaParameters, METH_VARARGS, NULL},
|
python: Expose virDomain{G,S}etInterfaceParameters APIs in python binding
The v4 patch corrects indentation issues.
The v3 patch follows latest python binding codes and change 'size'
type from int to Py_ssize_t.
An simple example to show how to use it:
#!/usr/bin/env python
import libvirt
conn = libvirt.open(None)
dom = conn.lookupByName('foo')
print dom.interfaceParameters('vnet0', 0)
params = {'outbound.peak': 10,
'inbound.peak': 10,
'inbound.burst': 20,
'inbound.average': 20,
'outbound.average': 30,
'outbound.burst': 30}
print dom.setInterfaceParameters('vnet0', params, 0)
print dom.interfaceParameters('vnet0', 0)
Signed-off-by: Alex Jia <ajia@redhat.com>
2012-02-14 02:46:23 +00:00
|
|
|
{(char *) "virDomainSetInterfaceParameters", libvirt_virDomainSetInterfaceParameters, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainGetInterfaceParameters", libvirt_virDomainGetInterfaceParameters, METH_VARARGS, NULL},
|
2008-01-21 15:41:15 +00:00
|
|
|
{(char *) "virDomainGetVcpus", libvirt_virDomainGetVcpus, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainPinVcpu", libvirt_virDomainPinVcpu, METH_VARARGS, NULL},
|
2011-07-25 07:00:11 +00:00
|
|
|
{(char *) "virDomainPinVcpuFlags", libvirt_virDomainPinVcpuFlags, METH_VARARGS, NULL},
|
2011-07-25 07:04:50 +00:00
|
|
|
{(char *) "virDomainGetVcpuPinInfo", libvirt_virDomainGetVcpuPinInfo, METH_VARARGS, NULL},
|
2013-03-20 10:43:41 +00:00
|
|
|
{(char *) "virDomainGetEmulatorPinInfo", libvirt_virDomainGetEmulatorPinInfo, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainPinEmulator", libvirt_virDomainPinEmulator, METH_VARARGS, NULL},
|
2008-02-20 15:26:22 +00:00
|
|
|
{(char *) "virConnectListStoragePools", libvirt_virConnectListStoragePools, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virConnectListDefinedStoragePools", libvirt_virConnectListDefinedStoragePools, METH_VARARGS, NULL},
|
2012-09-04 15:16:33 +00:00
|
|
|
{(char *) "virConnectListAllStoragePools", libvirt_virConnectListAllStoragePools, METH_VARARGS, NULL},
|
2008-02-20 15:26:22 +00:00
|
|
|
{(char *) "virStoragePoolGetAutostart", libvirt_virStoragePoolGetAutostart, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virStoragePoolListVolumes", libvirt_virStoragePoolListVolumes, METH_VARARGS, NULL},
|
2012-09-04 15:32:58 +00:00
|
|
|
{(char *) "virStoragePoolListAllVolumes", libvirt_virStoragePoolListAllVolumes, METH_VARARGS, NULL},
|
2008-02-20 15:26:22 +00:00
|
|
|
{(char *) "virStoragePoolGetInfo", libvirt_virStoragePoolGetInfo, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virStorageVolGetInfo", libvirt_virStorageVolGetInfo, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virStoragePoolGetUUID", libvirt_virStoragePoolGetUUID, METH_VARARGS, NULL},
|
2008-06-10 15:20:25 +00:00
|
|
|
{(char *) "virStoragePoolGetUUIDString", libvirt_virStoragePoolGetUUIDString, METH_VARARGS, NULL},
|
2008-02-20 15:26:22 +00:00
|
|
|
{(char *) "virStoragePoolLookupByUUID", libvirt_virStoragePoolLookupByUUID, METH_VARARGS, NULL},
|
2008-10-31 10:13:45 +00:00
|
|
|
{(char *) "virEventRegisterImpl", libvirt_virEventRegisterImpl, METH_VARARGS, NULL},
|
2011-06-15 23:35:44 +00:00
|
|
|
{(char *) "virEventAddHandle", libvirt_virEventAddHandle, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virEventAddTimeout", libvirt_virEventAddTimeout, METH_VARARGS, NULL},
|
2008-10-31 10:13:45 +00:00
|
|
|
{(char *) "virEventInvokeHandleCallback", libvirt_virEventInvokeHandleCallback, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virEventInvokeTimeoutCallback", libvirt_virEventInvokeTimeoutCallback, METH_VARARGS, NULL},
|
2008-11-21 12:41:15 +00:00
|
|
|
{(char *) "virNodeListDevices", libvirt_virNodeListDevices, METH_VARARGS, NULL},
|
2012-09-05 05:34:11 +00:00
|
|
|
{(char *) "virConnectListAllNodeDevices", libvirt_virConnectListAllNodeDevices, METH_VARARGS, NULL},
|
2008-11-21 12:41:15 +00:00
|
|
|
{(char *) "virNodeDeviceListCaps", libvirt_virNodeDeviceListCaps, METH_VARARGS, NULL},
|
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 16:44:12 +00:00
|
|
|
{(char *) "virSecretGetUUID", libvirt_virSecretGetUUID, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virSecretGetUUIDString", libvirt_virSecretGetUUIDString, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virSecretLookupByUUID", libvirt_virSecretLookupByUUID, METH_VARARGS, NULL},
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
{(char *) "virConnectListSecrets", libvirt_virConnectListSecrets, METH_VARARGS, NULL},
|
2012-09-14 08:38:51 +00:00
|
|
|
{(char *) "virConnectListAllSecrets", libvirt_virConnectListAllSecrets, METH_VARARGS, NULL},
|
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'
2009-08-04 18:38:21 +00:00
|
|
|
{(char *) "virSecretGetValue", libvirt_virSecretGetValue, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virSecretSetValue", libvirt_virSecretSetValue, METH_VARARGS, NULL},
|
2010-04-29 10:46:01 +00:00
|
|
|
{(char *) "virNWFilterGetUUID", libvirt_virNWFilterGetUUID, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virNWFilterGetUUIDString", libvirt_virNWFilterGetUUIDString, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virNWFilterLookupByUUID", libvirt_virNWFilterLookupByUUID, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virConnectListNWFilters", libvirt_virConnectListNWFilters, METH_VARARGS, NULL},
|
2012-09-05 06:02:06 +00:00
|
|
|
{(char *) "virConnectListAllNWFilters", libvirt_virConnectListAllNWFilters, METH_VARARGS, NULL},
|
2009-11-20 15:22:42 +00:00
|
|
|
{(char *) "virConnectListInterfaces", libvirt_virConnectListInterfaces, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virConnectListDefinedInterfaces", libvirt_virConnectListDefinedInterfaces, METH_VARARGS, NULL},
|
2012-09-04 16:10:19 +00:00
|
|
|
{(char *) "virConnectListAllInterfaces", libvirt_virConnectListAllInterfaces, METH_VARARGS, NULL},
|
2010-01-22 13:52:41 +00:00
|
|
|
{(char *) "virConnectBaselineCPU", libvirt_virConnectBaselineCPU, METH_VARARGS, NULL},
|
2010-02-03 11:31:45 +00:00
|
|
|
{(char *) "virDomainGetJobInfo", libvirt_virDomainGetJobInfo, METH_VARARGS, NULL},
|
2013-02-18 22:20:08 +00:00
|
|
|
{(char *) "virDomainGetJobStats", libvirt_virDomainGetJobStats, METH_VARARGS, NULL},
|
2010-04-20 09:49:27 +00:00
|
|
|
{(char *) "virDomainSnapshotListNames", libvirt_virDomainSnapshotListNames, METH_VARARGS, NULL},
|
2012-06-09 15:55:36 +00:00
|
|
|
{(char *) "virDomainListAllSnapshots", libvirt_virDomainListAllSnapshots, METH_VARARGS, NULL},
|
2011-12-13 14:49:59 +00:00
|
|
|
{(char *) "virDomainSnapshotListChildrenNames", libvirt_virDomainSnapshotListChildrenNames, METH_VARARGS, NULL},
|
2012-06-09 15:55:36 +00:00
|
|
|
{(char *) "virDomainSnapshotListAllChildren", libvirt_virDomainSnapshotListAllChildren, METH_VARARGS, NULL},
|
2010-05-19 13:02:30 +00:00
|
|
|
{(char *) "virDomainRevertToSnapshot", libvirt_virDomainRevertToSnapshot, METH_VARARGS, NULL},
|
2011-07-22 05:43:53 +00:00
|
|
|
{(char *) "virDomainGetBlockJobInfo", libvirt_virDomainGetBlockJobInfo, METH_VARARGS, NULL},
|
2011-11-15 09:02:49 +00:00
|
|
|
{(char *) "virDomainSetBlockIoTune", libvirt_virDomainSetBlockIoTune, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainGetBlockIoTune", libvirt_virDomainGetBlockIoTune, METH_VARARGS, NULL},
|
2011-07-21 09:21:10 +00:00
|
|
|
{(char *) "virDomainSendKey", libvirt_virDomainSendKey, METH_VARARGS, NULL},
|
2013-02-18 22:20:48 +00:00
|
|
|
{(char *) "virDomainMigrateGetCompressionCache", libvirt_virDomainMigrateGetCompressionCache, METH_VARARGS, NULL},
|
2011-08-26 18:10:21 +00:00
|
|
|
{(char *) "virDomainMigrateGetMaxSpeed", libvirt_virDomainMigrateGetMaxSpeed, METH_VARARGS, NULL},
|
2013-06-14 09:20:54 +00:00
|
|
|
{(char *) "virDomainMigrate3", libvirt_virDomainMigrate3, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainMigrateToURI3", libvirt_virDomainMigrateToURI3, METH_VARARGS, NULL},
|
2011-12-15 13:01:33 +00:00
|
|
|
{(char *) "virDomainBlockPeek", libvirt_virDomainBlockPeek, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainMemoryPeek", libvirt_virDomainMemoryPeek, METH_VARARGS, NULL},
|
2012-01-31 06:34:51 +00:00
|
|
|
{(char *) "virDomainGetDiskErrors", libvirt_virDomainGetDiskErrors, METH_VARARGS, NULL},
|
2012-09-14 14:42:19 +00:00
|
|
|
{(char *) "virNodeGetMemoryParameters", libvirt_virNodeGetMemoryParameters, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virNodeSetMemoryParameters", libvirt_virNodeSetMemoryParameters, METH_VARARGS, NULL},
|
2012-10-25 14:59:08 +00:00
|
|
|
{(char *) "virNodeGetCPUMap", libvirt_virNodeGetCPUMap, METH_VARARGS, NULL},
|
Introduce new domain create APIs to pass pre-opened FDs to LXC
With container based virt, it is useful to be able to pass
pre-opened file descriptors to the container init process.
This allows for containers to be auto-activated from incoming
socket connections, passing the active socket into the container.
To do this, introduce a pair of new APIs, virDomainCreateXMLWithFiles
and virDomainCreateWithFiles, which accept an array of file
descriptors. For the LXC driver, UNIX file descriptor passing
will be used to send them to libvirtd, which will them pass
them down to libvirt_lxc, which will then pass them to the container
init process.
This will only be implemented for LXC right now, but the design
is generic enough it could work with other hypervisors, hence
I suggest adding this to libvirt.so, rather than libvirt-lxc.so
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-09 16:12:38 +00:00
|
|
|
{(char *) "virDomainCreateXMLWithFiles", libvirt_virDomainCreateXMLWithFiles, METH_VARARGS, NULL},
|
|
|
|
{(char *) "virDomainCreateWithFiles", libvirt_virDomainCreateWithFiles, METH_VARARGS, NULL},
|
2005-12-19 16:34:11 +00:00
|
|
|
{NULL, NULL, 0, NULL}
|
|
|
|
};
|
|
|
|
|
|
|
|
void
|
2007-11-30 11:10:53 +00:00
|
|
|
#ifndef __CYGWIN__
|
|
|
|
initlibvirtmod
|
|
|
|
#else
|
|
|
|
initcygvirtmod
|
|
|
|
#endif
|
|
|
|
(void)
|
2005-12-19 16:34:11 +00:00
|
|
|
{
|
|
|
|
static int initialized = 0;
|
|
|
|
|
|
|
|
if (initialized != 0)
|
|
|
|
return;
|
|
|
|
|
2010-05-18 11:46:27 +00:00
|
|
|
if (virInitialize() < 0)
|
|
|
|
return;
|
2006-03-28 14:41:04 +00:00
|
|
|
|
2008-02-29 12:53:10 +00:00
|
|
|
/* initialize the python extension module */
|
2007-11-30 11:10:53 +00:00
|
|
|
Py_InitModule((char *)
|
|
|
|
#ifndef __CYGWIN__
|
|
|
|
"libvirtmod"
|
|
|
|
#else
|
|
|
|
"cygvirtmod"
|
|
|
|
#endif
|
|
|
|
, libvirtMethods);
|
2005-12-19 16:34:11 +00:00
|
|
|
|
|
|
|
initialized = 1;
|
|
|
|
}
|