diff options
-rw-r--r-- | CHANGELOG | 4 | ||||
-rwxr-xr-x | lib/puppet/provider/parsedfile.rb | 53 | ||||
-rw-r--r-- | lib/puppet/util/nagios_maker.rb | 4 | ||||
-rw-r--r-- | spec/unit/provider/naginator.rb | 8 | ||||
-rwxr-xr-x | spec/unit/provider/parsedfile.rb | 50 | ||||
-rwxr-xr-x | spec/unit/util/nagios_maker.rb | 66 |
6 files changed, 129 insertions, 56 deletions
@@ -1,4 +1,8 @@ 0.24.8 + Fixed #1541 - nagios objects write files to clientbucket on every change + + Fixed #1542 - cannot purge nagios objects + Fixing #1912 - gid still works with no 'should' value fixing ralsh issues Fixing the Rakefile to use 'git format-patch' diff --git a/lib/puppet/provider/parsedfile.rb b/lib/puppet/provider/parsedfile.rb index b4a4a3b91..a4c4bc87c 100755 --- a/lib/puppet/provider/parsedfile.rb +++ b/lib/puppet/provider/parsedfile.rb @@ -108,10 +108,11 @@ class Puppet::Provider::ParsedFile < Puppet::Provider # Return a list of all of the records we can find. def self.instances - prefetch() - @records.find_all { |r| r[:record_type] == self.name }.collect { |r| - new(r) - } + targets.collect do |target| + prefetch_target(target) + end.flatten.reject { |r| skip_record?(r) }.collect do |record| + new(record) + end end # Override the default method with a lot more functionality. @@ -171,31 +172,39 @@ class Puppet::Provider::ParsedFile < Puppet::Provider # resource instance. def self.prefetch(resources = nil) # Reset the record list. - @records = [] - targets(resources).each do |target| - @records += prefetch_target(target) - end + @records = prefetch_all_targets(resources) - if resources - matchers = resources.dup - @records.each do |record| - # Skip things like comments and blank lines - next if skip_record?(record) + match_providers_with_resources(resources) + end - if name = record[:name] and resource = resources[name] + def self.match_providers_with_resources(resources) + return unless resources + matchers = resources.dup + @records.each do |record| + # Skip things like comments and blank lines + next if skip_record?(record) + + if name = record[:name] and resource = resources[name] + resource.provider = new(record) + elsif respond_to?(:match) + if resource = match(record, matchers) + # Remove this resource from circulation so we don't unnecessarily try to match + matchers.delete(resource.title) + record[:name] = resource[:name] resource.provider = new(record) - elsif respond_to?(:match) - if resource = match(record, matchers) - # Remove this resource from circulation so we don't unnecessarily try to match - matchers.delete(resource.title) - record[:name] = resource[:name] - resource.provider = new(record) - end end end end end + def self.prefetch_all_targets(resources) + records = [] + targets(resources).each do |target| + records += prefetch_target(target) + end + records + end + # Prefetch an individual target. def self.prefetch_target(target) target_records = retrieve(target).each do |r| @@ -217,6 +226,7 @@ class Puppet::Provider::ParsedFile < Puppet::Provider # Is there an existing record with this name? def self.record?(name) + return nil unless @records @records.find { |r| r[:name] == name } end @@ -367,4 +377,3 @@ class Puppet::Provider::ParsedFile < Puppet::Provider end end end - diff --git a/lib/puppet/util/nagios_maker.rb b/lib/puppet/util/nagios_maker.rb index a7aae4e70..316334929 100644 --- a/lib/puppet/util/nagios_maker.rb +++ b/lib/puppet/util/nagios_maker.rb @@ -42,6 +42,7 @@ module Puppet::Util::NagiosMaker target = "/etc/nagios/#{full_name.to_s}.cfg" provider = type.provide(:naginator, :parent => Puppet::Provider::Naginator, :default_target => target) {} + provider.nagios_type type.desc "The Nagios type #{name.to_s}. This resource type is autogenerated using the model developed in Naginator_, and all of the Nagios types are generated using the @@ -51,6 +52,9 @@ module Puppet::Util::NagiosMaker files. By default, the statements will be added to ``#{target}``, but you can send them to a different file by setting their ``target`` attribute. + You can purge Nagios resources using the ``resources`` type, but *only* + in the default file locations. This is an architectural limitation. + .. _naginator: http://reductivelabs.com/trac/naginator " end diff --git a/spec/unit/provider/naginator.rb b/spec/unit/provider/naginator.rb index c39a50c23..d0d43aa4b 100644 --- a/spec/unit/provider/naginator.rb +++ b/spec/unit/provider/naginator.rb @@ -47,4 +47,12 @@ describe Puppet::Provider::Naginator do it "should be able to prefetch instance from configuration files" do @class.should respond_to(:prefetch) end + + it "should be able to generate a list of instances" do + @class.should respond_to(:instances) + end + + it "should never skip records" do + @class.should_not be_skip_record("foo") + end end diff --git a/spec/unit/provider/parsedfile.rb b/spec/unit/provider/parsedfile.rb new file mode 100755 index 000000000..05e9de3ab --- /dev/null +++ b/spec/unit/provider/parsedfile.rb @@ -0,0 +1,50 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../spec_helper' + +require 'puppet/provider/parsedfile' + +# Most of the tests for this are still in test/ral/provider/parsedfile.rb. +describe Puppet::Provider::ParsedFile do + before do + @class = Class.new(Puppet::Provider::ParsedFile) + end + + describe "when looking up records loaded from disk" do + it "should return nil if no records have been loaded" do + @class.record?("foo").should be_nil + end + end + + describe "when generating a list of instances" do + it "should return an instance for each record parsed from all of the registered targets" do + @class.expects(:targets).returns %w{/one /two} + @class.stubs(:skip_record?).returns false + one = [:uno1, :uno2] + two = [:dos1, :dos2] + @class.expects(:prefetch_target).with("/one").returns one + @class.expects(:prefetch_target).with("/two").returns two + + results = [] + (one + two).each do |inst| + results << inst.to_s + "_instance" + @class.expects(:new).with(inst).returns(results[-1]) + end + + @class.instances.should == results + end + + it "should skip specified records" do + @class.expects(:targets).returns %w{/one} + @class.expects(:skip_record?).with(:uno).returns false + @class.expects(:skip_record?).with(:dos).returns true + one = [:uno, :dos] + @class.expects(:prefetch_target).returns one + + @class.expects(:new).with(:uno).returns "eh" + @class.expects(:new).with(:dos).never + + @class.instances + end + end +end diff --git a/spec/unit/util/nagios_maker.rb b/spec/unit/util/nagios_maker.rb index b75439400..1e1aefcae 100755 --- a/spec/unit/util/nagios_maker.rb +++ b/spec/unit/util/nagios_maker.rb @@ -13,6 +13,9 @@ describe Puppet::Util::NagiosMaker do @nagtype = stub 'nagios type', :parameters => [], :namevar => :name Nagios::Base.stubs(:type).with(:test).returns(@nagtype) + + @provider = stub 'provider', :nagios_type => nil + @type = stub 'type', :newparam => nil, :newproperty => nil, :provide => @provider, :desc => nil, :ensurable => nil end it "should be able to create a new nagios type" do @@ -26,73 +29,59 @@ describe Puppet::Util::NagiosMaker do end it "should create a new RAL type with the provided name prefixed with 'nagios_'" do - type = stub 'type', :newparam => nil, :newproperty => nil, :ensurable => nil, :provide => nil, :desc => nil - - Puppet::Type.expects(:newtype).with(:nagios_test).returns(type) + Puppet::Type.expects(:newtype).with(:nagios_test).returns(@type) @module.create_nagios_type(:test) end it "should mark the created type as ensurable" do - type = stub 'type', :newparam => nil, :newproperty => nil, :provide => nil, :desc => nil + @type.expects(:ensurable) - type.expects(:ensurable) - - Puppet::Type.expects(:newtype).with(:nagios_test).returns(type) + Puppet::Type.expects(:newtype).with(:nagios_test).returns(@type) @module.create_nagios_type(:test) end it "should create a namevar parameter for the nagios type's name parameter" do - type = stub 'type', :newproperty => nil, :ensurable => nil, :provide => nil, :desc => nil - - type.expects(:newparam).with(:name, :namevar => true) + @type.expects(:newparam).with(:name, :namevar => true) - Puppet::Type.expects(:newtype).with(:nagios_test).returns(type) + Puppet::Type.expects(:newtype).with(:nagios_test).returns(@type) @module.create_nagios_type(:test) end it "should create a property for all non-namevar parameters" do - type = stub 'type', :newparam => nil, :ensurable => nil, :provide => nil, :desc => nil - @nagtype.stubs(:parameters).returns([:one, :two]) - type.expects(:newproperty).with(:one) - type.expects(:newproperty).with(:two) - type.expects(:newproperty).with(:target) + @type.expects(:newproperty).with(:one) + @type.expects(:newproperty).with(:two) + @type.expects(:newproperty).with(:target) - Puppet::Type.expects(:newtype).with(:nagios_test).returns(type) + Puppet::Type.expects(:newtype).with(:nagios_test).returns(@type) @module.create_nagios_type(:test) end it "should skip parameters that start with integers" do - type = stub 'type', :newparam => nil, :ensurable => nil, :provide => nil, :desc => nil - @nagtype.stubs(:parameters).returns(["2dcoords".to_sym, :other]) - type.expects(:newproperty).with(:other) - type.expects(:newproperty).with(:target) + @type.expects(:newproperty).with(:other) + @type.expects(:newproperty).with(:target) - Puppet::Type.expects(:newtype).with(:nagios_test).returns(type) + Puppet::Type.expects(:newtype).with(:nagios_test).returns(@type) @module.create_nagios_type(:test) end it "should deduplicate the parameter list" do - type = stub 'type', :newparam => nil, :ensurable => nil, :provide => nil, :desc => nil - @nagtype.stubs(:parameters).returns([:one, :one]) - type.expects(:newproperty).with(:one) - type.expects(:newproperty).with(:target) + @type.expects(:newproperty).with(:one) + @type.expects(:newproperty).with(:target) - Puppet::Type.expects(:newtype).with(:nagios_test).returns(type) + Puppet::Type.expects(:newtype).with(:nagios_test).returns(@type) @module.create_nagios_type(:test) end it "should create a target property" do - type = stub 'type', :newparam => nil, :ensurable => nil, :provide => nil, :desc => nil + @type.expects(:newproperty).with(:target) - type.expects(:newproperty).with(:target) - - Puppet::Type.expects(:newtype).with(:nagios_test).returns(type) + Puppet::Type.expects(:newtype).with(:nagios_test).returns(@type) @module.create_nagios_type(:test) end end @@ -100,6 +89,7 @@ end describe Puppet::Util::NagiosMaker, " when creating the naginator provider" do before do @module = Puppet::Util::NagiosMaker + @provider = stub 'provider', :nagios_type => nil @nagtype = stub 'nagios type', :parameters => [], :namevar => :name Nagios::Base.stubs(:type).with(:test).returns(@nagtype) @@ -109,19 +99,27 @@ describe Puppet::Util::NagiosMaker, " when creating the naginator provider" do end it "should add a naginator provider" do - @type.expects(:provide).with { |name, options| name == :naginator } + @type.expects(:provide).with { |name, options| name == :naginator }.returns @provider @module.create_nagios_type(:test) end it "should set Puppet::Provider::Naginator as the parent class of the provider" do - @type.expects(:provide).with { |name, options| options[:parent] == Puppet::Provider::Naginator } + @type.expects(:provide).with { |name, options| options[:parent] == Puppet::Provider::Naginator }.returns @provider @module.create_nagios_type(:test) end it "should use /etc/nagios/$name.cfg as the default target" do - @type.expects(:provide).with { |name, options| options[:default_target] == "/etc/nagios/nagios_test.cfg" } + @type.expects(:provide).with { |name, options| options[:default_target] == "/etc/nagios/nagios_test.cfg" }.returns @provider + + @module.create_nagios_type(:test) + end + + it "should trigger the lookup of the Nagios class" do + @type.expects(:provide).returns @provider + + @provider.expects(:nagios_type) @module.create_nagios_type(:test) end |