puppet 7.8.0 → 7.12.0

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 (379) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +5 -5
  3. data/Gemfile +2 -2
  4. data/Gemfile.lock +15 -15
  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/install.rb +0 -4
  17. data/lib/puppet/application/agent.rb +4 -0
  18. data/lib/puppet/application/apply.rb +20 -2
  19. data/lib/puppet/application/filebucket.rb +1 -0
  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 +1 -0
  23. data/lib/puppet/configurer.rb +176 -58
  24. data/lib/puppet/confine/variable.rb +1 -1
  25. data/lib/puppet/defaults.rb +67 -29
  26. data/lib/puppet/environments.rb +75 -25
  27. data/lib/puppet/face/help/action.erb +1 -0
  28. data/lib/puppet/face/help/face.erb +1 -0
  29. data/lib/puppet/face/node/clean.rb +1 -1
  30. data/lib/puppet/facter_impl.rb +96 -0
  31. data/lib/puppet/file_serving/configuration/parser.rb +2 -0
  32. data/lib/puppet/file_serving/configuration.rb +2 -0
  33. data/lib/puppet/file_serving/mount/file.rb +4 -4
  34. data/lib/puppet/file_serving/mount/scripts.rb +24 -0
  35. data/lib/puppet/file_system/file_impl.rb +3 -1
  36. data/lib/puppet/file_system/windows.rb +2 -2
  37. data/lib/puppet/file_system.rb +2 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge.rb +4 -4
  40. data/lib/puppet/functions/empty.rb +8 -0
  41. data/lib/puppet/functions/find_template.rb +2 -2
  42. data/lib/puppet/functions/strftime.rb +1 -0
  43. data/lib/puppet/functions/unwrap.rb +17 -2
  44. data/lib/puppet/http/service/compiler.rb +6 -1
  45. data/lib/puppet/indirector/catalog/compiler.rb +24 -6
  46. data/lib/puppet/indirector/catalog/rest.rb +1 -0
  47. data/lib/puppet/indirector/facts/facter.rb +6 -6
  48. data/lib/puppet/indirector/indirection.rb +1 -1
  49. data/lib/puppet/indirector/resource/ral.rb +6 -1
  50. data/lib/puppet/indirector/terminus.rb +4 -0
  51. data/lib/puppet/interface/documentation.rb +1 -0
  52. data/lib/puppet/module/plan.rb +0 -1
  53. data/lib/puppet/module/task.rb +1 -1
  54. data/lib/puppet/module_tool/applications/installer.rb +12 -4
  55. data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
  56. data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
  57. data/lib/puppet/module_tool/errors/shared.rb +17 -0
  58. data/lib/puppet/module_tool/tar/mini.rb +1 -1
  59. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  60. data/lib/puppet/node/environment.rb +10 -11
  61. data/lib/puppet/pal/pal_impl.rb +1 -1
  62. data/lib/puppet/parser/scope.rb +8 -7
  63. data/lib/puppet/parser/templatewrapper.rb +1 -0
  64. data/lib/puppet/pops/evaluator/closure.rb +7 -5
  65. data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
  66. data/lib/puppet/pops/model/ast.rb +1 -0
  67. data/lib/puppet/pops/model/factory.rb +14 -13
  68. data/lib/puppet/pops/parser/egrammar.ra +2 -2
  69. data/lib/puppet/pops/parser/eparser.rb +752 -753
  70. data/lib/puppet/pops/parser/lexer2.rb +69 -68
  71. data/lib/puppet/pops/parser/slurp_support.rb +1 -0
  72. data/lib/puppet/pops/serialization/to_data_converter.rb +18 -6
  73. data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
  74. data/lib/puppet/pops/types/type_formatter.rb +7 -6
  75. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  76. data/lib/puppet/pops/types/types.rb +1 -1
  77. data/lib/puppet/provider/aix_object.rb +1 -1
  78. data/lib/puppet/provider/exec/posix.rb +16 -4
  79. data/lib/puppet/provider/group/groupadd.rb +5 -2
  80. data/lib/puppet/provider/package/pip.rb +15 -3
  81. data/lib/puppet/provider/package/pkg.rb +19 -2
  82. data/lib/puppet/provider/package/puppet_gem.rb +1 -1
  83. data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
  84. data/lib/puppet/provider/package/windows/exe_package.rb +30 -1
  85. data/lib/puppet/provider/package/windows/package.rb +2 -1
  86. data/lib/puppet/provider/package/windows.rb +14 -1
  87. data/lib/puppet/provider/package/yum.rb +1 -1
  88. data/lib/puppet/provider/parsedfile.rb +3 -0
  89. data/lib/puppet/provider/service/base.rb +1 -1
  90. data/lib/puppet/provider/service/init.rb +5 -5
  91. data/lib/puppet/provider/service/launchd.rb +2 -2
  92. data/lib/puppet/provider/service/redhat.rb +1 -1
  93. data/lib/puppet/provider/service/smf.rb +3 -3
  94. data/lib/puppet/provider/service/systemd.rb +2 -2
  95. data/lib/puppet/provider/service/upstart.rb +5 -5
  96. data/lib/puppet/provider/user/aix.rb +44 -1
  97. data/lib/puppet/provider/user/directoryservice.rb +1 -1
  98. data/lib/puppet/provider/user/useradd.rb +72 -16
  99. data/lib/puppet/provider.rb +1 -1
  100. data/lib/puppet/reference/providers.rb +2 -2
  101. data/lib/puppet/resource/type_collection.rb +4 -1
  102. data/lib/puppet/runtime.rb +11 -1
  103. data/lib/puppet/settings/config_file.rb +1 -8
  104. data/lib/puppet/settings/file_setting.rb +3 -8
  105. data/lib/puppet/settings/value_translator.rb +0 -1
  106. data/lib/puppet/settings.rb +32 -9
  107. data/lib/puppet/test/test_helper.rb +4 -1
  108. data/lib/puppet/transaction/persistence.rb +11 -1
  109. data/lib/puppet/transaction/report.rb +15 -1
  110. data/lib/puppet/type/exec.rb +35 -5
  111. data/lib/puppet/type/file/mode.rb +6 -0
  112. data/lib/puppet/type/file.rb +6 -6
  113. data/lib/puppet/type/filebucket.rb +2 -2
  114. data/lib/puppet/type/group.rb +0 -1
  115. data/lib/puppet/type/resources.rb +1 -1
  116. data/lib/puppet/type/service.rb +8 -3
  117. data/lib/puppet/type/tidy.rb +1 -1
  118. data/lib/puppet/type/user.rb +1 -2
  119. data/lib/puppet/type.rb +1 -1
  120. data/lib/puppet/util/autoload.rb +1 -1
  121. data/lib/puppet/util/command_line.rb +1 -1
  122. data/lib/puppet/util/filetype.rb +2 -2
  123. data/lib/puppet/util/json.rb +3 -0
  124. data/lib/puppet/util/log.rb +1 -2
  125. data/lib/puppet/util/logging.rb +1 -25
  126. data/lib/puppet/util/monkey_patches.rb +2 -17
  127. data/lib/puppet/util/pidlock.rb +1 -1
  128. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  129. data/lib/puppet/util/suidmanager.rb +1 -2
  130. data/lib/puppet/util/symbolic_file_mode.rb +29 -17
  131. data/lib/puppet/util/tagging.rb +1 -0
  132. data/lib/puppet/util/windows/sid.rb +3 -1
  133. data/lib/puppet/util/windows/user.rb +0 -1
  134. data/lib/puppet/util.rb +4 -3
  135. data/lib/puppet/version.rb +1 -1
  136. data/lib/puppet/x509/cert_provider.rb +3 -21
  137. data/lib/puppet.rb +5 -9
  138. data/locales/puppet.pot +409 -329
  139. data/man/man5/puppet.conf.5 +73 -25
  140. data/man/man8/puppet-agent.8 +4 -1
  141. data/man/man8/puppet-apply.8 +1 -1
  142. data/man/man8/puppet-catalog.8 +9 -9
  143. data/man/man8/puppet-config.8 +1 -1
  144. data/man/man8/puppet-describe.8 +1 -1
  145. data/man/man8/puppet-device.8 +1 -1
  146. data/man/man8/puppet-doc.8 +1 -1
  147. data/man/man8/puppet-epp.8 +1 -1
  148. data/man/man8/puppet-facts.8 +7 -7
  149. data/man/man8/puppet-filebucket.8 +1 -1
  150. data/man/man8/puppet-generate.8 +1 -1
  151. data/man/man8/puppet-help.8 +1 -1
  152. data/man/man8/puppet-lookup.8 +1 -1
  153. data/man/man8/puppet-module.8 +3 -3
  154. data/man/man8/puppet-node.8 +5 -5
  155. data/man/man8/puppet-parser.8 +1 -1
  156. data/man/man8/puppet-plugin.8 +1 -1
  157. data/man/man8/puppet-report.8 +5 -5
  158. data/man/man8/puppet-resource.8 +1 -1
  159. data/man/man8/puppet-script.8 +1 -1
  160. data/man/man8/puppet-ssl.8 +1 -1
  161. data/man/man8/puppet.8 +2 -2
  162. data/spec/fixtures/integration/application/agent/lib/facter/agent_spec_role.rb +3 -0
  163. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Gemfile +4 -0
  164. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Rakefile +3 -0
  165. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/lib/puppet/functions/l10n.rb +8 -0
  166. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/config.yaml +25 -0
  167. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/ja/puppet-l10n.po +19 -0
  168. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/puppet-l10n.pot +20 -0
  169. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/metadata.json +8 -0
  170. data/spec/fixtures/ssl/127.0.0.1-key.pem +106 -106
  171. data/spec/fixtures/ssl/127.0.0.1.pem +48 -48
  172. data/spec/fixtures/ssl/bad-basic-constraints.pem +54 -54
  173. data/spec/fixtures/ssl/bad-int-basic-constraints.pem +51 -51
  174. data/spec/fixtures/ssl/ca.pem +52 -52
  175. data/spec/fixtures/ssl/crl.pem +25 -25
  176. data/spec/fixtures/ssl/ec-key-openssl.pem +8 -0
  177. data/spec/fixtures/ssl/ec-key-pk8.pem +5 -0
  178. data/spec/fixtures/ssl/ec-key.pem +11 -11
  179. data/spec/fixtures/ssl/ec.pem +32 -32
  180. data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
  181. data/spec/fixtures/ssl/encrypted-key.pem +107 -107
  182. data/spec/fixtures/ssl/intermediate-agent-crl.pem +25 -25
  183. data/spec/fixtures/ssl/intermediate-agent.pem +54 -54
  184. data/spec/fixtures/ssl/intermediate-crl.pem +28 -28
  185. data/spec/fixtures/ssl/intermediate.pem +51 -51
  186. data/spec/fixtures/ssl/oid-key.pem +117 -0
  187. data/spec/fixtures/ssl/oid.pem +69 -0
  188. data/spec/fixtures/ssl/pluto-key.pem +106 -106
  189. data/spec/fixtures/ssl/pluto.pem +50 -50
  190. data/spec/fixtures/ssl/request-key.pem +106 -106
  191. data/spec/fixtures/ssl/request.pem +45 -45
  192. data/spec/fixtures/ssl/revoked-key.pem +106 -106
  193. data/spec/fixtures/ssl/revoked.pem +49 -49
  194. data/spec/fixtures/ssl/signed-key.pem +106 -106
  195. data/spec/fixtures/ssl/signed.pem +47 -47
  196. data/spec/fixtures/ssl/tampered-cert.pem +49 -49
  197. data/spec/fixtures/ssl/tampered-csr.pem +45 -45
  198. data/spec/fixtures/ssl/trusted_oid_mapping.yaml +5 -0
  199. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +106 -106
  200. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -48
  201. data/spec/fixtures/ssl/unknown-ca-key.pem +106 -106
  202. data/spec/fixtures/ssl/unknown-ca.pem +52 -52
  203. data/spec/integration/application/agent_spec.rb +118 -52
  204. data/spec/integration/application/filebucket_spec.rb +16 -0
  205. data/spec/integration/application/module_spec.rb +21 -0
  206. data/spec/integration/application/resource_spec.rb +35 -1
  207. data/spec/integration/application/ssl_spec.rb +20 -0
  208. data/spec/integration/configurer_spec.rb +18 -2
  209. data/spec/integration/defaults_spec.rb +5 -0
  210. data/spec/integration/environments/settings_interpolation_spec.rb +0 -4
  211. data/spec/integration/indirector/facts/facter_spec.rb +93 -39
  212. data/spec/integration/l10n/compiler_spec.rb +37 -0
  213. data/spec/integration/transaction/report_spec.rb +1 -1
  214. data/spec/integration/type/exec_spec.rb +70 -45
  215. data/spec/integration/type/file_spec.rb +2 -2
  216. data/spec/integration/type/package_spec.rb +6 -6
  217. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  218. data/spec/integration/util/windows/process_spec.rb +1 -9
  219. data/spec/lib/puppet/test_ca.rb +5 -0
  220. data/spec/lib/puppet_spec/modules.rb +13 -2
  221. data/spec/lib/puppet_spec/puppetserver.rb +15 -0
  222. data/spec/lib/puppet_spec/settings.rb +1 -0
  223. data/spec/shared_behaviours/documentation_on_faces.rb +0 -2
  224. data/spec/shared_contexts/l10n.rb +27 -0
  225. data/spec/spec_helper.rb +1 -10
  226. data/spec/unit/application/apply_spec.rb +76 -56
  227. data/spec/unit/application/resource_spec.rb +29 -0
  228. data/spec/unit/configurer_spec.rb +291 -56
  229. data/spec/unit/environments_spec.rb +184 -0
  230. data/spec/unit/facter_impl_spec.rb +31 -0
  231. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  232. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -0
  233. data/spec/unit/file_serving/configuration_spec.rb +12 -4
  234. data/spec/unit/file_serving/mount/scripts_spec.rb +69 -0
  235. data/spec/unit/file_system_spec.rb +13 -0
  236. data/spec/unit/functions/assert_type_spec.rb +1 -1
  237. data/spec/unit/functions/empty_spec.rb +10 -0
  238. data/spec/unit/functions/logging_spec.rb +1 -0
  239. data/spec/unit/functions/lookup_spec.rb +87 -0
  240. data/spec/unit/functions/unwrap_spec.rb +8 -0
  241. data/spec/unit/functions4_spec.rb +2 -2
  242. data/spec/unit/http/service/compiler_spec.rb +8 -0
  243. data/spec/unit/indirector/catalog/compiler_spec.rb +87 -0
  244. data/spec/unit/indirector/catalog/rest_spec.rb +8 -0
  245. data/spec/unit/indirector/indirection_spec.rb +10 -3
  246. data/spec/unit/indirector/resource/ral_spec.rb +40 -75
  247. data/spec/unit/interface/action_spec.rb +0 -9
  248. data/spec/unit/module_spec.rb +14 -0
  249. data/spec/unit/module_tool/applications/installer_spec.rb +52 -14
  250. data/spec/unit/network/formats_spec.rb +6 -0
  251. data/spec/unit/parser/compiler_spec.rb +29 -0
  252. data/spec/unit/parser/templatewrapper_spec.rb +12 -2
  253. data/spec/unit/pops/loaders/dependency_loader_spec.rb +0 -9
  254. data/spec/unit/pops/parser/lexer2_spec.rb +0 -4
  255. data/spec/unit/pops/parser/parse_containers_spec.rb +0 -11
  256. data/spec/unit/pops/serialization/to_from_hr_spec.rb +58 -0
  257. data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
  258. data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
  259. data/spec/unit/provider/package/gem_spec.rb +1 -1
  260. data/spec/unit/provider/package/pip2_spec.rb +1 -1
  261. data/spec/unit/provider/package/pip3_spec.rb +1 -1
  262. data/spec/unit/provider/package/pip_spec.rb +38 -1
  263. data/spec/unit/provider/package/pkg_spec.rb +34 -5
  264. data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
  265. data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
  266. data/spec/unit/provider/package/windows/exe_package_spec.rb +17 -0
  267. data/spec/unit/provider/parsedfile_spec.rb +10 -0
  268. data/spec/unit/provider/service/launchd_spec.rb +11 -0
  269. data/spec/unit/provider/service/systemd_spec.rb +1 -1
  270. data/spec/unit/provider/user/aix_spec.rb +100 -0
  271. data/spec/unit/provider/user/directoryservice_spec.rb +1 -1
  272. data/spec/unit/provider/user/useradd_spec.rb +43 -2
  273. data/spec/unit/provider_spec.rb +4 -4
  274. data/spec/unit/puppet_spec.rb +12 -4
  275. data/spec/unit/resource/type_collection_spec.rb +16 -0
  276. data/spec/unit/resource/type_spec.rb +2 -2
  277. data/spec/unit/settings/config_file_spec.rb +1 -11
  278. data/spec/unit/settings/file_setting_spec.rb +10 -7
  279. data/spec/unit/settings/value_translator_spec.rb +4 -5
  280. data/spec/unit/settings_spec.rb +120 -79
  281. data/spec/unit/ssl/ssl_provider_spec.rb +18 -16
  282. data/spec/unit/type/exec_spec.rb +76 -29
  283. data/spec/unit/type/file/source_spec.rb +4 -4
  284. data/spec/unit/type/service_spec.rb +27 -0
  285. data/spec/unit/type/tidy_spec.rb +7 -0
  286. data/spec/unit/type_spec.rb +2 -2
  287. data/spec/unit/util/autoload_spec.rb +25 -8
  288. data/spec/unit/util/ldap/connection_spec.rb +10 -10
  289. data/spec/unit/util/ldap/manager_spec.rb +2 -2
  290. data/spec/unit/util/logging_spec.rb +2 -0
  291. data/spec/unit/util/windows/sid_spec.rb +39 -4
  292. data/spec/unit/util_spec.rb +1 -3
  293. data/spec/unit/x509/cert_provider_spec.rb +9 -1
  294. data/tasks/generate_cert_fixtures.rake +10 -1
  295. data/tasks/parallel.rake +3 -3
  296. metadata +51 -95
  297. data/ext/README.environment +0 -8
  298. data/ext/dbfix.sql +0 -132
  299. data/ext/debian/README.Debian +0 -8
  300. data/ext/debian/README.source +0 -2
  301. data/ext/debian/TODO.Debian +0 -1
  302. data/ext/debian/changelog.erb +0 -1122
  303. data/ext/debian/compat +0 -1
  304. data/ext/debian/control +0 -144
  305. data/ext/debian/copyright +0 -339
  306. data/ext/debian/docs +0 -1
  307. data/ext/debian/fileserver.conf +0 -41
  308. data/ext/debian/puppet-common.dirs +0 -13
  309. data/ext/debian/puppet-common.install +0 -3
  310. data/ext/debian/puppet-common.lintian-overrides +0 -5
  311. data/ext/debian/puppet-common.manpages +0 -28
  312. data/ext/debian/puppet-common.postinst +0 -35
  313. data/ext/debian/puppet-common.postrm +0 -33
  314. data/ext/debian/puppet-el.dirs +0 -1
  315. data/ext/debian/puppet-el.emacsen-install +0 -25
  316. data/ext/debian/puppet-el.emacsen-remove +0 -11
  317. data/ext/debian/puppet-el.emacsen-startup +0 -9
  318. data/ext/debian/puppet-el.install +0 -1
  319. data/ext/debian/puppet-testsuite.install +0 -2
  320. data/ext/debian/puppet-testsuite.lintian-overrides +0 -4
  321. data/ext/debian/puppet.lintian-overrides +0 -3
  322. data/ext/debian/puppet.logrotate +0 -20
  323. data/ext/debian/puppet.postinst +0 -20
  324. data/ext/debian/puppet.postrm +0 -20
  325. data/ext/debian/puppet.preinst +0 -20
  326. data/ext/debian/puppetmaster-common.install +0 -2
  327. data/ext/debian/puppetmaster-common.manpages +0 -2
  328. data/ext/debian/puppetmaster-common.postinst +0 -6
  329. data/ext/debian/puppetmaster-passenger.dirs +0 -4
  330. data/ext/debian/puppetmaster-passenger.postinst +0 -162
  331. data/ext/debian/puppetmaster-passenger.postrm +0 -61
  332. data/ext/debian/puppetmaster.README.debian +0 -17
  333. data/ext/debian/puppetmaster.default +0 -14
  334. data/ext/debian/puppetmaster.init +0 -137
  335. data/ext/debian/puppetmaster.lintian-overrides +0 -3
  336. data/ext/debian/puppetmaster.postinst +0 -20
  337. data/ext/debian/puppetmaster.postrm +0 -5
  338. data/ext/debian/puppetmaster.preinst +0 -22
  339. data/ext/debian/rules +0 -132
  340. data/ext/debian/source/format +0 -1
  341. data/ext/debian/source/options +0 -1
  342. data/ext/debian/vim-puppet.README.Debian +0 -13
  343. data/ext/debian/vim-puppet.dirs +0 -5
  344. data/ext/debian/vim-puppet.yaml +0 -7
  345. data/ext/debian/watch +0 -2
  346. data/ext/freebsd/puppetd +0 -26
  347. data/ext/freebsd/puppetmasterd +0 -26
  348. data/ext/gentoo/conf.d/puppet +0 -5
  349. data/ext/gentoo/conf.d/puppetmaster +0 -12
  350. data/ext/gentoo/init.d/puppet +0 -38
  351. data/ext/gentoo/init.d/puppetmaster +0 -51
  352. data/ext/gentoo/puppet/fileserver.conf +0 -41
  353. data/ext/ips/puppet-agent +0 -44
  354. data/ext/ips/puppet-master +0 -44
  355. data/ext/ips/puppet.p5m.erb +0 -12
  356. data/ext/ips/puppetagent.xml +0 -42
  357. data/ext/ips/puppetmaster.xml +0 -42
  358. data/ext/ips/rules +0 -19
  359. data/ext/ips/transforms +0 -34
  360. data/ext/ldap/puppet.schema +0 -24
  361. data/ext/logcheck/puppet +0 -23
  362. data/ext/osx/file_mapping.yaml +0 -28
  363. data/ext/osx/postflight.erb +0 -109
  364. data/ext/osx/preflight.erb +0 -52
  365. data/ext/osx/prototype.plist.erb +0 -38
  366. data/ext/redhat/fileserver.conf +0 -41
  367. data/ext/redhat/logrotate +0 -21
  368. data/ext/redhat/puppet.spec.erb +0 -841
  369. data/ext/redhat/server.init +0 -128
  370. data/ext/redhat/server.sysconfig +0 -13
  371. data/ext/solaris/pkginfo +0 -6
  372. data/ext/solaris/smf/puppetd.xml +0 -77
  373. data/ext/solaris/smf/puppetmasterd.xml +0 -77
  374. data/ext/solaris/smf/svc-puppetd +0 -71
  375. data/ext/solaris/smf/svc-puppetmasterd +0 -67
  376. data/ext/suse/puppet.spec +0 -310
  377. data/ext/suse/server.init +0 -173
  378. data/ext/yaml_nodes.rb +0 -105
  379. data/spec/unit/indirector/store_configs_spec.rb +0 -7
