puppet 6.12.0-x64-mingw32 → 6.17.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 (412) 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 +39 -36
  6. data/README.md +18 -25
  7. data/ext/project_data.yaml +1 -1
  8. data/ext/windows/service/daemon.rb +3 -3
  9. data/lib/puppet.rb +52 -13
  10. data/lib/puppet/agent.rb +20 -14
  11. data/lib/puppet/application/agent.rb +26 -17
  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/plugin.rb +1 -0
  16. data/lib/puppet/application/resource.rb +1 -1
  17. data/lib/puppet/application/ssl.rb +4 -4
  18. data/lib/puppet/configurer.rb +65 -69
  19. data/lib/puppet/configurer/plugin_handler.rb +10 -1
  20. data/lib/puppet/confine.rb +1 -1
  21. data/lib/puppet/context/trusted_information.rb +14 -8
  22. data/lib/puppet/daemon.rb +13 -27
  23. data/lib/puppet/defaults.rb +154 -58
  24. data/lib/puppet/environments.rb +27 -20
  25. data/lib/puppet/face/facts.rb +8 -5
  26. data/lib/puppet/face/help.rb +29 -3
  27. data/lib/puppet/face/module/search.rb +5 -0
  28. data/lib/puppet/face/plugin.rb +2 -2
  29. data/lib/puppet/file_serving/http_metadata.rb +14 -2
  30. data/lib/puppet/file_serving/metadata.rb +4 -1
  31. data/lib/puppet/file_serving/terminus_selector.rb +7 -8
  32. data/lib/puppet/file_system/file_impl.rb +14 -10
  33. data/lib/puppet/file_system/memory_file.rb +6 -0
  34. data/lib/puppet/file_system/memory_impl.rb +13 -0
  35. data/lib/puppet/file_system/uniquefile.rb +12 -16
  36. data/lib/puppet/file_system/windows.rb +7 -10
  37. data/lib/puppet/forge.rb +1 -1
  38. data/lib/puppet/forge/cache.rb +1 -1
  39. data/lib/puppet/forge/repository.rb +4 -7
  40. data/lib/puppet/functions/call.rb +1 -1
  41. data/lib/puppet/functions/eyaml_lookup_key.rb +13 -8
  42. data/lib/puppet/functions/filter.rb +1 -0
  43. data/lib/puppet/functions/reduce.rb +2 -4
  44. data/lib/puppet/http.rb +5 -0
  45. data/lib/puppet/http/client.rb +293 -73
  46. data/lib/puppet/http/errors.rb +2 -0
  47. data/lib/puppet/http/external_client.rb +90 -0
  48. data/lib/puppet/http/redirector.rb +43 -7
  49. data/lib/puppet/http/resolver.rb +46 -3
  50. data/lib/puppet/http/resolver/server_list.rb +76 -16
  51. data/lib/puppet/http/resolver/settings.rb +23 -3
  52. data/lib/puppet/http/resolver/srv.rb +29 -3
  53. data/lib/puppet/http/response.rb +87 -1
  54. data/lib/puppet/http/retry_after_handler.rb +39 -0
  55. data/lib/puppet/http/service.rb +151 -7
  56. data/lib/puppet/http/service/ca.rb +76 -14
  57. data/lib/puppet/http/service/compiler.rb +319 -0
  58. data/lib/puppet/http/service/file_server.rb +206 -0
  59. data/lib/puppet/http/service/report.rb +49 -23
  60. data/lib/puppet/http/session.rb +103 -7
  61. data/lib/puppet/indirector.rb +1 -1
  62. data/lib/puppet/indirector/catalog/compiler.rb +10 -0
  63. data/lib/puppet/indirector/catalog/rest.rb +34 -0
  64. data/lib/puppet/indirector/facts/rest.rb +42 -0
  65. data/lib/puppet/indirector/file_bucket_file/file.rb +1 -1
  66. data/lib/puppet/indirector/file_bucket_file/rest.rb +48 -0
  67. data/lib/puppet/indirector/file_content/http.rb +5 -0
  68. data/lib/puppet/indirector/file_content/rest.rb +30 -0
  69. data/lib/puppet/indirector/file_metadata/http.rb +27 -8
  70. data/lib/puppet/indirector/file_metadata/rest.rb +52 -0
  71. data/lib/puppet/indirector/json.rb +1 -1
  72. data/lib/puppet/indirector/msgpack.rb +1 -1
  73. data/lib/puppet/indirector/node/rest.rb +24 -0
  74. data/lib/puppet/indirector/report/rest.rb +19 -0
  75. data/lib/puppet/indirector/report/yaml.rb +23 -0
  76. data/lib/puppet/indirector/request.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +12 -0
  78. data/lib/puppet/indirector/status/rest.rb +18 -0
  79. data/lib/puppet/loaders.rb +6 -0
  80. data/lib/puppet/metatype/manager.rb +80 -80
  81. data/lib/puppet/network/http/api/indirected_routes.rb +1 -1
  82. data/lib/puppet/network/http/api/master/v3/environment.rb +3 -0
  83. data/lib/puppet/network/http/base_pool.rb +7 -2
  84. data/lib/puppet/network/http/compression.rb +7 -0
  85. data/lib/puppet/network/http/connection.rb +6 -0
  86. data/lib/puppet/network/http/connection_adapter.rb +184 -0
  87. data/lib/puppet/network/http/nocache_pool.rb +2 -0
  88. data/lib/puppet/network/http/pool.rb +13 -6
  89. data/lib/puppet/network/http_pool.rb +2 -1
  90. data/lib/puppet/node/environment.rb +11 -1
  91. data/lib/puppet/pal/catalog_compiler.rb +5 -0
  92. data/lib/puppet/pal/pal_impl.rb +4 -29
  93. data/lib/puppet/parser/ast/leaf.rb +5 -5
  94. data/lib/puppet/parser/ast/pops_bridge.rb +6 -15
  95. data/lib/puppet/parser/compiler.rb +43 -33
  96. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +2 -0
  97. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +2 -0
  98. data/lib/puppet/parser/environment_compiler.rb +4 -1
  99. data/lib/puppet/parser/functions.rb +18 -13
  100. data/lib/puppet/parser/functions/filter.rb +1 -0
  101. data/lib/puppet/parser/resource.rb +3 -2
  102. data/lib/puppet/parser/resource/param.rb +6 -0
  103. data/lib/puppet/pops/evaluator/access_operator.rb +2 -2
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +6 -6
  105. data/lib/puppet/pops/issues.rb +5 -0
  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/parser/evaluating_parser.rb +5 -7
  109. data/lib/puppet/pops/resource/resource_type_impl.rb +2 -0
  110. data/lib/puppet/pops/types/p_object_type_extension.rb +10 -0
  111. data/lib/puppet/pops/types/type_calculator.rb +24 -0
  112. data/lib/puppet/pops/validation/checker4_0.rb +11 -1
  113. data/lib/puppet/pops/validation/tasks_checker.rb +5 -1
  114. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  115. data/lib/puppet/provider/aix_object.rb +4 -2
  116. data/lib/puppet/provider/group/aix.rb +1 -0
  117. data/lib/puppet/provider/group/groupadd.rb +57 -24
  118. data/lib/puppet/provider/group/windows_adsi.rb +3 -3
  119. data/lib/puppet/provider/package/aix.rb +17 -2
  120. data/lib/puppet/provider/package/apt.rb +78 -4
  121. data/lib/puppet/provider/package/aptitude.rb +1 -1
  122. data/lib/puppet/provider/package/dnfmodule.rb +69 -15
  123. data/lib/puppet/provider/package/dpkg.rb +14 -7
  124. data/lib/puppet/provider/package/fink.rb +20 -3
  125. data/lib/puppet/provider/package/gem.rb +41 -7
  126. data/lib/puppet/provider/package/openbsd.rb +13 -1
  127. data/lib/puppet/provider/package/pacman.rb +2 -5
  128. data/lib/puppet/provider/package/pip.rb +143 -48
  129. data/lib/puppet/provider/package/pip3.rb +0 -2
  130. data/lib/puppet/provider/package/pkg.rb +18 -5
  131. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  132. data/lib/puppet/provider/package/pkgng.rb +16 -4
  133. data/lib/puppet/provider/package/portage.rb +2 -2
  134. data/lib/puppet/provider/package/puppet_gem.rb +6 -2
  135. data/lib/puppet/provider/package/rpm.rb +6 -213
  136. data/lib/puppet/provider/package/yum.rb +109 -25
  137. data/lib/puppet/provider/package/zypper.rb +59 -1
  138. data/lib/puppet/provider/service/systemd.rb +22 -4
  139. data/lib/puppet/provider/service/windows.rb +23 -7
  140. data/lib/puppet/provider/user/aix.rb +1 -0
  141. data/lib/puppet/provider/user/directoryservice.rb +30 -5
  142. data/lib/puppet/provider/user/useradd.rb +22 -12
  143. data/lib/puppet/reports/http.rb +15 -9
  144. data/lib/puppet/reports/store.rb +1 -1
  145. data/lib/puppet/resource.rb +2 -1
  146. data/lib/puppet/resource/type.rb +8 -0
  147. data/lib/puppet/resource/type_collection.rb +20 -16
  148. data/lib/puppet/runtime.rb +31 -1
  149. data/lib/puppet/settings.rb +4 -0
  150. data/lib/puppet/settings/http_extra_headers_setting.rb +25 -0
  151. data/lib/puppet/ssl.rb +1 -0
  152. data/lib/puppet/ssl/certificate.rb +2 -1
  153. data/lib/puppet/ssl/host.rb +4 -4
  154. data/lib/puppet/ssl/oids.rb +1 -0
  155. data/lib/puppet/ssl/ssl_context.rb +2 -2
  156. data/lib/puppet/ssl/ssl_provider.rb +20 -1
  157. data/lib/puppet/ssl/state_machine.rb +81 -35
  158. data/lib/puppet/ssl/verifier_adapter.rb +9 -1
  159. data/lib/puppet/test/test_helper.rb +15 -11
  160. data/lib/puppet/transaction/report.rb +2 -2
  161. data/lib/puppet/transaction/resource_harness.rb +1 -1
  162. data/lib/puppet/trusted_external.rb +29 -1
  163. data/lib/puppet/type.rb +18 -6
  164. data/lib/puppet/type/file.rb +51 -13
  165. data/lib/puppet/type/file/checksum.rb +4 -4
  166. data/lib/puppet/type/file/source.rb +51 -60
  167. data/lib/puppet/type/group.rb +2 -2
  168. data/lib/puppet/type/package.rb +102 -10
  169. data/lib/puppet/type/service.rb +55 -8
  170. data/lib/puppet/type/user.rb +3 -28
  171. data/lib/puppet/util.rb +39 -15
  172. data/lib/puppet/util/at_fork.rb +1 -1
  173. data/lib/puppet/util/autoload.rb +4 -18
  174. data/lib/puppet/util/checksums.rb +19 -4
  175. data/lib/puppet/util/fileparsing.rb +2 -2
  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/package/version/debian.rb +175 -0
  179. data/lib/puppet/util/package/version/gem.rb +15 -0
  180. data/lib/puppet/util/package/version/pip.rb +167 -0
  181. data/lib/puppet/util/package/version/range.rb +53 -0
  182. data/lib/puppet/util/package/version/range/eq.rb +14 -0
  183. data/lib/puppet/util/package/version/range/gt.rb +14 -0
  184. data/lib/puppet/util/package/version/range/gt_eq.rb +14 -0
  185. data/lib/puppet/util/package/version/range/lt.rb +14 -0
  186. data/lib/puppet/util/package/version/range/lt_eq.rb +14 -0
  187. data/lib/puppet/util/package/version/range/min_max.rb +21 -0
  188. data/lib/puppet/util/package/version/range/simple.rb +11 -0
  189. data/lib/puppet/util/package/version/rpm.rb +73 -0
  190. data/lib/puppet/util/pidlock.rb +36 -10
  191. data/lib/puppet/util/platform.rb +5 -0
  192. data/lib/puppet/util/plist.rb +6 -0
  193. data/lib/puppet/util/provider_features.rb +1 -1
  194. data/lib/puppet/util/reference.rb +1 -1
  195. data/lib/puppet/util/rpm_compare.rb +193 -0
  196. data/lib/puppet/util/storage.rb +0 -1
  197. data/lib/puppet/util/windows/adsi.rb +2 -2
  198. data/lib/puppet/util/windows/api_types.rb +45 -32
  199. data/lib/puppet/util/windows/eventlog.rb +1 -6
  200. data/lib/puppet/util/windows/principal.rb +8 -6
  201. data/lib/puppet/util/windows/process.rb +15 -14
  202. data/lib/puppet/util/windows/registry.rb +11 -11
  203. data/lib/puppet/util/windows/security.rb +1 -0
  204. data/lib/puppet/util/windows/service.rb +43 -26
  205. data/lib/puppet/util/windows/sid.rb +3 -3
  206. data/lib/puppet/util/windows/user.rb +23 -8
  207. data/lib/puppet/util/yaml.rb +1 -1
  208. data/lib/puppet/version.rb +1 -1
  209. data/locales/puppet.pot +707 -574
  210. data/man/man5/puppet.conf.5 +74 -14
  211. data/man/man8/puppet-agent.8 +7 -7
  212. data/man/man8/puppet-apply.8 +1 -1
  213. data/man/man8/puppet-catalog.8 +1 -1
  214. data/man/man8/puppet-config.8 +1 -1
  215. data/man/man8/puppet-describe.8 +1 -1
  216. data/man/man8/puppet-device.8 +2 -2
  217. data/man/man8/puppet-doc.8 +1 -1
  218. data/man/man8/puppet-epp.8 +1 -1
  219. data/man/man8/puppet-facts.8 +1 -1
  220. data/man/man8/puppet-filebucket.8 +17 -2
  221. data/man/man8/puppet-generate.8 +1 -1
  222. data/man/man8/puppet-help.8 +6 -3
  223. data/man/man8/puppet-key.8 +1 -1
  224. data/man/man8/puppet-lookup.8 +1 -1
  225. data/man/man8/puppet-man.8 +1 -1
  226. data/man/man8/puppet-module.8 +4 -1
  227. data/man/man8/puppet-node.8 +1 -1
  228. data/man/man8/puppet-parser.8 +1 -1
  229. data/man/man8/puppet-plugin.8 +1 -1
  230. data/man/man8/puppet-report.8 +1 -1
  231. data/man/man8/puppet-resource.8 +1 -1
  232. data/man/man8/puppet-script.8 +1 -1
  233. data/man/man8/puppet-ssl.8 +2 -2
  234. data/man/man8/puppet-status.8 +1 -1
  235. data/man/man8/puppet.8 +2 -2
  236. data/spec/fixtures/ssl/unknown-127.0.0.1-key.pem +67 -0
  237. data/spec/fixtures/ssl/unknown-127.0.0.1.pem +48 -0
  238. data/spec/fixtures/ssl/unknown-ca-key.pem +67 -0
  239. data/spec/fixtures/ssl/unknown-ca.pem +59 -0
  240. data/spec/fixtures/unit/provider/package/dnfmodule/{dnf-module-list-installed.txt → dnf-module-list.txt} +8 -0
  241. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +2 -0
  242. data/spec/fixtures/unit/provider/package/yum/yum-check-update-subscription-manager.txt +9 -0
  243. data/spec/fixtures/unit/provider/package/zypper/zypper-search-uninstalled.out +13 -0
  244. data/spec/fixtures/unit/provider/service/systemd/list_unit_files_services +9 -0
  245. 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
  246. 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
  247. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +1 -106
  248. 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
  249. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +1 -98
  250. 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
  251. 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
  252. data/spec/integration/application/agent_spec.rb +483 -0
  253. data/spec/integration/application/apply_spec.rb +132 -3
  254. data/spec/integration/application/filebucket_spec.rb +190 -0
  255. data/spec/integration/application/plugin_spec.rb +73 -0
  256. data/spec/integration/configurer_spec.rb +26 -7
  257. data/spec/integration/defaults_spec.rb +1 -2
  258. data/spec/integration/http/client_spec.rb +47 -37
  259. data/spec/integration/indirector/facts/facter_spec.rb +4 -0
  260. data/spec/integration/indirector/report/yaml.rb +83 -0
  261. data/spec/integration/module_tool/forge_spec.rb +2 -15
  262. data/spec/integration/network/http_pool_spec.rb +93 -20
  263. data/spec/integration/node/environment_spec.rb +15 -0
  264. data/spec/integration/parser/compiler_spec.rb +11 -0
  265. data/spec/integration/type/file_spec.rb +1 -1
  266. data/spec/integration/util/windows/adsi_spec.rb +6 -1
  267. data/spec/integration/util/windows/registry_spec.rb +7 -7
  268. data/spec/integration/util/windows/user_spec.rb +40 -5
  269. data/spec/lib/puppet/test_ca.rb +2 -2
  270. data/spec/lib/puppet_spec/https.rb +16 -7
  271. data/spec/lib/puppet_spec/puppetserver.rb +119 -0
  272. data/spec/shared_contexts/https.rb +29 -0
  273. data/spec/unit/agent_spec.rb +80 -26
  274. data/spec/unit/application/agent_spec.rb +9 -5
  275. data/spec/unit/application/apply_spec.rb +2 -12
  276. data/spec/unit/application/describe_spec.rb +88 -50
  277. data/spec/unit/application/device_spec.rb +2 -2
  278. data/spec/unit/application/filebucket_spec.rb +22 -2
  279. data/spec/unit/application/resource_spec.rb +2 -2
  280. data/spec/unit/configurer/fact_handler_spec.rb +4 -8
  281. data/spec/unit/configurer/plugin_handler_spec.rb +36 -19
  282. data/spec/unit/configurer_spec.rb +17 -18
  283. data/spec/unit/context/trusted_information_spec.rb +25 -2
  284. data/spec/unit/daemon_spec.rb +5 -64
  285. data/spec/unit/defaults_spec.rb +25 -2
  286. data/spec/unit/environments_spec.rb +65 -28
  287. data/spec/unit/face/facts_spec.rb +24 -20
  288. data/spec/unit/face/module/search_spec.rb +17 -0
  289. data/spec/unit/face/plugin_spec.rb +12 -10
  290. data/spec/unit/file_serving/http_metadata_spec.rb +37 -14
  291. data/spec/unit/file_serving/terminus_selector_spec.rb +45 -26
  292. data/spec/unit/file_system/uniquefile_spec.rb +11 -0
  293. data/spec/unit/file_system_spec.rb +26 -2
  294. data/spec/unit/functions/lookup_spec.rb +13 -0
  295. data/spec/unit/http/client_spec.rb +327 -35
  296. data/spec/unit/http/external_client_spec.rb +201 -0
  297. data/spec/unit/http/resolver_spec.rb +34 -2
  298. data/spec/unit/http/response_spec.rb +75 -0
  299. data/spec/unit/http/service/ca_spec.rb +53 -11
  300. data/spec/unit/http/service/compiler_spec.rb +627 -0
  301. data/spec/unit/http/service/file_server_spec.rb +308 -0
  302. data/spec/unit/http/service/report_spec.rb +27 -9
  303. data/spec/unit/http/service_spec.rb +98 -5
  304. data/spec/unit/http/session_spec.rb +190 -7
  305. data/spec/unit/indirector/catalog/compiler_spec.rb +47 -29
  306. data/spec/unit/indirector/catalog/rest_spec.rb +59 -2
  307. data/spec/unit/indirector/facts/rest_spec.rb +79 -24
  308. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +82 -2
  309. data/spec/unit/indirector/file_content/rest_spec.rb +53 -2
  310. data/spec/unit/indirector/file_metadata/http_spec.rb +194 -0
  311. data/spec/unit/indirector/file_metadata/rest_spec.rb +110 -2
  312. data/spec/unit/indirector/node/rest_spec.rb +57 -2
  313. data/spec/unit/indirector/report/rest_spec.rb +58 -51
  314. data/spec/unit/indirector/request_spec.rb +1 -1
  315. data/spec/unit/indirector/resource/ral_spec.rb +7 -8
  316. data/spec/unit/indirector/rest_spec.rb +13 -0
  317. data/spec/unit/indirector/status/rest_spec.rb +43 -2
  318. data/spec/unit/interface_spec.rb +3 -3
  319. data/spec/unit/network/http/api/indirected_routes_spec.rb +2 -1
  320. data/spec/unit/network/http/connection_spec.rb +559 -175
  321. data/spec/unit/network/http/nocache_pool_spec.rb +25 -3
  322. data/spec/unit/network/http/pool_spec.rb +89 -11
  323. data/spec/unit/network/http_pool_spec.rb +63 -57
  324. data/spec/unit/network/http_spec.rb +1 -1
  325. data/spec/unit/node/environment_spec.rb +16 -0
  326. data/spec/unit/node/facts_spec.rb +2 -1
  327. data/spec/unit/node_spec.rb +7 -4
  328. data/spec/unit/parser/ast/block_expression_spec.rb +1 -1
  329. data/spec/unit/parser/environment_compiler_spec.rb +7 -0
  330. data/spec/unit/parser/scope_spec.rb +1 -1
  331. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +15 -1
  332. data/spec/unit/pops/loaders/loaders_spec.rb +1 -1
  333. data/spec/unit/pops/serialization/to_from_hr_spec.rb +6 -1
  334. data/spec/unit/pops/types/type_calculator_spec.rb +1 -11
  335. data/spec/unit/pops/validator/validator_spec.rb +7 -2
  336. data/spec/unit/provider/aix_object_spec.rb +16 -2
  337. data/spec/unit/provider/group/groupadd_spec.rb +181 -56
  338. data/spec/unit/provider/group/windows_adsi_spec.rb +43 -10
  339. data/spec/unit/provider/package/aix_spec.rb +29 -0
  340. data/spec/unit/provider/package/apt_spec.rb +43 -2
  341. data/spec/unit/provider/package/aptitude_spec.rb +1 -0
  342. data/spec/unit/provider/package/dnfmodule_spec.rb +76 -15
  343. data/spec/unit/provider/package/dpkg_spec.rb +28 -6
  344. data/spec/unit/provider/package/gem_spec.rb +40 -0
  345. data/spec/unit/provider/package/openbsd_spec.rb +17 -0
  346. data/spec/unit/provider/package/pacman_spec.rb +6 -21
  347. data/spec/unit/provider/package/pip_spec.rb +68 -19
  348. data/spec/unit/provider/package/pkg_spec.rb +15 -1
  349. data/spec/unit/provider/package/pkgdmg_spec.rb +1 -1
  350. data/spec/unit/provider/package/pkgng_spec.rb +38 -0
  351. data/spec/unit/provider/package/portage_spec.rb +5 -0
  352. data/spec/unit/provider/package/puppet_gem_spec.rb +8 -0
  353. data/spec/unit/provider/package/rpm_spec.rb +0 -212
  354. data/spec/unit/provider/package/yum_spec.rb +292 -0
  355. data/spec/unit/provider/package/zypper_spec.rb +84 -0
  356. data/spec/unit/provider/service/init_spec.rb +1 -0
  357. data/spec/unit/provider/service/openbsd_spec.rb +9 -0
  358. data/spec/unit/provider/service/openwrt_spec.rb +1 -0
  359. data/spec/unit/provider/service/redhat_spec.rb +9 -0
  360. data/spec/unit/provider/service/systemd_spec.rb +92 -12
  361. data/spec/unit/provider/service/windows_spec.rb +22 -14
  362. data/spec/unit/provider/user/directoryservice_spec.rb +41 -0
  363. data/spec/unit/provider/user/openbsd_spec.rb +1 -0
  364. data/spec/unit/provider/user/useradd_spec.rb +43 -24
  365. data/spec/unit/provider/user/windows_adsi_spec.rb +3 -3
  366. data/spec/unit/puppet_pal_2pec.rb +0 -26
  367. data/spec/unit/puppet_pal_catalog_spec.rb +46 -0
  368. data/spec/unit/puppet_spec.rb +47 -0
  369. data/spec/unit/reports/http_spec.rb +70 -52
  370. data/spec/unit/resource_spec.rb +3 -3
  371. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  372. data/spec/unit/settings/http_extra_headers_spec.rb +64 -0
  373. data/spec/unit/ssl/certificate_spec.rb +7 -0
  374. data/spec/unit/ssl/host_spec.rb +4 -2
  375. data/spec/unit/ssl/oids_spec.rb +1 -0
  376. data/spec/unit/ssl/ssl_provider_spec.rb +69 -43
  377. data/spec/unit/ssl/state_machine_spec.rb +99 -13
  378. data/spec/unit/test/test_helper_spec.rb +17 -0
  379. data/spec/unit/transaction/persistence_spec.rb +1 -10
  380. data/spec/unit/transaction/report_spec.rb +5 -1
  381. data/spec/unit/transaction_spec.rb +0 -2
  382. data/spec/unit/type/file/ensure_spec.rb +1 -2
  383. data/spec/unit/type/file/source_spec.rb +89 -38
  384. data/spec/unit/type/file_spec.rb +122 -96
  385. data/spec/unit/type/package_spec.rb +8 -0
  386. data/spec/unit/type/service_spec.rb +185 -8
  387. data/spec/unit/type/user_spec.rb +1 -2
  388. data/spec/unit/type_spec.rb +50 -0
  389. data/spec/unit/util/at_fork_spec.rb +3 -2
  390. data/spec/unit/util/autoload_spec.rb +2 -1
  391. data/spec/unit/util/checksums_spec.rb +16 -0
  392. data/spec/unit/util/log/destinations_spec.rb +1 -29
  393. data/spec/unit/util/package/version/debian_spec.rb +83 -0
  394. data/spec/unit/util/package/version/pip_spec.rb +464 -0
  395. data/spec/unit/util/package/version/range_spec.rb +175 -0
  396. data/spec/unit/util/package/version/rpm_spec.rb +121 -0
  397. data/spec/unit/util/pidlock_spec.rb +112 -42
  398. data/spec/unit/util/plist_spec.rb +20 -0
  399. data/spec/unit/util/rpm_compare_spec.rb +196 -0
  400. data/spec/unit/util/storage_spec.rb +1 -8
  401. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  402. data/spec/unit/util/windows/api_types_spec.rb +104 -40
  403. data/spec/unit/util/windows/service_spec.rb +4 -4
  404. data/spec/unit/util/windows/sid_spec.rb +2 -2
  405. data/spec/unit/util_spec.rb +3 -3
  406. data/spec/unit/x509/cert_provider_spec.rb +1 -1
  407. data/tasks/generate_cert_fixtures.rake +15 -1
  408. data/tasks/manpages.rake +5 -35
  409. metadata +73 -12
  410. data/COMMITTERS.md +0 -244
  411. data/spec/integration/faces/plugin_spec.rb +0 -61
  412. data/spec/integration/test/test_helper_spec.rb +0 -31
