puppet 6.11.1 → 6.16.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 (395) hide show
  1. checksums.yaml +4 -4
  2. data/CODEOWNERS +3 -8
  3. data/CONTRIBUTING.md +7 -13
  4. data/Gemfile +1 -0
  5. data/Gemfile.lock +39 -36
  6. data/README.md +17 -24
  7. data/ext/build_defaults.yaml +1 -0
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/windows/service/daemon.rb +25 -20
  10. data/lib/puppet.rb +52 -13
  11. data/lib/puppet/agent.rb +20 -14
  12. data/lib/puppet/application/agent.rb +12 -14
  13. data/lib/puppet/application/describe.rb +7 -5
  14. data/lib/puppet/application/device.rb +2 -2
  15. data/lib/puppet/application/filebucket.rb +19 -15
  16. data/lib/puppet/application/plugin.rb +1 -0
  17. data/lib/puppet/application/resource.rb +1 -1
  18. data/lib/puppet/application/ssl.rb +4 -4
  19. data/lib/puppet/concurrent.rb +2 -0
  20. data/lib/puppet/concurrent/lock.rb +16 -0
  21. data/lib/puppet/concurrent/synchronized.rb +15 -0
  22. data/lib/puppet/concurrent/thread_local_singleton.rb +14 -0
  23. data/lib/puppet/configurer.rb +85 -83
  24. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  25. data/lib/puppet/context/trusted_information.rb +14 -8
  26. data/lib/puppet/daemon.rb +13 -27
  27. data/lib/puppet/defaults.rb +158 -40
  28. data/lib/puppet/environments.rb +30 -20
  29. data/lib/puppet/error.rb +9 -1
  30. data/lib/puppet/face/facts.rb +8 -5
  31. data/lib/puppet/face/help.rb +29 -3
  32. data/lib/puppet/face/module/search.rb +5 -0
  33. data/lib/puppet/face/plugin.rb +2 -2
  34. data/lib/puppet/file_serving/http_metadata.rb +1 -1
  35. data/lib/puppet/file_system/file_impl.rb +13 -9
  36. data/lib/puppet/file_system/memory_file.rb +6 -0
  37. data/lib/puppet/file_system/memory_impl.rb +13 -0
  38. data/lib/puppet/file_system/uniquefile.rb +4 -0
  39. data/lib/puppet/file_system/windows.rb +7 -10
  40. data/lib/puppet/forge.rb +3 -3
  41. data/lib/puppet/forge/errors.rb +2 -2
  42. data/lib/puppet/forge/repository.rb +31 -86
  43. data/lib/puppet/functions/call.rb +1 -1
  44. data/lib/puppet/functions/camelcase.rb +2 -2
  45. data/lib/puppet/functions/epp.rb +4 -4
  46. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  47. data/lib/puppet/functions/filter.rb +1 -0
  48. data/lib/puppet/functions/find_file.rb +9 -9
  49. data/lib/puppet/functions/find_template.rb +63 -0
  50. data/lib/puppet/functions/inline_epp.rb +5 -5
  51. data/lib/puppet/functions/reduce.rb +2 -4
  52. data/lib/puppet/http.rb +7 -0
  53. data/lib/puppet/http/client.rb +341 -54
  54. data/lib/puppet/http/errors.rb +2 -0
  55. data/lib/puppet/http/external_client.rb +90 -0
  56. data/lib/puppet/http/redirector.rb +34 -0
  57. data/lib/puppet/http/resolver.rb +57 -1
  58. data/lib/puppet/http/resolver/server_list.rb +98 -0
  59. data/lib/puppet/http/resolver/settings.rb +23 -2
  60. data/lib/puppet/http/resolver/srv.rb +36 -4
  61. data/lib/puppet/http/response.rb +68 -1
  62. data/lib/puppet/http/retry_after_handler.rb +39 -0
  63. data/lib/puppet/http/service.rb +179 -3
  64. data/lib/puppet/http/service/ca.rb +84 -21
  65. data/lib/puppet/http/service/compiler.rb +319 -0
  66. data/lib/puppet/http/service/file_server.rb +206 -0
  67. data/lib/puppet/http/service/report.rb +66 -0
  68. data/lib/puppet/http/session.rb +106 -31
  69. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  70. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  71. data/lib/puppet/indirector/facts/rest.rb +42 -0
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  73. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  74. data/lib/puppet/indirector/file_content/http.rb +5 -0
  75. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  76. data/lib/puppet/indirector/file_metadata/http.rb +4 -4
  77. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  78. data/lib/puppet/indirector/json.rb +1 -1
  79. data/lib/puppet/indirector/msgpack.rb +1 -1
  80. data/lib/puppet/indirector/node/rest.rb +24 -0
  81. data/lib/puppet/indirector/report/rest.rb +19 -0
  82. data/lib/puppet/indirector/report/yaml.rb +23 -0
  83. data/lib/puppet/indirector/rest.rb +12 -0
  84. data/lib/puppet/indirector/status/rest.rb +18 -0
  85. data/lib/puppet/loaders.rb +6 -0
  86. data/lib/puppet/metatype/manager.rb +80 -80
  87. data/lib/puppet/network/http/base_pool.rb +19 -1
  88. data/lib/puppet/network/http/compression.rb +7 -0
  89. data/lib/puppet/network/http/connection.rb +6 -0
  90. data/lib/puppet/network/http/connection_adapter.rb +182 -0
  91. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  92. data/lib/puppet/network/http/pool.rb +13 -6
  93. data/lib/puppet/network/http_pool.rb +2 -1
  94. data/lib/puppet/node/environment.rb +24 -8
  95. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  96. data/lib/puppet/pal/pal_impl.rb +9 -29
  97. data/lib/puppet/parser/ast/pops_bridge.rb +6 -11
  98. data/lib/puppet/parser/compiler.rb +42 -32
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/epp.rb +3 -3
  101. data/lib/puppet/parser/functions/filter.rb +1 -0
  102. data/lib/puppet/parser/functions/inline_epp.rb +5 -5
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  105. data/lib/puppet/pops/evaluator/runtime3_support.rb +1 -1
  106. data/lib/puppet/pops/loader/puppet_plan_instantiator.rb +12 -3
  107. data/lib/puppet/pops/loaders.rb +7 -5
  108. data/lib/puppet/pops/lookup/invocation.rb +10 -3
  109. data/lib/puppet/pops/model/pn_transformer.rb +5 -9
  110. data/lib/puppet/pops/parser/evaluating_parser.rb +8 -11
  111. data/lib/puppet/pops/serialization/json_path.rb +3 -3
  112. data/lib/puppet/pops/time/timespan.rb +3 -5
  113. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  114. data/lib/puppet/pops/types/string_converter.rb +6 -9
  115. data/lib/puppet/pops/types/type_calculator.rb +30 -10
  116. data/lib/puppet/pops/types/type_formatter.rb +9 -11
  117. data/lib/puppet/pops/types/type_parser.rb +3 -3
  118. data/lib/puppet/pops/validation/checker4_0.rb +1 -1
  119. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  120. data/lib/puppet/provider/aix_object.rb +4 -2
  121. data/lib/puppet/provider/group/aix.rb +1 -0
  122. data/lib/puppet/provider/group/groupadd.rb +57 -24
  123. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  124. data/lib/puppet/provider/package/aix.rb +17 -2
  125. data/lib/puppet/provider/package/apt.rb +78 -4
  126. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  127. data/lib/puppet/provider/package/dpkg.rb +14 -7
  128. data/lib/puppet/provider/package/fink.rb +20 -3
  129. data/lib/puppet/provider/package/gem.rb +41 -7
  130. data/lib/puppet/provider/package/openbsd.rb +13 -1
  131. data/lib/puppet/provider/package/pacman.rb +2 -5
  132. data/lib/puppet/provider/package/pip.rb +143 -48
  133. data/lib/puppet/provider/package/pip3.rb +0 -2
  134. data/lib/puppet/provider/package/pkg.rb +18 -5
  135. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  136. data/lib/puppet/provider/package/pkgng.rb +16 -4
  137. data/lib/puppet/provider/package/portage.rb +5 -5
  138. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  139. data/lib/puppet/provider/package/rpm.rb +6 -213
  140. data/lib/puppet/provider/package/yum.rb +108 -24
  141. data/lib/puppet/provider/package/zypper.rb +59 -1
  142. data/lib/puppet/provider/package_targetable.rb +5 -4
  143. data/lib/puppet/provider/service/systemd.rb +23 -5
  144. data/lib/puppet/provider/user/aix.rb +1 -0
  145. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  146. data/lib/puppet/provider/user/hpux.rb +1 -1
  147. data/lib/puppet/provider/user/useradd.rb +11 -8
  148. data/lib/puppet/reports/http.rb +13 -9
  149. data/lib/puppet/reports/store.rb +1 -1
  150. data/lib/puppet/resource/type_collection.rb +20 -16
  151. data/lib/puppet/runtime.rb +32 -1
  152. data/lib/puppet/settings.rb +4 -0
  153. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  154. data/lib/puppet/ssl.rb +1 -0
  155. data/lib/puppet/ssl/certificate.rb +2 -1
  156. data/lib/puppet/ssl/host.rb +4 -4
  157. data/lib/puppet/ssl/oids.rb +1 -0
  158. data/lib/puppet/ssl/ssl_provider.rb +20 -0
  159. data/lib/puppet/ssl/state_machine.rb +81 -35
  160. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  161. data/lib/puppet/test/test_helper.rb +7 -1
  162. data/lib/puppet/transaction.rb +33 -11
  163. data/lib/puppet/transaction/report.rb +2 -2
  164. data/lib/puppet/transaction/resource_harness.rb +1 -1
  165. data/lib/puppet/type.rb +7 -2
  166. data/lib/puppet/type/file.rb +13 -0
  167. data/lib/puppet/type/file/data_sync.rb +5 -1
  168. data/lib/puppet/type/file/source.rb +49 -58
  169. data/lib/puppet/type/group.rb +5 -4
  170. data/lib/puppet/type/package.rb +102 -10
  171. data/lib/puppet/type/service.rb +6 -8
  172. data/lib/puppet/type/user.rb +6 -30
  173. data/lib/puppet/util.rb +34 -11
  174. data/lib/puppet/util/at_fork.rb +1 -1
  175. data/lib/puppet/util/autoload.rb +4 -18
  176. data/lib/puppet/util/instance_loader.rb +14 -10
  177. data/lib/puppet/util/log/destinations.rb +2 -11
  178. data/lib/puppet/util/logging.rb +30 -18
  179. data/lib/puppet/util/package/version/debian.rb +175 -0
  180. data/lib/puppet/util/package/version/gem.rb +15 -0
  181. data/lib/puppet/util/package/version/pip.rb +167 -0
  182. data/lib/puppet/util/package/version/range.rb +53 -0
  183. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  185. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  187. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  188. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  189. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  190. data/lib/puppet/util/package/version/rpm.rb +73 -0
  191. data/lib/puppet/util/pidlock.rb +36 -10
  192. data/lib/puppet/util/platform.rb +5 -0
  193. data/lib/puppet/util/plist.rb +6 -0
  194. data/lib/puppet/util/rpm_compare.rb +193 -0
  195. data/lib/puppet/util/storage.rb +0 -1
  196. data/lib/puppet/util/windows/adsi.rb +50 -20
  197. data/lib/puppet/util/windows/process.rb +15 -14
  198. data/lib/puppet/util/windows/security.rb +1 -0
  199. data/lib/puppet/util/windows/sid.rb +3 -3
  200. data/lib/puppet/util/yaml.rb +1 -1
  201. data/lib/puppet/version.rb +1 -1
  202. data/lib/puppet/x509/cert_provider.rb +9 -5
  203. data/locales/puppet.pot +640 -521
  204. data/man/man5/puppet.conf.5 +88 -9
  205. data/man/man8/puppet-agent.8 +6 -6
  206. data/man/man8/puppet-apply.8 +1 -1
  207. data/man/man8/puppet-catalog.8 +1 -1
  208. data/man/man8/puppet-config.8 +1 -1
  209. data/man/man8/puppet-describe.8 +1 -1
  210. data/man/man8/puppet-device.8 +2 -2
  211. data/man/man8/puppet-doc.8 +1 -1
  212. data/man/man8/puppet-epp.8 +1 -1
  213. data/man/man8/puppet-facts.8 +1 -1
  214. data/man/man8/puppet-filebucket.8 +17 -2
  215. data/man/man8/puppet-generate.8 +1 -1
  216. data/man/man8/puppet-help.8 +6 -3
  217. data/man/man8/puppet-key.8 +1 -1
  218. data/man/man8/puppet-lookup.8 +1 -1
  219. data/man/man8/puppet-man.8 +1 -1
  220. data/man/man8/puppet-module.8 +4 -1
  221. data/man/man8/puppet-node.8 +1 -1
  222. data/man/man8/puppet-parser.8 +1 -1
  223. data/man/man8/puppet-plugin.8 +1 -1
  224. data/man/man8/puppet-report.8 +1 -1
  225. data/man/man8/puppet-resource.8 +1 -1
  226. data/man/man8/puppet-script.8 +1 -1
  227. data/man/man8/puppet-ssl.8 +2 -2
  228. data/man/man8/puppet-status.8 +1 -1
  229. data/man/man8/puppet.8 +2 -2
  230. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  231. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  232. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  233. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  234. data/spec/fixtures/unit/forge/bacula.json +76 -0
  235. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  236. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  238. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  239. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +1 -102
  241. 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 -106
  242. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  243. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +1 -102
  244. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  245. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +1 -102
  246. 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 -102
  247. data/spec/integration/application/agent_spec.rb +394 -0
  248. data/spec/integration/application/apply_spec.rb +132 -3
  249. data/spec/integration/application/filebucket_spec.rb +190 -0
  250. data/spec/integration/application/plugin_spec.rb +73 -0
  251. data/spec/integration/configurer_spec.rb +26 -7
  252. data/spec/integration/http/client_spec.rb +154 -0
  253. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  254. data/spec/integration/indirector/report/yaml.rb +83 -0
  255. data/spec/integration/module_tool/forge_spec.rb +51 -0
  256. data/spec/integration/network/http_pool_spec.rb +76 -20
  257. data/spec/integration/node/environment_spec.rb +15 -0
  258. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  259. data/spec/lib/puppet/test_ca.rb +2 -2
  260. data/spec/lib/puppet_spec/https.rb +20 -9
  261. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  262. data/spec/shared_contexts/https.rb +29 -0
  263. data/spec/spec_helper.rb +6 -2
  264. data/spec/unit/agent_spec.rb +80 -26
  265. data/spec/unit/application/agent_spec.rb +9 -5
  266. data/spec/unit/application/apply_spec.rb +2 -12
  267. data/spec/unit/application/describe_spec.rb +88 -50
  268. data/spec/unit/application/device_spec.rb +2 -2
  269. data/spec/unit/application/filebucket_spec.rb +22 -2
  270. data/spec/unit/application/resource_spec.rb +2 -2
  271. data/spec/unit/concurrent/lock_spec.rb +29 -0
  272. data/spec/unit/configurer/fact_handler_spec.rb +0 -4
  273. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  274. data/spec/unit/configurer_spec.rb +400 -406
  275. data/spec/unit/context/trusted_information_spec.rb +17 -0
  276. data/spec/unit/daemon_spec.rb +5 -64
  277. data/spec/unit/defaults_spec.rb +38 -4
  278. data/spec/unit/environments_spec.rb +65 -28
  279. data/spec/unit/face/facts_spec.rb +24 -20
  280. data/spec/unit/face/module/search_spec.rb +17 -0
  281. data/spec/unit/face/plugin_spec.rb +12 -10
  282. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  283. data/spec/unit/file_system_spec.rb +26 -2
  284. data/spec/unit/forge/errors_spec.rb +1 -1
  285. data/spec/unit/forge/forge_spec.rb +12 -54
  286. data/spec/unit/forge/module_release_spec.rb +19 -6
  287. data/spec/unit/forge/repository_spec.rb +63 -157
  288. data/spec/unit/forge_spec.rb +46 -116
  289. data/spec/unit/functions/find_template_spec.rb +69 -0
  290. data/spec/unit/functions/lookup_spec.rb +13 -0
  291. data/spec/unit/http/client_spec.rb +395 -27
  292. data/spec/unit/http/external_client_spec.rb +201 -0
  293. data/spec/unit/http/resolver_spec.rb +81 -12
  294. data/spec/unit/http/response_spec.rb +69 -0
  295. data/spec/unit/http/service/ca_spec.rb +100 -7
  296. data/spec/unit/http/service/compiler_spec.rb +627 -0
  297. data/spec/unit/http/service/file_server_spec.rb +308 -0
  298. data/spec/unit/http/service/report_spec.rb +118 -0
  299. data/spec/unit/http/service_spec.rb +117 -4
  300. data/spec/unit/http/session_spec.rb +237 -19
  301. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  302. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  303. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  304. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  305. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  306. data/spec/unit/indirector/file_metadata/http_spec.rb +167 -0
  307. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  308. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  309. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  310. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  311. data/spec/unit/indirector/rest_spec.rb +13 -0
  312. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  313. data/spec/unit/network/http/connection_spec.rb +549 -176
  314. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  315. data/spec/unit/network/http/pool_spec.rb +89 -11
  316. data/spec/unit/network/http_pool_spec.rb +63 -57
  317. data/spec/unit/network/http_spec.rb +1 -1
  318. data/spec/unit/node/environment_spec.rb +16 -0
  319. data/spec/unit/node/facts_spec.rb +2 -1
  320. data/spec/unit/node_spec.rb +7 -4
  321. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -3
  322. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  323. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  324. data/spec/unit/provider/aix_object_spec.rb +16 -2
  325. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  326. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  327. data/spec/unit/provider/package/aix_spec.rb +29 -0
  328. data/spec/unit/provider/package/apt_spec.rb +43 -2
  329. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  330. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  331. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  332. data/spec/unit/provider/package/gem_spec.rb +40 -0
  333. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  334. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  335. data/spec/unit/provider/package/pip_spec.rb +68 -19
  336. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  337. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  338. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  339. data/spec/unit/provider/package/portage_spec.rb +9 -4
  340. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  341. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  342. data/spec/unit/provider/package/yum_spec.rb +292 -0
  343. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  344. data/spec/unit/provider/package_targetable_spec.rb +60 -0
  345. data/spec/unit/provider/service/init_spec.rb +1 -0
  346. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  347. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  348. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  349. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  350. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  351. data/spec/unit/provider/user/hpux_spec.rb +2 -2
  352. data/spec/unit/provider/user/useradd_spec.rb +21 -8
  353. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  354. data/spec/unit/puppet_pal_2pec.rb +0 -26
  355. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  356. data/spec/unit/puppet_spec.rb +47 -0
  357. data/spec/unit/reports/http_spec.rb +70 -52
  358. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  359. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  360. data/spec/unit/ssl/certificate_spec.rb +7 -0
  361. data/spec/unit/ssl/host_spec.rb +4 -2
  362. data/spec/unit/ssl/oids_spec.rb +1 -0
  363. data/spec/unit/ssl/ssl_provider_spec.rb +71 -0
  364. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  365. data/spec/unit/transaction/persistence_spec.rb +1 -10
  366. data/spec/unit/transaction/report_spec.rb +4 -0
  367. data/spec/unit/transaction_spec.rb +45 -1
  368. data/spec/unit/type/file/content_spec.rb +9 -3
  369. data/spec/unit/type/file/ensure_spec.rb +1 -2
  370. data/spec/unit/type/file/source_spec.rb +86 -35
  371. data/spec/unit/type/package_spec.rb +8 -0
  372. data/spec/unit/type/service_spec.rb +9 -8
  373. data/spec/unit/type/user_spec.rb +1 -2
  374. data/spec/unit/util/at_fork_spec.rb +3 -2
  375. data/spec/unit/util/autoload_spec.rb +2 -1
  376. data/spec/unit/util/log/destinations_spec.rb +1 -29
  377. data/spec/unit/util/log_spec.rb +0 -138
  378. data/spec/unit/util/logging_spec.rb +200 -0
  379. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  380. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  381. data/spec/unit/util/package/version/range_spec.rb +175 -0
  382. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  383. data/spec/unit/util/pidlock_spec.rb +112 -42
  384. data/spec/unit/util/plist_spec.rb +20 -0
  385. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  386. data/spec/unit/util/storage_spec.rb +1 -8
  387. data/spec/unit/util/windows/adsi_spec.rb +55 -4
  388. data/spec/unit/util/windows/sid_spec.rb +2 -2
  389. data/spec/unit/x509/cert_provider_spec.rb +24 -4
  390. data/tasks/generate_cert_fixtures.rake +15 -1
  391. data/tasks/manpages.rake +6 -35
  392. metadata +92 -12
  393. data/COMMITTERS.md +0 -244
  394. data/spec/integration/faces/plugin_spec.rb +0 -61
  395. data/spec/lib/puppet_spec/validators.rb +0 -37
