puppet 6.4.4-x64-mingw32 → 6.4.5-x64-mingw32

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 (221) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +1 -1
  3. data/Gemfile +4 -4
  4. data/Gemfile.lock +38 -32
  5. data/ext/build_defaults.yaml +1 -0
  6. data/ext/cert_inspector +3 -3
  7. data/ext/puppet-test +2 -2
  8. data/ext/regexp_nodes/regexp_nodes.rb +4 -4
  9. data/ext/windows/service/daemon.rb +38 -8
  10. data/install.rb +6 -6
  11. data/lib/puppet/application.rb +1 -1
  12. data/lib/puppet/application/apply.rb +2 -2
  13. data/lib/puppet/application/describe.rb +3 -9
  14. data/lib/puppet/application/doc.rb +1 -1
  15. data/lib/puppet/application/lookup.rb +1 -1
  16. data/lib/puppet/application/script.rb +2 -2
  17. data/lib/puppet/application/ssl.rb +4 -1
  18. data/lib/puppet/configurer.rb +86 -30
  19. data/lib/puppet/configurer/downloader.rb +2 -6
  20. data/lib/puppet/defaults.rb +32 -6
  21. data/lib/puppet/error.rb +9 -1
  22. data/lib/puppet/face/module/list.rb +5 -5
  23. data/lib/puppet/face/module/search.rb +1 -1
  24. data/lib/puppet/face/module/uninstall.rb +1 -1
  25. data/lib/puppet/face/module/upgrade.rb +1 -1
  26. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  27. data/lib/puppet/file_system.rb +0 -8
  28. data/lib/puppet/file_system/memory_file.rb +1 -1
  29. data/lib/puppet/file_system/posix.rb +3 -2
  30. data/lib/puppet/forge.rb +3 -3
  31. data/lib/puppet/functions.rb +1 -2
  32. data/lib/puppet/functions/camelcase.rb +2 -2
  33. data/lib/puppet/functions/epp.rb +4 -4
  34. data/lib/puppet/functions/find_file.rb +9 -9
  35. data/lib/puppet/functions/inline_epp.rb +5 -5
  36. data/lib/puppet/gettext/module_translations.rb +1 -1
  37. data/lib/puppet/graph/rb_tree_map.rb +2 -2
  38. data/lib/puppet/graph/simple_graph.rb +4 -3
  39. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  40. data/lib/puppet/indirector/hiera.rb +2 -0
  41. data/lib/puppet/indirector/resource/ral.rb +1 -3
  42. data/lib/puppet/indirector/resource/validator.rb +1 -1
  43. data/lib/puppet/interface.rb +2 -1
  44. data/lib/puppet/loaders.rb +0 -1
  45. data/lib/puppet/metatype/manager.rb +1 -1
  46. data/lib/puppet/module.rb +1 -1
  47. data/lib/puppet/module/task.rb +20 -4
  48. data/lib/puppet/module_tool/applications/installer.rb +1 -1
  49. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -3
  50. data/lib/puppet/module_tool/metadata.rb +1 -1
  51. data/lib/puppet/module_tool/shared_behaviors.rb +4 -4
  52. data/lib/puppet/module_tool/tar/mini.rb +1 -1
  53. data/lib/puppet/network/http/api/indirected_routes.rb +12 -11
  54. data/lib/puppet/network/http/connection.rb +10 -12
  55. data/lib/puppet/network/http/pool.rb +2 -0
  56. data/lib/puppet/network/http/site.rb +1 -1
  57. data/lib/puppet/network/resolver.rb +2 -2
  58. data/lib/puppet/node/environment.rb +4 -2
  59. data/lib/puppet/pal/pal_impl.rb +2 -2
  60. data/lib/puppet/parser/ast.rb +1 -1
  61. data/lib/puppet/parser/ast/resourceparam.rb +1 -1
  62. data/lib/puppet/parser/functions.rb +1 -1
  63. data/lib/puppet/parser/functions/epp.rb +3 -3
  64. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  65. data/lib/puppet/parser/scope.rb +8 -7
  66. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +1 -1
  67. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -1
  68. data/lib/puppet/pops/evaluator/external_syntax_support.rb +3 -2
  69. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
  70. data/lib/puppet/pops/loader/task_instantiator.rb +4 -0
  71. data/lib/puppet/pops/loaders.rb +1 -1
  72. data/lib/puppet/pops/lookup/hiera_config.rb +1 -0
  73. data/lib/puppet/pops/lookup/sub_lookup.rb +1 -1
  74. data/lib/puppet/pops/merge_strategy.rb +22 -18
  75. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  76. data/lib/puppet/pops/parser/interpolation_support.rb +4 -4
  77. data/lib/puppet/pops/parser/locator.rb +1 -1
  78. data/lib/puppet/pops/parser/pn_parser.rb +17 -16
  79. data/lib/puppet/pops/puppet_stack.rb +51 -49
  80. data/lib/puppet/pops/types/p_sensitive_type.rb +1 -1
  81. data/lib/puppet/pops/types/string_converter.rb +10 -10
  82. data/lib/puppet/pops/types/types.rb +3 -3
  83. data/lib/puppet/property.rb +1 -1
  84. data/lib/puppet/property/ensure.rb +1 -1
  85. data/lib/puppet/provider/exec.rb +6 -2
  86. data/lib/puppet/provider/nameservice/directoryservice.rb +1 -1
  87. data/lib/puppet/provider/nameservice/pw.rb +2 -2
  88. data/lib/puppet/provider/package/apt.rb +5 -1
  89. data/lib/puppet/provider/package/dnfmodule.rb +87 -0
  90. data/lib/puppet/provider/package/dpkg.rb +34 -18
  91. data/lib/puppet/provider/package/openbsd.rb +1 -1
  92. data/lib/puppet/provider/package/pip.rb +34 -9
  93. data/lib/puppet/provider/package/portage.rb +4 -4
  94. data/lib/puppet/provider/package/rpm.rb +5 -5
  95. data/lib/puppet/provider/package/windows/package.rb +1 -1
  96. data/lib/puppet/provider/package/yum.rb +1 -1
  97. data/lib/puppet/provider/package_targetable.rb +5 -4
  98. data/lib/puppet/provider/parsedfile.rb +1 -1
  99. data/lib/puppet/provider/service/daemontools.rb +9 -9
  100. data/lib/puppet/provider/service/openbsd.rb +1 -1
  101. data/lib/puppet/provider/service/rcng.rb +2 -2
  102. data/lib/puppet/provider/service/runit.rb +2 -8
  103. data/lib/puppet/provider/service/systemd.rb +9 -9
  104. data/lib/puppet/provider/user/directoryservice.rb +1 -1
  105. data/lib/puppet/provider/user/hpux.rb +1 -1
  106. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  107. data/lib/puppet/provider/user/useradd.rb +22 -13
  108. data/lib/puppet/provider/user/windows_adsi.rb +4 -5
  109. data/lib/puppet/reference/indirection.rb +2 -2
  110. data/lib/puppet/reference/metaparameter.rb +1 -3
  111. data/lib/puppet/reference/providers.rb +1 -3
  112. data/lib/puppet/reference/type.rb +3 -9
  113. data/lib/puppet/reports.rb +1 -1
  114. data/lib/puppet/resource.rb +1 -1
  115. data/lib/puppet/resource/catalog.rb +1 -1
  116. data/lib/puppet/settings.rb +3 -3
  117. data/lib/puppet/settings/environment_conf.rb +1 -0
  118. data/lib/puppet/ssl/host.rb +1 -1
  119. data/lib/puppet/ssl/oids.rb +1 -1
  120. data/lib/puppet/transaction.rb +33 -11
  121. data/lib/puppet/transaction/report.rb +1 -1
  122. data/lib/puppet/type.rb +2 -4
  123. data/lib/puppet/type/exec.rb +7 -3
  124. data/lib/puppet/type/file.rb +1 -2
  125. data/lib/puppet/type/file/data_sync.rb +5 -1
  126. data/lib/puppet/type/group.rb +4 -2
  127. data/lib/puppet/type/notify.rb +3 -2
  128. data/lib/puppet/type/package.rb +10 -3
  129. data/lib/puppet/type/schedule.rb +1 -1
  130. data/lib/puppet/type/service.rb +1 -1
  131. data/lib/puppet/type/user.rb +4 -2
  132. data/lib/puppet/util.rb +35 -12
  133. data/lib/puppet/util/command_line/trollop.rb +1 -1
  134. data/lib/puppet/util/http_proxy.rb +8 -14
  135. data/lib/puppet/util/log.rb +2 -2
  136. data/lib/puppet/util/log/destinations.rb +2 -2
  137. data/lib/puppet/util/logging.rb +32 -20
  138. data/lib/puppet/util/metric.rb +2 -2
  139. data/lib/puppet/util/provider_features.rb +2 -4
  140. data/lib/puppet/util/rdoc.rb +1 -1
  141. data/lib/puppet/util/reference.rb +1 -1
  142. data/lib/puppet/util/resource_template.rb +1 -1
  143. data/lib/puppet/util/selinux.rb +3 -1
  144. data/lib/puppet/util/windows/adsi.rb +48 -18
  145. data/lib/puppet/util/windows/registry.rb +7 -5
  146. data/lib/puppet/vendor.rb +1 -1
  147. data/lib/puppet/version.rb +1 -1
  148. data/lib/puppet/x509/cert_provider.rb +13 -6
  149. data/locales/puppet.pot +199 -159
  150. data/man/man5/puppet.conf.5 +35 -5
  151. data/man/man8/puppet-agent.8 +1 -1
  152. data/man/man8/puppet-apply.8 +1 -1
  153. data/man/man8/puppet-catalog.8 +1 -1
  154. data/man/man8/puppet-config.8 +1 -1
  155. data/man/man8/puppet-describe.8 +1 -1
  156. data/man/man8/puppet-device.8 +1 -1
  157. data/man/man8/puppet-doc.8 +1 -1
  158. data/man/man8/puppet-epp.8 +1 -1
  159. data/man/man8/puppet-facts.8 +1 -1
  160. data/man/man8/puppet-filebucket.8 +1 -1
  161. data/man/man8/puppet-generate.8 +1 -1
  162. data/man/man8/puppet-help.8 +1 -1
  163. data/man/man8/puppet-key.8 +1 -1
  164. data/man/man8/puppet-lookup.8 +1 -1
  165. data/man/man8/puppet-man.8 +1 -1
  166. data/man/man8/puppet-module.8 +1 -1
  167. data/man/man8/puppet-node.8 +1 -1
  168. data/man/man8/puppet-parser.8 +1 -1
  169. data/man/man8/puppet-plugin.8 +1 -1
  170. data/man/man8/puppet-report.8 +1 -1
  171. data/man/man8/puppet-resource.8 +1 -1
  172. data/man/man8/puppet-script.8 +1 -1
  173. data/man/man8/puppet-ssl.8 +1 -1
  174. data/man/man8/puppet-status.8 +1 -1
  175. data/man/man8/puppet.8 +2 -2
  176. data/spec/fixtures/unit/provider/package/dnfmodule/dnf-module-list-installed.txt +11 -0
  177. data/spec/integration/configurer_spec.rb +52 -0
  178. data/spec/integration/type/notify_spec.rb +46 -0
  179. data/spec/lib/puppet/certificate_factory.rb +2 -2
  180. data/spec/spec_helper.rb +28 -0
  181. data/spec/unit/application/ssl_spec.rb +4 -7
  182. data/spec/unit/configurer_spec.rb +394 -398
  183. data/spec/unit/defaults_spec.rb +4 -4
  184. data/spec/unit/forge/forge_spec.rb +1 -3
  185. data/spec/unit/forge/repository_spec.rb +1 -3
  186. data/spec/unit/indirector/resource/ral_spec.rb +4 -4
  187. data/spec/unit/network/http/connection_spec.rb +119 -145
  188. data/spec/unit/parser/scope_spec.rb +10 -0
  189. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  190. data/spec/unit/pops/loaders/module_loaders_spec.rb +37 -0
  191. data/spec/unit/provider/exec_spec.rb +209 -0
  192. data/spec/unit/provider/package/dnfmodule_spec.rb +186 -0
  193. data/spec/unit/provider/package/dpkg_spec.rb +238 -78
  194. data/spec/unit/provider/package/pip_spec.rb +51 -6
  195. data/spec/unit/provider/package/portage_spec.rb +4 -4
  196. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  197. data/spec/unit/provider/service/daemontools_spec.rb +24 -0
  198. data/spec/unit/provider/service/runit_spec.rb +24 -0
  199. data/spec/unit/provider/service/systemd_spec.rb +25 -25
  200. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  201. data/spec/unit/provider/user/useradd_spec.rb +46 -0
  202. data/spec/unit/ssl/host_spec.rb +0 -5
  203. data/spec/unit/ssl/state_machine_spec.rb +0 -6
  204. data/spec/unit/transaction_spec.rb +46 -0
  205. data/spec/unit/type/exec_spec.rb +6 -12
  206. data/spec/unit/type/file/content_spec.rb +9 -3
  207. data/spec/unit/type/file_spec.rb +9 -4
  208. data/spec/unit/type/package_spec.rb +5 -0
  209. data/spec/unit/util/execution_spec.rb +16 -0
  210. data/spec/unit/util/http_proxy_spec.rb +118 -27
  211. data/spec/unit/util/log/destinations_spec.rb +7 -3
  212. data/spec/unit/util/log_spec.rb +0 -138
  213. data/spec/unit/util/logging_spec.rb +200 -0
  214. data/spec/unit/util/windows/adsi_spec.rb +51 -0
  215. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  216. data/tasks/manpages.rake +1 -0
  217. metadata +12 -10
  218. data/lib/puppet/pops/loader/null_loader.rb +0 -60
  219. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +0 -24
  220. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +0 -24
  221. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +0 -24