@@ -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,17 +36,23 @@ 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
 
20
54
  location = parse_location(response)
21
- if location.relative?
22
- url = request.uri.dup
23
- url.path = location.path
24
- else
25
- url = location.dup
26
- end
27
- url.query = request.uri.query
55
+ url = request.uri.merge(location)
28
56
 
29
57
  new_request = request.class.new(url)
30
58
  new_request.body = request.body
@@ -32,6 +60,14 @@ class Puppet::HTTP::Redirector
32
60
  new_request[header] = value
33
61
  end
34
62
 
63
+ # mimic private Net::HTTP#addr_port
64
+ new_request['Host'] = if (location.scheme == 'https' && location.port == 443) ||
65
+ (location.scheme == 'http' && location.port == 80)
66
+ location.host
67
+ else
68
+ "#{location.host}:#{location.port}"
69
+ end
70
+
35
71
  new_request
36
72
  end
37
73
 
@@ -1,17 +1,60 @@
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
10
+ #
11
+ # @api private
12
+ #
13
+ # Create a new resolver
14
+ #
15
+ # @param [Puppet::HTTP::Client] client
16
+ #
2
17
  def initialize(client)
3
18
  @client = client
4
19
  end
5
20
 
6
- def resolve(session, name, ssl_context: nil)
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)
7
37
  raise NotImplementedError
