Search manifests first within modules, and if no module is found, search in
the directory the current manifest is in. Glob patterns can be used for the path, but the path only matches a module if the first part of the path is not a glob. git-svn-id: https://reductivelabs.com/svn/puppet/trunk@2279 980ebf18-57e1-0310-9a29-db15c13687c0
This commit is contained in:
Родитель
38975de420
Коммит
0fa3c434b6
|
@ -3,6 +3,7 @@ class Puppet::Module
|
|||
|
||||
TEMPLATES = "templates"
|
||||
FILES = "files"
|
||||
MANIFESTS = "manifests"
|
||||
|
||||
# Return an array of paths by splitting the +modulepath+ config
|
||||
# parameter. Only consider paths that are absolute and existing
|
||||
|
@ -54,6 +55,26 @@ class Puppet::Module
|
|||
end
|
||||
end
|
||||
|
||||
# Return a list of manifests (as absolute filenames) that match +pat+
|
||||
# with the current directory set to +cwd+. If the first component of
|
||||
# +pat+ does not contain any wildcards and is an existing module, return
|
||||
# a list of manifests in that module matching the rest of +pat+
|
||||
# Otherwise, try to find manifests matching +pat+ relative to +cwd+
|
||||
def self.find_manifests(pat, cwd = nil)
|
||||
cwd ||= Dir.getwd
|
||||
mod = find(pat)
|
||||
if mod
|
||||
return mod.manifests(pat)
|
||||
else
|
||||
abspat = File::expand_path(pat, cwd)
|
||||
files = Dir.glob(abspat)
|
||||
if files.size == 0
|
||||
files = Dir.glob(abspat + ".pp")
|
||||
end
|
||||
return files
|
||||
end
|
||||
end
|
||||
|
||||
attr_reader :name, :path
|
||||
def initialize(name, path)
|
||||
@name = name
|
||||
|
@ -62,6 +83,7 @@ class Puppet::Module
|
|||
|
||||
def strip(file)
|
||||
n, rest = file.split(File::SEPARATOR, 2)
|
||||
rest = nil if rest && rest.empty?
|
||||
return rest
|
||||
end
|
||||
|
||||
|
@ -73,5 +95,16 @@ class Puppet::Module
|
|||
return File::join(path, FILES)
|
||||
end
|
||||
|
||||
def manifests(pat)
|
||||
rest = strip(pat)
|
||||
rest ||= "init.pp"
|
||||
p = File::join(path, MANIFESTS, rest)
|
||||
files = Dir.glob(p)
|
||||
if files.size == 0
|
||||
files = Dir.glob(p + ".pp")
|
||||
end
|
||||
return files
|
||||
end
|
||||
|
||||
private :initialize
|
||||
end
|
||||
|
|
|
@ -458,47 +458,42 @@ import: IMPORT quotedtext {
|
|||
end
|
||||
result = ast AST::ASTArray
|
||||
|
||||
Dir.chdir(dir) {
|
||||
# We can't interpolate at this point since we don't have any
|
||||
# scopes set up. Warn the user if they use a variable reference
|
||||
pat = val[1].value
|
||||
if pat.index("$")
|
||||
Puppet.warning(
|
||||
"The import of #{pat} contains a variable reference;" +
|
||||
" variables are not interpolated for imports " +
|
||||
"in file #{@lexer.file} at line #{@lexer.line}"
|
||||
)
|
||||
# We can't interpolate at this point since we don't have any
|
||||
# scopes set up. Warn the user if they use a variable reference
|
||||
pat = val[1].value
|
||||
if pat.index("$")
|
||||
Puppet.warning(
|
||||
"The import of #{pat} contains a variable reference;" +
|
||||
" variables are not interpolated for imports " +
|
||||
"in file #{@lexer.file} at line #{@lexer.line}"
|
||||
)
|
||||
end
|
||||
files = Puppet::Module::find_manifests(pat, dir)
|
||||
if files.size == 0
|
||||
raise Puppet::ImportError.new("No file(s) found for import " +
|
||||
"of '#{pat}'")
|
||||
end
|
||||
|
||||
files.each { |file|
|
||||
parser = Puppet::Parser::Parser.new(interp)
|
||||
parser.files = self.files
|
||||
Puppet.debug("importing '%s'" % file)
|
||||
|
||||
unless file =~ /^#{File::SEPARATOR}/
|
||||
file = File.join(dir, file)
|
||||
end
|
||||
files = Dir.glob(pat)
|
||||
if files.size == 0
|
||||
files = Dir.glob(pat + ".pp")
|
||||
if files.size == 0
|
||||
raise Puppet::ImportError.new("No file(s) found for import " +
|
||||
"of '#{pat}'")
|
||||
end
|
||||
begin
|
||||
parser.file = file
|
||||
rescue Puppet::ImportError
|
||||
Puppet.warning(
|
||||
"Importing %s would result in an import loop" %
|
||||
File.join(dir, file)
|
||||
)
|
||||
next
|
||||
end
|
||||
|
||||
files.each { |file|
|
||||
parser = Puppet::Parser::Parser.new(interp)
|
||||
parser.files = self.files
|
||||
Puppet.debug("importing '%s'" % file)
|
||||
|
||||
unless file =~ /^#{File::SEPARATOR}/
|
||||
file = File.join(dir, file)
|
||||
end
|
||||
begin
|
||||
parser.file = file
|
||||
rescue Puppet::ImportError
|
||||
Puppet.warning(
|
||||
"Importing %s would result in an import loop" %
|
||||
File.join(dir, file)
|
||||
)
|
||||
next
|
||||
end
|
||||
|
||||
# This will normally add code to the 'main' class.
|
||||
parser.parse
|
||||
}
|
||||
# This will normally add code to the 'main' class.
|
||||
parser.parse
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ module Puppet
|
|||
|
||||
class Parser < Racc::Parser
|
||||
|
||||
module_eval <<'..end grammar.ra modeval..id379b61d0b2', 'grammar.ra', 644
|
||||
module_eval <<'..end grammar.ra modeval..id83a5f213ec', 'grammar.ra', 639
|
||||
require 'puppet/parser/functions'
|
||||
|
||||
attr_reader :file, :interp
|
||||
|
@ -199,7 +199,7 @@ end
|
|||
|
||||
# $Id$
|
||||
|
||||
..end grammar.ra modeval..id379b61d0b2
|
||||
..end grammar.ra modeval..id83a5f213ec
|
||||
|
||||
##### racc 1.4.5 generates ###
|
||||
|
||||
|
@ -1496,7 +1496,7 @@ module_eval <<'.,.,', 'grammar.ra', 448
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 503
|
||||
module_eval <<'.,.,', 'grammar.ra', 498
|
||||
def _reduce_119( val, _values, result )
|
||||
# importing files
|
||||
# yuk, i hate keywords
|
||||
|
@ -1508,53 +1508,48 @@ module_eval <<'.,.,', 'grammar.ra', 503
|
|||
end
|
||||
result = ast AST::ASTArray
|
||||
|
||||
Dir.chdir(dir) {
|
||||
# We can't interpolate at this point since we don't have any
|
||||
# scopes set up. Warn the user if they use a variable reference
|
||||
pat = val[1].value
|
||||
if pat.index("$")
|
||||
Puppet.warning(
|
||||
"The import of #{pat} contains a variable reference;" +
|
||||
" variables are not interpolated for imports " +
|
||||
"in file #{@lexer.file} at line #{@lexer.line}"
|
||||
)
|
||||
# We can't interpolate at this point since we don't have any
|
||||
# scopes set up. Warn the user if they use a variable reference
|
||||
pat = val[1].value
|
||||
if pat.index("$")
|
||||
Puppet.warning(
|
||||
"The import of #{pat} contains a variable reference;" +
|
||||
" variables are not interpolated for imports " +
|
||||
"in file #{@lexer.file} at line #{@lexer.line}"
|
||||
)
|
||||
end
|
||||
files = Puppet::Module::find_manifests(pat, dir)
|
||||
if files.size == 0
|
||||
raise Puppet::ImportError.new("No file(s) found for import " +
|
||||
"of '#{pat}'")
|
||||
end
|
||||
|
||||
files.each { |file|
|
||||
parser = Puppet::Parser::Parser.new(interp)
|
||||
parser.files = self.files
|
||||
Puppet.debug("importing '%s'" % file)
|
||||
|
||||
unless file =~ /^#{File::SEPARATOR}/
|
||||
file = File.join(dir, file)
|
||||
end
|
||||
files = Dir.glob(pat)
|
||||
if files.size == 0
|
||||
files = Dir.glob(pat + ".pp")
|
||||
if files.size == 0
|
||||
raise Puppet::ImportError.new("No file(s) found for import " +
|
||||
"of '#{pat}'")
|
||||
end
|
||||
begin
|
||||
parser.file = file
|
||||
rescue Puppet::ImportError
|
||||
Puppet.warning(
|
||||
"Importing %s would result in an import loop" %
|
||||
File.join(dir, file)
|
||||
)
|
||||
next
|
||||
end
|
||||
|
||||
files.each { |file|
|
||||
parser = Puppet::Parser::Parser.new(interp)
|
||||
parser.files = self.files
|
||||
Puppet.debug("importing '%s'" % file)
|
||||
|
||||
unless file =~ /^#{File::SEPARATOR}/
|
||||
file = File.join(dir, file)
|
||||
end
|
||||
begin
|
||||
parser.file = file
|
||||
rescue Puppet::ImportError
|
||||
Puppet.warning(
|
||||
"Importing %s would result in an import loop" %
|
||||
File.join(dir, file)
|
||||
)
|
||||
next
|
||||
end
|
||||
|
||||
# This will normally add code to the 'main' class.
|
||||
parser.parse
|
||||
}
|
||||
# This will normally add code to the 'main' class.
|
||||
parser.parse
|
||||
}
|
||||
result
|
||||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 513
|
||||
module_eval <<'.,.,', 'grammar.ra', 508
|
||||
def _reduce_120( val, _values, result )
|
||||
interp.newdefine fqname(val[1]), :arguments => val[2], :code => val[4]
|
||||
@lexer.indefine = false
|
||||
|
@ -1565,7 +1560,7 @@ module_eval <<'.,.,', 'grammar.ra', 513
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 517
|
||||
module_eval <<'.,.,', 'grammar.ra', 512
|
||||
def _reduce_121( val, _values, result )
|
||||
interp.newdefine fqname(val[1]), :arguments => val[2]
|
||||
@lexer.indefine = false
|
||||
|
@ -1574,7 +1569,7 @@ module_eval <<'.,.,', 'grammar.ra', 517
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 525
|
||||
module_eval <<'.,.,', 'grammar.ra', 520
|
||||
def _reduce_122( val, _values, result )
|
||||
# Our class gets defined in the parent namespace, not our own.
|
||||
@lexer.namepop
|
||||
|
@ -1584,7 +1579,7 @@ module_eval <<'.,.,', 'grammar.ra', 525
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 530
|
||||
module_eval <<'.,.,', 'grammar.ra', 525
|
||||
def _reduce_123( val, _values, result )
|
||||
# Our class gets defined in the parent namespace, not our own.
|
||||
@lexer.namepop
|
||||
|
@ -1594,7 +1589,7 @@ module_eval <<'.,.,', 'grammar.ra', 530
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 535
|
||||
module_eval <<'.,.,', 'grammar.ra', 530
|
||||
def _reduce_124( val, _values, result )
|
||||
interp.newnode val[1], :parent => val[2], :code => val[4]
|
||||
result = nil
|
||||
|
@ -1602,7 +1597,7 @@ module_eval <<'.,.,', 'grammar.ra', 535
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 538
|
||||
module_eval <<'.,.,', 'grammar.ra', 533
|
||||
def _reduce_125( val, _values, result )
|
||||
interp.newnode val[1], :parent => val[2]
|
||||
result = nil
|
||||
|
@ -1616,7 +1611,7 @@ module_eval <<'.,.,', 'grammar.ra', 538
|
|||
|
||||
# reduce 128 omitted
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 550
|
||||
module_eval <<'.,.,', 'grammar.ra', 545
|
||||
def _reduce_129( val, _values, result )
|
||||
result = val[0]
|
||||
result = [result] unless result.is_a?(Array)
|
||||
|
@ -1631,14 +1626,14 @@ module_eval <<'.,.,', 'grammar.ra', 550
|
|||
|
||||
# reduce 132 omitted
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 558
|
||||
module_eval <<'.,.,', 'grammar.ra', 553
|
||||
def _reduce_133( val, _values, result )
|
||||
result = nil
|
||||
result
|
||||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 562
|
||||
module_eval <<'.,.,', 'grammar.ra', 557
|
||||
def _reduce_134( val, _values, result )
|
||||
result = ast AST::ASTArray, :children => []
|
||||
result
|
||||
|
@ -1647,14 +1642,14 @@ module_eval <<'.,.,', 'grammar.ra', 562
|
|||
|
||||
# reduce 135 omitted
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 567
|
||||
module_eval <<'.,.,', 'grammar.ra', 562
|
||||
def _reduce_136( val, _values, result )
|
||||
result = nil
|
||||
result
|
||||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 571
|
||||
module_eval <<'.,.,', 'grammar.ra', 566
|
||||
def _reduce_137( val, _values, result )
|
||||
result = val[1]
|
||||
result = [result] unless result[0].is_a?(Array)
|
||||
|
@ -1664,7 +1659,7 @@ module_eval <<'.,.,', 'grammar.ra', 571
|
|||
|
||||
# reduce 138 omitted
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 578
|
||||
module_eval <<'.,.,', 'grammar.ra', 573
|
||||
def _reduce_139( val, _values, result )
|
||||
result = val[0]
|
||||
result = [result] unless result[0].is_a?(Array)
|
||||
|
@ -1673,7 +1668,7 @@ module_eval <<'.,.,', 'grammar.ra', 578
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 583
|
||||
module_eval <<'.,.,', 'grammar.ra', 578
|
||||
def _reduce_140( val, _values, result )
|
||||
Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
|
||||
result = [val[0], val[2]]
|
||||
|
@ -1681,7 +1676,7 @@ module_eval <<'.,.,', 'grammar.ra', 583
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 587
|
||||
module_eval <<'.,.,', 'grammar.ra', 582
|
||||
def _reduce_141( val, _values, result )
|
||||
Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
|
||||
result = [val[0]]
|
||||
|
@ -1689,14 +1684,14 @@ module_eval <<'.,.,', 'grammar.ra', 587
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 589
|
||||
module_eval <<'.,.,', 'grammar.ra', 584
|
||||
def _reduce_142( val, _values, result )
|
||||
result = [val[0], val[2]]
|
||||
result
|
||||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 591
|
||||
module_eval <<'.,.,', 'grammar.ra', 586
|
||||
def _reduce_143( val, _values, result )
|
||||
result = [val[0]]
|
||||
result
|
||||
|
@ -1705,7 +1700,7 @@ module_eval <<'.,.,', 'grammar.ra', 591
|
|||
|
||||
# reduce 144 omitted
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 596
|
||||
module_eval <<'.,.,', 'grammar.ra', 591
|
||||
def _reduce_145( val, _values, result )
|
||||
result = val[1]
|
||||
result
|
||||
|
@ -1714,7 +1709,7 @@ module_eval <<'.,.,', 'grammar.ra', 596
|
|||
|
||||
# reduce 146 omitted
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 601
|
||||
module_eval <<'.,.,', 'grammar.ra', 596
|
||||
def _reduce_147( val, _values, result )
|
||||
result = val[1]
|
||||
result
|
||||
|
@ -1729,14 +1724,14 @@ module_eval <<'.,.,', 'grammar.ra', 601
|
|||
|
||||
# reduce 151 omitted
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 608
|
||||
module_eval <<'.,.,', 'grammar.ra', 603
|
||||
def _reduce_152( val, _values, result )
|
||||
result = ast AST::Variable, :value => val[0]
|
||||
result
|
||||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 616
|
||||
module_eval <<'.,.,', 'grammar.ra', 611
|
||||
def _reduce_153( val, _values, result )
|
||||
if val[1].instance_of?(AST::ASTArray)
|
||||
result = val[1]
|
||||
|
@ -1747,7 +1742,7 @@ module_eval <<'.,.,', 'grammar.ra', 616
|
|||
end
|
||||
.,.,
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 618
|
||||
module_eval <<'.,.,', 'grammar.ra', 613
|
||||
def _reduce_154( val, _values, result )
|
||||
result = ast AST::ASTArray
|
||||
result
|
||||
|
@ -1760,7 +1755,7 @@ module_eval <<'.,.,', 'grammar.ra', 618
|
|||
|
||||
# reduce 157 omitted
|
||||
|
||||
module_eval <<'.,.,', 'grammar.ra', 623
|
||||
module_eval <<'.,.,', 'grammar.ra', 618
|
||||
def _reduce_158( val, _values, result )
|
||||
result = nil
|
||||
result
|
||||
|
|
|
@ -658,6 +658,50 @@ file { "/tmp/yayness":
|
|||
parser.parse %{$testing = template()}
|
||||
}
|
||||
end
|
||||
|
||||
def test_module_import
|
||||
basedir = File.join(tmpdir(), "module-import")
|
||||
@@tmpfiles << basedir
|
||||
Dir.mkdir(basedir)
|
||||
modfiles = [ "init.pp", "mani1.pp", "mani2.pp",
|
||||
"sub/smani1.pp", "sub/smani2.pp" ]
|
||||
|
||||
modpath = File.join(basedir, "modules")
|
||||
Puppet[:modulepath] = modpath
|
||||
|
||||
modname = "amod"
|
||||
manipath = File::join(modpath, modname, Puppet::Module::MANIFESTS)
|
||||
FileUtils::mkdir_p(File::join(manipath, "sub"))
|
||||
targets = []
|
||||
modfiles.each do |fname|
|
||||
target = File::join(basedir, File::basename(fname, '.pp'))
|
||||
targets << target
|
||||
txt = %[ file { '#{target}': content => "#{fname}" } ]
|
||||
if fname == "init.pp"
|
||||
txt = %[import 'mani1' \nimport '#{modname}/mani2'\nimport '#{modname}/sub/*.pp' ] + txt
|
||||
end
|
||||
File::open(File::join(manipath, fname), "w") do |f|
|
||||
f.puts txt
|
||||
end
|
||||
end
|
||||
|
||||
manifest_texts = [ "import '#{modname}'",
|
||||
"import '#{modname}/init'",
|
||||
"import '#{modname}/init.pp'" ]
|
||||
|
||||
manifest = File.join(modpath, "manifest.pp")
|
||||
manifest_texts.each do |txt|
|
||||
File.open(manifest, "w") { |f| f.puts txt }
|
||||
|
||||
assert_nothing_raised {
|
||||
parser = mkparser
|
||||
parser.file = manifest
|
||||
parser.parse
|
||||
}
|
||||
assert_creates(manifest, *targets)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
# $Id$
|
||||
|
|
Загрузка…
Ссылка в новой задаче