puppet 6.17.0-universal-darwin → 6.18.0-universal-darwin

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +6 -5
  3. data/lib/puppet/application/apply.rb +18 -20
  4. data/lib/puppet/application/lookup.rb +16 -4
  5. data/lib/puppet/configurer/downloader.rb +31 -10
  6. data/lib/puppet/confine.rb +1 -1
  7. data/lib/puppet/confine/any.rb +1 -1
  8. data/lib/puppet/defaults.rb +21 -3
  9. data/lib/puppet/feature/base.rb +1 -1
  10. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  11. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  12. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  13. data/lib/puppet/file_system/file_impl.rb +3 -3
  14. data/lib/puppet/functions/lstrip.rb +4 -4
  15. data/lib/puppet/functions/reverse_each.rb +1 -1
  16. data/lib/puppet/functions/rstrip.rb +4 -4
  17. data/lib/puppet/functions/step.rb +1 -1
  18. data/lib/puppet/functions/strip.rb +4 -4
  19. data/lib/puppet/gettext/config.rb +5 -5
  20. data/lib/puppet/gettext/module_translations.rb +4 -4
  21. data/lib/puppet/indirector/exec.rb +1 -1
  22. data/lib/puppet/indirector/facts/facter.rb +3 -3
  23. data/lib/puppet/indirector/file_metadata/http.rb +1 -0
  24. data/lib/puppet/indirector/hiera.rb +4 -0
  25. data/lib/puppet/indirector/indirection.rb +1 -1
  26. data/lib/puppet/indirector/report/processor.rb +2 -2
  27. data/lib/puppet/module.rb +1 -2
  28. data/lib/puppet/network/format_support.rb +2 -2
  29. data/lib/puppet/network/http/route.rb +2 -2
  30. data/lib/puppet/node/environment.rb +12 -5
  31. data/lib/puppet/pal/pal_impl.rb +27 -3
  32. data/lib/puppet/parameter.rb +1 -1
  33. data/lib/puppet/parser/functions.rb +21 -17
  34. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  35. data/lib/puppet/parser/type_loader.rb +2 -2
  36. data/lib/puppet/pops/adaptable.rb +7 -13
  37. data/lib/puppet/pops/adapters.rb +8 -4
  38. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  39. data/lib/puppet/pops/loaders.rb +18 -11
  40. data/lib/puppet/pops/lookup/context.rb +1 -1
  41. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  42. data/lib/puppet/pops/types/iterable.rb +34 -8
  43. data/lib/puppet/pops/validation/checker4_0.rb +19 -15
  44. data/lib/puppet/provider/file/windows.rb +1 -1
  45. data/lib/puppet/provider/package/apt.rb +34 -0
  46. data/lib/puppet/provider/package/gem.rb +4 -2
  47. data/lib/puppet/provider/package/puppet_gem.rb +5 -0
  48. data/lib/puppet/provider/package/zypper.rb +3 -0
  49. data/lib/puppet/provider/user/aix.rb +1 -1
  50. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  51. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  52. data/lib/puppet/settings.rb +1 -1
  53. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  54. data/lib/puppet/test/test_helper.rb +10 -3
  55. data/lib/puppet/transaction.rb +2 -2
  56. data/lib/puppet/transaction/persistence.rb +1 -1
  57. data/lib/puppet/transaction/report.rb +1 -1
  58. data/lib/puppet/trusted_external.rb +2 -2
  59. data/lib/puppet/type.rb +4 -3
  60. data/lib/puppet/type/file.rb +2 -2
  61. data/lib/puppet/type/file/source.rb +27 -7
  62. data/lib/puppet/type/notify.rb +2 -2
  63. data/lib/puppet/type/service.rb +4 -0
  64. data/lib/puppet/type/user.rb +18 -3
  65. data/lib/puppet/util.rb +26 -12
  66. data/lib/puppet/util/autoload.rb +9 -7
  67. data/lib/puppet/util/character_encoding.rb +9 -5
  68. data/lib/puppet/util/execution.rb +2 -2
  69. data/lib/puppet/util/windows.rb +1 -0
  70. data/lib/puppet/util/windows/api_types.rb +15 -1
  71. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  72. data/lib/puppet/util/windows/security.rb +4 -4
  73. data/lib/puppet/util/windows/user.rb +219 -0
  74. data/lib/puppet/version.rb +1 -1
  75. data/locales/puppet.pot +78 -69
  76. data/man/man5/puppet.conf.5 +22 -3
  77. data/man/man8/puppet-agent.8 +1 -1
  78. data/man/man8/puppet-apply.8 +1 -1
  79. data/man/man8/puppet-catalog.8 +1 -1
  80. data/man/man8/puppet-config.8 +1 -1
  81. data/man/man8/puppet-describe.8 +1 -1
  82. data/man/man8/puppet-device.8 +1 -1
  83. data/man/man8/puppet-doc.8 +1 -1
  84. data/man/man8/puppet-epp.8 +1 -1
  85. data/man/man8/puppet-facts.8 +1 -1
  86. data/man/man8/puppet-filebucket.8 +1 -1
  87. data/man/man8/puppet-generate.8 +1 -1
  88. data/man/man8/puppet-help.8 +1 -1
  89. data/man/man8/puppet-key.8 +1 -1
  90. data/man/man8/puppet-lookup.8 +2 -2
  91. data/man/man8/puppet-man.8 +1 -1
  92. data/man/man8/puppet-module.8 +1 -1
  93. data/man/man8/puppet-node.8 +1 -1
  94. data/man/man8/puppet-parser.8 +1 -1
  95. data/man/man8/puppet-plugin.8 +1 -1
  96. data/man/man8/puppet-report.8 +1 -1
  97. data/man/man8/puppet-resource.8 +1 -1
  98. data/man/man8/puppet-script.8 +1 -1
  99. data/man/man8/puppet-ssl.8 +1 -1
  100. data/man/man8/puppet-status.8 +1 -1
  101. data/man/man8/puppet.8 +2 -2
  102. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  103. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  104. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  105. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  106. data/spec/integration/application/agent_spec.rb +29 -37
  107. data/spec/integration/application/apply_spec.rb +149 -149
  108. data/spec/integration/application/config_spec.rb +74 -0
  109. data/spec/integration/application/doc_spec.rb +16 -6
  110. data/spec/integration/application/filebucket_spec.rb +65 -16
  111. data/spec/integration/application/help_spec.rb +42 -0
  112. data/spec/integration/application/lookup_spec.rb +13 -0
  113. data/spec/integration/application/module_spec.rb +68 -0
  114. data/spec/integration/application/plugin_spec.rb +50 -0
  115. data/spec/integration/data_binding_spec.rb +82 -0
  116. data/spec/integration/directory_environments_spec.rb +17 -17
  117. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  118. data/spec/integration/node/environment_spec.rb +1 -1
  119. data/spec/integration/util/execution_spec.rb +22 -0
  120. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  121. data/spec/integration/util/windows/process_spec.rb +26 -32
  122. data/spec/integration/util/windows/user_spec.rb +7 -0
  123. data/spec/integration/util_spec.rb +7 -33
  124. data/spec/lib/puppet_spec/matchers.rb +0 -80
  125. data/spec/lib/puppet_spec/puppetserver.rb +8 -0
  126. data/spec/unit/application/agent_spec.rb +3 -4
  127. data/spec/unit/application/face_base_spec.rb +6 -4
  128. data/spec/unit/application/facts_spec.rb +39 -10
  129. data/spec/unit/application/man_spec.rb +52 -0
  130. data/spec/unit/application/resource_spec.rb +3 -1
  131. data/spec/unit/application/ssl_spec.rb +15 -2
  132. data/spec/unit/configurer/downloader_spec.rb +10 -0
  133. data/spec/unit/configurer_spec.rb +47 -31
  134. data/spec/unit/confine_spec.rb +2 -1
  135. data/spec/unit/face/config_spec.rb +3 -1
  136. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  137. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  138. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  139. data/spec/unit/file_system/uniquefile_spec.rb +18 -0
  140. data/spec/unit/http/client_spec.rb +0 -1
  141. data/spec/unit/http/resolver_spec.rb +0 -1
  142. data/spec/unit/http/service/ca_spec.rb +0 -1
  143. data/spec/unit/http/service/compiler_spec.rb +0 -1
  144. data/spec/unit/http/service/file_server_spec.rb +0 -1
  145. data/spec/unit/http/service/report_spec.rb +0 -1
  146. data/spec/unit/http/service_spec.rb +0 -1
  147. data/spec/unit/http/session_spec.rb +0 -1
  148. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  149. data/spec/unit/network/format_support_spec.rb +3 -2
  150. data/spec/unit/node/environment_spec.rb +18 -1
  151. data/spec/unit/pops/loaders/loaders_spec.rb +70 -0
  152. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  153. data/spec/unit/provider/package/apt_spec.rb +77 -0
  154. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  155. data/spec/unit/provider/package/puppet_gem_spec.rb +4 -1
  156. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  157. data/spec/unit/provider/service/init_spec.rb +41 -0
  158. data/spec/unit/provider/service/systemd_spec.rb +1 -6
  159. data/spec/unit/provider/service/windows_spec.rb +28 -0
  160. data/spec/unit/provider/user/windows_adsi_spec.rb +82 -0
  161. data/spec/unit/puppet_pal_2pec.rb +40 -0
  162. data/spec/unit/reports/store_spec.rb +17 -13
  163. data/spec/unit/transaction/persistence_spec.rb +15 -0
  164. data/spec/unit/type/service_spec.rb +35 -2
  165. data/spec/unit/type/user_spec.rb +31 -2
  166. data/spec/unit/util/character_encoding_spec.rb +4 -4
  167. data/spec/unit/util/command_line_spec.rb +11 -6
  168. metadata +21 -44
  169. data/spec/integration/faces/config_spec.rb +0 -91
  170. data/spec/integration/faces/documentation_spec.rb +0 -57
  171. data/spec/integration/file_bucket/file_spec.rb +0 -50
  172. data/spec/integration/file_serving/content_spec.rb +0 -7
  173. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  174. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  175. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  176. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  177. data/spec/integration/module_tool/forge_spec.rb +0 -51
  178. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  179. data/spec/integration/provider/service/init_spec.rb +0 -48
  180. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  181. data/spec/integration/provider/service/windows_spec.rb +0 -50
  182. data/spec/integration/reference/providers_spec.rb +0 -21
  183. data/spec/integration/reports_spec.rb +0 -13
  184. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  185. data/spec/integration/ssl/host_spec.rb +0 -72
  186. data/spec/integration/ssl/key_spec.rb +0 -99
  187. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  188. data/spec/unit/face/man_spec.rb +0 -25
  189. data/spec/unit/man_spec.rb +0 -31
