Memory and swap values are now given in standard units via additional facts
(e.g. memorysize_mb) as well as the most appropriate unit as before.

Standard units provided are B and MB.

Signed-off-by: Dominic Cleal <[email protected]>
---
Local-branch: tickets/master/2066
 lib/facter/memory.rb      |   70 ++++++++++++++------------------------------
 lib/facter/util/memory.rb |   57 ++++++++++++++++++++++++++++++++++++
 2 files changed, 79 insertions(+), 48 deletions(-)

diff --git a/lib/facter/memory.rb b/lib/facter/memory.rb
index 06640e6..992ed40 100644
--- a/lib/facter/memory.rb
+++ b/lib/facter/memory.rb
@@ -7,16 +7,14 @@
 #
 require 'facter/util/memory'
 
-{   :MemorySize => "MemTotal",
-    :MemoryFree => "MemFree",
-    :SwapSize   => "SwapTotal",
-    :SwapFree   => "SwapFree"
-}.each do |fact, name|
-    Facter.add(fact) do
-        confine :kernel => :linux
-        setcode do
-            Facter::Memory.meminfo_number(name)
-        end
+if Facter.value(:kernel) == "Linux"
+    {   :MemorySize => "MemTotal",
+        :MemoryFree => "MemFree",
+        :SwapSize   => "SwapTotal",
+        :SwapFree   => "SwapFree"
+    }.each do |fact, name|
+        meminfo = Facter::Memory.meminfo_number(name)
+        Facter::Memory::add_memfacts(fact, meminfo, :linux)
     end
 end
 
@@ -30,19 +28,11 @@ if Facter.value(:kernel) == "AIX" and Facter.value(:id) == 
"root"
       end 
     end 
  
-    Facter.add("SwapSize") do
-        confine :kernel => :aix
-        setcode do
-            Facter::Memory.scale_number(swaptotal.to_f,"MB")
-        end
-    end
+    meminfo = Facter::Memory.scale_number(swaptotal.to_f,"MB")
+    Facter::Memory::add_memfacts("SwapSize", meminfo, :aix)
 
-    Facter.add("SwapFree") do
-        confine :kernel => :aix
-        setcode do
-            Facter::Memory.scale_number(swapfree.to_f,"MB")
-        end
-    end
+    meminfo = Facter::Memory.scale_number(swapfree.to_f,"MB")
+    Facter::Memory::add_memfacts("SwapFree", meminfo, :aix)
 end
 
 if Facter.value(:kernel) == "OpenBSD"
@@ -55,33 +45,17 @@ if Facter.value(:kernel) == "OpenBSD"
         end
     end
 
-    Facter.add("SwapSize") do
-        confine :kernel => :openbsd
-        setcode do
-            Facter::Memory.scale_number(swaptotal.to_f,"kB")
-        end
-    end
+    meminfo = Facter::Memory.scale_number(swaptotal.to_f,"kB")
+    Facter::Memory::add_memfacts("SwapSize", meminfo, :openbsd)
 
-    Facter.add("SwapFree") do
-        confine :kernel => :openbsd
-        setcode do
-            Facter::Memory.scale_number(swapfree.to_f,"kB")
-        end
-    end
+    meminfo = Facter::Memory.scale_number(swapfree.to_f,"kB")
+    Facter::Memory::add_memfacts("SwapFree", meminfo, :openbsd)
 
-    Facter.add("MemoryFree") do
-        confine :kernel => :openbsd
-        memfree = Facter::Util::Resolution.exec("vmstat | tail -n 1 | awk '{ 
print $5 }'")
-        setcode do
-            Facter::Memory.scale_number(memfree.to_f,"kB")
-        end
-    end
+    memfree = Facter::Util::Resolution.exec("vmstat | tail -n 1 | awk '{ print 
$5 }'")
+    meminfo = Facter::Memory.scale_number(memfree.to_f,"kB")
+    Facter::Memory::add_memfacts("MemoryFree", meminfo, :openbsd)
 
-    Facter.add("MemoryTotal") do
-        confine :kernel => :openbsd
-        memtotal = Facter::Util::Resolution.exec("sysctl hw.physmem | cut 
-d'=' -f2")
-        setcode do
-            Facter::Memory.scale_number(memtotal.to_f,"")
-        end
-    end
+    memtotal = Facter::Util::Resolution.exec("sysctl hw.physmem | cut -d'=' 
-f2")
+    meminfo = Facter::Memory.scale_number(memfree.to_f,"")
+    Facter::Memory::add_memfacts("MemoryTotal", meminfo, :openbsd)
 end
diff --git a/lib/facter/util/memory.rb b/lib/facter/util/memory.rb
index 2004491..672c452 100644
--- a/lib/facter/util/memory.rb
+++ b/lib/facter/util/memory.rb
@@ -16,6 +16,28 @@
 module Facter::Memory
     require 'thread'
 
+    # Stores all units from meminfo as fact_SUFFIX
+    def self.add_memfacts(fact, meminfo, kernel = nil)
+        best = meminfo[:best]
+        Facter.add(fact) do
+            confine :kernel => kernel if kernel
+            setcode do
+                best
+            end
+        end
+
+        # Load in values converted to other units
+        meminfo.each do |memunit,memsize|
+            next if memunit == :best
+            Facter.add("%s_%s" % [fact, memunit]) do
+                confine :kernel => kernel if kernel
+                setcode do
+                    memsize
+                end
+            end
+        end
+    end
+
     def self.meminfo_number(tag)
         memsize = ""
         Thread::exclusive do
@@ -35,7 +57,17 @@ module Facter::Memory
         memsize
     end
 
+    # Converts an input number into a range of standard units and the most
+    # appropriate unit (:best).  Returns a hash similar to:
+    #   { :best => "123 MB", "kB" => 125952, "MB" => 123 }
     def self.scale_number(size, multiplier)
+        units = scale_number_standards(size, multiplier)
+        units[:best] = scale_number_best(size, multiplier)
+        units
+    end
+
+    # Converts an input number into the most appropriate unit
+    def self.scale_number_best(size, multiplier)
         suffixes = ['', 'kB', 'MB', 'GB', 'TB']
 
         s = suffixes.shift
@@ -50,5 +82,30 @@ module Facter::Memory
 
         return "%.2f %s" % [size, s]
     end
+
+    # Converts one input number into a range of standard units
+    def self.scale_number_standards(size, multiplier, units = ['B', 'MB'])
+        suffixes = ['B', 'kB', 'MB', 'GB', 'TB']
+        standards = {}
+
+        units.each do |u|
+            idx = suffixes.index(multiplier)  # our input
+            uidx = suffixes.index(u)          # our target
+            convsize = size
+
+            while uidx < idx
+                convsize *= 1024.0
+                idx -= 1
+            end
+
+            while uidx > idx
+                convsize /= 1024.0
+                idx += 1
+            end
+
+            standards[u] = "%.2f" % convsize
+        end
+        standards
+    end
 end
 
-- 
1.7.3.2

-- 
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