puppet 6.18.0-universal-darwin → 6.21.1-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 (276) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -16
  3. data/Gemfile +2 -0
  4. data/Gemfile.lock +37 -34
  5. data/README.md +1 -2
  6. data/Rakefile +4 -12
  7. data/lib/puppet/agent/locker.rb +0 -7
  8. data/lib/puppet/application.rb +10 -6
  9. data/lib/puppet/application/agent.rb +9 -3
  10. data/lib/puppet/application/apply.rb +3 -2
  11. data/lib/puppet/application/device.rb +1 -0
  12. data/lib/puppet/application/doc.rb +1 -1
  13. data/lib/puppet/application/filebucket.rb +2 -2
  14. data/lib/puppet/application/lookup.rb +5 -5
  15. data/lib/puppet/application/script.rb +1 -0
  16. data/lib/puppet/application_support.rb +7 -0
  17. data/lib/puppet/configurer.rb +50 -8
  18. data/lib/puppet/defaults.rb +67 -35
  19. data/lib/puppet/environments.rb +84 -59
  20. data/lib/puppet/face/catalog.rb +1 -1
  21. data/lib/puppet/face/config.rb +56 -16
  22. data/lib/puppet/face/epp.rb +12 -2
  23. data/lib/puppet/face/facts.rb +60 -0
  24. data/lib/puppet/face/node.rb +3 -3
  25. data/lib/puppet/face/node/clean.rb +2 -2
  26. data/lib/puppet/face/status.rb +1 -1
  27. data/lib/puppet/ffi/posix.rb +10 -0
  28. data/lib/puppet/ffi/posix/constants.rb +14 -0
  29. data/lib/puppet/ffi/posix/functions.rb +24 -0
  30. data/lib/puppet/file_bucket/dipper.rb +1 -1
  31. data/lib/puppet/functions/epp.rb +1 -0
  32. data/lib/puppet/functions/inline_epp.rb +1 -0
  33. data/lib/puppet/functions/new.rb +8 -3
  34. data/lib/puppet/http.rb +1 -0
  35. data/lib/puppet/http/client.rb +1 -1
  36. data/lib/puppet/http/resolver.rb +5 -8
  37. data/lib/puppet/http/resolver/server_list.rb +18 -36
  38. data/lib/puppet/http/resolver/settings.rb +4 -4
  39. data/lib/puppet/http/resolver/srv.rb +5 -5
  40. data/lib/puppet/http/service.rb +3 -1
  41. data/lib/puppet/http/service/compiler.rb +1 -1
  42. data/lib/puppet/http/service/file_server.rb +1 -1
  43. data/lib/puppet/http/service/puppetserver.rb +39 -0
  44. data/lib/puppet/http/session.rb +5 -4
  45. data/lib/puppet/indirector/catalog/compiler.rb +1 -1
  46. data/lib/puppet/indirector/fact_search.rb +60 -0
  47. data/lib/puppet/indirector/facts/json.rb +27 -0
  48. data/lib/puppet/indirector/facts/yaml.rb +4 -59
  49. data/lib/puppet/indirector/json.rb +5 -1
  50. data/lib/puppet/indirector/msgpack.rb +1 -1
  51. data/lib/puppet/indirector/node/json.rb +8 -0
  52. data/lib/puppet/indirector/report/json.rb +34 -0
  53. data/lib/puppet/indirector/request.rb +4 -4
  54. data/lib/puppet/indirector/yaml.rb +1 -1
  55. data/lib/puppet/module_tool/applications/installer.rb +48 -2
  56. data/lib/puppet/module_tool/errors/shared.rb +17 -2
  57. data/lib/puppet/network/formats.rb +2 -1
  58. data/lib/puppet/network/http/api/master/v3/environments.rb +0 -1
  59. data/lib/puppet/node/facts.rb +17 -0
  60. data/lib/puppet/pal/pal_impl.rb +70 -17
  61. data/lib/puppet/parser/ast/leaf.rb +3 -2
  62. data/lib/puppet/parser/templatewrapper.rb +1 -1
  63. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -3
  64. data/lib/puppet/pops/evaluator/deferred_resolver.rb +5 -3
  65. data/lib/puppet/pops/evaluator/evaluator_impl.rb +22 -3
  66. data/lib/puppet/pops/evaluator/runtime3_converter.rb +2 -2
  67. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  68. data/lib/puppet/pops/types/p_meta_type.rb +1 -1
  69. data/lib/puppet/pops/types/p_type_set_type.rb +4 -0
  70. data/lib/puppet/property/list.rb +1 -1
  71. data/lib/puppet/provider/group/groupadd.rb +13 -8
  72. data/lib/puppet/provider/package/apt.rb +34 -2
  73. data/lib/puppet/provider/package/aptitude.rb +6 -0
  74. data/lib/puppet/provider/package/dpkg.rb +1 -1
  75. data/lib/puppet/provider/package/pip2.rb +17 -0
  76. data/lib/puppet/provider/package/puppetserver_gem.rb +180 -0
  77. data/lib/puppet/provider/package/yum.rb +1 -0
  78. data/lib/puppet/provider/service/debian.rb +2 -0
  79. data/lib/puppet/provider/user/aix.rb +2 -2
  80. data/lib/puppet/provider/user/useradd.rb +62 -8
  81. data/lib/puppet/reference/configuration.rb +6 -5
  82. data/lib/puppet/resource/type.rb +2 -1
  83. data/lib/puppet/rest/route.rb +2 -2
  84. data/lib/puppet/settings.rb +62 -20
  85. data/lib/puppet/settings/alias_setting.rb +37 -0
  86. data/lib/puppet/settings/base_setting.rb +26 -2
  87. data/lib/puppet/transaction/report.rb +11 -7
  88. data/lib/puppet/type/file/source.rb +1 -1
  89. data/lib/puppet/type/filebucket.rb +1 -1
  90. data/lib/puppet/type/package.rb +3 -3
  91. data/lib/puppet/util/autoload.rb +1 -8
  92. data/lib/puppet/util/connection.rb +8 -8
  93. data/lib/puppet/util/fact_dif.rb +62 -0
  94. data/lib/puppet/util/posix.rb +54 -5
  95. data/lib/puppet/util/rubygems.rb +5 -1
  96. data/lib/puppet/util/run_mode.rb +5 -1
  97. data/lib/puppet/util/windows/service.rb +1 -1
  98. data/lib/puppet/version.rb +1 -1
  99. data/locales/puppet.pot +289 -268
  100. data/man/man5/puppet.conf.5 +33 -17
  101. data/man/man8/puppet-agent.8 +7 -4
  102. data/man/man8/puppet-apply.8 +2 -2
  103. data/man/man8/puppet-catalog.8 +1 -1
  104. data/man/man8/puppet-config.8 +6 -6
  105. data/man/man8/puppet-describe.8 +1 -1
  106. data/man/man8/puppet-device.8 +2 -2
  107. data/man/man8/puppet-doc.8 +1 -1
  108. data/man/man8/puppet-epp.8 +1 -1
  109. data/man/man8/puppet-facts.8 +32 -1
  110. data/man/man8/puppet-filebucket.8 +3 -3
  111. data/man/man8/puppet-generate.8 +1 -1
  112. data/man/man8/puppet-help.8 +1 -1
  113. data/man/man8/puppet-key.8 +1 -1
  114. data/man/man8/puppet-lookup.8 +1 -1
  115. data/man/man8/puppet-man.8 +1 -1
  116. data/man/man8/puppet-module.8 +1 -1
  117. data/man/man8/puppet-node.8 +7 -4
  118. data/man/man8/puppet-parser.8 +1 -1
  119. data/man/man8/puppet-plugin.8 +1 -1
  120. data/man/man8/puppet-report.8 +4 -1
  121. data/man/man8/puppet-resource.8 +1 -1
  122. data/man/man8/puppet-script.8 +2 -2
  123. data/man/man8/puppet-ssl.8 +1 -1
  124. data/man/man8/puppet-status.8 +2 -2
  125. data/man/man8/puppet.8 +2 -2
  126. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +91 -0
  127. data/spec/fixtures/unit/provider/package/puppetserver_gem/gem-list-local-packages +30 -0
  128. data/spec/fixtures/unit/provider/user/aix/aix_passwd_file.out +4 -0
  129. data/spec/integration/application/agent_spec.rb +183 -22
  130. data/spec/integration/application/apply_spec.rb +19 -0
  131. data/spec/integration/application/filebucket_spec.rb +7 -7
  132. data/spec/integration/application/plugin_spec.rb +3 -3
  133. data/spec/integration/configurer_spec.rb +14 -0
  134. data/spec/integration/defaults_spec.rb +19 -1
  135. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  136. data/spec/integration/resource/type_collection_spec.rb +2 -6
  137. data/spec/integration/transaction_spec.rb +4 -9
  138. data/spec/integration/util/windows/adsi_spec.rb +5 -3
  139. data/spec/integration/util/windows/registry_spec.rb +0 -10
  140. data/spec/lib/puppet_spec/settings.rb +6 -1
  141. data/spec/shared_contexts/types_setup.rb +2 -0
  142. data/spec/spec_helper.rb +1 -4
  143. data/spec/unit/agent_spec.rb +8 -6
  144. data/spec/unit/application/agent_spec.rb +0 -1
  145. data/spec/unit/application/config_spec.rb +224 -4
  146. data/spec/unit/application/doc_spec.rb +2 -2
  147. data/spec/unit/application/facts_spec.rb +3 -1
  148. data/spec/unit/application/filebucket_spec.rb +0 -2
  149. data/spec/unit/application_spec.rb +60 -13
  150. data/spec/unit/configurer_spec.rb +39 -6
  151. data/spec/unit/confine/feature_spec.rb +1 -1
  152. data/spec/unit/confine_spec.rb +8 -2
  153. data/spec/unit/defaults_spec.rb +20 -1
  154. data/spec/unit/environments_spec.rb +176 -32
  155. data/spec/unit/face/config_spec.rb +62 -11
  156. data/spec/unit/face/node_spec.rb +2 -13
  157. data/spec/unit/file_serving/configuration/parser_spec.rb +0 -1
  158. data/spec/unit/file_serving/metadata_spec.rb +3 -3
  159. data/spec/unit/file_serving/terminus_helper_spec.rb +11 -4
  160. data/spec/unit/file_system_spec.rb +1 -2
  161. data/spec/unit/forge/module_release_spec.rb +2 -7
  162. data/spec/unit/functions/inline_epp_spec.rb +26 -1
  163. data/spec/unit/http/resolver_spec.rb +24 -4
  164. data/spec/unit/http/service/ca_spec.rb +2 -2
  165. data/spec/unit/http/service/compiler_spec.rb +51 -2
  166. data/spec/unit/http/service/file_server_spec.rb +2 -2
  167. data/spec/unit/http/service/puppetserver_spec.rb +82 -0
  168. data/spec/unit/http/service/report_spec.rb +2 -2
  169. data/spec/unit/http/service_spec.rb +1 -1
  170. data/spec/unit/http/session_spec.rb +8 -20
  171. data/spec/unit/indirector/catalog/json_spec.rb +1 -1
  172. data/spec/unit/indirector/catalog/rest_spec.rb +1 -1
  173. data/spec/unit/indirector/face_spec.rb +0 -1
  174. data/spec/unit/indirector/facts/facter_spec.rb +0 -1
  175. data/spec/unit/indirector/facts/json_spec.rb +255 -0
  176. data/spec/unit/indirector/facts/rest_spec.rb +1 -1
  177. data/spec/unit/indirector/file_bucket_file/selector_spec.rb +26 -8
  178. data/spec/unit/indirector/indirection_spec.rb +8 -12
  179. data/spec/unit/indirector/json_spec.rb +8 -8
  180. data/spec/unit/indirector/key/file_spec.rb +0 -1
  181. data/spec/unit/indirector/msgpack_spec.rb +8 -8
  182. data/spec/unit/indirector/node/json_spec.rb +33 -0
  183. data/spec/unit/indirector/node/rest_spec.rb +1 -1
  184. data/spec/{integration/indirector/report/yaml.rb → unit/indirector/report/json_spec.rb} +13 -24
  185. data/spec/unit/indirector/report/yaml_spec.rb +72 -8
  186. data/spec/unit/indirector/request_spec.rb +4 -4
  187. data/spec/unit/indirector/rest_spec.rb +1 -1
  188. data/spec/unit/indirector/status/rest_spec.rb +1 -1
  189. data/spec/unit/indirector/yaml_spec.rb +7 -7
  190. data/spec/unit/indirector_spec.rb +2 -2
  191. data/spec/unit/module_tool/applications/installer_spec.rb +66 -0
  192. data/spec/unit/network/authconfig_spec.rb +0 -3
  193. data/spec/unit/network/http/api/indirected_routes_spec.rb +0 -9
  194. data/spec/unit/network/http/api/master/v3/environments_spec.rb +12 -23
  195. data/spec/unit/network/http/handler_spec.rb +0 -5
  196. data/spec/unit/parser/compiler_spec.rb +3 -19
  197. data/spec/unit/parser/resource_spec.rb +14 -8
  198. data/spec/unit/parser/templatewrapper_spec.rb +4 -3
  199. data/spec/unit/pops/evaluator/deferred_resolver_spec.rb +20 -0
  200. data/spec/unit/property_spec.rb +1 -0
  201. data/spec/unit/provider/exec_spec.rb +4 -3
  202. data/spec/unit/provider/group/groupadd_spec.rb +5 -2
  203. data/spec/unit/provider/nameservice_spec.rb +66 -65
  204. data/spec/unit/provider/package/apt_spec.rb +28 -23
  205. data/spec/unit/provider/package/aptitude_spec.rb +1 -1
  206. data/spec/unit/provider/package/base_spec.rb +6 -5
  207. data/spec/unit/provider/package/dpkg_spec.rb +22 -7
  208. data/spec/unit/provider/package/openbsd_spec.rb +2 -0
  209. data/spec/unit/provider/package/pacman_spec.rb +18 -12
  210. data/spec/unit/provider/package/pip2_spec.rb +36 -0
  211. data/spec/unit/provider/package/pip_spec.rb +6 -11
  212. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -4
  213. data/spec/unit/provider/package/puppetserver_gem_spec.rb +137 -0
  214. data/spec/unit/provider/package/yum_spec.rb +31 -0
  215. data/spec/unit/provider/service/base_spec.rb +2 -4
  216. data/spec/unit/provider/service/bsd_spec.rb +5 -1
  217. data/spec/unit/provider/service/daemontools_spec.rb +1 -1
  218. data/spec/unit/provider/service/debian_spec.rb +3 -5
  219. data/spec/unit/provider/service/freebsd_spec.rb +1 -1
  220. data/spec/unit/provider/service/gentoo_spec.rb +4 -5
  221. data/spec/unit/provider/service/init_spec.rb +4 -5
  222. data/spec/unit/provider/service/launchd_spec.rb +5 -6
  223. data/spec/unit/provider/service/openrc_spec.rb +4 -5
  224. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  225. data/spec/unit/provider/service/redhat_spec.rb +1 -1
  226. data/spec/unit/provider/service/runit_spec.rb +2 -1
  227. data/spec/unit/provider/service/smf_spec.rb +1 -1
  228. data/spec/unit/provider/service/src_spec.rb +3 -5
  229. data/spec/unit/provider/service/systemd_spec.rb +3 -1
  230. data/spec/unit/provider/service/upstart_spec.rb +4 -5
  231. data/spec/unit/provider/user/aix_spec.rb +5 -0
  232. data/spec/unit/provider/user/hpux_spec.rb +1 -1
  233. data/spec/unit/provider/user/pw_spec.rb +2 -0
  234. data/spec/unit/provider/user/useradd_spec.rb +56 -3
  235. data/spec/unit/provider_spec.rb +8 -10
  236. data/spec/unit/puppet_pal_catalog_spec.rb +45 -0
  237. data/spec/unit/resource/capability_finder_spec.rb +6 -1
  238. data/spec/unit/resource/type_spec.rb +1 -1
  239. data/spec/unit/resource_spec.rb +11 -10
  240. data/spec/unit/rest/route_spec.rb +4 -4
  241. data/spec/unit/settings_spec.rb +576 -239
  242. data/spec/unit/ssl/base_spec.rb +0 -1
  243. data/spec/unit/ssl/host_spec.rb +0 -5
  244. data/spec/unit/ssl/ssl_provider_spec.rb +14 -8
  245. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -7
  246. data/spec/unit/transaction/event_manager_spec.rb +14 -11
  247. data/spec/unit/transaction/report_spec.rb +2 -0
  248. data/spec/unit/transaction_spec.rb +13 -4
  249. data/spec/unit/type/file/content_spec.rb +0 -1
  250. data/spec/unit/type/file/selinux_spec.rb +0 -2
  251. data/spec/unit/type/file/source_spec.rb +1 -1
  252. data/spec/unit/type/file_spec.rb +0 -6
  253. data/spec/unit/type/filebucket_spec.rb +1 -1
  254. data/spec/unit/type/group_spec.rb +13 -6
  255. data/spec/unit/type/resources_spec.rb +7 -7
  256. data/spec/unit/type/service_spec.rb +1 -1
  257. data/spec/unit/type/tidy_spec.rb +0 -1
  258. data/spec/unit/type_spec.rb +2 -2
  259. data/spec/unit/util/at_fork_spec.rb +2 -2
  260. data/spec/unit/util/autoload_spec.rb +5 -1
  261. data/spec/unit/util/backups_spec.rb +1 -2
  262. data/spec/unit/util/execution_spec.rb +15 -11
  263. data/spec/unit/util/inifile_spec.rb +6 -14
  264. data/spec/unit/util/log_spec.rb +8 -7
  265. data/spec/unit/util/logging_spec.rb +3 -3
  266. data/spec/unit/util/posix_spec.rb +363 -15
  267. data/spec/unit/util/rubygems_spec.rb +2 -2
  268. data/spec/unit/util/run_mode_spec.rb +6 -6
  269. data/spec/unit/util/selinux_spec.rb +76 -52
  270. data/spec/unit/util/storage_spec.rb +3 -1
  271. data/spec/unit/util/suidmanager_spec.rb +44 -41
  272. data/spec/unit/util_spec.rb +13 -6
  273. metadata +32 -10
  274. data/spec/integration/application/config_spec.rb +0 -74
  275. data/spec/unit/face/catalog_spec.rb +0 -6
  276. data/spec/unit/face/module_spec.rb +0 -3
