puppet 6.11.1-x64-mingw32 → 6.16.0-x64-mingw32

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
@@ -7,6 +7,8 @@ module Puppet::HTTP
7
7
 
8
8
  class ProtocolError < HTTPError; end
9
9
 
10
+ class SerializationError < HTTPError; end
11
+
10
12
  class ResponseError < HTTPError
11
13
  attr_reader :response
12
14
 
@@ -0,0 +1,90 @@
1
+ #
2
+ # Adapts an external http_client_class to the HTTP client API. The former
3
+ # is typically registered by puppetserver and only implements a subset of
4
+ # the Puppet::Network::HTTP::Connection methods. As a result, only the
5
+ # `get` and `post` methods are supported. Calling `delete`, etc will
6
+ # raise a NotImplementedError.
7
+ #
8
+ # @api private
9
+ class Puppet::HTTP::ExternalClient < Puppet::HTTP::Client
10
+ # Create an external http client
11
+ #
12
+ # @param [Class] http_client_class The class to create to handle the request
13
+ # @api private
14
+ def initialize(http_client_class)
15
+ @http_client_class = http_client_class
16
+ end
17
+
18
+ # (see Puppet::HTTP::Client#get)
19
+ # @api private
20
+ def get(url, headers: {}, params: {}, options: {}, &block)
21
+ url = encode_query(url, params)
22
+
23
+ options[:use_ssl] = url.scheme == 'https'
24
+
25
+ client = @http_client_class.new(url.host, url.port, options)
26
+ response = Puppet::HTTP::Response.new(client.get(url.request_uri, headers, options), url)
27
+
28
+ if block_given?
29
+ yield response
30
+ else
31
+ response
32
+ end
33
+ rescue Puppet::HTTP::HTTPError
34
+ raise
35
+ rescue => e
36
+ raise Puppet::HTTP::HTTPError.new(e.message, e)
37
+ end
38
+
39
+ # (see Puppet::HTTP::Client#post)
40
+ # @api private
41
+ def post(url, body, headers: {}, params: {}, options: {}, &block)
42
+ raise ArgumentError.new("'post' requires a string 'body' argument") unless body.is_a?(String)
43
+ url = encode_query(url, params)
44
+
45
+ options[:use_ssl] = url.scheme == 'https'
46
+
47
+ client = @http_client_class.new(url.host, url.port, options)
48
+ response = Puppet::HTTP::Response.new(client.post(url.request_uri, body, headers, options), url)
49
+
50
+ if block_given?
51
+ yield response
52
+ else
53
+ response
54
+ end
55
+ rescue Puppet::HTTP::HTTPError, ArgumentError
56
+ raise
57
+ rescue => e
58
+ raise Puppet::HTTP::HTTPError.new(e.message, e)
59
+ end
60
+
61
+ # Close the external http client.
62
+ #
63
+ # @api private
64
+ def close
65
+ # This is a noop as puppetserver doesn't provide a way to close its http client.
66
+ end
67
+
68
+ # The following are intentionally not documented
69
+
70
+ def create_session
71
+ raise NotImplementedError
72
+ end
73
+
74
+ def connect(uri, options: {}, &block)
75
+ raise NotImplementedError
76
+ end
77
+
78
+ def head(url, headers: {}, params: {}, options: {})
79
+ raise NotImplementedError
80
+ end
81
+
82
+ def put(url, headers: {}, params: {}, options: {})
83
+ raise NotImplementedError
84
+ end
85
+
86
+ def delete(url, headers: {}, params: {}, options: {})
87
+ raise NotImplementedError
88
+ end
89
+
90
+ end
@@ -1,8 +1,30 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Handle HTTP redirects
5
+ #
1
6
  class Puppet::HTTP::Redirector
7
+ #
8
+ # @api private
9
+ #
10
+ # Create a new redirect handler
11
+ #
12
+ # @param [Integer] redirect_limit maximum number of redirects allowed
13
+ #
2
14
  def initialize(redirect_limit)
3
15
  @redirect_limit = redirect_limit
4
16
  end
5
17
 
18
+ #
19
+ # @api private
20
+ #
21
+ # Determine of the HTTP response code indicates a redirect
22
+ #
23
+ # @param [Net::HTTP] request request that received the response
24
+ # @param [Puppet::HTTP::Response] response
25
+ #
26
+ # @return [Boolean] true if the response code is 301, 302, or 307.
27
+ #
6
28
  def redirect?(request, response)