@@ -2,21 +2,50 @@ require 'spec_helper'
2
2
  require 'puppet/application/facts'
3
3
 
4
4
  describe Puppet::Application::Facts do
5
+ let(:app) { Puppet::Application[:facts] }
6
+ let(:values) { {"filesystems" => "apfs,autofs,devfs"} }
7
+
5
8
  before :each do
6
- allow(subject.command_line).to receive(:subcommand_name).and_return('facts')
9
+ Puppet::Node::Facts.indirection.terminus_class = :memory
7
10
  end
8
11
 
9
- it "should return facts if a key is given to find" do
10
- Puppet::Node::Facts.indirection.reset_terminus_class
11
- expect(Puppet::Node::Facts.indirection).to receive(:find).and_return(Puppet::Node::Facts.new('whatever', {}))
12
- allow(subject.command_line).to receive(:args).and_return(%w{find whatever --render-as yaml})
12
+ it "returns facts for a given node" do
13
+ facts = Puppet::Node::Facts.new('whatever', values)
14
+ Puppet::Node::Facts.indirection.save(facts)
15
+
16
+ app.command_line.args = %w{find whatever --render-as yaml}
17
+
18
+ # due to PUP-10105 we emit the class tag when we shouldn't
19
+ expected = Regexp.new(<<~END)
20
+ --- !ruby/object:Puppet::Node::Facts
21
+ name: whatever
22
+ values:
23
+ filesystems: apfs,autofs,devfs
24
+ END
13
25
 
