[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[libvirt] Re: [PATCH 11/12] Domain Events - test harness
- From: Ben Guthro <bguthro virtualiron com>
- To: libvir-list redhat com
- Subject: [libvirt] Re: [PATCH 11/12] Domain Events - test harness
- Date: Fri, 17 Oct 2008 12:08:28 -0400
Test app, and infrastructure changes for an example dir
Makefile.am | 2
configure.in | 3
examples/domain-events/events-c/Makefile.am | 5
examples/domain-events/events-c/event-test.c | 214 +++++++++++++++++++++++++++
libvirt.spec.in | 3
5 files changed, 225 insertions(+), 2 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 073063d..d40a151 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -4,7 +4,7 @@ LCOV = lcov
GENHTML = genhtml
SUBDIRS = gnulib/lib include src qemud proxy docs gnulib/tests \
- python tests po
+ python tests po examples/domain-events/events-c
ACLOCAL_AMFLAGS = -I m4 -I gnulib/m4
diff --git a/configure.in b/configure.in
index 497251f..9be3fec 100644
--- a/configure.in
+++ b/configure.in
@@ -1072,7 +1072,8 @@ AC_OUTPUT(Makefile src/Makefile include/Makefile docs/Makefile \
tests/sexpr2xmldata/Makefile \
tests/xmconfigdata/Makefile \
tests/xencapsdata/Makefile \
- tests/virshdata/Makefile tests/confdata/Makefile)
+ tests/virshdata/Makefile tests/confdata/Makefile \
+ examples/domain-events/events-c/Makefile)
AC_MSG_NOTICE([])
AC_MSG_NOTICE([Configuration summary])
diff --git a/examples/domain-events/events-c/Makefile.am b/examples/domain-events/events-c/Makefile.am
new file mode 100644
index 0000000..1788dac
--- /dev/null
+++ b/examples/domain-events/events-c/Makefile.am
@@ -0,0 +1,5 @@
+INCLUDES = -I top_srcdir@/include
+bin_PROGRAMS = event-test
+event_test_CFLAGS = $(WARN_CFLAGS)
+event_test_SOURCES = event-test.c
+event_test_LDADD = -L top_srcdir@/src/.libs -lvirt
diff --git a/examples/domain-events/events-c/event-test.c b/examples/domain-events/events-c/event-test.c
new file mode 100644
index 0000000..f26ffdb
--- /dev/null
+++ b/examples/domain-events/events-c/event-test.c
@@ -0,0 +1,214 @@
+#include <config.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/poll.h>
+#include <libvirt/libvirt.h>
+
+#define DEBUG0(fmt) printf("%s:%d :: " fmt "\n", __FUNCTION__, __LINE__)
+#define DEBUG(fmt, ...) printf("%s:%d: " fmt "\n", __FUNCTION__, __LINE__, __VA_ARGS__)
+#define STREQ(a,b) (strcmp((a),(b)) == 0)
+
+#ifndef ATTRIBUTE_UNUSED
+#define ATTRIBUTE_UNUSED __attribute__((__unused__))
+#endif
+
+/* handle globals */
+int h_fd = 0;
+int h_event = 0;
+virEventHandleCallback h_cb = NULL;
+void *h_opaque = NULL;
+
+/* timeout globals */
+#define TIMEOUT_MS 1000
+int t_timeout = -1;
+virEventTimeoutCallback t_cb = NULL;
+void *t_opaque = NULL;
+
+
+/* Prototypes */
+const char *eventToString(int event);
+int myDomainEventCallback1 (virConnectPtr conn, virDomainPtr dom, int event, void *opaque);
+int myDomainEventCallback2 (virConnectPtr conn, virDomainPtr dom, int event, void *opaque);
+
+int myEventAddHandleFunc (int fd, int event, virEventHandleCallback cb, void *opaque);
+void myEventUpdateHandleFunc(int fd, int event);
+int myEventRemoveHandleFunc(int fd);
+
+int myEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb, void *opaque);
+void myEventUpdateTimeoutFunc(int timer, int timout);
+int myEventRemoveTimeoutFunc(int timer);
+
+void usage(const char *pname);
+
+/* Callback functions */
+
+const char *eventToString(int event) {
+ const char *ret = NULL;
+ switch(event) {
+ case VIR_DOMAIN_EVENT_ADDED:
+ ret ="Added";
+ break;
+ case VIR_DOMAIN_EVENT_REMOVED:
+ ret ="Removed";
+ break;
+ case VIR_DOMAIN_EVENT_STARTED:
+ ret ="Started";
+ break;
+ case VIR_DOMAIN_EVENT_SUSPENDED:
+ ret ="Suspended";
+ break;
+ case VIR_DOMAIN_EVENT_RESUMED:
+ ret ="Resumed";
+ break;
+ case VIR_DOMAIN_EVENT_STOPPED:
+ ret ="Stopped";
+ break;
+ case VIR_DOMAIN_EVENT_SAVED:
+ ret ="Saved";
+ break;
+ case VIR_DOMAIN_EVENT_RESTORED:
+ ret ="Restored";
+ break;
+ default:
+ ret ="Unknown Event";
+ }
+ return ret;
+}
+
+int myDomainEventCallback1 (virConnectPtr conn ATTRIBUTE_UNUSED,
+ virDomainPtr dom,
+ int event,
+ void *opaque ATTRIBUTE_UNUSED)
+{
+ printf("%s EVENT: Domain %s(%d) %s\n", __FUNCTION__, virDomainGetName(dom), virDomainGetID(dom), eventToString(event));
+ return 0;
+}
+
+int myDomainEventCallback2 (virConnectPtr conn ATTRIBUTE_UNUSED,
+ virDomainPtr dom,
+ int event,
+ void *opaque ATTRIBUTE_UNUSED)
+{
+ printf("%s EVENT: Domain %s(%d) %s\n", __FUNCTION__, virDomainGetName(dom), virDomainGetID(dom), eventToString(event));
+ return 0;
+}
+
+
+/* EventImpl Functions */
+
+int myEventAddHandleFunc(int fd, int event, virEventHandleCallback cb, void *opaque)
+{
+ DEBUG("Add handle %d %d %p %p", fd, event, cb, opaque);
+ h_fd = fd;
+ h_event = event;
+ h_cb = cb;
+ h_opaque = opaque;
+ return 0;
+}
+
+void myEventUpdateHandleFunc(int fd, int event)
+{
+ DEBUG("Updated Handle %d %d", fd, event);
+ return;
+}
+
+int myEventRemoveHandleFunc(int fd)
+{
+ DEBUG("Removed Handle %d", fd);
+ return 0;
+}
+
+int myEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb, void *opaque)
+{
+ DEBUG("Adding Timeout %d %p %p", timeout, cb, opaque);
+ t_timeout = timeout;
+ t_cb = cb;
+ t_opaque = opaque;
+ return 0;
+}
+
+void myEventUpdateTimeoutFunc(int timer, int timeout)
+{
+ DEBUG("Timeout updated %d %d", timer, timeout);
+}
+
+int myEventRemoveTimeoutFunc(int timer)
+{
+ DEBUG("Timeout removed %d", timer);
+ return 0;
+}
+
+/* main test functions */
+
+void usage(const char *pname)
+{
+ printf("%s uri\n", pname);
+}
+
+int main(int argc, char **argv)
+{
+ int run=1;
+ int sts;
+
+ if(argc > 1 && STREQ(argv[1],"--help")) {
+ usage(argv[0]);
+ return -1;
+ }
+ virEventRegisterImpl( myEventAddHandleFunc,
+ myEventUpdateHandleFunc,
+ myEventRemoveHandleFunc,
+ myEventAddTimeoutFunc,
+ myEventUpdateTimeoutFunc,
+ myEventRemoveTimeoutFunc);
+
+ virConnectPtr dconn = NULL;
+ dconn = virConnectOpen (argv[1] ? argv[1] : "qemu:///system");
+ if (!dconn) {
+ printf("error opening\n");
+ return -1;
+ }
+
+ DEBUG0("Registering domain event cbs");
+
+ /* Add 2 callbacks to prove this works with more than just one */
+ virConnectDomainEventRegister(dconn, myDomainEventCallback1, NULL);
+ virConnectDomainEventRegister(dconn, myDomainEventCallback2, NULL);
+
+ while(run) {
+ struct pollfd pfd = { .fd = h_fd,
+ .events = h_event,
+ .revents = 0};
+
+ sts = poll(&pfd, 1, TIMEOUT_MS);
+
+ /* We are assuming timeout of 0 here - so execute every time */
+ if(t_cb)
+ t_cb(t_timeout,t_opaque);
+
+ if (sts == 0) {
+ /* DEBUG0("Poll timeout"); */
+ continue;
+ }
+ if (sts < 0 ) {
+ DEBUG0("Poll failed");
+ continue;
+ }
+ if ( pfd.revents & POLLHUP ) {
+ DEBUG0("Reset by peer");
+ return -1;
+ }
+
+ if(h_cb) {
+ h_cb(h_fd, h_event, h_opaque);
+ }
+
+ }
+
+ if( dconn && virConnectClose(dconn)<0 ) {
+ printf("error closing\n");
+ }
+ printf("done\n");
+ return 0;
+}
+
diff --git a/libvirt.spec.in b/libvirt.spec.in
index cfd4a66..450d907 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -249,6 +249,9 @@ rm -rf $RPM_BUILD_ROOT%{_datadir}/doc/libvirt-python-%{version}
rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/libvirt/qemu.conf
%endif
+# We don't want examples in the built rpm
+rm -f $RPM_BUILD_ROOT%{_bindir}/event-test
+
%clean
rm -fr %{buildroot}
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]