puppet 6.23.0-universal-darwin → 6.26.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 (397) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +5 -5
  3. data/Gemfile +4 -4
  4. data/Gemfile.lock +32 -25
  5. data/README.md +4 -4
  6. data/{ext → examples/enc}/regexp_nodes/classes/databases +0 -0
  7. data/{ext → examples/enc}/regexp_nodes/classes/webservers +0 -0
  8. data/{ext → examples/enc}/regexp_nodes/environment/development +0 -0
  9. data/{ext → examples/enc}/regexp_nodes/parameters/service/prod +0 -0
  10. data/{ext → examples/enc}/regexp_nodes/parameters/service/qa +0 -0
  11. data/{ext → examples/enc}/regexp_nodes/parameters/service/sandbox +0 -0
  12. data/{ext → examples/enc}/regexp_nodes/regexp_nodes.rb +0 -0
  13. data/{ext → examples}/nagios/check_puppet.rb +2 -2
  14. data/ext/README.md +13 -0
  15. data/ext/project_data.yaml +1 -0
  16. data/lib/puppet/application/agent.rb +4 -0
  17. data/lib/puppet/application/apply.rb +20 -2
  18. data/lib/puppet/application/filebucket.rb +1 -0
  19. data/lib/puppet/application/lookup.rb +78 -24
  20. data/lib/puppet/application/resource.rb +30 -15
  21. data/lib/puppet/application/ssl.rb +1 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +6 -3
  23. data/lib/puppet/configurer.rb +134 -56
  24. data/lib/puppet/confine/variable.rb +1 -1
  25. data/lib/puppet/defaults.rb +55 -32
  26. data/lib/puppet/environments.rb +75 -25
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/generate.rb +2 -0
  29. data/lib/puppet/face/help/action.erb +1 -0
  30. data/lib/puppet/face/help/face.erb +1 -0
  31. data/lib/puppet/face/node/clean.rb +11 -0
  32. data/lib/puppet/facter_impl.rb +96 -0
  33. data/lib/puppet/file_serving/configuration/parser.rb +2 -0
  34. data/lib/puppet/file_serving/configuration.rb +3 -0
  35. data/lib/puppet/file_serving/metadata.rb +3 -0
  36. data/lib/puppet/file_serving/mount/file.rb +4 -4
  37. data/lib/puppet/file_serving/mount/scripts.rb +24 -0
  38. data/lib/puppet/file_system/file_impl.rb +10 -8
  39. data/lib/puppet/file_system/jruby.rb +1 -1
  40. data/lib/puppet/file_system/windows.rb +6 -6
  41. data/lib/puppet/file_system.rb +1 -1
  42. data/lib/puppet/forge.rb +4 -4
  43. data/lib/puppet/functions/empty.rb +8 -0
  44. data/lib/puppet/functions/find_template.rb +2 -2
  45. data/lib/puppet/functions/strftime.rb +1 -0
  46. data/lib/puppet/functions/unwrap.rb +17 -2
  47. data/lib/puppet/functions/versioncmp.rb +6 -2
  48. data/lib/puppet/generate/type.rb +9 -0
  49. data/lib/puppet/http/client.rb +1 -1
  50. data/lib/puppet/http/redirector.rb +5 -0
  51. data/lib/puppet/http/service/compiler.rb +6 -1
  52. data/lib/puppet/indirector/catalog/compiler.rb +24 -6
  53. data/lib/puppet/indirector/catalog/rest.rb +1 -0
  54. data/lib/puppet/indirector/facts/facter.rb +6 -6
  55. data/lib/puppet/indirector/indirection.rb +1 -1
  56. data/lib/puppet/indirector/resource/ral.rb +6 -1
  57. data/lib/puppet/indirector/terminus.rb +4 -0
  58. data/lib/puppet/interface/documentation.rb +1 -0
  59. data/lib/puppet/module/plan.rb +0 -1
  60. data/lib/puppet/module/task.rb +1 -1
  61. data/lib/puppet/module.rb +1 -0
  62. data/lib/puppet/module_tool/applications/installer.rb +12 -4
  63. data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
  64. data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
  65. data/lib/puppet/module_tool/errors/shared.rb +17 -0
  66. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  67. data/lib/puppet/node/environment.rb +10 -11
  68. data/lib/puppet/node.rb +1 -1
  69. data/lib/puppet/pal/pal_impl.rb +1 -1
  70. data/lib/puppet/parser/resource.rb +1 -1
  71. data/lib/puppet/parser/scope.rb +1 -0
  72. data/lib/puppet/parser/templatewrapper.rb +1 -0
  73. data/lib/puppet/pops/evaluator/closure.rb +7 -5
  74. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
  75. data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
  76. data/lib/puppet/pops/model/ast.rb +1 -0
  77. data/lib/puppet/pops/model/factory.rb +2 -1
  78. data/lib/puppet/pops/parser/code_merger.rb +4 -4
  79. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  80. data/lib/puppet/pops/parser/eparser.rb +1014 -995
  81. data/lib/puppet/pops/parser/lexer2.rb +92 -91
  82. data/lib/puppet/pops/parser/slurp_support.rb +1 -0
  83. data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
  84. data/lib/puppet/pops/types/type_formatter.rb +4 -3
  85. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  86. data/lib/puppet/pops/types/types.rb +1 -1
  87. data/lib/puppet/provider/aix_object.rb +1 -1
  88. data/lib/puppet/provider/exec/posix.rb +16 -4
  89. data/lib/puppet/provider/group/groupadd.rb +5 -2
  90. data/lib/puppet/provider/package/pip.rb +15 -3
  91. data/lib/puppet/provider/package/pkg.rb +19 -2
  92. data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
  93. data/lib/puppet/provider/package/yum.rb +1 -1
  94. data/lib/puppet/provider/parsedfile.rb +3 -0
  95. data/lib/puppet/provider/service/base.rb +1 -1
  96. data/lib/puppet/provider/service/init.rb +10 -9
  97. data/lib/puppet/provider/service/launchd.rb +2 -2
  98. data/lib/puppet/provider/service/redhat.rb +1 -1
  99. data/lib/puppet/provider/service/smf.rb +3 -3
  100. data/lib/puppet/provider/service/systemd.rb +2 -2
  101. data/lib/puppet/provider/service/upstart.rb +5 -5
  102. data/lib/puppet/provider/user/aix.rb +44 -1
  103. data/lib/puppet/provider/user/directoryservice.rb +1 -1
  104. data/lib/puppet/provider/user/useradd.rb +72 -16
  105. data/lib/puppet/provider.rb +1 -1
  106. data/lib/puppet/reference/providers.rb +2 -2
  107. data/lib/puppet/resource/catalog.rb +1 -1
  108. data/lib/puppet/resource/type_collection.rb +1 -0
  109. data/lib/puppet/resource.rb +38 -5
  110. data/lib/puppet/runtime.rb +11 -1
  111. data/lib/puppet/settings.rb +32 -9
  112. data/lib/puppet/ssl/verifier.rb +6 -0
  113. data/lib/puppet/test/test_helper.rb +4 -1
  114. data/lib/puppet/transaction/persistence.rb +21 -1
  115. data/lib/puppet/transaction/report.rb +15 -1
  116. data/lib/puppet/type/exec.rb +35 -5
  117. data/lib/puppet/type/file/data_sync.rb +1 -1
  118. data/lib/puppet/type/file/mode.rb +6 -0
  119. data/lib/puppet/type/file.rb +6 -6
  120. data/lib/puppet/type/filebucket.rb +3 -3
  121. data/lib/puppet/type/group.rb +0 -1
  122. data/lib/puppet/type/resources.rb +1 -1
  123. data/lib/puppet/type/service.rb +8 -3
  124. data/lib/puppet/type/tidy.rb +1 -1
  125. data/lib/puppet/type/user.rb +40 -39
  126. data/lib/puppet/type.rb +1 -1
  127. data/lib/puppet/util/command_line.rb +1 -1
  128. data/lib/puppet/util/filetype.rb +2 -2
  129. data/lib/puppet/util/json.rb +20 -0
  130. data/lib/puppet/util/log.rb +8 -4
  131. data/lib/puppet/util/logging.rb +1 -25
  132. data/lib/puppet/util/monkey_patches.rb +6 -0
  133. data/lib/puppet/util/package.rb +25 -16
  134. data/lib/puppet/util/pidlock.rb +1 -1
  135. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  136. data/lib/puppet/util/suidmanager.rb +1 -2
  137. data/lib/puppet/util/symbolic_file_mode.rb +29 -17
  138. data/lib/puppet/util/tagging.rb +1 -0
  139. data/lib/puppet/util/windows/service.rb +0 -5
  140. data/lib/puppet/util/windows/sid.rb +3 -1
  141. data/lib/puppet/util/windows/user.rb +0 -2
  142. data/lib/puppet/util/windows.rb +3 -0
  143. data/lib/puppet/util/yaml.rb +21 -2
  144. data/lib/puppet/util.rb +4 -3
  145. data/lib/puppet/version.rb +1 -1
  146. data/lib/puppet.rb +6 -9
  147. data/locales/puppet.pot +5 -10418
  148. data/man/man5/puppet.conf.5 +52 -25
  149. data/man/man8/puppet-agent.8 +4 -1
  150. data/man/man8/puppet-apply.8 +1 -1
  151. data/man/man8/puppet-catalog.8 +9 -9
  152. data/man/man8/puppet-config.8 +1 -1
  153. data/man/man8/puppet-describe.8 +1 -1
  154. data/man/man8/puppet-device.8 +1 -1
  155. data/man/man8/puppet-doc.8 +1 -1
  156. data/man/man8/puppet-epp.8 +1 -1
  157. data/man/man8/puppet-facts.8 +8 -8
  158. data/man/man8/puppet-filebucket.8 +1 -1
  159. data/man/man8/puppet-generate.8 +1 -1
  160. data/man/man8/puppet-help.8 +1 -1
  161. data/man/man8/puppet-key.8 +7 -7
  162. data/man/man8/puppet-lookup.8 +9 -6
  163. data/man/man8/puppet-man.8 +1 -1
  164. data/man/man8/puppet-module.8 +3 -3
  165. data/man/man8/puppet-node.8 +5 -5
  166. data/man/man8/puppet-parser.8 +1 -1
  167. data/man/man8/puppet-plugin.8 +1 -1
  168. data/man/man8/puppet-report.8 +5 -5
  169. data/man/man8/puppet-resource.8 +1 -1
  170. data/man/man8/puppet-script.8 +1 -1
  171. data/man/man8/puppet-ssl.8 +1 -1
  172. data/man/man8/puppet-status.8 +4 -4
  173. data/man/man8/puppet.8 +2 -2
  174. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
  175. data/spec/fixtures/integration/application/agent/lib/facter/agent_spec_role.rb +3 -0
  176. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Gemfile +4 -0
  177. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Rakefile +3 -0
  178. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/lib/puppet/functions/l10n.rb +8 -0
  179. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/config.yaml +25 -0
  180. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/ja/puppet-l10n.po +19 -0
  181. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/puppet-l10n.pot +20 -0
  182. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/metadata.json +8 -0
  183. data/spec/fixtures/ssl/127.0.0.1-key.pem +106 -106
  184. data/spec/fixtures/ssl/127.0.0.1.pem +48 -48
  185. data/spec/fixtures/ssl/bad-basic-constraints.pem +54 -54
  186. data/spec/fixtures/ssl/bad-int-basic-constraints.pem +51 -51
  187. data/spec/fixtures/ssl/ca.pem +52 -52
  188. data/spec/fixtures/ssl/crl.pem +25 -25
  189. data/spec/fixtures/ssl/ec-key.pem +11 -11
  190. data/spec/fixtures/ssl/ec.pem +32 -32
  191. data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
  192. data/spec/fixtures/ssl/encrypted-key.pem +107 -107
  193. data/spec/fixtures/ssl/intermediate-agent-crl.pem +25 -25
  194. data/spec/fixtures/ssl/intermediate-agent.pem +54 -54
  195. data/spec/fixtures/ssl/intermediate-crl.pem +28 -28
  196. data/spec/fixtures/ssl/intermediate.pem +51 -51
  197. data/spec/fixtures/ssl/oid-key.pem +117 -0
  198. data/spec/fixtures/ssl/oid.pem +69 -0
  199. data/spec/fixtures/ssl/pluto-key.pem +106 -106
  200. data/spec/fixtures/ssl/pluto.pem +50 -50
  201. data/spec/fixtures/ssl/request-key.pem +106 -106
  202. data/spec/fixtures/ssl/request.pem +45 -45
  203. data/spec/fixtures/ssl/revoked-key.pem +106 -106
  204. data/spec/fixtures/ssl/revoked.pem +49 -49
  205. data/spec/fixtures/ssl/signed-key.pem +106 -106
  206. data/spec/fixtures/ssl/signed.pem +47 -47
  207. data/spec/fixtures/ssl/tampered-cert.pem +49 -49
  208. data/spec/fixtures/ssl/tampered-csr.pem +45 -45
  209. data/spec/fixtures/ssl/trusted_oid_mapping.yaml +5 -0
  210. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +106 -106
  211. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -48
  212. data/spec/fixtures/ssl/unknown-ca-key.pem +106 -106
  213. data/spec/fixtures/ssl/unknown-ca.pem +52 -52
  214. data/spec/fixtures/unit/forge/bacula.json +1 -1
  215. data/spec/integration/application/agent_spec.rb +141 -37
  216. data/spec/integration/application/filebucket_spec.rb +16 -0
  217. data/spec/integration/application/lookup_spec.rb +32 -6
  218. data/spec/integration/application/module_spec.rb +21 -0
  219. data/spec/integration/application/resource_spec.rb +35 -1
  220. data/spec/integration/application/ssl_spec.rb +20 -0
  221. data/spec/integration/configurer_spec.rb +18 -2
  222. data/spec/integration/environments/settings_interpolation_spec.rb +0 -4
  223. data/spec/integration/indirector/facts/facter_spec.rb +93 -39
  224. data/spec/integration/l10n/compiler_spec.rb +37 -0
  225. data/spec/integration/parser/pcore_resource_spec.rb +10 -0
  226. data/spec/integration/transaction/report_spec.rb +1 -1
  227. data/spec/integration/type/exec_spec.rb +70 -45
  228. data/spec/integration/type/file_spec.rb +2 -2
  229. data/spec/integration/type/package_spec.rb +6 -6
  230. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  231. data/spec/integration/util/windows/process_spec.rb +1 -9
  232. data/spec/lib/puppet/test_ca.rb +5 -0
  233. data/spec/lib/puppet_spec/modules.rb +13 -2
  234. data/spec/lib/puppet_spec/puppetserver.rb +15 -0
  235. data/spec/lib/puppet_spec/settings.rb +1 -0
  236. data/spec/shared_behaviours/documentation_on_faces.rb +0 -2
  237. data/spec/shared_contexts/l10n.rb +32 -0
  238. data/spec/spec_helper.rb +1 -10
  239. data/spec/unit/application/apply_spec.rb +76 -56
  240. data/spec/unit/application/lookup_spec.rb +131 -10
  241. data/spec/unit/application/resource_spec.rb +29 -0
  242. data/spec/unit/concurrent/thread_local_singleton_spec.rb +39 -0
  243. data/spec/unit/configurer_spec.rb +265 -57
  244. data/spec/unit/defaults_spec.rb +1 -0
  245. data/spec/unit/environments_spec.rb +184 -0
  246. data/spec/unit/face/generate_spec.rb +64 -0
  247. data/spec/unit/facter_impl_spec.rb +31 -0
  248. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  249. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -0
  250. data/spec/unit/file_serving/configuration_spec.rb +14 -4
  251. data/spec/unit/file_serving/mount/scripts_spec.rb +69 -0
  252. data/spec/unit/file_system_spec.rb +47 -4
  253. data/spec/unit/forge/module_release_spec.rb +3 -3
  254. data/spec/unit/functions/assert_type_spec.rb +1 -1
  255. data/spec/unit/functions/empty_spec.rb +10 -0
  256. data/spec/unit/functions/logging_spec.rb +1 -0
  257. data/spec/unit/functions/lookup_spec.rb +64 -0
  258. data/spec/unit/functions/unwrap_spec.rb +8 -0
  259. data/spec/unit/functions/versioncmp_spec.rb +40 -4
  260. data/spec/unit/functions4_spec.rb +2 -2
  261. data/spec/unit/http/client_spec.rb +58 -1
  262. data/spec/unit/http/service/compiler_spec.rb +8 -0
  263. data/spec/unit/indirector/catalog/compiler_spec.rb +87 -0
  264. data/spec/unit/indirector/catalog/rest_spec.rb +8 -0
  265. data/spec/unit/indirector/indirection_spec.rb +10 -3
  266. data/spec/unit/indirector/resource/ral_spec.rb +40 -75
  267. data/spec/unit/interface/action_spec.rb +0 -9
  268. data/spec/unit/module_spec.rb +15 -1
  269. data/spec/unit/module_tool/applications/installer_spec.rb +51 -12
  270. data/spec/unit/network/authstore_spec.rb +0 -15
  271. data/spec/unit/network/formats_spec.rb +6 -0
  272. data/spec/unit/node_spec.rb +6 -0
  273. data/spec/unit/parser/templatewrapper_spec.rb +12 -2
  274. data/spec/unit/pops/parser/parse_containers_spec.rb +2 -13
  275. data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
  276. data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
  277. data/spec/unit/pops/validator/validator_spec.rb +5 -0
  278. data/spec/unit/provider/package/gem_spec.rb +1 -1
  279. data/spec/unit/provider/package/pip2_spec.rb +1 -1
  280. data/spec/unit/provider/package/pip3_spec.rb +1 -1
  281. data/spec/unit/provider/package/pip_spec.rb +38 -1
  282. data/spec/unit/provider/package/pkg_spec.rb +29 -4
  283. data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
  284. data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
  285. data/spec/unit/provider/parsedfile_spec.rb +10 -0
  286. data/spec/unit/provider/service/gentoo_spec.rb +6 -5
  287. data/spec/unit/provider/service/init_spec.rb +15 -9
  288. data/spec/unit/provider/service/launchd_spec.rb +11 -0
  289. data/spec/unit/provider/service/openwrt_spec.rb +21 -29
  290. data/spec/unit/provider/service/redhat_spec.rb +3 -2
  291. data/spec/unit/provider/service/systemd_spec.rb +1 -1
  292. data/spec/unit/provider/user/aix_spec.rb +100 -0
  293. data/spec/unit/provider/user/directoryservice_spec.rb +1 -1
  294. data/spec/unit/provider/user/useradd_spec.rb +43 -2
  295. data/spec/unit/provider_spec.rb +4 -4
  296. data/spec/unit/puppet_spec.rb +12 -4
  297. data/spec/unit/resource/catalog_spec.rb +14 -1
  298. data/spec/unit/resource_spec.rb +58 -2
  299. data/spec/unit/settings_spec.rb +97 -56
  300. data/spec/unit/ssl/certificate_request_spec.rb +8 -14
  301. data/spec/unit/transaction/persistence_spec.rb +51 -0
  302. data/spec/unit/type/exec_spec.rb +76 -29
  303. data/spec/unit/type/file/source_spec.rb +4 -4
  304. data/spec/unit/type/service_spec.rb +27 -0
  305. data/spec/unit/type/tidy_spec.rb +7 -0
  306. data/spec/unit/type/user_spec.rb +0 -45
  307. data/spec/unit/type_spec.rb +2 -2
  308. data/spec/unit/util/json_spec.rb +126 -0
  309. data/spec/unit/util/logging_spec.rb +2 -0
  310. data/spec/unit/util/windows/sid_spec.rb +39 -4
  311. data/spec/unit/util/yaml_spec.rb +54 -29
  312. data/tasks/generate_cert_fixtures.rake +10 -1
  313. data/tasks/parallel.rake +3 -3
  314. metadata +52 -96
  315. data/ext/README.environment +0 -8
  316. data/ext/dbfix.sql +0 -132
  317. data/ext/debian/README.Debian +0 -8
  318. data/ext/debian/README.source +0 -2
  319. data/ext/debian/TODO.Debian +0 -1
  320. data/ext/debian/changelog.erb +0 -1122
  321. data/ext/debian/compat +0 -1
  322. data/ext/debian/control +0 -144
  323. data/ext/debian/copyright +0 -339
  324. data/ext/debian/docs +0 -1
  325. data/ext/debian/fileserver.conf +0 -41
  326. data/ext/debian/puppet-common.dirs +0 -13
  327. data/ext/debian/puppet-common.install +0 -3
  328. data/ext/debian/puppet-common.lintian-overrides +0 -5
  329. data/ext/debian/puppet-common.manpages +0 -28
  330. data/ext/debian/puppet-common.postinst +0 -35
  331. data/ext/debian/puppet-common.postrm +0 -33
  332. data/ext/debian/puppet-el.dirs +0 -1
  333. data/ext/debian/puppet-el.emacsen-install +0 -25
  334. data/ext/debian/puppet-el.emacsen-remove +0 -11
  335. data/ext/debian/puppet-el.emacsen-startup +0 -9
  336. data/ext/debian/puppet-el.install +0 -1
  337. data/ext/debian/puppet-testsuite.install +0 -2
  338. data/ext/debian/puppet-testsuite.lintian-overrides +0 -4
  339. data/ext/debian/puppet.lintian-overrides +0 -3
  340. data/ext/debian/puppet.logrotate +0 -20
  341. data/ext/debian/puppet.postinst +0 -20
  342. data/ext/debian/puppet.postrm +0 -20
  343. data/ext/debian/puppet.preinst +0 -20
  344. data/ext/debian/puppetmaster-common.install +0 -2
  345. data/ext/debian/puppetmaster-common.manpages +0 -2
  346. data/ext/debian/puppetmaster-common.postinst +0 -6
  347. data/ext/debian/puppetmaster-passenger.dirs +0 -4
  348. data/ext/debian/puppetmaster-passenger.postinst +0 -162
  349. data/ext/debian/puppetmaster-passenger.postrm +0 -61
  350. data/ext/debian/puppetmaster.README.debian +0 -17
  351. data/ext/debian/puppetmaster.default +0 -14
  352. data/ext/debian/puppetmaster.init +0 -137
  353. data/ext/debian/puppetmaster.lintian-overrides +0 -3
  354. data/ext/debian/puppetmaster.postinst +0 -20
  355. data/ext/debian/puppetmaster.postrm +0 -5
  356. data/ext/debian/puppetmaster.preinst +0 -22
  357. data/ext/debian/rules +0 -132
  358. data/ext/debian/source/format +0 -1
  359. data/ext/debian/source/options +0 -1
  360. data/ext/debian/vim-puppet.README.Debian +0 -13
  361. data/ext/debian/vim-puppet.dirs +0 -5
  362. data/ext/debian/vim-puppet.yaml +0 -7
  363. data/ext/debian/watch +0 -2
  364. data/ext/freebsd/puppetd +0 -26
  365. data/ext/freebsd/puppetmasterd +0 -26
  366. data/ext/gentoo/conf.d/puppet +0 -5
  367. data/ext/gentoo/conf.d/puppetmaster +0 -12
  368. data/ext/gentoo/init.d/puppet +0 -38
  369. data/ext/gentoo/init.d/puppetmaster +0 -51
  370. data/ext/gentoo/puppet/fileserver.conf +0 -41
  371. data/ext/ips/puppet-agent +0 -44
  372. data/ext/ips/puppet-master +0 -44
  373. data/ext/ips/puppet.p5m.erb +0 -12
  374. data/ext/ips/puppetagent.xml +0 -42
  375. data/ext/ips/puppetmaster.xml +0 -42
  376. data/ext/ips/rules +0 -19
  377. data/ext/ips/transforms +0 -34
  378. data/ext/ldap/puppet.schema +0 -24
  379. data/ext/logcheck/puppet +0 -23
  380. data/ext/osx/file_mapping.yaml +0 -33
  381. data/ext/osx/postflight.erb +0 -109
  382. data/ext/osx/preflight.erb +0 -52
  383. data/ext/osx/prototype.plist.erb +0 -38
  384. data/ext/redhat/fileserver.conf +0 -41
  385. data/ext/redhat/logrotate +0 -21
  386. data/ext/redhat/puppet.spec.erb +0 -842
  387. data/ext/redhat/server.init +0 -128
  388. data/ext/redhat/server.sysconfig +0 -13
  389. data/ext/solaris/pkginfo +0 -6
  390. data/ext/solaris/smf/puppetd.xml +0 -77
  391. data/ext/solaris/smf/puppetmasterd.xml +0 -77
  392. data/ext/solaris/smf/svc-puppetd +0 -71
  393. data/ext/solaris/smf/svc-puppetmasterd +0 -67
  394. data/ext/suse/puppet.spec +0 -310
  395. data/ext/suse/server.init +0 -173
  396. data/ext/yaml_nodes.rb +0 -105
  397. data/spec/unit/indirector/store_configs_spec.rb +0 -7
