[Ovirt-devel] [Matahari] [PATCH matahari] Moved all host-specific data gather to the Platform implementation.

Andrew Beekhof andrew at beekhof.net
Wed Jun 2 11:00:33 UTC 2010


As we talked about in the meeting, rather than being embedded in
objects, the logic for things like parsing "/var/lib/dbus/machine-id"
needs to be in a C function that the objects call out to.

On Tue, Jun 1, 2010 at 8:12 PM, Darryl L. Pierce <dpierce at redhat.com> wrote:
> Since the previous code was very Linux-specific, it had to move out into
> the platform layer to keep the code OS-agnostic.
>
> Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>
> ---
>  src/host.cpp           |   62 +++++-----------------------------------------
>  src/host.h             |    5 ----
>  src/linux_platform.cpp |   63 +++++++++++++++++++++++++++++++++++++++++++----
>  src/platform.h         |   18 +++++++++++++
>  4 files changed, 82 insertions(+), 66 deletions(-)
>
> diff --git a/src/host.cpp b/src/host.cpp
> index ecaf082..aa44d49 100644
> --- a/src/host.cpp
> +++ b/src/host.cpp
> @@ -29,57 +29,9 @@
>
>  using namespace std;
>
> -const string UNKNOWN("Unknow");
> -
>  Host::Host()
> -  :_uuid(UNKNOWN)
> -  ,_hostname(UNKNOWN)
> -  ,_hypervisor(UNKNOWN)
> -  ,_architecture(UNKNOWN)
> -  ,_memory(0)
> -  ,_beeping(false)
> -  ,_heartbeat_sequence(0)
> -{
> -  struct utsname details;
> -  std::ifstream input("/var/lib/dbus/machine-id");
> -
> -  if(input.is_open())
> -    {
> -      string uuid;
> -
> -      getline(input, uuid);
> -      input.close();
> -      this->_uuid = uuid;
> -    }
> -
> -  if(!uname(&details))
> -    {
> -      this->_hostname     = string(details.nodename);
> -      this->_architecture = string(details.machine);
> -    }
> -  else
> -    {
> -      throw runtime_error("Unable to retrieve system details");
> -    }
> -
> -  virConnectPtr lvconn = virConnectOpenReadOnly(NULL);
> -
> -  if(lvconn)
> -    {
> -      this->_hypervisor = string(virConnectGetType(lvconn));
> -      virConnectClose(lvconn);
> -    }
> -
> -  struct sysinfo sysinf;
> -  if(!sysinfo(&sysinf))
> -    {
> -      this->_memory = sysinf.totalram / 1024L;
> -    }
> -  else
> -    {
> -      throw runtime_error("Unable to retrieve system memory details.");
> -    }
> -}
> +  :_heartbeat_sequence(0)
> +{ }
>
>  void
>  Host::update()
> @@ -120,31 +72,31 @@ Host::removeHostListener(HostListener* listener)
>  string
>  Host:: getUUID() const
>  {
> -  return _uuid;
> +  return Platform::instance()->getUUID();
>  }
>
>  string
>  Host::getHostname() const
>  {
> -  return _hostname;
> +  return Platform::instance()->getHostname();
>  }
>
>  string
>  Host::getHypervisor() const
>  {
> -  return _hypervisor;
> +  return Platform::instance()->getHypervisor();
>  }
>
>  string
>  Host::getArchitecture() const
>  {
> -  return _architecture;
> +  return Platform::instance()->getArchitecture();
>  }
>
>  unsigned int
>  Host::getMemory() const
>  {
> -  return _memory;
> +  return Platform::instance()->getMemory();
>  }
>
>  bool
> diff --git a/src/host.h b/src/host.h
> index ee70843..5a7eb2a 100644
> --- a/src/host.h
> +++ b/src/host.h
> @@ -34,11 +34,6 @@ using namespace std;
>  class Host
>  {
>  private:
> -  string          _uuid;
> -  string          _hostname;
> -  string          _hypervisor;
> -  string          _architecture;
> -  unsigned int    _memory;
>   bool            _beeping;
>   unsigned int    _heartbeat_sequence;
>
> diff --git a/src/linux_platform.cpp b/src/linux_platform.cpp
> index b05a327..0f71d23 100644
> --- a/src/linux_platform.cpp
> +++ b/src/linux_platform.cpp
> @@ -21,11 +21,16 @@
>  #include <iomanip>
>  #include <iostream>
>  #include <dirent.h>
> +#include <libvirt/libvirt.h>
>  #include <net/if.h>
>  #include <pcre.h>
>  #include <stdexcept>
>  #include <string.h>
>  #include <sys/ioctl.h>
> +#include <sys/sysinfo.h>
> +#include <sys/utsname.h>
> +
> +using namespace std;
>
>  // TODO remove this wrapper once rhbz#583747 is fixed
>  extern "C" {
> @@ -34,10 +39,54 @@ extern "C" {
>
>  #include "linux_platform.h"
>
> +using namespace std;
> +
>  LinuxPlatform::LinuxPlatform()
>  {
> +  struct utsname details;
> +  ifstream *input;
> +
> +  input = new ifstream("/var/lib/dbus/machine-id");
> +
> +  if(input->is_open())
> +    {
> +      string uuid;
> +
> +      getline(*input, uuid);
> +      input->close();
> +      delete input;
> +      this->setUUID(uuid);
> +    }
> +
> +  if(!uname(&details))
> +    {
> +      this->setHostname(string(details.nodename));
> +      this->setArchitecture(string(details.machine));
> +    }
> +  else
> +    {
> +      throw runtime_error("Unable to retrieve system details");
> +    }
> +
> +  virConnectPtr lvconn = virConnectOpenReadOnly(NULL);
> +
> +  if(lvconn)
> +    {
> +      this->setHypervisor(string(virConnectGetType(lvconn)));
> +      virConnectClose(lvconn);
> +    }
> +
> +  struct sysinfo sysinf;
> +  if(!sysinfo(&sysinf))
> +    {
> +      this->setMemory(sysinf.totalram / 1024L);
> +    }
> +  else
> +    {
> +      throw runtime_error("Unable to retrieve system memory details.");
> +    }
> +
>   int cpu_count = 0;
> -  string model = "unknown";
>
>   struct udev* udev = udev_new();
>   struct udev_enumerate* enumerator = udev_enumerate_new(udev);
> @@ -58,8 +107,9 @@ LinuxPlatform::LinuxPlatform()
>   udev_enumerate_unref(enumerator);
>   udev_unref(udev);
>
> -  ifstream input("/proc/cpuinfo");
> -  if(input.is_open())
> +  input = new ifstream("/proc/cpuinfo");
> +
> +  if(input->is_open())
>     {
>       string regexstr = "(.*\\S)\\s*:\\s*(\\S.*)";
>       int expected = 3;
> @@ -73,11 +123,11 @@ LinuxPlatform::LinuxPlatform()
>       regex = pcre_compile(regexstr.c_str(), 0, &pcre_error, &pcre_error_offset, NULL);
>       if(!regex) { throw runtime_error("Unable to compile regular expression."); }
>
> -      while(!input.eof() && !done)
> +      while(!input->eof() && !done)
>         {
>           string line;
>
> -          getline(input, line);
> +          getline(*input, line);
>           int match = pcre_exec(regex, NULL, line.c_str(), line.length(),
>                                 0, PCRE_NOTEMPTY,found, expected * 3);
>
> @@ -104,7 +154,8 @@ LinuxPlatform::LinuxPlatform()
>                 }
>             }
>         }
> -      input.close();
> +      input->close();
> +      delete input;
>     }
>  }
>
> diff --git a/src/platform.h b/src/platform.h
> index ba70378..7d6968f 100644
> --- a/src/platform.h
> +++ b/src/platform.h
> @@ -37,6 +37,12 @@ class Platform
>  private:
>   static Platform* _instance;
>
> +  string          _uuid;
> +  string          _hostname;
> +  string          _hypervisor;
> +  string          _architecture;
> +  unsigned int    _memory;
> +
>   string       _cpu_model;
>   unsigned int _cpu_cores;
>
> @@ -44,6 +50,12 @@ class Platform
>   Platform() {}
>   virtual~ Platform() {}
>
> +  void setUUID(const string uuid)             { _uuid = uuid; }
> +  void setHostname(const string hostname)     { _hostname = hostname; }
> +  void setHypervisor(const string hypervisor) { _hypervisor = hypervisor; }
> +  void setArchitecture(const string arch)     { _architecture = arch; }
> +  void setMemory(unsigned int memory)         { _memory = memory; }
> +
>   void setCPUModel(const string model)      { _cpu_model = model; }
>   void setNumberOfCPUCores(const int cores) { _cpu_cores = cores; }
>
> @@ -51,6 +63,12 @@ class Platform
>   // the singleton instance
>   static Platform* instance();
>
> +  string       getUUID() const         { return _uuid; }
> +  string       getHostname() const     { return _hostname; }
> +  string       getHypervisor() const   { return _hypervisor; }
> +  string       getArchitecture() const { return _architecture; }
> +  unsigned int getMemory() const       { return _memory; }
> +
>   string       getCPUModel() const         { return _cpu_model; }
>   unsigned int getNumberOfCPUCores() const { return _cpu_cores; }
>
> --
> 1.7.0.1
>
> _______________________________________________
> Matahari mailing list
> Matahari at lists.fedorahosted.org
> https://fedorahosted.org/mailman/listinfo/matahari
>




More information about the ovirt-devel mailing list