8
38
  end
9
39
 
10
- def check_connection?(session, service, ssl_context: nil)
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)
11
54
  service.connect(ssl_context: ssl_context)
12
55
  return true
13
56
  rescue Puppet::HTTP::ConnectionError => e
14
- session.add_exception(e)
57
+ error_handler.call(e) if error_handler
15
58
  Puppet.debug("Connection to #{service.url} failed, trying next route: #{e.message}")
16
59
  return false
17
60
  end
@@ -1,36 +1,96 @@
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
+ #
1
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
+ #
2
20
  def initialize(client, server_list_setting:, default_port:, services: )
3
21
  @client = client
4
22
  @server_list_setting = server_list_setting
5
23
  @default_port = default_port
6
24
  @services = services
25
+ @resolved_url = nil
7
26
  end
8
27
 
9
- def resolve(session, name, ssl_context: nil)
10
- if @services.include?(name)
11
- @server_list_setting.value.each do |server|
12
- host = server[0]
13
- port = server[1] || @default_port
14
- uri = URI("https://#{host}:#{port}/status/v1/simple/master")
15
- if get_success?(uri, session, ssl_context: ssl_context)
16
- return Puppet::HTTP::Service.create_service(@client, name, host, port)
17
- end
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)
18
65
  end
19
- 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) }
20
- else
21
- return nil
22
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) }
23
69
  end