@@ -2,11 +2,27 @@ require 'spec_helper'
2
2
  require 'puppet/configurer'
3
3
 
4
4
  describe Puppet::Configurer do
5
+ include PuppetSpec::Files
6
+
5
7
  before do
6
8
  Puppet[:server] = "puppetmaster"
7
9
  Puppet[:report] = true
8
10
 
9
11
  catalog.add_resource(resource)
12
+ allow_any_instance_of(described_class).to(
13
+ receive(:valid_server_environment?).and_return(true)
14
+ )
15
+
16
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
17
+ ---
18
+ version:
19
+ config: 1624882680
20
+ puppet: #{Puppet.version}
21
+ application:
22
+ initial_environment: #{Puppet[:environment]}
23
+ converged_environment: #{Puppet[:environment]}
24
+ run_mode: agent
25
+ SUMMARY
10
26
  end
11
27
 
12
28
  let(:node_name) { Puppet[:node_name_value] }
@@ -78,10 +94,10 @@ describe Puppet::Configurer do
78
94
  configurer.run(:pluginsync => false)
79
95
  end
80
96
 
81
- it "should carry on when it can't fetch its node definition" do
82
- error = Net::HTTPError.new(400, 'dummy server communication error')
83
- expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
84
- expect(configurer.run).to eq(0)
97
+ it "does not download plugins when specified environment is not vaild on server" do
98
+ expect(configurer).to receive(:valid_server_environment?).and_return(false)
99
+ expect(configurer).not_to receive(:download_plugins)
100
+ configurer.run(:pluginsync => true)
85
101
  end