@@ -234,8 +234,8 @@ describe Puppet::Application::Doc do
234
234
  end
235
235
  end
236
236
 
237
- it "should operate in master run_mode" do
238
- expect(@doc.class.run_mode.name).to eq(:master)
237
+ it "should operate in server run_mode" do
238
+ expect(@doc.class.run_mode.name).to eq(:server)
239
239
 
240
240
  @doc.setup_rdoc
241
241
  end
@@ -3,7 +3,7 @@ require 'puppet/application/facts'
3
3
 
4
4
  describe Puppet::Application::Facts do
5
5
  let(:app) { Puppet::Application[:facts] }
6
- let(:values) { {"filesystems" => "apfs,autofs,devfs"} }
6
+ let(:values) { {"filesystems" => "apfs,autofs,devfs", "macaddress" => "64:52:11:22:03:25"} }
7
7
 
8
8
  before :each do
9
9
  Puppet::Node::Facts.indirection.terminus_class = :memory
@@ -21,6 +21,7 @@ describe Puppet::Application::Facts do
21
21
  name: whatever
22
22
  values:
23
23
  filesystems: apfs,autofs,devfs
24
+ macaddress: "64:52:11:22:03:25"
24
25
  END
25
26
 
26
27
  expect {
@@ -41,6 +42,7 @@ describe Puppet::Application::Facts do
41
42
  name: #{Puppet[:certname]}
42
43
  values:
43
44
  filesystems: apfs,autofs,devfs
45
+ macaddress: "64:52:11:22:03:25"
44
46
  END
45
47
 
46
48
  expect {
@@ -42,7 +42,6 @@ describe Puppet::Application::Filebucket do
42
42
  describe "during setup" do
43
43
  before :each do
44
44
  allow(Puppet::Log).to receive(:newdestination)
45
- allow(Puppet).to receive(:settraps)
46
45
  allow(Puppet::FileBucket::Dipper).to receive(:new)
47
46
  allow(@filebucket.options).to receive(:[])
48
47
  end
@@ -157,7 +156,6 @@ describe Puppet::Application::Filebucket do
157
156
  describe "when running" do
158
157
  before :each do
159
158
  allow(Puppet::Log).to receive(:newdestination)
160
- allow(Puppet).to receive(:settraps)
161
159
  allow(Puppet::FileBucket::Dipper).to receive(:new)
162
160
  allow(@filebucket.options).to receive(:[])
163
161
 
@@ -7,8 +7,10 @@ require 'timeout'
7
7
 
8
8
  describe Puppet::Application do
9
9
  before(:each) do
10
- @app = Class.new(Puppet::Application).new
11
- @appclass = @app.class
10
+ @appclass = Class.new(Puppet::Application) do
11
+ def handle_unknown(opt, arg); end
12
+ end
13
+ @app = @appclass.new
12
14
 
13
15
  allow(@app).to receive(:name).and_return("test_app")
14
16
  end
@@ -118,6 +120,11 @@ describe Puppet::Application do
118
120
  @appclass.run_mode :agent
119
121
  expect(@appclass.run_mode.name).to eq(:agent)
120
122
  end
123
+
124
+ it "considers :server to be master" do
125
+ @appclass.run_mode :server
126
+ expect(@appclass.run_mode).to be_master
127
+ end
121
128
  end
122
129
 
123
130
  describe ".environment_mode" do
@@ -147,7 +154,7 @@ describe Puppet::Application do
147
154
  describe "when dealing with run_mode" do
148
155
 
149
156
  class TestApp < Puppet::Application
150
- run_mode :master
157
+ run_mode :server
151
158
  def run_command
152
159
  # no-op
153
160
  end
@@ -159,16 +166,16 @@ describe Puppet::Application do
159
166
  app = TestApp.new
160
167
  app.initialize_app_defaults
161
168
 
162
- expect(Puppet.run_mode).to be_master
169
+ expect(Puppet.run_mode).to be_server
163
170
  end
164
171
 
165
172
  it "should sadly and frighteningly allow run_mode to change at runtime via #run" do
166
173
  app = TestApp.new
167
174
  app.run
168
175
 
169
- expect(app.class.run_mode.name).to eq(:master)
176
+ expect(app.class.run_mode.name).to eq(:server)
170
177
 
171
- expect(Puppet.run_mode).to be_master
178
+ expect(Puppet.run_mode).to be_server
172
179
  end
173
180
  end
174
181
 
@@ -506,6 +513,40 @@ describe Puppet::Application do
506
513
 
507
514
  expect { @app.configure_indirector_routes }.to raise_error(Puppet::Error, /mapping values are not allowed/)
508
515
  end
516
+
517
+ it "should treat master routes on server application" do
518
+ allow(@app).to receive(:name).and_return("server")
519
+
520
+ Puppet[:route_file] = tmpfile('routes')
521
+ File.open(Puppet[:route_file], 'w') do |f|
522
+ f.print <<-ROUTES
523
+ master:
524
+ node:
525
+ terminus: exec
526
+ ROUTES
527
+ end
528
+
529
+ @app.configure_indirector_routes
530
+
531
+ expect(Puppet::Node.indirection.terminus_class).to eq('exec')
532
+ end
533
+
534
+ it "should treat server routes on master application" do
535
+ allow(@app).to receive(:name).and_return("master")
536
+
537
+ Puppet[:route_file] = tmpfile('routes')
538
+ File.open(Puppet[:route_file], 'w') do |f|
539
+ f.print <<-ROUTES
540
+ server:
541
+ node:
542
+ terminus: exec
543
+ ROUTES
544
+ end
545
+
546
+ @app.configure_indirector_routes
547
+
548
+ expect(Puppet::Node.indirection.terminus_class).to eq('exec')
549
+ end
509
550
  end
510
551
 
511
552
  describe "when running" do
@@ -555,13 +596,6 @@ describe Puppet::Application do
555
596
  end
556
597
 
557
598
  it "should raise an error if dispatch returns no command" do
558
- allow(@app).to receive(:get_command).and_return(nil)
559
- expect(Puppet).to receive(:send_log).with(:err, "Could not run: No valid command or main")
560
- expect { @app.run }.to exit_with 1
561
- end
562
-
563
- it "should raise an error if dispatch returns an invalid command" do
564
- allow(@app).to receive(:get_command).and_return(:this_function_doesnt_exist)
565
599
  expect(Puppet).to receive(:send_log).with(:err, "Could not run: No valid command or main")
566
600
  expect { @app.run }.to exit_with 1
567
601
  end
@@ -679,5 +713,18 @@ describe Puppet::Application do
679
713
 
680
714
  @app.handle_logdest_arg(nil)
681
715
  end
716
+
717
+ it "accepts multiple destinations as a comma sepparated list" do
718
+ dest1 = '/tmp/path1'
719
+ dest2 = 'console'
720
+ dest3 = '/tmp/path2'
721
+ dest_args = [dest1, dest2, dest3].join(' , ')
722
+
723
+ [dest1, dest2, dest3].each do |dest|
724
+ expect(Puppet::Util::Log).to receive(:newdestination).with(dest)
725
+ end
726
+
727
+ @app.handle_logdest_arg(dest_args)
728
+ end
682
729
  end
683
730
  end
@@ -104,6 +104,24 @@ describe Puppet::Configurer do
104
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
105
  end
106
106
 
107
+ it "applies a cached catalog if pluginsync fails when usecacheonfailure is true" do
108
+ Puppet[:ignore_plugin_errors] = false
109
+
110
+ Puppet[:use_cached_catalog] = false
111
+ Puppet[:usecacheonfailure] = true
112
+
113
+ body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
114
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
115
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
116
+ )
117
+ stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
118
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
119
+ )
120
+
121
+ expect(configurer.run(pluginsync: true, :report => report)).to eq(0)
122
+ expect(report.cached_catalog_status).to eq('on_failure')
123
+ end
124
+
107
125
  it "applies a cached catalog when it can't connect to the master" do
