onceover 3.2.5 → 3.2.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +2 -1
- data/README.md +5 -0
- data/Rakefile +12 -2
- data/features/basic.feature +14 -0
- data/features/step_definitions/common.rb +18 -0
- data/features/support/env.rb +2 -0
- data/lib/onceover/beaker.rb +6 -6
- data/lib/onceover/cli/init.rb +3 -0
- data/lib/onceover/cli/plugins.rb +2 -2
- data/lib/onceover/cli/run.rb +2 -2
- data/lib/onceover/controlrepo.rb +83 -66
- data/lib/onceover/group.rb +3 -3
- data/lib/onceover/logger.rb +1 -1
- data/lib/onceover/node.rb +4 -1
- data/lib/onceover/rake_tasks.rb +14 -11
- data/lib/onceover/runner.rb +13 -14
- data/lib/onceover/test.rb +10 -11
- data/lib/onceover/testconfig.rb +36 -25
- data/onceover.gemspec +3 -2
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3017c18343feee112c67aa4d2eee9e96ed40c269
|
4
|
+
data.tar.gz: d7e83b25247b59be7f5585ef0d0929888340270a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3537a0ed03929ef0bb538aa291be8a38906ee17f0ff06901743571ec0905c05816b4459cd5febb3dff60b5bc47d2afae94a1902586160fd26438c36854fb03e4
|
7
|
+
data.tar.gz: a929a56a8431e7e853b671b23e39ed54c2a1bc40b8fea4f1a506e969a65a973b716ac8fcf49f60daa61d7990811468bac4b908b5c670731f1d0131afa57f993d
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -5,7 +5,7 @@ cache:
|
|
5
5
|
directories:
|
6
6
|
- 'spec/fixtures/puppet_controlrepo/.onceover' # Onceover cache
|
7
7
|
|
8
|
-
script:
|
8
|
+
script: bundle exec rake full_tests
|
9
9
|
bundler_args: --path vendor/bundle
|
10
10
|
|
11
11
|
rvm:
|
@@ -15,4 +15,5 @@ rvm:
|
|
15
15
|
- 2.1.9
|
16
16
|
- 2.2.7
|
17
17
|
- 2.3.4
|
18
|
+
- 2.4.0
|
18
19
|
- 2.4.1
|
data/README.md
CHANGED
@@ -634,6 +634,10 @@ Install gem dependencies:
|
|
634
634
|
|
635
635
|
`bundle install`
|
636
636
|
|
637
|
+
Clone the submodules
|
638
|
+
|
639
|
+
`git submodule init && git submodule update --recursive`
|
640
|
+
|
637
641
|
Execute tests
|
638
642
|
|
639
643
|
`bundle exec rake`
|
@@ -650,3 +654,4 @@ Cheers to all of those who helped out:
|
|
650
654
|
- natemccurdy
|
651
655
|
- aardvark
|
652
656
|
- Mandos
|
657
|
+
|
data/Rakefile
CHANGED
@@ -1,14 +1,24 @@
|
|
1
1
|
require 'rubygems/tasks'
|
2
2
|
require 'rspec/core/rake_task'
|
3
|
+
require 'cucumber/rake/task'
|
3
4
|
Gem::Tasks.new
|
4
5
|
|
5
6
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
6
7
|
t.rspec_opts = '--pattern spec/\*/\*_spec.rb'
|
7
8
|
end
|
8
9
|
|
9
|
-
|
10
|
+
Cucumber::Rake::Task.new
|
10
11
|
|
11
|
-
task
|
12
|
+
task default: :full_tests
|
13
|
+
|
14
|
+
desc "Run full set of tests"
|
15
|
+
task full_tests: [:unit_tests, :acceptance_tests]
|
16
|
+
|
17
|
+
desc "Run unit tests"
|
18
|
+
task unit_tests: [:syntax, :rubocop, :spec]
|
19
|
+
|
20
|
+
desc "Run acceptance tests"
|
21
|
+
task acceptance_tests: [:syntax, :rubocop, :cucumber]
|
12
22
|
|
13
23
|
task :syntax do
|
14
24
|
paths = ['lib',]
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Feature: Run basic function of Onceover
|
2
|
+
I would like to use executable file to run Onceover and read help
|
3
|
+
|
4
|
+
Background:
|
5
|
+
Given onceover executable
|
6
|
+
|
7
|
+
Scenario: Show main options with executable wihtout parameters
|
8
|
+
When I run onceover command ""
|
9
|
+
Then I see help for commands: "help, init, run, show, update"
|
10
|
+
|
11
|
+
Scenario: Show main help with "help" command
|
12
|
+
When I run onceover command "help"
|
13
|
+
Then I see help for commands: "help, init, run, show, update"
|
14
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Given /^onceover executable$/ do
|
2
|
+
@executable = ENV["BUNDLE_GEMFILE"] ? "bundle exec onceover " : "onceover "
|
3
|
+
end
|
4
|
+
|
5
|
+
When /^I run onceover command "([^"]*)"$/ do |arg1|
|
6
|
+
command = @executable + arg1
|
7
|
+
puts command
|
8
|
+
@output = `#{command}`
|
9
|
+
expect($?.success?).to be true
|
10
|
+
end
|
11
|
+
|
12
|
+
Then /^I see help for commands: "([^"]*)"$/ do |commands|
|
13
|
+
commands_help = @output[/COMMANDS(.*)OPTIONS/m, 1]
|
14
|
+
commands.split(',').each do |command|
|
15
|
+
result = commands_help.match(/^\s+#{command.strip}.+\n/)
|
16
|
+
puts result.to_s if expect(result).not_to be nil
|
17
|
+
end
|
18
|
+
end
|
data/lib/onceover/beaker.rb
CHANGED
@@ -124,10 +124,10 @@ class Onceover
|
|
124
124
|
host.install_package('git')
|
125
125
|
|
126
126
|
# copy the file over to the host (Maybe I should be changing the directory here??)
|
127
|
-
scp_to(host,repo.r10k_config_file,'/tmp/r10k.yaml')
|
127
|
+
scp_to(host, repo.r10k_config_file, '/tmp/r10k.yaml')
|
128
128
|
|
129
129
|
# Do an r10k deploy
|
130
|
-
r10k_deploy(host,{
|
130
|
+
r10k_deploy(host, {
|
131
131
|
:puppetfile => true,
|
132
132
|
:configfile => '/tmp/r10k.yaml',
|
133
133
|
})
|
@@ -143,7 +143,7 @@ class Onceover
|
|
143
143
|
# This is not helpful for us. We want to be able to test all of our classes on
|
144
144
|
# all of our nodes, this could be a lot of vms and having them all running at once
|
145
145
|
# would be a real kick in the dick for whatever system was running it.
|
146
|
-
def self.provision_and_test(host,puppet_class,opts = {},repo = Onceover::Controlrepo.new)
|
146
|
+
def self.provision_and_test(host,puppet_class,opts = {}, repo = Onceover::Controlrepo.new)
|
147
147
|
warn "[DEPRECATION] #{__method__} is deprecated due to the removal of Beaker"
|
148
148
|
|
149
149
|
opts = {:runs_before_idempotency => 1}.merge(opts)
|
@@ -175,11 +175,11 @@ class Onceover
|
|
175
175
|
manifest = "include #{puppet_class}"
|
176
176
|
|
177
177
|
opts[:runs_before_idempotency].times do
|
178
|
-
apply_manifest_on(host,manifest,{:catch_failures => true})
|
178
|
+
apply_manifest_on(host, manifest, {:catch_failures => true})
|
179
179
|
end
|
180
180
|
|
181
181
|
if opts[:check_idempotency]
|
182
|
-
apply_manifest_on(host,manifest,{:catch_changes => true})
|
182
|
+
apply_manifest_on(host, manifest, {:catch_changes => true})
|
183
183
|
end
|
184
184
|
|
185
185
|
network_manager.cleanup
|
@@ -193,7 +193,7 @@ class Onceover
|
|
193
193
|
|
194
194
|
def self.host_create(name, nodes)
|
195
195
|
warn "[DEPRECATION] #{__method__} is deprecated due to the removal of Beaker"
|
196
|
-
|
196
|
+
|
197
197
|
require 'beaker/network_manager'
|
198
198
|
|
199
199
|
current_opts = {}
|
data/lib/onceover/cli/init.rb
CHANGED
@@ -20,6 +20,9 @@ tool to work.
|
|
20
20
|
|
21
21
|
run do |opts, args, cmd|
|
22
22
|
Onceover::Controlrepo.init(Onceover::Controlrepo.new(opts))
|
23
|
+
# Would it make sense for #init to be a class instance method of Controlrepo ? Then you could:
|
24
|
+
# cp = Onceover::Controlrepo.new(opts)
|
25
|
+
# cp.init
|
23
26
|
end
|
24
27
|
end
|
25
28
|
end
|
data/lib/onceover/cli/plugins.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
|
3
3
|
# Get all of the gems that start with onceover-
|
4
|
-
plugins = Gem::Specification.group_by{ |g| g.name }.keep_if do |name,details|
|
4
|
+
plugins = Gem::Specification.group_by{ |g| g.name }.keep_if do |name, details|
|
5
5
|
name =~ /^onceover-.*$/
|
6
6
|
end.keys
|
7
7
|
|
8
8
|
plugins.each do |plugin|
|
9
|
-
require plugin.gsub('-','/')
|
9
|
+
require plugin.gsub('-', '/')
|
10
10
|
end
|
data/lib/onceover/cli/run.rb
CHANGED
@@ -38,7 +38,7 @@ This includes deploying using r10k and running all custom tests.
|
|
38
38
|
usage 'spec'
|
39
39
|
summary 'Runs spec tests'
|
40
40
|
|
41
|
-
optional :p,
|
41
|
+
optional :p, :parallel, 'Runs spec tests in parallel. This increases speed at the cost of poorly formatted logs and irrelevant junit output.'
|
42
42
|
|
43
43
|
run do |opts, args, cmd|
|
44
44
|
repo = Onceover::Controlrepo.new(opts)
|
@@ -61,7 +61,7 @@ This includes deploying using r10k and running all custom tests.
|
|
61
61
|
warn "[DEPRECATION] Acceptance testing is deprecated due to the removal of Beaker dependencies"
|
62
62
|
warn "[DEPRECATION] Appeptance testing will be replaced by a more pluggable framework in the future, if you have ideas as to how this should be done please submit a ticket."
|
63
63
|
repo = Onceover::Controlrepo.new(opts)
|
64
|
-
runner = Onceover::Runner.new(repo,Onceover::TestConfig.new(repo.onceover_yaml,opts)
|
64
|
+
runner = Onceover::Runner.new(repo,Onceover::TestConfig.new(repo.onceover_yaml,opts), :acceptance)
|
65
65
|
runner.prepare!
|
66
66
|
runner.run_acceptance!
|
67
67
|
end
|
data/lib/onceover/controlrepo.rb
CHANGED
@@ -89,38 +89,38 @@ class Onceover
|
|
89
89
|
@root = opts[:path]
|
90
90
|
else
|
91
91
|
@root = Dir.pwd
|
92
|
-
until File.exist?(File.expand_path('./environment.conf'
|
92
|
+
until File.exist?(File.expand_path('./environment.conf', @root)) do
|
93
93
|
# Throw an exception if we can't go any further up
|
94
|
-
throw "Could not file root of the controlrepo anywhere above #{Dir.pwd}" if @root == File.expand_path('../'
|
94
|
+
throw "Could not file root of the controlrepo anywhere above #{Dir.pwd}" if @root == File.expand_path('../', @root)
|
95
95
|
|
96
96
|
# Step up and try again
|
97
|
-
@root = File.expand_path('../'
|
97
|
+
@root = File.expand_path('../', @root)
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
101
|
-
@onceover_yaml
|
101
|
+
@onceover_yaml = ENV['ONCEOVER_YAML'] || opts[:onceover_yaml] || File.expand_path("#{@root}/spec/onceover.yaml")
|
102
102
|
|
103
103
|
if File.exists?(@onceover_yaml) && _data = YAML.load_file(@onceover_yaml)
|
104
104
|
opts.merge!(_data.fetch('opts',{})||{})
|
105
105
|
end
|
106
|
-
opts.fetch(:facts_dir,'').sub!(%r{^[^/.].+} ){|path| File.expand_path(path
|
106
|
+
opts.fetch(:facts_dir,'').sub!(%r{^[^/.].+} ){|path| File.expand_path(path, @root)}
|
107
107
|
opts.fetch(:facts_files,[]).map!{|path| path =~ %r{^[/.]} ? path : File.expand_path(path, @root)}
|
108
108
|
|
109
|
-
@environmentpath = opts[:environmentpath]
|
110
|
-
@puppetfile = opts[:puppetfile]
|
111
|
-
@environment_conf = opts[:environment_conf] || File.expand_path('./environment.conf'
|
112
|
-
@spec_dir = opts[:spec_dir]
|
113
|
-
@facts_dir = opts[:facts_dir]
|
114
|
-
_facts_dirs = [@facts_dir, File.expand_path('../../../factsets',__FILE__)]
|
115
|
-
_facts_files = opts[:facts_files]
|
109
|
+
@environmentpath = opts[:environmentpath] || 'etc/puppetlabs/code/environments'
|
110
|
+
@puppetfile = opts[:puppetfile] || File.expand_path('./Puppetfile', @root)
|
111
|
+
@environment_conf = opts[:environment_conf] || File.expand_path('./environment.conf', @root)
|
112
|
+
@spec_dir = opts[:spec_dir] || File.expand_path('./spec', @root)
|
113
|
+
@facts_dir = opts[:facts_dir] || File.expand_path('factsets', @spec_dir)
|
114
|
+
_facts_dirs = [@facts_dir, File.expand_path('../../../factsets', __FILE__)]
|
115
|
+
_facts_files = opts[:facts_files] || _facts_dirs.map{|d| File.join(d, '*.json')}
|
116
116
|
@facts_files = _facts_files.map{|_path| Dir[_path]}.flatten
|
117
117
|
|
118
|
-
@nodeset_file = opts[:nodeset_file]
|
119
|
-
@role_regex = opts[:role_regex]
|
120
|
-
@profile_regex = opts[:profile_regex]
|
121
|
-
@tempdir = opts[:tempdir]
|
118
|
+
@nodeset_file = opts[:nodeset_file] || File.expand_path('./spec/acceptance/nodesets/onceover-nodes.yml', @root)
|
119
|
+
@role_regex = opts[:role_regex] ? Regexp.new(opts[:role_regex]) : /role[s]?:{2}/
|
120
|
+
@profile_regex = opts[:profile_regex] ? Regexp.new(opts[:profile_regex]) : /profile[s]?:{2}/
|
121
|
+
@tempdir = opts[:tempdir] || File.expand_path('./.onceover', @root)
|
122
122
|
$temp_modulepath = nil
|
123
|
-
@manifest = opts[:manifest]
|
123
|
+
@manifest = opts[:manifest] || config['manifest'] ? File.expand_path(config['manifest'], @root) : nil
|
124
124
|
@opts = opts
|
125
125
|
logger.level = :debug if @opts[:debug]
|
126
126
|
@@existing_controlrepo = self
|
@@ -159,7 +159,7 @@ class Onceover
|
|
159
159
|
|
160
160
|
# Make sure that the paths are relative to the controlrepo root
|
161
161
|
code_dirs.map! do |dir|
|
162
|
-
File.expand_path(dir
|
162
|
+
File.expand_path(dir, @root)
|
163
163
|
end
|
164
164
|
|
165
165
|
# Get all the classes from all of the manifests
|
@@ -230,8 +230,8 @@ class Onceover
|
|
230
230
|
end
|
231
231
|
else
|
232
232
|
return_hash[:current_version] = "N/A"
|
233
|
-
return_hash[:latest_version]
|
234
|
-
return_hash[:out_of_date]
|
233
|
+
return_hash[:latest_version] = "N/A"
|
234
|
+
return_hash[:out_of_date] = "N/A"
|
235
235
|
end
|
236
236
|
output_array << return_hash
|
237
237
|
end
|
@@ -239,11 +239,11 @@ class Onceover
|
|
239
239
|
|
240
240
|
threads.map(&:join)
|
241
241
|
|
242
|
-
tp output_array,
|
243
|
-
{:full_name
|
244
|
-
{:current_version => {:display_name => "Current Version"}},
|
245
|
-
{:latest_version
|
246
|
-
{:out_of_date
|
242
|
+
tp output_array,
|
243
|
+
{:full_name => {:display_name => "Full Name"}},
|
244
|
+
{:current_version => {:display_name => "Current Version"}},
|
245
|
+
{:latest_version => {:display_name => "Latest Version"}},
|
246
|
+
{:out_of_date => {:display_name => "Out of Date?"}}
|
247
247
|
end
|
248
248
|
|
249
249
|
def update_puppetfile
|
@@ -291,9 +291,9 @@ class Onceover
|
|
291
291
|
modules = puppetfile.modules
|
292
292
|
|
293
293
|
# Iterate over everything and seperate it out for the sake of readability
|
294
|
-
symlinks
|
294
|
+
symlinks = []
|
295
295
|
forge_modules = []
|
296
|
-
repositories
|
296
|
+
repositories = []
|
297
297
|
|
298
298
|
modules.each do |mod|
|
299
299
|
logger.debug "Converting #{mod.to_s} to .fixtures.yml format"
|
@@ -303,14 +303,14 @@ class Onceover
|
|
303
303
|
# Set it up as a symlink, because we are using local files in the Puppetfile
|
304
304
|
symlinks << {
|
305
305
|
'name' => mod.name,
|
306
|
-
'dir'
|
306
|
+
'dir' => mod.expected_version[:path]
|
307
307
|
}
|
308
308
|
elsif mod.expected_version.is_a?(String)
|
309
|
-
# Set it up as a normal
|
309
|
+
# Set it up as a normal forge module
|
310
310
|
forge_modules << {
|
311
311
|
'name' => mod.name,
|
312
312
|
'repo' => mod.title,
|
313
|
-
'ref'
|
313
|
+
'ref' => mod.expected_version
|
314
314
|
}
|
315
315
|
end
|
316
316
|
elsif mod.is_a? R10K::Module::Git
|
@@ -320,7 +320,7 @@ class Onceover
|
|
320
320
|
# I know I shouldn't be doing this, but trust me, there are no methods
|
321
321
|
# anywhere that expose this value, I looked.
|
322
322
|
'repo' => mod.instance_variable_get(:@remote),
|
323
|
-
'ref'
|
323
|
+
'ref' => mod.version
|
324
324
|
}
|
325
325
|
end
|
326
326
|
end
|
@@ -335,20 +335,24 @@ class Onceover
|
|
335
335
|
Dir["#{dir}/*"].each do |mod|
|
336
336
|
symlinks << {
|
337
337
|
'name' => File.basename(mod),
|
338
|
-
'dir'
|
338
|
+
'dir' => Pathname.new(File.expand_path(mod)).relative_path_from(Pathname.new(@root))#File.expand_path(mod)
|
339
339
|
}
|
340
340
|
end
|
341
341
|
end
|
342
342
|
|
343
343
|
# Use an ERB template to write the files
|
344
|
-
Onceover::Controlrepo.evaluate_template('.fixtures.yml.erb',binding)
|
344
|
+
Onceover::Controlrepo.evaluate_template('.fixtures.yml.erb', binding)
|
345
345
|
end
|
346
346
|
|
347
347
|
def hiera_config_file
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
348
|
+
case
|
349
|
+
when File.exist?(File.expand_path('./hiera.yaml', @spec_dir))
|
350
|
+
File.expand_path('./hiera.yaml', @spec_dir)
|
351
|
+
when File.exist?(File.expand_path('./hiera.yaml', @root))
|
352
|
+
File.expand_path('./hiera.yaml', @root)
|
353
|
+
else
|
354
|
+
nil
|
355
|
+
end
|
352
356
|
end
|
353
357
|
|
354
358
|
def hiera_config_file_relative_path
|
@@ -402,9 +406,14 @@ class Onceover
|
|
402
406
|
end
|
403
407
|
|
404
408
|
def r10k_config_file
|
405
|
-
|
406
|
-
|
407
|
-
|
409
|
+
case
|
410
|
+
when File.exist?(File.expand_path('./r10k.yaml', @spec_dir))
|
411
|
+
File.expand_path('./r10k.yaml', @spec_dir)
|
412
|
+
when File.exist?(File.expand_path('./r10k.yaml', @root))
|
413
|
+
File.expand_path('./r10k.yaml', @root)
|
414
|
+
else
|
415
|
+
nil
|
416
|
+
end
|
408
417
|
end
|
409
418
|
|
410
419
|
def r10k_config
|
@@ -412,11 +421,11 @@ class Onceover
|
|
412
421
|
end
|
413
422
|
|
414
423
|
def r10k_config=(data)
|
415
|
-
File.write(r10k_config_file,data.to_yaml)
|
424
|
+
File.write(r10k_config_file, data.to_yaml)
|
416
425
|
end
|
417
426
|
|
418
427
|
def temp_manifest
|
419
|
-
config['manifest'] ? File.expand_path(config['manifest']
|
428
|
+
config['manifest'] ? File.expand_path(config['manifest'], @tempdir) : nil
|
420
429
|
end
|
421
430
|
|
422
431
|
def self.init(repo)
|
@@ -425,18 +434,26 @@ class Onceover
|
|
425
434
|
require 'pathname'
|
426
435
|
require 'colored'
|
427
436
|
|
428
|
-
Onceover::Controlrepo.init_write_file(generate_onceover_yaml(repo),repo.onceover_yaml)
|
437
|
+
Onceover::Controlrepo.init_write_file(generate_onceover_yaml(repo), repo.onceover_yaml)
|
429
438
|
# [DEPRECATION] Writing nodesets is deprecated due to the removal of Beaker"
|
430
439
|
#Onceover::Controlrepo.init_write_file(generate_nodesets(repo),repo.nodeset_file)
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
440
|
+
init_write_file(
|
441
|
+
evaluate_template('pre_conditions_README.md.erb', binding),
|
442
|
+
File.expand_path('./pre_conditions/README.md', repo.spec_dir))
|
443
|
+
init_write_file(
|
444
|
+
evaluate_template('factsets_README.md.erb', binding),
|
445
|
+
File.expand_path('./factsets/README.md', repo.spec_dir))
|
446
|
+
init_write_file(
|
447
|
+
evaluate_template('Rakefile.erb', binding),
|
448
|
+
File.expand_path('./Rakefile', repo.root))
|
449
|
+
init_write_file(
|
450
|
+
evaluate_template('Gemfile.erb', binding),
|
451
|
+
File.expand_path('./Gemfile', repo.root))
|
435
452
|
|
436
453
|
# Add .onceover to Gitignore
|
437
|
-
gitignore_path = File.expand_path('.gitignore',repo.root)
|
454
|
+
gitignore_path = File.expand_path('.gitignore', repo.root)
|
438
455
|
if File.exists? gitignore_path
|
439
|
-
gitignore_content = (File.open(gitignore_path,'r') {|f| f.read }).split("\n")
|
456
|
+
gitignore_content = (File.open(gitignore_path, 'r') {|f| f.read }).split("\n")
|
440
457
|
message = "#{'changed'.green}"
|
441
458
|
else
|
442
459
|
message = "#{'created'.green}"
|
@@ -445,14 +462,14 @@ class Onceover
|
|
445
462
|
|
446
463
|
unless gitignore_content.include?(".onceover")
|
447
464
|
gitignore_content << ".onceover\n"
|
448
|
-
File.open(gitignore_path,'w') {|f| f.write(gitignore_content.join("\n")) }
|
465
|
+
File.open(gitignore_path, 'w') {|f| f.write(gitignore_content.join("\n")) }
|
449
466
|
puts "#{message} #{Pathname.new(gitignore_path).relative_path_from(Pathname.new(Dir.pwd)).to_s}"
|
450
467
|
end
|
451
468
|
end
|
452
469
|
|
453
470
|
def self.generate_onceover_yaml(repo)
|
454
471
|
# This will return a controlrepo.yaml that can be written to a file
|
455
|
-
|
472
|
+
evaluate_template('controlrepo.yaml.erb', binding)
|
456
473
|
end
|
457
474
|
|
458
475
|
def self.generate_nodesets(repo)
|
@@ -465,9 +482,9 @@ class Onceover
|
|
465
482
|
hosts_hash = {}
|
466
483
|
|
467
484
|
repo.facts.each do |fact_set|
|
468
|
-
node_name = File.basename(repo.facts_files[repo.facts.index(fact_set)],'.json')
|
469
|
-
boxname
|
470
|
-
platform
|
485
|
+
node_name = File.basename(repo.facts_files[repo.facts.index(fact_set)], '.json')
|
486
|
+
boxname = Onceover::Beaker.facts_to_vagrant_box(fact_set)
|
487
|
+
platform = Onceover::Beaker.facts_to_platform(fact_set)
|
471
488
|
|
472
489
|
logger.debug "Querying hashicorp API for Vagrant box that matches #{boxname}"
|
473
490
|
|
@@ -484,7 +501,7 @@ class Onceover
|
|
484
501
|
comment_out = false
|
485
502
|
box_info = JSON.parse(response.body)
|
486
503
|
box_info['current_version']['providers'].each do |provider|
|
487
|
-
if
|
504
|
+
if provider['name'] == 'virtualbox'
|
488
505
|
url = provider['original_url']
|
489
506
|
end
|
490
507
|
end
|
@@ -501,7 +518,7 @@ class Onceover
|
|
501
518
|
end
|
502
519
|
|
503
520
|
# Use an ERB template
|
504
|
-
|
521
|
+
evaluate_template('nodeset.yaml.erb', binding)
|
505
522
|
end
|
506
523
|
|
507
524
|
def self.create_dirs_and_log(dir)
|
@@ -513,15 +530,15 @@ class Onceover
|
|
513
530
|
end
|
514
531
|
end
|
515
532
|
|
516
|
-
def self.evaluate_template(template_name,bind)
|
533
|
+
def self.evaluate_template(template_name, bind)
|
517
534
|
logger.debug "Evaluating template #{template_name}"
|
518
|
-
template_dir = File.expand_path('../../templates',File.dirname(__FILE__))
|
519
|
-
template = File.read(File.expand_path("./#{template_name}",template_dir))
|
535
|
+
template_dir = File.expand_path('../../templates', File.dirname(__FILE__))
|
536
|
+
template = File.read(File.expand_path("./#{template_name}", template_dir))
|
520
537
|
ERB.new(template, nil, '-').result(bind)
|
521
538
|
end
|
522
539
|
|
523
|
-
def self.init_write_file(contents,out_file)
|
524
|
-
|
540
|
+
def self.init_write_file(contents, out_file)
|
541
|
+
create_dirs_and_log(File.dirname(out_file))
|
525
542
|
if File.exists?(out_file)
|
526
543
|
puts "#{'skipped'.yellow} #{Pathname.new(out_file).relative_path_from(Pathname.new(Dir.pwd)).to_s} #{'(exists)'.yellow}"
|
527
544
|
else
|
@@ -536,13 +553,13 @@ class Onceover
|
|
536
553
|
require 'onceover/testconfig'
|
537
554
|
|
538
555
|
# Load up all of the tests and deduplicate them
|
539
|
-
testconfig = Onceover::TestConfig.new(@onceover_yaml
|
540
|
-
testconfig.spec_tests.each { |tst| testconfig.verify_spec_test(self,tst) }
|
556
|
+
testconfig = Onceover::TestConfig.new(@onceover_yaml, @opts)
|
557
|
+
testconfig.spec_tests.each { |tst| testconfig.verify_spec_test(self, tst) }
|
541
558
|
tests = testconfig.run_filters(Onceover::Test.deduplicate(testconfig.spec_tests))
|
542
559
|
|
543
560
|
# Loop over each test, executing the user's block on each
|
544
561
|
tests.each do |tst|
|
545
|
-
block.call(tst.classes[0].name,tst.nodes[0].name,tst.nodes[0].fact_set,testconfig.pre_condition)
|
562
|
+
block.call(tst.classes[0].name, tst.nodes[0].name, tst.nodes[0].fact_set, testconfig.pre_condition)
|
546
563
|
end
|
547
564
|
end
|
548
565
|
|
@@ -562,8 +579,8 @@ class Onceover
|
|
562
579
|
matches = []
|
563
580
|
if first_hash.has_key?(key)
|
564
581
|
if value.is_a?(Hash)
|
565
|
-
value.each do |k,v|
|
566
|
-
matches << keypair_is_in_hash(first_hash[key],k,v)
|
582
|
+
value.each do |k, v|
|
583
|
+
matches << keypair_is_in_hash(first_hash[key], k, v)
|
567
584
|
end
|
568
585
|
else
|
569
586
|
if first_hash[key] == value
|
data/lib/onceover/group.rb
CHANGED
@@ -5,7 +5,7 @@ class Onceover
|
|
5
5
|
class Group
|
6
6
|
@@all = []
|
7
7
|
|
8
|
-
# Work out how to do class
|
8
|
+
# Work out how to do class variables so that I can keep track of all the groups easily
|
9
9
|
attr_accessor :name
|
10
10
|
attr_accessor :members
|
11
11
|
|
@@ -13,7 +13,7 @@ class Onceover
|
|
13
13
|
# by itself, and yes it will reference them, not just create additional ones, woo!
|
14
14
|
|
15
15
|
def initialize(name = nil, members = [])
|
16
|
-
@name
|
16
|
+
@name = name
|
17
17
|
@members = []
|
18
18
|
|
19
19
|
case
|
@@ -21,7 +21,7 @@ class Onceover
|
|
21
21
|
# If it's already a valid list just chuck it in there
|
22
22
|
@members = members
|
23
23
|
when members.is_a?(Hash)
|
24
|
-
# if it's a hash then do subtractive
|
24
|
+
# if it's a hash then do subtractive stuff
|
25
25
|
@members = Onceover::TestConfig.subtractive_to_list(members)
|
26
26
|
when members.nil?
|
27
27
|
# Support empty groups yo
|
data/lib/onceover/logger.rb
CHANGED
data/lib/onceover/node.rb
CHANGED
@@ -15,7 +15,10 @@ class Onceover
|
|
15
15
|
|
16
16
|
# If we can't find the factset it will fail, so just catch that error and ignore it
|
17
17
|
begin
|
18
|
-
|
18
|
+
facts_file_index = Onceover::Controlrepo.facts_files.index {|facts_file|
|
19
|
+
File.basename(facts_file, '.json') == name
|
20
|
+
}
|
21
|
+
@fact_set = Onceover::Controlrepo.facts[facts_file_index]
|
19
22
|
rescue TypeError
|
20
23
|
@fact_set = nil
|
21
24
|
end
|
data/lib/onceover/rake_tasks.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
require 'onceover/controlrepo'
|
2
2
|
require 'pathname'
|
3
3
|
|
4
|
-
@repo
|
4
|
+
@repo = nil
|
5
5
|
@config = nil
|
6
6
|
|
7
7
|
|
8
8
|
desc 'Writes a `fixtures.yml` file based on the Puppetfile'
|
9
9
|
task :generate_fixtures do
|
10
10
|
repo = Onceover::Controlrepo.new
|
11
|
-
|
12
|
-
|
11
|
+
if File.exists?(File.expand_path('./.fixtures.yml', repo.root))
|
12
|
+
raise ".fixtures.yml already exits, we won't overwrite because we are scared"
|
13
|
+
end
|
14
|
+
File.write(File.expand_path('./.fixtures.yml', repo.root), repo.fixtures)
|
13
15
|
end
|
14
16
|
|
15
17
|
|
@@ -20,7 +22,8 @@ task :hiera_setup do
|
|
20
22
|
current_config.each do |key, value|
|
21
23
|
if value.is_a?(Hash)
|
22
24
|
if value.has_key?(:datadir)
|
23
|
-
|
25
|
+
hiera_config_path = Pathname.new(File.expand_path('..', repo.hiera_config_file))
|
26
|
+
current_config[key][:datadir] = Pathname.new(repo.hiera_data).relative_path_from(hiera_config_path).to_s
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
@@ -36,8 +39,8 @@ end
|
|
36
39
|
task :generate_onceover_yaml do
|
37
40
|
require 'onceover/controlrepo'
|
38
41
|
repo = Onceover::Controlrepo.new
|
39
|
-
template_dir = File.expand_path('../../templates',File.dirname(__FILE__))
|
40
|
-
onceover_yaml_template = File.read(File.expand_path('./controlrepo.yaml.erb',template_dir))
|
42
|
+
template_dir = File.expand_path('../../templates', File.dirname(__FILE__))
|
43
|
+
onceover_yaml_template = File.read(File.expand_path('./controlrepo.yaml.erb', template_dir))
|
41
44
|
puts ERB.new(onceover_yaml_template, nil, '-').result(binding)
|
42
45
|
end
|
43
46
|
|
@@ -54,9 +57,9 @@ task :generate_nodesets do
|
|
54
57
|
puts "HOSTS:"
|
55
58
|
|
56
59
|
repo.facts.each do |fact_set|
|
57
|
-
node_name = File.basename(repo.facts_files[repo.facts.index(fact_set)],'.json')
|
58
|
-
boxname
|
59
|
-
platform
|
60
|
+
node_name = File.basename(repo.facts_files[repo.facts.index(fact_set)], '.json')
|
61
|
+
boxname = Onceover::Beaker.facts_to_vagrant_box(fact_set)
|
62
|
+
platform = Onceover::Beaker.facts_to_platform(fact_set)
|
60
63
|
|
61
64
|
uri = URI("https://atlas.hashicorp.com:443/api/v1/box/#{boxname}")
|
62
65
|
request = Net::HTTP.new(uri.host, uri.port)
|
@@ -78,8 +81,8 @@ task :generate_nodesets do
|
|
78
81
|
end
|
79
82
|
|
80
83
|
# Use an ERB template
|
81
|
-
template_dir = File.expand_path('../../templates',File.dirname(__FILE__))
|
82
|
-
fixtures_template = File.read(File.expand_path('./nodeset.yaml.erb',template_dir))
|
84
|
+
template_dir = File.expand_path('../../templates', File.dirname(__FILE__))
|
85
|
+
fixtures_template = File.read(File.expand_path('./nodeset.yaml.erb', template_dir))
|
83
86
|
puts ERB.new(fixtures_template, nil, '-').result(binding)
|
84
87
|
end
|
85
88
|
|
data/lib/onceover/runner.rb
CHANGED
@@ -11,10 +11,8 @@ class Onceover
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def prepare!
|
14
|
-
|
15
|
-
|
16
|
-
@config.r10k_deploy_local(@repo)
|
17
|
-
end
|
14
|
+
# Deploy the control repo
|
15
|
+
@config.deploy_local(@repo, {:skip_r10k => @config.skip_r10k})
|
18
16
|
|
19
17
|
# Remove the entire spec directory to make sure we have
|
20
18
|
# all the latest tests
|
@@ -25,48 +23,49 @@ class Onceover
|
|
25
23
|
FileUtils.mkdir_p("#{@repo.tempdir}/spec/acceptance/nodesets")
|
26
24
|
|
27
25
|
# Copy our entire spec directory over
|
28
|
-
FileUtils.cp_r("#{@repo.spec_dir}","#{@repo.tempdir}")
|
26
|
+
FileUtils.cp_r("#{@repo.spec_dir}", "#{@repo.tempdir}")
|
29
27
|
|
30
28
|
# Create the Rakefile so that we can take advantage of the existing tasks
|
31
29
|
@config.write_rakefile(@repo.tempdir, "spec/classes/**/*_spec.rb")
|
32
30
|
|
33
31
|
# Create spec_helper.rb
|
34
|
-
@config.write_spec_helper("#{@repo.tempdir}/spec"
|
32
|
+
@config.write_spec_helper("#{@repo.tempdir}/spec", @repo)
|
35
33
|
|
36
34
|
# Create spec_helper_accpetance.rb
|
37
|
-
@config.write_spec_helper_acceptance("#{@repo.tempdir}/spec"
|
35
|
+
@config.write_spec_helper_acceptance("#{@repo.tempdir}/spec", @repo)
|
38
36
|
|
39
37
|
# TODO: Remove all tests that do not match set tags
|
40
38
|
|
41
39
|
if @mode.include?(:spec)
|
42
40
|
# Verify all of the spec tests
|
43
|
-
@config.spec_tests.each { |test| @config.verify_spec_test(@repo,test) }
|
41
|
+
@config.spec_tests.each { |test| @config.verify_spec_test(@repo, test) }
|
44
42
|
|
45
43
|
# Deduplicate and write the tests (Spec and Acceptance)
|
46
44
|
@config.run_filters(Onceover::Test.deduplicate(@config.spec_tests)).each do |test|
|
47
|
-
@config.write_spec_test("#{@repo.tempdir}/spec/classes",test)
|
45
|
+
@config.write_spec_test("#{@repo.tempdir}/spec/classes", test)
|
48
46
|
end
|
49
47
|
end
|
50
48
|
|
51
49
|
if @mode.include?(:acceptance)
|
52
50
|
# Verify all of the acceptance tests
|
53
|
-
@config.acceptance_tests.each { |test| @config.verify_acceptance_test(@repo,test) }
|
51
|
+
@config.acceptance_tests.each { |test| @config.verify_acceptance_test(@repo, test) }
|
54
52
|
|
55
53
|
# Write them out
|
56
|
-
@config.write_acceptance_tests("#{@repo.tempdir}/spec/acceptance"
|
54
|
+
@config.write_acceptance_tests("#{@repo.tempdir}/spec/acceptance",
|
55
|
+
@config.run_filters(Onceover::Test.deduplicate(@config.acceptance_tests)))
|
57
56
|
end
|
58
57
|
|
59
58
|
# Parse the current hiera config, modify, and write it to the temp dir
|
60
|
-
unless @repo.hiera_config ==nil
|
59
|
+
unless @repo.hiera_config == nil
|
61
60
|
hiera_config = @repo.hiera_config
|
62
|
-
hiera_config.each do |setting,value|
|
61
|
+
hiera_config.each do |setting, value|
|
63
62
|
if value.is_a?(Hash)
|
64
63
|
if value.has_key?(:datadir)
|
65
64
|
hiera_config[setting][:datadir] = "#{@repo.tempdir}/#{@repo.environmentpath}/production/#{value[:datadir]}"
|
66
65
|
end
|
67
66
|
end
|
68
67
|
end
|
69
|
-
File.write("#{@repo.tempdir}/#{@repo.environmentpath}/production/hiera.yaml",hiera_config.to_yaml)
|
68
|
+
File.write("#{@repo.tempdir}/#{@repo.environmentpath}/production/hiera.yaml", hiera_config.to_yaml)
|
70
69
|
end
|
71
70
|
|
72
71
|
@config.create_fixtures_symlinks(@repo)
|
data/lib/onceover/test.rb
CHANGED
@@ -11,24 +11,22 @@ class Onceover
|
|
11
11
|
# This can accept a bunch of stuff. It can accept nodes, classes or groups anywhere
|
12
12
|
# it will then detect them and expand them out into their respective objects so that
|
13
13
|
# we just end up with a list of nodes and classes
|
14
|
-
|
15
|
-
def initialize(on_this,test_this,test_config)
|
14
|
+
def initialize(on_this, test_this, test_config)
|
16
15
|
|
17
16
|
@default_test_config = {
|
18
|
-
'check_idempotency'
|
17
|
+
'check_idempotency' => true,
|
19
18
|
'runs_before_idempotency' => 1
|
20
19
|
}
|
21
20
|
|
22
21
|
# Add defaults if they do not exist
|
23
22
|
test_config = @default_test_config.merge(test_config)
|
24
23
|
|
25
|
-
@nodes
|
24
|
+
@nodes = []
|
26
25
|
@classes = []
|
27
26
|
@test_config = test_config
|
28
27
|
@test_config.delete('classes') # remove classes from the config
|
29
28
|
@tags = @test_config['tags']
|
30
29
|
|
31
|
-
|
32
30
|
# Make sure that tags are an array
|
33
31
|
@test_config['tags'] = [@test_config['tags']].flatten if @test_config['tags']
|
34
32
|
|
@@ -64,12 +62,12 @@ class Onceover
|
|
64
62
|
end
|
65
63
|
|
66
64
|
def eql?(other)
|
67
|
-
|
65
|
+
@nodes.sort.eql?(other.nodes.sort) and @classes.sort.eql?(other.classes.sort)
|
68
66
|
end
|
69
67
|
|
70
68
|
def to_s
|
71
69
|
class_msg = ""
|
72
|
-
node_msg
|
70
|
+
node_msg = ""
|
73
71
|
if classes.count > 1
|
74
72
|
class_msg = "#{classes.count}_classes"
|
75
73
|
else
|
@@ -91,7 +89,8 @@ class Onceover
|
|
91
89
|
|
92
90
|
# this will be an array of arrays, or maybe hashes
|
93
91
|
combinations = []
|
94
|
-
new_tests
|
92
|
+
new_tests = []
|
93
|
+
|
95
94
|
tests.each do |test|
|
96
95
|
test.nodes.each do |node|
|
97
96
|
test.classes.each do |cls|
|
@@ -104,7 +103,7 @@ class Onceover
|
|
104
103
|
end]
|
105
104
|
|
106
105
|
# Delete all default values in the current options hash
|
107
|
-
test.test_config.delete_if do |key,value|
|
106
|
+
test.test_config.delete_if do |key, value|
|
108
107
|
test.default_test_config[key] == value
|
109
108
|
end
|
110
109
|
|
@@ -112,7 +111,7 @@ class Onceover
|
|
112
111
|
relevant_test.test_config.deep_merge!(test.test_config)
|
113
112
|
else
|
114
113
|
combinations << combo
|
115
|
-
new_tests << Onceover::Test.new(node,cls,test.test_config)
|
114
|
+
new_tests << Onceover::Test.new(node, cls, test.test_config)
|
116
115
|
end
|
117
116
|
end
|
118
117
|
end
|
@@ -124,7 +123,7 @@ class Onceover
|
|
124
123
|
# we don't want too many copies of the same shit going around
|
125
124
|
#
|
126
125
|
# Actually based on the way things are written I don't think this
|
127
|
-
# will
|
126
|
+
# will deduplicate node or class objects, just test objects,
|
128
127
|
# everything else is passed by reference
|
129
128
|
new_tests
|
130
129
|
end
|
data/lib/onceover/testconfig.rb
CHANGED
@@ -26,7 +26,7 @@ class Onceover
|
|
26
26
|
attr_accessor :skip_r10k
|
27
27
|
attr_accessor :strict_variables
|
28
28
|
|
29
|
-
def initialize(file,opts = {})
|
29
|
+
def initialize(file, opts = {})
|
30
30
|
begin
|
31
31
|
config = YAML.load(File.read(file))
|
32
32
|
rescue Errno::ENOENT
|
@@ -53,26 +53,26 @@ class Onceover
|
|
53
53
|
@nodes = Onceover::Node.all
|
54
54
|
|
55
55
|
# Add the 'all_classes' and 'all_nodes' default groups
|
56
|
-
@node_groups
|
57
|
-
@class_groups << Onceover::Group.new('all_classes'
|
56
|
+
@node_groups << Onceover::Group.new('all_nodes', @nodes)
|
57
|
+
@class_groups << Onceover::Group.new('all_classes', @classes)
|
58
58
|
|
59
59
|
# Initialise all of the groups
|
60
60
|
config['node_groups'].each { |name, members| @node_groups << Onceover::Group.new(name, members) } unless config['node_groups'] == nil
|
61
61
|
config['class_groups'].each { |name, members| @class_groups << Onceover::Group.new(name, members) } unless config['class_groups'] == nil
|
62
62
|
|
63
|
-
@filter_tags
|
64
|
-
@filter_classes
|
65
|
-
@filter_nodes
|
66
|
-
@skip_r10k
|
63
|
+
@filter_tags = opts[:tags] ? [opts[:tags].split(',')].flatten : nil
|
64
|
+
@filter_classes = opts[:classes] ? [opts[:classes].split(',')].flatten.map {|x| Onceover::Class.find(x)} : nil
|
65
|
+
@filter_nodes = opts[:nodes] ? [opts[:nodes].split(',')].flatten.map {|x| Onceover::Node.find(x)} : nil
|
66
|
+
@skip_r10k = opts[:skip_r10k] ? true : false
|
67
67
|
|
68
68
|
# Loop over all of the items in the test matrix and add those as test
|
69
69
|
# objects to the list of tests
|
70
70
|
config['test_matrix'].each do |test_hash|
|
71
71
|
test_hash.each do |machines, settings|
|
72
72
|
if settings['tests'] == 'spec'
|
73
|
-
@spec_tests << Onceover::Test.new(machines,settings['classes'],settings)
|
73
|
+
@spec_tests << Onceover::Test.new(machines, settings['classes'], settings)
|
74
74
|
elsif settings['tests'] == 'acceptance'
|
75
|
-
@acceptance_tests << Onceover::Test.new(machines,settings['classes'],settings)
|
75
|
+
@acceptance_tests << Onceover::Test.new(machines, settings['classes'], settings)
|
76
76
|
elsif settings['tests'] == 'all_tests'
|
77
77
|
tst = Onceover::Test.new(machines,settings['classes'],settings)
|
78
78
|
@spec_tests << tst
|
@@ -125,7 +125,7 @@ class Onceover
|
|
125
125
|
include_list - exclude_list
|
126
126
|
end
|
127
127
|
|
128
|
-
def verify_spec_test(controlrepo,test)
|
128
|
+
def verify_spec_test(controlrepo, test)
|
129
129
|
test.nodes.each do |node|
|
130
130
|
unless controlrepo.facts_files.any? { |file| file =~ /\/#{node.name}\.json/ }
|
131
131
|
raise "Could not find factset for node: #{node.name}"
|
@@ -133,7 +133,7 @@ class Onceover
|
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
136
|
-
def verify_acceptance_test(controlrepo,test)
|
136
|
+
def verify_acceptance_test(controlrepo, test)
|
137
137
|
warn "[DEPRECATION] #{__method__} is deprecated due to the removal of Beaker"
|
138
138
|
|
139
139
|
require 'yaml'
|
@@ -157,9 +157,12 @@ class Onceover
|
|
157
157
|
puppetcode.join("\n")
|
158
158
|
end
|
159
159
|
|
160
|
-
def
|
160
|
+
def deploy_local(repo = Onceover::Controlrepo.new, opts = {})
|
161
161
|
require 'onceover/controlrepo'
|
162
162
|
require 'pathname'
|
163
|
+
|
164
|
+
skip_r10k = opts[:skip_r10k] || false
|
165
|
+
|
163
166
|
if repo.tempdir == nil
|
164
167
|
repo.tempdir = Dir.mktmpdir('r10k')
|
165
168
|
else
|
@@ -174,7 +177,7 @@ class Onceover
|
|
174
177
|
# We might need to exclude some files
|
175
178
|
#
|
176
179
|
# if we are using bundler to install gems below the controlrepo
|
177
|
-
# we don't
|
180
|
+
# we don't want two copies so exclude those
|
178
181
|
#
|
179
182
|
# If there are more situations like this we can add them to this array as
|
180
183
|
# full paths
|
@@ -187,8 +190,8 @@ class Onceover
|
|
187
190
|
|
188
191
|
# Exclude the files we need to
|
189
192
|
controlrepo_files = Dir.glob("#{repo.root}/**/*")
|
190
|
-
files_to_copy
|
191
|
-
folders_to_copy
|
193
|
+
files_to_copy = (controlrepo_files - excluded_files).delete_if { |path| Pathname(path).directory? }
|
194
|
+
folders_to_copy = (controlrepo_files - excluded_files).keep_if { |path| Pathname(path).directory? }
|
192
195
|
|
193
196
|
logger.debug "Creating temp dir as a staging directory for copying the controlrepo to #{repo.tempdir}"
|
194
197
|
temp_controlrepo = Dir.mktmpdir('controlrepo')
|
@@ -207,15 +210,17 @@ class Onceover
|
|
207
210
|
FileUtils.rm_rf(temp_controlrepo)
|
208
211
|
|
209
212
|
# Pull the trigger! If it's not already been pulled
|
210
|
-
if repo.tempdir
|
213
|
+
if repo.tempdir and not skip_r10k
|
211
214
|
if File.directory?(repo.tempdir)
|
212
215
|
# TODO: Change this to call out to r10k directly to do this
|
213
216
|
# Probably something like:
|
214
217
|
# R10K::Settings.global_settings.evaluate(with_overrides)
|
215
218
|
# R10K::Action::Deploy::Environment
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
+
prod_dir = "#{repo.tempdir}/#{repo.environmentpath}/production"
|
220
|
+
Dir.chdir(prod_dir) do
|
221
|
+
install_cmd = "r10k puppetfile install --verbose --color"
|
222
|
+
logger.debug "Running #{install_cmd} from #{prod_dir}"
|
223
|
+
system(install_cmd)
|
219
224
|
end
|
220
225
|
else
|
221
226
|
raise "#{repo.tempdir} is not a directory"
|
@@ -228,21 +233,25 @@ class Onceover
|
|
228
233
|
|
229
234
|
def write_spec_test(location, test)
|
230
235
|
# Use an ERB template to write a spec test
|
231
|
-
File.write("#{location}/#{test.to_s}_spec.rb",
|
236
|
+
File.write("#{location}/#{test.to_s}_spec.rb",
|
237
|
+
Onceover::Controlrepo.evaluate_template('test_spec.rb.erb', binding))
|
232
238
|
end
|
233
239
|
|
234
240
|
def write_acceptance_tests(location, tests)
|
235
241
|
warn "[DEPRECATION] #{__method__} is deprecated due to the removal of Beaker"
|
236
242
|
|
237
|
-
File.write("#{location}/acceptance_spec.rb",
|
243
|
+
File.write("#{location}/acceptance_spec.rb",
|
244
|
+
Onceover::Controlrepo.evaluate_template('acceptance_test_spec.rb.erb', binding))
|
238
245
|
end
|
239
246
|
|
240
247
|
def write_spec_helper_acceptance(location, repo)
|
241
|
-
File.write("#{location}/spec_helper_acceptance.rb",
|
248
|
+
File.write("#{location}/spec_helper_acceptance.rb",
|
249
|
+
Onceover::Controlrepo.evaluate_template('spec_helper_acceptance.rb.erb', binding))
|
242
250
|
end
|
243
251
|
|
244
252
|
def write_rakefile(location, pattern)
|
245
|
-
File.write("#{location}/Rakefile",
|
253
|
+
File.write("#{location}/Rakefile",
|
254
|
+
Onceover::Controlrepo.evaluate_template('testconfig_Rakefile.erb', binding))
|
246
255
|
end
|
247
256
|
|
248
257
|
def write_spec_helper(location, repo)
|
@@ -256,7 +265,8 @@ class Onceover
|
|
256
265
|
repo.temp_modulepath = modulepath
|
257
266
|
|
258
267
|
# Use an ERB template to write a spec test
|
259
|
-
File.write("#{location}/spec_helper.rb",
|
268
|
+
File.write("#{location}/spec_helper.rb",
|
269
|
+
Onceover::Controlrepo.evaluate_template('spec_helper.rb.erb', binding))
|
260
270
|
end
|
261
271
|
|
262
272
|
def create_fixtures_symlinks(repo)
|
@@ -279,7 +289,7 @@ class Onceover
|
|
279
289
|
'classes' => @filter_classes,
|
280
290
|
'nodes' => @filter_nodes
|
281
291
|
}
|
282
|
-
filters.each do |method,filter_list|
|
292
|
+
filters.each do |method, filter_list|
|
283
293
|
if filter_list
|
284
294
|
# Remove tests that do not have matching tags
|
285
295
|
tests.keep_if do |test|
|
@@ -295,5 +305,6 @@ class Onceover
|
|
295
305
|
end
|
296
306
|
tests
|
297
307
|
end
|
308
|
+
|
298
309
|
end
|
299
310
|
end
|
data/onceover.gemspec
CHANGED
@@ -3,7 +3,7 @@ $LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "onceover"
|
6
|
-
s.version = "3.2.
|
6
|
+
s.version = "3.2.6"
|
7
7
|
s.authors = ["Dylan Ratcliffe"]
|
8
8
|
s.email = ["dylan.ratcliffe@puppet.com"]
|
9
9
|
s.homepage = "https://github.com/dylanratcliffe/onceover"
|
@@ -38,5 +38,6 @@ Gem::Specification.new do |s|
|
|
38
38
|
# Development
|
39
39
|
s.add_development_dependency 'rubocop', '~> 0.39.0'
|
40
40
|
s.add_development_dependency 'rubygems-tasks', '~> 0.2.0'
|
41
|
-
|
41
|
+
s.add_development_dependency 'pry', '~> 0.10.0'
|
42
|
+
s.add_development_dependency 'cucumber', '~> 2.0'
|
42
43
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: onceover
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.2.
|
4
|
+
version: 3.2.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dylan Ratcliffe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -276,6 +276,34 @@ dependencies:
|
|
276
276
|
- - "~>"
|
277
277
|
- !ruby/object:Gem::Version
|
278
278
|
version: 0.2.0
|
279
|
+
- !ruby/object:Gem::Dependency
|
280
|
+
name: pry
|
281
|
+
requirement: !ruby/object:Gem::Requirement
|
282
|
+
requirements:
|
283
|
+
- - "~>"
|
284
|
+
- !ruby/object:Gem::Version
|
285
|
+
version: 0.10.0
|
286
|
+
type: :development
|
287
|
+
prerelease: false
|
288
|
+
version_requirements: !ruby/object:Gem::Requirement
|
289
|
+
requirements:
|
290
|
+
- - "~>"
|
291
|
+
- !ruby/object:Gem::Version
|
292
|
+
version: 0.10.0
|
293
|
+
- !ruby/object:Gem::Dependency
|
294
|
+
name: cucumber
|
295
|
+
requirement: !ruby/object:Gem::Requirement
|
296
|
+
requirements:
|
297
|
+
- - "~>"
|
298
|
+
- !ruby/object:Gem::Version
|
299
|
+
version: '2.0'
|
300
|
+
type: :development
|
301
|
+
prerelease: false
|
302
|
+
version_requirements: !ruby/object:Gem::Requirement
|
303
|
+
requirements:
|
304
|
+
- - "~>"
|
305
|
+
- !ruby/object:Gem::Version
|
306
|
+
version: '2.0'
|
279
307
|
description: Automatically generates tests for your Puppet code
|
280
308
|
email:
|
281
309
|
- dylan.ratcliffe@puppet.com
|
@@ -313,6 +341,9 @@ files:
|
|
313
341
|
- factsets/Windows_Server-2012r2-64.json
|
314
342
|
- factsets/solaris-10_u9-sparc-64.json
|
315
343
|
- factsets/solaris-11.2-sparc-64.json
|
344
|
+
- features/basic.feature
|
345
|
+
- features/step_definitions/common.rb
|
346
|
+
- features/support/env.rb
|
316
347
|
- lib/onceover/beaker.rb
|
317
348
|
- lib/onceover/beaker/spec_helper.rb
|
318
349
|
- lib/onceover/class.rb
|