24
70
 
25
- def get_success?(uri, session, ssl_context: nil)
26
- response = @client.get(uri, ssl_context: ssl_context)
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})
27
87
  return true if response.success?
28
88
 
29
89
  Puppet.debug(_("Puppet server %{host}:%{port} is unavailable: %{code} %{reason}") %
30
- { host: host, port: port, code: response.code, reason: response.message })
90
+ { host: uri.host, port: uri.port, code: response.code, reason: response.reason })
31
91
  return false
32
92
  rescue => detail
33
- session.add_exception(detail)
93
+ error_handler.call(detail) if error_handler
34
94
  #TRANSLATORS 'server_list' is the name of a setting and should not be translated
35
95
  Puppet.debug _("Unable to connect to server from server_list setting: %{detail}") % {detail: detail}
36
96
  return false
@@ -1,6 +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, ssl_context: nil)
3
- service = Puppet::HTTP::Service.create_service(@client, name)
4
- check_connection?(session, service, ssl_context: ssl_context) ? service : nil
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
5
25
  end
6
26
  end
@@ -1,17 +1,43 @@
1
+ #
2
+ # @api private
3
+ #
4
+ # Resolve a service using SRV
5
+ #
1
6
  class Puppet::HTTP::Resolver::SRV < Puppet::HTTP::Resolver
