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
@@ -78,9 +78,9 @@ describe Puppet::Type.type(:user).provider(:windows_adsi), :if => Puppet::Util::
78
78
  let(:group3) { double(:account => 'group3', :domain => '.', :sid => 'group3sid') }
79
79
 
80
80
  before :each do
81
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group1').and_return(group1)
82
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group2').and_return(group2)
83
- allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group3').and_return(group3)
81
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group1', any_args).and_return(group1)
82
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group2', any_args).and_return(group2)
83
+ allow(Puppet::Util::Windows::SID).to receive(:name_to_principal).with('group3', any_args).and_return(group3)
84
84
  end
85
85
 
86
86
  it "should return true for same lists of members" do
@@ -708,32 +708,6 @@ describe 'Puppet Pal' do
708
708
  end
709
709
  end
710
710
 
711
- context 'facts are supported such that' do
712
- it 'they are obtained if they are not given' do
713
- testing_env_dir # creates the structure
714
- result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: modulepath ) do |ctx|
715
- ctx.with_script_compiler {|c| c.evaluate_string("$facts =~ Hash and $facts[puppetversion] == '#{Puppet.version}'") }
716
- end
717
- expect(result).to eq(true)
718
- end
719
-
720
- it 'can be given as a hash when creating the environment' do
721
- testing_env_dir # creates the structure
722
- result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: modulepath, facts: { 'myfact' => 42 }) do |ctx|
723
- ctx.with_script_compiler {|c| c.evaluate_string("$facts =~ Hash and $facts[myfact] == 42") }
724
- end
725
- expect(result).to eq(true)
726
- end
727
-
728
- it 'can be overridden with a hash when creating a script compiler' do
729
- testing_env_dir # creates the structure
730
- result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: modulepath, facts: { 'myfact' => 42 }) do |ctx|
731
- ctx.with_script_compiler(facts: { 'myfact' => 43 }) {|c| c.evaluate_string("$facts =~ Hash and $facts[myfact] == 43") }
732
- end
733
- expect(result).to eq(true)
734
- end
735
- end
736
-
737
711
  context 'supports tasks such that' do
738
712
  it '"task_signature" returns the signatures of a generic task' do
739
713
  result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: modulepath, facts: node_facts) do |ctx|
@@ -533,6 +533,19 @@ describe 'Puppet Pal' do
533
533
  end.to raise_error(Puppet::Error, /Could not find resource 'Bar\[nope\]'/)
534
534
  end
535
535
 
536
+ it 'an "evaluate" followed by "evaluate_ast_node" will correctly parse a node definition' do
537
+ Puppet[:node_name_value] = 'testing_node'
538
+ result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: modulepath, facts: node_facts) do | ctx|
539
+ ctx.with_catalog_compiler do |c|
540
+ c.evaluate(c.parse_string("node 'testing_node' { notify {'PASSED': } }"))
541
+ c.evaluate_ast_node
542
+ c.compile_additions
543
+ c.with_json_encoding() {|encoder| encoder.encode }
544
+ end
545
+ end
546
+ parsed = JSON.parse(result)
547
+ expect(parsed['resources']).to include(include('type' => 'Notify'))
548
+ end
536
549
  end
537
550
  end
538
551
 
@@ -632,6 +645,25 @@ describe 'Puppet Pal' do
632
645
  end
633
646
  RUBY
634
647
  }
648
+ },
649
+ 'datatypes' => {
650
+ 'mytype.rb' => <<-RUBY.unindent,
651
+ Puppet::DataTypes.create_type('Mytype') do
652
+ interface <<-PUPPET
653
+ attributes => {
654
+ name => { type => String },
655
+ year_of_birth => { type => Integer },
656
+ age => { type => Integer, kind => derived },
657
+ }
658
+ PUPPET
659
+
660
+ implementation do
661
+ def age
662
+ DateTime.now.year - @year_of_birth
663
+ end
664
+ end
665
+ end
666
+ RUBY
635
667
  }
636
668
  }
637
669
  }