86
102
 
87
103
  it "fails the run if pluginsync fails when usecacheonfailure is false" do
@@ -125,7 +141,6 @@ describe Puppet::Configurer do
125
141
  it "applies a cached catalog when it can't connect to the master" do
126
142
  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
127
143
 
128
- expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
129
144
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_cache => true)).and_raise(error)
130
145
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_terminus => true)).and_return(catalog)
131
146
 
@@ -461,7 +476,7 @@ describe Puppet::Configurer do
461
476
  it "should save the report if reporting is enabled" do
462
477
  Puppet.settings[:report] = true
463
478
 
464
- expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash))
479
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash)).twice
465
480
  configurer.send_report(report)
466
481
  end
467
482
 
@@ -489,12 +504,22 @@ describe Puppet::Configurer do
489
504
  it "should log but not fail if saving the report fails" do
490
505
  Puppet.settings[:report] = true
491
506
 
492
- expect(Puppet::Transaction::Report.indirection).to receive(:save).and_raise("whatever")
507
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
508
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true))
493
509
 
494
510
  configurer.send_report(report)
495
511
 
496
512
  expect(@logs).to include(an_object_having_attributes(level: :err, message: 'Could not send report: whatever'))
497
513
  end
514
+
515
+ it "should save the cached report if fails to send the report" do
516
+ allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true)).and_call_original
517
+ allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
518
+
519
+ expect(File).to_not be_exist(Puppet[:lastrunfile])
520
+ configurer.send_report(report)
521
+ expect(File.read(Puppet[:lastrunfile])).to match(/puppet: #{Puppet::PUPPETVERSION}/)
522
+ end
498
523
  end
499
524
 
500
525
  describe "when saving the summary report file" do
@@ -553,24 +578,6 @@ describe Puppet::Configurer do
553
578
  end
554
579
  end
555
580
 
556
- describe "when requesting a node" do
557
- it "uses the transaction uuid in the request" do
558
- expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(transaction_uuid: anything)).twice
559
- configurer.run
560
- end
561
-
562
- it "sends an explicitly configured environment request" do
563
- expect(Puppet.settings).to receive(:set_by_config?).with(:environment).and_return(true)
564
- expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: Puppet[:environment])).twice
565
- configurer.run
566
- end
567
-
568
- it "does not send a configured_environment when using the default" do
569
- expect(Puppet::Node.indirection).to receive(:find).with(anything, hash_including(configured_environment: nil)).twice
570
- configurer.run
571
- end
572
- end
573
-
574
581
  def expects_pluginsync
