[libvirt] [libvirt-python][PATCH] Implement virDomain{Get, Set}Time APIs

Michal Privoznik mprivozn at redhat.com
Mon May 19 14:07:38 UTC 2014


While the setter can be generated automatically, the getter is not.
However, it would be a lot easier if they both share the same logic:
a python dictionary to represent the time: dict['seconds'] to
represent seconds, and dict['nseconds'] to represent microseconds.

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 generator.py                  |  2 +
 libvirt-override-virDomain.py | 13 ++++++
 libvirt-override.c            | 95 +++++++++++++++++++++++++++++++++++++++++++
 sanitytest.py                 |  2 +-
 4 files changed, 111 insertions(+), 1 deletion(-)

diff --git a/generator.py b/generator.py
index e7b4643..bdac877 100755
--- a/generator.py
+++ b/generator.py
@@ -519,6 +519,8 @@ skip_function = (
 
     'virDomainFSFreeze', # overridden in virDomain.py
     'virDomainFSThaw', # overridden in virDomain.py
+    'virDomainGetTime', # overridden in virDomain.py
+    'virDomainSetTime', # overridden in virDomain.py
 
     # 'Ref' functions have no use for bindings users.
     "virConnectRef",
diff --git a/libvirt-override-virDomain.py b/libvirt-override-virDomain.py
index e61ad00..a50ec0d 100644
--- a/libvirt-override-virDomain.py
+++ b/libvirt-override-virDomain.py
@@ -59,3 +59,16 @@
         ret = libvirtmod.virDomainFSThaw(self._o, mountpoints, flags)
         if ret == -1: raise libvirtError ('virDomainFSThaw() failed', dom=self)
         return ret
+
+    def getTime(self, flags=0):
+        """Extract information about guest time """
+        ret = libvirtmod.virDomainGetTime(self._o, flags)
+        if ret == -1: raise libvirtError ('virDomainGetTime() failed', dom=self)
+        return ret
+
+    def setTime(self, time=None, flags=0):
+        """Set guest time to the given value. @time is a dict conatining
+        'seconds' field for seconds and 'nseconds' field for nanosecons """
+        ret = libvirtmod.virDomainSetTime(self._o, time, flags)
+        if ret == -1: raise libvirtError ('virDomainSetTime() failed', dom=self)
+        return ret
diff --git a/libvirt-override.c b/libvirt-override.c
index c4ac223..a7a6213 100644
--- a/libvirt-override.c
+++ b/libvirt-override.c
@@ -7645,6 +7645,99 @@ libvirt_virDomainFSThaw(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
     VIR_FREE(mountpoints);
     return py_retval;
 }
+
+static PyObject *
+libvirt_virDomainGetTime(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
+    PyObject *py_retval = NULL;
+    PyObject *dict = NULL;
+    PyObject *pyobj_domain, *pyobj_seconds, *pyobj_nseconds;
+    virDomainPtr domain;
+    long long seconds;
+    unsigned int nseconds;
+    unsigned int flags;
+    int c_retval;
+
+    if (!PyArg_ParseTuple(args, (char*)"Oi:virDomainGetTime",
+                          &pyobj_domain, &flags))
+        return NULL;
+    domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
+
+    if (!(dict = PyDict_New()))
+        goto cleanup;
+
+    LIBVIRT_BEGIN_ALLOW_THREADS;
+    c_retval = virDomainGetTime(domain, &seconds, &nseconds, flags);
+    LIBVIRT_END_ALLOW_THREADS;
+
+    if (c_retval < 0)
+        goto cleanup;
+
+    if (!(pyobj_seconds = libvirt_longlongWrap(seconds)) ||
+        PyDict_SetItemString(dict, "seconds", pyobj_seconds) < 0)
+        goto cleanup;
+    Py_DECREF(pyobj_seconds);
+
+    if (!(pyobj_nseconds = libvirt_uintWrap(nseconds)) ||
+        PyDict_SetItemString(dict, "nseconds", pyobj_nseconds) < 0)
+        goto cleanup;
+    Py_DECREF(pyobj_nseconds);
+
+    py_retval = dict;
+    dict = NULL;
+ cleanup:
+    Py_XDECREF(dict);
+    return py_retval;
+}
+
+
+static PyObject *
+libvirt_virDomainSetTime(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
+    PyObject *py_retval = NULL;
+    PyObject *pyobj_domain;
+    PyObject *py_dict;
+    virDomainPtr domain;
+    long long seconds = 0;
+    unsigned int nseconds = 0;
+    unsigned int flags;
+    ssize_t py_dict_size;
+    int c_retval;
+
+    if (!PyArg_ParseTuple(args, (char*)"OOi:virDomainSetTime",
+                          &pyobj_domain, &py_dict, &flags))
+        return NULL;
+    domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
+
+    py_dict_size = PyDict_Size(py_dict);
+
+    if (py_dict_size == 2) {
+        PyObject *pyobj_seconds, *pyobj_nseconds;
+
+        if (!(pyobj_seconds = PyDict_GetItemString(py_dict, "seconds")) ||
+            (libvirt_longlongUnwrap(pyobj_seconds, &seconds) < 0)) {
+            PyErr_Format(PyExc_LookupError, "malformed or missing 'seconds'");
+            goto cleanup;
+        }
+
+        if (!(pyobj_nseconds = PyDict_GetItemString(py_dict, "nseconds")) ||
+            (libvirt_uintUnwrap(pyobj_nseconds, &nseconds) < 0)) {
+            PyErr_Format(PyExc_LookupError, "malformed or missing 'nseconds'");
+            goto cleanup;
+        }
+    } else if (py_dict_size > 0) {
+        PyErr_Format(PyExc_LookupError, "Dictionary must contain "
+                     "'seconds' and 'nseconds'");
+        goto cleanup;
+    }
+
+    LIBVIRT_BEGIN_ALLOW_THREADS;
+    c_retval = virDomainSetTime(domain, seconds, nseconds, flags);
+    LIBVIRT_END_ALLOW_THREADS;
+
+    py_retval = libvirt_intWrap(c_retval);
+
+ cleanup:
+    return py_retval;
+}
 #endif /* LIBVIR_CHECK_VERSION(1, 2, 5) */
 
 /************************************************************************
@@ -7825,6 +7918,8 @@ static PyMethodDef libvirtMethods[] = {
 #if LIBVIR_CHECK_VERSION(1, 2, 5)
     {(char *) "virDomainFSFreeze", libvirt_virDomainFSFreeze, METH_VARARGS, NULL},
     {(char *) "virDomainFSThaw", libvirt_virDomainFSThaw, METH_VARARGS, NULL},
+    {(char *) "virDomainGetTime", libvirt_virDomainGetTime, METH_VARARGS, NULL},
+    {(char *) "virDomainSetTime", libvirt_virDomainSetTime, METH_VARARGS, NULL},
 #endif /* LIBVIR_CHECK_VERSION(1, 2, 5) */
     {NULL, NULL, 0, NULL}
 };
diff --git a/sanitytest.py b/sanitytest.py
index 62fe42b..6067a3f 100644
--- a/sanitytest.py
+++ b/sanitytest.py
@@ -152,7 +152,7 @@ for name in sorted(basicklassmap):
     # and virDomainSnapshot namespaces which stupidly used a different
     # convention which we now can't fix without breaking API
     if func[0:3] == "Get" and klass not in ["virConnect", "virDomainSnapshot", "libvirt"]:
-        if func not in ["GetCPUStats"]:
+        if func not in ["GetCPUStats", "GetTime"]:
             func = func[3:]
 
     # The object creation and lookup APIs all have to get re-mapped
-- 
1.9.3




More information about the libvir-list mailing list