@@ -722,6 +754,9 @@ describe 'Puppet Pal' do
722
754
 
723
755
  context 'facts are supported such that' do
724
756
  it 'they are obtained if they are not given' do
757
+ facts = Puppet::Node::Facts.new(Puppet[:certname], 'puppetversion' => Puppet.version)
758
+ Puppet::Node::Facts.indirection.save(facts)
759
+
725
760
  testing_env_dir # creates the structure
726
761
  result = Puppet::Pal.in_tmp_environment('pal_env', modulepath: modulepath ) do |ctx|
727
762
  ctx.with_catalog_compiler {|c| c.evaluate_string("$facts =~ Hash and $facts[puppetversion] == '#{Puppet.version}'") }
@@ -746,6 +781,17 @@ describe 'Puppet Pal' do
746
781
  end
747
782
  end
748
783
 
784
+ context 'datatypes are supported such that' do
785
+ it 'datatypes defined as pcore in a module are deserialized' do
786
+ testing_env_dir
787
+ vars = {"bobs_age"=>{"__ptype"=>"Mytype", "name"=>"Bob", "year_of_birth"=>1984}}
788
+ result = Puppet::Pal.in_environment('pal_env', envpath: environments_dir, facts: node_facts, variables: vars) do |ctx|
789
+ ctx.with_catalog_compiler {|c| c.evaluate_string("$bobs_age.age") }
790
+ end
791
+ expect(result).to eq(DateTime.now.year - 1984)
792
+ end
793
+ end
794
+
749
795
  context 'configured as an existing given environment directory such that' do
750
796
  it 'modules in it are available from its "modules" directory' do
751
797
  result = Puppet::Pal.in_environment('pal_env', env_dir: testing_env_dir, facts: node_facts) do |ctx|
@@ -69,4 +69,51 @@ describe Puppet do
69
69
  expect(SemanticPuppet::Version).to be_valid(Puppet::OLDEST_RECOMMENDED_RUBY_VERSION)
70
70
  end
71
71
  end
72
+
73
+ context "Settings" do
74
+ before(:each) do
75
+ @old_settings = Puppet.settings
76
+ end
77
+ after(:each) do
78
+ Puppet.replace_settings_object(@old_settings)
79
+ end
80
+ it "should allow for settings to be redefined with a custom object" do
81
+ new_settings = double()
82
+ Puppet.replace_settings_object(new_settings)
83
+ expect(Puppet.settings).to eq(new_settings)
84
+ end
85
+ end
86
+
87
+ context 'when registering implementations' do
88
+ it 'does not register an implementation by default' do
89
+ Puppet.initialize_settings
90
+
91
+ expect(Puppet.runtime[:http]).to be_an_instance_of(Puppet::HTTP::Client)
92
+ end
93
+
94
+ it 'allows an implementation to be registered' do
95
+ impl = double('http')
96
+ Puppet.initialize_settings([], true, true, http: impl)
97
+
98
+
99
+ expect(Puppet.runtime[:http]).to eq(impl)
100
+ end
101
+ end
102
+
103
+ context "initializing $LOAD_PATH" do
104
+ it "should add libdir and module paths to the load path" do
105
+ libdir = tmpdir('libdir_test')
106
+ vendor_dir = tmpdir('vendor_modules')
107
+ module_libdir = File.join(vendor_dir, 'amodule_core', 'lib')
108
+ FileUtils.mkdir_p(module_libdir)
109
+
110
+ Puppet[:libdir] = libdir
111
+ Puppet[:vendormoduledir] = vendor_dir
112
+ Puppet.initialize_settings
113
+
114
+ expect($LOAD_PATH).to include(libdir)
115
+ expect($LOAD_PATH).to include(module_libdir)
116
+ end
117
+
118
+ end
72
119
  end
@@ -1,101 +1,119 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/reports'
3
3
 
4
- processor = Puppet::Reports.report(:http)
4
+ describe Puppet::Reports.report(:http) do
5
+ subject { Puppet::Transaction::Report.new.extend(described_class) }
5
6
 
