[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