7
29
  # Net::HTTPRedirection is not used because historically puppet
8
30
  # has only handled these, and we're not a browser
@@ -14,6 +36,18 @@ class Puppet::HTTP::Redirector
14
36
  end
15
37
  end
16
38
 
39
+ #
40
+ # @api private
41
+ #
42
+ # Implement the HTTP request redirection
43
+ #
44
+ # @param [Net::HTTP] request request that has been redirected
45
+ # @param [Puppet::HTTP::Response] response
46
+ # @param [Integer] redirects the current number of redirects
47
+ #
48
+ # @return [Net::HTTP] A new request based on the original request, but with
49
+ # the redirected location
50
+ #
17
51
  def redirect_to(request, response, redirects)
18
52
  raise Puppet::HTTP::TooManyRedirects.new(request.uri) if redirects >= @redirect_limit
19
53
 
@@ -1,5 +1,61 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Resolver base class. Each resolver represents a different strategy for
5
+ # resolving a service name into a list of candidate servers and ports.
6
+ #
7
+ # @abstract Subclass and override {#resolve} to create a new resolver.
8
+ #
1
9
  class Puppet::HTTP::Resolver
2
- def resolve(session, name, &block)
10
+ #
11
+ # @api private
12
+ #
13
+ # Create a new resolver
14
+ #
15
+ # @param [Puppet::HTTP::Client] client
16
+ #
17
+ def initialize(client)
18
+ @client = client
19
+ end
20
+
21
+ #
22
+ # @api private
23
+ #
24
+ # Return a working server/port for the resolver. This is the base
25
+ # implementation and is meant to be a placeholder.
26
+ #
27
+ # @param [Puppet::HTTP::Session] session
28
+ # @param [Symbol] name the service to resolve
29
+ # @param [Puppet::SSL::SSLContext] ssl_context (nil) optional ssl context to
30
+ # use when creating a connection
31
+ # @param [Proc] error_handler (nil) optional callback for each error
32
+ # encountered while resolving a route.
33
+ #
34
+ # @raise [NotImplementedError] this base class is not implemented
35
+ #
36
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
3
37
  raise NotImplementedError
4
38
  end
39
+
40
+ #
41
+ # @api private
42
+ #
43
+ # Check a given connection to establish if it can be relied on for future use
44
+ #
45
+ # @param [Puppet::HTTP::Session] session
46
+ # @param [Puppet::HTTP::Service] service
47
+ # @param [Puppet::SSL::SSLContext] ssl_context
48
+ # @param [Proc] error_handler (nil) optional callback for each error
49
+ # encountered while resolving a route.
50
+ #
51
+ # @return [Boolean] Returns true if a connection is successful, false otherwise
52
+ #
53
+ def check_connection?(session, service, ssl_context: nil, error_handler: nil)
54
+ service.connect(ssl_context: ssl_context)
55
+ return true
56
+ rescue Puppet::HTTP::ConnectionError => e
57
+ error_handler.call(e) if error_handler
58
+ Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}")
59
+ return false
60
+ end
5
61
  end
@@ -0,0 +1,98 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Use the server_list setting to resolve a service. This resolver is only used
5
+ # if server_list is set either on the command line or in the configuration file.
6
+ #
7
+ class Puppet::HTTP::Resolver::ServerList < Puppet::HTTP::Resolver
8
+ #
9
+ # @api private
10
+ #
11
+ # @param [Puppet::HTTP::Client] client
12
+ # @param [Array<String>] server_list_setting array of servers set via the
13
+ # configuration or the command line
14
+ # @param [Integer] default_port if a port is not set for a server in
15
+ # server_list, use this port
16
+ # @param [Array<Symbol>] services array of services that server_list can be
17
+ # used to resolve. If a service is not included in this array, this resolver
18
+ # will return nil.
19
+ #
20
+ def initialize(client, server_list_setting:, default_port:, services: )
21
+ @client = client
22
+ @server_list_setting = server_list_setting
23
+ @default_port = default_port
24
+ @services = services
25
+ @resolved_url = nil
26
+ end
27
+
28
+ #
29
+ # @api private
30
+ #
31
+ # Walk the server_list to find a server and port that will connect successfully.
32
+ #
33
+ # @param [Puppet::HTTP::Session] session <description>
34
+ # @param [Symbol] name the name of the service being resolved
35
+ # @param [Puppet::SSL::SSLContext] ssl_context
36
+ # @param [Proc] error_handler (nil) optional callback for each error
37
+ # encountered while resolving a route.
38
+ #
39
+ # @return [nil] return nil if the service to be resolved does not support
40
+ # server_list
41
+ # @return [Puppet::HTTP::Service] a validated service to use for future HTTP
42
+ # requests
43
+ #
44
+ # @raise [Puppet::Error] raise if none of the servers defined in server_list
45
+ # are available
46
+ #
47
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
48
+ # If we're configured to use an explicit service host, e.g. report_server
49
+ # then don't use server_list to resolve the `:report` service.
50
+ return nil unless @services.include?(name)
51
+
52
+ # If we resolved the URL already, use its host & port for the service
53
+ if @resolved_url
54
+ return Puppet::HTTP::Service.create_service(@client, session, name, @resolved_url.host, @resolved_url.port)
55
+ end
56
+
57
+ # Return the first simple service status endpoint we can connect to
58
+ @server_list_setting.value.each do |server|
59
+ host = server[0]
60
+ port = server[1] || @default_port
61
+ uri = URI("https://#{host}:#{port}/status/v1/simple/master")
62
+ if get_success?(uri, session, ssl_context: ssl_context, error_handler: error_handler)
63
+ @resolved_url = uri
64
+ return Puppet::HTTP::Service.create_service(@client, session, name, host, port)
65
+ end
66
+ end
67
+
68
+ raise Puppet::Error, _("Could not select a functional puppet master from server_list: '%{server_list}'") % { server_list: @server_list_setting.print(@server_list_setting.value) }
69
+ end
70
+
71
+ #
72
+ # @api private
73
+ #
74
+ # Check if a server and port is available
75
+ #
76
+ # @param [URI] uri A URI created from the server and port to test
77
+ # @param [Puppet::HTTP::Session] session
78
+ # @param [Puppet::SSL::SSLContext] ssl_context
79
+ # @param [Proc] error_handler (nil) optional callback for each error
80
+ # encountered while resolving a route.
81
+ #
82
+ # @return [Boolean] true if a successful response is returned by the server,
83
+ # false otherwise
84
+ #
85
+ def get_success?(uri, session, ssl_context: nil, error_handler: nil)
86
+ response = @client.get(uri, options: {ssl_context: ssl_context})
87
+ return true if response.success?
88
+
89
+ Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
90
+ { host: uri.host, port: uri.port, code: response.code, reason: response.reason })
91
+ return false
92
+ rescue => detail
93
+ error_handler.call(detail) if error_handler
94
+ #TRANSLATORS 'server_list' is the name of a setting and should not be translated
95
+ Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
96
+ return false
97
+ end
98
+ end
@@ -1,5 +1,26 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Resolve a service using settings. This is the default resolver if none of the
5
+ # other resolvers find a functional connection.
6
+ #
1
7
  class Puppet::HTTP::Resolver::Settings < Puppet::HTTP::Resolver
2
- def resolve(session, name, &block)
3
- yield session.create_service(name)
8
+ #
9
+ # @api private
10
+ #
11
+ # Resolve a service using the default server and port settings for this service.
12
+ #
13
+ # @param [Puppet::HTTP::Session] session
14
+ # @param [Symbol] name the name of the service to be resolved
15
+ # @param [Puppet::SSL::SSLContext] ssl_context
16
+ # @param [Proc] error_handler (nil) optional callback for each error
17
+ # encountered while resolving a route.
18
+ #
19
+ # @return [Puppet::HTTP::Service] if the service successfully connects,
20
+ # return it. Otherwise, return nil.
21
+ #
22
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
23
+ service = Puppet::HTTP::Service.create_service(@client, session, name)
24
+ check_connection?(session, service, ssl_context: ssl_context, error_handler: error_handler) ? service : nil
4
25
  end
5
26
  end
@@ -1,13 +1,45 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Resolve a service using SRV
5
+ #
1
6
  class Puppet::HTTP::Resolver::SRV < Puppet::HTTP::Resolver
2
- def initialize(domain: srv_domain, dns: Resolv::DNS.new)
7
+ #
8
+ # @api private
9
+ #
10
+ # @param [Puppet::HTTP::Client] client
11
+ # @param [String] domain srv domain
12
+ # @param [Resolv::DNS] dns
13
+ #
14
+ def initialize(client, domain:, dns: Resolv::DNS.new)
15
+ @client = client
3
16
  @srv_domain = domain
4
17
  @delegate = Puppet::Network::Resolver.new(dns)
5
18
  end
6
19
 
7
- def resolve(session, name, &block)
8
- # This assumes the route name is the same as the DNS SRV name
20
+ #
21
+ # @api private
22
+ #
23
+ # Walk the available srv records and return the first that successfully connects
24
+ #
25
+ # @param [Puppet::HTTP::Session] session
26
+ # @param [Symbol] name the service being resolved
27
+ # @param [Puppet::SSL::SSLContext] ssl_context
28
+ # @param [Proc] error_handler (nil) optional callback for each error
29
+ # encountered while resolving a route.
30
+ #
31
+ # @return [Puppet::HTTP::Service] if an available service is found, return
32
+ # it. Return nil otherwise.
33
+ #
34
+ def resolve(session, name, ssl_context: nil, error_handler: nil)
35
+ # Here we pass our HTTP service name as the DNS SRV service name
36
+ # This is fine for :ca, but note that :puppet and :file are handled
37
+ # specially in `each_srv_record`.
9
38
  @delegate.each_srv_record(@srv_domain, name) do |server, port|
10
- yield session.create_service(name, server, port)
39
+ service = Puppet::HTTP::Service.create_service(@client, session, name, server, port)
40
+ return service if check_connection?(session, service, ssl_context: ssl_context, error_handler: error_handler)
11
41
  end
42
+
43
+ return nil
12
44
  end
13
45
  end
@@ -1,32 +1,99 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Represents the response returned from the server from an HTTP request
5
+ #
1
6
  class Puppet::HTTP::Response
2
- def initialize(nethttp)
7
+ # @api private
8
+ # @return [Net::HTTP] the Net::HTTP response
9
+ attr_reader :nethttp
10
+
11
+ # @api private
12
+ # @return [URI] the response uri
13
+ attr_reader :url
14
+
15
+ #
16
+ # @api private
17
+ #
18
+ # Object to represent the response returned from an HTTP request
19
+ #
20
+ # @param [Net::HTTP] nethttp the request response
21
+ # @param [URI] url
22
+ #
23
+ def initialize(nethttp, url)
3
24
  @nethttp = nethttp
25
+ @url = url
4
26
  end
5
27
 
28
+ #
29
+ # @api private
30
+ #
31
+ # Extract the response code
32
+ #
33
+ # @return [Integer] Response code for the request
34
+ #
6
35
  def code
7
36
  @nethttp.code.to_i
8
37
  end
9
38
 
39
+ #
40
+ # @api private
41
+ #
42
+ # Extract the response message
43
+ #
44
+ # @return [String] Response message for the request
45
+ #
10
46
  def reason
11
47
  @nethttp.message
12
48
  end
13
49
 
50
+ #
51
+ # @api private
52
+ #
53
+ # Returns the entire response body. Can be used instead of
54
+ # Puppet::HTTP::Response.read_body, but both methods cannot be used for the
55
+ # same response.
56
+ #
57
+ # @return [String] Response body for the request
58
+ #
14
59
  def body
15
60
  @nethttp.body
16
61
  end
17
62
 
63
+ #
64
+ # @api private
65
+ #
66
+ # Streams the response body to the caller in chunks. Can be used instead of
67
+ # Puppet::HTTP::Response.body, but both methods cannot be used for the same
68
+ # response.
69
+ #
70
+ # @yield [String] Streams the response body in chunks
71
+ #
72
+ # @raise [ArgumentError] raise if a block is not given
73
+ #
18
74
  def read_body(&block)
75
+ raise ArgumentError, "A block is required" unless block_given?
76
+
19
77
  @nethttp.read_body(&block)
20
78
  end
21
79
 
80
+ #
81
+ # @api private
82
+ #
83
+ # Check if the request received a response of success
84
+ #
85
+ # @return [Boolean] Returns true if the response indicates success
86
+ #
22
87
  def success?
23
88
  @nethttp.is_a?(Net::HTTPSuccess)
24
89
  end
25
90
 
91
+ # @api private
26
92
  def [](name)
27
93
  @nethttp[name]
28
94
  end
29
95
 
96
+ # @api private
30
97
  def drain
31
98
  body
32
99
  true