From: silviu <[email protected]>

This uses the newer RRDtool ruby bindings bundled in RRDtool

Signed-off-by: Silviu Paragina <[email protected]>
---
 lib/puppet/feature/base.rb     |    2 +-
 lib/puppet/reports/rrdgraph.rb |    7 +++--
 lib/puppet/util/metric.rb      |   20 +++++++++------
 spec/unit/util/metric.rb       |   53 +++++++++++++++++++++++++++++++++++----
 test/util/metrics.rb           |    2 +
 5 files changed, 66 insertions(+), 18 deletions(-)

diff --git a/lib/puppet/feature/base.rb b/lib/puppet/feature/base.rb
index c3fb9a2..5a9d207 100644
--- a/lib/puppet/feature/base.rb
+++ b/lib/puppet/feature/base.rb
@@ -27,4 +27,4 @@ Puppet.features.add :diff, :libs => %w{diff/lcs diff/lcs/hunk}
 Puppet.features.add(:augeas, :libs => ["augeas"])
 
 # We have RRD available
-Puppet.features.add(:rrd, :libs => ["RRDtool"])
+Puppet.features.add(:rrd, :libs => ["RRD"])
diff --git a/lib/puppet/reports/rrdgraph.rb b/lib/puppet/reports/rrdgraph.rb
index 3e2eeb7..5c2ac61 100644
--- a/lib/puppet/reports/rrdgraph.rb
+++ b/lib/puppet/reports/rrdgraph.rb
@@ -1,12 +1,13 @@
 Puppet::Reports.register_report(:rrdgraph) do
     desc "Graph all available data about hosts using the RRD library.  You
         must have the Ruby RRDtool library installed to use this report, which
-        you can get from `the RubyRRDTool RubyForge page`_.  This package may 
also
-        be available as ``ruby-rrd`` or ``rrdtool-ruby`` in your 
distribution's package
+        is bundled in RRDtool, which you can get from  `the RRDTool 
homepage`_.  
+        This package may also be available as ``librrd-ruby``, ``ruby-rrd`` or 
+        ``rrdtool-ruby`` in your distribution's package
         management system.  The library and/or package will both require the 
binary
         ``rrdtool`` package from your distribution to be installed.
 
-        .. _the RubyRRDTool RubyForge page: 
http://rubyforge.org/projects/rubyrrdtool/
+        .. _the RRDTool homepage: 
http://oss.oetiker.ch/rrdtool/download.en.html
 
         This report will create, manage, and graph RRD database files for each
         of the metrics generated during transactions, and it will create a
diff --git a/lib/puppet/util/metric.rb b/lib/puppet/util/metric.rb
index b713246..7f97e92 100644
--- a/lib/puppet/util/metric.rb
+++ b/lib/puppet/util/metric.rb
@@ -1,5 +1,6 @@
 # included so we can test object types
 require 'puppet'
+require 'RRD'
 
 # A class for handling metrics.  This is currently ridiculously hackish.
 class Puppet::Util::Metric
@@ -31,7 +32,6 @@ class Puppet::Util::Metric
 
         start ||= Time.now.to_i - 5
 