14
26
  expect {
15
- expect {
16
- subject.run
17
- }.to exit_with(0)
18
- }.to have_printed(/object:Puppet::Node::Facts/)
27
+ app.run
28
+ }.to exit_with(0)
29
+ .and output(expected).to_stdout
30
+ end
19
31
 
20
- expect(@logs).to be_empty
32
+ it "returns facts for the current node when the name is omitted" do
33
+ facts = Puppet::Node::Facts.new(Puppet[:certname], values)
34
+ Puppet::Node::Facts.indirection.save(facts)
35
+
36
+ app.command_line.args = %w{find --render-as yaml}
37
+
38
+ # due to PUP-10105 we emit the class tag when we shouldn't
39
+ expected = Regexp.new(<<~END)
40
+ --- !ruby/object:Puppet::Node::Facts
41
+ name: #{Puppet[:certname]}
42
+ values:
43
+ filesystems: apfs,autofs,devfs
44
+ END
45
+
46
+ expect {
47
+ app.run
48
+ }.to exit_with(0)
49
+ .and output(expected).to_stdout
21
50
  end
22
51
  end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+ require 'puppet/face'
3
+
4
+ describe Puppet::Face[:man, :current] do
5
+ let(:pager) { '/path/to/our/pager' }
6
+
7
+ around do |example|
8
+ Puppet::Util.withenv('MANPAGER' => pager) do
9
+ example.run
10
+ end
11
+ end
12
+
13
+ it 'is deprecated' do
14
+ expect(subject).to be_deprecated
15
+ end
16
+
17
+ it 'has a man action' do
18
+ expect(subject).to be_action(:man)
19
+ end
20
+
21
+ it 'accepts a call with no arguments' do
22
+ expect { subject.man }.to output(/USAGE: puppet man <action>/).to_stdout
23
+ end
24
+
25
+ it 'raises an ArgumentError when given too many arguments' do
26
+ expect {
27
+ subject.man(:man, 'agent', 'extra')
28
+ }.to raise_error(ArgumentError)
29
+ .and output(/USAGE: puppet man <action>/).to_stdout
30
+ end
31
+
32
+ it "exits with 0 when generating man documentation for each available application" do
33
+ # turn off deprecation warning
34
+ Puppet[:disable_warnings] = ['deprecations']
35
+
36
+ allow(Puppet::Util).to receive(:which).with('ronn').and_return(nil)
37
+ allow(Puppet::Util).to receive(:which).with(pager).and_return(pager)
38
+
39
+ Puppet::Application.available_application_names.each do |name|
40
+ next if %w{man face_base indirection_base}.include? name
41
+
42
+ app = Puppet::Application[:man]
43
+ app.command_line.args << 'man' << name
44
+
45
+ expect {
46
+ allow(IO).to receive(:popen).with(pager, 'w:UTF-8').and_yield($stdout)
47
+ app.run
48
+ }.to exit_with(0)
49
+ .and output(/puppet-#{name}/m).to_stdout
50
+ end
51
+ end
52
+ end
@@ -51,7 +51,9 @@ describe Puppet::Application::Resource do
51
51
  # provider is a parameter that should always be available
52
52
  @resource_app.extra_params = [ :provider ]
53
53
 
54
- expect { @resource_app.main }.to have_printed(/provider\s+=>/)
54
+ expect {
55
+ @resource_app.main
56
+ }.to output(/provider\s+=>/).to_stdout
55
57
  end
56
58
  end
57
59
 
@@ -38,7 +38,7 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
38
38
  def expects_command_to_pass(expected_output = nil)
39
39
  expect {
40
40
  ssl.run_command
41
- }.to have_printed(expected_output)
41
+ }.to output(expected_output).to_stdout
42
42
  end
