summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--acceptance/tests/ticket_6418_file_recursion_and_audit.rb17
-rw-r--r--lib/puppet/metatype/manager.rb27
-rw-r--r--lib/puppet/type.rb37
-rwxr-xr-xspec/integration/type_spec.rb11
-rwxr-xr-xspec/unit/type_spec.rb66
5 files changed, 111 insertions, 47 deletions
diff --git a/acceptance/tests/ticket_6418_file_recursion_and_audit.rb b/acceptance/tests/ticket_6418_file_recursion_and_audit.rb
index f0a55d029..b21e57ddb 100644
--- a/acceptance/tests/ticket_6418_file_recursion_and_audit.rb
+++ b/acceptance/tests/ticket_6418_file_recursion_and_audit.rb
@@ -2,11 +2,9 @@
#
# AffectedVersion: 2.6.0-2.6.5
# FixedVersion:
-#
test_name "#6418: file recursion and audit"
-on agents, "rm -f /var/lib/puppet/state/state.yaml "
manifest = %q{
file { "/tmp/6418": ensure => directory }
file { "/tmp/6418/dir": ensure => directory}
@@ -17,6 +15,19 @@ manifest = %q{
File["/tmp/6418"] -> File["/tmp/6418/dir"] -> File["/tmp/6418/dir/dir"] -> File["/tmp/6418/dir/dir/dir"] -> File["/tmp/6418-copy"]
}
+step "Query agent for statefile"
+agent=agents.first
+on agent, puppet_agent('--configprint statefile')
+statefile=stdout.chomp
+
+step "Remove the statefile on all Agents"
+on agents, "rm -f #{statefile}"
+
step "Apply the manifest"
apply_manifest_on agents, manifest
-on agents, "! grep ensure.*directory /var/lib/puppet/state/state.yaml"
+
+
+step "Verify corecct file recursion and audit state"
+agents.each do |agent|
+ on(agent, "grep ensure.*directory #{statefile}", :acceptable_exit_codes => [ 1 ])
+end
diff --git a/lib/puppet/metatype/manager.rb b/lib/puppet/metatype/manager.rb
index 12cbf645c..597a89f31 100644
--- a/lib/puppet/metatype/manager.rb
+++ b/lib/puppet/metatype/manager.rb
@@ -61,10 +61,9 @@ module Manager
# Then create the class.
- klass = genclass(
- name,
+ klass = genclass(
+ name,
:parent => (parent || Puppet::Type),
-
:overwrite => true,
:hash => @types,
:attributes => options,
@@ -87,14 +86,11 @@ module Manager
# Now set up autoload any providers that might exist for this type.
- klass.providerloader = Puppet::Util::Autoload.new(
- klass,
-
- "puppet/provider/#{klass.name.to_s}"
- )
+ klass.providerloader = Puppet::Util::Autoload.new(klass, "puppet/provider/#{klass.name.to_s}")
- # We have to load everything so that we can figure out the default type.
+ # We have to load everything so that we can figure out the default provider.
klass.providerloader.loadall
+ klass.providify unless klass.providers.empty?
klass
end
@@ -103,11 +99,7 @@ module Manager
def rmtype(name)
# Then create the class.
- klass = rmclass(
- name,
-
- :hash => @types
- )
+ klass = rmclass(name, :hash => @types)
singleton_class.send(:remove_method, "new#{name}") if respond_to?("new#{name}")
end
@@ -132,12 +124,7 @@ module Manager
# Create a loader for Puppet types.
def typeloader
unless defined?(@typeloader)
-
- @typeloader = Puppet::Util::Autoload.new(
- self,
-
- "puppet/type", :wrap => false
- )
+ @typeloader = Puppet::Util::Autoload.new(self, "puppet/type", :wrap => false)
end
@typeloader
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index 558491a7f..15f340f55 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -1442,9 +1442,8 @@ class Type
def self.provide(name, options = {}, &block)
name = Puppet::Util.symbolize(name)
- if obj = provider_hash[name]
+ if unprovide(name)
Puppet.debug "Reloading #{name} #{self.name} provider"
- unprovide(name)
end
parent = if pname = options[:parent]
@@ -1467,16 +1466,14 @@ class Type
self.providify
-
- provider = genclass(
- name,
- :parent => parent,
- :hash => provider_hash,
- :prefix => "Provider",
- :block => block,
- :include => feature_module,
- :extend => feature_module,
-
+ provider = genclass(
+ name,
+ :parent => parent,
+ :hash => provider_hash,
+ :prefix => "Provider",
+ :block => block,
+ :include => feature_module,
+ :extend => feature_module,
:attributes => options
)
@@ -1536,18 +1533,11 @@ class Type
end
def self.unprovide(name)
- if provider_hash.has_key? name
-
- rmclass(
- name,
- :hash => provider_hash,
-
- :prefix => "Provider"
- )
- if @defaultprovider and @defaultprovider.name == name
- @defaultprovider = nil
- end
+ if @defaultprovider and @defaultprovider.name == name
+ @defaultprovider = nil
end
+
+ rmclass(name, :hash => provider_hash, :prefix => "Provider")
end
# Return an array of all of the suitable providers.
@@ -1607,7 +1597,6 @@ class Type
# Collect the current prereqs
list.each { |dep|
- obj = nil
# Support them passing objects directly, to save some effort.
unless dep.is_a? Puppet::Type
# Skip autorequires that we aren't managing
diff --git a/spec/integration/type_spec.rb b/spec/integration/type_spec.rb
index 4be01d558..9fd10485f 100755
--- a/spec/integration/type_spec.rb
+++ b/spec/integration/type_spec.rb
@@ -18,4 +18,15 @@ describe Puppet::Type do
type.provider(:myprovider).should equal(provider)
end
+
+ it "should not lose its provider parameter when it is reloaded" do
+ type = Puppet::Type.newtype(:reload_test_type)
+
+ provider = type.provide(:test_provider)
+
+ # reload it
+ type = Puppet::Type.newtype(:reload_test_type)
+
+ type.parameters.should include(:provider)
+ end
end
diff --git a/spec/unit/type_spec.rb b/spec/unit/type_spec.rb
index ca291c4fa..bbdaec3bc 100755
--- a/spec/unit/type_spec.rb
+++ b/spec/unit/type_spec.rb
@@ -164,6 +164,72 @@ describe Puppet::Type do
end
end
+ describe "when creating a provider" do
+ before :each do
+ @type = Puppet::Type.newtype(:provider_test_type)
+ end
+
+ after :each do
+ @type.provider_hash.clear
+ end
+
+ it "should create a subclass of Puppet::Provider for the provider" do
+ provider = @type.provide(:test_provider)
+
+ provider.ancestors.should include(Puppet::Provider)
+ end
+
+ it "should use a parent class if specified" do
+ parent_provider = @type.provide(:parent_provider)
+ child_provider = @type.provide(:child_provider, :parent => parent_provider)
+
+ child_provider.ancestors.should include(parent_provider)
+ end
+
+ it "should use a parent class if specified by name" do
+ parent_provider = @type.provide(:parent_provider)
+ child_provider = @type.provide(:child_provider, :parent => :parent_provider)
+
+ child_provider.ancestors.should include(parent_provider)
+ end
+
+ it "should raise an error when the parent class can't be found" do
+ expect {
+ @type.provide(:child_provider, :parent => :parent_provider)
+ }.to raise_error(Puppet::DevError, /Could not find parent provider.+parent_provider/)
+ end
+
+ it "should ensure its type has a 'provider' parameter" do
+ @type.provide(:test_provider)
+
+ @type.parameters.should include(:provider)
+ end
+
+ it "should remove a previously registered provider with the same name" do
+ old_provider = @type.provide(:test_provider)
+ new_provider = @type.provide(:test_provider)
+
+ old_provider.should_not equal(new_provider)
+ end
+
+ it "should register itself as a provider for the type" do
+ provider = @type.provide(:test_provider)
+
+ provider.should == @type.provider(:test_provider)
+ end
+
+ it "should create a provider when a provider with the same name previously failed" do
+ @type.provide(:test_provider) do
+ raise "failed to create this provider"
+ end rescue nil
+
+ provider = @type.provide(:test_provider)
+
+ provider.ancestors.should include(Puppet::Provider)
+ provider.should == @type.provider(:test_provider)
+ end
+ end
+
describe "when choosing a default provider" do
it "should choose the provider with the highest specificity" do
# Make a fake type