108
126
  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
109
127
 
@@ -1026,30 +1044,45 @@ describe Puppet::Configurer do
1026
1044
  options = {}
1027
1045
  configurer.run(options)
1028
1046
  expect(options[:report].master_used).to eq('myserver:123')
1047
+ expect(options[:report].server_used).to eq('myserver:123')
1029
1048
  end
1030
1049
 
1031
- it "should report when a server is unavailable" do
1050
+ it "should report when usecacheonfailure is false and server is unavailable" do
1032
1051
  Puppet.settings[:server_list] = ["myserver:123"]
1052
+ Puppet[:usecacheonfailure] = false
1033
1053
 
1034
1054
  stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: [500, "Internal Server Error"])
1035
1055
 
1036
- allow(Puppet).to receive(:debug)
1037
- expect(Puppet).to receive(:debug).with("Puppet server myserver:123 is unavailable: 500 Internal Server Error")
1038
-
1039
1056
  expect {
1040
1057
  configurer.run
1041
- }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list:/)
1058
+ }.to raise_error(Puppet::Error, /Could not select a functional puppet server from server_list:/)
1059
+
1060
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: /Puppet server myserver:123 is unavailable: 500 Internal Server Error/))
1042
1061
  end
1043
1062
 
1044
1063
  it "should error when no servers in 'server_list' are reachable" do
