summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Robinson <matt@puppetlabs.com>2011-05-26 14:54:11 -0700
committerMatt Robinson <matt@puppetlabs.com>2011-05-26 14:57:36 -0700
commit654783564afd082c2e3e436cdf1bc3dc60308497 (patch)
treeb7b5447b5bd4f9f4821e00cdf8d9f20d7a561802
parent0bcbca53f3248137de517a4942e4db70ab06e296 (diff)
downloadpuppet-654783564afd082c2e3e436cdf1bc3dc60308497.tar.gz
puppet-654783564afd082c2e3e436cdf1bc3dc60308497.tar.xz
puppet-654783564afd082c2e3e436cdf1bc3dc60308497.zip
(#7690) Don't blow up when listing terminuses available for faces
Previously, in order to list the available terminuses for an indirected face we loaded all the the terminuses in order to list them. This meant that if a terminus like active_record didn't have the dependencies it needed, the documentation would raise errors and not list terminuses. <Puppet::Error: Could not autoload filename uninitialized constant Object::ActiveRecord> Now we just list the terminuses available in the load path without trying to load them. The terminus will still raise an error if you try to use it without its dependencies being met. Paired-with: Max Martin <max@puppetlabs.com>
-rw-r--r--lib/puppet/application/faces.rb6
-rw-r--r--lib/puppet/indirector/terminus.rb9
-rw-r--r--lib/puppet/util/autoload.rb28
-rwxr-xr-xspec/unit/indirector/terminus_spec.rb6
4 files changed, 25 insertions, 24 deletions
diff --git a/lib/puppet/application/faces.rb b/lib/puppet/application/faces.rb
index e7fce66b1..3145da821 100644
--- a/lib/puppet/application/faces.rb
+++ b/lib/puppet/application/faces.rb
@@ -66,7 +66,7 @@ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License
str = "#{name}:\n"
if arguments.include?("terminuses")
begin
- terms = terminus_classes(name.to_sym)
+ terms = Puppet::Indirector::Face.terminus_classes(name.to_sym)
str << "\tTerminuses: #{terms.join(", ")}\n"
rescue => detail
puts detail.backtrace if Puppet[:trace]
@@ -107,10 +107,6 @@ Copyright (c) 2011 Puppet Labs, LLC Licensed under the Apache 2.0 License
Puppet::Face.faces
end
- def terminus_classes(indirection)
- Puppet::Indirector::Terminus.terminus_classes(indirection).collect { |t| t.to_s }.sort
- end
-
def actions(indirection)
return [] unless face = Puppet::Face[indirection, '0.0.1']
face.load_actions
diff --git a/lib/puppet/indirector/terminus.rb b/lib/puppet/indirector/terminus.rb
index 4ebd0d004..d488869d1 100644
--- a/lib/puppet/indirector/terminus.rb
+++ b/lib/puppet/indirector/terminus.rb
@@ -111,12 +111,9 @@ class Puppet::Indirector::Terminus
# Return all terminus classes for a given indirection.
def terminus_classes(indirection_name)
setup_instance_loading indirection_name
-
- # Load them all.
- instance_loader(indirection_name).loadall
-
- # And return the list of names.
- loaded_instances(indirection_name)
+ instance_loader(indirection_name).files_to_load.map do |file|
+ File.basename(file).chomp(".rb").intern
+ end
end
private
diff --git a/lib/puppet/util/autoload.rb b/lib/puppet/util/autoload.rb
index 0e7025aef..6537a4a4e 100644
--- a/lib/puppet/util/autoload.rb
+++ b/lib/puppet/util/autoload.rb
@@ -105,23 +105,25 @@ class Puppet::Util::Autoload
# so that already-loaded files don't get reloaded unnecessarily.
def loadall
# Load every instance of everything we can find.
- searchpath.each do |dir|
- Dir.glob("#{dir}/*.rb").each do |file|
- name = File.basename(file).sub(".rb", '').intern
- next if loaded?(name)
- begin
- Kernel.require file
- loaded(name, file)
- rescue SystemExit,NoMemoryError
- raise
- rescue Exception => detail
- puts detail.backtrace if Puppet[:trace]
- raise Puppet::Error, "Could not autoload #{file}: #{detail}"
- end
+ files_to_load.each do |file|
+ name = File.basename(file).chomp(".rb").intern
+ next if loaded?(name)
+ begin
+ Kernel.require file
+ loaded(name, file)
+ rescue SystemExit,NoMemoryError
+ raise
+ rescue Exception => detail
+ puts detail.backtrace if Puppet[:trace]
+ raise Puppet::Error, "Could not autoload #{file}: #{detail}"
end
end
end
+ def files_to_load
+ searchpath.map { |dir| Dir.glob("#{dir}/*.rb") }.flatten
+ end
+
# The list of directories to search through for loadable plugins.
def searchpath(env=nil)
search_directories(env).uniq.collect { |d| File.join(d, @path) }.find_all { |d| FileTest.directory?(d) }
diff --git a/spec/unit/indirector/terminus_spec.rb b/spec/unit/indirector/terminus_spec.rb
index 33932cfca..2f37c1ff5 100755
--- a/spec/unit/indirector/terminus_spec.rb
+++ b/spec/unit/indirector/terminus_spec.rb
@@ -242,3 +242,9 @@ describe Puppet::Indirector::Terminus, " when creating terminus class types", :'
end
end
+describe Puppet::Indirector::Terminus, " when listing terminus classes" do
+ it "should list the terminus files available to load" do
+ Puppet::Util::Autoload.any_instance.stubs(:files_to_load).returns ["/foo/bar/baz", "/max/runs/marathon"]
+ Puppet::Indirector::Terminus.terminus_classes('my_stuff').should == [:baz, :marathon]
+ end
+end