rspec-puppet 2.3.2 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -1
- data/README.md +37 -2
- data/lib/rspec-puppet.rb +10 -0
- data/lib/rspec-puppet/adapters.rb +212 -0
- data/lib/rspec-puppet/coverage.rb +47 -26
- data/lib/rspec-puppet/example/class_example_group.rb +4 -0
- data/lib/rspec-puppet/example/define_example_group.rb +4 -0
- data/lib/rspec-puppet/example/function_example_group.rb +2 -6
- data/lib/rspec-puppet/example/host_example_group.rb +4 -0
- data/lib/rspec-puppet/support.rb +13 -67
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 09f6ee077554387daa2811aecd6d308670c50693
|
4
|
+
data.tar.gz: c9c666f424696d2a649b0d034fcc645bb8cd1daf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ee25b36e54a9d9fda26f4b1e2d876ee87dbf783a7f216c57c7fbbeae1550a006178edc9358748c6e703b8629a2d0971217c46f6106dddd1f96ed978a3c8c2cd
|
7
|
+
data.tar.gz: 3083ad10c6066c73da20e5a15a6befbe7f4f54451913046be9a0791c5d52f43f2b346c2d0b52c3551f3f976bd6015149a1d6bb52ffe55a7b448e75acf6bdb59e
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,25 @@
|
|
2
2
|
All notable changes to this project will be documented in this file. This
|
3
3
|
project adheres to [Semantic Versioning](http://semver.org/).
|
4
4
|
|
5
|
+
## [2.4.0]
|
6
|
+
|
7
|
+
This release now supports testing exported resources in the same way that normal resources in the catalog are tested. Access them in your examples using `exported_resources`. See "Testing Exported Resources" in the README for examples.
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
|
11
|
+
* This release pulls out much of the version-specific code into separate classes to reduce complexity and enable easier maintenance going forward.
|
12
|
+
|
13
|
+
### Added
|
14
|
+
|
15
|
+
* Support colon-separated module_path and environmentpath values.
|
16
|
+
* Support a threshold for the code coverage test, that can fail the whole run.
|
17
|
+
* Ensure a consistent environment for all examples by adding a forced initialization of puppet before each.
|
18
|
+
|
19
|
+
### Credits
|
20
|
+
|
21
|
+
Thanks to Adrien Thebo, Arthur Gautier, Brett Gray, and Nicholas Hinds, as well as all the folks helping out on github for their contributions to this release.
|
22
|
+
|
23
|
+
|
5
24
|
## [2.3.2]
|
6
25
|
|
7
26
|
Properly fix yesterday's issue by unsharing the cache key before passing the data to puppet. This also contains a new test matrix to avoid missing a half-baked fix like yesterday.
|
@@ -95,7 +114,8 @@ Thanks to Adrien Thebo, Alex Harvey, Brian, Dan Bode, Dominic Cleal, Javier Pala
|
|
95
114
|
## 1.0.1 and earlier
|
96
115
|
For changelog of versions 1.0.1 and earlier, see http://rspec-puppet.com/changelog/
|
97
116
|
|
98
|
-
[2.x]: https://github.com/rodjek/rspec-puppet/compare/v2.
|
117
|
+
[2.x]: https://github.com/rodjek/rspec-puppet/compare/v2.4.0...master
|
118
|
+
[2.4.0]: https://github.com/rodjek/rspec-puppet/compare/v2.3.2...v2.4.0
|
99
119
|
[2.3.2]: https://github.com/rodjek/rspec-puppet/compare/v2.3.1...v2.3.2
|
100
120
|
[2.3.1]: https://github.com/rodjek/rspec-puppet/compare/v2.3.0...v2.3.1
|
101
121
|
[2.3.0]: https://github.com/rodjek/rspec-puppet/compare/v2.2.0...v2.3.0
|
data/README.md
CHANGED
@@ -429,6 +429,27 @@ However, if you want to specify it in each example, you can do so
|
|
429
429
|
let(:module_path) { '/path/to/your/module/dir' }
|
430
430
|
```
|
431
431
|
|
432
|
+
#### Testing Exported Resources
|
433
|
+
|
434
|
+
You can test if a resource was exported from the catalogue by using the
|
435
|
+
`exported_resources` accessor in combination with any of the standard matchers.
|
436
|
+
|
437
|
+
You can use `exported_resources` as the subject of a child context:
|
438
|
+
|
439
|
+
```ruby
|
440
|
+
context 'exported resources' do
|
441
|
+
subject { exported_resources }
|
442
|
+
|
443
|
+
it { is_expected.to contain_file('foo') }
|
444
|
+
end
|
445
|
+
```
|
446
|
+
|
447
|
+
You can also use `exported_resources` directly in a test:
|
448
|
+
|
449
|
+
```ruby
|
450
|
+
it { expect(exported_resources).to contain_file('foo') }
|
451
|
+
```
|
452
|
+
|
432
453
|
## Functions
|
433
454
|
|
434
455
|
### Matchers
|
@@ -601,16 +622,30 @@ spec/fixtures/hiera/hiera.yaml
|
|
601
622
|
## Producing coverage reports
|
602
623
|
|
603
624
|
You can output a basic resource coverage report with the following in
|
604
|
-
|
625
|
+
your `spec_helper.rb`
|
605
626
|
|
606
627
|
```ruby
|
607
|
-
|
628
|
+
RSpec.configure do |c|
|
629
|
+
c.after(:suite) do
|
630
|
+
RSpec::Puppet::Coverage.report!
|
631
|
+
end
|
632
|
+
end
|
608
633
|
```
|
609
634
|
|
610
635
|
This checks which Puppet resources have been explicitly checked as part
|
611
636
|
of the current test run and outputs both a coverage percentage and a
|
612
637
|
list of untouched resources.
|
613
638
|
|
639
|
+
A desired code coverage level can be provided. If this level is not achieved, a test failure will be raised. This can be used with a CI service, such as Jenkins or Bamboo, to enforce code coverage. The following example requires the code coverage to be at least 95%.
|
640
|
+
|
641
|
+
```ruby
|
642
|
+
RSpec.configure do |c|
|
643
|
+
c.after(:suite) do
|
644
|
+
RSpec::Puppet::Coverage.report!(95)
|
645
|
+
end
|
646
|
+
end
|
647
|
+
```
|
648
|
+
|
614
649
|
## Related projects
|
615
650
|
|
616
651
|
* [puppetlabs_spec_helper](https://github.com/puppetlabs/puppetlabs_spec_helper): shared spec helpers to setup puppet
|
data/lib/rspec-puppet.rb
CHANGED
@@ -7,6 +7,7 @@ require 'rspec-puppet/matchers'
|
|
7
7
|
require 'rspec-puppet/example'
|
8
8
|
require 'rspec-puppet/setup'
|
9
9
|
require 'rspec-puppet/coverage'
|
10
|
+
require 'rspec-puppet/adapters'
|
10
11
|
|
11
12
|
begin
|
12
13
|
require 'puppet/test/test_helper'
|
@@ -28,6 +29,7 @@ RSpec.configure do |c|
|
|
28
29
|
c.add_setting :ordering, :default => 'title-hash'
|
29
30
|
c.add_setting :stringify_facts, :default => true
|
30
31
|
c.add_setting :strict_variables, :default => false
|
32
|
+
c.add_setting :adapter
|
31
33
|
|
32
34
|
if defined?(Puppet::Test::TestHelper)
|
33
35
|
begin
|
@@ -64,4 +66,12 @@ RSpec.configure do |c|
|
|
64
66
|
end
|
65
67
|
end
|
66
68
|
end
|
69
|
+
|
70
|
+
c.before :each do
|
71
|
+
if self.class.ancestors.include? RSpec::Puppet::Support
|
72
|
+
@adapter = RSpec::Puppet::Adapters.get
|
73
|
+
@adapter.setup_puppet(self)
|
74
|
+
c.adapter = adapter
|
75
|
+
end
|
76
|
+
end
|
67
77
|
end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
module RSpec::Puppet
|
2
|
+
module Adapters
|
3
|
+
|
4
|
+
class Base
|
5
|
+
# Set up all Puppet settings applicable for this Puppet version
|
6
|
+
#
|
7
|
+
# @param example_group [RSpec::Core::ExampleGroup] The RSpec context to use for local settings
|
8
|
+
# @return [void]
|
9
|
+
def setup_puppet(example_group)
|
10
|
+
settings_map.each do |puppet_setting, rspec_setting|
|
11
|
+
set_setting(example_group, puppet_setting, rspec_setting)
|
12
|
+
end
|
13
|
+
@environment_name = example_group.environment
|
14
|
+
end
|
15
|
+
|
16
|
+
# Set up a specific Puppet setting.
|
17
|
+
# configuration setting.
|
18
|
+
#
|
19
|
+
# Puppet setting values can be taken from the global RSpec configuration, or from the currently
|
20
|
+
# executing RSpec context. When a setting is specified both in the global configuration and in
|
21
|
+
# the example group, the setting in the example group is preferred.
|
22
|
+
#
|
23
|
+
# @example Configuring a Puppet setting from a global RSpec configuration value
|
24
|
+
# RSpec.configure do |config|
|
25
|
+
# config.parser = "future"
|
26
|
+
# end
|
27
|
+
# # => Puppet[:parser] will be future
|
28
|
+
#
|
29
|
+
# @example Configuring a Puppet setting from within an RSpec example group
|
30
|
+
# RSpec.describe 'my_module::my_class', :type => :class do
|
31
|
+
# let(:module_path) { "/Users/luke/modules" }
|
32
|
+
# #=> Puppet[:modulepath] will be "/Users/luke/modules"
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# @example Configuring a Puppet setting with both a global RSpec configuration and local context
|
36
|
+
# RSpec.configure do |config|
|
37
|
+
# config.confdir = "/etc/puppet"
|
38
|
+
# end
|
39
|
+
# RSpec.describe 'my_module', :type => :class do
|
40
|
+
# # Puppet[:confdir] will be "/etc/puppet"
|
41
|
+
# end
|
42
|
+
# RSpec.describe 'my_module::my_class', :type => :class do
|
43
|
+
# let(:confdir) { "/etc/puppetlabs/puppet" }
|
44
|
+
# # => Puppet[:confdir] will be "/etc/puppetlabs/puppet" in this example group
|
45
|
+
# end
|
46
|
+
# RSpec.describe 'my_module::my_define', :type => :define do
|
47
|
+
# # Puppet[:confdir] will be "/etc/puppet" again
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# @param example_group [RSpec::Core::ExampleGroup] The RSpec context to use for local settings
|
51
|
+
# @param puppet_setting [Symbol] The name of the Puppet setting to configure
|
52
|
+
# @param rspec_setting [Symbol] The name of the RSpec context specific or global setting to use
|
53
|
+
# @return [void]
|
54
|
+
def set_setting(example_group, puppet_setting, rspec_setting)
|
55
|
+
if example_group.respond_to?(rspec_setting)
|
56
|
+
value = example_group.send(rspec_setting)
|
57
|
+
else
|
58
|
+
value = RSpec.configuration.send(rspec_setting)
|
59
|
+
end
|
60
|
+
begin
|
61
|
+
Puppet[puppet_setting] = value
|
62
|
+
rescue ArgumentError
|
63
|
+
# TODO: this silently swallows errors when applying settings that the current
|
64
|
+
# Puppet version does not accept, which means that user specified settings
|
65
|
+
# are ignored. This may lead to suprising behavior for users.
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def catalog(node, exported)
|
70
|
+
if exported
|
71
|
+
# Use the compiler directly to skip the filtering done by the indirector
|
72
|
+
Puppet::Parser::Compiler.compile(node).filter { |r| !r.exported? }
|
73
|
+
else
|
74
|
+
Puppet::Resource::Catalog.indirection.find(node.name, :use_node => node)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def current_environment
|
79
|
+
Puppet::Node::Environment.new(@environment_name)
|
80
|
+
end
|
81
|
+
|
82
|
+
def settings_map
|
83
|
+
[
|
84
|
+
[:modulepath, :module_path],
|
85
|
+
[:config, :config],
|
86
|
+
[:confdir, :confdir],
|
87
|
+
]
|
88
|
+
end
|
89
|
+
|
90
|
+
def modulepath
|
91
|
+
Puppet[:modulepath].split(File::PATH_SEPARATOR)
|
92
|
+
end
|
93
|
+
|
94
|
+
# @return [String, nil] The path to the Puppet manifest if it is present and set, nil otherwise.
|
95
|
+
def manifest
|
96
|
+
Puppet[:manifest]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class Adapter4X < Base
|
101
|
+
def setup_puppet(example_group)
|
102
|
+
super
|
103
|
+
|
104
|
+
if rspec_modulepath = RSpec.configuration.module_path
|
105
|
+
modulepath = rspec_modulepath.split(File::PATH_SEPARATOR)
|
106
|
+
else
|
107
|
+
modulepath = Puppet[:environmentpath].split(File::PATH_SEPARATOR).map do |path|
|
108
|
+
File.join(path, 'fixtures', 'modules')
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
if rspec_manifest = RSpec.configuration.manifest
|
113
|
+
manifest = rspec_manifest
|
114
|
+
else
|
115
|
+
manifest_paths = Puppet[:environmentpath].split(File::PATH_SEPARATOR).map do |path|
|
116
|
+
File.join(path, 'fixtures', 'manifests')
|
117
|
+
end
|
118
|
+
|
119
|
+
manifest = manifest_paths.find do |path|
|
120
|
+
File.exist?(path)
|
121
|
+
end
|
122
|
+
|
123
|
+
manifest ||= Puppet::Node::Environment::NO_MANIFEST
|
124
|
+
end
|
125
|
+
|
126
|
+
env = Puppet::Node::Environment.create(@environment_name, modulepath, manifest)
|
127
|
+
loader = Puppet::Environments::Static.new(env)
|
128
|
+
|
129
|
+
Puppet.push_context(
|
130
|
+
{
|
131
|
+
:environments => loader,
|
132
|
+
:current_environment => env
|
133
|
+
},
|
134
|
+
"Setup rspec-puppet environments"
|
135
|
+
)
|
136
|
+
end
|
137
|
+
|
138
|
+
def settings_map
|
139
|
+
super.concat([
|
140
|
+
[:environmentpath, :environmentpath],
|
141
|
+
[:hiera_config, :hiera_config],
|
142
|
+
[:strict_variables, :strict_variables],
|
143
|
+
])
|
144
|
+
end
|
145
|
+
|
146
|
+
def catalog(node, exported)
|
147
|
+
node.environment = current_environment
|
148
|
+
super
|
149
|
+
end
|
150
|
+
|
151
|
+
def current_environment
|
152
|
+
Puppet.lookup(:current_environment)
|
153
|
+
end
|
154
|
+
|
155
|
+
def modulepath
|
156
|
+
current_environment.modulepath
|
157
|
+
end
|
158
|
+
|
159
|
+
# Puppet 4.0 specially handles environments that don't have a manifest set, so we check for the no manifest value
|
160
|
+
# and return nil when it is set.
|
161
|
+
#
|
162
|
+
# @return [String, nil] The path to the Puppet manifest if it is present and set, nil otherwise.
|
163
|
+
def manifest
|
164
|
+
m = current_environment.manifest
|
165
|
+
if m == Puppet::Node::Environment::NO_MANIFEST
|
166
|
+
nil
|
167
|
+
else
|
168
|
+
m
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
class Adapter3X < Base
|
174
|
+
def settings_map
|
175
|
+
super.concat([
|
176
|
+
[:manifestdir, :manifest_dir],
|
177
|
+
[:manifest, :manifest],
|
178
|
+
[:templatedir, :template_dir],
|
179
|
+
[:hiera_config, :hiera_config],
|
180
|
+
[:parser, :parser],
|
181
|
+
[:trusted_node_data, :trusted_node_data],
|
182
|
+
[:ordering, :ordering],
|
183
|
+
[:stringify_facts, :stringify_facts],
|
184
|
+
[:strict_variables, :strict_variables],
|
185
|
+
])
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
class Adapter27 < Base
|
190
|
+
def settings_map
|
191
|
+
super.concat([
|
192
|
+
[:manifestdir, :manifest_dir],
|
193
|
+
[:manifest, :manifest],
|
194
|
+
[:templatedir, :template_dir],
|
195
|
+
])
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
def self.get
|
200
|
+
[
|
201
|
+
[4.0, Adapter4X],
|
202
|
+
[3.0, Adapter3X],
|
203
|
+
[2.7, Adapter27]
|
204
|
+
].each do |(version, klass)|
|
205
|
+
if Puppet.version.to_f >= version
|
206
|
+
return klass.new
|
207
|
+
end
|
208
|
+
end
|
209
|
+
raise "Puppet version #{Puppet.version.to_f} is not supported."
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
@@ -7,9 +7,13 @@ module RSpec::Puppet
|
|
7
7
|
extend Forwardable
|
8
8
|
def_delegators(:instance, :add, :cover!, :report!,
|
9
9
|
:filters, :add_filter, :add_from_catalog)
|
10
|
-
end
|
11
10
|
|
12
|
-
|
11
|
+
attr_writer :instance
|
12
|
+
|
13
|
+
def instance
|
14
|
+
@instance ||= new
|
15
|
+
end
|
16
|
+
end
|
13
17
|
|
14
18
|
def initialize
|
15
19
|
@collection = {}
|
@@ -44,18 +48,8 @@ module RSpec::Puppet
|
|
44
48
|
end
|
45
49
|
end
|
46
50
|
|
47
|
-
def report!
|
48
|
-
report =
|
49
|
-
|
50
|
-
report[:total] = @collection.size
|
51
|
-
report[:touched] = @collection.count { |_, resource| resource.touched? }
|
52
|
-
report[:untouched] = report[:total] - report[:touched]
|
53
|
-
report[:coverage] = sprintf("%5.2f", ((report[:touched].to_f/report[:total].to_f)*100))
|
54
|
-
|
55
|
-
report[:detailed] = Hash[*@collection.map do |name, wrapper|
|
56
|
-
[name, wrapper.to_hash]
|
57
|
-
end.flatten]
|
58
|
-
|
51
|
+
def report!(coverage_desired = nil)
|
52
|
+
report = results
|
59
53
|
puts <<-EOH.gsub(/^ {8}/, '')
|
60
54
|
|
61
55
|
Total resources: #{report[:total]}
|
@@ -68,16 +62,48 @@ module RSpec::Puppet
|
|
68
62
|
Untouched resources:
|
69
63
|
|
70
64
|
#{
|
71
|
-
untouched_resources = report[:
|
72
|
-
rsrc[
|
65
|
+
untouched_resources = report[:resources].reject do |_,rsrc|
|
66
|
+
rsrc[:touched]
|
73
67
|
end
|
74
68
|
untouched_resources.inject([]) do |memo, (name,_)|
|
75
69
|
memo << " #{name}"
|
76
70
|
end.sort.join("\n")
|
77
71
|
}
|
78
72
|
EOH
|
73
|
+
if coverage_desired
|
74
|
+
coverage_test(coverage_desired, report[:coverage])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def coverage_test(coverage_desired, coverage_actual)
|
80
|
+
if coverage_desired.is_a?(Numeric) && coverage_desired.to_f <= 100.00 && coverage_desired.to_f >= 0.0
|
81
|
+
coverage_test = RSpec.describe("Code coverage.")
|
82
|
+
coverage_results = coverage_test.example("Must be at least #{coverage_desired}% of code coverage") {
|
83
|
+
expect( coverage_actual.to_f ).to be >= coverage_desired.to_f
|
84
|
+
}
|
85
|
+
coverage_test.run
|
86
|
+
passed = coverage_results.execution_result.status == :passed
|
87
|
+
|
88
|
+
RSpec.configuration.reporter.example_failed coverage_results unless passed
|
89
|
+
else
|
90
|
+
puts "The desired coverage must be 0 <= x <= 100, not '#{coverage_desired.inspect}'"
|
79
91
|
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def results
|
95
|
+
report = {}
|
96
|
+
|
97
|
+
report[:total] = @collection.size
|
98
|
+
report[:touched] = @collection.count { |_, resource| resource.touched? }
|
99
|
+
report[:untouched] = report[:total] - report[:touched]
|
100
|
+
report[:coverage] = "%5.2f" % ((report[:touched].to_f / report[:total].to_f) * 100)
|
101
|
+
|
102
|
+
report[:resources] = Hash[*@collection.map do |name, wrapper|
|
103
|
+
[name, wrapper.to_hash]
|
104
|
+
end.flatten]
|
80
105
|
|
106
|
+
report
|
81
107
|
end
|
82
108
|
|
83
109
|
private
|
@@ -122,16 +148,11 @@ module RSpec::Puppet
|
|
122
148
|
#
|
123
149
|
# @return [Array<String>]
|
124
150
|
def module_paths(test_module)
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
paths = [File.join(modulepath, test_module, 'manifests'), manifest]
|
129
|
-
else
|
130
|
-
paths = Puppet[:modulepath].split(File::PATH_SEPARATOR).map do |dir|
|
131
|
-
File.join(dir, test_module, 'manifests')
|
132
|
-
end
|
133
|
-
paths << Puppet[:manifest]
|
151
|
+
adapter = RSpec.configuration.adapter
|
152
|
+
paths = adapter.modulepath.map do |dir|
|
153
|
+
File.join(dir, test_module, 'manifests')
|
134
154
|
end
|
155
|
+
paths << adapter.manifest if adapter.manifest
|
135
156
|
paths
|
136
157
|
end
|
137
158
|
|
@@ -156,7 +177,7 @@ module RSpec::Puppet
|
|
156
177
|
|
157
178
|
def to_hash
|
158
179
|
{
|
159
|
-
|
180
|
+
:touched => touched?,
|
160
181
|
}
|
161
182
|
end
|
162
183
|
|
@@ -10,7 +10,7 @@ module RSpec::Puppet
|
|
10
10
|
vardir = setup_puppet
|
11
11
|
|
12
12
|
if Puppet.version.to_f >= 4.0
|
13
|
-
env =
|
13
|
+
env = adapter.current_environment
|
14
14
|
loader = Puppet::Pops::Loaders.new(env)
|
15
15
|
func = loader.private_environment_loader.load(:function,function_name)
|
16
16
|
return func if func
|
@@ -87,11 +87,7 @@ module RSpec::Puppet
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def build_node(name, opts = {})
|
90
|
-
|
91
|
-
node_environment = build_4x_environment(environment)
|
92
|
-
else
|
93
|
-
node_environment = Puppet::Node::Environment.new(environment)
|
94
|
-
end
|
90
|
+
node_environment = adapter.current_environment
|
95
91
|
opts.merge!({:environment => node_environment})
|
96
92
|
Puppet::Node.new(name, opts)
|
97
93
|
end
|
data/lib/rspec-puppet/support.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'rspec-puppet/cache'
|
2
|
+
require 'rspec-puppet/adapters'
|
3
|
+
|
2
4
|
module RSpec::Puppet
|
3
5
|
module Support
|
4
6
|
|
@@ -12,7 +14,7 @@ module RSpec::Puppet
|
|
12
14
|
'rp_env'
|
13
15
|
end
|
14
16
|
|
15
|
-
def load_catalogue(type)
|
17
|
+
def load_catalogue(type, exported = false)
|
16
18
|
vardir = setup_puppet
|
17
19
|
|
18
20
|
if Puppet.version.to_f >= 4.0 or Puppet[:parser] == 'future'
|
@@ -25,7 +27,7 @@ module RSpec::Puppet
|
|
25
27
|
|
26
28
|
hiera_config_value = self.respond_to?(:hiera_config) ? hiera_config : nil
|
27
29
|
|
28
|
-
catalogue = build_catalog(node_name, facts_hash(node_name), hiera_config_value, code)
|
30
|
+
catalogue = build_catalog(node_name, facts_hash(node_name), hiera_config_value, code, exported)
|
29
31
|
|
30
32
|
test_module = class_name.split('::').first
|
31
33
|
RSpec::Puppet::Coverage.add_filter(type.to_s, self.class.description)
|
@@ -37,7 +39,7 @@ module RSpec::Puppet
|
|
37
39
|
|
38
40
|
def import_str
|
39
41
|
import_str = ""
|
40
|
-
|
42
|
+
adapter.modulepath.each { |d|
|
41
43
|
if File.exists?(File.join(d, 'manifests', 'init.pp'))
|
42
44
|
path_to_manifest = File.join([
|
43
45
|
d,
|
@@ -51,7 +53,7 @@ module RSpec::Puppet
|
|
51
53
|
].join("\n")
|
52
54
|
break
|
53
55
|
elsif File.exists?(d)
|
54
|
-
import_str = "import '#{
|
56
|
+
import_str = "import '#{adapter.manifest}'\n"
|
55
57
|
break
|
56
58
|
end
|
57
59
|
}
|
@@ -136,50 +138,7 @@ module RSpec::Puppet
|
|
136
138
|
vardir = Dir.mktmpdir
|
137
139
|
Puppet[:vardir] = vardir
|
138
140
|
|
139
|
-
|
140
|
-
settings = [
|
141
|
-
[:modulepath, :module_path],
|
142
|
-
[:environmentpath, :environmentpath],
|
143
|
-
[:config, :config],
|
144
|
-
[:confdir, :confdir],
|
145
|
-
[:hiera_config, :hiera_config],
|
146
|
-
[:strict_variables, :strict_variables],
|
147
|
-
]
|
148
|
-
elsif Puppet.version.to_f >= 3.0
|
149
|
-
settings = [
|
150
|
-
[:modulepath, :module_path],
|
151
|
-
[:manifestdir, :manifest_dir],
|
152
|
-
[:manifest, :manifest],
|
153
|
-
[:templatedir, :template_dir],
|
154
|
-
[:config, :config],
|
155
|
-
[:confdir, :confdir],
|
156
|
-
[:hiera_config, :hiera_config],
|
157
|
-
[:parser, :parser],
|
158
|
-
[:trusted_node_data, :trusted_node_data],
|
159
|
-
[:ordering, :ordering],
|
160
|
-
[:stringify_facts, :stringify_facts],
|
161
|
-
[:strict_variables, :strict_variables],
|
162
|
-
]
|
163
|
-
else
|
164
|
-
settings = [
|
165
|
-
[:modulepath, :module_path],
|
166
|
-
[:manifestdir, :manifest_dir],
|
167
|
-
[:manifest, :manifest],
|
168
|
-
[:templatedir, :template_dir],
|
169
|
-
[:config, :config],
|
170
|
-
[:confdir, :confdir],
|
171
|
-
]
|
172
|
-
end
|
173
|
-
settings.each do |a,b|
|
174
|
-
value = self.respond_to?(b) ? self.send(b) : RSpec.configuration.send(b)
|
175
|
-
begin
|
176
|
-
Puppet[a] = value
|
177
|
-
rescue ArgumentError
|
178
|
-
Puppet.settings.setdefaults(:main, {a => {:default => value, :desc => a.to_s}})
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
Puppet[:modulepath].split(File::PATH_SEPARATOR).map do |d|
|
141
|
+
adapter.modulepath.map do |d|
|
183
142
|
Dir["#{d}/*/lib"].entries
|
184
143
|
end.flatten.each do |lib|
|
185
144
|
$LOAD_PATH << lib
|
@@ -188,7 +147,7 @@ module RSpec::Puppet
|
|
188
147
|
vardir
|
189
148
|
end
|
190
149
|
|
191
|
-
def build_catalog_without_cache(nodename, facts_val, hiera_config_val, code)
|
150
|
+
def build_catalog_without_cache(nodename, facts_val, hiera_config_val, code, exported)
|
192
151
|
|
193
152
|
# If we're going to rebuild the catalog, we should clear the cached instance
|
194
153
|
# of Hiera that Puppet is using. This opens the possibility of the catalog
|
@@ -207,19 +166,7 @@ module RSpec::Puppet
|
|
207
166
|
|
208
167
|
node_obj = Puppet::Node.new(nodename, { :parameters => facts_val, :facts => node_facts })
|
209
168
|
|
210
|
-
|
211
|
-
if Puppet::Resource::Catalog.respond_to? :find
|
212
|
-
Puppet::Resource::Catalog.find(node_obj.name, :use_node => node_obj)
|
213
|
-
elsif Puppet.version.to_f >= 4.0
|
214
|
-
env = build_4x_environment(environment)
|
215
|
-
loader = Puppet::Environments::Static.new(env)
|
216
|
-
Puppet.override({:environments => loader}, 'Setup test environment') do
|
217
|
-
node_obj.environment = env
|
218
|
-
Puppet::Resource::Catalog.indirection.find(node_obj.name, :use_node => node_obj)
|
219
|
-
end
|
220
|
-
else
|
221
|
-
Puppet::Resource::Catalog.indirection.find(node_obj.name, :use_node => node_obj)
|
222
|
-
end
|
169
|
+
adapter.catalog(node_obj, exported)
|
223
170
|
end
|
224
171
|
|
225
172
|
def stub_facts!(facts)
|
@@ -259,10 +206,9 @@ module RSpec::Puppet
|
|
259
206
|
end
|
260
207
|
end
|
261
208
|
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
end
|
209
|
+
# @!attribute [r] adapter
|
210
|
+
# @api private
|
211
|
+
# @return [Class < RSpec::Puppet::Adapters::Base]
|
212
|
+
attr_accessor :adapter
|
267
213
|
end
|
268
214
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-puppet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Sharpe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -35,6 +35,7 @@ files:
|
|
35
35
|
- README.md
|
36
36
|
- bin/rspec-puppet-init
|
37
37
|
- lib/rspec-puppet.rb
|
38
|
+
- lib/rspec-puppet/adapters.rb
|
38
39
|
- lib/rspec-puppet/cache.rb
|
39
40
|
- lib/rspec-puppet/coverage.rb
|
40
41
|
- lib/rspec-puppet/errors.rb
|
@@ -78,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
79
|
version: '0'
|
79
80
|
requirements: []
|
80
81
|
rubyforge_project:
|
81
|
-
rubygems_version: 2.
|
82
|
+
rubygems_version: 2.5.1
|
82
83
|
signing_key:
|
83
84
|
specification_version: 4
|
84
85
|
summary: RSpec tests for your Puppet manifests
|