@@ -10,12 +10,16 @@ describe Puppet::HTTP::Session do
10
10
  double('good', url: uri, connect: nil)
11
11
  }
12
12
  let(:bad_service) {
13
- service = double('good', url: uri)
14
- allow(service).to receive(:connect).and_raise(Puppet::HTTP::ConnectionError, 'whoops')
15
- service
13
+ create_bad_service
16
14
  }
17
15
 
18
- class DummyResolver
16
+ def create_bad_service(failure_message = 'whoops')
17
+ service = double('bad', url: uri)
18
+ allow(service).to receive(:connect).and_raise(Puppet::HTTP::ConnectionError, failure_message)
19
+ service
20
+ end
21
+
22
+ class DummyResolver < Puppet::HTTP::Resolver
19
23
  attr_reader :count
20
24
 
21
25
  def initialize(service)
@@ -23,21 +27,19 @@ describe Puppet::HTTP::Session do
23
27
  @count = 0
24
28
  end
25
29
 
26
- def resolve(session, name, &block)
30
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
27
31
  @count += 1
28
- yield @service
32
+ return @service if check_connection?(session, @service, ssl_context: ssl_context, error_handler: error_handler)
29
33
  end
30
34
  end
31
35
 
32
36
  context 'when routing' do
33
37
  it 'returns the first resolved service' do