43
43
 
44
44
  def expects_command_to_fail(message)
@@ -46,7 +46,7 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
46
46
  expect {
47
47
  ssl.run_command
48
48
  }.to raise_error(Puppet::Error, message)
49
- }.to have_printed(/.*/) # ignore output
49
+ }.to output(/.*/).to_stdout
50
50
  end
51
51
 
52
52
  shared_examples_for 'an ssl action' do
@@ -266,6 +266,19 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
266
266
  FileUtils.cp(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'encrypted-key.pem'), Puppet[:hostprivkey])
267
267
  FileUtils.cp(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'signed.pem'), Puppet[:hostcert])
268
268
 
269
+ # To verify the client cert we need the root and intermediate certs and crls.
270
+ # We don't need to do this with `ssl-client` cert above, because it is issued
271
+ # directly from the generated TestCa above.
272
+ File.open(Puppet[:localcacert], 'w') do |f|
273
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'ca.pem')))
274
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'intermediate.pem')))
275
+ end
276
+
277
+ File.open(Puppet[:hostcrl], 'w') do |f|
278
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'crl.pem')))
279
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'intermediate-crl.pem')))
280
+ end
281
+
269
282
  Puppet[:passfile] = file_containing('passfile', '74695716c8b6')
270
283
 
271
284
  expects_command_to_pass(%r{Verified client certificate 'CN=signed' fingerprint})
