puppet 6.13.0 → 6.18.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 (461) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +2 -7
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +4 -2
  5. data/Gemfile.lock +36 -32
  6. data/README.md +17 -24
  7. data/ext/windows/service/daemon.rb +3 -3
  8. data/lib/puppet.rb +33 -9
  9. data/lib/puppet/agent.rb +20 -14
  10. data/lib/puppet/application/agent.rb +26 -17
  11. data/lib/puppet/application/apply.rb +18 -20
  12. data/lib/puppet/application/describe.rb +7 -5
  13. data/lib/puppet/application/device.rb +2 -2
  14. data/lib/puppet/application/filebucket.rb +19 -15
  15. data/lib/puppet/application/lookup.rb +16 -4
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +58 -57
  19. data/lib/puppet/configurer/downloader.rb +31 -10
  20. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  21. data/lib/puppet/confine.rb +2 -2
  22. data/lib/puppet/confine/any.rb +1 -1
  23. data/lib/puppet/context/trusted_information.rb +14 -8
  24. data/lib/puppet/daemon.rb +13 -27
  25. data/lib/puppet/defaults.rb +92 -12
  26. data/lib/puppet/environments.rb +4 -5
  27. data/lib/puppet/face/facts.rb +1 -1
  28. data/lib/puppet/face/help.rb +29 -3
  29. data/lib/puppet/face/module/search.rb +5 -0
  30. data/lib/puppet/face/plugin.rb +2 -2
  31. data/lib/puppet/feature/base.rb +1 -1
  32. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  33. data/lib/puppet/file_serving/metadata.rb +4 -1
  34. data/lib/puppet/file_serving/mount/locales.rb +1 -2
  35. data/lib/puppet/file_serving/mount/pluginfacts.rb +1 -2
  36. data/lib/puppet/file_serving/mount/plugins.rb +1 -2
  37. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  38. data/lib/puppet/file_system/file_impl.rb +17 -13
  39. data/lib/puppet/file_system/uniquefile.rb +12 -16
  40. data/lib/puppet/forge.rb +1 -1
  41. data/lib/puppet/forge/cache.rb +1 -1
  42. data/lib/puppet/forge/repository.rb +4 -7
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  45. data/lib/puppet/functions/filter.rb +1 -0
  46. data/lib/puppet/functions/lstrip.rb +4 -4
  47. data/lib/puppet/functions/reduce.rb +2 -4
  48. data/lib/puppet/functions/reverse_each.rb +1 -1
  49. data/lib/puppet/functions/rstrip.rb +4 -4
  50. data/lib/puppet/functions/step.rb +1 -1
  51. data/lib/puppet/functions/strip.rb +4 -4
  52. data/lib/puppet/gettext/config.rb +5 -5
  53. data/lib/puppet/gettext/module_translations.rb +4 -4
  54. data/lib/puppet/http.rb +3 -0
  55. data/lib/puppet/http/client.rb +263 -73
  56. data/lib/puppet/http/external_client.rb +90 -0
  57. data/lib/puppet/http/redirector.rb +43 -7
  58. data/lib/puppet/http/resolver.rb +46 -3
  59. data/lib/puppet/http/resolver/server_list.rb +76 -16
  60. data/lib/puppet/http/resolver/settings.rb +23 -3
  61. data/lib/puppet/http/resolver/srv.rb +29 -3
  62. data/lib/puppet/http/response.rb +87 -1
  63. data/lib/puppet/http/retry_after_handler.rb +39 -0
  64. data/lib/puppet/http/service.rb +97 -12
  65. data/lib/puppet/http/service/ca.rb +76 -14
  66. data/lib/puppet/http/service/compiler.rb +249 -16
  67. data/lib/puppet/http/service/file_server.rb +141 -20
  68. data/lib/puppet/http/service/report.rb +47 -17
  69. data/lib/puppet/http/session.rb +96 -7
  70. data/lib/puppet/indirector.rb +1 -1
  71. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  72. data/lib/puppet/indirector/exec.rb +1 -1
  73. data/lib/puppet/indirector/facts/facter.rb +3 -3
  74. data/lib/puppet/indirector/facts/rest.rb +42 -0
  75. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  76. data/lib/puppet/indirector/file_content/http.rb +5 -0
  77. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  78. data/lib/puppet/indirector/file_metadata/http.rb +28 -8
  79. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  80. data/lib/puppet/indirector/hiera.rb +4 -0
  81. data/lib/puppet/indirector/indirection.rb +1 -1
  82. data/lib/puppet/indirector/node/rest.rb +24 -0
  83. data/lib/puppet/indirector/report/processor.rb +2 -2
  84. data/lib/puppet/indirector/report/rest.rb +19 -0
  85. data/lib/puppet/indirector/report/yaml.rb +23 -0
  86. data/lib/puppet/indirector/request.rb +1 -1
  87. data/lib/puppet/indirector/rest.rb +12 -0
  88. data/lib/puppet/indirector/status/rest.rb +18 -0
  89. data/lib/puppet/loaders.rb +6 -0
  90. data/lib/puppet/metatype/manager.rb +80 -80
  91. data/lib/puppet/module.rb +1 -2
  92. data/lib/puppet/network/format_support.rb +2 -2
  93. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  94. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  95. data/lib/puppet/network/http/base_pool.rb +7 -2
  96. data/lib/puppet/network/http/compression.rb +7 -0
  97. data/lib/puppet/network/http/connection.rb +2 -0
  98. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  99. data/lib/puppet/network/http/nocache_pool.rb +1 -0
  100. data/lib/puppet/network/http/pool.rb +8 -5
  101. data/lib/puppet/network/http/route.rb +2 -2
  102. data/lib/puppet/network/http_pool.rb +2 -1
  103. data/lib/puppet/node/environment.rb +22 -5
  104. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  105. data/lib/puppet/pal/pal_impl.rb +30 -31
  106. data/lib/puppet/parameter.rb +1 -1
  107. data/lib/puppet/parser/ast/leaf.rb +5 -5
  108. data/lib/puppet/parser/ast/pops_bridge.rb +0 -4
  109. data/lib/puppet/parser/compiler.rb +43 -33
  110. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  111. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  112. data/lib/puppet/parser/environment_compiler.rb +4 -1
  113. data/lib/puppet/parser/functions.rb +18 -9
  114. data/lib/puppet/parser/functions/create_resources.rb +11 -7
  115. data/lib/puppet/parser/functions/filter.rb +1 -0
  116. data/lib/puppet/parser/resource.rb +3 -2
  117. data/lib/puppet/parser/resource/param.rb +6 -0
  118. data/lib/puppet/parser/type_loader.rb +2 -2
  119. data/lib/puppet/pops/adaptable.rb +7 -13
  120. data/lib/puppet/pops/adapters.rb +8 -4
  121. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  122. data/lib/puppet/pops/issues.rb +5 -0
  123. data/lib/puppet/pops/loader/runtime3_type_loader.rb +4 -2
  124. data/lib/puppet/pops/loaders.rb +24 -15
  125. data/lib/puppet/pops/lookup/context.rb +1 -1
  126. data/lib/puppet/pops/lookup/hiera_config.rb +14 -1
  127. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  128. data/lib/puppet/pops/types/iterable.rb +34 -8
  129. data/lib/puppet/pops/validation/checker4_0.rb +29 -15
  130. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  131. data/lib/puppet/provider/file/windows.rb +1 -1
  132. data/lib/puppet/provider/group/groupadd.rb +9 -4
  133. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  134. data/lib/puppet/provider/package/aix.rb +17 -2
  135. data/lib/puppet/provider/package/apt.rb +98 -1
  136. data/lib/puppet/provider/package/aptitude.rb +1 -1
  137. data/lib/puppet/provider/package/dnfmodule.rb +61 -14
  138. data/lib/puppet/provider/package/gem.rb +45 -9
  139. data/lib/puppet/provider/package/pacman.rb +2 -5
  140. data/lib/puppet/provider/package/pip.rb +143 -48
  141. data/lib/puppet/provider/package/pip3.rb +0 -2
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +16 -4
  144. data/lib/puppet/provider/package/portage.rb +2 -2
  145. data/lib/puppet/provider/package/puppet_gem.rb +11 -2
  146. data/lib/puppet/provider/package/rpm.rb +6 -213
  147. data/lib/puppet/provider/package/yum.rb +100 -20
  148. data/lib/puppet/provider/package/zypper.rb +62 -1
  149. data/lib/puppet/provider/service/systemd.rb +22 -4
  150. data/lib/puppet/provider/service/windows.rb +23 -7
  151. data/lib/puppet/provider/user/aix.rb +1 -1
  152. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  153. data/lib/puppet/provider/user/useradd.rb +16 -5
  154. data/lib/puppet/provider/user/windows_adsi.rb +18 -1
  155. data/lib/puppet/reports/http.rb +15 -9
  156. data/lib/puppet/resource.rb +2 -1
  157. data/lib/puppet/resource/type.rb +8 -0
  158. data/lib/puppet/resource/type_collection.rb +20 -16
  159. data/lib/puppet/runtime.rb +31 -1
  160. data/lib/puppet/settings.rb +3 -1
  161. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  162. data/lib/puppet/ssl.rb +1 -0
  163. data/lib/puppet/ssl/host.rb +4 -4
  164. data/lib/puppet/ssl/oids.rb +1 -0
  165. data/lib/puppet/ssl/ssl_context.rb +2 -2
  166. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  167. data/lib/puppet/ssl/state_machine.rb +81 -35
  168. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  169. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  170. data/lib/puppet/test/test_helper.rb +21 -14
  171. data/lib/puppet/transaction.rb +2 -2
  172. data/lib/puppet/transaction/persistence.rb +1 -1
  173. data/lib/puppet/transaction/report.rb +3 -3
  174. data/lib/puppet/trusted_external.rb +29 -1
  175. data/lib/puppet/type.rb +21 -8
  176. data/lib/puppet/type/file.rb +51 -13
  177. data/lib/puppet/type/file/checksum.rb +4 -4
  178. data/lib/puppet/type/file/source.rb +75 -64
  179. data/lib/puppet/type/notify.rb +2 -2
  180. data/lib/puppet/type/package.rb +41 -3
  181. data/lib/puppet/type/service.rb +59 -8
  182. data/lib/puppet/type/user.rb +19 -29
  183. data/lib/puppet/util.rb +41 -3
  184. data/lib/puppet/util/at_fork.rb +1 -1
  185. data/lib/puppet/util/autoload.rb +13 -25
  186. data/lib/puppet/util/character_encoding.rb +9 -5
  187. data/lib/puppet/util/checksums.rb +19 -4
  188. data/lib/puppet/util/execution.rb +2 -2
  189. data/lib/puppet/util/fileparsing.rb +2 -2
  190. data/lib/puppet/util/instance_loader.rb +14 -10
  191. data/lib/puppet/util/log/destinations.rb +1 -10
  192. data/lib/puppet/util/package/version/debian.rb +175 -0
  193. data/lib/puppet/util/package/version/gem.rb +15 -0
  194. data/lib/puppet/util/package/version/pip.rb +167 -0
  195. data/lib/puppet/util/package/version/range.rb +53 -0
  196. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  197. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  198. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  199. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  200. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  201. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  202. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  203. data/lib/puppet/util/package/version/rpm.rb +73 -0
  204. data/lib/puppet/util/pidlock.rb +13 -7
  205. data/lib/puppet/util/platform.rb +5 -0
  206. data/lib/puppet/util/provider_features.rb +1 -1
  207. data/lib/puppet/util/reference.rb +1 -1
  208. data/lib/puppet/util/rpm_compare.rb +193 -0
  209. data/lib/puppet/util/windows.rb +1 -0
  210. data/lib/puppet/util/windows/adsi.rb +2 -2
  211. data/lib/puppet/util/windows/api_types.rb +60 -33
  212. data/lib/puppet/util/windows/eventlog.rb +1 -6
  213. data/lib/puppet/util/windows/monkey_patches/dir.rb +40 -0
  214. data/lib/puppet/util/windows/principal.rb +8 -6
  215. data/lib/puppet/util/windows/process.rb +15 -14
  216. data/lib/puppet/util/windows/registry.rb +11 -11
  217. data/lib/puppet/util/windows/security.rb +5 -4
  218. data/lib/puppet/util/windows/service.rb +43 -26
  219. data/lib/puppet/util/windows/sid.rb +3 -3
  220. data/lib/puppet/util/windows/user.rb +242 -8
  221. data/lib/puppet/version.rb +1 -1
  222. data/locales/puppet.pot +641 -511
  223. data/man/man5/puppet.conf.5 +75 -10
  224. data/man/man8/puppet-agent.8 +7 -7
  225. data/man/man8/puppet-apply.8 +1 -1
  226. data/man/man8/puppet-catalog.8 +1 -1
  227. data/man/man8/puppet-config.8 +1 -1
  228. data/man/man8/puppet-describe.8 +1 -1
  229. data/man/man8/puppet-device.8 +2 -2
  230. data/man/man8/puppet-doc.8 +1 -1
  231. data/man/man8/puppet-epp.8 +1 -1
  232. data/man/man8/puppet-facts.8 +1 -1
  233. data/man/man8/puppet-filebucket.8 +17 -2
  234. data/man/man8/puppet-generate.8 +1 -1
  235. data/man/man8/puppet-help.8 +6 -3
  236. data/man/man8/puppet-key.8 +1 -1
  237. data/man/man8/puppet-lookup.8 +2 -2
  238. data/man/man8/puppet-man.8 +1 -1
  239. data/man/man8/puppet-module.8 +4 -1
  240. data/man/man8/puppet-node.8 +1 -1
  241. data/man/man8/puppet-parser.8 +1 -1
  242. data/man/man8/puppet-plugin.8 +1 -1
  243. data/man/man8/puppet-report.8 +1 -1
  244. data/man/man8/puppet-resource.8 +1 -1
  245. data/man/man8/puppet-script.8 +1 -1
  246. data/man/man8/puppet-ssl.8 +2 -2
  247. data/man/man8/puppet-status.8 +1 -1
  248. data/man/man8/puppet.8 +2 -2
  249. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/provider/applytest/applytest.rb +2 -0
  250. data/spec/fixtures/integration/application/apply/environments/spec/modules/amod/lib/puppet/type/applytest.rb +25 -0
  251. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  252. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  253. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  254. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  255. data/spec/fixtures/unit/forge/bacula-releases.json +128 -0
  256. data/spec/fixtures/unit/forge/bacula.tar.gz +0 -0
  257. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  258. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  259. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  260. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  261. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  262. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -67
  263. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +1 -69
  264. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -69
  265. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -67
  266. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -65
  267. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -67
  268. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +1 -67
  269. data/spec/integration/application/agent_spec.rb +475 -0
  270. data/spec/integration/application/apply_spec.rb +279 -150
  271. data/spec/integration/application/config_spec.rb +74 -0
  272. data/spec/integration/application/doc_spec.rb +16 -6
  273. data/spec/integration/application/filebucket_spec.rb +239 -0
  274. data/spec/integration/application/help_spec.rb +42 -0
  275. data/spec/integration/application/lookup_spec.rb +13 -0
  276. data/spec/integration/application/module_spec.rb +68 -0
  277. data/spec/integration/application/plugin_spec.rb +123 -0
  278. data/spec/integration/data_binding_spec.rb +82 -0
  279. data/spec/integration/defaults_spec.rb +1 -2
  280. data/spec/integration/directory_environments_spec.rb +17 -17
  281. data/spec/integration/http/client_spec.rb +47 -37
  282. data/spec/integration/indirector/facts/facter_spec.rb +8 -6
  283. data/spec/integration/indirector/report/yaml.rb +83 -0
  284. data/spec/integration/network/http_pool_spec.rb +93 -20
  285. data/spec/integration/node/environment_spec.rb +15 -0
  286. data/spec/integration/parser/compiler_spec.rb +11 -0
  287. data/spec/integration/type/file_spec.rb +1 -1
  288. data/spec/integration/util/execution_spec.rb +22 -0
  289. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  290. data/spec/integration/util/windows/monkey_patches/dir_spec.rb +11 -0
  291. data/spec/integration/util/windows/process_spec.rb +26 -32
  292. data/spec/integration/util/windows/registry_spec.rb +7 -7
  293. data/spec/integration/util/windows/user_spec.rb +47 -5
  294. data/spec/integration/util_spec.rb +7 -33
  295. data/spec/lib/puppet/test_ca.rb +2 -2
  296. data/spec/lib/puppet_spec/https.rb +16 -7
  297. data/spec/lib/puppet_spec/matchers.rb +0 -80
  298. data/spec/lib/puppet_spec/puppetserver.rb +127 -0
  299. data/spec/shared_contexts/https.rb +29 -0
  300. data/spec/unit/agent_spec.rb +80 -26
  301. data/spec/unit/application/agent_spec.rb +12 -9
  302. data/spec/unit/application/describe_spec.rb +88 -50
  303. data/spec/unit/application/device_spec.rb +2 -2
  304. data/spec/unit/application/face_base_spec.rb +6 -4
  305. data/spec/unit/application/facts_spec.rb +39 -10
  306. data/spec/unit/application/filebucket_spec.rb +22 -2
  307. data/spec/unit/application/man_spec.rb +52 -0
  308. data/spec/unit/application/resource_spec.rb +3 -1
  309. data/spec/unit/application/ssl_spec.rb +15 -2
  310. data/spec/unit/configurer/downloader_spec.rb +10 -0
  311. data/spec/unit/configurer/fact_handler_spec.rb +4 -4
  312. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  313. data/spec/unit/configurer_spec.rb +64 -46
  314. data/spec/unit/confine_spec.rb +2 -1
  315. data/spec/unit/context/trusted_information_spec.rb +25 -2
  316. data/spec/unit/daemon_spec.rb +5 -64
  317. data/spec/unit/defaults_spec.rb +24 -1
  318. data/spec/unit/environments_spec.rb +8 -0
  319. data/spec/unit/face/config_spec.rb +3 -1
  320. data/spec/unit/face/module/search_spec.rb +17 -0
  321. data/spec/unit/face/plugin_spec.rb +12 -10
  322. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  323. data/spec/unit/file_serving/mount/locales_spec.rb +2 -2
  324. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +2 -2
  325. data/spec/unit/file_serving/mount/plugins_spec.rb +2 -2
  326. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  327. data/spec/unit/file_system/uniquefile_spec.rb +29 -0
  328. data/spec/unit/file_system_spec.rb +10 -0
  329. data/spec/unit/functions/lookup_spec.rb +13 -0
  330. data/spec/unit/http/client_spec.rb +321 -36
  331. data/spec/unit/http/external_client_spec.rb +201 -0
  332. data/spec/unit/http/resolver_spec.rb +34 -3
  333. data/spec/unit/http/response_spec.rb +75 -0
  334. data/spec/unit/http/service/ca_spec.rb +53 -12
  335. data/spec/unit/http/service/compiler_spec.rb +332 -28
  336. data/spec/unit/http/service/file_server_spec.rb +100 -12
  337. data/spec/unit/http/service/report_spec.rb +19 -9
  338. data/spec/unit/http/service_spec.rb +94 -6
  339. data/spec/unit/http/session_spec.rb +159 -8
  340. data/spec/unit/indirector/catalog/compiler_spec.rb +1 -0
  341. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  342. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  343. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  344. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  345. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  346. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  347. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  348. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  349. data/spec/unit/indirector/request_spec.rb +1 -1
  350. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  351. data/spec/unit/indirector/rest_spec.rb +13 -0
  352. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  353. data/spec/unit/interface_spec.rb +3 -3
  354. data/spec/unit/module_tool/tar/mini_spec.rb +20 -0
  355. data/spec/unit/network/format_support_spec.rb +3 -2
  356. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  357. data/spec/unit/network/http/connection_spec.rb +552 -190
  358. data/spec/unit/network/http/nocache_pool_spec.rb +22 -0
  359. data/spec/unit/network/http/pool_spec.rb +59 -13
  360. data/spec/unit/network/http_pool_spec.rb +63 -57
  361. data/spec/unit/network/http_spec.rb +1 -1
  362. data/spec/unit/node/environment_spec.rb +33 -0
  363. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  364. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  365. data/spec/unit/parser/scope_spec.rb +1 -1
  366. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  367. data/spec/unit/pops/loaders/loaders_spec.rb +71 -1
  368. data/spec/unit/pops/lookup/lookup_spec.rb +25 -0
  369. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  370. data/spec/unit/provider/group/groupadd_spec.rb +22 -8
  371. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  372. data/spec/unit/provider/package/aix_spec.rb +29 -0
  373. data/spec/unit/provider/package/apt_spec.rb +107 -0
  374. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  375. data/spec/unit/provider/package/dnfmodule_spec.rb +54 -15
  376. data/spec/unit/provider/package/gem_spec.rb +40 -0
  377. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  378. data/spec/unit/provider/package/pip_spec.rb +68 -19
  379. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  380. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  381. data/spec/unit/provider/package/portage_spec.rb +5 -0
  382. data/spec/unit/provider/package/puppet_gem_spec.rb +12 -1
  383. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  384. data/spec/unit/provider/package/yum_spec.rb +243 -1
  385. data/spec/unit/provider/package/zypper_spec.rb +98 -0
  386. data/spec/unit/provider/service/init_spec.rb +42 -0
  387. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  388. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  389. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  390. data/spec/unit/provider/service/systemd_spec.rb +93 -18
  391. data/spec/unit/provider/service/windows_spec.rb +50 -14
  392. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  393. data/spec/unit/provider/user/useradd_spec.rb +30 -16
  394. data/spec/unit/provider/user/windows_adsi_spec.rb +85 -3
  395. data/spec/unit/puppet_pal_2pec.rb +11 -0
  396. data/spec/unit/puppet_pal_catalog_spec.rb +43 -0
  397. data/spec/unit/puppet_spec.rb +33 -0
  398. data/spec/unit/reports/http_spec.rb +70 -52
  399. data/spec/unit/reports/store_spec.rb +17 -13
  400. data/spec/unit/resource_spec.rb +3 -3
  401. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  402. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  403. data/spec/unit/ssl/host_spec.rb +4 -2
  404. data/spec/unit/ssl/oids_spec.rb +1 -0
  405. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  406. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  407. data/spec/unit/test/test_helper_spec.rb +17 -0
  408. data/spec/unit/transaction/persistence_spec.rb +15 -0
  409. data/spec/unit/transaction/report_spec.rb +5 -1
  410. data/spec/unit/transaction_spec.rb +0 -2
  411. data/spec/unit/type/file/ensure_spec.rb +1 -2
  412. data/spec/unit/type/file/source_spec.rb +89 -38
  413. data/spec/unit/type/file_spec.rb +122 -96
  414. data/spec/unit/type/service_spec.rb +218 -8
  415. data/spec/unit/type/user_spec.rb +32 -3
  416. data/spec/unit/type_spec.rb +50 -0
  417. data/spec/unit/util/at_fork_spec.rb +3 -2
  418. data/spec/unit/util/autoload_spec.rb +2 -1
  419. data/spec/unit/util/character_encoding_spec.rb +4 -4
  420. data/spec/unit/util/checksums_spec.rb +16 -0
  421. data/spec/unit/util/command_line_spec.rb +11 -6
  422. data/spec/unit/util/log/destinations_spec.rb +1 -29
  423. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  424. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  425. data/spec/unit/util/package/version/range_spec.rb +175 -0
  426. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  427. data/spec/unit/util/pidlock_spec.rb +102 -54
  428. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  429. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  430. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  431. data/spec/unit/util/windows/service_spec.rb +4 -4
  432. data/spec/unit/util/windows/sid_spec.rb +2 -2
  433. data/spec/unit/util_spec.rb +3 -3
  434. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  435. data/tasks/generate_cert_fixtures.rake +15 -1
  436. data/tasks/manpages.rake +5 -35
  437. metadata +84 -52
  438. data/COMMITTERS.md +0 -244
  439. data/spec/integration/faces/config_spec.rb +0 -91
  440. data/spec/integration/faces/documentation_spec.rb +0 -57
  441. data/spec/integration/faces/plugin_spec.rb +0 -61
  442. data/spec/integration/file_bucket/file_spec.rb +0 -50
  443. data/spec/integration/file_serving/content_spec.rb +0 -7
  444. data/spec/integration/file_serving/fileset_spec.rb +0 -12
  445. data/spec/integration/file_serving/metadata_spec.rb +0 -8
  446. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -20
  447. data/spec/integration/file_system/uniquefile_spec.rb +0 -26
  448. data/spec/integration/module_tool/forge_spec.rb +0 -64
  449. data/spec/integration/module_tool/tar/mini_spec.rb +0 -28
  450. data/spec/integration/provider/service/init_spec.rb +0 -48
  451. data/spec/integration/provider/service/systemd_spec.rb +0 -25
  452. data/spec/integration/provider/service/windows_spec.rb +0 -50
  453. data/spec/integration/reference/providers_spec.rb +0 -21
  454. data/spec/integration/reports_spec.rb +0 -13
  455. data/spec/integration/ssl/certificate_request_spec.rb +0 -44
  456. data/spec/integration/ssl/host_spec.rb +0 -72
  457. data/spec/integration/ssl/key_spec.rb +0 -99
  458. data/spec/integration/test/test_helper_spec.rb +0 -31
  459. data/spec/shared_behaviours/file_serving_model.rb +0 -51
  460. data/spec/unit/face/man_spec.rb +0 -25
  461. data/spec/unit/man_spec.rb +0 -31