6
- describe processor do
7
- subject { Puppet::Transaction::Report.new.extend(processor) }
7
+ let(:url) { "https://puppet.example.com/report/upload" }
8
+
9
+ before :each do
10
+ Puppet[:reporturl] = url
11
+ end
8
12
 
9
13
  describe "when setting up the connection" do
10
- let(:http) { double("http") }
11
- let(:httpok) { Net::HTTPOK.new('1.1', 200, '') }
14
+ it "raises if the connection fails" do
15
+ stub_request(:post, url).to_raise(Errno::ECONNREFUSED.new('Connection refused - connect(2)'))
12
16
 
13
- before :each do
14
- expect(http).to receive(:post).and_return(httpok)
17
+ expect {
18
+ subject.process
19
+ }.to raise_error(Puppet::HTTP::HTTPError, /Request to #{url} failed after .* seconds: .*Connection refused/)
15
20
  end
16
21
 
17
22
  it "configures the connection for ssl when using https" do
18
- Puppet[:reporturl] = 'https://testing:8080/the/path'
23
+ stub_request(:post, url)
19
24
 
20
- expect(Puppet::Network::HttpPool).to receive(:connection).with(
21
- 'testing', 8080, hash_including(ssl_context: instance_of(Puppet::SSL::SSLContext))
22
- ).and_return(http)
25
+ expect_any_instance_of(Net::HTTP).to receive(:start) do |http|
26
+ expect(http).to be_use_ssl
27
+ expect(http.verify_mode).to eq(OpenSSL::SSL::VERIFY_PEER)
28
+ end
23
29
 
24
30
  subject.process
25
31
  end
26
32
 
27
33
  it "does not configure the connection for ssl when using http" do
28
- Puppet[:reporturl] = 'http://testing:8080/the/path'
34
+ Puppet[:reporturl] = 'http://puppet.example.com:8080/the/path'
35
+ stub_request(:post, Puppet[:reporturl])
29
36
 
30
- expect(Puppet::Network::HttpPool).to receive(:connection).with(
31
- 'testing', 8080, use_ssl: false, ssl_context: nil
32
- ).and_return(http)
37
+ expect_any_instance_of(Net::HTTP).to receive(:start) do |http|
38
+ expect(http).to_not be_use_ssl
39
+ end
33
40
 
34
41
  subject.process
35
42
  end
36
43
  end
37
44
 
38
45
  describe "when making a request" do
39
- let(:connection) { double("connection") }
40
- let(:httpok) { Net::HTTPOK.new('1.1', 200, '') }
41
- let(:options) { {:metric_id => [:puppet, :report, :http]} }
46
+ it "uses the path specified by the 'reporturl' setting" do
47
+ req = stub_request(:post, url)
48
+
49
+ subject.process
42
50
 
43
- before :each do
44
- expect(Puppet::Network::HttpPool).to receive(:connection).and_return(connection)
51
+ expect(req).to have_been_requested
45
52
  end
46
53
 
47
- it "should use the path specified by the 'reporturl' setting" do
48
- report_path = URI.parse(Puppet[:reporturl]).path
49
- expect(connection).to receive(:post).with(report_path, anything, anything, options).and_return(httpok)
54
+ it "uses the username and password specified by the 'reporturl' setting" do
55
+ Puppet[:reporturl] = "https://user:pass@puppet.example.com/report/upload"
56
+
57
+ req = stub_request(:post, %r{/report/upload}).with(basic_auth: ['user', 'pass'])
50
58
 
51
59
  subject.process
60
+
61
+ expect(req).to have_been_requested
52
62
  end
53
63
 
54
- it "should use the username and password specified by the 'reporturl' setting" do
55
- Puppet[:reporturl] = "https://user:pass@myhost.mydomain:1234/report/upload"
64
+ it "passes metric_id options" do
65
+ stub_request(:post, url)
56
66
 
57
- expect(connection).to receive(:post).with(anything, anything, anything,
58
- {:metric_id => [:puppet, :report, :http],
59
- :basic_auth => {
60
- :user => 'user',
61
- :password => 'pass'
62
- }}).and_return(httpok)
67
+ expect(Puppet.runtime[:http]).to receive(:post).with(anything, anything, hash_including(options: hash_including(metric_id: [:puppet, :report, :http]))).and_call_original
63
68
 
64
69
  subject.process
65
70
  end
66
71
 
67
- it "should give the body as the report as YAML" do
68
- expect(connection).to receive(:post).with(anything, subject.to_yaml, anything, options).and_return(httpok)
72
+ it "passes the report as YAML" do
73
+ req = stub_request(:post, url).with(body: subject.to_yaml)
69
74
 
70
75
  subject.process
76
+
77
+ expect(req).to have_been_requested
71
78
  end
72
79
 
73
- it "should set content-type to 'application/x-yaml'" do
74
- expect(connection).to receive(:post).with(anything, anything, hash_including("Content-Type" => "application/x-yaml"), options).and_return(httpok)
80
+ it "sets content-type to 'application/x-yaml'" do
81
+ req = stub_request(:post, url).with(headers: {'Content-Type' => 'application/x-yaml'})
75
82
 
76
83
  subject.process
84
+
85
+ expect(req).to have_been_requested
77
86
  end
78
87
 
79
- Net::HTTPResponse::CODE_TO_OBJ.each do |code, klass|
80
- if code.to_i >= 200 and code.to_i < 300
81
- it "should succeed on http code #{code}" do
82
- response = klass.new('1.1', code, '')
83
- expect(connection).to receive(:post).and_return(response)
88
+ it "doesn't log anything if the request succeeds" do
89
+ req = stub_request(:post, url).to_return(status: [200, "OK"])
84
90
 
85
- expect(Puppet).not_to receive(:err)
86
- subject.process
87
- end
88
- end
91
+ subject.process
89
92
 
90
- if code.to_i >= 300 && ![301, 302, 307].include?(code.to_i)
91
- it "should log error on http code #{code}" do
92
- response = klass.new('1.1', code, '')
93
- expect(connection).to receive(:post).and_return(response)
93
+ expect(req).to have_been_requested
94
+ expect(@logs).to eq([])
95
+ end
94
96
 
95
- expect(Puppet).to receive(:err)
96
- subject.process
97
- end
98
- end
97
+ it "follows redirects" do
98
+ location = {headers: {'Location' => url}}
99
+
100
+ req = stub_request(:post, url)
101
+ .to_return(**location, status: [301, "Moved Permanently"]).then
102
+ .to_return(**location, status: [302, "Found"]).then
103
+ .to_return(**location, status: [307, "Temporary Redirect"]).then
104
+ .to_return(status: [200, "OK"])
105
+
106
+ subject.process
107
+
108
+ expect(req).to have_been_requested.times(4)
109
+ end
110
+
111
+ it "logs an error if the request fails" do
112
+ stub_request(:post, url).to_return(status: [500, "Internal Server Error"])
113
+
114
+ subject.process
115
+
116
+ expect(@logs).to include(having_attributes(level: :err, message: "Unable to submit report to #{url} [500] Internal Server Error"))
99
117
  end
100
118
  end
101
119
  end
@@ -2,7 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  require 'puppet/settings'
4
4
  require 'puppet/settings/autosign_setting'
5
- require 'puppet/type/file'
6
5
 
7
6
  describe Puppet::Settings::AutosignSetting do
8
7
  let(:settings) do
@@ -75,6 +74,7 @@ describe Puppet::Settings::AutosignSetting do
75
74
  it "converts the file path to a file resource", :if => !Puppet::Util::Platform.windows? do
76
75
  path = File.expand_path('/path/to/autosign.conf')
77
76
  allow(settings).to receive(:value).with('autosign', nil, false).and_return(path)
77
+ allow(Puppet::FileSystem).to receive(:exist?).and_call_original
78
78
  allow(Puppet::FileSystem).to receive(:exist?).with(path).and_return(true)
79
79
  expect(Puppet.features).to receive(:root?).and_return(true)
80
80
 
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet/settings'
4
+ require 'puppet/settings/http_extra_headers_setting'
5
+
6
+ describe Puppet::Settings::HttpExtraHeadersSetting do
7
+ subject { described_class.new(:settings => double('settings'), :desc => "test") }
8
+
9
+ it "is of type :http_extra_headers" do
10
+ expect(subject.type).to eq :http_extra_headers
11
+ end
12
+
13
+ describe "munging the value" do
14
+ let(:final_value) { [['header1', 'foo'], ['header2', 'bar']] }
15
+
16
+ describe "when given a string" do
17
+ it "splits multiple values into an array" do
18
+ expect(subject.munge("header1:foo,header2:bar")).to match_array(final_value)
19
+ end
20
+
21
+ it "strips whitespace between elements" do
22
+ expect(subject.munge("header1:foo , header2:bar")).to match_array(final_value)
23
+ end
24
+
25
+ it "creates an array when one item is given" do
26
+ expect(subject.munge("header1:foo")).to match_array([['header1', 'foo']])
27
+ end
28
+ end
29
+
30
+ describe "when given an array of strings" do
31
+ it "returns an array of arrays" do
32
+ expect(subject.munge(['header1:foo', 'header2:bar'])).to match_array(final_value)
33
+ end
34
+ end
35
+
36
+ describe "when given an array of arrays" do
37
+ it "returns an array of arrays" do
38
+ expect(subject.munge([['header1', 'foo'], ['header2', 'bar']])).to match_array(final_value)
39
+ end
40
+ end
41
+
42
+ describe "when given a hash" do
43
+ it "returns the hash" do
44
+ expect(subject.munge({'header1' => 'foo', 'header2' => 'bar'})).to match_array(final_value)
45
+ end
46
+ end
47
+
48
+ describe 'raises an error when' do
49
+
50
+ # Ruby 2.3 reports the class of these objects as Fixnum, whereas later ruby versions report them as Integer
51
+ it 'is given an unexpected object type' do
52
+ expect {
53
+ subject.munge(65)
54
+ }.to raise_error(ArgumentError, /^Expected an Array, String, or Hash, got a (Integer|Fixnum)/)
55
+ end
56
+
57
+ it 'is given an array of unexpected object types' do
58
+ expect {
59
+ subject.munge([65, 82])
60
+ }.to raise_error(ArgumentError, /^Expected an Array or String, got a (Integer|Fixnum)/)
61
+ end
62
+ end
63
+ end
64
+ end
@@ -135,6 +135,13 @@ describe Puppet::SSL::Certificate do
135
135
  expect(cert.custom_extensions).to include('oid' => '1.3.6.1.4.1.34380.1.2.1', 'value' => 'x509 :(')
136
136
  end
137
137
 
138
+ it "returns extensions under the ppAuthCertExt" do
139
+ exts = {'pp_auth_role' => 'taketwo'}
140
+ cert = build_cert(:extension_requests => exts)
141
+ sign_wrapped_cert(cert)
142
+ expect(cert.custom_extensions).to include('oid' => 'pp_auth_role', 'value' => 'taketwo')
143
+ end
144
+
138
145
  it "doesn't return standard extensions" do
139
146
  cert = build_cert(:dns_alt_names => 'foo')
140
147
  expect(cert.custom_extensions).to be_empty
@@ -51,8 +51,10 @@ describe Puppet::SSL::Host, if: !Puppet::Util::Platform.jruby? do
51
51
  allow_any_instance_of(Puppet::SSL::Host).to receive(:generate)
52
52
  end
53
53
 
54
- it "should have a method for producing an instance to manage the local host's keys" do
55
- expect(Puppet::SSL::Host).to respond_to(:localhost)
54
+ it "is deprecated" do
55
+ Puppet::SSL::Host.localhost
56
+
57
+ expect(@logs).to include(an_object_having_attributes(message: /Puppet::SSL::Host is deprecated/))
56
58
  end
57
59
 
58
60
  it "should allow to reset localhost" do