@@ -228,5 +228,15 @@ describe Puppet::Configurer::Downloader do
228
228
 
229
229
  expect { @dler.evaluate }.not_to raise_error
230
230
  end
231
+
232
+ it "raises an exception if catalog application fails" do
233
+ Puppet[:ignore_plugin_errors] = false
234
+
235
+ expect(@dler.file).to receive(:retrieve).and_raise(Puppet::Error, "testing")
236
+
237
+ expect {
238
+ @dler.evaluate
239
+ }.to raise_error(Puppet::Error, /testing/)
240
+ end
231
241
  end
232
242
  end
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/configurer'
3
- require 'webmock/rspec'
4
3
 
5
4
  describe Puppet::Configurer do
6
5
  before do
@@ -85,6 +84,26 @@ describe Puppet::Configurer do
85
84
  expect(configurer.run).to eq(0)
86
85
  end
87
86
 
87
+ it "fails the run if pluginsync fails when usecacheonfailure is false" do
88
+ Puppet[:ignore_plugin_errors] = false
89
+
90
+ # --test implies these, set them so we don't fall back to a cached catalog
91
+ Puppet[:use_cached_catalog] = false
92
+ Puppet[:usecacheonfailure] = false
93
+
94
+ body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
95
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
96
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
97
+ )
98
+ stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
99
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
100
+ )
101
+
102
+ configurer.run(pluginsync: true)
103
+
104
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: %r{Failed to apply catalog: Failed to retrieve pluginfacts: Could not retrieve information from environment production source\(s\) puppet:///pluginfacts}))
105
+ end
106
+
88
107
  it "applies a cached catalog when it can't connect to the master" do
89
108
  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
90
109
 
@@ -96,7 +115,8 @@ describe Puppet::Configurer do
96
115
  end
97
116
 
98
117
  it "should initialize a transaction report if one is not provided" do
99
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
118
+ # host and settings catalogs each create a report...
119
+ expect(Puppet::Transaction::Report).to receive(:new).and_return(report).twice
100
120
 
101
121
  configurer.run
102
122
  end
@@ -192,22 +212,21 @@ describe Puppet::Configurer do
192
212
  end
193
213
 
194
214
  it "should remove the report as a log destination when the run is finished" do
195
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
196
-
197
- configurer.run
215
+ configurer.run(report: report)
198
216
 
199
217
  expect(Puppet::Util::Log.destinations).not_to include(report)
200
218
  end
201
219
 
202
- it "should return the report exit_status as the result of the run" do
203
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
204
- expect(report).to receive(:exit_status).and_return(1234)
220
+ it "should return an exit status of 2 due to the notify resource 'changing'" do
221
+ cat = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
222
+ cat.add_resource(Puppet::Type.type(:notify).new(:name => 'something changed'))
205
223
 
206
- expect(configurer.run).to eq(1234)
224
+ expect(configurer.run(catalog: cat, report: report)).to eq(2)
207
225
  end
208
226
 
209
227
  it "should return nil if catalog application fails" do
210
- expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
228
+ expect(catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
229
+
211
230
  expect(configurer.run(catalog: catalog, report: report)).to be_nil
212
231
  end
213
232
 
@@ -222,34 +241,28 @@ describe Puppet::Configurer do
222
241
  end
223
242
 
224
243
  it "should include the pre-run command failure in the report" do
225
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
226
-
227
244
  Puppet.settings[:prerun_command] = "/my/command"
228
245
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
229
246
 
230
- expect(configurer.run).to be_nil
247
+ expect(configurer.run(report: report)).to be_nil
231
248
  expect(report.logs.find { |x| x.message =~ /Could not run command from prerun_command/ }).to be
232
249
  end
233
250
 
234
251
  it "should send the transaction report even if the post-run command fails" do
235
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
236
-
237
252
  Puppet.settings[:postrun_command] = "/my/command"
238
253
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
239
254
  expect(configurer).to receive(:send_report).with(report)
240
255
 
241
- expect(configurer.run).to be_nil
256
+ expect(configurer.run(report: report)).to be_nil
242
257
  end
243
258
 
244
259
  it "should include the post-run command failure in the report" do
245
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
246
-
247
260
  Puppet.settings[:postrun_command] = "/my/command"
248
261
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
249
262
 
250
263
  expect(report).to receive(:<<) { |log, _| expect(log.message).to match(/Could not run command from postrun_command/) }.at_least(:once)
251
264
 
252
- expect(configurer.run).to be_nil
265
+ expect(configurer.run(report: report)).to be_nil
253
266
  end
254
267
 
255
268
  it "should execute post-run command even if the pre-run command fails" do
@@ -262,34 +275,28 @@ describe Puppet::Configurer do
262
275
  end
263
276
 
264
277
  it "should finalize the report" do
265
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
266
-
267
278
  expect(report).to receive(:finalize_report)
268
- configurer.run
279
+ configurer.run(report: report)
269
280
  end
270
281
 
271
282
  it "should not apply the catalog if the pre-run command fails" do
272
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
273
-
274
283
  Puppet.settings[:prerun_command] = "/my/command"
275
284
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
276
285
 
277
286
  expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:apply)
278
287
  expect(configurer).to receive(:send_report)
279
288
 
280
- expect(configurer.run).to be_nil
289
+ expect(configurer.run(report: report)).to be_nil
281
290
  end
282
291
 
283
292
  it "should apply the catalog, send the report, and return nil if the post-run command fails" do
284
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
285
-
286
293
  Puppet.settings[:postrun_command] = "/my/command"
287
294
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
288
295
 
289
296
  expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply)