@@ -114,12 +114,31 @@ describe Puppet::Application::Filebucket do
114
114
  @filebucket.setup
115
115
  end
116
116
 
117
- it "should default to the first server_list entry if set" do
117
+ it "should default to the first good server_list entry if server_list is set" do
118
+ stub_request(:get, "https://foo:8140/status/v1/simple/master").to_return(status: 200)
118
119
  Puppet[:server_list] = "foo,bar,baz"
119
120
  expect(Puppet::FileBucket::Dipper).to receive(:new).with(hash_including(Server: "foo"))
120
121
  @filebucket.setup
121
122
  end
122
123
 
124
+ it "should walk server_list until it finds a good entry" do
125
+ stub_request(:get, "https://foo:8140/status/v1/simple/master").to_return(status: 502)
126
+ stub_request(:get, "https://bar:8140/status/v1/simple/master").to_return(status: 200)
127
+ Puppet[:server_list] = "foo,bar,baz"
128
+ expect(Puppet::FileBucket::Dipper).to receive(:new).with(hash_including(Server: "bar"))
129
+ @filebucket.setup
130
+ end
131
+
132
+ # FileBucket catches any exceptions raised, logs them, then just exits
133
+ it "raises an error if there are no functional servers in server_list" do
134
+ stub_request(:get, "https://foo:8140/status/v1/simple/master").to_return(status: 404)
135
+ stub_request(:get, "https://bar:8140/status/v1/simple/master").to_return(status: 404)
136
+ Puppet[:server] = 'horacio'
137
+ Puppet[:server_list] = "foo,bar"
138
+
139
+ expect{@filebucket.setup}.to exit_with(1)
140
+ end
141
+
123
142
  it "should fall back to server if server_list is empty" do