@@ -7,6 +7,9 @@ describe Puppet::Configurer do
7
7
  Puppet[:report] = true
8
8
 
9
9
  catalog.add_resource(resource)
10
+ allow_any_instance_of(described_class).to(
11
+ receive(:valid_server_environment?).and_return(true)
12
+ )
10
13
  end
11
14
 
12
15
  let(:node_name) { Puppet[:node_name_value] }
@@ -78,10 +81,10 @@ describe Puppet::Configurer do
78
81
  configurer.run(:pluginsync => false)
79
82
  end
80
83
 
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)
84
+ it "does not download plugins when specified environment is not vaild on server" do
85
+ expect(configurer).to receive(:valid_server_environment?).and_return(false)
86
+ expect(configurer).not_to receive(:download_plugins)
87
+ configurer.run(:pluginsync => true)
85
88
  end
86
89
 
87
90
  it "fails the run if pluginsync fails when usecacheonfailure is false" do
@@ -125,7 +128,6 @@ describe Puppet::Configurer do
125
128
  it "applies a cached catalog when it can't connect to the master" do
126
129
  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
127
130
 
128
- expect(Puppet::Node.indirection).to receive(:find).and_raise(error)
129
131
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_cache => true)).and_raise(error)
130
132
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(:ignore_terminus => true)).and_return(catalog)
131
133
 
