[Ovirt-devel] [PATCH] Add load average to hosts table
Ian Main
imain at redhat.com
Thu Jun 5 21:13:12 UTC 2008
This patch adds a new daemon, 'host-collect', which uses a unixsocket
to talk to collectd to grab the latest load average values from the host
and updates the host table with this value.
---
wui/conf/ovirt-host-collect | 49 ++++++++++++++
wui/ovirt-wui.spec | 4 +
wui/scripts/ovirt-wui-install | 2 +-
wui/src/db/migrate/002_create_hosts.rb | 2 +
wui/src/host-collect/host-collect.rb | 110 ++++++++++++++++++++++++++++++++
5 files changed, 166 insertions(+), 1 deletions(-)
create mode 100755 wui/conf/ovirt-host-collect
create mode 100755 wui/src/host-collect/host-collect.rb
diff --git a/wui/conf/ovirt-host-collect b/wui/conf/ovirt-host-collect
new file mode 100755
index 0000000..2d8ffcd
--- /dev/null
+++ b/wui/conf/ovirt-host-collect
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+#
+# ovirt-host-collect startup script for ovirt-host-collect
+#
+# chkconfig: - 97 03
+# description: ovirt-host-collect is an essential component of the \
+# ovirt VM manager.
+#
+
+DAEMON=/usr/share/ovirt-wui/host-collect/host-collect.rb
+
+. /etc/init.d/functions
+
+start() {
+ echo -n "Starting ovirt-host-collect: "
+ daemon $DAEMON
+ RETVAL=$?
+ echo
+}
+
+stop() {
+ echo -n "Shutting down ovirt-host-collect: "
+ killproc host-collect.rb
+ RETVAL=$?
+ echo
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart)
+ stop
+ start
+ ;;
+ status)
+ status $DAEMON
+ RETVAL=$?
+ ;;
+ *)
+ echo "Usage: ovirt-host-collect {start|stop|restart|status}"
+ exit 1
+ ;;
+esac
+exit $RETVAL
diff --git a/wui/ovirt-wui.spec b/wui/ovirt-wui.spec
index 426c551..7b16667 100644
--- a/wui/ovirt-wui.spec
+++ b/wui/ovirt-wui.spec
@@ -74,6 +74,7 @@ touch %{buildroot}%{_localstatedir}/log/%{name}/host-status.log
%{__install} -Dp -m0755 %{pbuild}/conf/ovirt-host-browser %{buildroot}%{_initrddir}
%{__install} -Dp -m0755 %{pbuild}/conf/ovirt-host-status %{buildroot}%{_initrddir}
+%{__install} -Dp -m0755 %{pbuild}/conf/ovirt-host-collect %{buildroot}%{_initrddir}
%{__install} -Dp -m0755 %{pbuild}/conf/ovirt-mongrel-rails %{buildroot}%{_initrddir}
%{__install} -Dp -m0755 %{pbuild}/conf/ovirt-taskomatic %{buildroot}%{_initrddir}
@@ -99,6 +100,7 @@ rm -rf $RPM_BUILD_ROOT
%{_bindir}/ovirt-add-host
%{_initrddir}/ovirt-host-browser
%{_initrddir}/ovirt-host-status
+%{_initrddir}/ovirt-host-collect
%{_initrddir}/ovirt-mongrel-rails
%{_initrddir}/ovirt-taskomatic
%config(noreplace) %{_sysconfdir}/httpd/conf.d/%{name}.conf
@@ -133,10 +135,12 @@ exit 0
if [ "$1" = 0 ] ; then
/sbin/service ovirt-host-browser stop > /dev/null 2>&1
/sbin/service ovirt-host-status stop > /dev/null 2>&1
+ /sbin/service ovirt-host-collect stop > /dev/null 2>&1
/sbin/service ovirt-mongrel-rails stop > /dev/null 2>&1
/sbin/service ovirt-taskomatic stop > /dev/null 2>&1
/sbin/chkconfig --del ovirt-host-browser
/sbin/chkconfig --del ovirt-host-status
+ /sbin/chkconfig --del ovirt-host-collect
/sbin/chkconfig --del ovirt-mongrel-rails
/sbin/chkconfig --del ovirt-taskomatic
fi
diff --git a/wui/scripts/ovirt-wui-install b/wui/scripts/ovirt-wui-install
index 61da1b6..6eb7d8e 100755
--- a/wui/scripts/ovirt-wui-install
+++ b/wui/scripts/ovirt-wui-install
@@ -14,7 +14,7 @@ SASL_FILE=/etc/sasl2/libvirt.conf
LDAP_CFG=${OVIRT_DIR}/config/ldap.yml
OVIRT_SVCS="ovirt-host-browser ovirt-host-keyadd ovirt-host-status \
- ovirt-mongrel-rails ovirt-taskomatic"
+ ovirt-host-collect ovirt-mongrel-rails ovirt-taskomatic"
ENABLE_SVCS="ntpdate ntpd httpd postgresql libvirtd collectd"
# This checks to see if we're running on a bundled/developer install.
diff --git a/wui/src/db/migrate/002_create_hosts.rb b/wui/src/db/migrate/002_create_hosts.rb
index 3e36738..cef7996 100644
--- a/wui/src/db/migrate/002_create_hosts.rb
+++ b/wui/src/db/migrate/002_create_hosts.rb
@@ -31,6 +31,8 @@ class CreateHosts < ActiveRecord::Migration
t.integer :hardware_pool_id, :null => false
t.integer :lock_version, :default => 0
t.string :state
+ t.float :load_average
+ t.timestamps
end
execute "alter table hosts add constraint fk_host_pools
diff --git a/wui/src/host-collect/host-collect.rb b/wui/src/host-collect/host-collect.rb
new file mode 100755
index 0000000..278449a
--- /dev/null
+++ b/wui/src/host-collect/host-collect.rb
@@ -0,0 +1,110 @@
+#!/usr/bin/ruby
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Ian Main <imain at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+$: << File.join(File.dirname(__FILE__), "../app")
+$: << File.join(File.dirname(__FILE__), "../dutils")
+$: << File.join(File.dirname(__FILE__), ".")
+
+require 'optparse'
+require 'dutils'
+require 'models/task'
+require 'socket'
+
+do_daemon = false
+sleeptime = 30
+
+
+opts = OptionParser.new do |opts|
+ opts.on("-h", "--help", "Print help message") do
+ puts opts
+ exit
+ end
+ opts.on("-n", "--nodaemon", "Run interactively (useful for debugging)") do |n|
+ do_daemon = !n
+ end
+ opts.on("-s N", Integer, "--sleep", "Seconds to sleep between iterations (default is 5 seconds)") do |s|
+ sleeptime = s
+ end
+end
+
+begin
+ opts.parse!(ARGV)
+rescue OptionParser::InvalidOption
+ puts opts
+ exit
+end
+
+if do_daemon
+ daemonize
+end
+
+f = UNIXSocket.new("/var/lib/collectd/unixsock")
+
+database_connect
+
+loop do
+ f.write("LISTVAL\n")
+
+ count = f.gets
+ count = count.to_i
+
+ vals = []
+ while count > 0 do
+ value = f.gets
+ vals.push(value)
+ count = count - 1
+ end
+
+ for val in vals do
+ timestamp, keystring = val.split(" ")
+
+ hostname,plugin,type = keystring.split("/")
+
+ if plugin == "load" and type == "load"
+ f.write("GETVAL #{keystring}\n")
+ valuestring = f.gets
+
+ values = valuestring.split("=")
+ if values.length != 4
+ puts("GACK! Should have 4 values for load")
+ next
+ end
+ short = values[1].to_f
+ med = values[2].to_f
+ long = values[3].to_f
+
+ # You only see this in non-daemon mode..
+ puts("hostname: #{hostname} --> short: #{short}, med: #{med}, long: #{long}")
+
+ # We have our values now, just need to update the db.
+ host = Host.find(:first, :conditions => [ "hostname = ?", hostname])
+ if host == nil
+ puts("GACK! No such host in database: #{hostname}")
+ else
+ host.load_average = med
+ host.save
+ end
+ end
+ end
+
+ sleep sleeptime
+
+end
+
--
1.5.5.1
More information about the ovirt-devel
mailing list