124
143
  Puppet[:server_list] = ""
125
144
  expect(Puppet::FileBucket::Dipper).to receive(:new).with(hash_including(Server: "puppet"))
@@ -127,8 +146,9 @@ describe Puppet::Application::Filebucket do
127
146
  end
128
147
 
129
148
  it "should take both the server and port specified in server_list" do
149
+ stub_request(:get, "https://foo:632/status/v1/simple/master").to_return(status: 200)
130
150
  Puppet[:server_list] = "foo:632,bar:6215,baz:351"
131
- expect(Puppet::FileBucket::Dipper).to receive(:new).with({ :Server => "foo", :Port => "632" })
151
+ expect(Puppet::FileBucket::Dipper).to receive(:new).with({ :Server => "foo", :Port => 632 })
132
152
  @filebucket.setup
133
153
  end
134
154
  end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+ require 'puppet/face'
3
+
4
+ describe Puppet::Face[:man, :current] do
5
+ let(:pager) { '/path/to/our/pager' }
6
+
7
+ around do |example|
8
+ Puppet::Util.withenv('MANPAGER' => pager) do
9
+ example.run
10
+ end
11
+ end
12
+
13
+ it 'is deprecated' do
14
+ expect(subject).to be_deprecated
15
+ end
16
+
17
+ it 'has a man action' do
18
+ expect(subject).to be_action(:man)
19
+ end
20
+
21
+ it 'accepts a call with no arguments' do
22
+ expect { subject.man }.to output(/USAGE: puppet man <action>/).to_stdout
23
+ end
24
+
25
+ it 'raises an ArgumentError when given too many arguments' do
26
+ expect {
27
+ subject.man(:man, 'agent', 'extra')
28
+ }.to raise_error(ArgumentError)
29
+ .and output(/USAGE: puppet man <action>/).to_stdout
30
+ end
31
+
32
+ it "exits with 0 when generating man documentation for each available application" do
33
+ # turn off deprecation warning
34
+ Puppet[:disable_warnings] = ['deprecations']
35
+
36
+ allow(Puppet::Util).to receive(:which).with('ronn').and_return(nil)
37
+ allow(Puppet::Util).to receive(:which).with(pager).and_return(pager)
38
+
39
+ Puppet::Application.available_application_names.each do |name|
40
+ next if %w{man face_base indirection_base}.include? name
41
+
42
+ app = Puppet::Application[:man]
43
+ app.command_line.args << 'man' << name
44
+
45
+ expect {
46
+ allow(IO).to receive(:popen).with(pager, 'w:UTF-8').and_yield($stdout)
47
+ app.run
48
+ }.to exit_with(0)
49
+ .and output(/puppet-#{name}/m).to_stdout
50
+ end
51
+ end
52
+ end
@@ -51,7 +51,9 @@ describe Puppet::Application::Resource do
51
51
  # provider is a parameter that should always be available
52
52
  @resource_app.extra_params = [ :provider ]
53
53
 
54
- expect { @resource_app.main }.to have_printed(/provider\s+=>/)
54
+ expect {
55
+ @resource_app.main
56
+ }.to output(/provider\s+=>/).to_stdout
55
57
  end
56
58
  end
57
59
 
@@ -38,7 +38,7 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
38
38
  def expects_command_to_pass(expected_output = nil)
39
39
  expect {
40
40
  ssl.run_command
41
- }.to have_printed(expected_output)
41
+ }.to output(expected_output).to_stdout
42
42
  end