@@ -149,6 +151,126 @@ describe Puppet::Configurer do
149
151
  expect(report.host).to eq('node_name_from_fact')
150
152
  end
151
153
 
154
+ it "should warn the user when the fact value length limits are exceeded" do
155
+ Puppet[:fact_name_length_soft_limit] = 0
156
+ Puppet[:fact_value_length_soft_limit] = 1
157
+ Puppet[:top_level_facts_soft_limit] = 0
158
+ Puppet[:number_of_facts_soft_limit] = 0
159
+ Puppet[:payload_soft_limit] = 0
160
+
161
+ facts.values = { 'processors' => {
162
+ 'cores' => 1,
163
+ 'count' => 2,
164
+ 'isa' => "i386",
165
+ 'models' => [
166
+ "CPU1 @ 2.80GHz"
167
+ ],
168
+ 'physicalcount' => 4 }
169
+ }
170
+ Puppet::Node::Facts.indirection.save(facts)
171
+
172
+ expect(Puppet).to receive(:warning).with(/Fact value '.+' with the value length: '[1-9]*' exceeds the value length limit: [1-9]*/).twice
173
+ configurer.run
174
+ end
175
+
176
+ it "should warn the user when the payload limits are exceeded" do
177
+ Puppet[:fact_name_length_soft_limit] = 0
178
+ Puppet[:fact_value_length_soft_limit] = 0
179
+ Puppet[:top_level_facts_soft_limit] = 0
180
+ Puppet[:number_of_facts_soft_limit] = 0
181
+ Puppet[:payload_soft_limit] = 1
182
+
183
+ facts.values = { 'processors' => {
184
+ 'cores' => 1,
185
+ 'count' => 2,
186
+ 'isa' => "i386",
187
+ 'models' => [
188
+ "CPU1 @ 2.80GHz"
189
+ ],
190
+ 'physicalcount' => 4 }
191
+ }
192
+ Puppet::Node::Facts.indirection.save(facts)
193
+
194
+ expect(Puppet).to receive(:warning).with(/Payload with the current size of: '\d*' exceeds the payload size limit: \d*/)
195
+ configurer.run
196
+ end
197
+
198
+ it "should warn the user when the total number of facts limit is exceeded" do
199
+ Puppet[:fact_name_length_soft_limit] = 0
200
+ Puppet[:fact_value_length_soft_limit] = 0
201
+ Puppet[:top_level_facts_soft_limit] = 0
202
+ Puppet[:number_of_facts_soft_limit] = 1
203
+ Puppet[:payload_soft_limit] = 0
204
+
205
+ facts.values = {
206
+ 'processors' => {
207
+ 'cores' => 1,
208
+ 'count' => 2,
209
+ 'isa' => "i386",
210
+ 'models' => [
211
+ "CPU1 @ 2.80GHz",
212
+ "CPU1 @ 2.80GHz",
213
+ "CPU1 @ 2.80GHz",
214
+ "CPU1 @ 2.80GHz",
215
+ "CPU1 @ 2.80GHz",
216
+ {
217
+ 'processors' => {
218
+ 'cores' => [1,2]
219
+ }
220
+ }
221
+ ],
222
+ 'physicalcount' => 4
223
+ }
224
+ }
225
+ Puppet::Node::Facts.indirection.save(facts)
226
+
227
+ expect(Puppet).to receive(:warning).with(/The current total number of facts: [1-9]* exceeds the number of facts limit: [1-9]*/)
228
+ configurer.run
229
+ end
230
+
231
+ it "should warn the user when the top level facts size limits are exceeded" do
232
+ Puppet[:fact_name_length_soft_limit] = 0
233
+ Puppet[:fact_value_length_soft_limit] = 0
234
+ Puppet[:top_level_facts_soft_limit] = 1
235
+ Puppet[:number_of_facts_soft_limit] = 0
236
+ Puppet[:payload_soft_limit] = 0
237
+
238
+ facts.values = {'my_new_fact_name' => 'my_new_fact_value',
239
+ 'my_new_fact_name2' => 'my_new_fact_value2'}
240
+ Puppet::Node::Facts.indirection.save(facts)
241
+
242
+ expect(Puppet).to receive(:warning).with(/The current number of top level facts: [1-9]* exceeds the top facts limit: [1-9]*/)
243
+ configurer.run
244
+ end
245
+
246
+ it "should warn the user when the fact name length limits are exceeded" do
247
+ Puppet[:fact_name_length_soft_limit] = 1
248
+ Puppet[:fact_value_length_soft_limit] = 0
249
+ Puppet[:top_level_facts_soft_limit] = 0
250
+ Puppet[:number_of_facts_soft_limit] = 0
251
+ Puppet[:payload_soft_limit] = 0
252
+
253
+ facts.values = {'my_new_fact_name' => 'my_new_fact_value'}
254
+ Puppet::Node::Facts.indirection.save(facts)
255
+
256
+ expect(Puppet).to receive(:warning).with(/Fact .+ with length: '[1-9]*' exceeds the length limit: [1-9]*/)
257
+ configurer.run
258
+ end
259
+
260
+ it "shouldn't warn the user when the fact limit settings are set to 0" do
261
+ Puppet[:fact_name_length_soft_limit] = 0
262
+ Puppet[:fact_value_length_soft_limit] = 0
263
+ Puppet[:top_level_facts_soft_limit] = 0
264
+ Puppet[:number_of_facts_soft_limit] = 0
265
+ Puppet[:payload_soft_limit] = 0
266
+
267
+ facts.values = {'my_new_fact_name' => 'my_new_fact_value'}
268
+ Puppet::Node::Facts.indirection.save(facts)
269
+
270
+ expect(Puppet).not_to receive(:warning)
271
+ configurer.run
272
+ end
273
+
152
274
  it "creates a new report when applying the catalog" do
153
275
  options = {}
154
276
  configurer.run(options)
@@ -461,7 +583,7 @@ describe Puppet::Configurer do
461
583
  it "should save the report if reporting is enabled" do
462
584
  Puppet.settings[:report] = true
463
585
 
464
- expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash))
586
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, instance_of(Hash)).twice
465
587
  configurer.send_report(report)
466
588
  end
467
589
 
@@ -489,12 +611,22 @@ describe Puppet::Configurer do
489
611
  it "should log but not fail if saving the report fails" do
490
612
  Puppet.settings[:report] = true
491
613
 
492
- expect(Puppet::Transaction::Report.indirection).to receive(:save).and_raise("whatever")
614
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
615
+ expect(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true))
493
616
 
494
617
  configurer.send_report(report)
495
618
 
496
619
  expect(@logs).to include(an_object_having_attributes(level: :err, message: 'Could not send report: whatever'))
497
620
  end
621
+
622
+ it "should save the cached report if fails to send the report" do
623
+ allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_terminus: true)).and_call_original
624
+ allow(Puppet::Transaction::Report.indirection).to receive(:save).with(report, nil, hash_including(ignore_cache: true)).and_raise("whatever")
625
+
626
+ expect(File).to_not be_exist(Puppet[:lastrunfile])
627
+ configurer.send_report(report)
628
+ expect(File.read(Puppet[:lastrunfile])).to match(/puppet: #{Puppet::PUPPETVERSION}/)
629
+ end
498
630
  end
499
631
 
500
632
  describe "when saving the summary report file" do
@@ -553,24 +685,6 @@ describe Puppet::Configurer do
553
685
  end
554
686
  end
555
687
 
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
688
  def expects_pluginsync
575
689
  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
690
  stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
@@ -581,7 +695,7 @@ describe Puppet::Configurer do
581
695
  end
582
696
 
583
697
  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)
698
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, check_environment: true)).and_return(catalog)
585
699
  expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
586
700
  end
587
701
 
@@ -598,7 +712,7 @@ describe Puppet::Configurer do
598
712
  def expects_fallback_to_new_catalog(catalog)
599
713
  expects_pluginsync
600
714
  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)
715
+ expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true, check_environment: true)).and_return(catalog)
602
716
  end
603
717
 
604
718
  def expects_neither_new_or_cached_catalog
@@ -622,21 +736,13 @@ describe Puppet::Configurer do
622
736
  configurer.run
623
737
  end
624
738
 
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)
739
+ it "should not pluginsync when a cached catalog is successfully retrieved" do
627
740
  expects_cached_catalog_only(catalog)
628
741
  expect(configurer).not_to receive(:download_plugins)
629
742
 
630
743
  configurer.run
631
744
  end
632
745
 
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
746
  it "should set its cached_catalog_status to 'explicitly_requested'" do
641
747
  expects_cached_catalog_only(catalog)
642
748
 
@@ -672,7 +778,6 @@ describe Puppet::Configurer do
672
778
  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
673
779
  Puppet[:ignore_plugin_errors] = true
674
780
 
675
- expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
676
781
  expects_neither_new_or_cached_catalog
677
782
  expects_pluginsync
678
783
 
@@ -728,16 +833,6 @@ describe Puppet::Configurer do
728
833
  Puppet.settings[:strict_environment_mode] = true
729
834
  end
730
835
 
731
- it "should not make a node request" do
732
- stub_request(:get, %r{/puppet/v3/file_metadatas?/plugins}).to_return(:status => 404)
733
- stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
734
- expects_new_catalog_only(catalog)
735
-
736
- expect(Puppet::Node.indirection).not_to receive(:find)
737
-
738
- configurer.run
739
- end
740
-
741
836
  it "should return nil when the catalog's environment doesn't match the agent specified environment" do
742
837
  Puppet[:environment] = 'second_env'
743
838
  configurer = Puppet::Configurer.new
@@ -951,9 +1046,23 @@ describe Puppet::Configurer do
951
1046
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).and_return(apple, banana, banana)
952
1047
 
953
1048
  allow(Puppet).to receive(:notice)
1049
+ allow(Puppet).to receive(:push_context)
954
1050
  expect(Puppet).to receive(:notice).with("Local environment: 'production' doesn't match server specified environment 'apple', restarting agent run with environment 'apple'")
955
1051
  expect(Puppet).to receive(:notice).with("Local environment: 'apple' doesn't match server specified environment 'banana', restarting agent run with environment 'banana'")
956
1052
 
1053
+ expect(Puppet).to receive(:push_context).with(
1054
+ hash_including(current_environment: an_object_having_attributes(name: :production)),
1055
+ 'Local node environment production for configurer transaction'
1056
+ )
1057
+ expect(Puppet).to receive(:push_context).with(
1058
+ hash_including(current_environment: an_object_having_attributes(name: :apple)),
1059
+ 'Local node environment apple for configurer transaction'
1060
+ )
1061
+ expect(Puppet).to receive(:push_context).with(
1062
+ hash_including(current_environment: an_object_having_attributes(name: :banana)),
1063
+ 'Local node environment banana for configurer transaction'
1064
+ )
1065
+
957
1066
  configurer.run
958
1067
  end
959
1068
 
@@ -1110,20 +1219,146 @@ describe Puppet::Configurer do
1110
1219
  expect(configurer.run(options)).to eq(0)
1111
1220
  expect(options[:report].server_used).to be_nil
1112
1221
  end
1222
+ end
1113
1223
 
1114
- it "should not make multiple node requests when the server is found" do
1115
- Puppet.settings[:server_list] = ["myserver:123"]
1224
+ describe "when selecting an environment" do
1225
+ include PuppetSpec::Files
1226
+ include PuppetSpec::Settings
1116
1227
 
1117
- Puppet::Node.indirection.terminus_class = :rest
1118
- Puppet::Resource::Catalog.indirection.terminus_class = :rest
1228
+ describe "when the last used environment is available" do
1229
+ let(:last_server_specified_environment) { 'development' }
1119
1230
 