-        @rrd = RRDtool.new(self.path)
         args = []
 
         values.each { |value|
@@ -42,14 +42,17 @@ class Puppet::Util::Metric
         args.push "RRA:AVERAGE:0.5:1:300"
 
         begin
-            @rrd.create( Puppet[:rrdinterval].to_i, start, args)
+        RRD.create(self.path,
+                "--start", start.to_s,
+                "--step", Puppet[:rrdinterval].to_i,
+                *args)
         rescue => detail
             raise "Could not create RRD file %s: %s" % [path,detail]
         end
     end
 
     def dump
-        puts @rrd.info
+        puts RRD.info(self.path)
     end
 
     def graph(range = nil)
@@ -84,12 +87,12 @@ class Puppet::Util::Metric
             if range
                 args.push("--start",range[0],"--end",range[1])
             else
-                args.push("--start", Time.now.to_i - time, "--end", 
Time.now.to_i)
+                args.push("--start", (Time.now.to_i - time).to_s, "--end", 
Time.now.to_i.to_s)
             end
 
             begin
-                #Puppet.warning "args = #{args}"
-                RRDtool.graph( args )
+                #Puppet.warning "args = #{args.join("|")}"
+                RRD.graph( * args )
             rescue => detail
                 Puppet.err "Failed to graph %s: %s" % [self.name,detail]
             end
@@ -122,7 +125,6 @@ class Puppet::Util::Metric
             self.create(time - 5)
         end
 
-        @rrd ||= RRDtool.new(self.path)
 
         # XXX this is not terribly error-resistant
         args = [time]
@@ -135,7 +137,9 @@ class Puppet::Util::Metric
         arg = args.join(":")
         template = temps.join(":")
         begin
-            @rrd.update( template, [ arg ] )
+            RRD.update(self.path, 
+                "--template", template, 
+                arg )
             #system("rrdtool updatev %s '%s'" % [self.path, arg])
         rescue => detail
             raise Puppet::Error, "Failed to update %s: %s" % [self.name,detail]
diff --git a/spec/unit/util/metric.rb b/spec/unit/util/metric.rb
index 3501aac..0d127b6 100755
--- a/spec/unit/util/metric.rb
+++ b/spec/unit/util/metric.rb
@@ -7,6 +7,13 @@ require 'puppet/util/metric'
 describe Puppet::Util::Metric do
     before do
         @metric = Puppet::Util::Metric.new("foo")
+        #if we don't retrive it before the test the :rrddir test will
+        #fail at after
+        @basedir = @metric.basedir
+    end
+
+    after do
+        FileUtils.rm_rf(@basedir) if File.directory?(@basedir)
     end
 
     it "should be aliased to Puppet::Metric" do
@@ -84,12 +91,46 @@ describe Puppet::Util::Metric do
         @metric[:foo].should be_nil
     end
 
-    # LAK: I'm not taking the time to develop these tests right now.
-    # I expect they should actually be extracted into a separate class
-    # anyway.
-    it "should be able to graph metrics using RRDTool"
+    it "should be able to graph metrics using RRDTool" do
+        ensure_rrd_folder
+        populate_metric
+        @metric.graph
+    end
+
+    it "should be able to create a new RRDTool database" do
+        ensure_rrd_folder
+        add_random_values_to_metric
+        @metric.create
+        File.exist?(@metric.path).should == true
+    end
 
-    it "should be able to create a new RRDTool database"
+    it "should be able to store metrics into an RRDTool database" do
+        ensure_rrd_folder
+        populate_metric
+        File.exist?(@metric.path).should == true
+    end
 
-    it "should be able to store metrics into an RRDTool database"
+    def ensure_rrd_folder()
+        #in normal runs puppet does this for us (not sure where)
+        FileUtils.mkdir_p(@basedir) unless File.directory?(@basedir)
+    end
+
+    def populate_metric()
+        time = Time.now.to_i
+        time -= 100 * 1800
+        200.times {
+            @metric = Puppet::Util::Metric.new("foo")
+            add_random_values_to_metric
+            @metric.store(time)
+            time += 1800
+        }
+    end
+
+    def add_random_values_to_metric()
+        @metric.values.clear
+        random_params = { :data1 => 10, :data2 => 30, :data3 => 100 }
+        random_params.each { | label, maxvalue |
+            @metric.newvalue(label, rand(maxvalue))
+    }
+    end
 end
diff --git a/test/util/metrics.rb b/test/util/metrics.rb
index 6dcb841..8e75a94 100755
--- a/test/util/metrics.rb
+++ b/test/util/metrics.rb
@@ -53,6 +53,8 @@ class TestMetric < PuppetTest::TestCase
         report = Puppet::Transaction::Report.new
         time = Time.now.to_i
         start = time
+        #in normal runs puppet does this for us (not sure where)
+        Dir.mkdir(Puppet[:rrddir]) unless File.directory?(Puppet[:rrddir])
         10.times {
             rundata(report, time)
             time += 300
-- 
1.6.5

--

You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.


Reply via email to