kitchen-puppet 1.45.2 → 1.45.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 40a9713672b9806409b38f36900cf478c2d328af
4
- data.tar.gz: 8063608365e1e9c90d0cd4c9e349cde7cca882f8
3
+ metadata.gz: cf7a2a60c11e9a20415c8fcfc8172075ad8ea7b5
4
+ data.tar.gz: cb579c531f8582c9959f5f6478958145709d0f65
5
5
  SHA512:
6
- metadata.gz: fd8ad621286b57d01d63c9bffa21bc5bee89fe108bb2dce7ce031a1ae28e0c3770feb5e03bfbf48899abed8e37ed3196064ae56bfed1bcfafa09b16f13d5194a
7
- data.tar.gz: 3edf3f8e9993365e7e01ecabfad9285d424ee1a9ddc8ab9876f28c691d5bc3ba4a2354550e9e6e386d54e051dfba5d6c4ef45030efba09e9fe089b3fa067ecca
6
+ metadata.gz: efac3f00213d07f2870a003ad45c7a2a1a05002da6e8d76841ef32cda1d3d5db333851b030f5b44ca6273323db67c6f829e737be0a4b0d54af486ff875cc84b5
7
+ data.tar.gz: d663a3526270cec9dbc62d694bda9e618a4f5b9dbcd551ce4ca3f4240a9b5a9826f837dd3664a4944e7320502c550af7105df65257e55c82dd92019f9c2d50a9
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Kitchen
4
4
  module Puppet
5
- VERSION = '1.45.2'.freeze
5
+ VERSION = '1.45.3'.freeze
6
6
  end
7
7
  end
@@ -182,8 +182,7 @@ module Kitchen
182
182
  INSTALL
183
183
  end
184
184
 
185
- def init_command
186
- end
185
+ def init_command; end
187
186
 
188
187
  def create_sandbox
189
188
  super
@@ -241,8 +240,7 @@ module Kitchen
241
240
 
242
241
  protected
243
242
 
244
- def load_needed_dependencies!
245
- end
243
+ def load_needed_dependencies!; end
246
244
 
247
245
  def puppet_config
248
246
  config[:puppet_config_path]
@@ -921,7 +921,7 @@ module Kitchen
921
921
  elsif powershell_shell?
922
922
  "; if(@(#{[config[:puppet_whitelist_exit_code]].join(', ')}) -contains $LASTEXITCODE) {exit 0} else {exit $LASTEXITCODE}"
923
923
  else
924
- "; [ $? -eq #{config[:puppet_whitelist_exit_code]} ] && exit 0"
924
+ '; RC=$?; [ ' + [config[:puppet_whitelist_exit_code]].flatten.map { |x| "\$RC -eq #{x}" }.join(' -o ') + ' ] && exit 0; exit $RC'
925
925
  end
926
926
  end
927
927
 
