Looks good to me. Ack
On Wed, Jul 13, 2011 at 2:29 AM, Zane Bitter zbitter@redhat.com wrote:
AUTHORS | 2 configure.ac | 1 libvirt-qpid.spec | 2 src/LibvirtAgent.cpp | 97 ++++++++++++++++++++++++ src/LibvirtAgent.h | 36 +++++++++ src/Makefile.am | 7 +- src/NodeWrap.cpp | 203 +++++--------------------------------------------- src/NodeWrap.h | 22 +---- 8 files changed, 169 insertions(+), 201 deletions(-) create mode 100644 src/LibvirtAgent.cpp create mode 100644 src/LibvirtAgent.h
diff --git a/AUTHORS b/AUTHORS index 367ea49..8af5aba 100644 --- a/AUTHORS +++ b/AUTHORS @@ -9,6 +9,6 @@ Patches have also been contributed by:
Ted Ross tross@redhat.com
-Conversion to QMFv2 API by: +Conversion to matahari agent and QMFv2 API by:
Zane Bitter zbitter@redhat.com diff --git a/configure.ac b/configure.ac index 3896d9d..03bbb80 100644 --- a/configure.ac +++ b/configure.ac @@ -21,6 +21,7 @@ dnl Required minimum versions of all libs we depend on LIBVIRT_REQUIRED="4.4.0"
PKG_CHECK_MODULES(XML, libxml-2.0) +PKG_CHECK_MODULES([DEPS], [glib-2.0])
AC_OUTPUT(Makefile src/Makefile doc/Makefile)
diff --git a/libvirt-qpid.spec b/libvirt-qpid.spec index d64552d..c8a88fd 100644 --- a/libvirt-qpid.spec +++ b/libvirt-qpid.spec @@ -10,6 +10,7 @@ Requires: libxml2 >= 2.7.1 Requires: qmf >= 0.5.790661 Requires: qpid-cpp-client >= 0.10 Requires: libvirt >= 0.4.4 +Requires: matahari-lib >= 0.4.1 Requires(post): /sbin/chkconfig Requires(preun): /sbin/chkconfig Requires(preun): initscripts @@ -17,6 +18,7 @@ BuildRequires: qpid-cpp-client-devel >= 0.10 BuildRequires: libxml2-devel >= 2.7.1 BuildRequires: libvirt-devel >= 0.5.0 BuildRequires: qmf-devel >= 0.5.790661 +BuildRequires: matahari-devel >= 0.4.1 Url: http://libvirt.org/qpid
%description diff --git a/src/LibvirtAgent.cpp b/src/LibvirtAgent.cpp new file mode 100644 index 0000000..deb77ca --- /dev/null +++ b/src/LibvirtAgent.cpp @@ -0,0 +1,97 @@ +#include "LibvirtAgent.h" +#include "NodeWrap.h" +#include "Exception.h"
+#include <syslog.h>
+#define POLL_TIME_s 3
+static gboolean handleTimer(gpointer user_data) +{
- LibvirtAgent *agent = (LibvirtAgent *)user_data;
- if (agent) {
- agent->updateData();
- return TRUE;
- }
- return FALSE;
+}
+int +LibvirtAgent::setup(qmf::AgentSession session) +{
- _package.configure(session);
- initErrorSchema(session);
- _node = new NodeWrap(this);
- _timer = g_timeout_add_seconds(POLL_TIME_s, &handleTimer, this);
- return 0;
+}
+LibvirtAgent::~LibvirtAgent() +{
- if (_timer) {
- g_source_remove(_timer);
- }
- delete _node;
+}
+void +LibvirtAgent::addData(qmf::Data& data) +{
- _agent_session.addData(data);
+}
+void +LibvirtAgent::delData(qmf::Data& data) +{
- _agent_session.delData(data.getAddr());
+}
+gboolean +LibvirtAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event,
- gpointer user_data)
+{
- if (event.getType() != qmf::AGENT_METHOD) {
- return TRUE;
- }
- bool handled = _node->handleMethod(session, event);
- if (!handled) {
- raiseException(session, event,
- ERROR_UNKNOWN_OBJECT, STATUS_UNKNOWN_OBJECT);
- }
- return TRUE;
+}
+void +LibvirtAgent::updateData(void) +{
- if (_node) {
- _node->poll();
- }
+}
+int +main(int argc, char **argv) +{
- LibvirtAgent agent;
- int rc = agent.init(argc, argv, "libvirt");
- openlog("libvirt-qpid", 0, LOG_DAEMON);
- // This prevents us from dying if libvirt disconnects.
- signal(SIGPIPE, SIG_IGN);
- if (rc == 0) {
- agent.run();
- }
- return rc;
+}
diff --git a/src/LibvirtAgent.h b/src/LibvirtAgent.h new file mode 100644 index 0000000..3b2a940 --- /dev/null +++ b/src/LibvirtAgent.h @@ -0,0 +1,36 @@ +#ifndef LIBVIRT_AGENT_H +#define LIBVIRT_AGENT_H
+#include <matahari/mh_agent.h> +#include "QmfPackage.h" +#include "ManagedObject.h"
+class NodeWrap;
+class LibvirtAgent:
- public MatahariAgent,
- public PackageOwnerqmf::com::redhat::libvirt::PackageDefinition
+{ +public:
- ~LibvirtAgent();
- int setup(qmf::AgentSession session);
- gboolean invoke(qmf::AgentSession session, qmf::AgentEvent event,
- gpointer user_data);
- PackageDefinition& package(void) { return _package; }
- void addData(qmf::Data& data);
- void delData(qmf::Data& data);
- void updateData(void);
+private:
- PackageDefinition _package;
- NodeWrap *_node;
- int _timer;
+};
+#endif
diff --git a/src/Makefile.am b/src/Makefile.am index 4bb27b2..40d9371 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ ## Process this file with automake to produce Makefile.in
-INCLUDES = -I$(top_srcdir)/src/qmf/com/redhat/libvirt $(XML_CFLAGS) +INCLUDES = -I$(top_srcdir)/src/qmf/com/redhat/libvirt
sbin_PROGRAMS = libvirt-qpid
@@ -11,6 +11,7 @@ generated_file_list = \ nodist_libvirt_qpid_SOURCES = $(generated_file_list)
libvirt_qpid_SOURCES = \
- LibvirtAgent.cpp \
DomainWrap.cpp \ Error.cpp \ Exception.cpp \ @@ -18,6 +19,7 @@ libvirt_qpid_SOURCES = \ PoolWrap.cpp \ VolumeWrap.cpp \ ManagedObject.h \
- LibvirtAgent.h \
DomainWrap.h \ Error.h \ Exception.h \ @@ -33,7 +35,8 @@ $(generated_file_list): .libvirt-schema.xml.tstamp BUILT_SOURCES = $(generated_file_list) CLEANFILES = $(generated_file_list) .libvirt-schema.xml.tstamp
-libvirt_qpid_LDADD = -lqmf2 -lqpidtypes -lqpidcommon -lqpidmessaging -lvirt $(XML_LIBS) +libvirt_qpid_CXXFLAGS = $(XML_CFLAGS) $(DEPS_CFLAGS) +libvirt_qpid_LDADD = -lqmf2 -lqpidtypes -lqpidcommon -lqpidmessaging -lmcommon -lmcommon_qmf -lvirt $(XML_LIBS) $(DEPS_LIBS)
dist_pkgdata_DATA = libvirt-schema.xml
diff --git a/src/NodeWrap.cpp b/src/NodeWrap.cpp index 40c4339..f68e666 100644 --- a/src/NodeWrap.cpp +++ b/src/NodeWrap.cpp @@ -4,7 +4,6 @@ #include <errno.h> #include <unistd.h> #include <getopt.h> -#include <syslog.h> #include <signal.h> #include <cstdio>
@@ -15,10 +14,10 @@ #include "Exception.h"
-NodeWrap::NodeWrap(qmf::AgentSession& agent_session, PackageDefinition& package):
- ManagedObject(package.data_node),
- _session(agent_session),
- _package(package)
+NodeWrap::NodeWrap(LibvirtAgent *agent):
- PackageOwnerLibvirtAgent::PackageDefinition(agent),
- ManagedObject(package().data_node),
- _agent(agent)
{ virNodeInfo info; char *hostname; @@ -354,46 +353,27 @@ void NodeWrap::syncPools(void) } }
-void NodeWrap::doLoop() +void +NodeWrap::poll(void) {
- fd_set fds;
- struct timeval tv;
- int retval;
- /* Go through all domains and call update() for each, letting them update
- * information and statistics. */
- while (1) {
- // We're using this to check to see if our connection is still good.
- // I don't see any reason this call should fail unless there is some
- // connection problem..
- int maxname = virConnectNumOfDefinedDomains(_conn);
- if (maxname < 0) {
- return;
- }
- // We're using this to check to see if our connection is still good.
- // I don't see any reason this call should fail unless there is some
- // connection problem..
- int maxname = virConnectNumOfDefinedDomains(_conn);
- if (maxname < 0) {
- return;
- }
- syncDomains();
- syncPools();
- for (DomainList::iterator iter = _domains.begin();
- iter != _domains.end(); iter++) {
- (*iter)->update();
- }
- for (PoolList::iterator iter = _pools.begin();
- iter != _pools.end(); iter++) {
- (*iter)->update();
- }
- qmf::AgentEvent event;
- if (_session.nextEvent(event, qpid::messaging::Duration(3000))) {
- if (event.getType() == qmf::AGENT_METHOD) {
- bool handled = handleMethod(_session, event);
- if (!handled) {
- raiseException(_session, event,
- ERROR_UNKNOWN_OBJECT, STATUS_UNKNOWN_OBJECT);
- }
- }
- }
syncDomains();
syncPools();
for (DomainList::iterator iter = _domains.begin();
iter != _domains.end(); iter++) {
(*iter)->update();
}
for (PoolList::iterator iter = _pools.begin();
iter != _pools.end(); iter++) {
(*iter)->update();
} }
@@ -570,142 +550,3 @@ NodeWrap::handleMethod(qmf::AgentSession& session, qmf::AgentEvent& event) } }
-static void -print_usage() -{
- printf("Usage:\tlibvirt-qpid <options>\n");
- printf("\t-d | --daemon run as a daemon.\n");
- printf("\t-h | --help print this help message.\n");
- printf("\t-b | --broker specify broker host name..\n");
- printf("\t-u | --username username to use for authentication purproses.\n");
- printf("\t-s | --service service name to use for authentication purproses.\n");
- printf("\t-p | --port specify broker port.\n");
-}
-//============================================================== -// Main program -//============================================================== -int main(int argc, char** argv) {
- int arg;
- int idx = 0;
- bool verbose = false;
- bool daemonize = false;
- const char *host = NULL;
- char *username = NULL;
- char *service = NULL;
- int port = 5672;
- struct option opt[] = {
- {"help", 0, 0, 'h'},
- {"daemon", 0, 0, 'd'},
- {"broker", 1, 0, 'b'},
- {"username", 1, 0, 'u'},
- {"service", 1, 0, 's'},
- {"port", 1, 0, 'p'},
- {0, 0, 0, 0}
- };
- while ((arg = getopt_long(argc, argv, "hdb:u:s:p:", opt, &idx)) != -1) {
- switch (arg) {
- case 'h':
- case '?':
- print_usage();
- exit(0);
- break;
- case 'd':
- daemonize = true;
- break;
- case 'v':
- verbose = true;
- break;
- case 's':
- if (optarg) {
- service = strdup(optarg);
- } else {
- print_usage();
- exit(1);
- }
- break;
- case 'u':
- if (optarg) {
- username = strdup(optarg);
- } else {
- print_usage();
- exit(1);
- }
- break;
- case 'p':
- if (optarg) {
- port = atoi(optarg);
- } else {
- print_usage();
- exit(1);
- }
- break;
- case 'b':
- if (optarg) {
- host = strdup(optarg);
- } else {
- print_usage();
- exit(1);
- }
- break;
- default:
- fprintf(stderr, "unsupported option '-%c'. See --help.\n", arg);
- print_usage();
- exit(0);
- break;
- }
- }
- if (daemonize == true) {
- if (daemon(0, 0) < 0) {
- fprintf(stderr, "Error daemonizing: %s\n", strerror(errno));
- exit(1);
- }
- }
- openlog("libvirt-qpid", 0, LOG_DAEMON);
- // This prevents us from dying if libvirt disconnects.
- signal(SIGPIPE, SIG_IGN);
- qpid::types::Variant::Map options;
- if (username != NULL) {
- options["username"] = username;
- }
- if (service != NULL) {
- options["service"] = service;
- }
- if (host == NULL) {
- host = "127.0.0.1";
- }
- std::stringstream url;
- url << "amqp:" << "tcp" << ":" << host << ":" << port;
- qpid::messaging::Connection amqp_connection(url.str(), options);
- amqp_connection.open();
- qmf::AgentSession session(amqp_connection);
- session.setVendor("redhat.com");
- session.setProduct("libvirt-qpid");
- session.setAttribute("hostname", host);
- session.open();
- NodeWrap::PackageDefinition package;
- package.configure(session);
- initErrorSchema(session);
- while (true) {
- try {
- NodeWrap node(session, package);
- node.doLoop();
- } catch (int err) { }
- sleep(10);
- }
-} diff --git a/src/NodeWrap.h b/src/NodeWrap.h index 6f55061..b1ee98a 100644 --- a/src/NodeWrap.h +++ b/src/NodeWrap.h @@ -1,8 +1,7 @@ #ifndef NODE_WRAP_H #define NODE_WRAP_H
-#include "ManagedObject.h" -#include "QmfPackage.h" +#include "LibvirtAgent.h"
#include <unistd.h> #include <cstdlib> @@ -19,7 +18,7 @@ class DomainWrap; class PoolWrap;
class NodeWrap:
- public PackageOwnerqmf::com::redhat::libvirt::PackageDefinition,
- public PackageOwnerLibvirtAgent::PackageDefinition,
public ManagedObject { typedef std::vector<DomainWrap*> DomainList; @@ -30,27 +29,16 @@ class NodeWrap:
virConnectPtr _conn;
- qmf::AgentSession& _session;
- PackageDefinition& _package;
- LibvirtAgent *_agent;
public:
- NodeWrap(qmf::AgentSession& agent_session, PackageDefinition& package);
- NodeWrap(LibvirtAgent *agent);
~NodeWrap();
- void doLoop();
- void poll(void);
bool handleMethod(qmf::AgentSession& session, qmf::AgentEvent& event);
- virtual PackageDefinition& package(void) { return _package; }
- virtual void addData(qmf::Data& data) {
- _session.addData(data);
- }
- virtual void delData(qmf::Data& data) {
- _session.delData(data.getAddr());
- }
protected: void syncDomains(void); void syncPools(void);
Matahari mailing list Matahari@lists.fedorahosted.org https://fedorahosted.org/mailman/listinfo/matahari