34
- Puppet[:log_level] = :debug
35
38
  resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
36
39
  session = described_class.new(client, resolvers)
37
40
  resolved = session.route_to(:ca)
38
41
 
39
42
  expect(resolved).to eq(good_service)
40
- expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
41
43
  end
42
44
 
43
45
  it 'only resolves once per session' do
@@ -58,6 +60,29 @@ describe Puppet::HTTP::Session do
58
60
  }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
59
61
  end
60
62
 
63
+ it 'logs all routing failures as errors when there are no more routes' do
64
+ resolvers = [DummyResolver.new(create_bad_service('whoops1')), DummyResolver.new(create_bad_service('whoops2'))]
65
+ session = described_class.new(client, resolvers)
66
+
67
+ expect {
68
+ session.route_to(:ca)
69
+ }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
70
+
71
+ expect(@logs).to include(an_object_having_attributes(level: :err, message: "whoops1"),
72
+ an_object_having_attributes(level: :err, message: "whoops2"))
73
+ end
74
+
75
+ it 'logs routing failures as debug until routing succeeds' do
76
+ Puppet[:log_level] = 'debug'
77
+
78
+ resolvers = [DummyResolver.new(bad_service), DummyResolver.new(good_service)]
79
+ session = described_class.new(client, resolvers)
80
+ session.route_to(:ca)
81
+
82
+ expect(@logs).to include(an_object_having_attributes(level: :debug, message: "Connection to #{uri} failed, trying next route: whoops"))
83
+ expect(@logs).to_not include(an_object_having_attributes(level: :err))
84
+ end
85
+
61
86
  it 'accepts an ssl context to use when connecting' do
