puppet-retrospec 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +17 -0
- data/CHANGELOG.md +11 -0
- data/DEVELOPMENT.md +3 -0
- data/Gemfile +10 -9
- data/Gemfile.lock +2 -0
- data/README.md +211 -273
- data/Rakefile +8 -8
- data/VERSION +1 -1
- data/lib/retrospec-puppet.rb +3 -3
- data/lib/retrospec/plugins/v1/plugin/conditional.rb +5 -6
- data/lib/retrospec/plugins/v1/plugin/exceptions.rb +17 -0
- data/lib/retrospec/plugins/v1/plugin/generators.rb +7 -0
- data/lib/retrospec/plugins/v1/plugin/generators/fact_generator.rb +18 -10
- data/lib/retrospec/plugins/v1/plugin/generators/function_generator.rb +187 -0
- data/lib/retrospec/plugins/v1/plugin/generators/module_generator.rb +25 -26
- data/lib/retrospec/plugins/v1/plugin/generators/{facter.rb → parsers/facter.rb} +28 -35
- data/lib/retrospec/plugins/v1/plugin/generators/parsers/function.rb +91 -0
- data/lib/retrospec/plugins/v1/plugin/generators/parsers/type.rb +79 -0
- data/lib/retrospec/plugins/v1/plugin/generators/provider_generator.rb +107 -0
- data/lib/retrospec/plugins/v1/plugin/generators/schema_generator.rb +221 -0
- data/lib/retrospec/plugins/v1/plugin/generators/type_generator.rb +118 -0
- data/lib/retrospec/plugins/v1/plugin/helpers.rb +3 -7
- data/lib/retrospec/plugins/v1/plugin/puppet.rb +141 -60
- data/lib/retrospec/plugins/v1/plugin/puppet_module.rb +29 -26
- data/lib/retrospec/plugins/v1/plugin/resource.rb +6 -7
- data/lib/retrospec/plugins/v1/plugin/spec_object.rb +5 -8
- data/lib/retrospec/plugins/v1/plugin/template_helpers.rb +9 -10
- data/lib/retrospec/plugins/v1/plugin/templates/clone-hook +15 -8
- data/lib/retrospec/plugins/v1/plugin/type_code.rb +4 -4
- data/lib/retrospec/plugins/v1/plugin/variable_store.rb +26 -30
- data/lib/retrospec/plugins/v1/plugin/version.rb +1 -1
- data/puppet-retrospec.gemspec +43 -4
- data/spec/fixtures/facts/oracle_controls.rb +38 -0
- data/spec/fixtures/fixture_modules/required_parameters/manifests/init.pp +8 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/facter/fix_installed.rb +11 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/functions/awesome_parser.rb +13 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/functions/reduce.rb +31 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/bad_sha1.rb +6 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/defined.rb +94 -0
- data/spec/fixtures/fixture_modules/sample_module/lib/puppet/parser/functions/sha1.rb +6 -0
- data/spec/fixtures/fixture_modules/sample_module/spec/unit/facter/fix_installed_spec.rb +21 -0
- data/spec/fixtures/modules/tomcat/files/.gitkeep +0 -0
- data/spec/fixtures/modules/tomcat/templates/.gitkeep +0 -0
- data/spec/fixtures/modules/tomcat/tests/.gitkeep +0 -0
- data/spec/fixtures/providers/bmc/ipmitool.rb +188 -0
- data/spec/fixtures/providers/bmcuser/ipmitool.rb +140 -0
- data/spec/fixtures/types/bmc.rb +102 -0
- data/spec/fixtures/types/bmcuser.rb +46 -0
- data/spec/fixtures/types/db_opatch.rb +93 -0
- data/spec/integration/retrospec_spec.rb +1 -3
- data/spec/spec_helper.rb +33 -6
- data/spec/unit/conditional_spec.rb +12 -15
- data/spec/unit/generators/fact_generater_spec.rb +49 -17
- data/spec/unit/generators/function_generator_spec.rb +301 -0
- data/spec/unit/generators/function_spec.rb +67 -0
- data/spec/unit/generators/parsers/fact_spec.rb +62 -0
- data/spec/unit/generators/parsers/provider_spec.rb +44 -0
- data/spec/unit/generators/parsers/type_spec.rb +93 -0
- data/spec/unit/generators/provider_generator_spec.rb +120 -0
- data/spec/unit/generators/schema_generator_spec.rb +122 -0
- data/spec/unit/generators/type_generator_spec.rb +173 -0
- data/spec/unit/module_spec.rb +7 -10
- data/spec/unit/plugin_spec.rb +213 -15
- data/spec/unit/puppet-retrospec_spec.rb +81 -100
- data/spec/unit/resource_spec.rb +16 -17
- data/spec/unit/spec_object_spec.rb +46 -0
- data/spec/unit/type_code_spec.rb +9 -11
- data/spec/unit/variable_store_spec.rb +41 -43
- metadata +54 -4
- data/spec/unit/generators/fact_spec.rb +0 -58
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'singleton'
|
2
2
|
require 'puppet/face'
|
3
|
+
require_relative 'exceptions'
|
4
|
+
|
3
5
|
module Utilities
|
4
6
|
class PuppetModule
|
5
7
|
attr_writer :module_path
|
@@ -33,17 +35,13 @@ module Utilities
|
|
33
35
|
|
34
36
|
# create the temporary module create, validate the
|
35
37
|
def self.create_tmp_module_path
|
36
|
-
Utilities::PuppetModule
|
38
|
+
Utilities::PuppetModule.instance.create_tmp_module_path(module_path)
|
37
39
|
end
|
38
40
|
|
39
41
|
def self.clean_tmp_modules_dir
|
40
|
-
FileUtils.remove_entry_secure instance.tmp_modules_dir
|
41
|
-
end
|
42
|
-
|
43
|
-
def module_path
|
44
|
-
@module_path
|
42
|
+
FileUtils.remove_entry_secure instance.tmp_modules_dir # ensure we remove the temporary directory
|
45
43
|
end
|
46
|
-
|
44
|
+
attr_reader :module_path
|
47
45
|
# validate and set the module path
|
48
46
|
def module_path=(path)
|
49
47
|
@module_path = validate_module_dir(path)
|
@@ -62,14 +60,14 @@ module Utilities
|
|
62
60
|
if dir.nil?
|
63
61
|
dir = '.'
|
64
62
|
elsif dir.instance_of?(Array)
|
65
|
-
puts
|
66
|
-
|
63
|
+
puts 'Retrospec - an array of module paths is not supported at this time'.fatal
|
64
|
+
raise Retrospec::Puppet::InvalidModulePathError
|
67
65
|
end
|
68
66
|
dir = File.expand_path(dir)
|
69
|
-
manifest_dir = File.join(dir,'manifests')
|
70
|
-
if !
|
67
|
+
manifest_dir = File.join(dir, 'manifests')
|
68
|
+
if !File.exist?(manifest_dir)
|
71
69
|
puts "No manifest directory in #{manifest_dir}, cannot validate this is a module".fatal
|
72
|
-
|
70
|
+
raise Retrospec::Puppet::NoManifestDirError
|
73
71
|
else
|
74
72
|
files = Dir.glob("#{manifest_dir}/**/*.pp")
|
75
73
|
warn "No puppet manifest files found at #{manifest_dir}".warning if files.length < 1
|
@@ -80,7 +78,7 @@ module Utilities
|
|
80
78
|
Puppet::Face[:parser, :current].validate(file)
|
81
79
|
rescue SystemExit => e
|
82
80
|
puts "Manifest file: #{file} has parser errors, please fix and re-check using\n puppet parser validate #{file}".fatal
|
83
|
-
|
81
|
+
raise Retrospec::Puppet::ParserError
|
84
82
|
end
|
85
83
|
end
|
86
84
|
# switch back to current parser, since we rely on the AST parser
|
@@ -93,9 +91,9 @@ module Utilities
|
|
93
91
|
|
94
92
|
# puts a symlink in that module directory that points back to the user supplied module path
|
95
93
|
def create_tmp_module_path(module_path)
|
96
|
-
|
94
|
+
fail 'ModulePathNotFound' unless module_path
|
97
95
|
path = File.join(tmp_modules_dir, module_dir_name)
|
98
|
-
unless File.
|
96
|
+
unless File.exist?(path) # only create if it doesn't already exist
|
99
97
|
# create a link where source is the current repo and dest is /tmp/modules/module_name
|
100
98
|
FileUtils.ln_s(module_path, path)
|
101
99
|
end
|
@@ -109,26 +107,32 @@ module Utilities
|
|
109
107
|
# the directory name of the module
|
110
108
|
# usually this is the same as the module name but it can be namespaced sometimes
|
111
109
|
def module_dir_name
|
112
|
-
|
110
|
+
fail 'ModulePathNotFound' unless module_path
|
113
111
|
@module_dir_name ||= File.basename(module_path)
|
114
112
|
end
|
115
113
|
|
114
|
+
def module_dir_name=(name)
|
115
|
+
@module_dir_name = name
|
116
|
+
end
|
117
|
+
|
116
118
|
def module_type_names
|
117
|
-
types.map
|
119
|
+
types.map(&:name)
|
120
|
+
end
|
121
|
+
|
122
|
+
def module_name=(name)
|
123
|
+
@module_name = name
|
118
124
|
end
|
119
125
|
|
120
126
|
# returns the name of the module ie. mysql::config => mysql
|
121
127
|
def module_name
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
@module_name = module_dir_name
|
126
|
-
end
|
128
|
+
@module_name ||= types.first.name.split('::').first
|
129
|
+
rescue
|
130
|
+
@module_name ||= module_dir_name
|
127
131
|
end
|
128
132
|
|
129
133
|
# creates a tmp module directory so puppet can work correctly
|
130
134
|
def tmp_modules_dir
|
131
|
-
if @tmp_modules_dir.nil?
|
135
|
+
if @tmp_modules_dir.nil? || !File.exist?(@tmp_modules_dir)
|
132
136
|
dir = Dir.mktmpdir
|
133
137
|
tmp_path = File.expand_path(File.join(dir, 'modules'))
|
134
138
|
FileUtils.mkdir_p(tmp_path)
|
@@ -137,7 +141,6 @@ module Utilities
|
|
137
141
|
@tmp_modules_dir
|
138
142
|
end
|
139
143
|
|
140
|
-
|
141
144
|
# creates a puppet environment given a module path and environment name
|
142
145
|
def puppet_environment
|
143
146
|
@puppet_environment ||= Puppet::Node::Environment.create('production', [tmp_modules_dir])
|
@@ -164,12 +167,12 @@ module Utilities
|
|
164
167
|
end
|
165
168
|
|
166
169
|
# returns the resource types found in the module
|
167
|
-
def search_module(pattern='*')
|
170
|
+
def search_module(pattern = '*')
|
168
171
|
request = request(pattern, 'search')
|
169
172
|
resource_type_parser.search(request)
|
170
173
|
end
|
171
174
|
|
172
|
-
# TODO we need to parse the types and find all the types that inherit other types and then order them so we can load the files first
|
175
|
+
# TODO: we need to parse the types and find all the types that inherit other types and then order them so we can load the files first
|
173
176
|
def types
|
174
177
|
@types ||= search_module || []
|
175
178
|
end
|
@@ -1,14 +1,13 @@
|
|
1
1
|
require_relative 'variable_store'
|
2
2
|
|
3
3
|
class Resource
|
4
|
-
|
5
4
|
attr_reader :type, :title, :parameters, :scope_name
|
6
5
|
|
7
|
-
def initialize(type_name,instance)
|
6
|
+
def initialize(type_name, instance)
|
8
7
|
# we don't store the resource parameters in the variablestore because they are never referenced
|
9
|
-
@parameters = Hash[instance.parameters.map { |k| [k.param, VariableStore.resolve(k.value).
|
8
|
+
@parameters = Hash[instance.parameters.map { |k| [k.param, VariableStore.resolve(k.value).delete("\"")] }]
|
10
9
|
@type = type_name
|
11
|
-
@title = VariableStore.resolve(instance.title).
|
10
|
+
@title = VariableStore.resolve(instance.title).delete("\"")
|
12
11
|
end
|
13
12
|
|
14
13
|
# Gets all resources in the type that are not in a code block
|
@@ -20,7 +19,7 @@ class Resource
|
|
20
19
|
a = []
|
21
20
|
# sometimes the code is empty
|
22
21
|
if statements.respond_to?(:find_all)
|
23
|
-
res = statements.find_all { |s| s.instance_of?(Puppet::Parser::AST::Resource)}
|
22
|
+
res = statements.find_all { |s| s.instance_of?(Puppet::Parser::AST::Resource) }
|
24
23
|
res.each do |r|
|
25
24
|
r.instances.each do |i|
|
26
25
|
a << Resource.new(r.type, i)
|
@@ -31,6 +30,6 @@ class Resource
|
|
31
30
|
end
|
32
31
|
|
33
32
|
def self.all_resources
|
34
|
-
ObjectSpace.each_object(Puppet::Parser::AST::Resource).map {|x| x}
|
33
|
+
ObjectSpace.each_object(Puppet::Parser::AST::Resource).map { |x| x }
|
35
34
|
end
|
36
|
-
end
|
35
|
+
end
|
@@ -4,11 +4,9 @@ module Retrospec
|
|
4
4
|
# this object is passed to the templates for erb template rendering
|
5
5
|
# you can use data contained in this object in your templates
|
6
6
|
class SpecObject < Retrospec::Plugins::V1::ContextObject
|
7
|
-
|
8
7
|
attr_reader :instance, :module_path, :module_name, :all_hiera_data, :config
|
9
8
|
attr_accessor :enable_beaker_tests, :parameters, :types, :resources, :type
|
10
9
|
|
11
|
-
|
12
10
|
def initialize(mod_path, instance_data, config_data)
|
13
11
|
@instance = instance_data
|
14
12
|
@config = config_data
|
@@ -27,9 +25,9 @@ module Retrospec
|
|
27
25
|
def class_hiera_data(classname)
|
28
26
|
data = {}
|
29
27
|
types.each do |t|
|
30
|
-
next unless t.type == :hostclass
|
28
|
+
next unless t.type == :hostclass # defines don't have hiera lookup values
|
31
29
|
next unless t.name == classname
|
32
|
-
t.arguments.each do |k,
|
30
|
+
t.arguments.each do |k, _v|
|
33
31
|
key = "#{t.name}::#{k}"
|
34
32
|
data[key] = nil
|
35
33
|
end
|
@@ -42,8 +40,8 @@ module Retrospec
|
|
42
40
|
if @all_hiera_data.nil?
|
43
41
|
@all_hiera_data = {}
|
44
42
|
types.each do |t|
|
45
|
-
next unless t.type == :hostclass
|
46
|
-
t.arguments.each do |k,
|
43
|
+
next unless t.type == :hostclass # defines don't have hiera lookup values
|
44
|
+
t.arguments.each do |k, _v|
|
47
45
|
key = "#{t.name}::#{k}"
|
48
46
|
@all_hiera_data[key] = nil
|
49
47
|
end
|
@@ -64,7 +62,6 @@ module Retrospec
|
|
64
62
|
def fact_name
|
65
63
|
instance[:name]
|
66
64
|
end
|
67
|
-
|
68
65
|
end
|
69
66
|
end
|
70
|
-
end
|
67
|
+
end
|
@@ -4,12 +4,12 @@ module Retrospec
|
|
4
4
|
module TemplateHelpers
|
5
5
|
# creates the user supplied or default template directory
|
6
6
|
# returns: user_template_dir
|
7
|
-
def create_user_template_dir(user_template_directory=nil)
|
7
|
+
def create_user_template_dir(user_template_directory = nil)
|
8
8
|
if user_template_directory.nil?
|
9
9
|
user_template_directory = default_user_template_dir
|
10
10
|
end
|
11
11
|
# create default user template path or supplied user template path
|
12
|
-
|
12
|
+
unless File.exist?(user_template_directory)
|
13
13
|
FileUtils.mkdir_p(File.expand_path(user_template_directory))
|
14
14
|
end
|
15
15
|
user_template_directory
|
@@ -27,7 +27,7 @@ module Retrospec
|
|
27
27
|
|
28
28
|
# creates and syncs the specifed user template diretory
|
29
29
|
# returns: user_template_dir
|
30
|
-
def setup_user_template_dir(user_template_directory=nil, git_url=nil, branch=nil)
|
30
|
+
def setup_user_template_dir(user_template_directory = nil, git_url = nil, branch = nil)
|
31
31
|
if user_template_directory.nil?
|
32
32
|
user_template_directory = default_user_template_dir
|
33
33
|
end
|
@@ -37,7 +37,7 @@ module Retrospec
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def default_user_template_dir
|
40
|
-
File.expand_path(File.join(ENV['HOME'], '.retrospec','repos', 'retrospec-puppet-templates'
|
40
|
+
File.expand_path(File.join(ENV['HOME'], '.retrospec', 'repos', 'retrospec-puppet-templates'))
|
41
41
|
end
|
42
42
|
|
43
43
|
def gem_template_dir
|
@@ -49,15 +49,15 @@ module Retrospec
|
|
49
49
|
# from an external repo. Because templates are updated frequently
|
50
50
|
# and users will sometimes have client specific templates I wanted to
|
51
51
|
# externalize them for easier management.
|
52
|
-
def run_clone_hook(template_dir, git_url=nil, branch=nil)
|
53
|
-
if File.
|
54
|
-
hook_file = File.join(template_dir,'clone-hook')
|
52
|
+
def run_clone_hook(template_dir, git_url = nil, branch = nil)
|
53
|
+
if File.exist?(File.join(template_dir, 'clone-hook'))
|
54
|
+
hook_file = File.join(template_dir, 'clone-hook')
|
55
55
|
else
|
56
56
|
hook_file = File.join(gem_template_dir, 'clone-hook')
|
57
57
|
end
|
58
|
-
if File.
|
58
|
+
if File.exist?(hook_file)
|
59
59
|
output = `#{hook_file} #{template_dir} #{git_url} #{branch}`
|
60
|
-
if
|
60
|
+
if $CHILD_STATUS.success?
|
61
61
|
puts "Successfully ran hook: #{hook_file}".info
|
62
62
|
puts output.info
|
63
63
|
else
|
@@ -69,4 +69,3 @@ module Retrospec
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
@@ -2,7 +2,12 @@
|
|
2
2
|
require 'fileutils'
|
3
3
|
require 'open-uri'
|
4
4
|
|
5
|
-
|
5
|
+
# this hook is only called once until the template directory is clone
|
6
|
+
# once the template directory is cloned the, the clone hook from the template directory
|
7
|
+
# will be run instead of this file. This is on purpose in order to allow the user
|
8
|
+
# to easily to customize the hook.
|
9
|
+
|
10
|
+
@template_dir = ARGV[0] || File.join(ENV['HOME'], '.retrospec', 'repos', 'retrospec-puppet-templates')
|
6
11
|
@template_repo = ARGV[1] || 'https://github.com/nwops/retrospec-templates'
|
7
12
|
@template_branch = ARGV[2] || 'master'
|
8
13
|
|
@@ -14,26 +19,28 @@ def create_repo(template_dir, git_url, branch)
|
|
14
19
|
end
|
15
20
|
|
16
21
|
def git_exists?(template_dir)
|
17
|
-
File.
|
22
|
+
File.exist? File.join(template_dir, '.git', 'config')
|
18
23
|
end
|
19
24
|
|
20
25
|
def origin_exists?(template_dir)
|
21
26
|
`git -C #{template_dir} remote show origin`
|
22
|
-
|
27
|
+
$CHILD_STATUS.success?
|
23
28
|
end
|
24
29
|
|
25
|
-
def update_templates(git_url, dest, branch='master')
|
30
|
+
def update_templates(git_url, dest, branch = 'master')
|
26
31
|
create_repo(dest, git_url, branch)
|
27
32
|
puts `git -C #{dest} pull`
|
28
33
|
dest
|
29
34
|
end
|
30
35
|
|
31
36
|
def connected?
|
32
|
-
|
37
|
+
unless ENV['CLONE_RETROSPEC_TEMPLATES'].nil?
|
38
|
+
# if the user wants internet but doesn't want cloning, allow them to set this variable
|
39
|
+
return false
|
40
|
+
end
|
41
|
+
open('http://www.google.com/') rescue false
|
33
42
|
end
|
34
43
|
|
35
44
|
# sometimes I work on an airplane and don't care to clone everything all the time
|
36
45
|
# so lets check for connectivity first
|
37
|
-
if connected?
|
38
|
-
update_templates(@template_repo, @template_dir, @template_branch)
|
39
|
-
end
|
46
|
+
update_templates(@template_repo, @template_dir, @template_branch) if connected?
|
@@ -5,9 +5,9 @@ require 'retrospec/exceptions'
|
|
5
5
|
class TypeCode
|
6
6
|
attr_reader :type, :variables, :scope_name, :parent, :name
|
7
7
|
|
8
|
-
#TODO figure out how to store vardef statements that are contained inside conditional blocks
|
8
|
+
# TODO: figure out how to store vardef statements that are contained inside conditional blocks
|
9
9
|
def initialize(type)
|
10
|
-
|
10
|
+
fail TypeNotFoundException unless type
|
11
11
|
@scope_name = type.namespace
|
12
12
|
@name = type.name
|
13
13
|
@type = type
|
@@ -21,10 +21,10 @@ class TypeCode
|
|
21
21
|
# returns a list of variables found in the main code block
|
22
22
|
def variables
|
23
23
|
if @type.code.respond_to?(:find_all)
|
24
|
-
@variables ||= @type.code.find_all {|i| i.instance_of?(Puppet::Parser::AST::VarDef) }
|
24
|
+
@variables ||= @type.code.find_all { |i| i.instance_of?(Puppet::Parser::AST::VarDef) }
|
25
25
|
else
|
26
26
|
@variables = []
|
27
27
|
end
|
28
28
|
@variables
|
29
29
|
end
|
30
|
-
end
|
30
|
+
end
|
@@ -20,16 +20,14 @@ class VariableStore
|
|
20
20
|
|
21
21
|
# key should be a variable starting with $
|
22
22
|
# enable_value_conversion converts the value to a string
|
23
|
-
def self.add(key, value, enable_value_conversion=true)
|
24
|
-
if key.respond_to?(:value)
|
25
|
-
key = key.value
|
26
|
-
end
|
23
|
+
def self.add(key, value, enable_value_conversion = true)
|
24
|
+
key = key.value if key.respond_to?(:value)
|
27
25
|
# the key name must always be the same and look like $key_name or $key_name::other::name
|
28
26
|
key = "#{'$' + key.to_s}" unless key.to_s.start_with?('$')
|
29
|
-
key = key.to_s.gsub('$::', '$') if key.to_s.start_with?('$::')
|
30
|
-
#return if instance.store[key] == value
|
31
|
-
if value.instance_of?(String)
|
32
|
-
value = value.to_s.
|
27
|
+
key = key.to_s.gsub('$::', '$') if key.to_s.start_with?('$::') # sometimes variables start with $::
|
28
|
+
# return if instance.store[key] == value
|
29
|
+
if value.instance_of?(String) || value.instance_of?(Puppet::Parser::AST::String)
|
30
|
+
value = value.to_s.delete("\"")
|
33
31
|
end
|
34
32
|
if enable_value_conversion
|
35
33
|
instance.store[key.to_s] = value.to_s
|
@@ -40,22 +38,20 @@ class VariableStore
|
|
40
38
|
|
41
39
|
# lookup the key in the hash, if we dont' find it lets just return the string representation
|
42
40
|
def self.lookup(key)
|
43
|
-
if key.respond_to?(:value)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
key = key.gsub('$::', '$') if key.to_s.start_with?('$::') # sometimes variables start with $::
|
48
|
-
#puts "Looking up: #{key}"
|
41
|
+
key = key.value if key.respond_to?(:value)
|
42
|
+
key = "$#{key}" unless key.to_s.start_with?('$')
|
43
|
+
key = key.gsub('$::', '$') if key.to_s.start_with?('$::') # sometimes variables start with $::
|
44
|
+
# puts "Looking up: #{key}"
|
49
45
|
begin
|
50
46
|
value = VariableStore.instance.store.fetch(key.to_s)
|
51
47
|
# try and resolve if necessary
|
52
|
-
if [Puppet::Parser::AST::Variable,Puppet::Parser::AST::VarDef].include?(value.class)
|
48
|
+
if [Puppet::Parser::AST::Variable, Puppet::Parser::AST::VarDef].include?(value.class)
|
53
49
|
value = resolve(value)
|
54
50
|
else
|
55
51
|
if captures = value.scan(/(\$[::]?[\w+::]*\w+)/).flatten
|
56
52
|
# produces an array of variables that have not been resolved yet
|
57
53
|
# ["$concat1", "$concat"] = "$concat1/test3183/$concat"
|
58
|
-
captures.each { |c| value.gsub(c, resolve(c))}
|
54
|
+
captures.each { |c| value.gsub(c, resolve(c)) }
|
59
55
|
end
|
60
56
|
end
|
61
57
|
rescue
|
@@ -69,12 +65,12 @@ class VariableStore
|
|
69
65
|
res = nil
|
70
66
|
if variable.instance_of? Puppet::Parser::AST::VarDef
|
71
67
|
res = lookup(variable.name.value)
|
72
|
-
#add(variable.name, variable.value,false) unless res.nil?
|
68
|
+
# add(variable.name, variable.value,false) unless res.nil?
|
73
69
|
elsif variable.instance_of?(Puppet::Parser::AST::Variable)
|
74
70
|
res = lookup(variable.value)
|
75
71
|
elsif variable.instance_of?(Puppet::Parser::AST::Concat)
|
76
72
|
begin
|
77
|
-
res = variable.value.map { |i| variable_resolution(i)}.join.
|
73
|
+
res = variable.value.map { |i| variable_resolution(i) }.join.delete("\"")
|
78
74
|
rescue
|
79
75
|
res = variable.value
|
80
76
|
end
|
@@ -85,7 +81,7 @@ class VariableStore
|
|
85
81
|
unless res.nil?
|
86
82
|
if variable.instance_of?(Puppet::Parser::AST::Variable)
|
87
83
|
unless res = lookup(variable.to_s)
|
88
|
-
#add(variable.to_s, res)
|
84
|
+
# add(variable.to_s, res)
|
89
85
|
end
|
90
86
|
end
|
91
87
|
end
|
@@ -99,8 +95,8 @@ class VariableStore
|
|
99
95
|
|
100
96
|
# gets all the variables and parameters and passes them through the resolve function to populate the variable store
|
101
97
|
# we use recursion to evaluate inherited manifests
|
102
|
-
# TODO use the same recursion method to evaluate included manifests
|
103
|
-
def self.populate(type, is_parent=false)
|
98
|
+
# TODO: use the same recursion method to evaluate included manifests
|
99
|
+
def self.populate(type, is_parent = false)
|
104
100
|
if type.parent
|
105
101
|
p = type.parent.gsub(/\A::/, '')
|
106
102
|
parent = type.resource_type_collection.hostclasses[p]
|
@@ -110,14 +106,14 @@ class VariableStore
|
|
110
106
|
if parent
|
111
107
|
# type has a parent and we want to add the parent variables first so we call populate first
|
112
108
|
# then we load the type's variable
|
113
|
-
populate(parent,true)
|
109
|
+
populate(parent, true)
|
114
110
|
# we load the local scope and top scope variables because we need access to both
|
115
111
|
# there is a chance some of the local scope variables will be overwritten but by the time that happens
|
116
112
|
# we won't need them anymore.
|
117
|
-
type.arguments.each do |k,v|
|
113
|
+
type.arguments.each do |k, v|
|
118
114
|
# store the class params
|
119
|
-
add(k.to_s,resolve(v),true)
|
120
|
-
add(("$#{type.namespace}::" << k.to_s),resolve(v),true)
|
115
|
+
add(k.to_s, resolve(v), true)
|
116
|
+
add(("$#{type.namespace}::" << k.to_s), resolve(v), true)
|
121
117
|
end
|
122
118
|
TypeCode.new(type).variables.each do |v|
|
123
119
|
add(v.name.to_s, resolve(v.value))
|
@@ -125,14 +121,14 @@ class VariableStore
|
|
125
121
|
end
|
126
122
|
elsif is_parent
|
127
123
|
# if this is the parent we load the variables
|
128
|
-
type.arguments.each {|k,v| add(("$#{type.namespace}::" << k.to_s),resolve(v),true)}
|
129
|
-
TypeCode.new(type).variables.each {|v| add(("$#{type.namespace}::" << v.name.to_s), resolve(v.value))}
|
124
|
+
type.arguments.each { |k, v| add(("$#{type.namespace}::" << k.to_s), resolve(v), true) }
|
125
|
+
TypeCode.new(type).variables.each { |v| add(("$#{type.namespace}::" << v.name.to_s), resolve(v.value)) }
|
130
126
|
else
|
131
127
|
# if the type does not have a parent we load the variables
|
132
|
-
type.arguments.each do |k,v|
|
128
|
+
type.arguments.each do |k, v|
|
133
129
|
# store the class params
|
134
|
-
add(k.to_s,resolve(v),true)
|
135
|
-
add(("$#{type.namespace}::" << k.to_s),resolve(v),true)
|
130
|
+
add(k.to_s, resolve(v), true)
|
131
|
+
add(("$#{type.namespace}::" << k.to_s), resolve(v), true)
|
136
132
|
end
|
137
133
|
TypeCode.new(type).variables.each do |v|
|
138
134
|
add(v.name.to_s, resolve(v.value))
|