1045
1064
  Puppet.settings[:server_list] = "myserver:123,someotherservername"
1065
+ Puppet[:usecacheonfailure] = false
1046
1066
 
1047
1067
  stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 400)
1048
1068
  stub_request(:get, 'https://someotherservername:8140/status/v1/simple/master').to_return(status: 400)
1049
1069
 
1050
1070
  expect{
1051
1071
  configurer.run
1052
- }.to raise_error(Puppet::Error, /Could not select a functional puppet master from server_list: 'myserver:123,someotherservername'/)
1072
+ }.to raise_error(Puppet::Error, /Could not select a functional puppet server from server_list: 'myserver:123,someotherservername'/)
1073
+ end
1074
+
1075
+ it "should not error when usecacheonfailure is true and no servers in 'server_list' are reachable" do
1076
+ Puppet.settings[:server_list] = "myserver:123,someotherservername"
1077
+ Puppet[:usecacheonfailure] = true
1078
+
1079
+ stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 400)
1080
+ stub_request(:get, 'https://someotherservername:8140/status/v1/simple/master').to_return(status: 400)
1081
+
1082
+ options = {}
1083
+
1084
+ expect(configurer.run(options)).to eq(0)
1085
+ expect(options[:report].server_used).to be_nil
1053
1086
  end
