[Ovirt-devel] [PATCH matahari] Refactored the Host agent.
Ian Main
imain at redhat.com
Tue Apr 20 16:21:45 UTC 2010
On Thu, 2010-04-15 at 11:19 -0400, Darryl L. Pierce wrote:
> Replaced the previous HostWrapper class with the new HostAgent class,
> which more closely resembles the style of the ProcessorsAgent class.
>
> Deleted the HostWrapper class entirely.
>
> Refactored the daemon entry point to reduce the number of methods
> invoked in order to start or stop the HostAgent instance. Moved the
> NICWrapper's setupQMFObject method from private to public so that it can
> be invoked by the HostAgent. This is a temporary measure since the
> NICWrapper will be replaced by a future patch.
ACK
Ian
> Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>
> ---
> src/host.cpp | 263 +++++++++++++---------------------------------------
> src/host.h | 75 ++++-----------
> src/main.cpp | 57 ++++--------
> src/nic.h | 2 +-
> src/processors.cpp | 6 +
> src/processors.h | 3 +
> 6 files changed, 111 insertions(+), 295 deletions(-)
>
> diff --git a/src/host.cpp b/src/host.cpp
> index ac04f47..885068b 100644
> --- a/src/host.cpp
> +++ b/src/host.cpp
> @@ -37,213 +37,80 @@ using namespace std;
> using qpid::management::Manageable;
> namespace _qmf = qmf::com::redhat::matahari;
>
> -ostream& operator<<(ostream &output, const HostWrapper& host)
> +void
> +HostAgent::setup(ManagementAgent* agent)
> {
> - output << "Node" << endl << endl;
> - output << "UUID: " << host.uuid << endl;
> - output << "Hostname: " << host.hostname << endl;
> - output << "Memory: " << host.memory << endl;
> - output << "Hypervisor: " << host.hypervisor << endl;
> - output << "Arch: " << host.arch << endl << endl;
> -
> - vector<CPUWrapper*> cpus = host.cpus;
> - vector<NICWrapper*> nics = host.nics;
> -
> - for (vector<CPUWrapper*>::iterator iter = cpus.begin();
> - iter!= cpus.end();
> - iter++) {
> - output << **iter << endl;
> - }
> - for (vector<NICWrapper*>::iterator iter = nics.begin();
> - iter!= nics.end();
> - iter++) {
> - output << **iter << endl;
> + management_object = new _qmf::Host(agent, this);
> + agent->addObject(management_object);
> +
> + // discover the aspects of the host
> + processors.setup(agent, this);
> +
> + LibHalContext *hal_ctx;
> + int ret;
> +
> + // Get our HAL Context or die trying
> + hal_ctx = get_hal_ctx();
> + if (!hal_ctx)
> + throw runtime_error("Unable to get HAL Context Structure.");
> +
> + try {
> + NICWrapper::fillNICInfo(this->nics, agent, hal_ctx);
> +
> + // Host UUID
> + char *uuid_c = get_uuid(hal_ctx);
> + string uuid(uuid_c);
> + management_object->set_uuid(uuid);
> +
> + // Hostname
> + char hostname_c[HOST_NAME_MAX];
> + ret = gethostname(hostname_c, sizeof(hostname_c));
> + if (ret != 0)
> + throw runtime_error("Unable to get hostname");
> + string hostname(hostname_c);
> + management_object->set_hostname(hostname);
> +
> + // Hypervisor, arch, memory
> + management_object->set_memory(0);
> + management_object->set_hypervisor("unknown");
> + management_object->set_arch("unknown");
> +
> + virConnectPtr connection;
> + virNodeInfo info;
> + connection = virConnectOpenReadOnly(NULL);
> + if (connection) {
> + const char *hv = virConnectGetType(connection);
> + if (hv != NULL)
> + management_object->set_hypervisor(hv);
> + ret = virNodeGetInfo(connection, &info);
> + if (ret == 0) {
> + management_object->set_arch(info.model);
> + management_object->set_memory(info.memory);
> + }
> }
> + virConnectClose(connection);
>
> - output << "End Node" << endl;
> - return output;
> -}
> + management_object->set_beeping(false);
>
> -void HostWrapper::doLoop(void)
> -{
> - // Someday we might update statistics too!
> - while(1)
> + // setup the nic objects
> + for(vector<NICWrapper*>::iterator iter = nics.begin();
> + iter != nics.end();
> + iter++)
> {
> - // update all statistics
> - processors.update_load_averages();
> - sleep(5);
> - }
> -}
> -
> -void HostWrapper::setupQMFObjects(ManagementAgent *agent)
> -{
> - // Set up Host object
> - mgmt_object = new _qmf::Host(agent, this);
> - agent->addObject(mgmt_object);
> - syncQMFHostObject();
> -
> - processors.setup(agent, this);
> -
> - // Iterate over list and set up CPU objects
> - for (vector<CPUWrapper*>::iterator iter = cpus.begin();
> - iter!= cpus.end();
> - iter++) {
> - (*iter)->setupQMFObject(agent, this);
> - }
> - // Iterate over list and set up NIC objects
> - for (vector<NICWrapper*>::iterator iter = nics.begin();
> - iter!= nics.end();
> - iter++) {
> (*iter)->setupQMFObject(agent, this);
> - }
> -}
> -
> -void HostWrapper::syncQMFHostObject(void)
> -{
> - mgmt_object->set_uuid(uuid);
> - mgmt_object->set_hostname(hostname);
> - mgmt_object->set_memory(memory);
> - mgmt_object->set_hypervisor(hypervisor);
> - mgmt_object->set_arch(arch);
> - mgmt_object->set_beeping(beeping);
> -}
> -
> -void HostWrapper::cleanupQMFObjects(void)
> -{
> - // Clean up Host object
> - mgmt_object->resourceDestroy();
> -
> - // Iterate over list and clean up CPU objects
> - for (vector<CPUWrapper*>::iterator iter = cpus.begin();
> - iter!= cpus.end();
> - iter++) {
> - (*iter)->cleanupQMFObject();
> - }
> - // Iterate over list and clean up NIC objects
> - for (vector<NICWrapper*>::iterator iter = nics.begin();
> - iter!= nics.end();
> - iter++) {
> - (*iter)->cleanupQMFObject();
> - }
> -}
> -
> -void HostWrapper::cleanupMemberObjects(void)
> -{
> - // Get rid of the CPUWrapper objects for this host
> - for (vector<CPUWrapper*>::iterator iter = cpus.begin(); iter != cpus.end();) {
> - delete (*iter);
> - iter = cpus.erase(iter);
> - }
> - // Get rid of the NICWrapper objects for this host
> - for (vector<NICWrapper*>::iterator iter = nics.begin(); iter != nics.end();) {
> - delete (*iter);
> - iter = nics.erase(iter);
> - }
> -}
> -
> -void HostWrapper::disposeHostWrapper()
> -{
> - if (hostSingleton == NULL)
> - return;
> -
> - hostSingleton->cleanupQMFObjects();
> - hostSingleton->cleanupMemberObjects();
> -
> - delete hostSingleton;
> - hostSingleton = NULL;
> -}
> -
> -HostWrapper* HostWrapper::setupHostWrapper(ManagementAgent *agent)
> -{
> - if (hostSingleton != NULL)
> - return hostSingleton;
> -
> - LibHalContext *hal_ctx;
> - int ret;
> -
> - // Get our HAL Context or die trying
> - hal_ctx = get_hal_ctx();
> - if (!hal_ctx)
> - throw runtime_error("Unable to get HAL Context Structure.");
> -
> - HostWrapper *host = new HostWrapper();
> -
> - try {
> - CPUWrapper::fillCPUInfo(host->cpus, agent);
> - NICWrapper::fillNICInfo(host->nics, agent, hal_ctx);
> -
> - // Host UUID
> - char *uuid_c = get_uuid(hal_ctx);
> - string uuid(uuid_c);
> - host->uuid = uuid;
> -
> - // Hostname
> - char hostname_c[HOST_NAME_MAX];
> - ret = gethostname(hostname_c, sizeof(hostname_c));
> - if (ret != 0)
> - throw runtime_error("Unable to get hostname");
> - string hostname(hostname_c);
> - host->hostname = hostname;
> -
> - // Hypervisor, arch, memory
> - host->memory = 0;
> - host->hypervisor = "unknown";
> - host->arch = "unknown";
> -
> - virConnectPtr connection;
> - virNodeInfo info;
> - connection = virConnectOpenReadOnly(NULL);
> - if (connection) {
> - const char *hv = virConnectGetType(connection);
> - if (hv != NULL)
> - host->hypervisor = hv;
> - ret = virNodeGetInfo(connection, &info);
> - if (ret == 0) {
> - host->arch = info.model;
> - host->memory = info.memory;
> - }
> - }
> - virConnectClose(connection);
> -
> - host->beeping = false;
> - }
> - catch (...) {
> - host->cleanupMemberObjects();
> - put_hal_ctx(hal_ctx);
> - delete host;
> - throw;
> - }
> -
> - // Close the Hal Context
> + }
> + }
> + catch (...) {
> put_hal_ctx(hal_ctx);
> + throw;
> + }
>
> - host->setupQMFObjects(agent);
> -
> - // Setup singleton reference and return
> - hostSingleton = host;
> - return hostSingleton;
> + // Close the Hal Context
> + put_hal_ctx(hal_ctx);
> }
>
> -void HostWrapper::reboot()
> +void
> +HostAgent::update(void)
> {
> - system("shutdown -r now");
> -}
> -
> -void HostWrapper::shutdown()
> -{
> - system("shutdown -h now");
> -}
> -
> -Manageable::status_t
> -HostWrapper::ManagementMethod(uint32_t methodId, Args& args, string& text)
> -{
> - switch(methodId) {
> - case _qmf::Host::METHOD_SHUTDOWN:
> - shutdown();
> - return Manageable::STATUS_OK;
> - case _qmf::Host::METHOD_REBOOT:
> - reboot();
> - return Manageable::STATUS_OK;
> - }
> - return Manageable::STATUS_NOT_IMPLEMENTED;
> + processors.update();
> }
> diff --git a/src/host.h b/src/host.h
> index 148c91f..c19da3e 100644
> --- a/src/host.h
> +++ b/src/host.h
> @@ -1,3 +1,6 @@
> +#ifndef __HOST_H
> +#define __HOST_H
> +
> /* host.h - Copyright (C) 2009 Red Hat, Inc.
> * Written by Arjun Roy <arroy at redhat.com>
> *
> @@ -32,67 +35,25 @@ using namespace std;
>
> using qpid::management::Manageable;
>
> -class HostWrapper : public Manageable
> +class HostAgent : public Manageable
> {
> - static HostWrapper *hostSingleton;
> -
> - friend ostream& operator<<(ostream &output, const HostWrapper& host);
> -
> - // Host Parameters
> - string uuid;
> - string hostname;
> - string hypervisor;
> - string arch;
> - bool beeping;
> - int memory;
> -
> - // Aggregated components
> - vector<CPUWrapper*> cpus;
> - vector<NICWrapper*> nics;
> -
> - ProcessorsAgent processors;
> -
> - // QMF related fields
> - ManagementAgent *agent;
> - qmf::com::redhat::matahari::Host *mgmt_object;
> -
> - // Methods to put up / take down QMF objects
> - void setupQMFObjects(ManagementAgent *agent);
> - void cleanupQMFObjects(void);
> -
> - // Housekeeping methods
> - void syncQMFHostObject(void);
> - void cleanupMemberObjects(void);
> -
> - // Host functionality
> - void reboot();
> - void shutdown();
> -
> - // Constructors and Destructor are private
> - HostWrapper() {}
> - HostWrapper(const HostWrapper &) {}
> - ~HostWrapper() {}
> + private:
> + qmf::com::redhat::matahari::Host* management_object;
> + ProcessorsAgent processors;
> + vector<NICWrapper*> nics;
>
> public:
> - // Factory methods to create/dispose of the singleton
> - static HostWrapper *setupHostWrapper(ManagementAgent *agent);
> - static void disposeHostWrapper(void);
> -
> - // QMF Methods
> - ManagementObject* GetManagementObject(void) const { return mgmt_object; }
> - status_t ManagementMethod(uint32_t methodId, Args& args, string& text);
> + HostAgent() {}
> + virtual ~HostAgent() {}
>
> - // Field Accessors
> - const string &getUUID(void) { return uuid; }
> - const string &getHostname(void) { return hostname; }
> - const string &getHypervisor(void) { return hypervisor; }
> - const string &getArch(void) { return arch; }
> - bool isBeeping(void) { return beeping; }
> - int getMemory(void) { return memory; }
> + ManagementObject* GetManagementObject(void) const { return management_object; }
>
> - const vector<CPUWrapper*> &getCPUList(void) { return cpus; }
> - const vector<NICWrapper*> &getNICList(void) { return nics; }
> + void setup(ManagementAgent* agent);
> + void update(void);
>
> - // Main Loop
> - void doLoop(void);
> + // agent methods
> + void shutdown(void);
> + void reboot(void);
> };
> +
> +#endif // __HOST_H
> diff --git a/src/main.cpp b/src/main.cpp
> index 002a02e..8493864 100644
> --- a/src/main.cpp
> +++ b/src/main.cpp
> @@ -42,18 +42,11 @@ namespace _qmf = qmf::com::redhat::matahari;
>
> // Global Variables
> ManagementAgent::Singleton* singleton;
> -HostWrapper* HostWrapper::hostSingleton = NULL;
>
> -void cleanup(void)
> +void
> +shutdown(int /*signal*/)
> {
> - HostWrapper::disposeHostWrapper();
> - delete singleton;
> -}
> -
> -void shutdown(int)
> -{
> - cleanup();
> - exit(0);
> + exit(0);
> }
>
> static void
> @@ -69,21 +62,22 @@ print_usage()
> printf("\t-p | --port specify broker port.\n");
> }
>
> -int do_main(int argc, char **argv)
> +int
> +main(int argc, char **argv)
> {
> int arg;
> int idx = 0;
> bool daemonize = false;
> bool gssapi = false;
> bool verbose = false;
> - char *host = NULL;
> + char *servername = NULL;
> char *username = NULL;
> char *service = NULL;
> - int port = 5672;
> + int serverport = 5672;
>
> ConnectionSettings settings;
> ManagementAgent *agent;
> - HostWrapper *hostWrapper;
> + HostAgent host;
>
> struct option opt[] = {
> {"help", no_argument, NULL, 'h'},
> @@ -131,7 +125,7 @@ int do_main(int argc, char **argv)
> break;
> case 'p':
> if (optarg) {
> - port = atoi(optarg);
> + serverport = atoi(optarg);
> } else {
> print_usage();
> exit(1);
> @@ -139,7 +133,7 @@ int do_main(int argc, char **argv)
> break;
> case 'b':
> if (optarg) {
> - host = strdup(optarg);
> + servername = strdup(optarg);
> } else {
> print_usage();
> exit(1);
> @@ -169,8 +163,8 @@ int do_main(int argc, char **argv)
> signal(SIGINT, shutdown);
>
> // Connect to the broker
> - settings.host = host ? host : "127.0.0.1";
> - settings.port = port;
> + settings.host = servername ? servername : "127.0.0.1";
> + settings.port = serverport;
>
> if (username != NULL) {
> settings.username = username;
> @@ -185,28 +179,13 @@ int do_main(int argc, char **argv)
> agent->init(settings, 5, false, ".magentdata");
>
> // Get the info and post it to the broker
> - try {
> - hostWrapper = HostWrapper::setupHostWrapper(agent);
> - }
> - catch (...) {
> - cleanup();
> - throw;
> - }
> + host.setup(agent);
>
> - // Main loop
> - hostWrapper->doLoop();
> + while(1)
> + {
> + host.update();
> + sleep(5);
> + }
>
> - // And we are done
> - cleanup();
> return 0;
> }
> -
> -int main(int argc, char** argv)
> -{
> - try {
> - return do_main(argc, argv);
> - }
> - catch(std::exception& e) {
> - cout << "Top Level Exception: " << e.what() << endl;
> - }
> -}
> diff --git a/src/nic.h b/src/nic.h
> index 15f31fb..c79ecf9 100644
> --- a/src/nic.h
> +++ b/src/nic.h
> @@ -47,7 +47,6 @@ class NICWrapper : public Manageable
> qmf::com::redhat::matahari::NIC *mgmt_object;
>
> // Methods to put up / take down QMF Objects
> - void setupQMFObject(ManagementAgent *agent, Manageable *parent);
> void cleanupQMFObject(void);
> void syncQMFObject(void);
>
> @@ -77,6 +76,7 @@ class NICWrapper : public Manageable
> int identifyNIC(int seconds);
> public:
>
> + void setupQMFObject(ManagementAgent *agent, Manageable *parent);
> // Factory like method
> static void fillNICInfo(vector<NICWrapper*> &nics,
> ManagementAgent *agent,
> diff --git a/src/processors.cpp b/src/processors.cpp
> index 4317b1f..cff66d9 100644
> --- a/src/processors.cpp
> +++ b/src/processors.cpp
> @@ -57,6 +57,12 @@ ProcessorsAgent::setup(ManagementAgent* agent, Manageable* parent)
> }
>
> void
> +ProcessorsAgent::update(void) const
> +{
> + update_load_averages();
> +}
> +
> +void
> ProcessorsAgent::update_load_averages(void) const
> {
> double load_average;
> diff --git a/src/processors.h b/src/processors.h
> index 3e46b16..17a6a6a 100644
> --- a/src/processors.h
> +++ b/src/processors.h
> @@ -42,6 +42,9 @@ class ProcessorsAgent : public Manageable
>
> void setup(ManagementAgent* agent, Manageable* parent);
>
> + void update(void) const;
> +
> + private:
> // agent methods
> void update_load_averages(void) const;
> };
More information about the ovirt-devel
mailing list