@@ -150,16 +150,13 @@ RSpec.describe Puppet::Type.type(:exec) do
150
150
  end
151
151
  end
152
152
 
153
- it "should redact the command on failure" do
153
+ it "should redact the sensitive command on failure" do
154
154
  output = "output1\noutput2\n"
155
155
  expect { exec_tester('false', 1, :output => output, :logoutput => :on_failure, :sensitive_parameters => [:command]).refresh }.
156
156
  to raise_error(Puppet::Error, /^\[command redacted\] returned 1 instead of/)
157
157
 
158
- output.split("\n").each do |line|
159
- log = @logs.shift
160
- expect(log.level).to eq(:err)
161
- expect(log.message).to eq(line)
162
- end
158
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: '[output redacted]'))
159
+ expect(@logs).to_not include(an_object_having_attributes(message: /output1|output2/))
163
160
  end
164
161
 
165
162
  it "should log the output on failure when returns is specified as an array" do
@@ -177,7 +174,7 @@ RSpec.describe Puppet::Type.type(:exec) do
177
174
  end
178
175
  end
179
176
 
180
- it "should redact the command on failure when returns is specified as an array" do
177
+ it "should redact the sensitive command on failure when returns is specified as an array" do
181
178
  output = "output1\noutput2\n"
182
179
 