575
582
  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}]"
576
583
  stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
@@ -581,7 +588,7 @@ describe Puppet::Configurer do
581
588
  end
582
589
 
583
590
  def expects_new_catalog_only(catalog)
584
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
591
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, check_environment: true)).and_return(catalog)
585
592
  expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
586
593
  end
587
594
 
@@ -598,7 +605,7 @@ describe Puppet::Configurer do
598
605
  def expects_fallback_to_new_catalog(catalog)
599
606
  expects_pluginsync
600
607
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
601
- expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
608
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, check_environment: true)).and_return(catalog)
602
609
  end
603
610
 
604
611
  def expects_neither_new_or_cached_catalog
@@ -622,21 +629,13 @@ describe Puppet::Configurer do
622
629
  configurer.run
623
630
  end
624
631
 
625
- it "should not make a node request or pluginsync when a cached catalog is successfully retrieved" do
626
- expect(Puppet::Node.indirection).not_to receive(:find)
632
+ it "should not pluginsync when a cached catalog is successfully retrieved" do
627
633
  expects_cached_catalog_only(catalog)
628
634
  expect(configurer).not_to receive(:download_plugins)
629
635
 
630
636
  configurer.run
631
637
  end
632
638
 
633
- it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
634
- expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
635
- expects_fallback_to_new_catalog(catalog)
636
-
637
- configurer.run
638
- end
639
-
640
639
  it "should set its cached_catalog_status to 'explicitly_requested'" do
