summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Bode <dan@puppetlabs.com>2011-11-14 10:32:49 -0800
committerDan Bode <dan@puppetlabs.com>2011-11-14 13:22:55 -0800
commit05c67671fd442c4fc2f20293075495bb97879855 (patch)
treec4e3c3655fc798749447935e0cf9cfe4df4a5df2
parent86e86089fb41cb6fb2d6b7e358ed2afe0506fbeb (diff)
downloadpuppet-stdlib-05c67671fd442c4fc2f20293075495bb97879855.tar.gz
puppet-stdlib-05c67671fd442c4fc2f20293075495bb97879855.tar.bz2
(#10802) add new function get_module_path
This commit adds a new function called get_module_path. get_module_path returns the absolute path of a specified module. The code and functionality is very similar to how templates and files are detected inside of modules. the function has been tested against puppet 2.6.10 and 2.7.x
-rw-r--r--lib/puppet/parser/functions/get_module_path.rb17
-rw-r--r--spec/unit/puppet/parser/functions/get_module_path_spec.rb42
2 files changed, 59 insertions, 0 deletions
diff --git a/lib/puppet/parser/functions/get_module_path.rb b/lib/puppet/parser/functions/get_module_path.rb
new file mode 100644
index 0000000..4d2b50b
--- /dev/null
+++ b/lib/puppet/parser/functions/get_module_path.rb
@@ -0,0 +1,17 @@
+module Puppet::Parser::Functions
+ newfunction(:get_module_path, :type =>:rvalue, :doc => <<-EOT
+ Returns the absolute path of the specified module for the current
+ environment.
+
+ Example:
+ $module_path = get_module_path('stdlib')
+ EOT
+ ) do |args|
+ raise(Puppet::ParseError, "get_module_name(): Wrong number of arguments, expects one") unless args.size == 1
+ if module_path = Puppet::Module.find(args[0], compiler.environment.to_s)
+ module_path.path
+ else
+ raise(Puppet::ParseError, "Could not find module #{args[0]} in environment #{compiler.environment}")
+ end
+ end
+end
diff --git a/spec/unit/puppet/parser/functions/get_module_path_spec.rb b/spec/unit/puppet/parser/functions/get_module_path_spec.rb
new file mode 100644
index 0000000..d8340f4
--- /dev/null
+++ b/spec/unit/puppet/parser/functions/get_module_path_spec.rb
@@ -0,0 +1,42 @@
+#!/usr/bin/env rspec
+require 'puppet'
+require 'fileutils'
+require 'spec_helper'
+describe Puppet::Parser::Functions.function(:get_module_path) do
+ include PuppetSpec::Files
+
+ def get_scope(environment = 'production')
+ scope = Puppet::Parser::Scope.new
+ scope.compiler = Puppet::Parser::Compiler.new(Puppet::Node.new("floppy", :environment => environment))
+ scope
+ end
+ it 'should only allow one argument' do
+ expect { get_scope.function_get_module_path([]) }.should raise_error(Puppet::ParseError, /Wrong number of arguments, expects one/)
+ expect { get_scope.function_get_module_path(['1','2','3']) }.should raise_error(Puppet::ParseError, /Wrong number of arguments, expects one/)
+ end
+ it 'should raise an exception when the module cannot be found' do
+ expect { get_scope.function_get_module_path(['foo']) }.should raise_error(Puppet::ParseError, /Could not find module/)
+ end
+ describe 'when locating a module' do
+ let(:modulepath) { tmpdir('modulepath') }
+ let(:foo_path) { File.join(modulepath, 'foo') }
+ before(:each) { FileUtils.mkdir(foo_path) }
+ it 'should be able to find module paths from the modulepath setting' do
+ Puppet[:modulepath] = modulepath
+ get_scope.function_get_module_path(['foo']).should == foo_path
+ end
+ it 'should be able to find module paths when the modulepath is a list' do
+ Puppet[:modulepath] = modulepath + ":/tmp"
+ get_scope.function_get_module_path(['foo']).should == foo_path
+ end
+ it 'should be able to find module paths from the environment' do
+ conf_file = tmpfile('conffile')
+ File.open(conf_file, 'w') do |fh|
+ fh.write("[dansenvironment]\nmodulepath = #{modulepath}")
+ end
+ Puppet[:config] = conf_file
+ Puppet.parse_config
+ get_scope('dansenvironment').function_get_module_path(['foo']).should ==foo_path
+ end
+ end
+end