290
297
  expect(configurer).to receive(:send_report)
291
298
 
292
- expect(configurer.run).to be_nil
299
+ expect(configurer.run(report: report)).to be_nil
293
300
  end
294
301
 
295
302
  it 'includes total time metrics in the report after successfully applying the catalog' do
@@ -546,6 +553,15 @@ describe Puppet::Configurer do
546
553
  end
547
554
  end
548
555
 
556
+ def expects_pluginsync
557
+ metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":0,\"group\":0,\"mode\":420,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
558
+ stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
559
+
560
+ # response retains owner/group/mode due to source_permissions => use
561
+ facts_metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":500,\"group\":500,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
562
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
563
+ end
564
+
549
565
  def expects_new_catalog_only(catalog)
550
566
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
551
567
  expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
@@ -562,6 +578,7 @@ describe Puppet::Configurer do
562
578
  end
563
579
 
564
580
  def expects_fallback_to_new_catalog(catalog)
581
+ expects_pluginsync
565
582
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
566
583
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
567
584
  end
@@ -598,7 +615,6 @@ describe Puppet::Configurer do
598
615
  it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
599
616
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
600
617
  expects_fallback_to_new_catalog(catalog)
601
- expect(configurer).to receive(:download_plugins)
602
618
 
603
619
  configurer.run
604
620
  end
@@ -636,6 +652,7 @@ describe Puppet::Configurer do
636
652
  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
637
653
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
638
654
  expects_neither_new_or_cached_catalog
655
+ expects_pluginsync
639
656
 
640
657
  # after failing to use a cached catalog, we'll need to pluginsync before getting
641
658
  # a new catalog, which also fails.
@@ -656,8 +673,7 @@ describe Puppet::Configurer do
656
673
  end
657
674
 
658
675
  it "applies the catalog passed as options when the catalog cache terminus is not set" do
659
- stub_request(:get, %r{/puppet/v3/file_metadatas?/plugins}).to_return(:status => 404)
660
- stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
676
+ expects_pluginsync
661
677
 