7
+ #
8
+ # @api private
9
+ #
10
+ # @param [Puppet::HTTP::Client] client
11
+ # @param [String] domain srv domain
12
+ # @param [Resolv::DNS] dns
13
+ #
2
14
  def initialize(client, domain:, dns: Resolv::DNS.new)
3
15
  @client = client
4
16
  @srv_domain = domain
5
17
  @delegate = Puppet::Network::Resolver.new(dns)
6
18
  end
7
19
 
8
- def resolve(session, name, ssl_context: nil)
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)
9
35
  # Here we pass our HTTP service name as the DNS SRV service name
10
36
  # This is fine for :ca, but note that :puppet and :file are handled
11
37
  # specially in `each_srv_record`.
12
38
  @delegate.each_srv_record(@srv_domain, name) do |server, port|
13
- service = Puppet::HTTP::Service.create_service(@client, name, server, port)
14
- return service if check_connection?(session, service, ssl_context: ssl_context)
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)
15
41
  end
16
42
 
17
43
  return nil
@@ -1,32 +1,118 @@
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
92
+ #
93
+ # Get a header case-insensitively.
94
+ # @param [String] name The header name
95
+ # @return [String] The header value
96
+ #
26
97
  def [](name)
27
98
  @nethttp[name]
28
99
  end
29
100
 
101
+ # @api private
102
+ #
103
+ # Yield each header name and value. Returns an enumerator if no block is given.
104
+ #
105
+ # @yieldparam [String] header name
106
+ # @yieldparam [String] header value
107
+ #
108
+ def each_header(&block)
109
+ @nethttp.each_header(&block)
110
+ end
111
+
112
+ # @api private
113
+ #
114
+ # Drain the response body.
115
+ #
30
116
  def drain
31
117
  body
32
118
  true