1054
1087
 
1055
1088
  it "should not make multiple node requests when the server is found" do
@@ -22,7 +22,7 @@ describe Puppet::Confine::Feature do
22
22
  end
23
23
 
24
24
  it "should use the Puppet features instance to test validity" do
25
- expect(Puppet.features).to receive(:myfeature?)
25
+ Puppet.features.add(:myfeature) do true end
26
26
  @confine.valid?
27
27
  end
28
28
 
@@ -2,6 +2,12 @@ require 'spec_helper'
2
2
 
3
3
  require 'puppet/confine'
4
4
 
5
+ class Puppet::TestConfine < Puppet::Confine
6
+ def pass?(value)
7
+ false
8
+ end
9
+ end
10
+
5
11
  describe Puppet::Confine do
6
12
  it "should require a value" do
7
13
  expect { Puppet::Confine.new }.to raise_error(ArgumentError)
@@ -33,7 +39,7 @@ describe Puppet::Confine do
33
39
 
34
40
  describe "when testing all values" do
35
41
  before do
36
- @confine = Puppet::Confine.new(%w{a b c})
42
+ @confine = Puppet::TestConfine.new(%w{a b c})
37
43
  @confine.label = "foo"
38
44
  end
39
45
 
@@ -64,7 +70,7 @@ describe Puppet::Confine do
64
70
  end
