summaryrefslogtreecommitdiffstats
path: root/libvirt-override.c
diff options
context:
space:
mode:
authorMichal Privoznik <mprivozn@redhat.com>2011-10-18 16:15:42 +0200
committerMichal Privoznik <mprivozn@redhat.com>2011-10-25 09:27:10 +0200
commit7ad073e29d8fa4d4758c78e3437492b855f034c6 (patch)
treeadb3cc768098b5beb13a5dfec5783acbcec58194 /libvirt-override.c
parenta53760ff2fdc096292c5998b37e0bba3bb816a56 (diff)
downloadlibvirt-python-v6-7ad073e29d8fa4d4758c78e3437492b855f034c6.tar.gz
libvirt-python-v6-7ad073e29d8fa4d4758c78e3437492b855f034c6.tar.xz
libvirt-python-v6-7ad073e29d8fa4d4758c78e3437492b855f034c6.zip
startupPolicy: Emit event on disk source droppingv0.9.7-rc1
If a disk source gets dropped because it is not accessible, mgmt application might want to be informed about this. Therefore we need to emit an event. The event presented in this patch is however a bit superset of what written above. The reason is simple: an intention to be easily expanded, e.g. on 'user ejected disk in guest' events. Therefore, callback gets source string and disk alias (which should be unique among a domain) and reason (an integer);
Diffstat (limited to 'libvirt-override.c')
-rw-r--r--libvirt-override.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/libvirt-override.c b/libvirt-override.c
index 523c03b..1759bae 100644
--- a/libvirt-override.c
+++ b/libvirt-override.c
@@ -4374,6 +4374,56 @@ libvirt_virConnectDomainEventBlockJobCallback(virConnectPtr conn ATTRIBUTE_UNUSE
return ret;
}
+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);
+
+ 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;
+}
+
static PyObject *
libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self,
PyObject * args)
@@ -4431,6 +4481,9 @@ libvirt_virConnectDomainEventRegisterAny(ATTRIBUTE_UNUSED PyObject * self,
case VIR_DOMAIN_EVENT_ID_BLOCK_JOB:
cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventBlockJobCallback);
break;
+ case VIR_DOMAIN_EVENT_ID_DISK_CHANGE:
+ cb = VIR_DOMAIN_EVENT_CALLBACK(libvirt_virConnectDomainEventDiskChangeCallback);
+ break;
}
if (!cb) {