62
87
  alt_context = Puppet::SSL::SSLContext.new
63
88
  expect(good_service).to receive(:connect).with(ssl_context: alt_context)
@@ -73,30 +98,223 @@ describe Puppet::HTTP::Session do
73
98
  session.route_to(:westbound)
74
99
  }.to raise_error(ArgumentError, "Unknown service westbound")
75
100
  end
101
+
102
+ it 'routes to the service when given a puppet URL with an explicit host' do
103
+ allow_any_instance_of(Net::HTTP).to receive(:start)
104
+
105
+ session = described_class.new(client, [])
106
+ url = URI("puppet://example.com:8140/:modules/:module/path/to/file")
107
+ service = session.route_to(:fileserver, url: url)
108
+
109
+ expect(service.url.to_s).to eq("https://example.com:8140/puppet/v3")
110
+ end
111
+
112
+ it 'raises a connection error if we cannot connect' do
113
+ allow_any_instance_of(Net::HTTP).to receive(:start).and_raise(Net::OpenTimeout)
114
+
115
+ session = described_class.new(client, [])
116
+ url = URI('puppet://example.com:8140/:modules/:module/path/to/file')
117
+
118
+ expect {
119
+ session.route_to(:fileserver, url: url)
120
+ }.to raise_error(Puppet::HTTP::ConnectionError,
121
+ %r{Request to https://example.com:8140/puppet/v3 timed out connect operation after .* seconds})
122
+ end
123
+
124
+ it 'resolves the route when given a generic puppet:/// URL' do
125
+ resolvers = [DummyResolver.new(good_service)]
126
+ session = described_class.new(client, resolvers)
127
+ url = URI('puppet:///:modules/:module/path/to/file')
128
+ service = session.route_to(:fileserver, url: url)
129
+
130
+ expect(service.url).to eq(good_service.url)
131
+ end
76
132
  end
77
133
 
78
- context 'when creating services' do
79
- let(:session) { described_class.new(client, []) }
134
+ context 'when resolving using multiple resolvers' do
135
+ let(:session) { client.create_session }
136
+
137
+ it "prefers SRV records" do
138
+ Puppet[:use_srv_records] = true
139
+ Puppet[:server_list] = 'foo.example.com,bar.example.com,baz.example.com'
140
+ Puppet[:ca_server] = 'caserver.example.com'
141
+
142
+ allow_any_instance_of(Puppet::Network::Resolver).to receive(:each_srv_record).and_yield('mars.example.srv', 8140)
143
+ service = session.route_to(:ca)
144
+
145
+ expect(service.url).to eq(URI("https://mars.example.srv:8140/puppet-ca/v1"))
146
+ end
147
+
148
+ it "next prefers :ca_server when explicitly set" do
149
+ Puppet[:use_srv_records] = true
150
+ Puppet[:server_list] = 'foo.example.com,bar.example.com,baz.example.com'
151
+ Puppet[:ca_server] = 'caserver.example.com'
152
+
153
+ service = session.route_to(:ca)
154
+
155
+ expect(service.url).to eq(URI("https://caserver.example.com:8140/puppet-ca/v1"))
156
+ end
157
+
158
+ it "next prefers the first successful connection from server_list" do
159
+ Puppet[:use_srv_records] = true
160
+ Puppet[:server_list] = 'foo.example.com,bar.example.com,baz.example.com'
161
+
162
+ allow_any_instance_of(Puppet::Network::Resolver).to receive(:each_srv_record)
163
+ stub_request(:get, "https://foo.example.com:8140/status/v1/simple/master").to_return(status: 500)
164
+ stub_request(:get, "https://bar.example.com:8140/status/v1/simple/master").to_return(status: 200)
165
+
166
+ service = session.route_to(:ca)
167
+
168
+ expect(service.url).to eq(URI("https://bar.example.com:8140/puppet-ca/v1"))
169
+ end
170
+
171
+ it "fails if server_list doesn't return anything valid" do
172
+ Puppet[:server_list] = 'foo.example.com,bar.example.com'
173
+
174
+ allow_any_instance_of(Puppet::Network::Resolver).to receive(:each_srv_record)
175
+ stub_request(:get, "https://foo.example.com:8140/status/v1/simple/master").to_return(status: 500)
176
+ stub_request(:get, "https://bar.example.com:8140/status/v1/simple/master").to_return(status: 500)
177
+
178
+ expect {
179
+ session.route_to(:ca)
180
+ }.to raise_error(Puppet::Error, "Could not select a functional puppet master from server_list: 'foo.example.com,bar.example.com'")
181
+ end
182
+
183
+ it "raises when there are no more routes" do
184
+ allow_any_instance_of(Net::HTTP).to receive(:start).and_raise(Errno::EHOSTUNREACH)
185
+ session = client.create_session
186
+
187
+ expect {
188
+ session.route_to(:ca)
189
+ }.to raise_error(Puppet::HTTP::RouteError, 'No more routes to ca')
190
+ end
191
+
192
+ Puppet::HTTP::Service::SERVICE_NAMES.each do |name|
193
+ it "resolves #{name} using server_list" do
194
+ Puppet[:server_list] = 'apple.example.com'
195
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
196
+
197
+ session.route_to(name)
198
+
199
+ expect(req).to have_been_requested
200
+ end
201
+ end
80
202
 
81
- it 'defaults the server and port based on settings' do
82
- Puppet[:ca_server] = 'ca.example.com'
83
- Puppet[:ca_port] = 8141
84
- service = session.create_service(:ca)
203
+ it 'does not use server_list to resolve the ca service when ca_server is explicitly set' do
204
+ Puppet[:ca_server] = 'banana.example.com'
85
205
 
86
- expect(service.url.to_s).to eq("https://ca.example.com:8141/puppet-ca/v1")
206
+ expect(session.route_to(:ca).url.to_s).to eq("https://banana.example.com:8140/puppet-ca/v1")
87
207
  end
88
208
 
89
- it 'accepts server and port arguments' do
90
- service = session.create_service(:ca, 'ca2.example.com', 8142)
209
+ it 'does not use server_list to resolve the report service when the report_server is explicitly set' do
210
+ Puppet[:report_server] = 'cherry.example.com'
91
211
 
92
- expect(service.url.to_s).to eq("https://ca2.example.com:8142/puppet-ca/v1")
212
+ expect(session.route_to(:report).url.to_s).to eq("https://cherry.example.com:8140/puppet/v3")
213
+ end
214
+
215
+ it 'resolves once for all services in a session' do
216
+ Puppet[:server_list] = 'apple.example.com'
217
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
218
+
219
+ Puppet::HTTP::Service::SERVICE_NAMES.each do |name|
220
+ session.route_to(name)
221
+ end
222
+
223
+ expect(req).to have_been_requested
224
+ end
225
+
226
+ it 'resolves server_list for each new session' do
227
+ Puppet[:server_list] = 'apple.example.com'
228
+ req = stub_request(:get, "https://apple.example.com:8140/status/v1/simple/master").to_return(status: 200)
229
+
230
+ client.create_session.route_to(:puppet)
231
+ client.create_session.route_to(:puppet)
232
+
233
+ expect(req).to have_been_requested.twice
234
+ end
235
+ end
236
+
237
+ context 'when retrieving capabilities' do
238
+ let(:session) do
239
+ resolver = DummyResolver.new(good_service)
240
+ described_class.new(client, [resolver])
93
241
  end
94
242
 
95
243
  it 'raises for unknown service names' do
96
244
  expect {
97
245
  session = described_class.new(client, [])
98
- session.create_service(:westbound)
246
+ session.supports?(:westbound, 'a capability')
99
247
  }.to raise_error(ArgumentError, "Unknown service westbound")
100
248
  end
249
+
250
+ context 'locales' do
251
+ it 'does not support locales if the cached service has not been resolved' do
252
+ session = described_class.new(client, [])
253
+
254
+ expect(session).to_not be_supports(:puppet, 'locales')
255
+ end
256
+
257
+ it "supports locales if the cached service's version is 5.3.4 or greater" do
258
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '5.3.4'}, uri)
259
+
260
+ session.route_to(:puppet)
261
+ session.process_response(response)
262
+
263
+ expect(session).to be_supports(:puppet, 'locales')
264
+ end
265
+
266
+ it "does not support locales if the cached service's version is 5.3.3" do
267
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '5.3.3'}, uri)
268
+
269
+ session.route_to(:puppet)
270
+ session.process_response(response)
271
+
272
+ expect(session).to_not be_supports(:puppet, 'locales')
273
+ end
274
+
275
+ it "does not support locales if the cached service's version is missing" do
276
+ response = Puppet::HTTP::Response.new({}, uri)
277
+
278
+ session.route_to(:puppet)
279
+ session.process_response(response)
280
+
281
+ expect(session).to_not be_supports(:puppet, 'locales')
282
+ end
283
+ end
284
+
285
+ context 'json' do
286
+ it 'does not support json if the cached service has not been resolved' do
287
+ session = described_class.new(client, [])
288
+
289
+ expect(session).to_not be_supports(:puppet, 'json')
290
+ end
291
+
292
+ it "supports json if the cached service's version is 5 or greater" do
293
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '5.5.12'}, uri)
294
+
295
+ session.route_to(:puppet)
296
+ session.process_response(response)
297
+
298
+ expect(session).to be_supports(:puppet, 'json')
299
+ end
300
+
301
+ it "does not support json if the cached service's version is less than 5.0" do
302
+ response = Puppet::HTTP::Response.new({'X-Puppet-Version' => '4.10.1'}, uri)
303
+
304
+ session.route_to(:puppet)
305
+ session.process_response(response)
306
+
307
+ expect(session).to_not be_supports(:puppet, 'json')
308
+ end
309
+
310
+ it "supports json if the cached service's version is missing" do
311
+ response = Puppet::HTTP::Response.new({}, uri)
312
+
313
+ session.route_to(:puppet)
314
+ session.process_response(response)
315
+
316
+ expect(session).to be_supports(:puppet, 'json')
317
+ end
318
+ end
101
319
  end