641
640
  expects_cached_catalog_only(catalog)
642
641
 
@@ -668,7 +667,6 @@ describe Puppet::Configurer do
668
667
  end
669
668
 
670
669
  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
671
- expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
672
670
  expects_neither_new_or_cached_catalog
673
671
  expects_pluginsync
674
672
 
@@ -724,16 +722,6 @@ describe Puppet::Configurer do
724
722
  Puppet.settings[:strict_environment_mode] = true
725
723
  end
726
724
 
727
- it "should not make a node request" do
728
- stub_request(:get, %r{/puppet/v3/file_metadatas?/plugins}).to_return(:status => 404)
729
- stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
730
- expects_new_catalog_only(catalog)
731
-
732
- expect(Puppet::Node.indirection).not_to receive(:find)
733
-
734
- configurer.run
735
- end
736
-
737
725
  it "should return nil when the catalog's environment doesn't match the agent specified environment" do
738
726
  Puppet[:environment] = 'second_env'
739
727
  configurer = Puppet::Configurer.new
@@ -767,7 +755,7 @@ describe Puppet::Configurer do
767
755
  expect(configurer.run).to be_nil
768
756
  end
769
757
 
770
- it "should proceed with the cached catalog if its environment matchs the local environment" do
758
+ it "should proceed with the cached catalog if its environment matches the local environment" do
771
759
  expects_cached_catalog_only(catalog)