43
43
 
44
44
  def expects_command_to_fail(message)
@@ -46,7 +46,7 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
46
46
  expect {
47
47
  ssl.run_command
48
48
  }.to raise_error(Puppet::Error, message)
49
- }.to have_printed(/.*/) # ignore output
49
+ }.to output(/.*/).to_stdout
50
50
  end
51
51
 
52
52
  shared_examples_for 'an ssl action' do
@@ -266,6 +266,19 @@ describe Puppet::Application::Ssl, unless: Puppet::Util::Platform.jruby? do
266
266
  FileUtils.cp(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'encrypted-key.pem'), Puppet[:hostprivkey])
267
267
  FileUtils.cp(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'signed.pem'), Puppet[:hostcert])
268
268
 
269
+ # To verify the client cert we need the root and intermediate certs and crls.
270
+ # We don't need to do this with `ssl-client` cert above, because it is issued
271
+ # directly from the generated TestCa above.
272
+ File.open(Puppet[:localcacert], 'w') do |f|
273
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'ca.pem')))
274
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'intermediate.pem')))
275
+ end
276
+
277
+ File.open(Puppet[:hostcrl], 'w') do |f|
278
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'crl.pem')))
279
+ f.write(File.read(File.join(PuppetSpec::FIXTURE_DIR, 'ssl', 'intermediate-crl.pem')))
280
+ end
281
+
269
282
  Puppet[:passfile] = file_containing('passfile', '74695716c8b6')