65
71
 
66
72
  describe "when testing the result of the values" do
67
- before { @confine = Puppet::Confine.new(%w{a b c d}) }
73
+ before { @confine = Puppet::TestConfine.new(%w{a b c d}) }
68
74
 
69
75
  it "should return an array with the result of the test for each value" do
70
76
  allow(@confine).to receive(:pass?).and_return(true)
@@ -189,6 +189,7 @@ describe "Defaults" do
189
189
 
190
190
  it "raises an exception if facter-ng could not be loaded" do
191
191
  allow_any_instance_of(Puppet::Settings::BooleanSetting).to receive(:require).with('facter-ng').and_raise(LoadError)
192
+ allow(Facter).to receive(:value).with('facterversion').and_return('3.11.4')
192
193
 
193
194
  expect{ Puppet.settings[:facterng] = true }.to raise_exception ArgumentError, 'facter-ng could not be loaded'
194
195
  end
@@ -198,7 +199,9 @@ describe "Defaults" do
198
199
  @original_facter = Object.const_get(:Facter)
199
200
 
200
201
  Object.send(:remove_const, :Facter)
201
- Object.const_set(:Facter, Module.new)
202
+ facter = double('facter')
203
+ allow(facter).to receive(:value).with('facterversion').and_return('3.11.4')
204
+ Object.const_set(:Facter, facter)
202
205
 