772
760
 
773
761
  expect(configurer.run).to eq(0)
@@ -947,9 +935,23 @@ describe Puppet::Configurer do
947
935
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, banana)
948
936
 
949
937
  allow(Puppet).to receive(:notice)
938
+ allow(Puppet).to receive(:push_context)
950
939
  expect(Puppet).to receive(:notice).with("Local environment: 'production' doesn't match server specified environment 'apple', restarting agent run with environment 'apple'")
951
940
  expect(Puppet).to receive(:notice).with("Local environment: 'apple' doesn't match server specified environment 'banana', restarting agent run with environment 'banana'")
952
941
 
942
+ expect(Puppet).to receive(:push_context).with(
943
+ hash_including(current_environment: an_object_having_attributes(name: :production)),
944
+ 'Local node environment production for configurer transaction'
945
+ )
946
+ expect(Puppet).to receive(:push_context).with(
947
+ hash_including(current_environment: an_object_having_attributes(name: :apple)),
948
+ 'Local node environment apple for configurer transaction'
949
+ )
950
+ expect(Puppet).to receive(:push_context).with(
951
+ hash_including(current_environment: an_object_having_attributes(name: :banana)),
952
+ 'Local node environment banana for configurer transaction'
953
+ )
954
+
953
955
  configurer.run
954
956
  end
955
957
 
@@ -1107,20 +1109,226 @@ describe Puppet::Configurer do
1107
1109
  expect(configurer.run(options)).to eq(0)
1108
1110
  expect(options[:report].server_used).to be_nil
1109
1111
  end
1112
+ end
1110
1113
 
1111
- it "should not make multiple node requests when the server is found" do
1112
- Puppet.settings[:server_list] = ["myserver:123"]
1114
+ describe "when selecting an environment" do
1115
+ include PuppetSpec::Settings
1113
1116
 
1114
- Puppet::Node.indirection.terminus_class = :rest
1115
- Puppet::Resource::Catalog.indirection.terminus_class = :rest
1117
+ describe "when the last used environment is available" do
1118
+ let(:last_server_specified_environment) { 'development' }
1116
1119
 