270
283
 
271
284
  expects_command_to_pass(%r{Verified client certificate 'CN=signed' fingerprint})
@@ -228,5 +228,15 @@ describe Puppet::Configurer::Downloader do
228
228
 
229
229
  expect { @dler.evaluate }.not_to raise_error
230
230
  end
231
+
232
+ it "raises an exception if catalog application fails" do
233
+ Puppet[:ignore_plugin_errors] = false
234
+
235
+ expect(@dler.file).to receive(:retrieve).and_raise(Puppet::Error, "testing")
236
+
237
+ expect {
238
+ @dler.evaluate
239
+ }.to raise_error(Puppet::Error, /testing/)
240
+ end
231
241
  end
232
242
  end
@@ -104,7 +104,7 @@ describe Puppet::Configurer::FactHandler do
104
104
  expect(text).to include(test_fact[:encoded])
105
105
 
106
106
  # this is not sufficient to test whether these values are sent via HTTP GET or HTTP POST in actual catalog request
107
- expect(JSON.parse(URI.unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
107
+ expect(JSON.parse(Puppet::Util.uri_unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
108
108
  end
109
109
  end
110
110
  end
@@ -129,7 +129,7 @@ describe Puppet::Configurer::FactHandler do
129
129
  expect(to_upload).to eq({:facts_format => 'application/json', :facts => text})
130
130
  expect(text).to include(test_fact[:encoded])
131
131
 
132
- expect(JSON.parse(URI.unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
132
+ expect(JSON.parse(Puppet::Util.uri_unescape(to_upload[:facts]))['values']).to eq(test_fact[:hash])
133
133
  end
134
134
  end
135
135
  end
@@ -138,9 +138,9 @@ describe Puppet::Configurer::FactHandler do
138
138
  facts = Puppet::Node::Facts.new(Puppet[:node_name_value], 'my_name_fact' => 'other_node_name')
139
139
  Puppet::Node::Facts.indirection.save(facts)
140
140
 
141
- # prefer URI.unescape but validate CGI also works
141
+ # prefer Puppet::Util.uri_unescape but validate CGI also works
142
142
  encoded_facts = facthandler.facts_for_uploading[:facts]
143
- expect(URI.unescape(encoded_facts)).to validate_against('api/schemas/facts.json')
143
+ expect(Puppet::Util.uri_unescape(encoded_facts)).to validate_against('api/schemas/facts.json')
144
144
  expect(CGI.unescape(encoded_facts)).to validate_against('api/schemas/facts.json')
145
145
  end
146
146
  end
@@ -6,13 +6,17 @@ describe Puppet::Configurer::PluginHandler do
6
6
  let(:pluginhandler) { Puppet::Configurer::PluginHandler.new() }
7
7
  let(:environment) { Puppet::Node::Environment.create(:myenv, []) }
8
8
 
9
+ before :each do
10
+ # PluginHandler#load_plugin has an extra-strong rescue clause
11
+ # this mock is to make sure that we don't silently ignore errors
12
+ expect(Puppet).not_to receive(:err)
13
+ end
14
+
9
15
  context "server agent version is 5.3.4" do
10
- before :each do
11
- # PluginHandler#load_plugin has an extra-strong rescue clause
12
- # this mock is to make sure that we don't silently ignore errors
13
- expect(Puppet).not_to receive(:err)
14
- # Server_agent version needs to be at 5.3.4 in order to mount locales
15
- Puppet.push_context({:server_agent_version => "5.3.4"})
16
+ around do |example|
17
+ Puppet.override(server_agent_version: "5.3.4") do
18
+ example.run
19
+ end
16
20
  end
17
21
 
18
22
  it "downloads plugins, facts, and locales" do
@@ -43,12 +47,10 @@ describe Puppet::Configurer::PluginHandler do
43
47
  end
44
48
 
45
49
  context "server agent version is 5.3.3" do
46
- before :each do
47
- # PluginHandler#load_plugin has an extra-strong rescue clause
48
- # this mock is to make sure that we don't silently ignore errors
49
- expect(Puppet).not_to receive(:err)
50
- # Server_agent version needs to be at 5.3.4 in order to mount locales
51
- Puppet.push_context({:server_agent_version => "5.3.3"})
50
+ around do |example|
51
+ Puppet.override(server_agent_version: "5.3.3") do
52
+ example.run
53
+ end
52
54
  end
53
55
 
54
56
  it "returns downloaded plugin, fact, but not locale filenames" do
@@ -69,15 +71,30 @@ describe Puppet::Configurer::PluginHandler do
69
71
  end
70
72
 
71
73
  context "blank server agent version" do
72
- before :each do
73
- # PluginHandler#load_plugin has an extra-strong rescue clause
74
- # this mock is to make sure that we don't silently ignore errors
75
- expect(Puppet).not_to receive(:err)
76
- # Server_agent version needs to be at 5.3.4 in order to mount locales
77
- # A blank version will default to 0.0
78
- Puppet.push_context({:server_agent_version => ""})
74
+ around do |example|
75
+ Puppet.override(server_agent_version: "") do
76
+ example.run
77
+ end
78
+ end
79
+
80
+ it "returns downloaded plugin, fact, but not locale filenames" do
81
+ times_called = 0
82
+ allow_any_instance_of(Puppet::Configurer::Downloader).to receive(:evaluate) do
83
+ times_called += 1
84
+
85
+ if times_called == 1
86
+ %w[/a]
87
+ else
88
+ %w[/b]
89
+ end
90
+ end
91
+
92
+ expect(pluginhandler.download_plugins(environment)).to match_array(%w[/a /b])
93
+ expect(times_called).to eq(2)
79
94
  end
95
+ end
80
96
 
97
+ context "nil server agent version" do
81
98
  it "returns downloaded plugin, fact, but not locale filenames" do
82
99
  times_called = 0
83
100
  allow_any_instance_of(Puppet::Configurer::Downloader).to receive(:evaluate) do
@@ -1,6 +1,5 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/configurer'
3
- require 'webmock/rspec'
4
3
 
5
4
  describe Puppet::Configurer do
6
5
  before do
@@ -10,11 +9,12 @@ describe Puppet::Configurer do
10
9
  catalog.add_resource(resource)
11
10
  end
12
11
 
12
+ let(:node_name) { Puppet[:node_name_value] }
13
13
  let(:configurer) { Puppet::Configurer.new }
14
14
  let(:report) { Puppet::Transaction::Report.new }
15
- let(:catalog) { Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym)) }
15
+ let(:catalog) { Puppet::Resource::Catalog.new(node_name, Puppet::Node::Environment.remote(Puppet[:environment].to_sym)) }
16
16
  let(:resource) { Puppet::Resource.new(:notice, 'a') }
17
- let(:facts) { Puppet::Node::Facts.new(Puppet[:node_name_value]) }
17
+ let(:facts) { Puppet::Node::Facts.new(node_name) }
18
18
 
19
19
  describe "when executing a pre-run hook" do
20
20
  it "should do nothing if the hook is set to an empty string" do
@@ -84,6 +84,26 @@ describe Puppet::Configurer do
84
84
  expect(configurer.run).to eq(0)
85
85
  end
86
86
 
87
+ it "fails the run if pluginsync fails when usecacheonfailure is false" do
88
+ Puppet[:ignore_plugin_errors] = false
89
+
90
+ # --test implies these, set them so we don't fall back to a cached catalog
91
+ Puppet[:use_cached_catalog] = false
92
+ Puppet[:usecacheonfailure] = false
93
+
94
+ body = "{\"message\":\"Not Found: Could not find environment 'fasdfad'\",\"issue_kind\":\"RUNTIME_ERROR\"}"
95
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(
96
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
97
+ )
98
+ stub_request(:get, %r{/puppet/v3/file_metadata/pluginfacts}).to_return(
99
+ status: 404, body: body, headers: {'Content-Type' => 'application/json'}
100
+ )
101
+
102
+ configurer.run(pluginsync: true)
103
+
104
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: %r{Failed to apply catalog: Failed to retrieve pluginfacts: Could not retrieve information from environment production source\(s\) puppet:///pluginfacts}))
105
+ end
106
+
87
107
  it "applies a cached catalog when it can't connect to the master" do
88
108
  error = Errno::ECONNREFUSED.new('Connection refused - connect(2)')
89
109
 
@@ -95,12 +115,14 @@ describe Puppet::Configurer do
95
115
  end
96
116
 
97
117
  it "should initialize a transaction report if one is not provided" do
98
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
118
+ # host and settings catalogs each create a report...
119
+ expect(Puppet::Transaction::Report).to receive(:new).and_return(report).twice
99
120
 
100
121
  configurer.run
101
122
  end
102
123
 
103
124
  it "should respect node_name_fact when setting the host on a report" do
125
+ Puppet[:node_name_value] = nil
104
126
  Puppet[:node_name_fact] = 'my_name_fact'
105
127
  facts.values = {'my_name_fact' => 'node_name_from_fact'}
106
128
  Puppet::Node::Facts.indirection.save(facts)
@@ -146,7 +168,7 @@ describe Puppet::Configurer do
146
168
  configurer = Puppet::Configurer.new("test_tuuid", "test_jid")
147
169
 
148
170
  report = Puppet::Transaction::Report.new(nil, "test", "aaaa")
149
- expect(Puppet::Transaction::Report).to receive(:new).with(anything, anything, 'test_tuuid', 'test_jid').and_return(report)
171
+ expect(Puppet::Transaction::Report).to receive(:new).with(anything, anything, 'test_tuuid', 'test_jid', anything).and_return(report)
150
172
  expect(configurer).to receive(:send_report).with(report)
151
173
 
152
174
  configurer.run
@@ -190,22 +212,21 @@ describe Puppet::Configurer do
190
212
  end
191
213
 
192
214
  it "should remove the report as a log destination when the run is finished" do
193
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
194
-
195
- configurer.run
215
+ configurer.run(report: report)
196
216
 
197
217
  expect(Puppet::Util::Log.destinations).not_to include(report)
198
218
  end
199
219
 
200
- it "should return the report exit_status as the result of the run" do
201
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
202
- expect(report).to receive(:exit_status).and_return(1234)
220
+ it "should return an exit status of 2 due to the notify resource 'changing'" do
221
+ cat = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
222
+ cat.add_resource(Puppet::Type.type(:notify).new(:name => 'something changed'))
203
223
 
204
- expect(configurer.run).to eq(1234)
224
+ expect(configurer.run(catalog: cat, report: report)).to eq(2)
205
225
  end
206
226
 
207
227
  it "should return nil if catalog application fails" do
208
- expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
228
+ expect(catalog).to receive(:apply).and_raise(Puppet::Error, 'One or more resource dependency cycles detected in graph')
229
+
209
230
  expect(configurer.run(catalog: catalog, report: report)).to be_nil
210
231
  end
211
232
 
@@ -220,34 +241,28 @@ describe Puppet::Configurer do
220
241
  end
221
242
 
222
243
  it "should include the pre-run command failure in the report" do
223
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
224
-
225
244
  Puppet.settings[:prerun_command] = "/my/command"
226
245
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
227
246
 
228
- expect(configurer.run).to be_nil
247
+ expect(configurer.run(report: report)).to be_nil
229
248
  expect(report.logs.find { |x| x.message =~ /Could not run command from prerun_command/ }).to be
230
249
  end
231
250
 
232
251
  it "should send the transaction report even if the post-run command fails" do
233
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
234
-
235
252
  Puppet.settings[:postrun_command] = "/my/command"
236
253
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
237
254
  expect(configurer).to receive(:send_report).with(report)
238
255
 
239
- expect(configurer.run).to be_nil
256
+ expect(configurer.run(report: report)).to be_nil
240
257
  end
241
258
 
242
259
  it "should include the post-run command failure in the report" do
243
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
244
-
245
260
  Puppet.settings[:postrun_command] = "/my/command"
246
261
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
247
262
 
248
263
  expect(report).to receive(:<<) { |log, _| expect(log.message).to match(/Could not run command from postrun_command/) }.at_least(:once)
249
264
 
250
- expect(configurer.run).to be_nil
265
+ expect(configurer.run(report: report)).to be_nil
251
266
  end
252
267
 
253
268
  it "should execute post-run command even if the pre-run command fails" do
@@ -260,34 +275,28 @@ describe Puppet::Configurer do
260
275
  end
261
276
 
262
277
  it "should finalize the report" do
263
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
264
-
265
278
  expect(report).to receive(:finalize_report)
266
- configurer.run
279
+ configurer.run(report: report)
267
280
  end
268
281
 
269
282
  it "should not apply the catalog if the pre-run command fails" do
270
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
271
-
272
283
  Puppet.settings[:prerun_command] = "/my/command"
273
284
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
274
285
 
275
286
  expect_any_instance_of(Puppet::Resource::Catalog).not_to receive(:apply)
276
287
  expect(configurer).to receive(:send_report)
277
288
 
278
- expect(configurer.run).to be_nil
289
+ expect(configurer.run(report: report)).to be_nil
279
290
  end
280
291
 
281
292
  it "should apply the catalog, send the report, and return nil if the post-run command fails" do
282
- expect(Puppet::Transaction::Report).to receive(:new).and_return(report)
283
-
284
293
  Puppet.settings[:postrun_command] = "/my/command"
285
294
  expect(Puppet::Util::Execution).to receive(:execute).with(["/my/command"]).and_raise(Puppet::ExecutionFailure, "Failed")
286
295
 
287
296
  expect_any_instance_of(Puppet::Resource::Catalog).to receive(:apply)
288
297
  expect(configurer).to receive(:send_report)
289
298
 
290
- expect(configurer.run).to be_nil
299
+ expect(configurer.run(report: report)).to be_nil
291
300
  end
292
301
 
293
302
  it 'includes total time metrics in the report after successfully applying the catalog' do
@@ -316,7 +325,7 @@ describe Puppet::Configurer do
316
325
  end
317
326
 
318
327
  it "should refetch the catalog if the server specifies a new environment in the catalog" do
319
- catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
328
+ catalog = Puppet::Resource::Catalog.new(node_name, Puppet::Node::Environment.remote('second_env'))
320
329
  expect(configurer).to receive(:retrieve_catalog).and_return(catalog).twice
321
330
 
322
331
  configurer.run
@@ -544,6 +553,15 @@ describe Puppet::Configurer do
544
553
  end
545
554
  end
546
555
 
556
+ def expects_pluginsync
557
+ 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}]"
558
+ stub_request(:get, %r{/puppet/v3/file_metadatas/(plugins|locales)}).to_return(status: 200, body: metadata, headers: {'Content-Type' => 'application/json'})
559
+
560
+ # response retains owner/group/mode due to source_permissions => use
561
+ facts_metadata = "[{\"path\":\"/etc/puppetlabs/code\",\"relative_path\":\".\",\"links\":\"follow\",\"owner\":500,\"group\":500,\"mode\":493,\"checksum\":{\"type\":\"ctime\",\"value\":\"{ctime}2020-07-10 14:00:00 -0700\"},\"type\":\"directory\",\"destination\":null}]"
562
+ stub_request(:get, %r{/puppet/v3/file_metadatas/pluginfacts}).to_return(status: 200, body: facts_metadata, headers: {'Content-Type' => 'application/json'})
563
+ end
564
+
547
565
  def expects_new_catalog_only(catalog)
548
566
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
549
567
  expect(Puppet::Resource::Catalog.indirection).not_to receive(:find).with(anything, hash_including(ignore_terminus: true))
@@ -560,6 +578,7 @@ describe Puppet::Configurer do
560
578
  end
561
579
 
562
580
  def expects_fallback_to_new_catalog(catalog)
581
+ expects_pluginsync
563
582
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_terminus: true)).and_return(nil)
564
583
  expect(Puppet::Resource::Catalog.indirection).to receive(:find).with(anything, hash_including(ignore_cache: true)).and_return(catalog)
565
584
  end
@@ -596,7 +615,6 @@ describe Puppet::Configurer do
596
615
  it "should make a node request and pluginsync when a cached catalog cannot be retrieved" do
597
616
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
598
617
  expects_fallback_to_new_catalog(catalog)
599
- expect(configurer).to receive(:download_plugins)
600
618
 
601
619
  configurer.run
602
620
  end
@@ -611,7 +629,7 @@ describe Puppet::Configurer do
611
629
  end
612
630
 
613
631
  it "should set its cached_catalog_status to 'explicitly requested' if the cached catalog is from a different environment" do
614
- cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
632
+ cached_catalog = Puppet::Resource::Catalog.new(node_name, Puppet::Node::Environment.remote('second_env'))
615
633
  expects_cached_catalog_only(cached_catalog)
616
634
 
617
635
  options = {}
@@ -634,6 +652,7 @@ describe Puppet::Configurer do
634
652
  it "should not attempt to retrieve a cached catalog again if the first attempt failed" do
635
653
  expect(Puppet::Node.indirection).to receive(:find).and_return(nil)
636
654
  expects_neither_new_or_cached_catalog
655
+ expects_pluginsync
637
656
 
638
657
  # after failing to use a cached catalog, we'll need to pluginsync before getting
639
658
  # a new catalog, which also fails.
@@ -644,7 +663,7 @@ describe Puppet::Configurer do
644
663
  end
645
664
 
646
665
  it "should return the cached catalog when the environment doesn't match" do
647
- cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
666
+ cached_catalog = Puppet::Resource::Catalog.new(node_name, Puppet::Node::Environment.remote('second_env'))
648
667
  expects_cached_catalog_only(cached_catalog)
649
668
 
650
669
  allow(Puppet).to receive(:info)
@@ -654,8 +673,7 @@ describe Puppet::Configurer do
654
673
  end
655
674
 
656
675
  it "applies the catalog passed as options when the catalog cache terminus is not set" do
657
- stub_request(:get, %r{/puppet/v3/file_metadatas?/plugins}).to_return(:status => 404)
658
- stub_request(:get, %r{/puppet/v3/file_metadatas?/pluginfacts}).to_return(:status => 404)
676
+ expects_pluginsync
659
677
 
660
678
  catalog.add_resource(Puppet::Resource.new('notify', 'from apply'))
661
679
  configurer.run(catalog: catalog.to_ral)
@@ -702,7 +720,7 @@ describe Puppet::Configurer do
702
720
  Puppet[:environment] = 'second_env'
703
721
  configurer = Puppet::Configurer.new
704
722
 
705
- catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote("production"))
723
+ catalog = Puppet::Resource::Catalog.new(node_name, Puppet::Node::Environment.remote("production"))
706
724
  expects_new_catalog_only(catalog)
