puppet 6.12.0 → 6.17.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 (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
@@ -45,6 +45,7 @@ describe Puppet::Type.type(:user).provider(:openbsd) do
45
45
  describe "#addcmd" do
46
46
  it "should return an array with the full command and expiry as MM/DD/YY" do
47
47
  allow(Facter).to receive(:value).with(:osfamily).and_return('OpenBSD')
48
+ allow(Facter).to receive(:value).with(:operatingsystemmajrelease)
48
49
  resource[:expiry] = "1997-06-01"
49
50
  expect(provider.addcmd).to eq(['/usr/sbin/useradd', '-e', 'June 01 1997', 'myuser'])
50
51
  end
@@ -72,20 +72,24 @@ describe Puppet::Type.type(:user).provider(:useradd) do
72
72
  provider.create
73
73
  end
74
74
 
75
- it "should use -G to set groups" do
76
- allow(Facter).to receive(:value).with(:osfamily).and_return('Not RedHat')
77
- resource[:ensure] = :present
78
- resource[:groups] = ['group1', 'group2']
79
- expect(provider).to receive(:execute).with(['/usr/sbin/useradd', '-G', 'group1,group2', 'myuser'], kind_of(Hash))
80
- provider.create
81
- end
75
+ context "when setting groups" do
76
+ it "uses -G to set groups" do
77
+ allow(Facter).to receive(:value).with(:osfamily).and_return('Solaris')
78
+ allow(Facter).to receive(:value).with(:operatingsystemmajrelease)
79
+ resource[:ensure] = :present
80
+ resource[:groups] = ['group1', 'group2']
81
+ expect(provider).to receive(:execute).with(['/usr/sbin/useradd', '-G', 'group1,group2', 'myuser'], kind_of(Hash))
82
+ provider.create
83
+ end
82
84
 
83
- it "should use -G to set groups without -M on RedHat" do
84
- allow(Facter).to receive(:value).with(:osfamily).and_return('RedHat')
85
- resource[:ensure] = :present
86
- resource[:groups] = ['group1', 'group2']
87
- expect(provider).to receive(:execute).with(['/usr/sbin/useradd', '-G', 'group1,group2', '-M', 'myuser'], kind_of(Hash))
88
- provider.create
85
+ it "uses -G to set groups with -M on supported systems" do
86
+ allow(Facter).to receive(:value).with(:osfamily).and_return('RedHat')
87
+ allow(Facter).to receive(:value).with(:operatingsystemmajrelease)
88
+ resource[:ensure] = :present
89
+ resource[:groups] = ['group1', 'group2']
90
+ expect(provider).to receive(:execute).with(['/usr/sbin/useradd', '-G', 'group1,group2', '-M', 'myuser'], kind_of(Hash))
91
+ provider.create
92
+ end
89
93
  end
90
94
 
91
95
  it "should add -o when allowdupe is enabled and the user is being created" do
@@ -124,7 +128,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do
124
128
 
125
129
  describe "on systems with the libuser and forcelocal=true" do
126
130
  before do
127
- described_class.has_feature :libuser
131
+ described_class.has_feature :manages_local_users_and_groups
128
132
  resource[:forcelocal] = true
129
133
  end
130
134
 
@@ -188,7 +192,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do
188
192
 
189
193
  describe 'when modifying the password' do
190
194
  before do
191
- described_class.has_feature :libuser
195
+ described_class.has_feature :manages_local_users_and_groups
192
196
  described_class.has_feature :manages_passwords
193
197
  #Setting any resource value here initializes needed variables and methods in the resource and provider
194
198
  #Setting a password value here initializes the existence and management of the password parameter itself
@@ -210,7 +214,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do
210
214
  describe '#modify' do
211
215
  describe "on systems with the libuser and forcelocal=false" do
212
216
  before do
213
- described_class.has_feature :libuser
217
+ described_class.has_feature :manages_local_users_and_groups
214
218
  resource[:forcelocal] = false
215
219
  end
216
220
 
@@ -315,16 +319,24 @@ describe Puppet::Type.type(:user).provider(:useradd) do
315
319
  expect(provider).to receive(:execute).with(['/usr/sbin/usermod', '-e', '', 'myuser'], hash_including(custom_environment: {}))
316
320
  provider.expiry = :absent
317
321
  end
322
+
323
+ it "should use -e with -1 when the expiry property is removed on SLES11" do
324
+ allow(Facter).to receive(:value).with(:operatingsystem).and_return('SLES')
325
+ allow(Facter).to receive(:value).with(:operatingsystemmajrelease).and_return('11')
326
+ resource[:expiry] = :absent
327
+ expect(provider).to receive(:execute).with(['/usr/sbin/usermod', '-e', -1, 'myuser'], hash_including(custom_environment: {}))
328
+ provider.expiry = :absent
329
+ end
318
330
  end
319
331
 
320
332
  describe "#comment" do
321
- before { described_class.has_feature :libuser }
333
+ before { described_class.has_feature :manages_local_users_and_groups }
322
334
 
323
335
  let(:content) { "myuser:x:x:x:local comment:x:x" }
324
336
 
325
337
  it "should return the local comment string when forcelocal is true" do
326
338
  resource[:forcelocal] = true
327
- allow(File).to receive(:open).with('/etc/passwd').and_yield(content)
339
+ allow(File).to receive(:read).with('/etc/passwd').and_return(content)
328
340
  expect(provider.comment).to eq('local comment')
329
341
  end
330
342
 
@@ -337,7 +349,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do
337
349
  end
338
350
 
339
351
  describe "#finduser" do
340
- before { allow(File).to receive(:open).with('/etc/passwd').and_yield(content) }
352
+ before { allow(File).to receive(:read).with('/etc/passwd').and_return(content) }
341
353
 
342
354
  let(:content) { "sample_account:sample_password:sample_uid:sample_gid:sample_gecos:sample_directory:sample_shell" }
343
355
  let(:output) do
@@ -361,6 +373,11 @@ describe Puppet::Type.type(:user).provider(:useradd) do
361
373
  it "returns false when specified key/value pair is not found" do
362
374
  expect(provider.finduser(:account, 'invalid_account')).to eq(false)
363
375
  end
376
+
377
+ it "reads the user file only once per resource" do
378
+ expect(File).to receive(:read).with('/etc/passwd').once
379
+ 5.times { provider.finduser(:account, 'sample_account') }
380
+ end
364
381
  end
365
382
 
366
383
  describe "#check_allow_dup" do
@@ -416,15 +433,17 @@ describe Puppet::Type.type(:user).provider(:useradd) do
416
433
  provider.delete
417
434
  end
418
435
 
419
- it "should use -M flag if home is not managed and on Redhat" do
436
+ it "should use -M flag if home is not managed on a supported system" do
420
437
  allow(Facter).to receive(:value).with(:osfamily).and_return("RedHat")
438
+ allow(Facter).to receive(:value).with(:operatingsystemmajrelease)
421
439
  resource[:managehome] = :false
422
440
  expect(provider).to receive(:execute).with(include('-M'), kind_of(Hash))
423
441
  provider.create
424
442
  end
425
443
 
426
- it "should not use -M flag if home is not managed and not on Redhat" do
427
- allow(Facter).to receive(:value).with(:osfamily).and_return("not RedHat")
444
+ it "should not use -M flag if home is not managed on an unsupported system" do
445
+ allow(Facter).to receive(:value).with(:osfamily).and_return("Suse")
446
+ allow(Facter).to receive(:value).with(:operatingsystemmajrelease).and_return("11")
428
447
  resource[:managehome] = :false
429
448
  expect(provider).to receive(:execute).with(excluding('-M'), kind_of(Hash))
430
449
  provider.create
@@ -696,7 +715,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do
696
715
 
697
716
  describe "on systems with the libuser and forcelocal=false" do
698
717
  before do
699
- described_class.has_feature :libuser
718
+ described_class.has_feature :manages_local_users_and_groups
700
719
  resource[:forcelocal] = false
701
720
  end
702
721
 
@@ -708,7 +727,7 @@ describe Puppet::Type.type(:user).provider(:useradd) do
708
727
 
709
728
  describe "on systems with the libuser and forcelocal=true" do
710
729
  before do
711
- described_class.has_feature :libuser
730
+ described_class.has_feature :manages_local_users_and_groups
712
731
  resource[:forcelocal] = true
713
732
  end
714
733
 
@@ -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