183
180
  expect {
@@ -185,11 +182,8 @@ RSpec.describe Puppet::Type.type(:exec) do
185
182
  :logoutput => :on_failure, :sensitive_parameters => [:command]).refresh
186
183
  }.to raise_error(Puppet::Error, /^\[command redacted\] returned 1 instead of/)
187
184
 
188
- output.split("\n").each do |line|
189
- log = @logs.shift
190
- expect(log.level).to eq(:err)
191
- expect(log.message).to eq(line)
192
- end
185
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: '[output redacted]'))
186
+ expect(@logs).to_not include(an_object_having_attributes(message: /output1|output2/))
193
187
  end
194
188
 
195
189
  it "shouldn't log the output on success" do
@@ -200,15 +200,21 @@ describe Puppet::Type.type(:file).attrclass(:content), :uses_checksums => true d
200
200
  end
201
201
 
202
202
  it "prints the diff" do
203
- expect(content).to receive(:diff).and_return("my diff").once
204
- expect(content).to receive(:debug).with("\nmy diff").once
203
+ expect(content).to receive(:diff).and_return("my diff")
204
+ expect(content).to receive(:debug).with("\nmy diff")
205
+ expect(content).not_to be_safe_insync("other content")
206
+ end
207
+
208
+ it "prints binary file notice if diff is not valid encoding" do
209
+ expect(content).to receive(:diff).and_return("\xc7\xd1\xfc\x84")
210
+ expect(content).to receive(:debug).with(/\nBinary files #{filename} and .* differ/)
205
211
  expect(content).not_to be_safe_insync("other content")
206
212
  end
207
213
 
208
214
  it "redacts the diff when the property is sensitive" do
209
215
  content.sensitive = true
210
216
  expect(content).not_to receive(:diff)
211
- expect(content).to receive(:debug).with("[diff redacted]").once
217
+ expect(content).to receive(:debug).with("[diff redacted]")
212
218
  expect(content).not_to be_safe_insync("other content")
213
219
  end
214
220
  end
@@ -477,6 +477,9 @@ describe Puppet::Type.type(:file) do
477
477
  end
478
478
 
479
479
  describe "#recurse" do
480
+ let(:name) { 'bar' }
481
+ let(:child) { double('puppet_type_file') }
482
+
480
483
  before do
481
484
  file[:recurse] = true
482
485
  @metadata = Puppet::FileServing::Metadata
@@ -485,8 +488,9 @@ describe Puppet::Type.type(:file) do
485
488
  describe "and a source is set" do
486
489
  it "should pass the already-discovered resources to recurse_remote" do
487
490
  file[:source] = File.expand_path(__FILE__)
488
- allow(file).to receive(:recurse_local).and_return(:foo => "bar")
489
- expect(file).to receive(:recurse_remote).with(:foo => "bar").and_return([])
491
+ allow(child).to receive(:[]).with(:path).and_return(name)
492
+ allow(file).to receive(:recurse_local).and_return(name => child)
493
+ expect(file).to receive(:recurse_remote).with(name => child).and_return([])
490
494
  file.recurse
491
495
  end
492
496
  end
@@ -494,8 +498,9 @@ describe Puppet::Type.type(:file) do
494
498
  describe "and a target is set" do
495
499
  it "should use recurse_link" do
496
500
  file[:target] = File.expand_path(__FILE__)
497
- allow(file).to receive(:recurse_local).and_return(:foo => "bar")
498
- expect(file).to receive(:recurse_link).with(:foo => "bar").and_return([])
501
+ allow(child).to receive(:[]).with(:path).and_return(name)
502
+ allow(file).to receive(:recurse_local).and_return(name => child)
503
+ expect(file).to receive(:recurse_link).with(name => child).and_return([])
499
504
  file.recurse
500
505
  end
501
506
  end
@@ -375,6 +375,11 @@ describe Puppet::Type.type(:package) do
375
375
  expect(pkg[:allow_virtual]).to eq true
376
376
  end
377
377
 
378
+ it "defaults to false on dpkg provider" do
379
+ pkg = Puppet::Type.type(:package).new(:name => 'yay', :provider => :dpkg)
380
+ expect(pkg[:allow_virtual]).to be_nil
381
+ end
382
+
378
383
  it "defaults to false on platforms that do not support virtual packages" do
379
384
  pkg = Puppet::Type.type(:package).new(:name => 'yay', :provider => :apple)
380
385
  expect(pkg[:allow_virtual]).to be_nil
@@ -128,6 +128,13 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do
128
128
 
129
129
  call_exec_posix('test command', { :cwd => cwd }, @stdin, @stdout, @stderr)
130
130
  end
131
+
132
+ it "should not change the current working directory if cwd is unspecified" do
133
+ expect(Dir).to receive(:chdir).never
134
+ expect(Kernel).to receive(:exec).with('test command')
135
+
136
+ call_exec_posix('test command', {}, @stdin, @stdout, @stderr)
137
+ end
131
138
  end
132
139
 
133
140
  it "should return the pid of the child process" do
@@ -171,6 +178,15 @@ describe Puppet::Util::Execution, if: !Puppet::Util::Platform.jruby? do
171
178
 
172
179
  call_exec_windows('test command', { :cwd => cwd }, @stdin, @stdout, @stderr)
173
180
  end
181
+
182
+ it "should not change the current working directory if cwd is unspecified" do
183
+ expect(Dir).to receive(:chdir).never
184
+ expect(Process).to receive(:create) do |args|
185
+ expect(args[:cwd]).to be_nil
186
+ end
187
+
188
+ call_exec_windows('test command', {}, @stdin, @stdout, @stderr)
189
+ end
174
190
  end
175
191
 
176
192
  context 'suppress_window option' do
@@ -12,6 +12,103 @@ describe Puppet::Util::HttpProxy do
12
12
 
13
13
  host, port, user, password = 'some.host', 1234, 'user1', 'pAssw0rd'
14
14
 
15
+ def expects_direct_connection_to(http, www)
16
+ expect(http.address).to eq(www.host)
17
+ expect(http.port).to eq(www.port)
18
+
19
+ expect(http.proxy_address).to be_nil
20
+ expect(http.proxy_port).to be_nil
21
+ expect(http.proxy_user).to be_nil
22
+ expect(http.proxy_pass).to be_nil
23
+ end
24
+
25
+ def expects_proxy_connection_via(http, www, host, port, user, password)
26
+ expect(http.address).to eq(www.host)
27
+ expect(http.port).to eq(www.port)
28
+
29
+ expect(http.proxy_address).to eq(host)
30
+ expect(http.proxy_port).to eq(port)
31
+ expect(http.proxy_user).to eq(user)
32
+ expect(http.proxy_pass).to eq(password)
33
+ end
34
+
35
+ describe '.proxy' do
36
+ let(:www) { URI::HTTP.build(host: 'www.example.com', port: 80) }
37
+
38
+ it 'uses a proxy' do
39
+ Puppet[:http_proxy_host] = host
40
+ Puppet[:http_proxy_port] = port
41
+ Puppet[:http_proxy_user] = user
42
+ Puppet[:http_proxy_password] = password
43
+
44
+ http = subject.proxy(www)
45
+ expects_proxy_connection_via(http, www, host, port, user, password)
46
+ end
47
+
48
+ it 'connects directly to the server' do
49
+ http = subject.proxy(www)
50
+ expects_direct_connection_to(http, www)
51
+ end
52
+
53
+ context 'when setting no_proxy' do
54
+ before :each do
55
+ Puppet[:http_proxy_host] = host
56
+ Puppet[:http_proxy_port] = port
57
+ end
58
+
59
+ it 'connects directly to the server when HTTP_PROXY environment variable is set, but server matches no_proxy setting' do
60
+ Puppet[:no_proxy] = www.host
61
+
62
+ Puppet::Util.withenv('HTTP_PROXY' => "http://#{host}:#{port}") do
63
+ http = subject.proxy(www)
64
+ expects_direct_connection_to(http, www)
65
+ end
66
+ end
67
+
68
+ it 'connects directly to the server when no_proxy matches wildcard domain' do
69
+ Puppet[:no_proxy] = '*.example.com'
70
+
71
+ http = subject.proxy(www)
72
+ expects_direct_connection_to(http, www)
73
+ end
74
+
75
+ it 'connects directly to the server when no_proxy matches dotted domain' do
76
+ Puppet[:no_proxy] = '.example.com'
77
+
78
+ http = subject.proxy(www)
79
+ expects_direct_connection_to(http, www)
80
+ end
81
+
82
+ it 'connects directly to the server when no_proxy matches a domain suffix like ruby does' do
83
+ Puppet[:no_proxy] = 'example.com'
84
+
85
+ http = subject.proxy(www)
86
+ expects_direct_connection_to(http, www)
87
+ end
88
+
89
+ it 'connects directly to the server when no_proxy matches a partial suffix like ruby does' do
90
+ Puppet[:no_proxy] = 'ample.com'
91
+
92
+ http = subject.proxy(www)
93
+ expects_direct_connection_to(http, www)
94
+ end
95
+
96
+ it 'connects directly to the server when it is a subdomain of no_proxy' do
97
+ Puppet[:no_proxy] = '*.com'
98
+
99
+ http = subject.proxy(www)
100
+ expects_direct_connection_to(http, www)
101
+ end
102
+
103
+ it 'connects directly to the server when no_proxy is *' do
104
+ Puppet[:no_proxy] = '*'
105
+
106
+ http = subject.proxy(www)
107
+ expects_direct_connection_to(http, www)
108
+ end
109
+ end
110
+ end
111
+
15
112
  describe ".http_proxy_env" do
16
113
  it "should return nil if no environment variables" do
17
114
  expect(subject.http_proxy_env).to eq(nil)
@@ -241,22 +338,22 @@ describe Puppet::Util::HttpProxy do
241
338
 
242
339
  describe '.request_with_redirects' do
243
340
  let(:dest) { URI.parse('http://mydomain.com/some/path') }
244
- let(:http_ok) { double('http ok', :code => 200, :message => 'HTTP OK') }
245
341
 
246
342
  it 'generates accept and accept-encoding headers' do
247
- allow_any_instance_of(Net::HTTP).to receive(:head).and_return(http_ok)
248
- expect_any_instance_of(Net::HTTP).to receive(:get) do |_, _, headers|
249
- expect(headers)
250
- .to match({'Accept' => '*/*',
251
- 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
252
- 'User-Agent' => /Puppet/})
253
- end.and_return(http_ok)
343
+ stub_request(:head, dest)
344
+
345
+ headers = {
346
+ 'Accept' => '*/*',
347
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
348
+ 'User-Agent' => /Puppet/
349
+ }
350
+ stub_request(:get, dest).with(headers: headers)
254
351
 
255
352
  subject.request_with_redirects(dest, :get, 0)
256
353
  end
257
354
 
258
355
  it 'can return a compressed response body' do
259
- allow_any_instance_of(Net::HTTP).to receive(:head).and_return(http_ok)
356
+ stub_request(:head, dest)
260
357
 
261
358
  compressed_body = [
262
359
  0x1f, 0x8b, 0x08, 0x08, 0xe9, 0x08, 0x7a, 0x5a, 0x00, 0x03,
@@ -264,9 +361,7 @@ describe Puppet::Util::HttpProxy do
264
361
  0x00, 0x7a, 0x7a, 0x6f, 0xed, 0x03, 0x00, 0x00, 0x00
265
362
  ].pack('C*')
266
363
 
267
- response = double('http ok', :code => 200, :message => 'HTTP OK', :body => compressed_body)
268
- allow(response).to receive(:[]).with('content-encoding').and_return('gzip')
269
- expect_any_instance_of(Net::HTTP).to receive(:get).and_return(response)
364
+ stub_request(:get, dest).to_return(status: 200, body: compressed_body, headers: { 'Content-Encoding' => 'gzip' })
270
365
 
271
366
  expect(
272
367
  uncompress_body(subject.request_with_redirects(dest, :get, 0))
@@ -274,13 +369,14 @@ describe Puppet::Util::HttpProxy do
274
369
  end
275
370
 
276
371
  it 'generates accept and accept-encoding headers when a block is provided' do
277
- allow_any_instance_of(Net::HTTP).to receive(:head).and_return(http_ok)
278
- expect_any_instance_of(Net::HTTP).to receive(:request_get) do |_, _, headers, &block|
279
- expect(headers)
280
- .to match({'Accept' => '*/*',
281
- 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
282
- 'User-Agent' => /Puppet/})
283
- end.and_return(http_ok)
372
+ stub_request(:head, dest)
373
+
374
+ headers = {
375
+ 'Accept' => '*/*',
376
+ 'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
377
+ 'User-Agent' => /Puppet/
378
+ }
379
+ stub_request(:get, dest).with(headers: headers)
284
380
 
285
381
  subject.request_with_redirects(dest, :get, 0) do
286
382
  # unused
@@ -288,7 +384,7 @@ describe Puppet::Util::HttpProxy do
288
384
  end
289
385
 
290
386
  it 'only makes a single HEAD request' do
291
- expect_any_instance_of(Net::HTTP).to receive(:head).with(anything, anything).and_return(http_ok)
387
+ stub_request(:head, dest)
292
388
 
293
389
  subject.request_with_redirects(dest, :head, 0)
294
390
  end
@@ -296,13 +392,8 @@ describe Puppet::Util::HttpProxy do
296
392
  it 'preserves query parameters' do
297
393
  url = URI.parse('http://mydomain.com/some/path?foo=bar')
298
394
 
299
- expect_any_instance_of(Net::HTTP).to receive(:head) do |_method, path, _headers|
300
- expect(path).to eq(url)
301
- end.and_return(http_ok)
302
-
303
- expect_any_instance_of(Net::HTTP).to receive(:request_get) do |_http, path, _headers, &block|
304
- expect(path).to eq(url)
305
- end.and_return(http_ok)
395
+ stub_request(:head, url)
396
+ stub_request(:get, url)
306
397
 
307
398
  subject.request_with_redirects(url, :get, 0) do
308
399
  # unused
@@ -46,13 +46,15 @@ describe Puppet::Util::Log.desttypes[:file] do
46
46
 
47
47
  describe "on POSIX systems", :if => Puppet.features.posix? do
48
48
  describe "with a normal file" do
49
+ let (:parent) { Pathname.new('/tmp') }
49
50
  let (:abspath) { '/tmp/log' }
50
51
  let (:relpath) { 'log' }
51
52
 
52
53
  it_behaves_like "file destination"
53
54
 
54
55
  it "logs an error if it can't chown the file owner & group" do
55
- expect(File).to receive(:exists?).with(abspath).and_return(false)
56
+ allow(File).to receive(:exist?).with(parent).and_return(true)
57
+ expect(File).to receive(:exist?).with(Pathname.new(abspath)).and_return(false)
56
58
  expect(FileUtils).to receive(:chown).with(Puppet[:user], Puppet[:group], abspath).and_raise(Errno::EPERM)
57
59
  expect(Puppet.features).to receive(:root?).and_return(true)
58
60
  expect(Puppet).to receive(:err).with("Unable to set ownership to #{Puppet[:user]}:#{Puppet[:group]} for log file: #{abspath}")
@@ -61,7 +63,8 @@ describe Puppet::Util::Log.desttypes[:file] do
61
63
  end
62
64
 
63
65
  it "doesn't attempt to chown when running as non-root" do
64
- expect(File).to receive(:exists?).with(abspath).and_return(false)
66
+ allow(File).to receive(:exist?).with(parent).and_return(true)
67
+ expect(File).to receive(:exist?).with(Pathname.new(abspath)).and_return(false)
65
68
  expect(FileUtils).not_to receive(:chown).with(Puppet[:user], Puppet[:group], abspath)
66
69
  expect(Puppet.features).to receive(:root?).and_return(false)
67
70
 
@@ -69,7 +72,8 @@ describe Puppet::Util::Log.desttypes[:file] do
69
72
  end
70
73
 
71
74
  it "doesn't attempt to chown when file already exists" do
72
- expect(File).to receive(:exists?).with(abspath).and_return(true)
75
+ allow(File).to receive(:exist?).with(parent).and_return(true)
76
+ expect(File).to receive(:exist?).with(Pathname.new(abspath)).and_return(true)
73
77
  expect(FileUtils).not_to receive(:chown).with(Puppet[:user], Puppet[:group], abspath)
74
78
  expect(Puppet.features).to receive(:root?).and_return(true)
75
79
 
@@ -177,144 +177,6 @@ describe Puppet::Util::Log do
177
177
 
178
178
  expect(logs.collect(&:message)).to include("Inner block", "Outer block")
179
179
  end
180
-
181
- it 'includes backtrace for RuntimeError in log message when trace option is passed' do
182
- logs = []
183
- destination = Puppet::Test::LogCollector.new(logs)
184
-
185
- Puppet::Util::Log.newdestination(destination)
186
- Puppet::Util::Log.with_destination(destination) do
187
- begin
188
- raise RuntimeError, 'Oops'
189
- rescue RuntimeError => e
190
- Puppet.log_exception(e, :default, :trace => true)
191
- end
192
- end
193
- expect(logs.size).to eq(1)
194
- log = logs[0]
195
- expect(log.message).to match('/log_spec.rb')
196
- expect(log.backtrace).to be_nil
197
- end
198
-
199
- context "global options" do
200
- around :each do |example|
201
- Puppet[:trace] = true
202
- example.run
203
- Puppet[:trace] = false
204
- end
205
-
206
- it 'includes backtrace for RuntimeError in log message when trace is enabled globally' do
207
- logs = []
208
- destination = Puppet::Test::LogCollector.new(logs)
209
-
210
- Puppet::Util::Log.newdestination(destination)
211
- Puppet::Util::Log.with_destination(destination) do
212
- begin
213
- raise RuntimeError, 'Oops'
214
- rescue RuntimeError => e
215
- Puppet.log_exception(e, :default)
216
- end
217
- end
218
- expect(logs.size).to eq(1)
219
- log = logs[0]
220
- expect(log.message).to match('/log_spec.rb')
221
- expect(log.backtrace).to be_nil
222
- end
223
- end
224
-
225
- it 'excludes backtrace for RuntimeError in log message when trace is disabled' do
226
- logs = []
227
- destination = Puppet::Test::LogCollector.new(logs)
228
-
229
- Puppet::Util::Log.newdestination(destination)
230
- Puppet::Util::Log.with_destination(destination) do
231
- begin
232
- raise RuntimeError, 'Oops'
233
- rescue RuntimeError => e
234
- Puppet.log_exception(e)
235
- end
236
- end
237
- expect(logs.size).to eq(1)
238
- log = logs[0]
239
- expect(log.message).to_not match('/log_spec.rb')
240
- expect(log.backtrace).to be_nil
241
- end
242
-
243
- it "backtrace is Array in 'backtrace' and excluded from 'message' when logging ParseErrorWithIssue with trace enabled" do
244
- logs = []
245
- destination = Puppet::Test::LogCollector.new(logs)
246
-
247
- Puppet::Util::Log.newdestination(destination)
248
- Puppet::Util::Log.with_destination(destination) do
249
- begin
250
- raise Puppet::ParseErrorWithIssue.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
251
- rescue RuntimeError => e
252
- Puppet.log_exception(e, :default, :trace => true)
253
- end
254
- end
255
- expect(logs.size).to eq(1)
256
- log = logs[0]
257
- expect(log.message).to_not match('/log_spec.rb')
258
- expect(log.backtrace).to be_a(Array)
259
- end
260
-
261
- it "backtrace is excluded when logging ParseErrorWithIssue with trace disabled" do
262
- logs = []
263
- destination = Puppet::Test::LogCollector.new(logs)
264
-
265
- Puppet::Util::Log.newdestination(destination)
266
- Puppet::Util::Log.with_destination(destination) do
267
- begin
268
- raise Puppet::ParseErrorWithIssue.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
269
- rescue RuntimeError => e
270
- Puppet.log_exception(e)
271
- end
272
- end
273
- expect(logs.size).to eq(1)
274
- log = logs[0]
275
- expect(log.message).to_not match('/log_spec.rb')
276
- expect(log.backtrace).to be_nil
277
- end
278
-
279
- it 'includes position details for ParseError in log message' do
280
- logs = []
281
- destination = Puppet::Test::LogCollector.new(logs)
282
-
283
- Puppet::Util::Log.newdestination(destination)
284
- Puppet::Util::Log.with_destination(destination) do
285
- begin
286
- raise Puppet::ParseError.new('Oops', '/tmp/test.pp', 30, 15)
287
- rescue RuntimeError => e
288
- Puppet.log_exception(e)
289
- end
290
- end
291
- expect(logs.size).to eq(1)
292
- log = logs[0]
293
- expect(log.message).to match(/ \(file: \/tmp\/test\.pp, line: 30, column: 15\)/)
294
- expect(log.message).to be(log.to_s)
295
- end
296
-
297
- it 'excludes position details for ParseErrorWithIssue from log message' do
298
- logs = []
299
- destination = Puppet::Test::LogCollector.new(logs)
300
-
301
- Puppet::Util::Log.newdestination(destination)
302
- Puppet::Util::Log.with_destination(destination) do
303
- begin
304
- raise Puppet::ParseErrorWithIssue.new('Oops', '/tmp/test.pp', 30, 15, nil, :SYNTAX_ERROR)
305
- rescue RuntimeError => e
306
- Puppet.log_exception(e)
307
- end
308
- end
309
- expect(logs.size).to eq(1)
310
- log = logs[0]
311
- expect(log.message).to_not match(/ \(file: \/tmp\/test\.pp, line: 30, column: 15\)/)
312
- expect(log.to_s).to match(/ \(file: \/tmp\/test\.pp, line: 30, column: 15\)/)
313
- expect(log.issue_code).to eq(:SYNTAX_ERROR)
314
- expect(log.file).to eq('/tmp/test.pp')
315
- expect(log.line).to eq(30)
316
- expect(log.pos).to eq(15)
317
- end
318
180
  end
319
181
 
320
182
  describe Puppet::Util::Log::DestConsole do