203
206
  allow_any_instance_of(Puppet::Settings::BooleanSetting).to receive(:require).with('facter-ng').and_return(true)
204
207
  allow(Facter).to receive(:respond_to?).and_return(false)
@@ -215,4 +218,20 @@ describe "Defaults" do
215
218
  end
216
219
  end
217
220
  end
221
+
222
+ describe "deprecated settings" do
223
+ it 'does not issue a deprecation warning by default' do
224
+ expect(Puppet).to receive(:deprecation_warning).never
225
+
226
+ Puppet.initialize_settings
227
+ end
228
+
229
+ it 'issues a deprecation warning when func3x_check is disabled' do
230
+ Puppet[:func3x_check] = false
231
+
232
+ expect(Puppet).to receive(:deprecation_warning).with("The 'func3x_check' setting is deprecated and will be removed in a future release.")
233
+
234
+ Puppet.initialize_settings
235
+ end
236
+ end
218
237
  end
@@ -436,25 +436,6 @@ config_version=$vardir/random/scripts
436
436
  end
437
437
  end
438
438
  end
439
-
440
- context "custom cache expiration service" do
441
- it "consults the custom service to expire the cache" do
442
- loader_from(:filesystem => [directory_tree],
443
- :directory => directory_tree.children.first) do |loader|
444
- service = ReplayExpirationService.new([true])
445
- using_expiration_service(service) do
446
-
447
- cached = Puppet::Environments::Cached.new(loader)
448
- cached.get(:an_environment)
449
- cached.get(:an_environment)
450
-
451
- expect(service.created_envs).to include(:an_environment)
452
- expect(service.expired_envs).to include(:an_environment)
453
- expect(service.evicted_envs).to include(:an_environment)
454
- end
455
- end
456
- end
457
- end
458
439
  end
459
440
  end
460
441
 
@@ -645,6 +626,85 @@ config_version=$vardir/random/scripts
645
626
  end
646
627
  end
647
628
 
629
+ context "expiration policies" do
630
+ let(:service) { ReplayExpirationService.new }
631
+
632
+ it "notifies when the environment is first created" do
633
+ with_environment_loaded(service)
634
+
635
+ expect(service.created_envs).to eq([:an_environment])
636
+ end
637
+
638
+ it "does not evict an unexpired environment" do
639
+ Puppet[:environment_timeout] = 'unlimited'
640
+
641
+ with_environment_loaded(service) do |cached|
642
+ cached.get!(:an_environment)
643
+ end
644
+
645
+ expect(service.created_envs).to eq([:an_environment])
646
+ expect(service.evicted_envs).to eq([])
647
+ end
648
+
649
+ it "evicts an expired environment" do
650
+ service = ReplayExpirationService.new
651
+
652
+ expect(service).to receive(:expired?).and_return(true)
653
+
654
+ with_environment_loaded(service) do |cached|
655
+ cached.get!(:an_environment)
656
+ end
657
+
658
+ expect(service.created_envs).to eq([:an_environment, :an_environment])
659
+ expect(service.evicted_envs).to eq([:an_environment])
660
+ end
661
+
662
+ it "evicts an environment that hasn't been recently touched" do
663
+ Puppet[:environment_timeout] = 1
664
+ Puppet[:environment_timeout_mode] = :from_last_used
665
+
666
+ with_environment_loaded(service) do |cached|
667
+ future = Time.now + 60
668
+ expect(Time).to receive(:now).and_return(future).at_least(:once)
669
+
670
+ # this should cause the cached environment to be evicted and a new one created
671
+ cached.get!(:an_environment)
672
+ end
673
+
674
+ expect(service.created_envs).to eq([:an_environment, :an_environment])
675
+ expect(service.evicted_envs).to eq([:an_environment])
676
+
677
+ end
678
+
679
+ it "reuses an environment that was recently touched" do
680
+ Puppet[:environment_timeout] = 60
681
+ Puppet[:environment_timeout_mode] = :from_last_used
682
+
683
+ with_environment_loaded(service) do |cached|
684
+ # reuse the already cached environment
685
+ cached.get!(:an_environment)
686
+ end
687
+
688
+ expect(service.created_envs).to eq([:an_environment])
689
+ expect(service.evicted_envs).to eq([])
690
+ end
691
+
692
+ it "evicts a recently touched environment" do
693
+ Puppet[:environment_timeout] = 60
694
+ Puppet[:environment_timeout_mode] = :from_last_used
695
+
696
+ expect(service).to receive(:expired?).and_return(true)
697
+
698
+ with_environment_loaded(service) do |cached|
699
+ # even though the environment was recently touched, it's been expired
700
+ cached.get!(:an_environment)
701
+ end
702
+
703
+ expect(service.created_envs).to eq([:an_environment, :an_environment])
704
+ expect(service.evicted_envs).to eq([:an_environment])
705
+ end
706
+ end
707
+
648
708
  it "gets an environment.conf" do
649
709
  loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
650
710
  expect(Puppet::Environments::Cached.new(loader).get_conf(:an_environment)).to match_environment_conf(:an_environment).
@@ -652,6 +712,87 @@ config_version=$vardir/random/scripts
652
712
  with_global_module_path([])
653
713
  end
654
714
  end
715
+
716
+ context '#clear' do
717
+ let(:service) { ReplayExpirationService.new }
718
+
719
+ it "evicts an environment" do
720
+ with_environment_loaded(service) do |cached|
721
+ cached.clear(:an_environment)
722
+ end
723
+
724
+ expect(service.evicted_envs).to eq([:an_environment])
725
+ end
726
+ end
727
+
728
+ context '#clear_all' do
729
+ let(:service) { ReplayExpirationService.new }
730
+
731
+ it 'evicts all environments' do
732
+ with_environment_loaded(service) do |cached|
733
+ cached.get(:an_environment)
734
+ cached.get(:another_environment)
735
+ cached.clear_all
736
+
737
+ expect(service.evicted_envs).to match([:an_environment, :another_environment])
738
+ end
739
+ end
740
+
741
+ it 'clears cached environment settings' do
742
+ base_dir = File.expand_path("envdir")
743
+ original_envdir = FS::MemoryFile.a_directory(base_dir, [
744
+ FS::MemoryFile.a_directory("env3", [
745
+ FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
746
+ manifest=/manifest_orig
747
+ modulepath=/modules_orig
748
+ environment_timeout=60
749
+ EOF
750
+ ]),
751
+ ])
752
+
753
+ FS.overlay(original_envdir) do
754
+ dir_loader = Puppet::Environments::Directories.new(original_envdir, [])
755
+ loader = Puppet::Environments::Cached.new(dir_loader)
756
+ Puppet.override(:environments => loader) do
757
+ original_env = loader.get("env3") # force the environment.conf to be read
758
+
759
+ changed_envdir = FS::MemoryFile.a_directory(base_dir, [
760
+ FS::MemoryFile.a_directory("env3", [
761
+ FS::MemoryFile.a_regular_file_containing("environment.conf", <<-EOF)
762
+ manifest=/manifest_changed
763
+ modulepath=/modules_changed
764
+ environment_timeout=60
765
+ EOF
766
+ ]),
767
+ ])
768
+
769
+ #Clear all cached environments
770
+ loader.clear_all
771
+
772
+ FS.overlay(changed_envdir) do
773
+ changed_env = loader.get("env3")
774
+
775
+ expect(original_env).to environment(:env3).
776
+ with_manifest(File.expand_path("/manifest_orig")).
777
+ with_full_modulepath([File.expand_path("/modules_orig")])
778
+
779
+ expect(changed_env).to environment(:env3).
780
+ with_manifest(File.expand_path("/manifest_changed")).
781
+ with_full_modulepath([File.expand_path("/modules_changed")])
782
+ end
783
+ end
784
+ end
785
+ end
786
+
787
+ it 'deletes environment text domains' do
788
+ with_environment_loaded(service) do |cached|
789
+ cached.get(:an_environment)
790
+ cached.clear_all
791
+
792
+ expect(FastGettext.text_domain).to eq(Puppet::GettextConfig::DEFAULT_TEXT_DOMAIN)
793
+ end
794
+ end
795
+ end
655
796
  end
656
797
 
657
798
  RSpec::Matchers.define :environment do |name|
@@ -746,31 +887,34 @@ config_version=$vardir/random/scripts
746
887
  end
747
888
  end
748
889
 
749
- class ReplayExpirationService
750
- attr_reader :created_envs, :expired_envs, :evicted_envs
890
+ # The environment named `:an_environment` will already be loaded when the
891
+ # block is yielded to
892
+ def with_environment_loaded(service, &block)
893
+ loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
894
+ using_expiration_service(service) do
895
+ cached = Puppet::Environments::Cached.new(loader)
896
+ cached.get!(:an_environment)
751
897
 
752
- def initialize(expiration_sequence)
898
+ yield cached if block_given?
899
+ end
900
+ end
901
+ end
902
+
903
+ class ReplayExpirationService < Puppet::Environments::Cached::DefaultCacheExpirationService
904
+ attr_reader :created_envs, :evicted_envs
905
+
906
+ def initialize
753
907
  @created_envs = []
754
- @expired_envs = []
755
908
  @evicted_envs = []
756
- @expiration_sequence = expiration_sequence
757
909
  end
758
910
 
759
911
  def created(env)
760
912
  @created_envs << env.name
761
913
  end
762
914
 
763
- def expired?(env_name)
764
- # make expired? idempotent
765
- return true if @expired_envs.include? (env_name)
766
- @expired_envs << env_name
767
- @expiration_sequence.pop
768
- end
769
-
770
915
  def evicted(env_name)
771
916
  @evicted_envs << env_name
772
917
  end
773
918
  end
774
-
775
919
  end
776
920
  end