707
725
 
708
726
  expect(Puppet).to receive(:err).with("Not using catalog because its environment 'production' does not match agent specified environment 'second_env' and strict_environment_mode is set")
@@ -724,7 +742,7 @@ describe Puppet::Configurer do
724
742
  Puppet[:environment] = 'second_env'
725
743
  configurer = Puppet::Configurer.new
726
744
 
727
- catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote("production"))
745
+ catalog = Puppet::Resource::Catalog.new(node_name, Puppet::Node::Environment.remote("production"))
728
746
  expects_cached_catalog_only(catalog)
729
747
 
730
748
  expect(Puppet).to receive(:err).with("Not using catalog because its environment 'production' does not match agent specified environment 'second_env' and strict_environment_mode is set")
@@ -824,7 +842,7 @@ describe Puppet::Configurer do
824
842
  end
825
843
 
826
844
  it "should return nil if its cached catalog environment doesn't match server-specified environment" do
827
- cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
845
+ cached_catalog = Puppet::Resource::Catalog.new(node_name, Puppet::Node::Environment.remote('second_env'))
828
846
 
829
847
  expects_fallback_to_cached_catalog(cached_catalog)
830
848
 
@@ -834,7 +852,7 @@ describe Puppet::Configurer do
834
852
  end
835
853
 