@@ -0,0 +1,1098 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Author:: Chris Lundquist (<chris.lundquist@github.com>) Neill Turner (<neillwturner@gmail.com>)
4
+ #
5
+ # Copyright (C) 2013,2014 Chris Lundquist, Neill Turner
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+ # See https://github.com/neillturner/kitchen-puppet/blob/master/provisioner_options.md
20
+ # for documentation configuration parameters with puppet_apply provisioner.
21
+ #
22
+
23
+ require 'uri'
24
+ require 'json'
25
+ require 'kitchen'
26
+ require 'kitchen/provisioner/puppet/librarian'
27
+
28
+ module Kitchen
29
+ class Busser
30
+ def non_suite_dirs
31
+ %w(data data_bags environments nodes roles puppet)
32
+ end
33
+ end
34
+
35
+ module Configurable
36
+ def platform_name
37
+ instance.platform.name
38
+ end
39
+ end
40
+
41
+ module Provisioner
42
+ #
43
+ # Puppet Apply provisioner.
44
+ #
45
+ class PuppetApply < Base
46
+ attr_accessor :tmp_dir
47
+
48
+ default_config :require_puppet_collections, false
49
+ default_config :puppet_yum_collections_repo, 'http://yum.puppetlabs.com/puppetlabs-release-pc1-el-6.noarch.rpm'
50
+ default_config :puppet_apt_collections_repo, 'http://apt.puppetlabs.com/puppetlabs-release-pc1-wheezy.deb'
51
+ default_config :puppet_coll_remote_path, '/opt/puppetlabs'
52
+ default_config :puppet_version, nil
53
+ default_config :facter_version, nil
54
+ default_config :hiera_version, nil
55
+ default_config :install_hiera, false
56
+ default_config :hiera_package, 'hiera-puppet'
57
+ default_config :require_puppet_repo, true
58
+ default_config :require_chef_for_busser, true
59
+ default_config :resolve_with_librarian_puppet, true
60
+ default_config :puppet_environment, nil
61
+ default_config :puppet_apt_repo, 'http://apt.puppetlabs.com/puppetlabs-release-precise.deb'
62
+ default_config :puppet_yum_repo, 'https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm'
63
+ default_config :chef_bootstrap_url, 'https://www.getchef.com/chef/install.sh'
64
+ default_config :puppet_logdest, nil
65
+ default_config :custom_install_command, nil
66
+ default_config :puppet_whitelist_exit_code, nil
67
+ default_config :require_puppet_omnibus, false
68
+ default_config :puppet_omnibus_url, 'https://raw.githubusercontent.com/petems/puppet-install-shell/master/install_puppet.sh'
69
+ default_config :puppet_enc, nil
70
+ default_config :ignore_spec_fixtures, false
71
+
72
+ default_config :puppet_apply_command, nil
73
+
74
+ default_config :puppet_git_init, nil
75
+ default_config :puppet_git_pr, nil
76
+
77
+ default_config :http_proxy, nil
78
+ default_config :https_proxy, nil
79
+
80
+ default_config :ignored_paths_from_root, []
81
+ default_config :hiera_data_remote_path, '/var/lib/hiera'
82
+ default_config :manifest, 'site.pp'
83
+
84
+ default_config :manifests_path do |provisioner|
85
+ provisioner.calculate_path('manifests') ||
86
+ raise('No manifests_path detected. Please specify one in .kitchen.yml')
87
+ end
88
+
89
+ default_config :modules_path do |provisioner|
90
+ modules_path = provisioner.calculate_path('modules')
91
+ if modules_path.nil? && provisioner.calculate_path('Puppetfile', :file).nil?
92
+ raise('No modules_path detected. Please specify one in .kitchen.yml')
93
+ end
94
+ modules_path
95
+ end
96
+
97
+ default_config :files_path do |provisioner|
98
+ provisioner.calculate_path('files') || 'files'
99
+ end
100
+
101
+ default_config :hiera_data_path do |provisioner|
102
+ provisioner.calculate_path('hiera')
103
+ end
104
+
105
+ default_config :puppet_config_path do |provisioner|
106
+ provisioner.calculate_path('puppet.conf', :file)
107
+ end
108
+
109
+ default_config :hiera_config_path do |provisioner|
110
+ provisioner.calculate_path('hiera.yaml', :file)
111
+ end
112
+
113
+ default_config :fileserver_config_path do |provisioner|
114
+ provisioner.calculate_path('fileserver.conf', :file)
115
+ end
116
+ default_config :puppetfile_path do |provisioner|
117
+ provisioner.calculate_path('Puppetfile', :file)
118
+ end
119
+
120
+ default_config :modulefile_path do |provisioner|
121
+ provisioner.calculate_path('Modulefile', :file)
122
+ end
123
+
124
+ default_config :metadata_json_path do |provisioner|
125
+ provisioner.calculate_path('metadata.json', :file)
126
+ end
127
+
128
+ default_config :manifests_path do |provisioner|
129
+ provisioner.calculate_path('manifests', :directory)
130
+ end
131
+
132
+ default_config :spec_files_path do |provisioner|
133
+ provisioner.calculate_path('spec', :directory)
134
+ end
135
+
136
+ default_config :spec_files_remote_path, '/etc/puppet/spec'
137
+
138
+ default_config :puppet_debug, false
139
+ default_config :puppet_verbose, false
140
+ default_config :puppet_noop, false
141
+ default_config :platform, &:platform_name
142
+ default_config :update_package_repos, true
143
+ default_config :remove_puppet_repo, false
144
+ default_config :install_custom_facts, false
145
+ default_config :custom_facts, {}
146
+ default_config :facterlib, nil
147
+ default_config :puppet_detailed_exitcodes, nil
148
+ default_config :facter_file, nil
149
+ default_config :librarian_puppet_ssl_file, nil
150
+
151
+ default_config :hiera_eyaml, false
152
+ default_config :hiera_eyaml_key_remote_path, '/etc/puppet/secure/keys'
153
+
154
+ default_config :hiera_eyaml_key_path do |provisioner|
155
+ provisioner.calculate_path('hiera_keys')
156
+ end
157
+
158
+ default_config :hiera_deep_merge, false
159
+ default_config :puppet_no_sudo, false
160
+
161
+ def calculate_path(path, type = :directory)
162
+ base = config[:test_base_path]
163
+ candidates = []
164
+ candidates << File.join(base, instance.suite.name, 'puppet', path)
165
+ candidates << File.join(base, instance.suite.name, path)
166
+ candidates << File.join(base, path)
167
+ candidates << File.join(Dir.pwd, path)
168
+
169
+ candidates.find do |c|
170
+ type == :directory ? File.directory?(c) : File.file?(c)
171
+ end
172
+ end
173
+
174
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
175
+ def install_command
176
+ return unless config[:require_puppet_collections] || config[:require_puppet_repo] || config[:require_puppet_omnibus]
177
+ if config[:require_puppet_omnibus]
178
+ install_omnibus_command
179
+ elsif config[:require_puppet_collections]
180
+ install_command_collections
181
+ else
182
+ case puppet_platform
183
+ when 'debian', 'ubuntu'
184
+ info("Installing puppet on #{config[:platform]}")
185
+ # need to add a CR to avoid trouble with proxy settings concatenation
186
+ <<-INSTALL
187
+
188
+ if [ ! $(which puppet) ]; then
189
+ #{sudo('apt-get')} -y install wget
190
+ #{sudo('wget')} #{wget_proxy_parm} #{puppet_apt_repo}
191
+ #{sudo('dpkg')} -i #{puppet_apt_repo_file}
192
+ #{update_packages_debian_cmd}
193
+ #{sudo_env('apt-get')} -y install facter#{facter_debian_version}
194
+ #{sudo_env('apt-get')} -y install puppet-common#{puppet_debian_version}
195
+ #{sudo_env('apt-get')} -y install puppet#{puppet_debian_version}
196
+ #{install_hiera}
197
+ fi
198
+ #{install_eyaml}
199
+ #{install_deep_merge}
200
+ #{install_busser}
201
+ #{custom_install_command}
202
+ INSTALL
203
+ when 'redhat', 'centos', 'fedora', 'oracle', 'amazon'
204
+ info("Installing puppet from yum on #{puppet_platform}")
205
+ # need to add a CR to avoid trouble with proxy settings concatenation
206
+ <<-INSTALL
207
+
208
+ if [ ! $(which puppet) ]; then
209
+ #{install_puppet_yum_repo}
210
+ fi
211
+ #{install_eyaml}
212
+ #{install_deep_merge}
213
+ #{install_busser}
214
+ #{custom_install_command}
215
+ INSTALL
216
+ else
217
+ info('Installing puppet, will try to determine platform os')
218
+ # need to add a CR to avoid trouble with proxy settings concatenation
219
+ <<-INSTALL
220
+
221
+ if [ ! $(which puppet) ]; then
222
+ if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ] || [ -f /etc/oracle-release ]; then
223
+ #{install_puppet_yum_repo}
224
+ else
225
+ if [ -f /etc/system-release ] || [ grep -q 'Amazon Linux' /etc/system-release ]; then
226
+ #{install_puppet_yum_repo}
227
+ else
228
+ #{sudo('apt-get')} -y install wget
229
+ #{sudo('wget')} #{wget_proxy_parm} #{puppet_apt_repo}
230
+ #{sudo('dpkg')} -i #{puppet_apt_repo_file}
231
+ #{update_packages_debian_cmd}
232
+ #{sudo_env('apt-get')} -y install facter#{facter_debian_version}
233
+ #{sudo_env('apt-get')} -y install puppet-common#{puppet_debian_version}
234
+ #{sudo_env('apt-get')} -y install puppet#{puppet_debian_version}
235
+ #{install_hiera}
236
+ fi
237
+ fi
238
+ fi
239
+ #{install_eyaml}
240
+ #{install_deep_merge}
241
+ #{install_busser}
242
+ #{custom_install_command}
243
+ INSTALL
244
+ end
245
+ end
246
+ end
247
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
248
+
249
+ def install_command_collections
250
+ case puppet_platform
251
+ when 'debian', 'ubuntu'
252
+ info("Installing Puppet Collections on #{puppet_platform}")
253
+ <<-INSTALL
254
+ #{Util.shell_helpers}
255
+ if [ ! -d "#{config[:puppet_coll_remote_path]}" ]; then
256
+ if [ ! -f "#{config[:puppet_apt_collections_repo]}" ]; then
257
+ #{sudo('apt-get')} -y install wget
258
+ #{sudo('wget')} #{wget_proxy_parm} #{config[:puppet_apt_collections_repo]}
259
+ fi
260
+ #{sudo('dpkg')} -i #{puppet_apt_coll_repo_file}
261
+ #{sudo('apt-get')} update
262
+ #{sudo_env('apt-get')} -y install puppet-agent#{puppet_debian_version}
263
+ fi
264
+ #{install_eyaml("#{config[:puppet_coll_remote_path]}/puppet/bin/gem")}
265
+ #{install_deep_merge}
266
+ #{install_busser}
267
+ #{custom_install_command}
268
+ INSTALL
269
+ when 'redhat', 'centos', 'fedora', 'oracle', 'amazon'
270
+ info("Installing Puppet Collections on #{puppet_platform}")
271
+ <<-INSTALL
272
+ #{Util.shell_helpers}
273
+ if [ ! -d "#{config[:puppet_coll_remote_path]}" ]; then
274
+ echo "-----> #{sudo_env('yum')} -y localinstall #{config[:puppet_yum_collections_repo]}"
275
+ #{sudo_env('yum')} -y localinstall #{config[:puppet_yum_collections_repo]}
276
+ #{sudo_env('yum')} -y install puppet-agent#{puppet_redhat_version}
277
+ fi
278
+ #{install_eyaml("#{config[:puppet_coll_remote_path]}/puppet/bin/gem")}
279
+ #{install_deep_merge}
280
+ #{install_busser}
281
+ #{custom_install_command}
282
+ INSTALL
283
+ else
284
+ info('Installing Puppet Collections, will try to determine platform os')
285
+ <<-INSTALL
286
+ #{Util.shell_helpers}
287
+ if [ ! -d "#{config[:puppet_coll_remote_path]}" ]; then
288
+ if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ] || [ -f /etc/oracle-release ] || \
289
+ [ -f /etc/system-release ] || [ grep -q 'Amazon Linux' /etc/system-release ]; then
290
+ echo "-----> #{sudo_env('yum')} -y localinstall #{config[:puppet_yum_collections_repo]}"
291
+ #{sudo_env('yum')} -y localinstall #{config[:puppet_yum_collections_repo]}
292
+ #{sudo_env('yum')} -y install puppet-agent#{puppet_redhat_version}
293
+ else
294
+ #{sudo('apt-get')} -y install wget
295
+ #{sudo('wget')} #{wget_proxy_parm} #{config[:puppet_apt_collections_repo]}
296
+ #{sudo('dpkg')} -i #{puppet_apt_coll_repo_file}
297
+ #{sudo('apt-get')} update
298
+ #{sudo_env('apt-get')} -y install puppet-agent#{puppet_debian_version}
299
+ fi
300
+ fi
301
+ #{install_eyaml("#{config[:puppet_coll_remote_path]}/puppet/bin/gem")}
302
+ #{install_deep_merge}
303
+ #{install_busser}
304
+ #{custom_install_command}
305
+ INSTALL
306
+ end
307
+ end
308
+
309
+ def install_deep_merge
310
+ return unless config[:hiera_deep_merge]
311
+ <<-INSTALL
312
+ # Support for hash merge lookups to recursively merge hash keys
313
+ if [[ $(#{sudo('gem')} list deep_merge -i) == 'false' ]]; then
314
+ echo '-----> Installing deep_merge to provide deep_merge of hiera hashes'
315
+ #{sudo('gem')} install #{gem_proxy_parm} --no-ri --no-rdoc deep_merge
316
+ fi
317
+ INSTALL
318
+ end
319
+
320
+ def install_eyaml(gem_cmd = 'gem')
321
+ return unless config[:hiera_eyaml]
322
+ <<-INSTALL
323
+ # A backend for Hiera that provides per-value asymmetric encryption of sensitive data
324
+ if [[ $(#{sudo(gem_cmd)} list hiera-eyaml -i) == 'false' ]]; then
325
+ echo '-----> Installing hiera-eyaml to provide encryption of hiera data'
326
+ #{sudo(gem_cmd)} install #{gem_proxy_parm} --no-ri --no-rdoc highline -v 1.6.21
327
+ #{sudo(gem_cmd)} install #{gem_proxy_parm} --no-ri --no-rdoc hiera-eyaml
328
+ fi
329
+ INSTALL
330
+ end
331
+
332
+ def install_busser
333
+ return unless config[:require_chef_for_busser]
334
+ <<-INSTALL
335
+ #{Util.shell_helpers}
336
+ # install chef omnibus so that busser works as this is needed to run tests :(
337
+ # TODO: work out how to install enough ruby
338
+ # and set busser: { :ruby_bindir => '/usr/bin/ruby' } so that we dont need the
339
+ # whole chef client
340
+ if [ ! -d "/opt/chef" ]
341
+ then
342
+ echo '-----> Installing Chef Omnibus to install busser to run tests'
343
+ #{export_http_proxy_parm}
344
+ #{export_https_proxy_parm}
345
+ do_download #{chef_url} /tmp/install.sh
346
+ #{sudo('sh')} /tmp/install.sh
347
+ fi
348
+ INSTALL
349
+ end
350
+
351
+ def install_omnibus_command
352
+ info('Installing puppet using puppet omnibus')
353
+ <<-INSTALL
354
+ #{Util.shell_helpers}
355
+ if [ ! $(which puppet) ]; then
356
+ echo "-----> Installing Puppet Omnibus"
357
+ #{export_http_proxy_parm}
358
+ #{export_https_proxy_parm}
359
+ do_download #{config[:puppet_omnibus_url]} /tmp/install_puppet.sh
360
+ #{sudo_env('sh')} /tmp/install_puppet.sh
361
+ fi
362
+ INSTALL
363
+ end
364
+
365
+ def install_hiera
366
+ return unless config[:install_hiera]
367
+ <<-INSTALL
368
+ #{sudo_env('apt-get')} -y install #{hiera_package}
369
+ INSTALL
370
+ end
371
+
372
+ def hiera_package
373
+ "#{config[:hiera_package]}#{puppet_hiera_debian_version}"
374
+ end
375
+
376
+ # /bin/wget -P /etc/pki/rpm-gpg/ http://yum.puppetlabs.com/RPM-GPG-KEY-puppetlabs
377
+ # changed to curl
378
+
379
+ def install_puppet_yum_repo
380
+ <<-INSTALL
381
+ rhelversion=$(cat /etc/redhat-release | grep 'release 7')
382
+ # For CentOS7/RHEL7 the rdo release contains puppetlabs repo, creating conflict. Create temp-repo
383
+ #{sudo_env('curl')} -o /etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs http://yum.puppetlabs.com/RPM-GPG-KEY-puppetlabs
384
+ if [ -n "$rhelversion" ]; then
385
+ echo '[puppettemp-products]
386
+ name=Puppet Labs Products - \$basearch
387
+ baseurl=http://yum.puppetlabs.com/el/7/products/\$basearch
388
+ gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs
389
+ enabled=0
390
+ gpgcheck=1
391
+ [puppettemp-deps]
392
+ name=Puppet Labs Dependencies - \$basearch
393
+ baseurl=http://yum.puppetlabs.com/el/7/dependencies/\$basearch
394
+ gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs
395
+ enabled=0
396
+ gpgcheck=1' | sudo tee /etc/yum.repos.d/puppettemp.repo > /dev/null
397
+ sudo sed -i 's/^[ \t]*//' /etc/yum.repos.d/puppettemp.repo
398
+ #{update_packages_redhat_cmd}
399
+ #{sudo_env('yum')} -y --enablerepo=puppettemp-products --enablerepo=puppettemp-deps install puppet#{puppet_redhat_version}
400
+ # Clean up temporary puppet repo
401
+ sudo rm -rf /etc/pki/rpm-gpg/RPM-GPG-KEY-puppetlabs
402
+ sudo rm -rf /etc/yum.repos.d/puppettemp.repo
403
+ else
404
+ #{sudo('rpm')} -ivh #{proxy_parm} #{puppet_yum_repo}
405
+ #{update_packages_redhat_cmd}
406
+ #{sudo_env('yum')} -y install puppet#{puppet_redhat_version}
407
+ fi
408
+ INSTALL
409
+ end
410
+
411
+ def custom_install_command
412
+ <<-INSTALL
413
+ #{config[:custom_install_command]}
414
+ INSTALL
415
+ end
416
+
417
+ def init_command
418
+ dirs = %w(modules manifests files hiera hiera.yaml facter spec enc)
419
+ .map { |dir| File.join(config[:root_path], dir) }.join(' ')
420
+ cmd = "#{sudo('rm')} -rf #{dirs} #{hiera_data_remote_path} \
421
+ /etc/hiera.yaml #{puppet_dir}/hiera.yaml \
422
+ #{spec_files_remote_path} \
423
+ #{puppet_dir}/fileserver.conf;"
424
+ cmd += config[:puppet_environment] ? "#{sudo('rm')} -f #{File.join(puppet_dir, config[:puppet_environment])};" : ''
425
+ cmd += " mkdir -p #{config[:root_path]}; #{sudo('mkdir')} -p #{puppet_dir}"
426
+ debug(cmd)
427
+ cmd
428
+ end
429
+
430
+ def create_sandbox
431
+ super
432
+ debug("Creating local sandbox in #{sandbox_path}")
433
+ yield if block_given?
434
+ prepare_modules
435
+ prepare_manifests
436
+ prepare_files
437
+ prepare_facter_file
438
+ prepare_facts
439
+ prepare_puppet_config
440
+ prepare_hiera_config
441
+ prepare_fileserver_config
442
+ prepare_hiera_data
443
+ prepare_enc
444
+ prepare_spec_files
445
+ info('Finished Preparing files for transfer')
446
+ end
447
+
448
+ def cleanup_sandbox
449
+ return if sandbox_path.nil?
450
+ debug("Cleaning up local sandbox in #{sandbox_path}")
451
+ FileUtils.rmtree(sandbox_path)
452
+ return if remove_repo.nil?
453
+ debug("Cleaning up remote sandbox: #{remove_repo}")
454
+ instance.remote_exec remove_repo
455
+ end
456
+
457
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
458
+ def prepare_command
459
+ commands = []
460
+ if puppet_git_init
461
+ commands << [
462
+ sudo('rm -rf'), '/etc/puppet'
463
+ ].join(' ')
464
+
465
+ commands << [
466
+ sudo('git clone'), puppet_git_init, '/etc/puppet'
467
+ ].join(' ')
468
+ end
469
+
470
+ if puppet_git_pr
471
+ commands << [
472
+ sudo('git'),
473
+ '--git-dir=/etc/puppet/.git/',
474
+ 'fetch -f',
475
+ 'origin',
476
+ "pull/#{puppet_git_pr}/head:pr_#{puppet_git_pr}"
477
+ ].join(' ')
478
+
479
+ commands << [
480
+ sudo('git'),
481
+ '--git-dir=/etc/puppet/.git/',
482
+ '--work-tree=/etc/puppet/',
483
+ 'checkout',
484
+ "pr_#{puppet_git_pr}"
485
+ ].join(' ')
486
+ end
487
+
488
+ if puppet_config
489
+ commands << [
490
+ sudo('cp'),
491
+ File.join(config[:root_path], 'puppet.conf'),
492
+ puppet_dir
493
+ ].join(' ')
494
+ end
495
+
496
+ if hiera_config
497
+ commands << [
498
+ sudo('cp'), File.join(config[:root_path], 'hiera.yaml'), '/etc/'
499
+ ].join(' ')
500
+
501
+ commands << [
502
+ sudo('cp'), File.join(config[:root_path], 'hiera.yaml'), hiera_config_dir
503
+ ].join(' ')
504
+ end
505
+
506
+ if fileserver_config
507
+ commands << [
508
+ sudo('cp'),
509
+ File.join(config[:root_path], 'fileserver.conf'),
510
+ puppet_dir
511
+ ].join(' ')
512
+ end
513
+
514
+ if hiera_data && hiera_data_remote_path == '/var/lib/hiera'
515
+ commands << [
516
+ sudo('cp -r'), File.join(config[:root_path], 'hiera'), '/var/lib/'
517
+ ].join(' ')
518
+ end
519
+
520
+ if hiera_data && hiera_data_remote_path != '/var/lib/hiera'
521
+ commands << [
522
+ sudo('mkdir -p'), hiera_data_remote_path
523
+ ].join(' ')
524
+ commands << [
525
+ sudo('cp -r'), File.join(config[:root_path], 'hiera/*'), hiera_data_remote_path
526
+ ].join(' ')
527
+ end
528
+
529
+ if hiera_eyaml
530
+ commands << [
531
+ sudo('mkdir -p'), hiera_eyaml_key_remote_path
532
+ ].join(' ')
533
+ commands << [
534
+ sudo('cp -r'), File.join(config[:root_path], 'hiera_keys/*'), hiera_eyaml_key_remote_path
535
+ ].join(' ')
536
+ end
537
+
538
+ if puppet_environment
539
+ commands << [
540
+ sudo('ln -s '), config[:root_path], File.join(puppet_dir, config[:puppet_environment])
541
+ ].join(' ')
542
+ end
543
+
544
+ if spec_files_path && spec_files_remote_path
545
+ commands << [
546
+ sudo('mkdir -p'), spec_files_remote_path
547
+ ].join(' ')
548
+ commands << [
549
+ sudo('cp -r'), File.join(config[:root_path], 'spec/*'), spec_files_remote_path
550
+ ].join(' ')
551
+ end
552
+
553
+ if config[:puppet_enc]
554
+ commands << [
555
+ sudo('chmod 755'), File.join("#{config[:root_path]}/enc", File.basename(config[:puppet_enc]))
556
+ ].join(' ')
557
+ end
558
+
559
+ command = commands.join(' && ')
560
+ debug(command)
561
+ command
562
+ end
563
+
564
+ def run_command
565
+ if !config[:puppet_apply_command].nil?
566
+ return config[:puppet_apply_command]
567
+ else
568
+ result = [
569
+ facterlib,
570
+ custom_facts,
571
+ puppet_manifestdir,
572
+ puppet_cmd,
573
+ 'apply',
574
+ File.join(config[:root_path], 'manifests', manifest),
575
+ "--modulepath=#{File.join(config[:root_path], 'modules')}",
576
+ "--fileserverconfig=#{File.join(config[:root_path], 'fileserver.conf')}",
577
+ custom_options,
578
+ puppet_environment_flag,
579
+ puppet_noop_flag,
580
+ puppet_enc_flag,
581
+ puppet_detailed_exitcodes_flag,
582
+ puppet_verbose_flag,
583
+ puppet_debug_flag,
584
+ puppet_logdest_flag,
585
+ puppet_whitelist_exit_code
586
+ ].join(' ')
587
+ info("Going to invoke puppet apply with: #{result}")
588
+ result
589
+ end
590
+ end
591
+
592
+ protected
593
+
594
+ def load_needed_dependencies!
595
+ return unless File.exist?(puppetfile)
596
+ return unless config[:resolve_with_librarian_puppet]
597
+ debug("Puppetfile found at #{puppetfile}, loading Librarian-Puppet")
598
+ Puppet::Librarian.load!(logger)
599
+ end
600
+
601
+ def tmpmodules_dir
602
+ File.join(sandbox_path, 'modules')
603
+ end
604
+
605
+ def puppetfile
606
+ config[:puppetfile_path] || ''
607
+ end
608
+
609
+ def modulefile
610
+ config[:modulefile_path] || ''
611
+ end
612
+
613
+ def metadata_json
614
+ config[:metadata_json_path] || ''
615
+ end
616
+
617
+ def manifest
618
+ config[:manifest]
619
+ end
620
+
621
+ def manifests
622
+ config[:manifests_path]
623
+ end
624
+
625
+ def modules
626
+ config[:modules_path]
627
+ end
628
+
629
+ def files
630
+ config[:files_path] || 'files'
631
+ end
632
+
633
+ def puppet_config
634
+ config[:puppet_config_path]
635
+ end
636
+
637
+ def puppet_environment
638
+ config[:puppet_environment]
639
+ end
640
+
641
+ def puppet_git_init
642
+ config[:puppet_git_init]
643
+ end
644
+
645
+ def puppet_git_pr
646
+ config[:puppet_git_pr]
647
+ end
648
+
649
+ def hiera_config
650
+ config[:hiera_config_path]
651
+ end
652
+
653
+ def fileserver_config
654
+ config[:fileserver_config_path]
655
+ end
656
+
657
+ def hiera_data
658
+ config[:hiera_data_path]
659
+ end
660
+
661
+ def hiera_data_remote_path
662
+ config[:hiera_data_remote_path]
663
+ end
664
+
665
+ def hiera_eyaml
666
+ config[:hiera_eyaml]
667
+ end
668
+
669
+ def hiera_eyaml_key_path
670
+ config[:hiera_eyaml_key_path]
671
+ end
672
+
673
+ def hiera_eyaml_key_remote_path
674
+ config[:hiera_eyaml_key_remote_path]
675
+ end
676
+
677
+ def hiera_deep_merge
678
+ config[:hiera_deep_merge]
679
+ end
680
+
681
+ def librarian_puppet_ssl_file
682
+ config[:librarian_puppet_ssl_file]
683
+ end
684
+
685
+ def puppet_cmd
686
+ puppet_bin = 'puppet'
687
+ if config[:require_puppet_collections]
688
+ puppet_bin = "#{config[:puppet_coll_remote_path]}/bin/puppet"
689
+ end
690
+
691
+ if config[:puppet_no_sudo]
692
+ puppet_bin
693
+ else
694
+ sudo_env(puppet_bin)
695
+ end
696
+ end
697
+
698
+ def puppet_dir
699
+ if config[:require_puppet_collections]
700
+ '/etc/puppetlabs/puppet'
701
+ else
702
+ '/etc/puppet'
703
+ end
704
+ end
705
+
706
+ def hiera_config_dir
707
+ if config[:require_puppet_collections]
708
+ '/etc/puppetlabs/code'
709
+ else
710
+ '/etc/puppet'
711
+ end
712
+ end
713
+
714
+ def puppet_debian_version
715
+ config[:puppet_version] ? "=#{config[:puppet_version]}" : nil
716
+ end
717
+
718
+ def facter_debian_version
719
+ config[:facter_version] ? "=#{config[:facter_version]}" : nil
720
+ end
721
+
722
+ def puppet_hiera_debian_version
723
+ config[:hiera_version] ? "=#{config[:hiera_version]}" : nil
724
+ end
725
+
726
+ def puppet_redhat_version
727
+ if puppet_platform == 'amazon'
728
+ config[:puppet_version]
729
+ else
730
+ config[:puppet_version] ? "-#{config[:puppet_version]}" : nil
731
+ end
732
+ end
733
+
734
+ def puppet_environment_flag
735
+ if config[:puppet_version] =~ /^2/
736
+ config[:puppet_environment] ? "--environment=#{config[:puppet_environment]}" : nil
737
+ else
738
+ config[:puppet_environment] ? "--environment=#{config[:puppet_environment]} --environmentpath=#{puppet_dir}" : nil
739
+ end
740
+ end
741
+
742
+ def puppet_manifestdir
743
+ return nil if config[:require_puppet_collections]
744
+ return nil if config[:puppet_environment]
745
+ bash_vars = "export MANIFESTDIR='#{File.join(config[:root_path], 'manifests')}';"
746
+ debug(bash_vars)
747
+ bash_vars
748
+ end
749
+
750
+ def custom_options
751
+ config[:custom_options] || ''
752
+ end
753
+
754
+ def puppet_noop_flag
755
+ config[:puppet_noop] ? '--noop' : nil
756
+ end
757
+
758
+ def puppet_debug_flag
759
+ config[:puppet_debug] ? '-d' : nil
760
+ end
761
+
762
+ def puppet_verbose_flag
763
+ config[:puppet_verbose] ? '-v' : nil
764
+ end
765
+
766
+ def puppet_logdest_flag
767
+ return nil unless config[:puppet_logdest]
768
+ destinations = ''
769
+ config[:puppet_logdest].each do |dest|
770
+ destinations << "--logdest #{dest} "
771
+ end
772
+ destinations
773
+ end
774
+
775
+ def puppet_platform
776
+ config[:platform].gsub(/-.*/, '')
777
+ end
778
+
779
+ def update_packages_debian_cmd
780
+ config[:update_package_repos] ? "#{sudo_env('apt-get')} update" : nil
781
+ end
782
+
783
+ def update_packages_redhat_cmd
784
+ # #{sudo('yum')}
785
+ config[:update_package_repos] ? "#{sudo_env('yum')} makecache" : nil
786
+ end
787
+
788
+ def sudo_env(pm)
789
+ s = https_proxy ? "https_proxy=#{https_proxy}" : nil
790
+ p = http_proxy ? "http_proxy=#{http_proxy}" : nil
791
+ p || s ? "#{sudo('env')} #{p} #{s} #{pm}" : sudo(pm).to_s
792
+ end
793
+
794
+ def remove_puppet_repo
795
+ config[:remove_puppet_repo]
796
+ end
797
+
798
+ def spec_files_path
799
+ config[:spec_files_path]
800
+ end
801
+
802
+ def spec_files_remote_path
803
+ config[:spec_files_remote_path]
804
+ end
805
+
806
+ def facterlib
807
+ factpath = nil
808
+ factpath = File.join(config[:root_path], 'facter').to_s if config[:install_custom_facts] && !config[:custom_facts].none?
809
+ factpath = File.join(config[:root_path], 'facter').to_s if config[:facter_file]
810
+ factpath = "#{factpath}:" if config[:facterlib] && !factpath.nil?
811
+ factpath = "#{factpath}#{config[:facterlib]}" if config[:facterlib]
812
+ return nil if factpath.nil?
813
+ bash_vars = "export FACTERLIB='#{factpath}';"
814
+ debug(bash_vars)
815
+ bash_vars
816
+ end
817
+
818
+ def custom_facts
819
+ return nil if config[:custom_facts].none?
820
+ return nil if config[:install_custom_facts]
821
+ bash_vars = config[:custom_facts].map { |k, v| "FACTER_#{k}=#{v}" }.join(' ')
822
+ bash_vars = "export #{bash_vars};"
823
+ debug(bash_vars)
824
+ bash_vars
825
+ end
826
+
827
+ def puppet_enc_flag
828
+ config[:puppet_enc] ? "--node_terminus=exec --external_nodes=#{config[:root_path]}/enc/#{File.basename(config[:puppet_enc])}" : nil
829
+ end
830
+
831
+ def puppet_detailed_exitcodes_flag
832
+ config[:puppet_detailed_exitcodes] ? '--detailed-exitcodes' : nil
833
+ end
834
+
835
+ def remove_repo
836
+ remove_puppet_repo ? "#{sudo('rm')} -rf /tmp/kitchen #{hiera_data_remote_path} #{hiera_eyaml_key_remote_path} #{puppet_dir}/* " : nil
837
+ end
838
+
839
+ def puppet_whitelist_exit_code
840
+ config[:puppet_whitelist_exit_code] ? "; [ $? -eq #{config[:puppet_whitelist_exit_code]} ] && exit 0" : nil
841
+ end
842
+
843
+ def puppet_apt_repo
844
+ platform_version = config[:platform].partition('-')[2]
845
+ case puppet_platform
846
+ when 'ubuntu'
847
+ case platform_version
848
+ when '14.10'
849
+ # Utopic Repo
850
+ 'https://apt.puppetlabs.com/puppetlabs-release-utopic.deb'
851
+ when '14.04'
852
+ # Trusty Repo
853
+ 'https://apt.puppetlabs.com/puppetlabs-release-trusty.deb'
854
+ when '12.04'
855
+ # Precise Repo
856
+ 'https://apt.puppetlabs.com/puppetlabs-release-precise.deb'
857
+ else
858
+ # Configured Repo
859
+ config[:puppet_apt_repo]
860
+ end
861
+ when 'debian'
862
+ case platform_version.gsub(/\..*/, '')
863
+ when '8'
864
+ # Debian Jessie
865
+ 'https://apt.puppetlabs.com/puppetlabs-release-jessie.deb'
866
+ when '7'
867
+ # Debian Wheezy
868
+ 'https://apt.puppetlabs.com/puppetlabs-release-wheezy.deb'
869
+ when '6'
870
+ # Debian Squeeze
871
+ 'https://apt.puppetlabs.com/puppetlabs-release-squeeze.deb'
872
+ else
873
+ # Configured Repo
874
+ config[:puppet_apt_repo]
875
+ end
876
+ else
877
+ debug("Apt repo detection failed with platform - #{config[:platform]}")
878
+ false
879
+ end
880
+ end
881
+
882
+ def puppet_apt_repo_file
883
+ puppet_apt_repo.split('/').last if puppet_apt_repo
884
+ end
885
+
886
+ def puppet_apt_coll_repo_file
887
+ config[:puppet_apt_collections_repo].split('/').last
888
+ end
889
+
890
+ def puppet_yum_repo
891
+ config[:puppet_yum_repo]
892
+ end
893
+
894
+ def proxy_parm
895
+ http_proxy ? "--httpproxy #{URI.parse(http_proxy).host.downcase} --httpport #{URI.parse(http_proxy).port} " : nil
896
+ end
897
+
898
+ def gem_proxy_parm
899
+ http_proxy ? "--http-proxy #{http_proxy}" : nil
900
+ end
901
+
902
+ def wget_proxy_parm
903
+ p = http_proxy ? "-e http_proxy=#{http_proxy}" : nil
904
+ s = https_proxy ? "-e https_proxy=#{https_proxy}" : nil
905
+ p || s ? "-e use_proxy=yes #{p} #{s}" : nil
906
+ end
907
+
908
+ def export_http_proxy_parm
909
+ http_proxy ? "export http_proxy=#{http_proxy}" : nil
910
+ end
911
+
912
+ def export_https_proxy_parm
913
+ http_proxy ? "export https_proxy=#{http_proxy}" : nil
914
+ end
915
+
916
+ def http_proxy
917
+ config[:http_proxy]
918
+ end
919
+
920
+ def https_proxy
921
+ config[:https_proxy]
922
+ end
923
+
924
+ def chef_url
925
+ config[:chef_bootstrap_url]
926
+ end
927
+
928
+ def prepare_manifests
929
+ info('Preparing manifests')
930
+ debug("Using manifests from #{manifests}")
931
+
932
+ tmp_manifests_dir = File.join(sandbox_path, 'manifests')
933
+ FileUtils.mkdir_p(tmp_manifests_dir)
934
+ FileUtils.cp_r(Dir.glob("#{manifests}/*"), tmp_manifests_dir)
935
+ end
936
+
937
+ def prepare_files
938
+ info('Preparing files')
939
+ unless File.directory?(files)
940
+ info 'nothing to do for files'
941
+ return
942
+ end
943
+
944
+ debug("Using files from #{files}")
945
+
946
+ tmp_files_dir = File.join(sandbox_path, 'files')
947
+ FileUtils.mkdir_p(tmp_files_dir)
948
+ FileUtils.cp_r(Dir.glob("#{files}/*"), tmp_files_dir)
949
+ end
950
+
951
+ def prepare_facter_file
952
+ return unless config[:facter_file]
953
+ info 'Copying facter file'
954
+ facter_dir = File.join(sandbox_path, 'facter')
955
+ FileUtils.mkdir_p(facter_dir)
956
+ FileUtils.cp_r(config[:facter_file], facter_dir)
957
+ end
958
+
959
+ def prepare_facts
960
+ return unless config[:install_custom_facts]
961
+ return unless config[:custom_facts]
962
+ info 'Installing custom facts'
963
+ facter_dir = File.join(sandbox_path, 'facter')
964
+ FileUtils.mkdir_p(facter_dir)
965
+ tmp_facter_file = File.join(facter_dir, 'kitchen.rb')
966
+ facter_facts = Hash[config[:custom_facts].map { |k, v| [k.to_s, v.to_s] }]
967
+ File.open(tmp_facter_file, 'a') do |out|
968
+ facter_facts.each do |k, v|
969
+ out.write "\nFacter.add(:#{k}) do\n"
970
+ out.write " setcode do\n"
971
+ out.write " \"#{v}\"\n"
972
+ out.write " end\n"
973
+ out.write "end\n"
974
+ end
975
+ end
976
+ end
977
+
978
+ def prepare_modules
979
+ info('Preparing modules')
980
+
981
+ FileUtils.mkdir_p(tmpmodules_dir)
982
+ resolve_with_librarian if File.exist?(puppetfile) && config[:resolve_with_librarian_puppet]
983
+
984
+ if modules && modules.include?(':')
985
+ debug('Found multiple directories in module path merging.....')
986
+ modules_array = modules.split(':')
987
+ modules_array.each do |m|
988
+ if File.directory?(m)
989
+ debug("Copying modules from #{m} to #{tmpmodules_dir}")
990
+ FileUtils.cp_r(Dir.glob("#{m}/*"), tmpmodules_dir, remove_destination: true)
991
+ end
992
+ end
993
+ elsif modules && File.directory?(modules)
994
+ debug("Copying modules from #{modules} to #{tmpmodules_dir}")
995
+ FileUtils.cp_r(Dir.glob("#{modules}/*"), tmpmodules_dir, remove_destination: true)
996
+ else
997
+ info 'nothing to do for modules'
998
+ end
999
+
1000
+ copy_self_as_module
1001
+ end
1002
+
1003
+ def copy_self_as_module
1004
+ if File.exist?(modulefile)
1005
+ warn('Modulefile found but this is depricated, ignoring it, see https://tickets.puppetlabs.com/browse/PUP-1188')
1006
+ end
1007
+
1008
+ return unless File.exist?(metadata_json)
1009
+ module_name = nil
1010
+ begin
1011
+ module_name = JSON.parse(IO.read(metadata_json))['name'].split('-').last
1012
+ rescue
1013
+ error("not able to load or parse #{metadata_json_path} for the name of the module")
1014
+ end
1015
+
1016
+ return unless module_name
1017
+ module_target_path = File.join(sandbox_path, 'modules', module_name)
1018
+ FileUtils.mkdir_p(module_target_path)
1019
+
1020
+ excluded_paths = %w(modules spec pkg) + config[:ignored_paths_from_root]
1021
+
1022
+ FileUtils.cp_r(
1023
+ Dir.glob(File.join(config[:kitchen_root], '*')).reject { |entry| entry =~ /#{excluded_paths.join('$|')}$/ },
1024
+ module_target_path,
1025
+ remove_destination: true
1026
+ )
1027
+ end
1028
+
1029
+ def prepare_puppet_config
1030
+ return unless puppet_config
1031
+
1032
+ info('Preparing puppet.conf')
1033
+ debug("Using puppet config from #{puppet_config}")
1034
+
1035
+ FileUtils.cp_r(puppet_config, File.join(sandbox_path, 'puppet.conf'))
1036
+ end
1037
+
1038
+ def prepare_enc
1039
+ return unless config[:puppet_enc]
1040
+ info 'Copying enc file'
1041
+ enc_dir = File.join(sandbox_path, 'enc')
1042
+ FileUtils.mkdir_p(enc_dir)
1043
+ FileUtils.cp_r(config[:puppet_enc], File.join(enc_dir,'/'))
1044
+ end
1045
+
1046
+ def prepare_hiera_config
1047
+ return unless hiera_config
1048
+
1049
+ info('Preparing hiera')
1050
+ debug("Using hiera from #{hiera_config}")
1051
+
1052
+ FileUtils.cp_r(hiera_config, File.join(sandbox_path, 'hiera.yaml'))
1053
+ end
1054
+
1055
+ def prepare_fileserver_config
1056
+ return unless fileserver_config
1057
+
1058
+ info('Preparing fileserver')
1059
+ debug("Using fileserver config from #{fileserver_config}")
1060
+
1061
+ FileUtils.cp_r(fileserver_config, File.join(sandbox_path, 'fileserver.conf'))
1062
+ end
1063
+
1064
+ def prepare_hiera_data
1065
+ return unless hiera_data
1066
+ info('Preparing hiera data')
1067
+ tmp_hiera_dir = File.join(sandbox_path, 'hiera')
1068
+ debug("Copying hiera data from #{hiera_data} to #{tmp_hiera_dir}")
1069
+ FileUtils.mkdir_p(tmp_hiera_dir)
1070
+ FileUtils.cp_r(Dir.glob("#{hiera_data}/*"), tmp_hiera_dir)
1071
+ return unless hiera_eyaml_key_path
1072
+ tmp_hiera_key_dir = File.join(sandbox_path, 'hiera_keys')
1073
+ debug("Copying hiera eyaml keys from #{hiera_eyaml_key_path} to #{tmp_hiera_key_dir}")
1074
+ FileUtils.mkdir_p(tmp_hiera_key_dir)
1075
+ FileUtils.cp_r(Dir.glob("#{hiera_eyaml_key_path}/*"), tmp_hiera_key_dir)
1076
+ end
1077
+
1078
+ def prepare_spec_files
1079
+ return unless spec_files_path
1080
+ info('Preparing spec files')
1081
+ tmp_spec_dir = File.join(sandbox_path, 'spec')
1082
+ debug("Copying specs from #{spec_files_path} to #{tmp_spec_dir}")
1083
+ FileUtils.mkdir_p(tmp_spec_dir)
1084
+ FileUtils.cp_r(Dir.glob(File.join(spec_files_path, '*')).reject { |entry| entry =~ /fixtures$/ }, tmp_spec_dir) if config[:ignore_spec_fixtures]
1085
+ FileUtils.cp_r(Dir.glob("#{spec_files_path}/*"), tmp_spec_dir) unless config[:ignore_spec_fixtures]
1086
+ end
1087
+
1088
+ def resolve_with_librarian
1089
+ Kitchen.mutex.synchronize do
1090
+ ENV['SSL_CERT_FILE'] = librarian_puppet_ssl_file if librarian_puppet_ssl_file
1091
+ Puppet::Librarian.new(puppetfile, tmpmodules_dir, logger).resolve
1092
+ ENV['SSL_CERT_FILE'] = '' if librarian_puppet_ssl_file
1093
+ end
1094
+ end
1095
+ end
1096
+ end
1097
+ end
1098
+
@@ -79,7 +79,7 @@ puppet_noop| false| puppet runs in a no-op or dry-run mode
79
79
  puppet_no_sudo | false | allow puppet command to run without sudo if required
80
80
  puppet_verbose| false| Extra information logging on puppet run
81
81
  puppet_version | "latest"| desired version, affects apt installs.
82
- puppet_whitelist_exit_code | nil | Whitelist exit code expected from puppet run. Intended to be used together with `puppet_detailed_exitcodes`.
82
+ puppet_whitelist_exit_code | nil | Whitelist exit code expected from puppet run. Intended to be used together with `puppet_detailed_exitcodes`. You can also specify a yaml list here (you should use 0 and 2 for `puppet_detailed_exitcodes` to capture puppet runtime errors and allow multiple converge runs (without changes)).
83
83
  puppet_yum_repo | "https://yum.puppetlabs.com/puppetlabs-release-el-6.noarch.rpm"| yum repo RH/Centos6
84
84
  _for RH/Centos7 change to_ | "https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm" |
85
85
  puppet_yum_collections_repo | "http://yum.puppetlabs.com/puppetlabs-release-pc1-el-6.noarch.rpm" | yum collections repo RH/Centos6
@@ -293,3 +293,28 @@ Use a `Rakefile` similar to one in https://github.com/vincentbernat/serverspec-e
293
293
  With such approach we can achieve flexibility of running same test suite both in test kitchen and actual, even production, instances.
294
294
 
295
295
  Beware: kitchen-shell-verifier is not yet merged into test-kitchen upstream so using separate gem is unavoidable so far
296
+
297
+ ## Checking puppet apply success (with puppet_detailed_exitcodes)
298
+
299
+ If you do not enable puppet_detailed_exitcodes, the provisioner only failes if the manifest can not be compiled. If the manifest contains errors (some manifests can not be executed) puppet will return exit 0 and thus the provisioner will be successfull, altought your catalog has not been fully applied. Probably this is not what you want.
300
+
301
+ When you enable `puppet_detailed_exitcodes`, you can specify the error conditions to check for with `puppet_whitelist_exit_code` also, otherwise the provisioner will fail altought everything is fine (and changes have been made).
302
+
303
+ Puppet will return with one of the following codes (see https://docs.puppet.com/puppet/latest/man/agent.html) when `puppet_detailed_exitcodes` is true:
304
+
305
+ * 0: The run succeeded with no changes or failures; the system was already in the desired state.
306
+ * 1: The run failed, or wasn't attempted due to another run already in progress.
307
+ * 2: The run succeeded, and some resources were changed.
308
+ * 4: The run succeeded, and some resources failed.
309
+ * 6: The run succeeded, and included both changes and failures.
310
+
311
+ If you enable `puppet_detailed_exitcodes` you should should probably set `puppet_whitelist_exit_code` to 0 and 2
312
+
313
+ ```yaml
314
+ provisioner:
315
+ puppet_detailed_exitcodes: true
316
+ puppet_whitelist_exit_code:
317
+ - 0
318
+ - 2
319
+ ```
320
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-puppet
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.45.2
4
+ version: 1.45.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neill Turner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-18 00:00:00.000000000 Z
11
+ date: 2016-12-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-kitchen
@@ -59,6 +59,7 @@ files:
59
59
  - lib/kitchen/provisioner/puppet/librarian.rb
60
60
  - lib/kitchen/provisioner/puppet_agent.rb
61
61
  - lib/kitchen/provisioner/puppet_apply.rb
62
+ - lib/kitchen/provisioner/puppet_apply.rb.new
62
63
  - provisioner_options.md
63
64
  homepage: https://github.com/neillturner/kitchen-puppet
64
65
  licenses: