puppet 6.22.1 → 6.25.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (415) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +5 -5
  3. data/Gemfile +2 -2
  4. data/Gemfile.lock +20 -20
  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/osx/puppet.plist +2 -0
  16. data/ext/project_data.yaml +1 -0
  17. data/lib/puppet/application/agent.rb +16 -5
  18. data/lib/puppet/application/apply.rb +22 -3
  19. data/lib/puppet/application/device.rb +2 -1
  20. data/lib/puppet/application/filebucket.rb +1 -0
  21. data/lib/puppet/application/resource.rb +32 -16
  22. data/lib/puppet/application/script.rb +2 -1
  23. data/lib/puppet/application/ssl.rb +1 -0
  24. data/lib/puppet/concurrent/thread_local_singleton.rb +1 -0
  25. data/lib/puppet/configurer/downloader.rb +2 -1
  26. data/lib/puppet/configurer.rb +144 -56
  27. data/lib/puppet/confine/variable.rb +1 -1
  28. data/lib/puppet/defaults.rb +47 -33
  29. data/lib/puppet/environments.rb +75 -25
  30. data/lib/puppet/face/facts.rb +1 -1
  31. data/lib/puppet/face/help/action.erb +1 -0
  32. data/lib/puppet/face/help/face.erb +1 -0
  33. data/lib/puppet/face/node/clean.rb +11 -0
  34. data/lib/puppet/facter_impl.rb +96 -0
  35. data/lib/puppet/file_serving/configuration/parser.rb +2 -0
  36. data/lib/puppet/file_serving/configuration.rb +3 -0
  37. data/lib/puppet/file_serving/fileset.rb +14 -2
  38. data/lib/puppet/file_serving/mount/file.rb +4 -4
  39. data/lib/puppet/file_serving/mount/scripts.rb +24 -0
  40. data/lib/puppet/file_system/file_impl.rb +3 -1
  41. data/lib/puppet/file_system/windows.rb +2 -2
  42. data/lib/puppet/forge.rb +4 -4
  43. data/lib/puppet/functions/all.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +1 -1
  45. data/lib/puppet/functions/capitalize.rb +2 -2
  46. data/lib/puppet/functions/downcase.rb +2 -2
  47. data/lib/puppet/functions/empty.rb +8 -0
  48. data/lib/puppet/functions/find_template.rb +2 -2
  49. data/lib/puppet/functions/get.rb +5 -5
  50. data/lib/puppet/functions/group_by.rb +13 -5
  51. data/lib/puppet/functions/lest.rb +1 -1
  52. data/lib/puppet/functions/new.rb +100 -100
  53. data/lib/puppet/functions/partition.rb +4 -4
  54. data/lib/puppet/functions/require.rb +5 -5
  55. data/lib/puppet/functions/sort.rb +3 -3
  56. data/lib/puppet/functions/strftime.rb +1 -0
  57. data/lib/puppet/functions/tree_each.rb +7 -9
  58. data/lib/puppet/functions/type.rb +4 -4
  59. data/lib/puppet/functions/unwrap.rb +17 -2
  60. data/lib/puppet/functions/upcase.rb +2 -2
  61. data/lib/puppet/http/client.rb +1 -1
  62. data/lib/puppet/http/redirector.rb +5 -0
  63. data/lib/puppet/http/resolver/server_list.rb +15 -4
  64. data/lib/puppet/http/service/compiler.rb +75 -1
  65. data/lib/puppet/http/service/file_server.rb +2 -1
  66. data/lib/puppet/indirector/catalog/compiler.rb +25 -6
  67. data/lib/puppet/indirector/catalog/rest.rb +1 -0
  68. data/lib/puppet/indirector/facts/facter.rb +6 -6
  69. data/lib/puppet/indirector/file_metadata/rest.rb +1 -0
  70. data/lib/puppet/indirector/indirection.rb +1 -1
  71. data/lib/puppet/indirector/resource/ral.rb +6 -1
  72. data/lib/puppet/indirector/terminus.rb +4 -0
  73. data/lib/puppet/interface/documentation.rb +1 -0
  74. data/lib/puppet/module/plan.rb +0 -1
  75. data/lib/puppet/module/task.rb +1 -1
  76. data/lib/puppet/module.rb +1 -0
  77. data/lib/puppet/module_tool/applications/installer.rb +12 -4
  78. data/lib/puppet/module_tool/applications/uninstaller.rb +1 -1
  79. data/lib/puppet/module_tool/applications/upgrader.rb +1 -1
  80. data/lib/puppet/module_tool/errors/shared.rb +17 -0
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/node/environment.rb +10 -11
  83. data/lib/puppet/pal/pal_impl.rb +1 -1
  84. data/lib/puppet/parser/functions/fqdn_rand.rb +14 -6
  85. data/lib/puppet/parser/resource.rb +1 -1
  86. data/lib/puppet/parser/scope.rb +1 -0
  87. data/lib/puppet/parser/templatewrapper.rb +1 -0
  88. data/lib/puppet/pops/evaluator/closure.rb +7 -5
  89. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -0
  90. data/lib/puppet/pops/lookup/lookup_adapter.rb +3 -2
  91. data/lib/puppet/pops/model/ast.rb +1 -0
  92. data/lib/puppet/pops/model/factory.rb +2 -1
  93. data/lib/puppet/pops/parser/eparser.rb +201 -201
  94. data/lib/puppet/pops/parser/lexer2.rb +92 -91
  95. data/lib/puppet/pops/parser/slurp_support.rb +1 -0
  96. data/lib/puppet/pops/serialization/to_data_converter.rb +18 -6
  97. data/lib/puppet/pops/serialization/to_stringified_converter.rb +1 -1
  98. data/lib/puppet/pops/types/p_sem_ver_type.rb +8 -2
  99. data/lib/puppet/pops/types/p_sensitive_type.rb +10 -0
  100. data/lib/puppet/pops/types/type_formatter.rb +4 -3
  101. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  102. data/lib/puppet/pops/types/types.rb +1 -1
  103. data/lib/puppet/provider/aix_object.rb +1 -1
  104. data/lib/puppet/provider/exec/posix.rb +16 -4
  105. data/lib/puppet/provider/group/groupadd.rb +5 -2
  106. data/lib/puppet/provider/package/nim.rb +11 -6
  107. data/lib/puppet/provider/package/pip.rb +15 -3
  108. data/lib/puppet/provider/package/pkg.rb +19 -2
  109. data/lib/puppet/provider/package/puppetserver_gem.rb +1 -1
  110. data/lib/puppet/provider/package/yum.rb +1 -1
  111. data/lib/puppet/provider/parsedfile.rb +3 -0
  112. data/lib/puppet/provider/service/base.rb +1 -1
  113. data/lib/puppet/provider/service/init.rb +5 -5
  114. data/lib/puppet/provider/service/launchd.rb +2 -2
  115. data/lib/puppet/provider/service/redhat.rb +1 -1
  116. data/lib/puppet/provider/service/smf.rb +3 -3
  117. data/lib/puppet/provider/service/systemd.rb +15 -5
  118. data/lib/puppet/provider/service/upstart.rb +5 -5
  119. data/lib/puppet/provider/service/windows.rb +38 -0
  120. data/lib/puppet/provider/user/aix.rb +44 -1
  121. data/lib/puppet/provider/user/directoryservice.rb +26 -13
  122. data/lib/puppet/provider/user/useradd.rb +72 -16
  123. data/lib/puppet/provider.rb +1 -1
  124. data/lib/puppet/reference/configuration.rb +1 -1
  125. data/lib/puppet/reference/providers.rb +2 -2
  126. data/lib/puppet/resource/catalog.rb +1 -1
  127. data/lib/puppet/resource/type_collection.rb +1 -0
  128. data/lib/puppet/resource.rb +38 -5
  129. data/lib/puppet/runtime.rb +11 -1
  130. data/lib/puppet/settings.rb +32 -9
  131. data/lib/puppet/test/test_helper.rb +4 -1
  132. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  133. data/lib/puppet/transaction/persistence.rb +11 -1
  134. data/lib/puppet/transaction/report.rb +15 -1
  135. data/lib/puppet/type/exec.rb +35 -5
  136. data/lib/puppet/type/file/mode.rb +6 -0
  137. data/lib/puppet/type/file/selcontext.rb +1 -1
  138. data/lib/puppet/type/file.rb +25 -7
  139. data/lib/puppet/type/filebucket.rb +3 -3
  140. data/lib/puppet/type/group.rb +0 -1
  141. data/lib/puppet/type/resources.rb +1 -1
  142. data/lib/puppet/type/service.rb +26 -41
  143. data/lib/puppet/type/tidy.rb +22 -3
  144. data/lib/puppet/type/user.rb +38 -21
  145. data/lib/puppet/type.rb +1 -1
  146. data/lib/puppet/util/command_line.rb +1 -1
  147. data/lib/puppet/util/filetype.rb +2 -2
  148. data/lib/puppet/util/json.rb +3 -0
  149. data/lib/puppet/util/log.rb +1 -2
  150. data/lib/puppet/util/logging.rb +1 -25
  151. data/lib/puppet/util/pidlock.rb +1 -1
  152. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  153. data/lib/puppet/util/selinux.rb +30 -4
  154. data/lib/puppet/util/suidmanager.rb +1 -2
  155. data/lib/puppet/util/symbolic_file_mode.rb +29 -17
  156. data/lib/puppet/util/tagging.rb +1 -0
  157. data/lib/puppet/util/windows/service.rb +0 -5
  158. data/lib/puppet/util/windows/sid.rb +3 -1
  159. data/lib/puppet/util/windows/user.rb +0 -2
  160. data/lib/puppet/util/windows.rb +3 -0
  161. data/lib/puppet/util.rb +4 -3
  162. data/lib/puppet/version.rb +1 -1
  163. data/lib/puppet.rb +5 -9
  164. data/locales/puppet.pot +408 -364
  165. data/man/man5/puppet.conf.5 +303 -275
  166. data/man/man8/puppet-agent.8 +4 -1
  167. data/man/man8/puppet-apply.8 +1 -1
  168. data/man/man8/puppet-catalog.8 +9 -9
  169. data/man/man8/puppet-config.8 +1 -1
  170. data/man/man8/puppet-describe.8 +1 -1
  171. data/man/man8/puppet-device.8 +1 -1
  172. data/man/man8/puppet-doc.8 +1 -1
  173. data/man/man8/puppet-epp.8 +1 -1
  174. data/man/man8/puppet-facts.8 +8 -8
  175. data/man/man8/puppet-filebucket.8 +1 -1
  176. data/man/man8/puppet-generate.8 +1 -1
  177. data/man/man8/puppet-help.8 +1 -1
  178. data/man/man8/puppet-key.8 +7 -7
  179. data/man/man8/puppet-lookup.8 +1 -1
  180. data/man/man8/puppet-man.8 +1 -1
  181. data/man/man8/puppet-module.8 +3 -3
  182. data/man/man8/puppet-node.8 +5 -5
  183. data/man/man8/puppet-parser.8 +1 -1
  184. data/man/man8/puppet-plugin.8 +1 -1
  185. data/man/man8/puppet-report.8 +5 -5
  186. data/man/man8/puppet-resource.8 +1 -1
  187. data/man/man8/puppet-script.8 +1 -1
  188. data/man/man8/puppet-ssl.8 +1 -1
  189. data/man/man8/puppet-status.8 +4 -4
  190. data/man/man8/puppet.8 +2 -2
  191. data/spec/fixtures/integration/application/agent/cached_deferred_catalog.json +2 -1
  192. data/spec/fixtures/integration/application/agent/lib/facter/agent_spec_role.rb +3 -0
  193. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Gemfile +4 -0
  194. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/Rakefile +3 -0
  195. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/lib/puppet/functions/l10n.rb +8 -0
  196. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/config.yaml +25 -0
  197. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/ja/puppet-l10n.po +19 -0
  198. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/locales/puppet-l10n.pot +20 -0
  199. data/spec/fixtures/integration/l10n/envs/prod/modules/demo/metadata.json +8 -0
  200. data/spec/fixtures/ssl/127.0.0.1-key.pem +107 -57
  201. data/spec/fixtures/ssl/127.0.0.1.pem +52 -31
  202. data/spec/fixtures/ssl/bad-basic-constraints.pem +57 -35
  203. data/spec/fixtures/ssl/bad-int-basic-constraints.pem +57 -35
  204. data/spec/fixtures/ssl/ca.pem +57 -35
  205. data/spec/fixtures/ssl/crl.pem +28 -18
  206. data/spec/fixtures/ssl/ec-key.pem +11 -11
  207. data/spec/fixtures/ssl/ec.pem +33 -24
  208. data/spec/fixtures/ssl/encrypted-ec-key.pem +12 -12
  209. data/spec/fixtures/ssl/encrypted-key.pem +108 -58
  210. data/spec/fixtures/ssl/intermediate-agent-crl.pem +28 -19
  211. data/spec/fixtures/ssl/intermediate-agent.pem +57 -36
  212. data/spec/fixtures/ssl/intermediate-crl.pem +31 -21
  213. data/spec/fixtures/ssl/intermediate.pem +57 -36
  214. data/spec/fixtures/ssl/oid-key.pem +117 -0
  215. data/spec/fixtures/ssl/oid.pem +69 -0
  216. data/spec/fixtures/ssl/pluto-key.pem +107 -57
  217. data/spec/fixtures/ssl/pluto.pem +52 -30
  218. data/spec/fixtures/ssl/request-key.pem +107 -57
  219. data/spec/fixtures/ssl/request.pem +47 -26
  220. data/spec/fixtures/ssl/revoked-key.pem +107 -57
  221. data/spec/fixtures/ssl/revoked.pem +52 -30
  222. data/spec/fixtures/ssl/signed-key.pem +107 -57
  223. data/spec/fixtures/ssl/signed.pem +52 -30
  224. data/spec/fixtures/ssl/tampered-cert.pem +52 -30
  225. data/spec/fixtures/ssl/tampered-csr.pem +47 -26
  226. data/spec/fixtures/ssl/trusted_oid_mapping.yaml +5 -0
  227. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +107 -57
  228. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +50 -29
  229. data/spec/fixtures/ssl/unknown-ca-key.pem +107 -57
  230. data/spec/fixtures/ssl/unknown-ca.pem +55 -33
  231. data/spec/integration/application/agent_spec.rb +141 -37
  232. data/spec/integration/application/filebucket_spec.rb +16 -0
  233. data/spec/integration/application/module_spec.rb +21 -0
  234. data/spec/integration/application/resource_spec.rb +64 -0
  235. data/spec/integration/application/ssl_spec.rb +20 -0
  236. data/spec/integration/configurer_spec.rb +18 -2
  237. data/spec/integration/environments/settings_interpolation_spec.rb +0 -4
  238. data/spec/integration/indirector/facts/facter_spec.rb +93 -39
  239. data/spec/integration/l10n/compiler_spec.rb +37 -0
  240. data/spec/integration/parser/pcore_resource_spec.rb +10 -0
  241. data/spec/integration/transaction/report_spec.rb +1 -1
  242. data/spec/integration/type/exec_spec.rb +70 -45
  243. data/spec/integration/type/file_spec.rb +2 -2
  244. data/spec/integration/type/package_spec.rb +6 -6
  245. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  246. data/spec/integration/util/windows/process_spec.rb +1 -9
  247. data/spec/lib/puppet/test_ca.rb +7 -2
  248. data/spec/lib/puppet_spec/modules.rb +13 -2
  249. data/spec/lib/puppet_spec/puppetserver.rb +15 -0
  250. data/spec/lib/puppet_spec/settings.rb +1 -0
  251. data/spec/shared_behaviours/documentation_on_faces.rb +0 -2
  252. data/spec/shared_contexts/l10n.rb +27 -0
  253. data/spec/spec_helper.rb +1 -10
  254. data/spec/unit/application/agent_spec.rb +7 -2
  255. data/spec/unit/application/apply_spec.rb +76 -56
  256. data/spec/unit/application/resource_spec.rb +29 -0
  257. data/spec/unit/configurer/downloader_spec.rb +6 -0
  258. data/spec/unit/configurer_spec.rb +256 -57
  259. data/spec/unit/defaults_spec.rb +1 -0
  260. data/spec/unit/environments_spec.rb +184 -0
  261. data/spec/unit/facter_impl_spec.rb +31 -0
  262. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  263. data/spec/unit/file_serving/configuration/parser_spec.rb +23 -0
  264. data/spec/unit/file_serving/configuration_spec.rb +14 -4
  265. data/spec/unit/file_serving/fileset_spec.rb +60 -0
  266. data/spec/unit/file_serving/mount/scripts_spec.rb +69 -0
  267. data/spec/unit/file_system_spec.rb +13 -0
  268. data/spec/unit/functions/assert_type_spec.rb +1 -1
  269. data/spec/unit/functions/empty_spec.rb +10 -0
  270. data/spec/unit/functions/logging_spec.rb +1 -0
  271. data/spec/unit/functions/lookup_spec.rb +64 -0
  272. data/spec/unit/functions/unwrap_spec.rb +8 -0
  273. data/spec/unit/functions4_spec.rb +2 -2
  274. data/spec/unit/gettext/config_spec.rb +12 -0
  275. data/spec/unit/http/client_spec.rb +58 -1
  276. data/spec/unit/http/service/compiler_spec.rb +131 -0
  277. data/spec/unit/indirector/catalog/compiler_spec.rb +101 -10
  278. data/spec/unit/indirector/catalog/rest_spec.rb +8 -0
  279. data/spec/unit/indirector/indirection_spec.rb +10 -3
  280. data/spec/unit/indirector/resource/ral_spec.rb +40 -75
  281. data/spec/unit/interface/action_spec.rb +0 -9
  282. data/spec/unit/module_spec.rb +15 -1
  283. data/spec/unit/module_tool/applications/installer_spec.rb +51 -12
  284. data/spec/unit/network/authstore_spec.rb +0 -15
  285. data/spec/unit/network/formats_spec.rb +6 -0
  286. data/spec/unit/parser/functions/fqdn_rand_spec.rb +15 -1
  287. data/spec/unit/parser/templatewrapper_spec.rb +12 -2
  288. data/spec/unit/pops/parser/parse_containers_spec.rb +0 -11
  289. data/spec/unit/pops/serialization/to_from_hr_spec.rb +58 -0
  290. data/spec/unit/pops/serialization/to_stringified_spec.rb +5 -0
  291. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +18 -0
  292. data/spec/unit/pops/types/p_sensitive_type_spec.rb +18 -0
  293. data/spec/unit/pops/types/type_calculator_spec.rb +6 -0
  294. data/spec/unit/provider/package/gem_spec.rb +1 -1
  295. data/spec/unit/provider/package/nim_spec.rb +42 -0
  296. data/spec/unit/provider/package/pip2_spec.rb +1 -1
  297. data/spec/unit/provider/package/pip3_spec.rb +1 -1
  298. data/spec/unit/provider/package/pip_spec.rb +38 -1
  299. data/spec/unit/provider/package/pkg_spec.rb +29 -4
  300. data/spec/unit/provider/package/puppet_gem_spec.rb +1 -1
  301. data/spec/unit/provider/package/puppetserver_gem_spec.rb +1 -1
  302. data/spec/unit/provider/parsedfile_spec.rb +10 -0
  303. data/spec/unit/provider/service/init_spec.rb +1 -0
  304. data/spec/unit/provider/service/launchd_spec.rb +11 -0
  305. data/spec/unit/provider/service/openwrt_spec.rb +3 -1
  306. data/spec/unit/provider/service/systemd_spec.rb +43 -9
  307. data/spec/unit/provider/service/windows_spec.rb +202 -0
  308. data/spec/unit/provider/user/aix_spec.rb +100 -0
  309. data/spec/unit/provider/user/directoryservice_spec.rb +68 -36
  310. data/spec/unit/provider/user/useradd_spec.rb +43 -2
  311. data/spec/unit/provider_spec.rb +4 -4
  312. data/spec/unit/puppet_spec.rb +12 -4
  313. data/spec/unit/resource/catalog_spec.rb +14 -1
  314. data/spec/unit/resource_spec.rb +58 -2
  315. data/spec/unit/settings_spec.rb +97 -56
  316. data/spec/unit/ssl/certificate_request_spec.rb +8 -14
  317. data/spec/unit/ssl/state_machine_spec.rb +19 -5
  318. data/spec/unit/transaction/additional_resource_generator_spec.rb +0 -2
  319. data/spec/unit/transaction_spec.rb +18 -20
  320. data/spec/unit/type/exec_spec.rb +76 -29
  321. data/spec/unit/type/file/selinux_spec.rb +3 -3
  322. data/spec/unit/type/file/source_spec.rb +4 -4
  323. data/spec/unit/type/service_spec.rb +86 -188
  324. data/spec/unit/type/tidy_spec.rb +24 -7
  325. data/spec/unit/type/user_spec.rb +45 -0
  326. data/spec/unit/type_spec.rb +2 -2
  327. data/spec/unit/util/logging_spec.rb +2 -0
  328. data/spec/unit/util/selinux_spec.rb +87 -16
  329. data/spec/unit/util/windows/sid_spec.rb +39 -4
  330. data/tasks/generate_cert_fixtures.rake +12 -3
  331. data/tasks/parallel.rake +3 -3
  332. metadata +49 -95
  333. data/ext/README.environment +0 -8
  334. data/ext/dbfix.sql +0 -132
  335. data/ext/debian/README.Debian +0 -8
  336. data/ext/debian/README.source +0 -2
  337. data/ext/debian/TODO.Debian +0 -1
  338. data/ext/debian/changelog.erb +0 -1122
  339. data/ext/debian/compat +0 -1
  340. data/ext/debian/control +0 -144
  341. data/ext/debian/copyright +0 -339
  342. data/ext/debian/docs +0 -1
  343. data/ext/debian/fileserver.conf +0 -41
  344. data/ext/debian/puppet-common.dirs +0 -13
  345. data/ext/debian/puppet-common.install +0 -3
  346. data/ext/debian/puppet-common.lintian-overrides +0 -5
  347. data/ext/debian/puppet-common.manpages +0 -28
  348. data/ext/debian/puppet-common.postinst +0 -35
  349. data/ext/debian/puppet-common.postrm +0 -33
  350. data/ext/debian/puppet-el.dirs +0 -1
  351. data/ext/debian/puppet-el.emacsen-install +0 -25
  352. data/ext/debian/puppet-el.emacsen-remove +0 -11
  353. data/ext/debian/puppet-el.emacsen-startup +0 -9
  354. data/ext/debian/puppet-el.install +0 -1
  355. data/ext/debian/puppet-testsuite.install +0 -2
  356. data/ext/debian/puppet-testsuite.lintian-overrides +0 -4
  357. data/ext/debian/puppet.lintian-overrides +0 -3
  358. data/ext/debian/puppet.logrotate +0 -20
  359. data/ext/debian/puppet.postinst +0 -20
  360. data/ext/debian/puppet.postrm +0 -20
  361. data/ext/debian/puppet.preinst +0 -20
  362. data/ext/debian/puppetmaster-common.install +0 -2
  363. data/ext/debian/puppetmaster-common.manpages +0 -2
  364. data/ext/debian/puppetmaster-common.postinst +0 -6
  365. data/ext/debian/puppetmaster-passenger.dirs +0 -4
  366. data/ext/debian/puppetmaster-passenger.postinst +0 -162
  367. data/ext/debian/puppetmaster-passenger.postrm +0 -61
  368. data/ext/debian/puppetmaster.README.debian +0 -17
  369. data/ext/debian/puppetmaster.default +0 -14
  370. data/ext/debian/puppetmaster.init +0 -137
  371. data/ext/debian/puppetmaster.lintian-overrides +0 -3
  372. data/ext/debian/puppetmaster.postinst +0 -20
  373. data/ext/debian/puppetmaster.postrm +0 -5
  374. data/ext/debian/puppetmaster.preinst +0 -22
  375. data/ext/debian/rules +0 -132
  376. data/ext/debian/source/format +0 -1
  377. data/ext/debian/source/options +0 -1
  378. data/ext/debian/vim-puppet.README.Debian +0 -13
  379. data/ext/debian/vim-puppet.dirs +0 -5
  380. data/ext/debian/vim-puppet.yaml +0 -7
  381. data/ext/debian/watch +0 -2
  382. data/ext/freebsd/puppetd +0 -26
  383. data/ext/freebsd/puppetmasterd +0 -26
  384. data/ext/gentoo/conf.d/puppet +0 -5
  385. data/ext/gentoo/conf.d/puppetmaster +0 -12
  386. data/ext/gentoo/init.d/puppet +0 -38
  387. data/ext/gentoo/init.d/puppetmaster +0 -51
  388. data/ext/gentoo/puppet/fileserver.conf +0 -41
  389. data/ext/ips/puppet-agent +0 -44
  390. data/ext/ips/puppet-master +0 -44
  391. data/ext/ips/puppet.p5m.erb +0 -12
  392. data/ext/ips/puppetagent.xml +0 -42
  393. data/ext/ips/puppetmaster.xml +0 -42
  394. data/ext/ips/rules +0 -19
  395. data/ext/ips/transforms +0 -34
  396. data/ext/ldap/puppet.schema +0 -24
  397. data/ext/logcheck/puppet +0 -23
  398. data/ext/osx/file_mapping.yaml +0 -33
  399. data/ext/osx/postflight.erb +0 -109
  400. data/ext/osx/preflight.erb +0 -52
  401. data/ext/osx/prototype.plist.erb +0 -38
  402. data/ext/redhat/fileserver.conf +0 -41
  403. data/ext/redhat/logrotate +0 -21
  404. data/ext/redhat/puppet.spec.erb +0 -842
  405. data/ext/redhat/server.init +0 -128
  406. data/ext/redhat/server.sysconfig +0 -13
  407. data/ext/solaris/pkginfo +0 -6
  408. data/ext/solaris/smf/puppetd.xml +0 -77
  409. data/ext/solaris/smf/puppetmasterd.xml +0 -77
  410. data/ext/solaris/smf/svc-puppetd +0 -71
  411. data/ext/solaris/smf/svc-puppetmasterd +0 -67
  412. data/ext/suse/puppet.spec +0 -310
  413. data/ext/suse/server.init +0 -173
  414. data/ext/yaml_nodes.rb +0 -105
  415. 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
 
@@ -1072,6 +1074,29 @@ describe Puppet::Configurer do
1072
1074
  }.to raise_error(Puppet::Error, /Could not select a functional puppet server from server_list: 'myserver:123,someotherservername'/)
1073
1075
  end
1074
1076
 
1077
+ it "should warn when servers in 'server_list' are unreachable" do
1078
+ Puppet.settings[:server_list] = "mybadserver1:123,mybadserver2:123,mygoodserver"
1079
+ Puppet[:usecacheonfailure] = false
1080
+
1081
+ stub_request(:get, 'https://mybadserver1:123/status/v1/simple/master').and_raise(Puppet::HTTP::HTTPError)
1082
+ stub_request(:get, 'https://mybadserver2:123/status/v1/simple/master').and_raise(Puppet::HTTP::HTTPError)
1083
+ stub_request(:get, 'https://mygoodserver:8140/status/v1/simple/master').to_return(status: 200)
1084
+
1085
+ expect(Puppet).to receive(:warning).with(/^Unable to connect to server from server_list setting:.*Trying with next server from server_list.$/).twice
1086
+ configurer.run
1087
+ end
1088
+
1089
+ it "should warn when servers in 'server_list' respond with error" do
1090
+ Puppet.settings[:server_list] = "mybadserver:123,someotherservername"
1091
+ Puppet[:usecacheonfailure] = false
1092
+
1093
+ stub_request(:get, 'https://mybadserver:123/status/v1/simple/master').to_return(status: 400)
1094
+ stub_request(:get, 'https://someotherservername:8140/status/v1/simple/master').to_return(status: 200)
1095
+
1096
+ expect(Puppet).to receive(:warning).with(/^Puppet server mybadserver:123 is unavailable: 400 Trying with next server from server_list.$/)
1097
+ configurer.run
1098
+ end
1099
+
1075
1100
  it "should not error when usecacheonfailure is true and no servers in 'server_list' are reachable" do
1076
1101
  Puppet.settings[:server_list] = "myserver:123,someotherservername"
1077
1102
  Puppet[:usecacheonfailure] = true
@@ -1084,20 +1109,194 @@ describe Puppet::Configurer do
1084
1109
  expect(configurer.run(options)).to eq(0)
1085
1110
  expect(options[:report].server_used).to be_nil
1086
1111
  end
1112
+ end
1087
1113
 
1088
- it "should not make multiple node requests when the server is found" do
1089
- Puppet.settings[:server_list] = ["myserver:123"]
1114
+ describe "when selecting an environment" do
1115
+ include PuppetSpec::Settings
1090
1116
 
1091
- Puppet::Node.indirection.terminus_class = :rest
1092
- Puppet::Resource::Catalog.indirection.terminus_class = :rest
1117
+ describe "when the last used environment is available" do
1118
+ let(:last_server_specified_environment) { 'development' }
1093
1119
 
1094
- stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 200)
1095
- stub_request(:post, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
1096
- 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
1097
1131
 
1098
- configurer.run
1132
+ expect(Puppet::Node.indirection).not_to receive(:find)
1133
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1134
+ end
1099
1135
 
1100
- expect(node_request).to have_been_requested.once
1136
+ it "prefers the environment set via cli" do
1137
+ Puppet.settings.handlearg('--environment', 'usethis')
1138
+ configurer.run
1139
+
1140
+ expect(configurer.environment).to eq('usethis')
1141
+ end
1142
+
1143
+ it "prefers the environment set via lastrunfile over config" do
1144
+ FileUtils.mkdir_p(Puppet[:confdir])
1145
+ set_puppet_conf(Puppet[:confdir], <<~CONF)
1146
+ [main]
1147
+ environment = usethis
1148
+ lastrunfile = #{Puppet[:lastrunfile]}
1149
+ CONF
1150
+
1151
+ Puppet.initialize_settings
1152
+ configurer.run
1153
+
1154
+ expect(configurer.environment).to eq(last_server_specified_environment)
1155
+ end
1156
+
1157
+ it "uses the environment from Puppet[:environment] if given a catalog" do
1158
+ configurer.run(catalog: catalog)
1159
+
1160
+ expect(configurer.environment).to eq(Puppet[:environment])
1161
+ end
1162
+
1163
+ it "uses the environment from Puppet[:environment] if use_cached_catalog = true" do
1164
+ Puppet[:use_cached_catalog] = true
1165
+ expects_cached_catalog_only(catalog)
1166
+ configurer.run
1167
+
1168
+ expect(configurer.environment).to eq(Puppet[:environment])
1169
+ end
1170
+
1171
+ describe "when the environment is not set via CLI" do
1172
+ it "uses the environment found in lastrunfile if the key exists" do
1173
+ configurer.run
1174
+
1175
+ expect(configurer.environment).to eq(last_server_specified_environment)
1176
+ end
1177
+
1178
+ it "pushes the converged environment found in lastrunfile over the existing context" do
1179
+ initial_env = Puppet::Node::Environment.remote('production')
1180
+ Puppet.push_context(
1181
+ current_environment: initial_env,
1182
+ loaders: Puppet::Pops::Loaders.new(initial_env, true))
1183
+
1184
+ expect(Puppet).to receive(:push_context).with(
1185
+ hash_including(:current_environment, :loaders),
1186
+ "Local node environment #{last_server_specified_environment} for configurer transaction"
1187
+ ).once.and_call_original
1188
+
1189
+ configurer.run
1190
+ end
1191
+
1192
+ it "uses the environment from Puppet[:environment] if strict_environment_mode is set" do
1193
+ Puppet[:strict_environment_mode] = true
1194
+ configurer.run
1195
+
1196
+ expect(configurer.environment).to eq(Puppet[:environment])
1197
+ end
1198
+
1199
+ it "uses the environment from Puppet[:environment] if initial_environment is the same as converged_environment" do
1200
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1201
+ ---
1202
+ version:
1203
+ config: 1624882680
1204
+ puppet: 6.24.0
1205
+ application:
1206
+ initial_environment: development
1207
+ converged_environment: development
1208
+ run_mode: agent
1209
+ SUMMARY
1210
+ configurer.run
1211
+
1212
+ expect(configurer.environment).to eq(Puppet[:environment])
1213
+ end
1214
+ end
1215
+ end
1216
+
1217
+ describe "when the last used environment is not available" do
1218
+ describe "when the node request succeeds" do
1219
+ let(:node_environment) { Puppet::Node::Environment.remote(:salam) }
1220
+ let(:node) { Puppet::Node.new(Puppet[:node_name_value]) }
1221
+ let(:last_server_specified_environment) { 'development' }
1222
+
1223
+ before do
1224
+ node.environment = node_environment
1225
+
1226
+ allow(Puppet::Node.indirection).to receive(:find)
1227
+ allow(Puppet::Node.indirection).to receive(:find)
1228
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1229
+ .and_return(node)
1230
+ end
1231
+
1232
+ it "uses the environment from the node request if the run mode doesn't match" do
1233
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1234
+ ---
1235
+ version:
1236
+ config: 1624882680
1237
+ puppet: 6.24.0
1238
+ application:
1239
+ initial_environment: #{Puppet[:environment]}
1240
+ converged_environment: #{last_server_specified_environment}
1241
+ run_mode: user
1242
+ SUMMARY
1243
+ configurer.run
1244
+
1245
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1246
+ end
1247
+
1248
+ it "uses the environment from the node request if lastrunfile does not contain the expected keys" do
1249
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1250
+ ---
1251
+ version:
1252
+ config: 1624882680
1253
+ puppet: 6.24.0
1254
+ SUMMARY
1255
+ configurer.run
1256
+
1257
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1258
+ end
1259
+
1260
+ it "uses the environment from the node request if lastrunfile is invalid YAML" do
1261
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', <<~SUMMARY)
1262
+ Key: 'this is my very very very ' +
1263
+ 'long string'
1264
+ SUMMARY
1265
+ configurer.run
1266
+
1267
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1268
+ end
1269
+
1270
+ it "uses the environment from the node request if lastrunfile exists but is empty" do
1271
+ Puppet[:lastrunfile] = file_containing('last_run_summary.yaml', '')
1272
+ configurer.run
1273
+
1274
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1275
+ end
1276
+
1277
+ it "uses the environment from the node request if the last used one cannot be found" do
1278
+ Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
1279
+ configurer.run
1280
+
1281
+ expect(configurer.environment).to eq(node_environment.name.to_s)
1282
+ end
1283
+ end
1284
+
1285
+ describe "when the node request fails" do
1286
+ before do
1287
+ allow(Puppet::Node.indirection).to receive(:find).and_call_original
1288
+ allow(Puppet::Node.indirection).to receive(:find)
1289
+ .with(anything, hash_including(:ignore_cache => true, :fail_on_404 => true))
1290
+ .and_raise(Puppet::Error)
1291
+ end
1292
+
1293
+ it "uses the environment from Puppet[:environment] if the last used one cannot be found" do
1294
+ Puppet[:lastrunfile] = tmpfile('last_run_summary.yaml')
1295
+ configurer.run
1296
+
1297
+ expect(configurer.environment).to eq(Puppet[:environment])
1298
+ end
1299
+ end
1101
1300
  end
1102
1301
  end
1103
1302
  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