summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2007-12-31 13:51:09 -0600
committerLuke Kanies <luke@madstop.com>2007-12-31 13:51:09 -0600
commit348f257e3626848dd6a32b6f9eae17a5f30c21dd (patch)
tree87feaf36475a4aac5557bc2f20a54848f624f53f
parent9b1d0366cbd92e3982e6db247786b5d5a0348eae (diff)
Adding the metaprogramming to create the Nagios types
and Naginator providers. This is basically all of the code that's necessary to create all of the needed Nagios types.
-rw-r--r--lib/puppet/util/nagios_maker.rb40
-rwxr-xr-xspec/unit/util/nagios_maker.rb104
2 files changed, 144 insertions, 0 deletions
diff --git a/lib/puppet/util/nagios_maker.rb b/lib/puppet/util/nagios_maker.rb
new file mode 100644
index 000000000..7c019f55e
--- /dev/null
+++ b/lib/puppet/util/nagios_maker.rb
@@ -0,0 +1,40 @@
+require 'puppet/external/nagios'
+require 'puppet/external/nagios/base'
+require 'puppet/provider/naginator'
+
+module Puppet::Util::NagiosMaker
+ # Create a new nagios type, using all of the parameters
+ # from the parser.
+ def self.create_nagios_type(name)
+ name = name.to_sym
+ full_name = ("nagios_" + name.to_s).to_sym
+
+ raise(Puppet::DevError, "No nagios type for %s" % name) unless nagtype = Nagios::Base.type(name)
+
+ type = Puppet::Type.newtype(full_name) {}
+
+ type.ensurable
+
+ type.newparam(nagtype.namevar, :namevar => true) do
+ desc "The name parameter for Nagios type %s" % nagtype.name
+ end
+
+ nagtype.parameters.each do |param|
+ next if param == nagtype.namevar
+
+ type.newproperty(param) do
+ desc "Nagios configuration file parameter."
+ end
+ end
+
+ type.newproperty(:target) do
+ desc 'target'
+
+ defaultto do
+ resource.class.defaultprovider.default_target
+ end
+ end
+
+ type.provide(:naginator, :parent => Puppet::Provider::Naginator, :default_target => "/etc/nagios/#{full_name.to_s}.cfg") {}
+ end
+end
diff --git a/spec/unit/util/nagios_maker.rb b/spec/unit/util/nagios_maker.rb
new file mode 100755
index 000000000..145f8633a
--- /dev/null
+++ b/spec/unit/util/nagios_maker.rb
@@ -0,0 +1,104 @@
+#!/usr/bin/env ruby
+#
+# Created by Luke Kanies on 2007-11-18.
+# Copyright (c) 2007. All rights reserved.
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+require 'puppet/util/nagios_maker'
+
+describe Puppet::Util::NagiosMaker do
+ before do
+ @module = Puppet::Util::NagiosMaker
+
+ @nagtype = stub 'nagios type', :parameters => [], :namevar => :name
+ Nagios::Base.stubs(:type).with(:test).returns(@nagtype)
+ end
+
+ it "should be able to create a new nagios type" do
+ @module.should respond_to(:create_nagios_type)
+ end
+
+ it "should fail if it cannot find the named Naginator type" do
+ Nagios::Base.stubs(:type).returns(nil)
+
+ lambda { @module.create_nagios_type(:no_such_type) }.should raise_error(Puppet::DevError)
+ 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
+
+ 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
+
+ type.expects(:ensurable)
+
+ 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
+
+ type.expects(:newparam).with(:name, :namevar => true)
+
+ 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
+
+ @nagtype.stubs(:parameters).returns([:one, :two])
+
+ type.expects(:newproperty).with(:one)
+ type.expects(:newproperty).with(:two)
+ type.expects(:newproperty).with(:target)
+
+ 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
+
+ type.expects(:newproperty).with(:target)
+
+ Puppet::Type.expects(:newtype).with(:nagios_test).returns(type)
+ @module.create_nagios_type(:test)
+ end
+end
+
+describe Puppet::Util::NagiosMaker, " when creating the naginator provider" do
+ before do
+ @module = Puppet::Util::NagiosMaker
+
+ @nagtype = stub 'nagios type', :parameters => [], :namevar => :name
+ Nagios::Base.stubs(:type).with(:test).returns(@nagtype)
+
+ @type = stub 'type', :newparam => nil, :ensurable => nil, :newproperty => nil
+ Puppet::Type.stubs(:newtype).with(:nagios_test).returns(@type)
+ end
+
+ it "should add a naginator provider" do
+ @type.expects(:provide).with { |name, options| name == :naginator }
+
+ @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 }
+
+ @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" }
+
+ @module.create_nagios_type(:test)
+ end
+end