102
320
  end
@@ -15,22 +15,9 @@ describe Puppet::Resource::Catalog::Compiler do
15
15
  let(:node_name) { "foo" }
16
16
  let(:node) { Puppet::Node.new(node_name)}
17
17
 
18
- before do
19
- allow(Facter).to receive(:to_hash).and_return({})
20
- end
21
-
22
18
  describe "when initializing" do
23
19
  before do
24
- expect(Puppet).to receive(:version).and_return(1)
25
- set_facts({
26
- 'fqdn' => "my.server.com",
27
- 'ipaddress' => "my.ip.address",
28
- 'ipaddress6' => nil
29
- })
30
- end
31
-
32
- it "should gather data about itself" do
33
- Puppet::Resource::Catalog::Compiler.new
20
+ allow(Puppet).to receive(:version).and_return(1)
34
21
  end
35
22
 
36
23
  it "should cache the server metadata and reuse it" do
@@ -47,8 +34,6 @@ describe Puppet::Resource::Catalog::Compiler do
47
34
 
48
35
  describe "when finding catalogs" do
49
36
  before do
50
- allow(Facter).to receive(:value).and_return("whatever")
51
-
52
37
  allow(node).to receive(:merge)
53
38
  allow(Puppet::Node.indirection).to receive(:find).and_return(node)
54
39
  @request = Puppet::Indirector::Request.new(:catalog, :find, node_name, nil, :node => node_name)
@@ -255,10 +240,10 @@ describe Puppet::Resource::Catalog::Compiler do
255
240
 
256
241
  describe "when handling a request with facts" do
257
242
  before do
258
- Puppet::Node::Facts.indirection.terminus_class = :memory
259
243
  allow(Facter).to receive(:value).and_return("something")
260
244
 
261
- @facts = Puppet::Node::Facts.new('hostname', "fact" => "value", "architecture" => "i386")
245
+ facts = Puppet::Node::Facts.new('hostname', "fact" => "value", "architecture" => "i386")
246
+ Puppet::Node::Facts.indirection.save(facts)
262
247
  end
263
248
 
264
249
  def a_legacy_request_that_contains(facts, format = :pson)
@@ -276,6 +261,8 @@ describe Puppet::Resource::Catalog::Compiler do
276
261
  end
277
262
 
278
263
  context "when extracting facts from the request" do
264
+ let(:facts) { Puppet::Node::Facts.new("hostname") }
265
+
279
266
  it "should do nothing if no facts are provided" do
280
267
  request = Puppet::Indirector::Request.new(:catalog, :find, "hostname", nil)
281
268
  request.options[:facts] = nil
@@ -285,21 +272,21 @@ describe Puppet::Resource::Catalog::Compiler do
285
272
 
286
273
  it "should deserialize the facts without changing the timestamp" do
287
274
  time = Time.now
288
- @facts.timestamp = time
289
- request = a_request_that_contains(@facts)
275
+ facts.timestamp = time
276
+ request = a_request_that_contains(facts)
290
277
  facts = compiler.extract_facts_from_request(request)
291
278
  expect(facts.timestamp).to eq(time)
292
279
  end
293
280
 
294
281
  it "accepts PSON facts from older agents" do
295
- request = a_legacy_request_that_contains(@facts)
282
+ request = a_legacy_request_that_contains(facts)
296
283
 
297
284
  facts = compiler.extract_facts_from_request(request)
298
- expect(facts).to eq(@facts)
285
+ expect(facts).to eq(facts)
299
286
  end
300
287
 
301
288
  it "rejects YAML facts" do
302
- request = a_legacy_request_that_contains(@facts, :yaml)
289
+ request = a_legacy_request_that_contains(facts, :yaml)
303
290
 
304
291
  expect {
305
292
  compiler.extract_facts_from_request(request)
@@ -307,7 +294,7 @@ describe Puppet::Resource::Catalog::Compiler do
307
294
  end
308
295
 
309
296
  it "rejects unknown fact formats" do
310
- request = a_request_that_contains(@facts)
297
+ request = a_request_that_contains(facts)
311
298
  request.options[:facts_format] = 'unknown-format'
312
299
 
313
300
  expect {
@@ -317,15 +304,17 @@ describe Puppet::Resource::Catalog::Compiler do
317
304
  end
318
305
 
319
306
  context "when saving facts from the request" do
307
+ let(:facts) { Puppet::Node::Facts.new("hostname") }
308
+
320
309
  it "should save facts if they were issued by the request" do
321
- request = a_request_that_contains(@facts)
310
+ request = a_request_that_contains(facts)
322
311
 
323
312
  options = {
324
313
  :environment => request.environment,
325
314
  :transaction_uuid => request.options[:transaction_uuid],
326
315
  }
327
316
 
328
- expect(Puppet::Node::Facts.indirection).to receive(:save).with(@facts, nil, options)
317
+ expect(Puppet::Node::Facts.indirection).to receive(:save).with(facts, nil, options)
329
318
  compiler.find(request)
330
319
  end
331
320
 
@@ -337,7 +326,7 @@ describe Puppet::Resource::Catalog::Compiler do
337
326
  :transaction_uuid => request.options[:transaction_uuid],
338
327
  }
339
328
 
340
- expect(Puppet::Node::Facts.indirection).not_to receive(:save).with(@facts, nil, options)
329
+ expect(Puppet::Node::Facts.indirection).not_to receive(:save).with(facts, nil, options)
341
330
  compiler.find(request)
342
331
  end
343
332
  end
@@ -345,7 +334,6 @@ describe Puppet::Resource::Catalog::Compiler do
345
334
 
346
335
  describe "when finding nodes" do
347
336
  it "should look node information up via the Node class with the provided key" do
348
- allow(Facter).to receive(:value).and_return("whatever")
349
337
  request = Puppet::Indirector::Request.new(:catalog, :find, node_name, nil)
350
338
  allow(compiler).to receive(:compile)
351
339
 
@@ -471,9 +459,39 @@ describe Puppet::Resource::Catalog::Compiler do
471
459
  end
472
460
  end
473
461
 
462
+ describe "after finding nodes when checking for a PE version" do
463
+ include PuppetSpec::Compiler
464
+
465
+ let(:pe_version_file) { '/opt/puppetlabs/server/pe_version' }
466
+ let(:request) { Puppet::Indirector::Request.new(:catalog, :find, node_name, nil) }
467
+
468
+ before :each do
469
+ Puppet[:code] = 'notify { "PE Version: $pe_serverversion": }'
470
+ end
471
+
472
+ it "should not add 'pe_serverversion' when FOSS" do
473
+ allow(Puppet::Node.indirection).to receive(:find).with(node_name, anything).and_return(node)
474
+ catalog = compiler.find(request)
475
+
476
+ expect(catalog.resource('notify', 'PE Version: 2019.2.0')).to be_nil
477
+ end
478
+
479
+ it "should add 'pe_serverversion' when PE" do
480
+ allow(File).to receive(:readable?).and_call_original
481
+ allow(File).to receive(:readable?).with(pe_version_file).and_return(true)
482
+ allow(File).to receive(:zero?).with(pe_version_file).and_return(false)
483
+ allow(File).to receive(:read).and_call_original
484
+ allow(File).to receive(:read).with(pe_version_file).and_return('2019.2.0')
485
+
486
+ allow(Puppet::Node.indirection).to receive(:find).with(node_name, anything).and_return(node)
487
+ catalog = compiler.find(request)
488
+
489
+ expect(catalog.resource('notify', 'PE Version: 2019.2.0')).to be
490
+ end
491
+ end
492
+
474
493
  describe "when filtering resources" do
475
494
  before :each do
476
- allow(Facter).to receive(:value)
477
495
  @catalog = double('catalog')
478
496
  allow(@catalog).to receive(:respond_to?).with(:filter).and_return(true)
479
497
  end