rspec-puppet 2.3.2 → 2.4.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/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
|