[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, upstream, updated. 2.6.5-303-gfcfa26a

Nick Lewis nick at puppetlabs.com
Thu Mar 17 10:49:06 UTC 2011


The following commit has been merged in the upstream branch:
commit 880d0c6cbd20758e02848d1fa61966402dc44dc0
Author: Nick Lewis <nick at puppetlabs.com>
Date:   Mon Mar 7 17:28:43 2011 -0800

    (#6338) Support searching on metadata in InventoryActiveRecord terminus
    
    Timestamps are currently the only supported metadata for searching.
    
    Paired-With: Max Martin
    Reviewed-By: Jacob Helwig

diff --git a/lib/puppet/indirector/facts/inventory_active_record.rb b/lib/puppet/indirector/facts/inventory_active_record.rb
index 30cb88e..5b86068 100644
--- a/lib/puppet/indirector/facts/inventory_active_record.rb
+++ b/lib/puppet/indirector/facts/inventory_active_record.rb
@@ -34,19 +34,32 @@ class Puppet::Node::Facts::InventoryActiveRecord < Puppet::Indirector::ActiveRec
   def search(request)
     return [] unless request.options
     fact_names = []
-    filters = Hash.new {|h,k| h[k] = []}
+    fact_filters = Hash.new {|h,k| h[k] = []}
+    meta_filters = Hash.new {|h,k| h[k] = []}
     request.options.each do |key,value|
       type, name, operator = key.to_s.split(".")
       operator ||= "eq"
-      filters[operator] << [name,value]
+      if type == "facts"
+        fact_filters[operator] << [name,value]
+      elsif type == "meta" and name == "timestamp"
+        meta_filters[operator] << [name,value]
+      end
     end
 
+    matching_hosts = hosts_matching_fact_filters(fact_filters) + hosts_matching_meta_filters(meta_filters)
+
+    # to_a because [].inject == nil
+    matching_hosts.inject {|hosts,this_set| hosts & this_set}.to_a.sort
+  end
+
+  private
 
+  def hosts_matching_fact_filters(fact_filters)
     host_sets = []
-    filters['eq'].each do |name,value|
+    fact_filters['eq'].each do |name,value|
       host_sets << Puppet::Rails::InventoryHost.has_fact_with_value(name,value).map {|host| host.name}
     end
-    filters['ne'].each do |name,value|
+    fact_filters['ne'].each do |name,value|
       host_sets << Puppet::Rails::InventoryHost.has_fact_without_value(name,value).map {|host| host.name}
     end
     {
@@ -55,13 +68,28 @@ class Puppet::Node::Facts::InventoryActiveRecord < Puppet::Indirector::ActiveRec
       'ge' => '>=',
       'le' => '<='
     }.each do |operator_name,operator|
-      filters[operator_name].each do |name,value|
+      fact_filters[operator_name].each do |name,value|
         hosts_with_fact = Puppet::Rails::InventoryHost.has_fact(name)
         host_sets << hosts_with_fact.select {|h| h.value_for(name).to_f.send(operator, value.to_f)}.map {|host| host.name}
       end
     end
+    host_sets
+  end
 
-    # to_a because [].inject == nil
-    host_sets.inject {|hosts,this_set| hosts & this_set}.to_a
+  def hosts_matching_meta_filters(meta_filters)
+    host_sets = []
+    {
+      'eq' => '=',
+      'ne' => '!=',
+      'gt' => '>',
+      'lt' => '<',
+      'ge' => '>=',
+      'le' => '<='
+    }.each do |operator_name,operator|
+      meta_filters[operator_name].each do |name,value|
+        host_sets << Puppet::Rails::InventoryHost.find(:all, :conditions => ["timestamp #{operator} ?", value]).map {|host| host.name}
+      end
+    end
+    host_sets
   end
 end
diff --git a/spec/unit/indirector/facts/inventory_active_record_spec.rb b/spec/unit/indirector/facts/inventory_active_record_spec.rb
index 7fb5556..69d6140 100644
--- a/spec/unit/indirector/facts/inventory_active_record_spec.rb
+++ b/spec/unit/indirector/facts/inventory_active_record_spec.rb
@@ -97,54 +97,75 @@ describe "Puppet::Node::Facts::InventoryActiveRecord", :if => (Puppet.features.r
   end
 
   describe "#search" do
+    def search_request(conditions)
+      Puppet::Indirector::Request.new(:facts, :search, nil, conditions)
+    end
 
-    it "should return node names that match 'equal' constraints" do
-      Puppet::Node::Facts.new("foo", "fact1" => "value1", "fact2" => "value2", "fact3" => "value3").save
-      Puppet::Node::Facts.new("bar", "fact1" => "value2").save
-      Puppet::Node::Facts.new("baz", "fact1" => "value1", "fact2" => "value1", "fact3" => "value1").save
+    before :each do
+      @now = Time.now
+      @foo = Puppet::Node::Facts.new("foo", "fact1" => "value1", "fact2" => "value2", "uptime_days" => "30")
+      @bar = Puppet::Node::Facts.new("bar", "fact1" => "value1", "uptime_days" => "60")
+      @baz = Puppet::Node::Facts.new("baz", "fact1" => "value2", "fact2" => "value1", "uptime_days" => "90")
+      @bat = Puppet::Node::Facts.new("bat")
+      @foo.timestamp = @now - 3600*1
+      @bar.timestamp = @now - 3600*3
+      @baz.timestamp = @now - 3600*5
+      @bat.timestamp = @now - 3600*7
+      @foo.save
+      @bar.save
+      @baz.save
+      @bat.save
+    end
 
-      request = Puppet::Indirector::Request.new(:facts, :search, nil,
-                                                {'facts.fact1.eq' => 'value1',
-                                                 'facts.fact2.eq' => 'value2',
-                                                 'facts.fact3.eq' => 'value3'})
-      terminus.search(request).should =~ ["foo"]
+    it "should return node names that match 'equal' constraints" do
+      request = search_request('facts.fact1.eq' => 'value1',
+                               'facts.fact2.eq' => 'value2')
+      terminus.search(request).should == ["foo"]
     end
 
     it "should return node names that match 'not equal' constraints" do
-      Puppet::Node::Facts.new("foo", "fact1" => "value1", "fact2" => "value2", "fact3" => "value3").save
-      Puppet::Node::Facts.new("bar", "fact1" => "value2").save
-      Puppet::Node::Facts.new("baz", "fact1" => "value1", "fact2" => "value1", "fact3" => "value1").save
-      Puppet::Node::Facts.new("bang", "fact1" => "value1", "fact2" => "value2", "fact3" => "value1").save
-
-      request = Puppet::Indirector::Request.new(:facts, :search, nil,
-                                                {'facts.fact1.ne' => 'value3',
-                                                 'facts.fact2.ne' => 'value1',
-                                                 'facts.fact3.ne' => 'value2'})
-      terminus.search(request).should =~ ["foo","bang"]
+      request = search_request('facts.fact1.ne' => 'value2')
+      terminus.search(request).should == ["bar","foo"]
     end
 
     it "should return node names that match strict inequality constraints" do
-      Puppet::Node::Facts.new("foo", "uptime_days" => "30").save
-      Puppet::Node::Facts.new("bar", "uptime_days" => "60").save
-      Puppet::Node::Facts.new("baz", "uptime_days" => "90").save
+      request = search_request('facts.uptime_days.gt' => '20',
+                               'facts.uptime_days.lt' => '70')
+      terminus.search(request).should == ["bar","foo"]
+    end
 
-      request = Puppet::Indirector::Request.new(:facts, :search, nil,
-                                                {'facts.uptime_days.gt' => '20',
-                                                 'facts.uptime_days.lt' => '70'})
+    it "should return node names that match non-strict inequality constraints" do
+      request = search_request('facts.uptime_days.ge' => '30',
+                               'facts.uptime_days.le' => '60')
+      terminus.search(request).should == ["bar","foo"]
+    end
 
-      terminus.search(request).should =~ ["foo","bar"]
+    it "should return node names whose facts are within a given timeframe" do
+      request = search_request('meta.timestamp.ge' => @now - 3600*5,
+                               'meta.timestamp.le' => @now - 3600*1)
+      terminus.search(request).should == ["bar","baz","foo"]
     end
 
-    it "should return node names that match non-strict inequality constraints" do
-      Puppet::Node::Facts.new("foo", "uptime_days" => "30").save
-      Puppet::Node::Facts.new("bar", "uptime_days" => "60").save
-      Puppet::Node::Facts.new("baz", "uptime_days" => "90").save
+    it "should return node names whose facts are from a specific time" do
+      request = search_request('meta.timestamp.eq' => @now - 3600*3)
+      terminus.search(request).should == ["bar"]
+    end
 
-      request = Puppet::Indirector::Request.new(:facts, :search, nil,
-                                                {'facts.uptime_days.ge' => '30',
-                                                 'facts.uptime_days.le' => '60'})
+    it "should return node names whose facts are not from a specific time" do
+      request = search_request('meta.timestamp.ne' => @now - 3600*1)
+      terminus.search(request).should == ["bar","bat","baz"]
+    end
+
+    it "should perform strict searches on nodes by timestamp" do
+      request = search_request('meta.timestamp.gt' => @now - 3600*5,
+                               'meta.timestamp.lt' => @now - 3600*1)
+      terminus.search(request).should == ["bar"]
+    end
 
-      terminus.search(request).should =~ ["foo","bar"]
+    it "should search nodes based on both facts and timestamp values" do
+      request = search_request('facts.uptime_days.gt' => '45',
+                               'meta.timestamp.lt'    => @now - 3600*4)
+      terminus.search(request).should == ["baz"]
     end
   end
 end

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list