[libvirt] [Matahari] [libvirt-qpid PATCH 3/3] Make libvirt-qpid a matahari agent

Andrew Beekhof andrew at beekhof.net
Wed Jul 13 07:00:07 UTC 2011


Looks good to me. Ack

On Wed, Jul 13, 2011 at 2:29 AM, Zane Bitter <zbitter at 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 at redhat.com>
>
> -Conversion to QMFv2 API by:
> +Conversion to matahari agent and QMFv2 API by:
>
>   Zane Bitter           <zbitter at 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 PackageOwner<qmf::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):
> +    PackageOwner<LibvirtAgent::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 PackageOwner<qmf::com::redhat::libvirt::PackageDefinition>,
> +    public PackageOwner<LibvirtAgent::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 at lists.fedorahosted.org
> https://fedorahosted.org/mailman/listinfo/matahari
>




More information about the libvir-list mailing list