836
854
  it "should set its cached_catalog_status to 'not_used' if the cached catalog environment doesn't match server-specified environment" do
837
- cached_catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote('second_env'))
855
+ cached_catalog = Puppet::Resource::Catalog.new(node_name, Puppet::Node::Environment.remote('second_env'))
838
856
 
839
857
  expects_fallback_to_cached_catalog(cached_catalog)
840
858
 
@@ -854,7 +872,7 @@ describe Puppet::Configurer do
854
872
  it "should not update the cached catalog in noop mode" do
855
873
  Puppet[:noop] = true
856
874
 
857
- stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
875
+ stub_request(:post, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
858
876
 
859
877
  Puppet::Resource::Catalog.indirection.cache_class = :json
860
878
  path = Puppet::Resource::Catalog.indirection.cache.path(catalog.name)
@@ -868,7 +886,7 @@ describe Puppet::Configurer do
868
886
  Puppet[:noop] = false
869
887
  Puppet[:log_level] = 'info'
870
888
 
871
- stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
889
+ stub_request(:post, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
872
890
 
873
891
  Puppet::Resource::Catalog.indirection.cache_class = :json
874
892
  cache_path = Puppet::Resource::Catalog.indirection.cache.path(Puppet[:node_name_value])
@@ -881,7 +899,7 @@ describe Puppet::Configurer do
881
899
  end
882
900
 
883
901
  it "successfully applies the catalog without a cache" do
884
- stub_request(:get, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
902
+ stub_request(:post, %r{/puppet/v3/catalog}).to_return(:status => 200, :body => catalog.render(:json), :headers => {'Content-Type' => 'application/json'})
885
903
 
886
904
  Puppet::Resource::Catalog.indirection.cache_class = nil
887
905
 
@@ -996,7 +1014,7 @@ describe Puppet::Configurer do
996
1014
 
997
1015
  it "should not failover during an apply run" do
998
1016
  Puppet.settings[:server_list] = ["myserver:123"]
999
- catalog = Puppet::Resource::Catalog.new("tester", Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
1017
+ catalog = Puppet::Resource::Catalog.new(node_name, Puppet::Node::Environment.remote(Puppet[:environment].to_sym))
1000
1018
  configurer.run(catalog: catalog)
1001
1019
  end
1002
1020
 
@@ -1041,7 +1059,7 @@ describe Puppet::Configurer do
1041
1059
  Puppet::Resource::Catalog.indirection.terminus_class = :rest
1042
1060
 
1043
1061
  stub_request(:get, 'https://myserver:123/status/v1/simple/master').to_return(status: 200)
1044
- stub_request(:get, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
1062
+ stub_request(:post, %r{https://myserver:123/puppet/v3/catalog}).to_return(status: 200)
1045
1063
  node_request = stub_request(:get, %r{https://myserver:123/puppet/v3/node/}).to_return(status: 200)
1046
1064
 
1047
1065
  configurer.run