1120
- stub_request(:get, 'https://myserver:123/status/v1/simple/server').to_return(status: 200)
1121
- stub_request(:post, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
1122
- node_request = stub_request(:get, %r{https://myserver:123/puppet/v3/node/}).to_return(status: 200)
1231
+ before do
1232
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1233
+ ---
1234
+ version:
1235
+ config: 1624882680
1236
+ puppet: 6.24.0
1237
+ application:
1238
+ initial_environment: #{Puppet[:environment]}
1239
+ converged_environment: #{last_server_specified_environment}
1240
+ run_mode: agent
1241
+ SUMMARY
1242
+ end
1123
1243
 
1124
- configurer.run
1244
+ it "prefers the environment set via cli" do
1245
+ Puppet.settings.handlearg('--environment', 'usethis')
1246
+ configurer.run
1247
+
1248
+ expect(configurer.environment).to eq('usethis')
1249
+ end
1250
+
1251
+ it "prefers the environment set via config" do
1252
+ FileUtils.mkdir_p(Puppet[:confdir])
1253
+ set_puppet_conf(Puppet[:confdir], <<~CONF)
1254
+ [main]
1255
+ environment = usethis
1256
+ CONF
1257
+
1258
+ Puppet.initialize_settings
1259
+ configurer.run
1260
+
1261
+ expect(configurer.environment).to eq('usethis')
1262
+ end
1263
+
1264
+ it "uses environment from Puppet[:environment] if given a catalog" do
1265
+ configurer.run(catalog: catalog)
1266
+
1267
+ expect(configurer.environment).to eq(Puppet[:environment])
1268
+ end
1125
1269
 
1126
- expect(node_request).to have_been_requested.once
1270
+ it "uses environment from Puppet[:environment] if use_cached_catalog = true" do
1271
+ Puppet[:use_cached_catalog] = true
1272
+ expects_cached_catalog_only(catalog)
1273
+ configurer.run
1274
+
1275
+ expect(configurer.environment).to eq(Puppet[:environment])
1276
+ end
1277
+
1278
+ describe "when the environment is not set via CLI" do
1279
+ it "uses the environment found in lastrunfile if the key exists" do
1280
+ configurer.run
1281
+
1282
+ expect(configurer.environment).to eq(last_server_specified_environment)
1283
+ end
1284
+
1285
+ it "pushes the converged environment found in lastrunfile over the existing context" do
1286
+ initial_env = Puppet::Node::Environment.remote('production')
1287
+ Puppet.push_context(
1288
+ current_environment: initial_env,
1289
+ loaders: Puppet::Pops::Loaders.new(initial_env, true))
1290
+
1291
+ expect(Puppet).to receive(:push_context).with(
1292
+ hash_including(:current_environment, :loaders),
1293
+ "Local node environment #{last_server_specified_environment} for configurer transaction"
1294
+ ).once.and_call_original
1295
+
1296
+ configurer.run
1297
+ end
1298
+
1299
+ it "uses environment from Puppet[:environment] if strict_environment_mode is set" do
1300
+ Puppet[:strict_environment_mode] = true
1301
+ configurer.run
1302
+
1303
+ expect(configurer.environment).to eq(Puppet[:environment])
1304
+ end
1305
+
1306
+ it "uses environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
1307
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1308
+ ---
1309
+ version:
1310
+ config: 1624882680
1311
+ puppet: 6.24.0
1312
+ application:
1313
+ initial_environment: development
1314
+ converged_environment: development
1315
+ run_mode: agent
1316
+ SUMMARY
1317
+ configurer.run
1318
+
1319
+ expect(configurer.environment).to eq(Puppet[:environment])
1320
+ end
1321
+
1322
+ it "uses environment from Puppet[:environment] if the run mode doesn't match" do
1323
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1324
+ ---
1325
+ version:
1326
+ config: 1624882680
1327
+ puppet: 6.24.0
1328
+ application:
1329
+ initial_environment: #{Puppet[:environment]}
1330
+ converged_environment: #{last_server_specified_environment}
1331
+ run_mode: user
1332
+ SUMMARY
1333
+ configurer.run
1334
+
1335
+ expect(configurer.environment).to eq(Puppet[:environment])
1336
+ end
1337
+
1338
+ it "uses environment from Puppet[:environment] if lastrunfile is invalid YAML" do
1339
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1340
+ Key: 'this is my very very very ' +
1341
+ 'long string'
1342
+ SUMMARY
1343
+ configurer.run
1344
+
1345
+ expect(configurer.environment).to eq(Puppet[:environment])
1346
+ end
1347
+
1348
+ it "uses environment from Puppet[:environment] if lastrunfile exists but is empty" do
1349
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', '')
1350
+ configurer.run
1351
+
1352
+ expect(configurer.environment).to eq(Puppet[:environment])
1353
+ end
1354
+
1355
+ it "uses environment from Puppet[:environment] if the last used one cannot be found" do
1356
+ Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
1357
+ configurer.run
1358
+
1359
+ expect(configurer.environment).to eq(Puppet[:environment])
1360
+ end
1361
+ end
1127
1362
  end
1128
1363
  end
1129
1364
  end
@@ -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
@@ -751,6 +850,83 @@ config_version=$vardir/random/scripts
751
850
 
752
851
  expect(service.evicted_envs).to eq([:an_environment])
753
852
  end
853
+
854
+ context "when guarding an environment" do
855
+ before :each do
856
+ Puppet[:environment_timeout] = 0
857
+ end
858
+
859
+ let(:name) { :an_environment }
860
+
861
+ def with_guard(cached, name, &block)
862
+ cached.guard(name)
863
+ begin
864
+ yield
865
+ ensure
866
+ cached.unguard(name)
867
+ end
868
+ end
869
+
870
+ it "evicts an expired and unguarded environment" do
871
+ with_environment_loaded(service) do |cached|
872
+ cached.get!(name)
873
+ end
874
+
875
+ expect(service.created_envs).to eq([name, name])
876
+ expect(service.evicted_envs).to eq([name])
877
+ end
878
+
879
+ it "does not evict an expired, but guarded environment" do
880
+ with_environment_loaded(service) do |cached|
881
+ with_guard(cached, name) do
882
+ cached.get!(name) # these shouldn't reload
883
+ cached.get!(name)
884
+ end
885
+ end
886
+
887
+ expect(service.created_envs).to eq([name])
888
+ expect(service.evicted_envs).to eq([])
889
+ end
890
+
891
+ it "does not evict an environment marked for expiration, but is guarded" do
892
+ Puppet[:environment_timeout] = 'unlimited'
893
+
894
+ expect(service).to receive(:expired?).never
895
+
896
+ with_environment_loaded(service) do |cached|
897
+ with_guard(cached, name) do
898
+ cached.get!(name)
899
+ end
900
+ end
901
+
902
+ expect(service.created_envs).to eq([name])
903
+ expect(service.evicted_envs).to eq([])
904
+ end
905
+
906
+ it "evicts an environment that is no longer guarded" do
907
+ with_environment_loaded(service) do |cached|
908
+ with_guard(cached, name) {}
909
+
910
+ cached.get!(name) # this reloads
911
+ end
912
+
913
+ expect(service.created_envs).to eq([name, name])
914
+ expect(service.evicted_envs).to eq([name])
915
+ end
916
+
917
+ it "can nest guards" do
918
+ with_environment_loaded(service) do |cached|
919
+ with_guard(cached, name) do
920
+ with_guard(cached, name) do
921
+ cached.get!(name) # doesn't reload
922
+ end
923
+ end
924
+ end
925
+
926
+ expect(service.created_envs).to eq([name])
927
+ expect(service.evicted_envs).to eq([])
928
+ end
929
+ end
754
930
  end
755
931
 
756
932
  context '#clear' do
@@ -763,6 +939,14 @@ config_version=$vardir/random/scripts
763
939
 
764
940
  expect(service.evicted_envs).to eq([:an_environment])
765
941
  end
942
+
943
+ it "normalizes environment name to symbol" do
944
+ with_environment_loaded(service) do |cached|
945
+ cached.clear('an_environment')
946
+ end
947
+
948
+ expect(service.evicted_envs).to eq([:an_environment])
949
+ end
766
950
  end
767
951
 
768
952
  context '#clear_all' do