662
678
  catalog.add_resource(Puppet::Resource.new('notify', 'from apply'))
663
679
  configurer.run(catalog: catalog.to_ral)
@@ -54,10 +54,11 @@ describe Puppet::Confine do
54
54
  end
55
55
 
56
56
  it "should log failing confines with the label and message" do
57
+ Puppet[:log_level] = 'debug'
57
58
  allow(@confine).to receive(:pass?).and_return(false)
58
59
  expect(@confine).to receive(:message).and_return("My message")
59
60
  expect(@confine).to receive(:label).and_return("Mylabel")
60
- expect(Puppet).to receive(:debug).with("Mylabel: My message")
61
+ expect(Puppet).to receive(:debug) { |&b| expect(b.call).to eq("Mylabel: My message") }
61
62
  @confine.valid?
62
63
  end
63
64
  end
@@ -234,7 +234,9 @@ trace = true
234
234
  allow(Puppet::Settings::IniFile::Manipulator).to receive(:new).and_return(manipulator)
235
235
 
236
236
  expect(manipulator).to receive(:delete).with('main', 'setting').and_return(' setting=value')
237
- expect { subject.delete('setting', {:section => 'main'}) }.to have_printed("Deleted setting from 'main': 'setting=value'")
237
+ expect {
238
+ subject.delete('setting', {:section => 'main'})
239
+ }.to output("Deleted setting from 'main': 'setting=value'\n").to_stdout
238
240
  end
239
241
 
240
242
  it 'prints a warning when a setting is not found to delete' do
@@ -52,13 +52,13 @@ describe Puppet::FileServing::Mount::Locales do
52
52
  expect(@mount.search("foo/bar", @request)).to eq(["/"])
53
53
  end
54
54
 
55
- it "should return nil if no modules can be found that have locales and modulepath is invalid" do
55
+ it "should return the default search module path if no modules can be found that have locales and modulepath is invalid" do
56
56
  mod = double('module')
57
57
  allow(mod).to receive(:locales?).and_return(false)
58
58
 
59
59
  allow(@environment).to receive(:modules).and_return([])
60
60
  allow(@environment).to receive(:modulepath).and_return([])
61
- expect(@mount.search("foo/bar", @request)).to be_nil
61
+ expect(@mount.search("foo/bar", @request)).to eq([Puppet[:codedir]])
62
62
  end
63
63
 
64
64
  it "should return the locale paths for each module that has locales" do
@@ -52,13 +52,13 @@ describe Puppet::FileServing::Mount::PluginFacts do
52
52
  expect(@mount.search("foo/bar", @request)).to eq(["/"])
53
53
  end
54
54
 
55
- it "should return nil if no modules can be found that have plugins and modulepath is invalid" do
55
+ it "should return the default search module path if no modules can be found that have plugins and modulepath is invalid" do
56
56
  mod = double('module')
57
57
  allow(mod).to receive(:pluginfacts?).and_return(false)
58
58
 
59
59
  allow(@environment).to receive(:modules).and_return([])
60
60
  allow(@environment).to receive(:modulepath).and_return([])
61
- expect(@mount.search("foo/bar", @request)).to be_nil
61
+ expect(@mount.search("foo/bar", @request)).to eq([Puppet[:codedir]])
62
62
  end
63
63
 
64
64
  it "should return the plugin paths for each module that has plugins" do
@@ -52,13 +52,13 @@ describe Puppet::FileServing::Mount::Plugins do
52
52
  expect(@mount.search("foo/bar", @request)).to eq(["/"])
53
53
  end
54
54
 
55
- it "should return nil if no modules can be found that have plugins and modulepath is invalid" do
55
+ it "should return the default search module path if no modules can be found that have plugins and modulepath is invalid" do
56
56
  mod = double('module')
57
57
  allow(mod).to receive(:plugins?).and_return(false)
58
58
 
59
59
  allow(@environment).to receive(:modules).and_return([])
60
60
  allow(@environment).to receive(:modulepath).and_return([])
61
- expect(@mount.search("foo/bar", @request)).to be_nil
61
+ expect(@mount.search("foo/bar", @request)).to eq([Puppet[:codedir]])
62
62
  end
63
63
 
64
64
  it "should return the plugin paths for each module that has plugins" do