1117
- stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 200)
1118
- stub_request(:post, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
1119
- node_request = stub_request(:get, %r{https://myserver:123/puppet/v3/node/}).to_return(status: 200)
1120
+ before do
1121
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1122
+ ---
1123
+ version:
1124
+ config: 1624882680
1125
+ puppet: 6.24.0
1126
+ application:
1127
+ initial_environment: #{Puppet[:environment]}
1128
+ converged_environment: #{last_server_specified_environment}
1129
+ run_mode: agent
1130
+ SUMMARY
1131
+ end
1120
1132
 
1121
- configurer.run
1133
+ describe "when the use_last_environment is set to true" do
1134
+ before do
1135
+ expect(Puppet::Node.indirection).not_to receive(:find)
1136
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1137
+ end
1138
+
1139
+ it "prefers the environment set via cli" do
1140
+ Puppet.settings.handlearg('--environment', 'usethis')
1141
+ configurer.run
1142
+
1143
+ expect(configurer.environment).to eq('usethis')
1144
+ end
1145
+
1146
+ it "prefers the environment set via lastrunfile over config" do
1147
+ FileUtils.mkdir_p(Puppet[:confdir])
1148
+ set_puppet_conf(Puppet[:confdir], <<~CONF)
1149
+ [main]
1150
+ environment = usethis
1151
+ lastrunfile = #{Puppet[:lastrunfile]}
1152
+ CONF
1153
+
1154
+ Puppet.initialize_settings
1155
+ configurer.run
1156
+
1157
+ expect(configurer.environment).to eq(last_server_specified_environment)
1158
+ end
1159
+
1160
+ it "uses the environment from Puppet[:environment] if given a catalog" do
1161
+ configurer.run(catalog: catalog)
1162
+
1163
+ expect(configurer.environment).to eq(Puppet[:environment])
1164
+ end
1165
+
1166
+ it "uses the environment from Puppet[:environment] if use_cached_catalog = true" do
1167
+ Puppet[:use_cached_catalog] = true
1168
+ expects_cached_catalog_only(catalog)
1169
+ configurer.run
1170
+
1171
+ expect(configurer.environment).to eq(Puppet[:environment])
1172
+ end
1173
+
1174
+ describe "when the environment is not set via CLI" do
1175
+ it "uses the environment found in lastrunfile if the key exists" do
1176
+ configurer.run
1177
+
1178
+ expect(configurer.environment).to eq(last_server_specified_environment)
1179
+ end
1180
+
1181
+ it "pushes the converged environment found in lastrunfile over the existing context" do
1182
+ initial_env = Puppet::Node::Environment.remote('production')
1183
+ Puppet.push_context(
1184
+ current_environment: initial_env,
1185
+ loaders: Puppet::Pops::Loaders.new(initial_env, true))
1186
+
1187
+ expect(Puppet).to receive(:push_context).with(
1188
+ hash_including(:current_environment, :loaders),
1189
+ "Local node environment #{last_server_specified_environment} for configurer transaction"
1190
+ ).once.and_call_original
1191
+
1192
+ configurer.run
1193
+ end
1194
+
1195
+ it "uses the environment from Puppet[:environment] if strict_environment_mode is set" do
1196
+ Puppet[:strict_environment_mode] = true
1197
+ configurer.run
1198
+
1199
+ expect(configurer.environment).to eq(Puppet[:environment])
1200
+ end
1201
+
1202
+ it "uses the environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
1203
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1204
+ ---
1205
+ version:
1206
+ config: 1624882680
1207
+ puppet: 6.24.0
1208
+ application:
1209
+ initial_environment: development
1210
+ converged_environment: development
1211
+ run_mode: agent
1212
+ SUMMARY
1213
+ configurer.run
1214
+
1215
+ expect(configurer.environment).to eq(Puppet[:environment])
1216
+ end
1217
+ end
1218
+ end
1219
+
1220
+ describe "when the use_last_environment setting is set to false" do
1221
+ let(:node_environment) { Puppet::Node::Environment.remote(:salam) }
1222
+ let(:node) { Puppet::Node.new(Puppet[:node_name_value]) }
1223
+
1224
+ before do
1225
+ Puppet[:use_last_environment] = false
1226
+ node.environment = node_environment
1227
+
1228
+ allow(Puppet::Node.indirection).to receive(:find)
1229
+ allow(Puppet::Node.indirection).to receive(:find)
1230
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1231
+ .and_return(node)
1232
+ end
1233
+
1234
+ it "does a node request" do
1235
+ expect(Puppet::Node.indirection).to receive(:find)
1236
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1237
+
1238
+ configurer.run
1239
+ end
1240
+
1241
+ it "uses the node environment from the node request" do
1242
+ configurer.run
1243
+
1244
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1245
+ end
1246
+ end
1247
+ end
1248
+
1249
+ describe "when the last used environment is not available" do
1250
+ describe "when the node request succeeds" do
1251
+ let(:node_environment) { Puppet::Node::Environment.remote(:salam) }
1252
+ let(:node) { Puppet::Node.new(Puppet[:node_name_value]) }
1253
+ let(:last_server_specified_environment) { 'development' }
1122
1254
 
1123
- expect(node_request).to have_been_requested.once
1255
+ before do
1256
+ node.environment = node_environment
1257
+
1258
+ allow(Puppet::Node.indirection).to receive(:find)
1259
+ allow(Puppet::Node.indirection).to receive(:find)
1260
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1261
+ .and_return(node)
1262
+ end
1263
+
1264
+ it "uses the environment from the node request if the run mode doesn't match" do
1265
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1266
+ ---
1267
+ version:
1268
+ config: 1624882680
1269
+ puppet: 6.24.0
1270
+ application:
1271
+ initial_environment: #{Puppet[:environment]}
1272
+ converged_environment: #{last_server_specified_environment}
1273
+ run_mode: user
1274
+ SUMMARY
1275
+ configurer.run
1276
+
1277
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1278
+ end
1279
+
1280
+ it "uses the environment from the node request if lastrunfile does not contain the expected keys" do
1281
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1282
+ ---
1283
+ version:
1284
+ config: 1624882680
1285
+ puppet: 6.24.0
1286
+ SUMMARY
1287
+ configurer.run
1288
+
1289
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1290
+ end
1291
+
1292
+ it "uses the environment from the node request if lastrunfile is invalid YAML" do
1293
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1294
+ Key: 'this is my very very very ' +
1295
+ 'long string'
1296
+ SUMMARY
1297
+ configurer.run
1298
+
1299
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1300
+ end
1301
+
1302
+ it "uses the environment from the node request if lastrunfile exists but is empty" do
1303
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', '')
1304
+ configurer.run
1305
+
1306
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1307
+ end
1308
+
1309
+ it "uses the environment from the node request if the last used one cannot be found" do
1310
+ Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
1311
+ configurer.run
1312
+
1313
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1314
+ end
1315
+ end
1316
+
1317
+ describe "when the node request fails" do
1318
+ before do
1319
+ allow(Puppet::Node.indirection).to receive(:find).and_call_original
1320
+ allow(Puppet::Node.indirection).to receive(:find)
1321
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1322
+ .and_raise(Puppet::Error)
1323
+ end
1324
+
1325
+ it "uses the environment from Puppet[:environment] if the last used one cannot be found" do
1326
+ Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
1327
+ configurer.run
1328
+
1329
+ expect(configurer.environment).to eq(Puppet[:environment])
1330
+ end
1331
+ end
1124
1332
  end
1125
1333
  end
1126
1334
  end
@@ -200,6 +200,7 @@ describe "Defaults" do
200
200
 
201
201
  Object.send(:remove_const, :Facter)
202
202
  facter = double('facter')
203
+ allow(facter).to receive(:on_message)
203
204
  allow(facter).to receive(:value).with('facterversion').and_return('3.11.4')
204
205
  Object.const_set(:Facter, facter)
205
206
 
@@ -5,6 +5,14 @@ require 'puppet/file_system'
5
5
  describe Puppet::Environments do
6
6
  FS = Puppet::FileSystem
7
7
 
8
+ module FsRemove
9
+ def remove
10
+ @properties[:directory?] = false
11
+ @properties[:exist?] = false
12
+ @properties[:executable?] = false
13
+ end
14
+ end
15
+
8
16
  before(:each) do
9
17
  Puppet.settings.initialize_global_settings
10
18
  Puppet[:environment_timeout] = "unlimited"
@@ -131,6 +139,14 @@ describe Puppet::Environments do
131
139
  end
132
140
  end
133
141
 
142
+ it "implements guard and unguard" do
143
+ loader_from(:filesystem => [directory_tree],
144
+ :directory => directory_tree.children.first) do |loader|
145
+ expect(loader.guard('env1')).to be_nil
146
+ expect(loader.unguard('env1')).to be_nil
147
+ end
148
+ end
149
+
134
150
  context "with an environment.conf" do
135
151
  let(:envdir) do
136
152
  FS::MemoryFile.a_directory(File.expand_path("envdir"), [
@@ -607,6 +623,78 @@ config_version=$vardir/random/scripts
607
623
  cached.get(:cached)
608
624
  end
609
625
 
626
+ it "does not list deleted environments" do
627
+ env3 = FS::MemoryFile.a_directory("env3", [
628
+ FS::MemoryFile.a_regular_file_containing("environment.conf", '')
629
+ ])
630
+
631
+ envdir = FS::MemoryFile.a_directory(File.expand_path("envdir"), [
632
+ FS::MemoryFile.a_directory("env1", [
633
+ FS::MemoryFile.a_regular_file_containing("environment.conf", '')
634
+ ]),
635
+ FS::MemoryFile.a_directory("env2", [
636
+ FS::MemoryFile.a_regular_file_containing("environment.conf", '')
637
+ ]),
638
+ env3
639
+ ])
640
+
641
+ loader_from(:filesystem => [envdir], :directory => envdir) do |loader|
642
+ cached = Puppet::Environments::Cached.new(loader)
643
+ cached.get(:env1)
644
+ cached.get(:env2)
645
+ cached.get(:env3)
646
+ env3.extend(FsRemove).remove
647
+
648
+ expect(cached.list).to contain_exactly(environment(:env1),environment(:env2))
649
+ expect(cached.get(:env3)).to be_nil
650
+ end
651
+ end
652
+
653
+ it "normalizes environment name to symbol" do
654
+ env = Puppet::Node::Environment.create(:cached, [])
655
+ mocked_loader = double('loader')
656
+
657
+ expect(mocked_loader).not_to receive(:get).with('cached')
658
+ expect(mocked_loader).to receive(:get).with(:cached).and_return(env).once
659
+ expect(mocked_loader).to receive(:get_conf).with(:cached).and_return(Puppet::Settings::EnvironmentConf.static_for(env, 20)).once
660
+
661
+ cached = Puppet::Environments::Cached.new(mocked_loader)
662
+ cached.get('cached')
663
+ cached.get(:cached)
664
+ end
665
+
666
+ it "caches environment name as symbol and only once" do
667
+ mocked_loader = double('loader')
668
+
669
+ env = Puppet::Node::Environment.create(:cached, [])
670
+ allow(mocked_loader).to receive(:get).with(:cached).and_return(env)
671
+ allow(mocked_loader).to receive(:get_conf).with(:cached).and_return(Puppet::Settings::EnvironmentConf.static_for(env, 20))
672
+
673
+ cached = Puppet::Environments::Cached.new(mocked_loader)
674
+ cached.get(:cached)
675
+ cached.get('cached')
676
+
677
+ expect(cached.instance_variable_get(:@cache).keys).to eq([:cached])
678
+ end
679
+
680
+ it "is able to cache multiple environments" do
681
+ mocked_loader = double('loader')
682
+
683
+ env1 = Puppet::Node::Environment.create(:env1, [])
684
+ allow(mocked_loader).to receive(:get).with(:env1).and_return(env1)
685
+ allow(mocked_loader).to receive(:get_conf).with(:env1).and_return(Puppet::Settings::EnvironmentConf.static_for(env1, 20))
686
+
687
+ env2 = Puppet::Node::Environment.create(:env2, [])
688
+ allow(mocked_loader).to receive(:get).with(:env2).and_return(env2)
689
+ allow(mocked_loader).to receive(:get_conf).with(:env2).and_return(Puppet::Settings::EnvironmentConf.static_for(env2, 20))
690
+
691
+ cached = Puppet::Environments::Cached.new(mocked_loader)
692
+ cached.get('env1')
693
+ cached.get('env2')
694
+
695
+ expect(cached.instance_variable_get(:@cache).keys).to eq([:env1, :env2])
696
+ end
697
+
610
698
  it "returns nil if env not found" do
611
699
  cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
612
700
  expect(loader.get(:doesnotexist)).to be_nil
@@ -662,6 +750,17 @@ config_version=$vardir/random/scripts
662
750
  cached.get_conf(:cached)
663
751
  end
664
752
 
753
+ it "normalizes environment name to symbol" do
754
+ env = Puppet::Node::Environment.create(:cached, [])
755
+ mocked_loader = double('loader')
756
+ expect(mocked_loader).to receive(:get_conf).with(:cached).and_return(Puppet::Settings::EnvironmentConf.static_for(env, 20)).twice
757
+
758
+ cached = Puppet::Environments::Cached.new(mocked_loader)
759
+
760
+ cached.get_conf('cached')
761
+ cached.get_conf(:cached)
762
+ end
763
+
665
764
  it "returns nil if environment is not found" do
666
765
  cached_loader_from(:filesystem => [directory_tree], :directory => directory_tree.children.first) do |loader|
667
766
  expect(loader.get_conf(:doesnotexist)).to be_nil
@@ -754,6 +853,83 @@ config_version=$vardir/random/scripts
754
853
 
755
854
  expect(service.evicted_envs).to eq([:an_environment])
756
855
  end
856
+
857
+ context "when guarding an environment" do
858
+ before :each do
859
+ Puppet[:environment_timeout] = 0
860
+ end
861
+
862
+ let(:name) { :an_environment }
863
+
864
+ def with_guard(cached, name, &block)
865
+ cached.guard(name)
866
+ begin
867
+ yield
868
+ ensure
869
+ cached.unguard(name)
870
+ end
871
+ end
872
+
873
+ it "evicts an expired and unguarded environment" do
874
+ with_environment_loaded(service) do |cached|
875
+ cached.get!(name)
876
+ end
877
+
878
+ expect(service.created_envs).to eq([name, name])
879
+ expect(service.evicted_envs).to eq([name])
880
+ end
881
+
882
+ it "does not evict an expired, but guarded environment" do
883
+ with_environment_loaded(service) do |cached|
884
+ with_guard(cached, name) do
885
+ cached.get!(name) # these shouldn't reload
886
+ cached.get!(name)
887
+ end
888
+ end
889
+
890
+ expect(service.created_envs).to eq([name])
891
+ expect(service.evicted_envs).to eq([])
892
+ end
893
+
894
+ it "does not evict an environment marked for expiration, but is guarded" do
895
+ Puppet[:environment_timeout] = 'unlimited'
896
+
897
+ expect(service).to receive(:expired?).never
898
+
899
+ with_environment_loaded(service) do |cached|
900
+ with_guard(cached, name) do
901
+ cached.get!(name)
902
+ end
903
+ end
904
+
905
+ expect(service.created_envs).to eq([name])
906
+ expect(service.evicted_envs).to eq([])
907
+ end
908
+
909
+ it "evicts an environment that is no longer guarded" do
910
+ with_environment_loaded(service) do |cached|
911
+ with_guard(cached, name) {}
912
+
913
+ cached.get!(name) # this reloads
914
+ end
915
+
916
+ expect(service.created_envs).to eq([name, name])
917
+ expect(service.evicted_envs).to eq([name])
918
+ end
919
+
920
+ it "can nest guards" do
921
+ with_environment_loaded(service) do |cached|
922
+ with_guard(cached, name) do
923
+ with_guard(cached, name) do
924
+ cached.get!(name) # doesn't reload
925
+ end
926
+ end
927
+ end
928
+
929
+ expect(service.created_envs).to eq([name])
930
+ expect(service.evicted_envs).to eq([])
931
+ end
932
+ end
757
933
  end
758
934
 
759
935
  context '#clear' do
@@ -766,6 +942,14 @@ config_version=$vardir/random/scripts
766
942
 
767
943
  expect(service.evicted_envs).to eq([:an_environment])
768
944
  end
945
+
946
+ it "normalizes environment name to symbol" do
947
+ with_environment_loaded(service) do |cached|
948
+ cached.clear('an_environment')
949
+ end
950
+
951
+ expect(service.evicted_envs).to eq([:an_environment])
952
+ end
769
953
  end
770
954
 
771
955
  context '#clear_all' do